diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentDescriptionTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentDescriptionTest.java
index ff314fd..4a3dd13 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentDescriptionTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentDescriptionTest.java
@@ -13,10 +13,18 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import static org.eclipse.core.tests.resources.AutomatedTests.PI_RESOURCES_TESTS;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import org.eclipse.core.internal.content.*;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.content.IContentDescription;
+import org.junit.Test;
 
 public class ContentDescriptionTest extends ContentTypeTest {
 	private static final String CT_VOID = PI_RESOURCES_TESTS + '.' + "void";
@@ -25,14 +33,11 @@
 	private static final QualifiedName FOO_PROPERTY = new QualifiedName(PI_RESOURCES_TESTS, "foo");
 	private static final QualifiedName FRED_PROPERTY = new QualifiedName(PI_RESOURCES_TESTS, "fred");
 
-	public ContentDescriptionTest(String name) {
-		super(name);
-	}
-
 	private ContentType getContentType() {
 		return ((ContentTypeHandler) Platform.getContentTypeManager().getContentType(CT_VOID)).getTarget();
 	}
 
+	@Test
 	public void testAllProperties() {
 		ContentDescription description = new ContentDescription(IContentDescription.ALL, getContentType());
 		assertTrue("1.0", description.isRequested(FOO_PROPERTY));
@@ -55,6 +60,7 @@
 		}
 	}
 
+	@Test
 	public void testOneProperty() {
 		ContentDescription description = new ContentDescription(new QualifiedName[] {FOO_PROPERTY}, getContentType());
 		assertTrue("1.0", description.isRequested(FOO_PROPERTY));
@@ -76,6 +82,7 @@
 		}
 	}
 
+	@Test
 	public void testZeroProperties() {
 		ContentDescription description = new ContentDescription(new QualifiedName[0], getContentType());
 		assertFalse("1.0", description.isRequested(FOO_PROPERTY));
@@ -91,6 +98,7 @@
 		}
 	}
 
+	@Test
 	public void testMultipleProperties() {
 		ContentDescription description = new ContentDescription(new QualifiedName[] {FOO_PROPERTY, BAR_PROPERTY, ZOO_PROPERTY}, getContentType());
 		assertTrue("1.0", description.isRequested(FOO_PROPERTY));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentTypeTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentTypeTest.java
index 342cb41..2941537 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentTypeTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/ContentTypeTest.java
@@ -13,23 +13,58 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.tests.harness.CoreTest;
 import org.eclipse.core.tests.resources.AutomatedTests;
 import org.osgi.framework.BundleContext;
 
 /**
  * Common superclass for all content type tests.
  */
-public abstract class ContentTypeTest extends CoreTest {
-	public static final String PI_RESOURCES_TESTS = AutomatedTests.PI_RESOURCES_TESTS;
+public abstract class ContentTypeTest {
 	public static final String TEST_FILES_ROOT = "Plugin_Testing/";
 
-	public ContentTypeTest(String name) {
-		super(name);
+	public BundleContext getContext() {
+		return Platform.getBundle(AutomatedTests.PI_RESOURCES_TESTS).getBundleContext();
 	}
 
-	public BundleContext getContext() {
-		return Platform.getBundle(PI_RESOURCES_TESTS).getBundleContext();
+	/**
+	 * Return an input stream with some random text to use as contents for a file
+	 * resource.
+	 */
+	public InputStream getRandomContents() {
+		return new ByteArrayInputStream(getRandomString().getBytes());
 	}
+
+	/**
+	 * Return String with some random text to use as contents for a file resource.
+	 */
+	public String getRandomString() {
+		switch ((int) Math.round(Math.random() * 10)) {
+		case 0:
+			return "este e' o meu conteudo (portuguese)";
+		case 1:
+			return "ho ho ho";
+		case 2:
+			return "I'll be back";
+		case 3:
+			return "don't worry, be happy";
+		case 4:
+			return "there is no imagination for more sentences";
+		case 5:
+			return "Alexandre Bilodeau, Canada's first home gold. 14/02/2010";
+		case 6:
+			return "foo";
+		case 7:
+			return "bar";
+		case 8:
+			return "foobar";
+		case 9:
+			return "case 9";
+		default:
+			return "these are my contents";
+		}
+	}
+
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
index cd558c6..bdd70db 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
@@ -14,12 +14,21 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import static org.eclipse.core.tests.resources.AutomatedTests.PI_RESOURCES_TESTS;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
 import java.io.*;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.HashSet;
 import java.util.Set;
-import junit.framework.AssertionFailedError;
 import org.eclipse.core.internal.content.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.content.*;
@@ -27,8 +36,9 @@
 import org.eclipse.core.runtime.content.XMLContentDescriber;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.core.runtime.preferences.*;
-import org.eclipse.core.tests.harness.BundleTestingHelper;
-import org.eclipse.core.tests.harness.TestRegistryChangeListener;
+import org.eclipse.core.tests.harness.*;
+import org.junit.After;
+import org.junit.Test;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 
@@ -59,9 +69,9 @@
 
 	private final static String MINIMAL_XML = "<?xml version=\"1.0\"?><org.eclipse.core.resources.tests.root/>";
 	private final static String SAMPLE_BIN1_OFFSET = "12345";
-	private final static byte[] SAMPLE_BIN1_SIGNATURE = {0x10, (byte) 0xAB, (byte) 0xCD, (byte) 0xFF};
+	private final static byte[] SAMPLE_BIN1_SIGNATURE = { 0x10, (byte) 0xAB, (byte) 0xCD, (byte) 0xFF };
 	private final static String SAMPLE_BIN2_OFFSET = "";
-	private final static byte[] SAMPLE_BIN2_SIGNATURE = {0x10, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF};
+	private final static byte[] SAMPLE_BIN2_SIGNATURE = { 0x10, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF };
 	private final static String XML_DTD_EXTERNAL_ENTITY = "<?xml version=\"1.0\"?><!DOCTYPE project  SYSTEM \"org.eclipse.core.resources.tests.some.dtd\"  [<!ENTITY someentity SYSTEM \"someentity.xml\">]><org.eclipse.core.resources.tests.root/>";
 	private final static String XML_DTD_US_ASCII = "<?xml version=\"1.0\" encoding=\"US-ASCII\"?><!DOCTYPE sometype SYSTEM \"org.eclipse.core.resources.tests.some.dtd\"><org.eclipse.core.resources.tests.root/>";
 	private final static String XML_ISO_8859_1 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><org.eclipse.core.resources.tests.root/>";
@@ -87,10 +97,6 @@
 	private final static String XML_ROOT_ELEMENT_NS_WILDCARD2 = "<?xml version=\"1.0\" encoding=\"US-ASCII\"?><!DOCTYPE Joker SYSTEM \"org.eclipse.core.resources.tests.some.dtd3\"><Joker/>";
 	private final static String XML_ROOT_ELEMENT_EMPTY_NS = "<?xml version=\"1.0\" encoding=\"US-ASCII\"?><!DOCTYPE Joker SYSTEM \"org.eclipse.core.resources.tests.some.dtd3\"><rootElement>";
 
-	public IContentTypeManagerTest(String name) {
-		super(name);
-	}
-
 	/**
 	 * Helps to ensure we don't get fooled by case sensitivity in file names/specs.
 	 */
@@ -112,8 +118,10 @@
 		return false;
 	}
 
-	private IContentDescription getDescriptionFor(IContentTypeMatcher finder, String contents, Charset encoding, String fileName, QualifiedName[] options, boolean text) throws IOException {
-		return text ? finder.getDescriptionFor(getReader(contents), fileName, options) : finder.getDescriptionFor(getInputStream(contents, encoding), fileName, options);
+	private IContentDescription getDescriptionFor(IContentTypeMatcher finder, String contents, Charset encoding,
+			String fileName, QualifiedName[] options, boolean text) throws IOException {
+		return text ? finder.getDescriptionFor(getReader(contents), fileName, options)
+				: finder.getDescriptionFor(getInputStream(contents, encoding), fileName, options);
 	}
 
 	public InputStream getInputStream(byte[][] contents) {
@@ -150,17 +158,18 @@
 		return candidate.isKindOf(text);
 	}
 
-	@Override
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		// some tests here will trigger a charset delta job (any causing ContentTypeChangeEvents to be broadcast)
+	@After
+	public void tearDown() throws Exception {
+		// some tests here will trigger a charset delta job (any causing
+		// ContentTypeChangeEvents to be broadcast)
 		// ensure none is left running after we finish
-		Job.getJobManager().join(FAMILY_CHARSET_DELTA, getMonitor());
+		Job.getJobManager().join(FAMILY_CHARSET_DELTA, new FussyProgressMonitor());
 	}
 
 	/**
 	 * This test shows how we deal with aliases.
 	 */
+	@Test
 	public void testAlias() throws IOException {
 		final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType alias = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".alias");
@@ -179,8 +188,9 @@
 		assertEquals("1.5", alias, selected[0]);
 		assertEquals("1.6", derived, selected[1]);
 
-		//test late addition of content type
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		// test late addition of content type
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 		BundleTestingHelper.runWithBundles("2", () -> {
 			IContentType alias1 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".alias");
 			assertNull("2.1.1", alias1);
@@ -193,17 +203,19 @@
 			assertEquals("2.2.1", 2, selected1.length);
 			assertEquals("2.2.2", target1, selected1[0]);
 			assertEquals("2.2.3", derived1, selected1[1]);
+			IContentType[] selected2;
 			try {
-				selected1 = contentTypeManager.findContentTypesFor(getRandomContents(), "foo.missing-target");
+				selected2 = contentTypeManager.findContentTypesFor(getRandomContents(), "foo.missing-target");
 			} catch (IOException e) {
-				fail("2.2.4", e);
+				throw new AssertionError(e);
 			}
-			assertEquals("2.2.5", 2, selected1.length);
-			assertEquals("2.2.6", target1, selected1[0]);
-			assertEquals("2.2.7", derived1, selected1[1]);
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bundle02"}, listener);
+			assertEquals("2.2.5", 2, selected2.length);
+			assertEquals("2.2.6", target1, selected2[0]);
+			assertEquals("2.2.7", derived1, selected2[1]);
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bundle02" }, listener);
 	}
 
+	@Test
 	public void testAssociationInheritance() throws CoreException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = manager.getMatcher(new LocalSelectionPolicy(), null);
@@ -270,6 +282,7 @@
 		assertEquals("10.1", assoc2, selected[0]);
 	}
 
+	@Test
 	public void testAssociations() throws CoreException {
 		IContentType text = Platform.getContentTypeManager().getContentType(Platform.PI_RUNTIME + ".text");
 
@@ -282,20 +295,23 @@
 		assertTrue("0.3", text.isAssociatedWith(changeCase("text.txt_pluginadded")));
 
 		// check provider defined settings
-		String[] providerDefinedExtensions = text.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED);
+		String[] providerDefinedExtensions = text
+				.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED);
 		assertTrue("1.0", contains(providerDefinedExtensions, "txt"));
 		assertFalse("1.1", contains(providerDefinedExtensions, "txt_useradded"));
 		assertTrue("1.2", contains(providerDefinedExtensions, "txt_pluginadded"));
 
 		// check user defined settings
-		String[] textUserDefinedExtensions = text.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_PRE_DEFINED);
+		String[] textUserDefinedExtensions = text
+				.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_PRE_DEFINED);
 		assertFalse("2.0", contains(textUserDefinedExtensions, "txt"));
 		assertTrue("2.1", contains(textUserDefinedExtensions, "txt_useradded"));
 		assertFalse("2.2", contains(textUserDefinedExtensions, "txt_pluginadded"));
 
 		// removing pre-defined file specs should not do anything
 		text.removeFileSpec("txt", IContentType.FILE_EXTENSION_SPEC);
-		assertTrue("3.0", contains(text.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED), "txt"));
+		assertTrue("3.0", contains(
+				text.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED), "txt"));
 		assertTrue("3.1", text.isAssociatedWith(changeCase("text.txt")));
 		assertTrue("3.2", text.isAssociatedWith(changeCase("text.txt_useradded")));
 		assertTrue("3.3", text.isAssociatedWith(changeCase("text.txt_pluginadded")));
