diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/CountExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/CountExpression.java
new file mode 100644
index 0000000..381d1e0
--- /dev/null
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/CountExpression.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008, 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation.
+ *     Ian Phillips - additional expressions support ( "-N)", "(N-" ).
+ *******************************************************************************/
+package org.eclipse.core.expressions;
+
+import java.util.Collection;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.core.internal.expressions.Expressions;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+
+/**
+ * @since 3.7
+ */
+public class CountExpression extends Expression {
+
+	private static final int GREATER_THAN = 7; // (N-
+	private static final int LESS_THAN    = 6; // -N)
+	private static final int ANY_NUMBER   = 5; // *
+	private static final int EXACT        = 4; // N
+	private static final int ONE_OR_MORE  = 3; // +
+	private static final int NONE_OR_ONE  = 2; // ?
+	private static final int NONE         = 1; // !
+	private static final int UNKNOWN      = 0;
+
+	/**
+	 * The seed for the hash code for all count expressions.
+	 */
+	private static final int HASH_INITIAL= CountExpression.class.getName().hashCode();
+
+	private int fMode;
+	private int fSize;
+
+	public CountExpression(IConfigurationElement configElement) {
+		String size = configElement.getAttribute(ATT_VALUE);
+		initializeSize(size);
+	}
+
+	public CountExpression(Element element) {
+		String size = element.getAttribute(ATT_VALUE);
+		initializeSize(size.isEmpty() ? null : size);
+	}
+
+	public CountExpression(String size) {
+		initializeSize(size);
+	}
+
+	private void initializeSize(String size) {
+		if (size == null)
+			size= "*"; //$NON-NLS-1$
+		if ("*".equals(size)) //$NON-NLS-1$
+			fMode= ANY_NUMBER;
+		else if ("?".equals(size)) //$NON-NLS-1$
+			fMode= NONE_OR_ONE;
+		else if ("!".equals(size)) //$NON-NLS-1$
+			fMode= NONE;
+		else if ("+".equals(size)) //$NON-NLS-1$
+			fMode= ONE_OR_MORE;
+		else if (size.charAt(0) == '-' && size.charAt(size.length() - 1) == ')') {
+			try {
+				fMode = LESS_THAN;
+				fSize = Integer.parseInt(size.substring(1, size.length() - 1));
+			} catch (NumberFormatException e) {
+				fMode= UNKNOWN;
+			}
+		} else if (size.charAt(0) == '(' && size.charAt(size.length() - 1) == '-') {
+			try {
+				fMode = GREATER_THAN;
+				fSize = Integer.parseInt(size.substring(1, size.length() - 1));
+			} catch (NumberFormatException e) {
+				fMode= UNKNOWN;
+			}
+		} else {
+			try {
+				fSize= Integer.parseInt(size);
+				fMode= EXACT;
+			} catch (NumberFormatException e) {
+				fMode= UNKNOWN;
+			}
+		}
+	}
+
+	@Override
+	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
+		Object var= context.getDefaultVariable();
+		int size;
+		if (var instanceof Collection) {
+			size= ((Collection<?>)var).size();
+		} else {
+			ICountable countable= Expressions.getAsICountable(var, this);
+			if (countable == null)
+				return EvaluationResult.NOT_LOADED;
+			size= countable.count();
+		}
+		switch (fMode) {
+			case UNKNOWN:
+				return EvaluationResult.FALSE;
+			case NONE:
+				return EvaluationResult.valueOf(size == 0);
+			case NONE_OR_ONE:
+				return EvaluationResult.valueOf(size == 0 || size == 1);
+			case ONE_OR_MORE:
+				return EvaluationResult.valueOf(size >= 1);
+			case EXACT:
+				return EvaluationResult.valueOf(fSize == size);
+			case ANY_NUMBER:
+				return EvaluationResult.TRUE;
+			case LESS_THAN:
+				return EvaluationResult.valueOf(size < fSize);
+			case GREATER_THAN:
+				return EvaluationResult.valueOf(size > fSize);
+		}
+		return EvaluationResult.FALSE;
+	}
+
+	@Override
+	public void collectExpressionInfo(ExpressionInfo info) {
+		info.markDefaultVariableAccessed();
+	}
+
+	@Override
+	public boolean equals(final Object object) {
+		if (!(object instanceof CountExpression))
+			return false;
+
+		final CountExpression that= (CountExpression)object;
+		return (this.fMode == that.fMode) && (this.fSize == that.fSize);
+	}
+
+	@Override
+	protected int computeHashCode() {
+		return HASH_INITIAL * HASH_FACTOR + fMode
+			* HASH_FACTOR + fSize;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
+		builder.append(" [ size="); //$NON-NLS-1$
+		builder.append(fSize);
+		builder.append(", mode: "); //$NON-NLS-1$
+		builder.append(fMode);
+		switch (fMode) {
+		case GREATER_THAN:
+			builder.append(" GREATER_THAN"); //$NON-NLS-1$
+			break;
+		case LESS_THAN:
+			builder.append(" LESS_THAN"); //$NON-NLS-1$ // -N)
+			break;
+		case ANY_NUMBER:
+			builder.append(" ANY_NUMBER"); //$NON-NLS-1$ // *
+			break;
+		case EXACT:
+			builder.append(" EXACT"); //$NON-NLS-1$ // N
+			break;
+		case ONE_OR_MORE:
+			builder.append(" ONE_OR_MORE"); //$NON-NLS-1$ // +
+			break;
+		case NONE_OR_ONE:
+			builder.append(" NONE_OR_ONE"); //$NON-NLS-1$ // ?
+			break;
+		case NONE:
+			builder.append(" NONE"); //$NON-NLS-1$ // !
+			break;
+		case UNKNOWN:
+			builder.append(" UNKNOWN"); //$NON-NLS-1$ ;
+			break;
+		default:
+			break;
+		}
+		builder.append("]"); //$NON-NLS-1$
+		return builder.toString();
+	}
+
+}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EqualsExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EqualsExpression.java
new file mode 100644
index 0000000..9f9ccaf
--- /dev/null
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EqualsExpression.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.expressions;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.core.internal.expressions.Expressions;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * @since 3.7
+ */
+public class EqualsExpression extends Expression {
+	/**
+	 * The seed for the hash code for all equals expressions.
+	 */
+	private static final int HASH_INITIAL= EqualsExpression.class.getName().hashCode();
+
+	private Object fExpectedValue;
+
+	public EqualsExpression(Object expectedValue) {
+		Assert.isNotNull(expectedValue);
+		fExpectedValue= expectedValue;
+	}
+
+	public EqualsExpression(IConfigurationElement element) throws CoreException {
+		String value= element.getAttribute(ATT_VALUE);
+		Expressions.checkAttribute(ATT_VALUE, value);
+		fExpectedValue= Expressions.convertArgument(value);
+	}
+
+	public EqualsExpression(Element element) throws CoreException {
+		String value= element.getAttribute(ATT_VALUE);
+		Expressions.checkAttribute(ATT_VALUE, value.isEmpty() ? null : value);
+		fExpectedValue= Expressions.convertArgument(value);
+	}
+
+	@Override
+	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
+		Object element= context.getDefaultVariable();
+		return EvaluationResult.valueOf(element.equals(fExpectedValue));
+	}
+
+	@Override
+	public void collectExpressionInfo(ExpressionInfo info) {
+		info.markDefaultVariableAccessed();
+	}
+
+	@Override
+	public boolean equals(final Object object) {
+		if (!(object instanceof EqualsExpression))
+			return false;
+
+		final EqualsExpression that= (EqualsExpression)object;
+		return this.fExpectedValue.equals(that.fExpectedValue);
+	}
+
+	@Override
+	protected int computeHashCode() {
+		return HASH_INITIAL * HASH_FACTOR + fExpectedValue.hashCode();
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
+		builder.append(" [expected="); //$NON-NLS-1$
+		builder.append(fExpectedValue);
+		builder.append("]"); //$NON-NLS-1$
+		return builder.toString();
+	}
+}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ReferenceExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ReferenceExpression.java
new file mode 100644
index 0000000..6c15b73
--- /dev/null
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ReferenceExpression.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.expressions;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.core.internal.expressions.DefinitionRegistry;
+import org.eclipse.core.internal.expressions.Expressions;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * This class makes use of the <b>org.eclipse.core.expressions.definitions</b>
+ * extension point to evaluate the current context against pre-defined
+ * expressions. It provides core expression re-use.
+ *
+ * @since 3.7
+ */
+public class ReferenceExpression extends Expression {
+
+	// consider making this a more general extension manager
+	// for now it's just part of the reference expression
+	private static DefinitionRegistry fgDefinitionRegistry= null;
+
+	private static DefinitionRegistry getDefinitionRegistry() {
+		if (fgDefinitionRegistry == null) {
+			fgDefinitionRegistry= new DefinitionRegistry();
+		}
+		return fgDefinitionRegistry;
+	}
+
+	private static final String ATT_DEFINITION_ID= "definitionId"; //$NON-NLS-1$
+
+	/**
+	 * The seed for the hash code for all equals expressions.
+	 */
+	private static final int HASH_INITIAL= ReferenceExpression.class.getName().hashCode();
+
+	private String fDefinitionId;
+
+	public ReferenceExpression(String definitionId) {
+		Assert.isNotNull(definitionId);
+		fDefinitionId= definitionId;
+	}
+
+	public ReferenceExpression(IConfigurationElement element) throws CoreException {
+		fDefinitionId= element.getAttribute(ATT_DEFINITION_ID);
+		Expressions.checkAttribute(ATT_DEFINITION_ID, fDefinitionId);
+	}
+
+	public ReferenceExpression(Element element) throws CoreException {
+		fDefinitionId= element.getAttribute(ATT_DEFINITION_ID);
+		Expressions.checkAttribute(ATT_DEFINITION_ID, fDefinitionId.isEmpty() ? null : fDefinitionId);
+	}
+
+	@Override
+	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
+		Expression expr= getDefinitionRegistry().getExpression(fDefinitionId);
+		return expr.evaluate(context);
+	}
+
+	@Override
+	public void collectExpressionInfo(ExpressionInfo info) {
+		Expression expr;
+		try {
+			expr= getDefinitionRegistry().getExpression(fDefinitionId);
+		} catch (CoreException e) {
+			// We didn't find the expression definition. So no
+			// expression info can be collected.
+			return;
+		}
+		expr.collectExpressionInfo(info);
+	}
+
+	@Override
+	public boolean equals(final Object object) {
+		if (!(object instanceof ReferenceExpression))
+			return false;
+
+		final ReferenceExpression that= (ReferenceExpression)object;
+		return this.fDefinitionId.equals(that.fDefinitionId);
+	}
+
+	@Override
+	protected int computeHashCode() {
+		return HASH_INITIAL * HASH_FACTOR + fDefinitionId.hashCode();
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
+		builder.append(" [definitionId="); //$NON-NLS-1$
+		builder.append(fDefinitionId);
+		builder.append("]"); //$NON-NLS-1$
+		return builder.toString();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/TestExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/TestExpression.java
new file mode 100644
index 0000000..4f86217
--- /dev/null
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/TestExpression.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.expressions;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.core.internal.expressions.ExpressionMessages;
+import org.eclipse.core.internal.expressions.ExpressionStatus;
+import org.eclipse.core.internal.expressions.Expressions;
+import org.eclipse.core.internal.expressions.Property;
+import org.eclipse.core.internal.expressions.TypeExtensionManager;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * @since 3.7
+ */
+public class TestExpression extends Expression {
+
+	private String fNamespace;
+	private String fProperty;
+	private Object[] fArgs;
+	private Object fExpectedValue;
+	private boolean fForcePluginActivation;
+
+	private static final char PROP_SEP = '.';
+	private static final String ATT_PROPERTY= "property"; //$NON-NLS-1$
+	private static final String ATT_ARGS= "args"; //$NON-NLS-1$
+	private static final String ATT_FORCE_PLUGIN_ACTIVATION= "forcePluginActivation"; //$NON-NLS-1$
+	/**
+	 * The seed for the hash code for all test expressions.
+	 */
+	private static final int HASH_INITIAL= TestExpression.class.getName().hashCode();
+
+	private static final TypeExtensionManager fgTypeExtensionManager= new TypeExtensionManager("propertyTesters"); //$NON-NLS-1$
+
+	public TestExpression(IConfigurationElement element) throws CoreException {
+		String property= element.getAttribute(ATT_PROPERTY);
+		int pos= property.lastIndexOf(PROP_SEP);
+		if (pos == -1) {
+			throw new CoreException(new ExpressionStatus(
+				ExpressionStatus.NO_NAMESPACE_PROVIDED,
+				ExpressionMessages.TestExpression_no_name_space));
+		}
+		fNamespace= property.substring(0, pos);
+		fProperty= property.substring(pos + 1);
+		fArgs= Expressions.getArguments(element, ATT_ARGS);
+		fExpectedValue= Expressions.convertArgument(element.getAttribute(ATT_VALUE));
+		fForcePluginActivation= Expressions.getOptionalBooleanAttribute(element, ATT_FORCE_PLUGIN_ACTIVATION);
+	}
+
+	public TestExpression(Element element) throws CoreException {
+		String property= element.getAttribute(ATT_PROPERTY);
+		int pos= property.lastIndexOf(PROP_SEP);
+		if (pos == -1) {
+			throw new CoreException(new ExpressionStatus(
+				ExpressionStatus.NO_NAMESPACE_PROVIDED,
+				ExpressionMessages.TestExpression_no_name_space));
+		}
+		fNamespace= property.substring(0, pos);
+		fProperty= property.substring(pos + 1);
+		fArgs= Expressions.getArguments(element, ATT_ARGS);
+		String value = element.getAttribute(ATT_VALUE);
+		fExpectedValue = Expressions.convertArgument(value.isEmpty() ? null : value);
+		fForcePluginActivation= Expressions.getOptionalBooleanAttribute(element, ATT_FORCE_PLUGIN_ACTIVATION);
+	}
+
+	public TestExpression(String namespace, String property, Object[] args, Object expectedValue) {
+		this(namespace, property, args, expectedValue, false);
+	}
+
+	public TestExpression(String namespace, String property, Object[] args, Object expectedValue, boolean forcePluginActivation) {
+		Assert.isNotNull(namespace);
+		Assert.isNotNull(property);
+		fNamespace= namespace;
+		fProperty= property;
+		fArgs= args != null ? args : Expressions.EMPTY_ARGS;
+		fExpectedValue= expectedValue;
+		fForcePluginActivation= forcePluginActivation;
+	}
+
+	@Override
+	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
+		Object element= context.getDefaultVariable();
+		if (System.class.equals(element)) {
+			String str= System.getProperty(fProperty);
+			if (str == null)
+				return EvaluationResult.FALSE;
+			return EvaluationResult.valueOf(str.equals(fArgs[0]));
+		}
+		Property property= fgTypeExtensionManager.getProperty(element, fNamespace, fProperty, context.getAllowPluginActivation() && fForcePluginActivation);
+		if (!property.isInstantiated())
+			return EvaluationResult.NOT_LOADED;
+		return EvaluationResult.valueOf(property.test(element, fArgs, fExpectedValue));
+	}
+
+	@Override
+	public void collectExpressionInfo(ExpressionInfo info) {
+		info.markDefaultVariableAccessed();
+		info.addAccessedPropertyName(fNamespace + PROP_SEP + fProperty);
+	}
+
+	@Override
+	public boolean equals(final Object object) {
+		if (!(object instanceof TestExpression))
+			return false;
+
+		final TestExpression that= (TestExpression)object;
+		return this.fNamespace.equals(that.fNamespace) && this.fProperty.equals(that.fProperty)
+			&& this.fForcePluginActivation == that.fForcePluginActivation
+			&& equals(this.fArgs, that.fArgs) && equals(this.fExpectedValue, that.fExpectedValue);
+	}
+
+	@Override
+	protected int computeHashCode() {
+		return HASH_INITIAL * HASH_FACTOR + hashCode(fArgs)
+			* HASH_FACTOR + hashCode(fExpectedValue)
+			* HASH_FACTOR + fNamespace.hashCode()
+			* HASH_FACTOR + fProperty.hashCode()
+			* HASH_FACTOR + (fForcePluginActivation ? 1 : 0);
+	}
+
+	//---- Debugging ---------------------------------------------------
+
+	@Override
+	public String toString() {
+		StringBuilder args= new StringBuilder();
+		for (int i= 0; i < fArgs.length; i++) {
+			Object arg= fArgs[i];
+			if (arg instanceof String) {
+				args.append('\'');
+				args.append(arg);
+				args.append('\'');
+			} else {
+				args.append(arg.toString());
+			}
+			if (i < fArgs.length - 1)
+				args.append(", "); //$NON-NLS-1$
+		}
+		return "<test property=\"" + fProperty +  "\"" +//$NON-NLS-1$ //$NON-NLS-2$
+		(fArgs.length != 0 ? " args=\"" + args + "\"" : "") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		 (fExpectedValue != null ? " value=\"" + fExpectedValue + "\"" : "") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		  " plug-in activation: " + (fForcePluginActivation ? "eager" : "lazy") +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+		  "/>"; //$NON-NLS-1$
+	}
+
+	//---- testing ---------------------------------------------------
+
+	public boolean testGetForcePluginActivation() {
+		return fForcePluginActivation;
+	}
+
+	public static TypeExtensionManager testGetTypeExtensionManager() {
+		return fgTypeExtensionManager;
+	}
+}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java
index 7aaaa5b..f550cbd 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java
@@ -14,178 +14,23 @@
  *******************************************************************************/
 package org.eclipse.core.internal.expressions;
 