@@ -309,18 +325,21 @@
 		assertTrue("4.3", text.isAssociatedWith(changeCase("text.txt_pluginadded")));
 	}
 
+	@Test
 	public void testBinaryTypes() throws IOException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType sampleBinary1 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".sample-binary1");
 		IContentType sampleBinary2 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".sample-binary2");
 		InputStream contents;
 
-		contents = getInputStream(new byte[][] {SAMPLE_BIN1_OFFSET.getBytes(), SAMPLE_BIN1_SIGNATURE, " extra contents".getBytes()});
+		contents = getInputStream(
+				new byte[][] { SAMPLE_BIN1_OFFSET.getBytes(), SAMPLE_BIN1_SIGNATURE, " extra contents".getBytes() });
 		IContentDescription description = contentTypeManager.getDescriptionFor(contents, null, IContentDescription.ALL);
 		assertNotNull("6.0", description);
 		assertEquals("6.1", sampleBinary1, description.getContentType());
 
-		contents = getInputStream(new byte[][] {SAMPLE_BIN2_OFFSET.getBytes(), SAMPLE_BIN2_SIGNATURE, " extra contents".getBytes()});
+		contents = getInputStream(
+				new byte[][] { SAMPLE_BIN2_OFFSET.getBytes(), SAMPLE_BIN2_SIGNATURE, " extra contents".getBytes() });
 		description = contentTypeManager.getDescriptionFor(contents, null, IContentDescription.ALL);
 		assertNotNull("7.0", description);
 		assertEquals("7.1", sampleBinary2, description.getContentType());
@@ -332,83 +351,108 @@
 		assertEquals("8.1", 1, selected.length);
 		assertEquals("8.2", sampleBinary2.getId(), selected[0].getId());
 		// (we used to blow up here)
-		description = contentTypeManager.getDescriptionFor(getReader(getRandomString()), "test.samplebin2", IContentDescription.ALL);
+		description = contentTypeManager.getDescriptionFor(getReader(getRandomString()), "test.samplebin2",
+				IContentDescription.ALL);
 		assertNull("8.3", description);
 	}
 
+	@Test
 	public void testByteOrderMark() throws IOException {
 		IContentType text = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
-		QualifiedName[] options = new QualifiedName[] {IContentDescription.BYTE_ORDER_MARK};
+		QualifiedName[] options = new QualifiedName[] { IContentDescription.BYTE_ORDER_MARK };
 		IContentDescription description;
 		// tests with UTF-8 BOM
 		String UTF8_BOM = new String(IContentDescription.BOM_UTF_8, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF8_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF8_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNotNull("1.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
-		assertEquals("1.1", IContentDescription.BOM_UTF_8, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		assertEquals("1.1", IContentDescription.BOM_UTF_8,
+				description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// tests with UTF-16 Little Endian BOM
 		String UTF16_LE_BOM = new String(IContentDescription.BOM_UTF_16LE, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_LE_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_LE_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNotNull("2.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
-		assertEquals("2.1", IContentDescription.BOM_UTF_16LE, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		assertEquals("2.1", IContentDescription.BOM_UTF_16LE,
+				description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// tests with UTF-16 Big Endian BOM
 		String UTF16_BE_BOM = new String(IContentDescription.BOM_UTF_16BE, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_BE_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_BE_BOM + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNotNull("3.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
-		assertEquals("3.1", IContentDescription.BOM_UTF_16BE, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		assertEquals("3.1", IContentDescription.BOM_UTF_16BE,
+				description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// test with no BOM
-		description = text.getDescriptionFor(new ByteArrayInputStream(MINIMAL_XML.getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream(MINIMAL_XML.getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNull("4.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
 		// tests for partial BOM
 		// first byte of UTF-16 Big Endian + minimal xml
-		String UTF16_BE_BOM_1byte = new String(new byte[] {(byte) 0xFE}, "ISO-8859-1");
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_BE_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		String UTF16_BE_BOM_1byte = new String(new byte[] { (byte) 0xFE }, "ISO-8859-1");
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_BE_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)),
+				options);
 		assertNull("5.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
-		// first byte of UTF-16 Big Endian only (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=199252)
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_BE_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
+		// first byte of UTF-16 Big Endian only (see
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=199252)
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_BE_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNull("5.1", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
 		// first byte of UTF-16 Little Endian + minimal xml
-		String UTF16_LE_BOM_1byte = new String(new byte[] {(byte) 0xFF}, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_LE_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		String UTF16_LE_BOM_1byte = new String(new byte[] { (byte) 0xFF }, StandardCharsets.ISO_8859_1);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_LE_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)),
+				options);
 		assertNull("6.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// first byte of UTF-16 Little Endian only
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF16_LE_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF16_LE_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNull("6.1", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
 		// first byte of UTF-8 + minimal xml
-		String UTF8_BOM_1byte = new String(new byte[] {(byte) 0xEF}, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF8_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		String UTF8_BOM_1byte = new String(new byte[] { (byte) 0xEF }, StandardCharsets.ISO_8859_1);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF8_BOM_1byte + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)),
+				options);
 		assertNull("7.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// first byte of UTF-8 only
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF8_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF8_BOM_1byte).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNull("7.1", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
 		// two first bytes of UTF-8 + minimal xml
-		String UTF8_BOM_2bytes = new String(new byte[] {(byte) 0xEF, (byte) 0xBB}, StandardCharsets.ISO_8859_1);
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF8_BOM_2bytes + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)), options);
+		String UTF8_BOM_2bytes = new String(new byte[] { (byte) 0xEF, (byte) 0xBB }, StandardCharsets.ISO_8859_1);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF8_BOM_2bytes + MINIMAL_XML).getBytes(StandardCharsets.ISO_8859_1)),
+				options);
 		assertNull("8.0", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 		// two first bytes of UTF-8 only
-		description = text.getDescriptionFor(new ByteArrayInputStream((UTF8_BOM_2bytes).getBytes(StandardCharsets.ISO_8859_1)), options);
+		description = text.getDescriptionFor(
+				new ByteArrayInputStream((UTF8_BOM_2bytes).getBytes(StandardCharsets.ISO_8859_1)), options);
 		assertNull("8.1", description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 	}
 
 	/**
 	 * See bug 90218.
 	 */
+	@Test
 	public void testContentAndNameMatching() throws IOException /* not really */ {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 
-		byte[][] contents0 = {{0x0A, 0x0B, 0x0E, 0x10}};
-		byte[][] contents1 = {{0x0A, 0x0B, 0x0C, 0x10}};
-		byte[][] contents2 = {{0x0A, 0x0B, 0x0D, 0x10}};
-		byte[][] invalidContents = {{0, 0, 0, 0}};
+		byte[][] contents0 = { { 0x0A, 0x0B, 0x0E, 0x10 } };
+		byte[][] contents1 = { { 0x0A, 0x0B, 0x0C, 0x10 } };
+		byte[][] contents2 = { { 0x0A, 0x0B, 0x0D, 0x10 } };
+		byte[][] invalidContents = { { 0, 0, 0, 0 } };
 
 		// base matches *.mybinary files starting with 0x0a 0x0b
 		IContentType base = manager.getContentType(PI_RESOURCES_TESTS + ".binary_base");
-		// derived1 matches *.mybinary and specifically foo.mybinary files starting with 0x0a 0x0b 0xc
+		// derived1 matches *.mybinary and specifically foo.mybinary files starting with
+		// 0x0a 0x0b 0xc
 		IContentType derived1 = manager.getContentType(PI_RESOURCES_TESTS + ".binary_derived1");
-		// derived2 matches *.mybinary (inherits filespec from base) files starting with 0x0a 0x0b 0xd
+		// derived2 matches *.mybinary (inherits filespec from base) files starting with
+		// 0x0a 0x0b 0xd
 		IContentType derived2 = manager.getContentType(PI_RESOURCES_TESTS + ".binary_derived2");
 
 		IContentType[] selected;
@@ -419,19 +463,22 @@
 		assertEquals("1.1", base, selected[0]);
 
 		selected = manager.findContentTypesFor(getInputStream(contents0), "foo.mybinary");
-		// we know also that the second one will be derived1, because it has a full name matching
+		// we know also that the second one will be derived1, because it has a full name
+		// matching
 		assertEquals("2.0", 3, selected.length);
 		assertEquals("2.1", base, selected[0]);
 		assertEquals("2.2", derived1, selected[1]);
 
 		selected = manager.findContentTypesFor(getInputStream(contents1), "foo.mybinary");
-		// derived1 will be first because both base and derived1 have a strong content matching, so more specific wins
+		// derived1 will be first because both base and derived1 have a strong content
+		// matching, so more specific wins
 		assertEquals("3.0", 3, selected.length);
 		assertEquals("3.1", derived1, selected[0]);
 		assertEquals("3.2", base, selected[1]);
 
 		selected = manager.findContentTypesFor(getInputStream(contents2), "foo.mybinary");
-		// same as 3.* - derived1 is last because content matching is weak, althoug name matching is strong
+		// same as 3.* - derived1 is last because content matching is weak, althoug name
+		// matching is strong
 		assertEquals("4.0", 3, selected.length);
 		assertEquals("4.1", derived2, selected[0]);
 		assertEquals("4.2", base, selected[1]);
@@ -450,7 +497,7 @@
 
 	/*
 	 * Tests both text and byte stream-based getDescriptionFor methods.
-	 */
+	 */@Test
 	public void testContentDescription() throws IOException, CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
@@ -466,52 +513,61 @@
 			String sufix = text ? "-text" : "-binary";
 			IContentDescription description;
 
-			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml", IContentDescription.ALL, text);
+			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml",
+					IContentDescription.ALL, text);
 			assertNotNull("1.0" + sufix, description);
 			assertEquals("1.1" + sufix, xmlType, description.getContentType());
 			assertSame("1.2", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml",
+					new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("2.0" + sufix, description);
 			assertEquals("2.1" + sufix, xmlType, description.getContentType());
 			// the default charset should have been filled by the content type manager
 			assertEquals("2.2" + sufix, "UTF-8", description.getProperty(IContentDescription.CHARSET));
 			assertSame("2.3", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, XML_ISO_8859_1, StandardCharsets.ISO_8859_1, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder, XML_ISO_8859_1, StandardCharsets.ISO_8859_1, "foo.xml",
+					new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("2.3a" + sufix, description);
 			assertEquals("2.3b" + sufix, xmlType, description.getContentType());
 			assertEquals("2.3c" + sufix, "ISO-8859-1", description.getProperty(IContentDescription.CHARSET));
 			assertNotSame("2.3d", xmlType.getDefaultDescription(), description);
 
 			// ensure we handle single quotes properly (bug 65443)
-			description = getDescriptionFor(finder, XML_ISO_8859_1_SINGLE_QUOTES, StandardCharsets.ISO_8859_1, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder, XML_ISO_8859_1_SINGLE_QUOTES, StandardCharsets.ISO_8859_1,
+					"foo.xml", new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("2.3e" + sufix, description);
 			assertEquals("2.3f" + sufix, xmlType, description.getContentType());
 			assertEquals("2.3g" + sufix, "ISO-8859-1", description.getProperty(IContentDescription.CHARSET));
 			assertNotSame("2.3h", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, XML_UTF_16, StandardCharsets.UTF_16, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK}, text);
+			description = getDescriptionFor(finder, XML_UTF_16, StandardCharsets.UTF_16, "foo.xml",
+					new QualifiedName[] { IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK }, text);
 			assertNotNull("2.4a" + sufix, description);
 			assertEquals("2.4b" + sufix, xmlType, description.getContentType());
 			assertEquals("2.4c" + sufix, "UTF-16", description.getProperty(IContentDescription.CHARSET));
-			assertTrue("2.4d" + sufix, text || IContentDescription.BOM_UTF_16BE == description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+			assertTrue("2.4d" + sufix, text || IContentDescription.BOM_UTF_16BE == description
+					.getProperty(IContentDescription.BYTE_ORDER_MARK));
 			assertNotSame("2.4e", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, XML_UTF_16BE, StandardCharsets.UTF_8, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder, XML_UTF_16BE, StandardCharsets.UTF_8, "foo.xml",
+					new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("2.5a" + sufix, description);
 			assertEquals("2.5b" + sufix, xmlType, description.getContentType());
 			assertEquals("2.5c" + sufix, "UTF-16BE", description.getProperty(IContentDescription.CHARSET));
 			assertNotSame("2.5d", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, XML_UTF_16LE, StandardCharsets.UTF_8, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder, XML_UTF_16LE, StandardCharsets.UTF_8, "foo.xml",
+					new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("2.6a" + sufix, description);
 			assertEquals("2.6b" + sufix, xmlType, description.getContentType());
 			// the default charset should have been filled by the content type manager
 			assertEquals("2.6c" + sufix, "UTF-16LE", description.getProperty(IContentDescription.CHARSET));
 			assertNotSame("2.6d", xmlType.getDefaultDescription(), description);
 
-			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml", IContentDescription.ALL, text);
+			description = getDescriptionFor(finder, MINIMAL_XML, StandardCharsets.UTF_8, "foo.xml",
+					IContentDescription.ALL, text);
 			assertNotNull("4.0" + sufix, description);
 			assertEquals("4.1" + sufix, xmlType, description.getContentType());
 			assertEquals("4.2" + sufix, "UTF-8", description.getProperty(IContentDescription.CHARSET));
@@ -541,7 +597,9 @@
 			assertSame("5.13", mytext.getDefaultDescription(), description);
 
 			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=176354
-			description = getDescriptionFor(finder, "<?xml version=\'1.0\' encoding=\'UTF-8\'?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://www.example.org/\" xmlns:ns0=\"http://another.example.org/\"><soapenv:Header /><soapenv:Body><ns0:x /></soapenv:Body></soapenv:Envelope>", StandardCharsets.UTF_8, "foo.xml", new QualifiedName[] {IContentDescription.CHARSET}, text);
+			description = getDescriptionFor(finder,
+					"<?xml version=\'1.0\' encoding=\'UTF-8\'?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://www.example.org/\" xmlns:ns0=\"http://another.example.org/\"><soapenv:Header /><soapenv:Body><ns0:x /></soapenv:Body></soapenv:Envelope>",
+					StandardCharsets.UTF_8, "foo.xml", new QualifiedName[] { IContentDescription.CHARSET }, text);
 			assertNotNull("5.14" + sufix, description);
 			assertEquals("5.15" + sufix, xmlType, description.getContentType());
 			assertEquals("5.16" + sufix, "UTF-8", description.getProperty(IContentDescription.CHARSET));
@@ -554,50 +612,70 @@
 
 	}
 
-	/**
-	 * @see IContentTypeMatcher#findContentTypeFor
-	 */
+	@Test
 	public void testContentDetection() throws IOException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder;
 
 		IContentType inappropriate = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".sample-binary1");
 		IContentType appropriate = contentTypeManager.getContentType(Platform.PI_RUNTIME + ".xml");
-		IContentType appropriateSpecific1 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".xml-based-different-extension");
-		IContentType appropriateSpecific1LowPriority = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".xml-based-different-extension-low-priority");
-		IContentType appropriateSpecific2 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".xml-based-specific-name");
+		IContentType appropriateSpecific1 = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + ".xml-based-different-extension");
+		IContentType appropriateSpecific1LowPriority = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + ".xml-based-different-extension-low-priority");
+		IContentType appropriateSpecific2 = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + ".xml-based-specific-name");
 
 		// if only inappropriate is provided, none will be selected
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {inappropriate}), null);
+		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] { inappropriate }), null);
 		assertNull("1.0", finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
 
 		// if inappropriate and appropriate are provided, appropriate will be selected
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {inappropriate, appropriate}), null);
+		finder = contentTypeManager
+				.getMatcher(new SubsetSelectionPolicy(new IContentType[] { inappropriate, appropriate }), null);
 		assertEquals("2.0", appropriate, finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
 
-		// if inappropriate, appropriate and a more specific appropriate type are provided, the specific type will be selected
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {inappropriate, appropriate, appropriateSpecific1}), null);
+		// if inappropriate, appropriate and a more specific appropriate type are
+		// provided, the specific type will be selected
+		finder = contentTypeManager.getMatcher(
+				new SubsetSelectionPolicy(new IContentType[] { inappropriate, appropriate, appropriateSpecific1 }),
+				null);
 		assertEquals("3.0", appropriateSpecific1, finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {inappropriate, appropriate, appropriateSpecific2}), null);