-import java.util.Collection;
-
 import org.w3c.dom.Element;
 
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.ICountable;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 
-
-public class CountExpression extends Expression {
-
-	private static final int GREATER_THAN = 7; // (N-
-	private static final int LESS_THAN    = 6; // -N)
-	private static final int ANY_NUMBER   = 5; // *
-	private static final int EXACT        = 4; // N
-	private static final int ONE_OR_MORE  = 3; // +
-	private static final int NONE_OR_ONE  = 2; // ?
-	private static final int NONE         = 1; // !
-	private static final int UNKNOWN      = 0;
-
-	/**
-	 * The seed for the hash code for all count expressions.
-	 */
-	private static final int HASH_INITIAL= CountExpression.class.getName().hashCode();
-
-	private int fMode;
-	private int fSize;
+@Deprecated
+public class CountExpression extends org.eclipse.core.expressions.CountExpression {
 
 	public CountExpression(IConfigurationElement configElement) {
-		String size = configElement.getAttribute(ATT_VALUE);
-		initializeSize(size);
+		super(configElement);
 	}
 
 	public CountExpression(Element element) {
-		String size = element.getAttribute(ATT_VALUE);
-		initializeSize(size.isEmpty() ? null : size);
+		super(element);
 	}
 
 	public CountExpression(String size) {
-		initializeSize(size);
-	}
-
-	private void initializeSize(String size) {
-		if (size == null)
-			size= "*"; //$NON-NLS-1$
-		if ("*".equals(size)) //$NON-NLS-1$
-			fMode= ANY_NUMBER;
-		else if ("?".equals(size)) //$NON-NLS-1$
-			fMode= NONE_OR_ONE;
-		else if ("!".equals(size)) //$NON-NLS-1$
-			fMode= NONE;
-		else if ("+".equals(size)) //$NON-NLS-1$
-			fMode= ONE_OR_MORE;
-		else if (size.charAt(0) == '-' && size.charAt(size.length() - 1) == ')') {
-			try {
-				fMode = LESS_THAN;
-				fSize = Integer.parseInt(size.substring(1, size.length() - 1));
-			} catch (NumberFormatException e) {
-				fMode= UNKNOWN;
-			}
-		} else if (size.charAt(0) == '(' && size.charAt(size.length() - 1) == '-') {
-			try {
-				fMode = GREATER_THAN;
-				fSize = Integer.parseInt(size.substring(1, size.length() - 1));
-			} catch (NumberFormatException e) {
-				fMode= UNKNOWN;
-			}
-		} else {
-			try {
-				fSize= Integer.parseInt(size);
-				fMode= EXACT;
-			} catch (NumberFormatException e) {
-				fMode= UNKNOWN;
-			}
-		}
-	}
-
-	@Override
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object var= context.getDefaultVariable();
-		int size;
-		if (var instanceof Collection) {
-			size= ((Collection<?>)var).size();
-		} else {
-			ICountable countable= Expressions.getAsICountable(var, this);
-			if (countable == null)
-				return EvaluationResult.NOT_LOADED;
-			size= countable.count();
-		}
-		switch (fMode) {
-			case UNKNOWN:
-				return EvaluationResult.FALSE;
-			case NONE:
-				return EvaluationResult.valueOf(size == 0);
-			case NONE_OR_ONE:
-				return EvaluationResult.valueOf(size == 0 || size == 1);
-			case ONE_OR_MORE:
-				return EvaluationResult.valueOf(size >= 1);
-			case EXACT:
-				return EvaluationResult.valueOf(fSize == size);
-			case ANY_NUMBER:
-				return EvaluationResult.TRUE;
-			case LESS_THAN:
-				return EvaluationResult.valueOf(size < fSize);
-			case GREATER_THAN:
-				return EvaluationResult.valueOf(size > fSize);
-		}
-		return EvaluationResult.FALSE;
-	}
-
-	@Override
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-
-	@Override
-	public boolean equals(final Object object) {
-		if (!(object instanceof CountExpression))
-			return false;
-
-		final CountExpression that= (CountExpression)object;
-		return (this.fMode == that.fMode) && (this.fSize == that.fSize);
-	}
-
-	@Override
-	protected int computeHashCode() {
-		return HASH_INITIAL * HASH_FACTOR + fMode
-			* HASH_FACTOR + fSize;
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
-		builder.append(" [ size="); //$NON-NLS-1$
-		builder.append(fSize);
-		builder.append(", mode: "); //$NON-NLS-1$
-		builder.append(fMode);
-		switch (fMode) {
-		case GREATER_THAN:
-			builder.append(" GREATER_THAN"); //$NON-NLS-1$
-			break;
-		case LESS_THAN:
-			builder.append(" LESS_THAN"); //$NON-NLS-1$ // -N)
-			break;
-		case ANY_NUMBER:
-			builder.append(" ANY_NUMBER"); //$NON-NLS-1$ // *
-			break;
-		case EXACT:
-			builder.append(" EXACT"); //$NON-NLS-1$ // N
-			break;
-		case ONE_OR_MORE:
-			builder.append(" ONE_OR_MORE"); //$NON-NLS-1$ // +
-			break;
-		case NONE_OR_ONE:
-			builder.append(" NONE_OR_ONE"); //$NON-NLS-1$ // ?
-			break;
-		case NONE:
-			builder.append(" NONE"); //$NON-NLS-1$ // !
-			break;
-		case UNKNOWN:
-			builder.append(" UNKNOWN"); //$NON-NLS-1$ ;
-			break;
-		default:
-			break;
-		}
-		builder.append("]"); //$NON-NLS-1$
-		return builder.toString();
+		super(size);
 	}
 
 }
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java
index b976678..c193894 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java
@@ -15,71 +15,22 @@
 
 import org.w3c.dom.Element;
 
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 
-public class EqualsExpression extends Expression {
-	/**
-	 * The seed for the hash code for all equals expressions.
-	 */
-	private static final int HASH_INITIAL= EqualsExpression.class.getName().hashCode();
-
-	private Object fExpectedValue;
+@Deprecated
+public class EqualsExpression extends org.eclipse.core.expressions.EqualsExpression {
 
 	public EqualsExpression(Object expectedValue) {
-		Assert.isNotNull(expectedValue);
-		fExpectedValue= expectedValue;
+		super(expectedValue);
 	}
 
 	public EqualsExpression(IConfigurationElement element) throws CoreException {
-		String value= element.getAttribute(ATT_VALUE);
-		Expressions.checkAttribute(ATT_VALUE, value);
-		fExpectedValue= Expressions.convertArgument(value);
+		super(element);
 	}
 
 	public EqualsExpression(Element element) throws CoreException {
-		String value= element.getAttribute(ATT_VALUE);
-		Expressions.checkAttribute(ATT_VALUE, value.isEmpty() ? null : value);
-		fExpectedValue= Expressions.convertArgument(value);
+		super(element);
 	}
 
-	@Override
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object element= context.getDefaultVariable();
-		return EvaluationResult.valueOf(element.equals(fExpectedValue));
-	}
-
-	@Override
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-
-	@Override
-	public boolean equals(final Object object) {
-		if (!(object instanceof EqualsExpression))
-			return false;
-
-		final EqualsExpression that= (EqualsExpression)object;
-		return this.fExpectedValue.equals(that.fExpectedValue);
-	}
-
-	@Override
-	protected int computeHashCode() {
-		return HASH_INITIAL * HASH_FACTOR + fExpectedValue.hashCode();
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
-		builder.append(" [expected="); //$NON-NLS-1$
-		builder.append(fExpectedValue);
-		builder.append("]"); //$NON-NLS-1$
-		return builder.toString();
-	}
 }
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ReferenceExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ReferenceExpression.java
index d5b2eea..c573cc6 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ReferenceExpression.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ReferenceExpression.java
@@ -15,98 +15,21 @@
 
 import org.w3c.dom.Element;
 
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 
-/**
- * This class makes use of the <b>org.eclipse.core.expressions.definitions</b>
- * extension point to evaluate the current context against pre-defined
- * expressions. It provides core expression re-use.
- *
- * @since 3.3
- */
-public class ReferenceExpression extends Expression {
-
-	// consider making this a more general extension manager
-	// for now it's just part of the reference expression
-	private static DefinitionRegistry fgDefinitionRegistry= null;
-
-	private static DefinitionRegistry getDefinitionRegistry() {
-		if (fgDefinitionRegistry == null) {
-			fgDefinitionRegistry= new DefinitionRegistry();
-		}
-		return fgDefinitionRegistry;
-	}
-
-	private static final String ATT_DEFINITION_ID= "definitionId"; //$NON-NLS-1$
-
-	/**
-	 * The seed for the hash code for all equals expressions.
-	 */
-	private static final int HASH_INITIAL= ReferenceExpression.class.getName().hashCode();
-
-	private String fDefinitionId;
+@Deprecated
+public class ReferenceExpression extends org.eclipse.core.expressions.ReferenceExpression {
 
 	public ReferenceExpression(String definitionId) {
-		Assert.isNotNull(definitionId);
-		fDefinitionId= definitionId;
+		super(definitionId);
 	}
 
 	public ReferenceExpression(IConfigurationElement element) throws CoreException {
-		fDefinitionId= element.getAttribute(ATT_DEFINITION_ID);
-		Expressions.checkAttribute(ATT_DEFINITION_ID, fDefinitionId);
+		super(element);
 	}
 
 	public ReferenceExpression(Element element) throws CoreException {
-		fDefinitionId= element.getAttribute(ATT_DEFINITION_ID);
-		Expressions.checkAttribute(ATT_DEFINITION_ID, fDefinitionId.isEmpty() ? null : fDefinitionId);
-	}
-
-	@Override
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Expression expr= getDefinitionRegistry().getExpression(fDefinitionId);
-		return expr.evaluate(context);
-	}
-
-	@Override
-	public void collectExpressionInfo(ExpressionInfo info) {
-		Expression expr;
-		try {
-			expr= getDefinitionRegistry().getExpression(fDefinitionId);
-		} catch (CoreException e) {
-			// We didn't find the expression definition. So no
-			// expression info can be collected.
-			return;
-		}
-		expr.collectExpressionInfo(info);
-	}
-
-	@Override
-	public boolean equals(final Object object) {
-		if (!(object instanceof ReferenceExpression))
-			return false;
-
-		final ReferenceExpression that= (ReferenceExpression)object;
-		return this.fDefinitionId.equals(that.fDefinitionId);
-	}
-
-	@Override
-	protected int computeHashCode() {
-		return HASH_INITIAL * HASH_FACTOR + fDefinitionId.hashCode();
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder(getClass().getSimpleName());
-		builder.append(" [definitionId="); //$NON-NLS-1$
-		builder.append(fDefinitionId);
-		builder.append("]"); //$NON-NLS-1$
-		return builder.toString();
+		super(element);
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java
index 50d7509..3c2e062 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java
@@ -16,10 +16,14 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+import org.eclipse.core.expressions.CountExpression;
 import org.eclipse.core.expressions.ElementHandler;
+import org.eclipse.core.expressions.EqualsExpression;
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.core.expressions.ExpressionConverter;
 import org.eclipse.core.expressions.ExpressionTagNames;
+import org.eclipse.core.expressions.ReferenceExpression;
+import org.eclipse.core.expressions.TestExpression;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java
index 5280469..1d05cb4 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java
@@ -15,151 +15,26 @@
 
 import org.w3c.dom.Element;
 
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 
-public class TestExpression extends Expression {
-
-	private String fNamespace;
-	private String fProperty;
-	private Object[] fArgs;
-	private Object fExpectedValue;
-	private boolean fForcePluginActivation;
-
-	private static final char PROP_SEP = '.';
-	private static final String ATT_PROPERTY= "property"; //$NON-NLS-1$
-	private static final String ATT_ARGS= "args"; //$NON-NLS-1$
-	private static final String ATT_FORCE_PLUGIN_ACTIVATION= "forcePluginActivation"; //$NON-NLS-1$
-	/**
-	 * The seed for the hash code for all test expressions.
-	 */
-	private static final int HASH_INITIAL= TestExpression.class.getName().hashCode();
-
-	private static final TypeExtensionManager fgTypeExtensionManager= new TypeExtensionManager("propertyTesters"); //$NON-NLS-1$
+@Deprecated
+public class TestExpression extends org.eclipse.core.expressions.TestExpression {
 
 	public TestExpression(IConfigurationElement element) throws CoreException {
-		String property= element.getAttribute(ATT_PROPERTY);
-		int pos= property.lastIndexOf(PROP_SEP);
-		if (pos == -1) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.NO_NAMESPACE_PROVIDED,
-				ExpressionMessages.TestExpression_no_name_space));
-		}
-		fNamespace= property.substring(0, pos);
-		fProperty= property.substring(pos + 1);
-		fArgs= Expressions.getArguments(element, ATT_ARGS);
-		fExpectedValue= Expressions.convertArgument(element.getAttribute(ATT_VALUE));
-		fForcePluginActivation= Expressions.getOptionalBooleanAttribute(element, ATT_FORCE_PLUGIN_ACTIVATION);
+		super(element);
 	}
 
 	public TestExpression(Element element) throws CoreException {
-		String property= element.getAttribute(ATT_PROPERTY);
-		int pos= property.lastIndexOf(PROP_SEP);
-		if (pos == -1) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.NO_NAMESPACE_PROVIDED,
-				ExpressionMessages.TestExpression_no_name_space));
-		}
-		fNamespace= property.substring(0, pos);
-		fProperty= property.substring(pos + 1);
-		fArgs= Expressions.getArguments(element, ATT_ARGS);
-		String value = element.getAttribute(ATT_VALUE);
-		fExpectedValue = Expressions.convertArgument(value.isEmpty() ? null : value);
-		fForcePluginActivation= Expressions.getOptionalBooleanAttribute(element, ATT_FORCE_PLUGIN_ACTIVATION);
+		super(element);
 	}
 
 	public TestExpression(String namespace, String property, Object[] args, Object expectedValue) {
-		this(namespace, property, args, expectedValue, false);
+		super(namespace, property, args, expectedValue);
 	}
 
 	public TestExpression(String namespace, String property, Object[] args, Object expectedValue, boolean forcePluginActivation) {
-		Assert.isNotNull(namespace);
-		Assert.isNotNull(property);
-		fNamespace= namespace;
-		fProperty= property;
-		fArgs= args != null ? args : Expressions.EMPTY_ARGS;
-		fExpectedValue= expectedValue;
-		fForcePluginActivation= forcePluginActivation;
+		super(namespace, property, args, expectedValue, forcePluginActivation);
 	}
 