+		finder = contentTypeManager.getMatcher(
+				new SubsetSelectionPolicy(new IContentType[] { inappropriate, appropriate, appropriateSpecific2 }),
+				null);
 		assertEquals("3.1", appropriateSpecific2, finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
 
-		// if all are provided, the more specific types will appear before the more generic types
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {inappropriate, appropriate, appropriateSpecific1, appropriateSpecific2}), null);
+		// if all are provided, the more specific types will appear before the more
+		// generic types
+		finder = contentTypeManager.getMatcher(
+				new SubsetSelectionPolicy(
+						new IContentType[] { inappropriate, appropriate, appropriateSpecific1, appropriateSpecific2 }),
+				null);
 		IContentType[] selected = finder.findContentTypesFor(getInputStream(MINIMAL_XML), null);
 		assertEquals("4.0", 3, selected.length);
 		assertTrue("4.1", appropriateSpecific1.equals(selected[0]) || appropriateSpecific1.equals(selected[1]));
 		assertTrue("4.2", appropriateSpecific2.equals(selected[0]) || appropriateSpecific2.equals(selected[1]));
 		assertTrue("4.3", appropriate.equals(selected[2]));
 
-		// if appropriate and a more specific appropriate type (but with low priority) are provided, the specific type will be selected
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {appropriate, appropriateSpecific1LowPriority}), null);
-		assertEquals("5.0", appropriateSpecific1LowPriority, finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
+		// if appropriate and a more specific appropriate type (but with low priority)
+		// are provided, the specific type will be selected
+		finder = contentTypeManager.getMatcher(
+				new SubsetSelectionPolicy(new IContentType[] { appropriate, appropriateSpecific1LowPriority }), null);
+		assertEquals("5.0", appropriateSpecific1LowPriority,
+				finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
 
-		// if appropriate and two specific appropriate types (but one with lower priority) are provided, the specific type with higher priority will be selected
-		finder = contentTypeManager.getMatcher(new SubsetSelectionPolicy(new IContentType[] {appropriate, appropriateSpecific1, appropriateSpecific1LowPriority}), null);
+		// if appropriate and two specific appropriate types (but one with lower
+		// priority) are provided, the specific type with higher priority will be
+		// selected
+		finder = contentTypeManager.getMatcher(
+				new SubsetSelectionPolicy(
+						new IContentType[] { appropriate, appropriateSpecific1, appropriateSpecific1LowPriority }),
+				null);
 		assertEquals("5.1", appropriateSpecific1, finder.findContentTypeFor(getInputStream(MINIMAL_XML), null));
 	}
 
+	@Test
 	public void testDefaultProperties() throws IOException /* never actually thrown */ {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 
@@ -647,11 +725,12 @@
 	}
 
 	/**
-	 * The fooBar content type is associated with the "foo.bar" file name and
-	 * the "bar" file extension (what is bogus, anyway). This test ensures it
-	 * does not appear twice in the list of content types associated with the
-	 * "foo.bar" file name.
+	 * The fooBar content type is associated with the "foo.bar" file name and the
+	 * "bar" file extension (what is bogus, anyway). This test ensures it does not
+	 * appear twice in the list of content types associated with the "foo.bar" file
+	 * name.
 	 */
+	@Test
 	public void testDoubleAssociation() {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 
@@ -668,12 +747,14 @@
 	}
 
 	/**
-	 * Obtains a reference to a known content type, then installs a bundle that contributes a content type,
-	 * and makes sure a new obtained reference to the same content type is not identical (shows
-	 * that the content type catalog has been discarded and rebuilt). Then uninstalls that bundle
-	 * and checks again the same thing (because the content type catalog should be rebuilt whenever
+	 * Obtains a reference to a known content type, then installs a bundle that
+	 * contributes a content type, and makes sure a new obtained reference to the
+	 * same content type is not identical (shows that the content type catalog has
+	 * been discarded and rebuilt). Then uninstalls that bundle and checks again the
+	 * same thing (because the content type catalog should be rebuilt whenever
 	 * content types are dynamicaly added/removed).
 	 */
+	@Test
 	public void testDynamicChanges() {
 		final IContentType[] text = new IContentType[4];
 		final IContentTypeManager manager = Platform.getContentTypeManager();
@@ -685,8 +766,9 @@
 		text[1] = ((ContentTypeHandler) text[1]).getTarget();
 		assertEquals("2.0", text[0], text[1]);
 		assertEquals("2.1", text[0], text[1]);
-		//	make arbitrary dynamic changes to the contentTypes extension point
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		// make arbitrary dynamic changes to the contentTypes extension point
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 		BundleTestingHelper.runWithBundles("3", () -> {
 			IContentType missing = manager.getContentType("org.eclipse.bundle01.missing");
 			assertNotNull("3.1", missing);
@@ -696,7 +778,7 @@
 			text[2] = ((ContentTypeHandler) text[2]).getTarget();
 			assertEquals("3.3", text[0], text[2]);
 			assertNotSame("3.4", text[0], text[2]);
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bundle01"}, listener);
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bundle01" }, listener);
 		assertNull("4.0", manager.getContentType("org.eclipse.bundle01.missing"));
 		// ensure the content type instances are all different
 		text[3] = manager.getContentType(IContentTypeManager.CT_TEXT);
@@ -709,8 +791,10 @@
 	}
 
 	/**
-	 * Similar to testDynamicChanges, but using the org.eclipse.core.contenttype.contentTypes extension point.
+	 * Similar to testDynamicChanges, but using the
+	 * org.eclipse.core.contenttype.contentTypes extension point.
 	 */
+	@Test
 	public void testDynamicChangesNewExtension() {
 		final IContentType[] text = new IContentType[4];
 		final IContentTypeManager manager = Platform.getContentTypeManager();
@@ -722,8 +806,9 @@
 		text[1] = ((ContentTypeHandler) text[1]).getTarget();
 		assertEquals("2.0", text[0], text[1]);
 		assertSame("2.1", text[0], text[1]);
-		//	make arbitrary dynamic changes to the contentTypes extension point
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(IContentConstants.CONTENT_NAME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		// make arbitrary dynamic changes to the contentTypes extension point
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(IContentConstants.CONTENT_NAME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 		BundleTestingHelper.runWithBundles("3", () -> {
 			IContentType contentType = manager.getContentType("org.eclipse.bug485227.bug485227_contentType");
 			assertNotNull("3.1 Contributed content type not found", contentType);
@@ -733,10 +818,13 @@
 			text[2] = ((ContentTypeHandler) text[2]).getTarget();
 			assertEquals("3.3", text[0], text[2]);
 			assertNotSame("3.4", text[0], text[2]);
-			assertEquals("3.5 default extension not associated", contentType, manager.findContentTypeFor("file.bug485227"));
-			assertEquals("3.6 additional extension not associated", contentType, manager.findContentTypeFor("file.bug485227_2"));
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bug485227"}, listener);
-		assertNull("4.0 Content type not cleared after bundle uninstall", manager.getContentType("org.eclipse.bug485227.bug485227_contentType"));
+			assertEquals("3.5 default extension not associated", contentType,
+					manager.findContentTypeFor("file.bug485227"));
+			assertEquals("3.6 additional extension not associated", contentType,
+					manager.findContentTypeFor("file.bug485227_2"));
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bug485227" }, listener);
+		assertNull("4.0 Content type not cleared after bundle uninstall",
+				manager.getContentType("org.eclipse.bug485227.bug485227_contentType"));
 		// ensure the content type instances are all different
 		text[3] = manager.getContentType(IContentTypeManager.CT_TEXT);
 		assertNotNull("5.0", text[3]);
@@ -747,7 +835,8 @@
 		assertNotSame("5.4", text[2], text[3]);
 	}
 
-	public void testEvents() {
+	@Test
+	public void testEvents() throws CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType myType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".myContent");
 		assertNotNull("0.9", myType);
@@ -758,66 +847,39 @@
 		contentTypeManager.addContentTypeChangeListener(tracer);
 
 		// add a file spec and check event
-		try {
-			myType.addFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("1.0", e);
-		}
+		myType.addFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
 		assertTrue("1.1", tracer.isOnlyChange(myType));
 
 		// remove a non-existing file spec - should not cause an event to be fired
 		tracer.reset();
-		try {
-			myType.removeFileSpec("another.file.name", IContentType.FILE_EXTENSION_SPEC);
-		} catch (CoreException e) {
-			fail("2.0", e);
-		}
+		myType.removeFileSpec("another.file.name", IContentType.FILE_EXTENSION_SPEC);
 		assertTrue("2.1", !tracer.isOnlyChange(myType));
 
 		// add a file spec again and check no event is generated
 		tracer.reset();
-		try {
-			myType.addFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("3.0", e);
-		}
+		myType.addFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
 		assertTrue("3.1", !tracer.isOnlyChange(myType));
 
 		// remove a file spec and check event
 		tracer.reset();
-		try {
-			myType.removeFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("4.0", e);
-		}
+		myType.removeFileSpec("another.file.name", IContentType.FILE_NAME_SPEC);
 		assertTrue("4.1", tracer.isOnlyChange(myType));
 
 		// change the default charset and check event
 		tracer.reset();
-		try {
-			myType.setDefaultCharset("FOO");
-		} catch (CoreException e) {
-			fail("5.0", e);
-		}
+		myType.setDefaultCharset("FOO");
 		assertTrue("5.1", tracer.isOnlyChange(myType));
 
 		// set the default charset to the same - no event should be generated
 		tracer.reset();
-		try {
-			myType.setDefaultCharset("FOO");
-		} catch (CoreException e) {
-			fail("6.0", e);
-		}
+		myType.setDefaultCharset("FOO");
 		assertTrue("6.1", !tracer.isOnlyChange(myType));
 
-		try {
-			myType.setDefaultCharset("ABC");
-		} catch (CoreException e1) {
-			fail("7.0", e1);
-		}
+		myType.setDefaultCharset("ABC");
 	}
 
-	public void testFileSpecConflicts() {
+	@Test
+	public void testFileSpecConflicts() throws IOException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		// when not submitting contents, for related types, most general type prevails
 		IContentType conflict1a = manager.getContentType(PI_RESOURCES_TESTS + ".base_conflict1");
@@ -833,15 +895,11 @@
 		assertNotNull("2.0", conflict2base);
 		assertNotNull("2.1", conflict2sub);
 		// when submitting contents, for related types, descendant comes first
-		IContentType[] selectedConflict2;
-		try {
-			selectedConflict2 = manager.findContentTypesFor(getRandomContents(), "test.conflict2");
-			assertEquals("2.2", 2, selectedConflict2.length);
-			assertEquals("2.3", selectedConflict2[0], conflict2base);
-			assertEquals("2.4", selectedConflict2[1], conflict2sub);
-		} catch (IOException e) {
-			fail("2.5", e);
-		}
+
+		IContentType[] selectedConflict2 = manager.findContentTypesFor(getRandomContents(), "test.conflict2");
+		assertEquals("2.2", 2, selectedConflict2.length);
+		assertEquals("2.3", selectedConflict2[0], conflict2base);
+		assertEquals("2.4", selectedConflict2[1], conflict2sub);
 
 		IContentType conflict3base = manager.getContentType(PI_RESOURCES_TESTS + ".base_conflict3");
 		IContentType conflict3sub = manager.getContentType(PI_RESOURCES_TESTS + ".sub_conflict3");
@@ -851,19 +909,16 @@
 		assertNotNull("3.0.3", conflict3unrelated);
 
 		// Two unrelated types (sub_conflict3 and unrelated conflict3) are in conflict.
-		// Order will be based on depth (more general first since they don't have describers)
+		// Order will be based on depth (more general first since they don't have
+		// describers)
 
-		IContentType[] selectedConflict3;
-		try {
-			selectedConflict3 = manager.findContentTypesFor(getRandomContents(), "test.conflict3");
-			assertEquals("4.0", 2, selectedConflict3.length);
-			assertEquals("4.1", selectedConflict3[0], conflict3unrelated);
-			assertEquals("4.2", selectedConflict3[1], conflict3sub);
-		} catch (IOException e) {
-			fail("4.3", e);
-		}
+		IContentType[] selectedConflict3 = manager.findContentTypesFor(getRandomContents(), "test.conflict3");
+		assertEquals("4.0", 2, selectedConflict3.length);
+		assertEquals("4.1", selectedConflict3[0], conflict3unrelated);
+		assertEquals("4.2", selectedConflict3[1], conflict3sub);
 	}
 
+	@Test
 	public void testFindContentType() throws IOException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
@@ -885,14 +940,17 @@
 		assertTrue("3.0", contains(multiple, xmlContentType));
 	}
 
+	@Test
 	public void testFindContentTypPredefinedRegexp() throws IOException, CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
 
-		IContentType targetContentType = contentTypeManager.getContentType("org.eclipse.core.tests.resources.predefinedContentTypeWithRegexp");
+		IContentType targetContentType = contentTypeManager
+				.getContentType("org.eclipse.core.tests.resources.predefinedContentTypeWithRegexp");
 		assertNotNull("Target content-type not found", targetContentType);
 
-		IContentType single = finder.findContentTypeFor(getInputStream("Just a test"), "somepredefinedContentTypeWithRegexpFile");
+		IContentType single = finder.findContentTypeFor(getInputStream("Just a test"),
+				"somepredefinedContentTypeWithRegexpFile");
 		assertEquals(targetContentType, single);
 		single = finder.findContentTypeFor(getInputStream("Just a test"), "somepredefinedContentTypeWithPatternFile");
 		assertEquals(targetContentType, single);
@@ -900,6 +958,7 @@
 		assertEquals(targetContentType, single);
 	}
 
+	@Test
 	public void testFindContentTypeUserRegexp() throws IOException, CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
@@ -914,6 +973,7 @@
 		assertEquals("Text content should now match *Text* files", textContentType, single);
 	}
 
+	@Test
 	public void testImportFileAssociation() throws CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		assertNull(contentTypeManager.findContentTypeFor("*.bug122217"));
@@ -924,13 +984,15 @@
 		assertNotNull(contentTypeManager.findContentTypeFor("*.bug122217"));
 	}
 
+	@Test
 	public void testInvalidMarkup() {
 		final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
 		assertEquals("1.0", 0, finder.findContentTypesFor("invalid.missing.identifier").length);
 		assertEquals("2.0", 0, finder.findContentTypesFor("invalid.missing.name").length);
 		assertNull("3.0", contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "invalid-missing-name"));
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 		BundleTestingHelper.runWithBundles("1", () -> {
 			// ensure the invalid content types are not available
 			assertEquals("1.2", 0, contentTypeManager.findContentTypesFor("invalid.missing.identifier").length);
@@ -941,29 +1003,29 @@
 			assertNotNull("1.5", invalidDescriber);
 			// name based matching should work fine
 			assertEquals("1.6", invalidDescriber, contentTypeManager.findContentTypeFor("invalid.describer"));
+			// the describer class is invalid, content matchong should fail
+			IContentType nullContentType;
 			try {
-				// the describer class is invalid, content matchong should fail
-				assertNull("1.7", contentTypeManager.findContentTypeFor(getRandomContents(), "invalid.describer"));
+				nullContentType = contentTypeManager.findContentTypeFor(getRandomContents(), "invalid.describer");
 			} catch (IOException e) {
-				fail("1.8", e);
+				throw new AssertionError(e);
 			}
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bundle03"}, listener);
+			assertNull("1.7", nullContentType);
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bundle03" }, listener);
 	}
 
 	/**
 	 * Bugs 67841 and 62443
 	 */
-	public void testIOException() {
+	@Test
+	public void testIOException() throws IOException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType xml = manager.getContentType(Platform.PI_RUNTIME + ".xml");
 		IContentType rootElement = manager.getContentType(PI_RESOURCES_TESTS + ".root-element");
-		IContentType[] selected = null;
-		try {
-			selected = manager.findContentTypesFor(getInputStream(XML_US_ASCII_INVALID, StandardCharsets.ISO_8859_1), "test.xml");
-		} catch (IOException ioe) {
-			// a SAXException is usually caught (and silently ignored) in XMLRootElementDescriber in these cases
-			fail("1.0", ioe);
-		}
+		// a SAXException is usually caught (and silently ignored) in
+		// XMLRootElementDescriber in these cases
+		IContentType[] selected = manager
+				.findContentTypesFor(getInputStream(XML_US_ASCII_INVALID, StandardCharsets.ISO_8859_1), "test.xml");
 		assertTrue("1.1", contains(selected, xml));
 		assertTrue("1.2", contains(selected, rootElement));
 
@@ -979,41 +1041,35 @@
 				return "This exception was thrown for testing purposes";
 			}
 		}
-		try {
-			selected = manager.findContentTypesFor(new InputStream() {
+		assertThrows(FakeIOException.class, () -> manager.findContentTypesFor(new InputStream() {
 
-				@Override
-				public int available() {
-					// trick the client into reading the file
-					return Integer.MAX_VALUE;
-				}
+			@Override
+			public int available() {
+				// trick the client into reading the file
+				return Integer.MAX_VALUE;
+			}
 
-				@Override
-				public int read() throws IOException {
-					throw new FakeIOException();
-				}
+			@Override
+			public int read() throws IOException {
+				throw new FakeIOException();
+			}
 
-				@Override
-				public int read(byte[] b, int off, int len) throws IOException {
-					throw new FakeIOException();
-				}
-			}, "test.xml");
-			// an exception will happen when reading the stream... should be thrown to the caller
-			fail("2.0");
-		} catch (FakeIOException fioe) {
-			// sucess
-		} catch (IOException ioe) {
-			// this should never happen, but just in case...
-			fail("2.1");
-		}
+			@Override
+			public int read(byte[] b, int off, int len) throws IOException {
+				throw new FakeIOException();
+			}
+		}, "test.xml"));
 	}
 
+	@Test
 	public void testIsKindOf() {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType textContentType = contentTypeManager.getContentType(Platform.PI_RUNTIME + '.' + "text");
 		IContentType xmlContentType = contentTypeManager.getContentType(Platform.PI_RUNTIME + ".xml");
-		IContentType xmlBasedDifferentExtensionContentType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-different-extension");
-		IContentType xmlBasedSpecificNameContentType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-specific-name");
+		IContentType xmlBasedDifferentExtensionContentType = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-different-extension");
+		IContentType xmlBasedSpecificNameContentType = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-specific-name");
 		IContentType binaryContentType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "sample-binary1");
 		assertTrue("1.0", textContentType.isKindOf(textContentType));
 		assertTrue("2.0", xmlContentType.isKindOf(textContentType));
@@ -1025,6 +1081,7 @@
 		assertFalse("5.0", binaryContentType.isKindOf(textContentType));
 	}
 
+	@Test
 	public void testListParsing() {
 		String[] list;
 		list = Util.parseItems(null);
@@ -1080,6 +1137,7 @@
 		assertEquals("10.4", "", list[3]);
 	}
 
+	@Test
 	public void testMyContentDescriber() throws IOException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType myContent = manager.getContentType(PI_RESOURCES_TESTS + '.' + "myContent");
@@ -1088,23 +1146,28 @@
 		assertEquals("0.7", myContent, manager.findContentTypeFor("myContent.mc2"));
 		assertEquals("0.8", myContent, manager.findContentTypeFor("foo.myContent1"));
 		assertEquals("0.9", myContent, manager.findContentTypeFor("bar.myContent2"));
-		IContentDescription description = manager.getDescriptionFor(getInputStream(MyContentDescriber.SIGNATURE, StandardCharsets.US_ASCII), "myContent.mc1", IContentDescription.ALL);
+		IContentDescription description = manager.getDescriptionFor(
+				getInputStream(MyContentDescriber.SIGNATURE, StandardCharsets.US_ASCII), "myContent.mc1",
+				IContentDescription.ALL);
 		assertNotNull("1.0", description);
 		assertEquals("1.1", myContent, description.getContentType());
 		assertNotSame("1.2", myContent.getDefaultDescription(), description);
 		for (int i = 0; i < MyContentDescriber.MY_OPTIONS.length; i++) {
-			assertEquals("2." + i, MyContentDescriber.MY_OPTION_VALUES[i], description.getProperty(MyContentDescriber.MY_OPTIONS[i]));
+			assertEquals("2." + i, MyContentDescriber.MY_OPTION_VALUES[i],
+					description.getProperty(MyContentDescriber.MY_OPTIONS[i]));
 		}
 	}
 