-	@Override
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object element= context.getDefaultVariable();
-		if (System.class.equals(element)) {
-			String str= System.getProperty(fProperty);
-			if (str == null)
-				return EvaluationResult.FALSE;
-			return EvaluationResult.valueOf(str.equals(fArgs[0]));
-		}
-		Property property= fgTypeExtensionManager.getProperty(element, fNamespace, fProperty, context.getAllowPluginActivation() && fForcePluginActivation);
-		if (!property.isInstantiated())
-			return EvaluationResult.NOT_LOADED;
-		return EvaluationResult.valueOf(property.test(element, fArgs, fExpectedValue));
-	}
-
-	@Override
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-		info.addAccessedPropertyName(fNamespace + PROP_SEP + fProperty);
-	}
-
-	@Override
-	public boolean equals(final Object object) {
-		if (!(object instanceof TestExpression))
-			return false;
-
-		final TestExpression that= (TestExpression)object;
-		return this.fNamespace.equals(that.fNamespace) && this.fProperty.equals(that.fProperty)
-			&& this.fForcePluginActivation == that.fForcePluginActivation
-			&& equals(this.fArgs, that.fArgs) && equals(this.fExpectedValue, that.fExpectedValue);
-	}
-
-	@Override
-	protected int computeHashCode() {
-		return HASH_INITIAL * HASH_FACTOR + hashCode(fArgs)
-			* HASH_FACTOR + hashCode(fExpectedValue)
-			* HASH_FACTOR + fNamespace.hashCode()
-			* HASH_FACTOR + fProperty.hashCode()
-			* HASH_FACTOR + (fForcePluginActivation ? 1 : 0);
-	}
-
-	//---- Debugging ---------------------------------------------------
-
-	@Override
-	public String toString() {
-		StringBuilder args= new StringBuilder();
-		for (int i= 0; i < fArgs.length; i++) {
-			Object arg= fArgs[i];
-			if (arg instanceof String) {
-				args.append('\'');
-				args.append(arg);
-				args.append('\'');
-			} else {
-				args.append(arg.toString());
-			}
-			if (i < fArgs.length - 1)
-				args.append(", "); //$NON-NLS-1$
-		}
-		return "<test property=\"" + fProperty +  "\"" +//$NON-NLS-1$ //$NON-NLS-2$
-		(fArgs.length != 0 ? " args=\"" + args + "\"" : "") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		 (fExpectedValue != null ? " value=\"" + fExpectedValue + "\"" : "") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		  " plug-in activation: " + (fForcePluginActivation ? "eager" : "lazy") +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-		  "/>"; //$NON-NLS-1$
-	}
-
-	//---- testing ---------------------------------------------------
-
-	public boolean testGetForcePluginActivation() {
-		return fForcePluginActivation;
-	}
-
-	public static TypeExtensionManager testGetTypeExtensionManager() {
-		return fgTypeExtensionManager;
-	}
 }
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/CountExpressionTest.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/CountExpressionTest.java
index d1ee845..358d899 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/CountExpressionTest.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/CountExpressionTest.java
@@ -18,9 +18,9 @@
 
 import org.junit.Assert;
 