+	@Test
 	public void testNoExtensionAssociation() {
-		//TODO use a IContentTypeMatcher instead
+		// TODO use a IContentTypeMatcher instead
 		final IContentTypeManager manager = Platform.getContentTypeManager();
 
 		IContentType[] selected = manager.findContentTypesFor("file_with_no_extension");
 		assertEquals("0.1", 0, selected.length);
 
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 		BundleTestingHelper.runWithBundles("1", () -> {
 			final String namespace = "org.eclipse.bundle04";
 
@@ -1133,8 +1196,8 @@
 
 			try {
 				nonEmpty.addFileSpec("", IContentType.FILE_EXTENSION_SPEC);
-			} catch (CoreException e1) {
-				fail("1.3.0", e1);
+			} catch (CoreException e) {
+				throw new AssertionError(e);
 			}
 			try {
 				selected1 = manager.findContentTypesFor("file_with_no_extension");
@@ -1143,16 +1206,17 @@
 			} finally {
 				try {
 					nonEmpty.removeFileSpec("", IContentType.FILE_EXTENSION_SPEC);
-				} catch (CoreException e2) {
-					fail("1.3.3", e2);
+				} catch (CoreException e) {
+					throw new AssertionError(e);
 				}
 			}
 			selected1 = manager.findContentTypesFor("file_with_no_extension");
 			assertEquals("1.4.0", 4, selected1.length);
 			assertFalse("1.4.1", contains(selected1, nonEmpty));
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bundle04"}, listener);
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bundle04" }, listener);
 	}
 
+	@Test
 	public void testOrderWithEmptyFiles() throws IOException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = manager.getMatcher(new LocalSelectionPolicy(), null);
@@ -1168,9 +1232,10 @@
 	}
 
 	/**
-	 * This test shows how we deal with orphan file associations (associations
-	 * whose content types are missing).
+	 * This test shows how we deal with orphan file associations (associations whose
+	 * content types are missing).
 	 */
+	@Test
 	public void testOrphanContentType() {
 		final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType orphan = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".orphan");
@@ -1181,8 +1246,9 @@
 		assertEquals("1.2", 0, contentTypeManager.findContentTypesFor("orphan.orphan").length);
 		assertEquals("1.3", 0, contentTypeManager.findContentTypesFor("foo.orphan2").length);
 
-		//test late addition of content type - orphan2 should become visible
-		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME, ContentTypeBuilder.PT_CONTENTTYPES, null, null);
+		// test late addition of content type - orphan2 should become visible
+		TestRegistryChangeListener listener = new TestRegistryChangeListener(Platform.PI_RUNTIME,
+				ContentTypeBuilder.PT_CONTENTTYPES, null, null);
 
 		BundleTestingHelper.runWithBundles("2", () -> {
 			IContentType orphan1 = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".orphan");
@@ -1197,16 +1263,18 @@
 			// check whether an orphan association was added to the dynamically added bundle
 			assertEquals("2.7", 1, contentTypeManager.findContentTypesFor("foo.orphan2").length);
 			assertEquals("2.8", missing1, contentTypeManager.findContentTypesFor("foo.orphan2")[0]);
-		}, getContext(), new String[] {ContentTypeTest.TEST_FILES_ROOT + "content/bundle01"}, listener);
+		}, getContext(), new String[] { ContentTypeTest.TEST_FILES_ROOT + "content/bundle01" }, listener);
 	}
 
 	/**
 	 * Regression test for bug 68894
 	 */
+	@Test
 	public void testPreferences() throws CoreException, BackingStoreException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType text = manager.getContentType(IContentTypeManager.CT_TEXT);
-		Preferences textPrefs = InstanceScope.INSTANCE.getNode(ContentTypeManager.CONTENT_TYPE_PREF_NODE).node(text.getId());
+		Preferences textPrefs = InstanceScope.INSTANCE.getNode(ContentTypeManager.CONTENT_TYPE_PREF_NODE)
+				.node(text.getId());
 		assertNotNull("0.1", text);
 
 		// ensure the "default charset" preference is being properly used
@@ -1223,7 +1291,7 @@
 		assertFalse("2.01", text.isAssociatedWith("xyz.bar"));
 		assertFalse("2.03", text.isAssociatedWith("foo.ext"));
 		assertFalse("2.04", text.isAssociatedWith("bar.ext"));
-		//Null entries first to avoid interference from other tests
+		// Null entries first to avoid interference from other tests
 		textPrefs.remove(ContentType.PREF_FILE_NAMES);
 		textPrefs.remove(ContentType.PREF_FILE_EXTENSIONS);
 		// play with file name associations first...
@@ -1264,6 +1332,7 @@
 		}
 	}
 
+	@Test
 	public void testRegistry() {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentTypeMatcher finder = contentTypeManager.getMatcher(new LocalSelectionPolicy(), null);
@@ -1281,12 +1350,14 @@
 		assertNotNull("2.3", xmlDescriber);
 		assertTrue("2.4", xmlDescriber instanceof XMLContentDescriber);
 
-		IContentType xmlBasedDifferentExtensionContentType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-different-extension");
+		IContentType xmlBasedDifferentExtensionContentType = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-different-extension");
 		assertNotNull("3.0", xmlBasedDifferentExtensionContentType);
 		assertTrue("3.1", isText(contentTypeManager, xmlBasedDifferentExtensionContentType));
 		assertEquals("3.2", xmlContentType, xmlBasedDifferentExtensionContentType.getBaseType());
 
-		IContentType xmlBasedSpecificNameContentType = contentTypeManager.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-specific-name");
+		IContentType xmlBasedSpecificNameContentType = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + '.' + "xml-based-specific-name");
 		assertNotNull("4.0", xmlBasedSpecificNameContentType);
 		assertTrue("4.1", isText(contentTypeManager, xmlBasedSpecificNameContentType));
 		assertEquals("4.2", xmlContentType, xmlBasedSpecificNameContentType.getBaseType());
@@ -1318,81 +1389,108 @@
 		assertTrue("9.4", contains(fooBarTypes, subFooBar));
 	}
 
+	@Test
 	public void testRootElementAndDTDDescriber() throws IOException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType rootElement = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".root-element");
 		IContentType dtdElement = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".dtd");
 		IContentType nsRootElement = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".ns-root-element");
 		IContentType nsWildcard = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".ns-wildcard");
-		IContentType emptyNsRootElement = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".empty-ns-root-element");
+		IContentType emptyNsRootElement = contentTypeManager
+				.getContentType(PI_RESOURCES_TESTS + ".empty-ns-root-element");
 		IContentType xmlType = contentTypeManager.getContentType(Platform.PI_RUNTIME + ".xml");
 