+import org.eclipse.core.expressions.CountExpression;
 import org.eclipse.core.expressions.EvaluationContext;
 import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.internal.expressions.CountExpression;
 
 import org.eclipse.core.runtime.CoreException;
 
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java
index da066fc..9aba1de 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java
@@ -17,17 +17,17 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.eclipse.core.expressions.CountExpression;
+import org.eclipse.core.expressions.EqualsExpression;
 import org.eclipse.core.expressions.ExpressionInfo;
+import org.eclipse.core.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.AdaptExpression;
 import org.eclipse.core.internal.expressions.AndExpression;
-import org.eclipse.core.internal.expressions.CountExpression;
-import org.eclipse.core.internal.expressions.EqualsExpression;
 import org.eclipse.core.internal.expressions.InstanceofExpression;
 import org.eclipse.core.internal.expressions.IterateExpression;
 import org.eclipse.core.internal.expressions.NotExpression;
 import org.eclipse.core.internal.expressions.ResolveExpression;
 import org.eclipse.core.internal.expressions.SystemTestExpression;
-import org.eclipse.core.internal.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.WithExpression;
 
 import junit.framework.Test;
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
index 4d8061a..ab3e0ca 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
@@ -40,17 +40,18 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
+import org.eclipse.core.expressions.CountExpression;
+import org.eclipse.core.expressions.EqualsExpression;
 import org.eclipse.core.expressions.EvaluationContext;
 import org.eclipse.core.expressions.EvaluationResult;
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.core.expressions.ExpressionConverter;
 import org.eclipse.core.expressions.IEvaluationContext;
 import org.eclipse.core.expressions.IVariableResolver;