-		IContentType[] contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_ISO_8859_1, StandardCharsets.ISO_8859_1), "fake.xml");
+		IContentType[] contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_ISO_8859_1, StandardCharsets.ISO_8859_1), "fake.xml");
 		assertTrue("1.0", contentTypes.length > 0);
 		assertEquals("1.1", rootElement, contentTypes[0]);
 
 		// bugs 64053 and 63298
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_EXTERNAL_ENTITY, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_EXTERNAL_ENTITY, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("2.0", contentTypes.length > 0);
 		assertEquals("2.1", rootElement, contentTypes[0]);
 
 		// bug 63625
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_EXTERNAL_ENTITY2, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_EXTERNAL_ENTITY2, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("3.0", contentTypes.length > 0);
 		assertEquals("3.1", rootElement, contentTypes[0]);
 
 		// bug 135575
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH1, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH1, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.0", contentTypes.length > 0);
 		assertEquals("4.1", nsRootElement, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.2", contentTypes.length > 0);
 		assertEquals("4.3", nsRootElement, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WRONG_ELEM, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_NS_WRONG_ELEM, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.4", contentTypes.length > 0);
 		assertEquals("4.5", xmlType, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WRONG_NS, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WRONG_NS, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.6", contentTypes.length > 0);
 		assertEquals("4.7", xmlType, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MIXUP, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MIXUP, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.8", contentTypes.length > 0);
 		assertEquals("4.9", xmlType, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WILDCARD, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WILDCARD, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.10", contentTypes.length > 0);
 		assertEquals("4.11", nsWildcard, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WILDCARD2, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_WILDCARD2, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.12", contentTypes.length > 0);
 		assertEquals("4.13", nsWildcard, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_EMPTY_NS, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_EMPTY_NS, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("4.14", contentTypes.length > 0);
 		assertEquals("4.15", emptyNsRootElement, contentTypes[0]);
 
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_DTD_US_ASCII, StandardCharsets.US_ASCII), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_DTD_US_ASCII, StandardCharsets.US_ASCII), "fake.xml");
 		assertTrue("5.0", contentTypes.length > 0);
 		assertEquals("5.1", dtdElement, contentTypes[0]);
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_DTD_EXTERNAL_ENTITY, StandardCharsets.UTF_8), "fake.xml");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_DTD_EXTERNAL_ENTITY, StandardCharsets.UTF_8), "fake.xml");
 		assertTrue("5.4", contentTypes.length > 0);
 		assertEquals("5.5", dtdElement, contentTypes[0]);
 
 		// bug 67975