+import org.eclipse.core.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.AdaptExpression;
 import org.eclipse.core.internal.expressions.AndExpression;
-import org.eclipse.core.internal.expressions.CountExpression;
 import org.eclipse.core.internal.expressions.EnablementExpression;
-import org.eclipse.core.internal.expressions.EqualsExpression;
 import org.eclipse.core.internal.expressions.ExpressionStatus;
 import org.eclipse.core.internal.expressions.Expressions;
 import org.eclipse.core.internal.expressions.InstanceofExpression;
@@ -59,7 +60,6 @@
 import org.eclipse.core.internal.expressions.OrExpression;
 import org.eclipse.core.internal.expressions.ResolveExpression;
 import org.eclipse.core.internal.expressions.SystemTestExpression;
-import org.eclipse.core.internal.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.WithExpression;
 
 import org.eclipse.core.runtime.CoreException;
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java
index a565003..d805874 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java
@@ -21,8 +21,8 @@
 
 import org.eclipse.core.expressions.EvaluationContext;
 import org.eclipse.core.expressions.EvaluationResult;
+import org.eclipse.core.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.Property;
-import org.eclipse.core.internal.expressions.TestExpression;
 import org.eclipse.core.internal.expressions.TypeExtensionManager;
 
 import org.eclipse.core.runtime.CoreException;