-		IContentDescription description = contentTypeManager.getDescriptionFor(getInputStream(new byte[][] {IContentDescription.BOM_UTF_16BE, XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-16BE")}), "fake.xml", IContentDescription.ALL);
+		IContentDescription description = contentTypeManager.getDescriptionFor(getInputStream(
+				new byte[][] { IContentDescription.BOM_UTF_16BE, XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-16BE") }),
+				"fake.xml", IContentDescription.ALL);
 		assertNotNull("6.0", description);
 		assertEquals("6.1", rootElement, description.getContentType());
-		assertEquals("6.2", IContentDescription.BOM_UTF_16BE, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		assertEquals("6.2", IContentDescription.BOM_UTF_16BE,
+				description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
-		description = contentTypeManager.getDescriptionFor(getInputStream(new byte[][] {IContentDescription.BOM_UTF_16LE, XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-16LE")}), "fake.xml", IContentDescription.ALL);
+		description = contentTypeManager.getDescriptionFor(getInputStream(
+				new byte[][] { IContentDescription.BOM_UTF_16LE, XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-16LE") }),
+				"fake.xml", IContentDescription.ALL);
 		assertNotNull("7.0", description);
 		assertEquals("7.1", rootElement, description.getContentType());
-		assertEquals("7.2", IContentDescription.BOM_UTF_16LE, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		assertEquals("7.2", IContentDescription.BOM_UTF_16LE,
+				description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
-		// due to bug 67048, the test below fails with Crimson parser (does not handle UTF-8 BOMs)
-		//		description = contentTypeManager.getDescriptionFor(getInputStream(new byte[][] {IContentDescription.BOM_UTF_8,XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-8")}), "fake.xml", IContentDescription.ALL);
-		//		assertTrue("7.0", description != null);
-		//		assertEquals("7.1", rootElement, description.getContentType());
-		//		assertEquals("7.2", IContentDescription.BOM_UTF_8, description.getProperty(IContentDescription.BYTE_ORDER_MARK));
+		// due to bug 67048, the test below fails with Crimson parser (does not handle
+		// UTF-8 BOMs)
+		// description = contentTypeManager.getDescriptionFor(getInputStream(new
+		// byte[][]
+		// {IContentDescription.BOM_UTF_8,XML_ROOT_ELEMENT_NO_DECL.getBytes("UTF-8")}),
+		// "fake.xml", IContentDescription.ALL);
+		// assertTrue("7.0", description != null);
+		// assertEquals("7.1", rootElement, description.getContentType());
+		// assertEquals("7.2", IContentDescription.BOM_UTF_8,
+		// description.getProperty(IContentDescription.BYTE_ORDER_MARK));
 
 		// bug 84354
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NO_DECL, StandardCharsets.UTF_8), "test.txt");
+		contentTypes = contentTypeManager
+				.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NO_DECL, StandardCharsets.UTF_8), "test.txt");
 		assertTrue("8.0", contentTypes.length > 0);
 		assertEquals("8.1", contentTypeManager.getContentType(IContentTypeManager.CT_TEXT), contentTypes[0]);
 	}
@@ -1400,6 +1498,7 @@
 	/**
 	 * Bug 66976
 	 */
+	@Test
 	public void testSignatureBeyondBufferLimit() throws IOException {
 		int bufferLimit = ContentTypeManager.BLOCK_SIZE * 4;
 		// create a long XML comment as prefix
@@ -1410,7 +1509,8 @@
 		comment.append("-->");
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType rootElement = manager.getContentType(PI_RESOURCES_TESTS + ".root-element");
-		IContentType selected = manager.findContentTypeFor(getInputStream(comment + XML_ROOT_ELEMENT_NO_DECL, StandardCharsets.US_ASCII), "fake.xml");
+		IContentType selected = manager.findContentTypeFor(
+				getInputStream(comment + XML_ROOT_ELEMENT_NO_DECL, StandardCharsets.US_ASCII), "fake.xml");
 		assertNotNull("1.0", selected);
 		assertEquals("1.1", rootElement, selected);
 	}
@@ -1418,44 +1518,38 @@
 	/**
 	 * See also: bug 72796.
 	 */
-	public void testUserDefinedAssociations() {
+	@Test
+	public void testUserDefinedAssociations() throws CoreException {
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType text = manager.getContentType((Platform.PI_RUNTIME + ".text"));
 
 		assertNull("0.1", manager.findContentTypeFor("test.mytext"));
 		// associate a user-defined file spec
-		try {
-			text.addFileSpec("mytext", IContentType.FILE_EXTENSION_SPEC);
-		} catch (CoreException e) {
-			fail("1.0", e);
-		}
+		text.addFileSpec("mytext", IContentType.FILE_EXTENSION_SPEC);
 		boolean assertionFailed = false;
 		try {
 			IContentType result = manager.findContentTypeFor("test.mytext");
 			assertNotNull("1.1", result);
 			assertEquals("1.2", text, result);
-		} catch (AssertionFailedError afe) {
+		} catch (AssertionError afe) {
 			assertionFailed = true;
 			throw afe;
 		} finally {
-			try {
-				text.removeFileSpec("mytext", IContentType.FILE_EXTENSION_SPEC);
-			} catch (CoreException e) {
-				if (!assertionFailed) {
-					fail(" 2.0", e);
-				}
-			}
+			text.removeFileSpec("mytext", IContentType.FILE_EXTENSION_SPEC);
+			assertFalse(assertionFailed);
 		}
 		IContentType result = manager.findContentTypeFor("test.mytext");
 		assertNull("3.0", result);
 	}
 
+	@Test
 	public void testDescriberInvalidation() throws IOException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		IContentType type_bug182337_A = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".Bug182337_A");
 		IContentType type_bug182337_B = contentTypeManager.getContentType(PI_RESOURCES_TESTS + ".Bug182337_B");
 
-		IContentType[] contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "Bug182337.Bug182337");
+		IContentType[] contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "Bug182337.Bug182337");
 		assertEquals("1.0", 2, contentTypes.length);
 		assertEquals("1.1", type_bug182337_A, contentTypes[0]);
 		assertEquals("1.1", type_bug182337_B, contentTypes[1]);
@@ -1471,7 +1565,8 @@
 		assertEquals("1.2", 0, contentTypes.length);
 
 		// Describer should be invalidated by now
-		contentTypes = contentTypeManager.findContentTypesFor(getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "Bug182337.Bug182337");
+		contentTypes = contentTypeManager.findContentTypesFor(
+				getInputStream(XML_ROOT_ELEMENT_NS_MATCH2, StandardCharsets.UTF_8), "Bug182337.Bug182337");
 		assertEquals("1.3", 0, contentTypes.length);
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
index fb669c7..b986d0d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
@@ -18,6 +18,7 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.content.IContentTypeManager.ISelectionPolicy;
+import org.eclipse.core.tests.resources.AutomatedTests;
 
 /**
  * Selection policy that filters out any content types that do not
@@ -29,7 +30,7 @@
 		List<IContentType> result = new ArrayList<>(candidates.length);
 		for (IContentType candidate : candidates) {
 			String namespace = getNamespace(candidate.getId());
-			if (namespace.equals(ContentTypeTest.PI_RESOURCES_TESTS) || namespace.equals(Platform.PI_RUNTIME)) {
+			if (namespace.equals(AutomatedTests.PI_RESOURCES_TESTS) || namespace.equals(Platform.PI_RUNTIME)) {
 				result.add(candidate);
 			}
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
index d77ed1a..9fe6f50 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
@@ -13,6 +13,8 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import static org.eclipse.core.tests.resources.AutomatedTests.PI_RESOURCES_TESTS;
+
 import java.io.IOException;
 import java.io.InputStream;
 import org.eclipse.core.runtime.QualifiedName;
@@ -20,10 +22,13 @@
 import org.eclipse.core.runtime.content.IContentDescription;
 
 public class MyContentDescriber implements IContentDescriber {
-	public static final Object[] MY_OPTION_VALUES = {"FOO", null, "BAR"};
+	public static final Object[] MY_OPTION_VALUES = { "FOO", null, "BAR" };
 	public static final String SIGNATURE = "MY_CONTENTS";
 
-	public static final QualifiedName[] MY_OPTIONS = {new QualifiedName(ContentTypeTest.PI_RESOURCES_TESTS, "my_option_1"), new QualifiedName(ContentTypeTest.PI_RESOURCES_TESTS, "my_option_2"), new QualifiedName(ContentTypeTest.PI_RESOURCES_TESTS, "my_option_3")};
+	public static final QualifiedName[] MY_OPTIONS = { new QualifiedName(PI_RESOURCES_TESTS, "my_option_1"),
+			new QualifiedName(PI_RESOURCES_TESTS,
+					"my_option_2"),
+			new QualifiedName(PI_RESOURCES_TESTS, "my_option_3") };
 
 	@Override
 	public int describe(InputStream contents, IContentDescription description) throws IOException {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SpecificContextTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SpecificContextTest.java
index f7f474b..2e2dd9c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SpecificContextTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SpecificContextTest.java
@@ -13,17 +13,28 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import org.eclipse.core.internal.content.ContentTypeManager;
 import org.eclipse.core.internal.preferences.EclipsePreferences;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.content.*;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
 
 /**
  * Tests content type matcher with a non-default context for user preferences.
  */
 public class SpecificContextTest extends ContentTypeTest {
+
+	@Rule
+	public TestName name = new TestName();
+
 	/**
 	 * A minimal scope implementation.
 	 */
@@ -51,65 +62,46 @@
 		}
 	}
 
-	public SpecificContextTest(String name) {
-		super(name);
-	}
-
-	public void testContentTypeLookup() {
+	@Test
+	public void testContentTypeLookup() throws CoreException {
 		IContentTypeManager global = Platform.getContentTypeManager();
 		final SingleNodeScope scope = new SingleNodeScope();
 		IContentTypeMatcher local = global.getMatcher(new LocalSelectionPolicy(), scope);
 		IContentType textContentType = global.getContentType(Platform.PI_RUNTIME + '.' + "text");
-		try {
-			// added "<test case name>.global" to the text content type as a global file spec
-			textContentType.addFileSpec(getName() + ".global", IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("0.1", e);
-		}
-		try {
-			// added "<test case name>.local" to the text content type as a local (scope-specific) file spec
-			textContentType.getSettings(scope).addFileSpec(getName() + ".local", IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("0.2", e);
-		}
-		// make ensure associations are properly recognized when doing content type lookup
-		assertEquals("1.0", textContentType, global.findContentTypeFor(getName() + ".global"));
-		assertEquals("1.1", null, local.findContentTypeFor(getName() + ".global"));
-		assertEquals("2.0", textContentType, local.findContentTypeFor(getName() + ".local"));
-		assertEquals("2.1", null, global.findContentTypeFor(getName() + ".local"));
+		// added "<test case name>.global" to the text content type as a global file
+		// spec
+		textContentType.addFileSpec(name.getMethodName() + ".global", IContentType.FILE_NAME_SPEC);
+		// added "<test case name>.local" to the text content type as a local
+		// (scope-specific) file spec
+		textContentType.getSettings(scope).addFileSpec(name.getMethodName() + ".local", IContentType.FILE_NAME_SPEC);
+		// make ensure associations are properly recognized when doing content type
+		// lookup
+		assertEquals("1.0", textContentType, global.findContentTypeFor(name.getMethodName() + ".global"));
+		assertEquals("1.1", null, local.findContentTypeFor(name.getMethodName() + ".global"));
+		assertEquals("2.0", textContentType, local.findContentTypeFor(name.getMethodName() + ".local"));
+		assertEquals("2.1", null, global.findContentTypeFor(name.getMethodName() + ".local"));
 
 		try {
-			textContentType.removeFileSpec(getName() + ".global", IContentType.FILE_NAME_SPEC);
+			textContentType.removeFileSpec(name.getMethodName() + ".global", IContentType.FILE_NAME_SPEC);
 		} catch (CoreException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 	}
 
-	public void testIsAssociatedWith() {
+	@Test
+	public void testIsAssociatedWith() throws CoreException {
 		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
 		final SingleNodeScope scope = new SingleNodeScope();
 		IContentType textContentType = contentTypeManager.getContentType(Platform.PI_RUNTIME + '.' + "text");
 		IContentTypeSettings localSettings = null;
-		try {
-			localSettings = textContentType.getSettings(scope);
-		} catch (CoreException e) {
-			fail("0.1", e);
-		}
+		localSettings = textContentType.getSettings(scope);
 		// haven't added association yet
 		assertFalse("1.0", textContentType.isAssociatedWith("hello.foo", scope));
 		assertFalse("1.1", textContentType.isAssociatedWith("hello.foo"));
-		try {
-			// associate at the scope level
-			localSettings.addFileSpec("foo", IContentType.FILE_EXTENSION_SPEC);
-		} catch (CoreException e) {
-			fail("1.5", e);
-		}
-		try {
-			localSettings = textContentType.getSettings(scope);
-		} catch (CoreException e) {
-			fail("2.1", e);
-		}
+		// associate at the scope level
+		localSettings.addFileSpec("foo", IContentType.FILE_EXTENSION_SPEC);
+		localSettings = textContentType.getSettings(scope);
 		// scope-specific settings should contain the filespec we just added
 		String[] fileSpecs = localSettings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
 		assertEquals("2.2", 1, fileSpecs.length);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/TestBug94498.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/TestBug94498.java
index ff9ef70..9911dbb 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/TestBug94498.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/TestBug94498.java
@@ -14,39 +14,31 @@
 package org.eclipse.core.tests.resources.content;
 
 import junit.framework.Test;
+import junit.framework.TestCase;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.tests.resources.AutomatedTests;
 import org.eclipse.core.tests.session.WorkspaceSessionTestSuite;
 
-public class TestBug94498 extends ContentTypeTest {
+public class TestBug94498 extends TestCase {
 
 	private static final String FILE_NAME = "foo.bar.zoo";
 
 	public static Test suite() {
-		return new WorkspaceSessionTestSuite(PI_RESOURCES_TESTS, TestBug94498.class);
+		return new WorkspaceSessionTestSuite(AutomatedTests.PI_RESOURCES_TESTS, TestBug94498.class);
 	}
 
-	public TestBug94498(String name) {
-		super(name);
-	}
-
-	@org.junit.Test
-	public void test1() {
+	public void test1() throws CoreException {
 		IContentType text = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
 		assertNotNull("1.0", text);
-		try {
-			text.addFileSpec(FILE_NAME, IContentType.FILE_NAME_SPEC);
-		} catch (CoreException e) {
-			fail("1.9", e);
-		}
+		text.addFileSpec(FILE_NAME, IContentType.FILE_NAME_SPEC);
 		String[] fileSpecs = text.getFileSpecs(IContentType.FILE_NAME_SPEC | IContentType.IGNORE_PRE_DEFINED);
 		assertEquals("2.0", 1, fileSpecs.length);
 		assertEquals("2.1", FILE_NAME, fileSpecs[0]);
 	}
 
-	@org.junit.Test
 	public void test2() {
 		IContentType text = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
 		assertNotNull("1.0", text);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
index 79f17af..645ada5 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
@@ -13,11 +13,16 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.content;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
 import java.io.*;
 import java.util.Arrays;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.content.IContentDescription;
+import org.junit.Test;
 
 /**
  * Ensures the XMLContentDescriber is able to handle encodings properly.
@@ -31,10 +36,7 @@
 	private final static String ENCODING_EMPTY = "";
 	private final static String WHITESPACE_CHARACTERS = " 	\n\r";
 
-	public XMLContentDescriberTest(String name) {
-		super(name);
-	}
-
+	@Test
 	public void testEncodedContents1() throws Exception {
 		checkEncodedContents(ENCODING_UTF16, ENCODING_UTF16, ENCODING_UTF16);
 		checkEncodedContents(ENCODING_UTF8, ENCODING_UTF8, ENCODING_UTF8);
@@ -46,12 +48,14 @@
 		checkEncodedContents(ENCODING_NOTSUPPORTED, ENCODING_NOTSUPPORTED, ENCODING_UTF16);
 	}
 
+	@Test
 	public void testEncodedContents2() throws Exception {
 		checkEncodedContents2(ENCODING_UTF16, ENCODING_UTF16);
 		checkEncodedContents2(ENCODING_UTF8, ENCODING_UTF8);
 		checkEncodedContents2(ENCODING_NOTSUPPORTED, ENCODING_NOTSUPPORTED);
 	}
 
+	@Test
 	public void testEncodedContents3() throws Exception {
 		boolean[][] flags = { {true, true, false}, {true, false, false}, {false, true, false}, {false, false, false}, {true, true, true}, {true, false, true}, {false, true, true}, {false, false, true}};
 
@@ -79,6 +83,7 @@
 		}
 	}
 
+	@Test
 	public void testBug258208() throws Exception {
 		IContentDescription description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_EMPTY, ENCODING_UTF8, false, true, false), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 		assertNull("1.0", description);
