diff --git a/org.eclipse.jdt.debug/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
index 23105c5..280cecd 100644
--- a/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.debug; singleton:=true
-Bundle-Version: 3.4.1.qualifier
+Bundle-Version: 3.4.2.qualifier
 Bundle-ClassPath: jdi.jar,
  jdimodel.jar,
  tools.jar
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
index 8e286ff..93e25be 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTInstructionCompiler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -188,6 +188,8 @@
 import org.eclipse.jdt.internal.debug.eval.ast.instructions.XorAssignmentOperator;
 import org.eclipse.jdt.internal.debug.eval.ast.instructions.XorOperator;
 
+import com.ibm.icu.text.MessageFormat;
+
 /**
  * The AST instruction compiler generates a sequence
  * of instructions (InstructionSequence) from a
@@ -441,12 +443,12 @@
 
 		if (expression instanceof MethodInvocation) {
 			IMethodBinding methodBinding= (IMethodBinding)((MethodInvocation)expression).getName().resolveBinding();
-			if ("void".equals(methodBinding.getReturnType().getName())) { //$NON-NLS-1$
+			if (methodBinding != null && "void".equals(methodBinding.getReturnType().getName())) { //$NON-NLS-1$
 				pop= false;
 			}
 		} else if (expression instanceof SuperMethodInvocation) {
 			IMethodBinding methodBinding= (IMethodBinding)((SuperMethodInvocation)expression).getName().resolveBinding();
-			if ("void".equals(methodBinding.getReturnType().getName())) { //$NON-NLS-1$
+			if (methodBinding != null && "void".equals(methodBinding.getReturnType().getName())) { //$NON-NLS-1$
 				pop= false;
 			}
 		} else if (expression instanceof VariableDeclarationExpression) {
@@ -473,6 +475,9 @@
 	 * Returns true if a storeInstruction() is needed after visiting the expression
 	 */
 	private boolean checkAutoBoxing(ITypeBinding valueBinding, ITypeBinding requestedBinding) {
+		if (valueBinding == null) {
+			return false; // unresolved
+		}
 		if (valueBinding.isPrimitive() == requestedBinding.isPrimitive()) {
 			return false;
 		}
@@ -590,6 +595,11 @@
 	public void endVisit(ArrayAccess node) {
 		if (!isActive() || hasErrors())
 			return;
+		ITypeBinding typeBinding = node.getIndex().resolveTypeBinding();
+		if (typeBinding != null && unBoxing(typeBinding)) {
+			// un-box the index, if required
+			storeInstruction();
+		}
 		storeInstruction();
 	}
 
@@ -1515,10 +1525,11 @@
 
 		ArrayType arrayType= node.getType();
 
-		if (isALocalType(arrayType.resolveBinding().getElementType())) {
+		ITypeBinding binding = resolveTypeBinding(arrayType);
+		if (binding != null && isALocalType(binding.getElementType())) {
 			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Local_type_array_instance_creation_cannot_be_used_in_an_evaluation_expression_29); 
 			setHasError(true);
-			return true;
+			return false;
 		}
 
 		push(new ArrayAllocation(arrayType.getDimensions(), node.dimensions().size(), node.getInitializer() != null, fCounter));
@@ -1534,11 +1545,12 @@
 			return false;
 		}
 
-		ITypeBinding typeBinding= node.resolveTypeBinding();
-		int dimension= typeBinding.getDimensions();
-		String signature= getTypeSignature(typeBinding.getElementType());
-
-		push(new ArrayInitializerInstruction(signature, node.expressions().size(), dimension, fCounter));
+		ITypeBinding typeBinding = resolveTypeBinding(node);
+		if (typeBinding != null) {
+			int dimension= typeBinding.getDimensions();
+			String signature= getTypeSignature(typeBinding.getElementType());
+			push(new ArrayInitializerInstruction(signature, node.expressions().size(), dimension, fCounter));
+		}
 
 		return true;
 	}
@@ -1550,11 +1562,12 @@
 		if (!isActive()) {
 			return false;
 		}
-		ITypeBinding arrayTypeBinding= node.resolveBinding();
-		int dimension= arrayTypeBinding.getDimensions();
-		String signature= getTypeSignature(arrayTypeBinding.getElementType());
-
-		push(new PushArrayType(signature, dimension, fCounter));
+		ITypeBinding arrayTypeBinding= resolveTypeBinding(node);
+		if (arrayTypeBinding != null) {
+			int dimension= arrayTypeBinding.getDimensions();
+			String signature= getTypeSignature(arrayTypeBinding.getElementType());
+			push(new PushArrayType(signature, dimension, fCounter));
+		}
 
 		return false;
 	}
@@ -1568,7 +1581,7 @@
 		}
 		setHasError(true);
 		addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Assert_statement_cannot_be_used_in_an_evaluation_expression_3); 
-		return true;
+		return false;
 	}
 
 	/**
@@ -1591,6 +1604,14 @@
 			char2 = opToken.charAt(2);
 		}
 
+		ITypeBinding rightBinding = resolveTypeBinding(rightHandSide);
+		if (rightBinding == null) {
+			return false;
+		}
+		ITypeBinding leftBinding = resolveTypeBinding(leftHandSide);
+		if (leftBinding == null) {
+			return false;
+		}
 		if (variableTypeId == Instruction.T_Object) {
 			// If the variable is an object, the value may need to be boxed for
 			// the simple assignment.
@@ -1609,8 +1630,8 @@
 			if (char0 == '=') {
 				
 				boolean storeRequired= false;
-				if (rightHandSide.resolveTypeBinding().isPrimitive()) {
-					boxing(leftHandSide.resolveTypeBinding(), rightHandSide.resolveTypeBinding());
+				if (rightBinding.isPrimitive()) {
+					boxing(leftBinding, rightBinding);
 					storeRequired= true;
 				}
 				rightHandSide.accept(this);
@@ -1622,7 +1643,7 @@
 				boolean unrecognized = false;
 				
 				
-				boxing(leftHandSide.resolveTypeBinding(), rightHandSide.resolveTypeBinding());
+				boxing(leftBinding, rightBinding);
 				
 				switch (char0) {
 					case '=': // equal
@@ -1678,12 +1699,12 @@
 					return false;
 				}
 
-				unBoxing(leftHandSide.resolveTypeBinding());
+				unBoxing(leftBinding);
 				push(new Dup());
 				storeInstruction(); // dupe
 				storeInstruction(); // un-boxing
 			
-				boolean storeRequired= unBoxing(rightHandSide.resolveTypeBinding());
+				boolean storeRequired= unBoxing(rightBinding);
 				rightHandSide.accept(this);
 				if (storeRequired) {
 					storeInstruction(); // un-boxing
@@ -1753,7 +1774,7 @@
 			}
 			
 			leftHandSide.accept(this);
-			boolean storeRequired= unBoxing(rightHandSide.resolveTypeBinding());
+			boolean storeRequired= unBoxing(rightBinding);
 			rightHandSide.accept(this);
 			if (storeRequired) {
 				storeInstruction();
@@ -1833,20 +1854,18 @@
 
 		Type type= node.getType();
 		int typeId= getTypeId(type);
-		ITypeBinding typeBinding= type.resolveBinding();
-
-		String baseTypeSignature;
-		int dimension= typeBinding.getDimensions();
-
-		if (typeBinding.isArray()) {
-			typeBinding= typeBinding.getElementType();
-		}
+		ITypeBinding typeBinding= resolveTypeBinding(type);
 		
-		baseTypeSignature= getTypeName(typeBinding);
-
-		push(new Cast(typeId, baseTypeSignature, dimension, fCounter));
-
-		node.getExpression().accept(this);
+		if (typeBinding != null) {
+			String baseTypeSignature;
+			int dimension= typeBinding.getDimensions();
+			if (typeBinding.isArray()) {
+				typeBinding= typeBinding.getElementType();
+			}
+			baseTypeSignature= getTypeName(typeBinding);
+			push(new Cast(typeId, baseTypeSignature, dimension, fCounter));
+			node.getExpression().accept(this);
+		}
 
 		return false;
 	}
@@ -1860,7 +1879,7 @@
 		}
 		setHasError(true);
 		addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Catch_clause_cannot_be_used_in_an_evaluation_expression_6); 
-		return true;
+		return false;
 	}
 
 	/**
@@ -1891,8 +1910,12 @@
 		}
 
 		IMethodBinding methodBinding= node.resolveConstructorBinding();
+		if (methodBinding == null) {
+			setHasError(true);
+			addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_1, new String[]{node.toString()}));
+			return false;
+		}
 		ITypeBinding typeBinding= methodBinding.getDeclaringClass();
-		ITypeBinding enclosingTypeBinding= typeBinding.getDeclaringClass();
 
 		boolean isInstanceMemberType= typeBinding.isMember() && ! Modifier.isStatic(typeBinding.getModifiers());
 
@@ -1908,20 +1931,27 @@
 
 
 		if (hasErrors()) {
-			return true;
+			return false;
 		}
 
-		int argCount= methodBinding.getParameterTypes().length;
+		int paramCount= methodBinding.getParameterTypes().length;
 
 		String enclosingTypeSignature= null;
+		ITypeBinding enclosingTypeBinding= null;
 		if (isInstanceMemberType) {
+			enclosingTypeBinding= typeBinding.getDeclaringClass();
+			if (enclosingTypeBinding == null) {
+				setHasError(true);
+				addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_2, new String[]{typeBinding.getQualifiedName()}));
+				return false;
+			}
 			enclosingTypeSignature= getTypeSignature(enclosingTypeBinding);
-			argCount++;
+			paramCount++;
 		}
 
 		String signature= getMethodSignature(methodBinding, enclosingTypeSignature).replace('.','/');
 
-		push(new Constructor(signature, argCount, fCounter));
+		push(new Constructor(signature, paramCount, fCounter));
 
 		push(new PushType(getTypeName(typeBinding)));
 		storeInstruction();
@@ -1939,7 +1969,7 @@
 				if (Modifier.isStatic(((MethodDeclaration)parent).getModifiers())) {
 					setHasError(true);
 					addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Must_explicitly_qualify_the_allocation_with_an_instance_of_the_enclosing_type_33); 
-					return true;
+					return false;
 				}
 
 				push(new PushThis(getEnclosingLevel(node, enclosingTypeBinding)));
@@ -1947,10 +1977,8 @@
 			}
 		}
 
-		Iterator iterator= node.arguments().iterator();
-		while (iterator.hasNext()) {
-			((Expression) iterator.next()).accept(this);
-		}
+		List arguments = node.arguments();
+		pushMethodArguments(methodBinding, arguments);
 
 		return false;
 	}
@@ -2043,9 +2071,15 @@
 		push(new NoOp(fCounter));
 		
 		
-		ITypeBinding typeBinding= node.getExpression().resolveTypeBinding();
+		ITypeBinding typeBinding= resolveTypeBinding(node.getExpression());
+		if (typeBinding == null) {
+			return false;
+		}
 		Type paramType= node.getParameter().getType();
-        ITypeBinding paramBinding = paramType.resolveBinding();
+        ITypeBinding paramBinding = resolveTypeBinding(paramType);
+        if (paramBinding == null) {
+			return false;
+        }
 		String typeSignature= getTypeSignature(paramBinding);
 		int paramTypeId= getTypeId(paramType);
 		boolean isParamPrimitiveType= paramTypeId != Instruction.T_Object && paramTypeId != Instruction.T_String;
@@ -2309,8 +2343,21 @@
 		Expression rightOperand= node.getRightOperand();
 		int leftTypeId;
 		int rightTypeId;
-		// == case, do not un-box, if the two operands are objects
-		boolean unbox= char0 != '=' || leftOperand.resolveTypeBinding().isPrimitive() || rightOperand.resolveTypeBinding().isPrimitive();
+		boolean unbox = false;
+		// for == and != un-box when at least operand is primitive (otherwise compare the objects)
+		ITypeBinding leftBinding = resolveTypeBinding(leftOperand);
+		if (leftBinding == null) {
+			return false;
+		}
+		ITypeBinding rightBinding = resolveTypeBinding(rightOperand);
+		if (rightBinding == null) {
+			return false;
+		}
+		if ((char0 == '=' || char0 == '!') && char1 == '=') {
+			unbox = leftBinding.isPrimitive() || rightBinding.isPrimitive();
+		} else {
+			unbox = true;
+		}
 		if (unbox) {
 			leftTypeId= getUnBoxedTypeId(leftOperand);
 			rightTypeId = getUnBoxedTypeId(rightOperand);
@@ -2475,7 +2522,7 @@
 		}
 
 		if (hasErrors()) {
-			return true;
+			return false;
 		}
 
 		iterator = extendedOperands.iterator();
@@ -2487,7 +2534,7 @@
 			ConditionalJump[] conditionalJumps= new ConditionalJump[operatorNumber];
 			int[] conditionalJumpAddresses = new int[operatorNumber];
 
-			boolean storeRequired= unBoxing(leftOperand.resolveTypeBinding());
+			boolean storeRequired= unBoxing(leftBinding);
 			leftOperand.accept(this);
 			if (storeRequired) {
 				storeInstruction();
@@ -2499,7 +2546,7 @@
 			push(conditionalJump);
 			storeInstruction();
 
-			storeRequired= unBoxing(rightOperand.resolveTypeBinding());
+			storeRequired= unBoxing(rightBinding);
 			rightOperand.accept(this);
 			if (storeRequired) {
 				storeInstruction();
@@ -2512,7 +2559,11 @@
 				push(conditionalJump);
 				storeInstruction();
 				Expression operand= (Expression) iterator.next();
-				storeRequired= unBoxing(operand.resolveTypeBinding());
+				ITypeBinding typeBinding = resolveTypeBinding(operand);
+				if (typeBinding == null) {
+					return false;
+				}
+				storeRequired= unBoxing(typeBinding);
 				operand.accept(this);
 				if (storeRequired) {
 					storeInstruction();
@@ -2538,14 +2589,14 @@
 
 			boolean storeRequired= false;
 			if (unbox) {
-				storeRequired= unBoxing(leftOperand.resolveTypeBinding());
+				storeRequired= unBoxing(leftBinding);
 			}
 			leftOperand.accept(this);
 			if (storeRequired) {
 				storeInstruction();
 			}
 			if (unbox) {
-				storeRequired= unBoxing(rightOperand.resolveTypeBinding());
+				storeRequired= unBoxing(rightBinding);
 			}
 			rightOperand.accept(this);
 			if (storeRequired) {
@@ -2556,7 +2607,11 @@
 			for (int i= 1; i < operatorNumber; i ++) {
 				Expression operand= (Expression) iterator.next();
 				if (unbox) {
-					storeRequired= unBoxing(operand.resolveTypeBinding());
+					ITypeBinding typeBinding = resolveTypeBinding(operand);
+					if (typeBinding == null) {
+						return false;
+					}
+					storeRequired= unBoxing(typeBinding);
 				}
 				operand.accept(this);
 				if (storeRequired) {
@@ -2672,20 +2727,16 @@
 		}
 		
 		if (hasErrors()) {
-			return true;
+			return false;
 		}
 
 		if (containsALocalType(methodBinding)) {
 			setHasError(true);
-			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Method_which_contains_a_local_type_as_parameter_cannot_be_used_in_an_evaluation_expression_32); 
+			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Method_which_contains_a_local_type_as_parameter_cannot_be_used_in_an_evaluation_expression_32);
+			return false;
 		}
 
-		if (hasErrors()) {
-			return true;
-		}
-
-		ITypeBinding[] parameterTypes = methodBinding.getParameterTypes();
-		int paramCount= parameterTypes.length;
+		int paramCount = methodBinding.getParameterTypes().length;
 		String selector= methodBinding.getName();
 
 		String signature= getMethodSignature(methodBinding, null).replace('.','/');
@@ -2711,8 +2762,31 @@
 		}
 
 		List arguments = node.arguments();
+		pushMethodArguments(methodBinding, arguments);
+
+		return false;
+	}
+	
+	/**
+	 * Pushes method arguments onto the stack for a method or constructor invocation taking
+	 * variable arguments and auto-boxing into consideration.
+	 * 
+	 * @param methodBinding method or constructor being called
+	 * @param arguments argument list
+	 */
+	private void pushMethodArguments(IMethodBinding methodBinding, List arguments) {
 		int argCount = arguments.size();
-		if (methodBinding.isVarargs() && !(paramCount == argCount && parameterTypes[paramCount - 1].getDimensions() == ((Expression)arguments.get(argCount - 1)).resolveTypeBinding().getDimensions())) {
+		ITypeBinding[] parameterTypes = methodBinding.getParameterTypes();
+		int paramCount = parameterTypes.length;
+		ITypeBinding lastArgBinding = null;
+		if (methodBinding.isVarargs()) {
+			Expression lastArg = (Expression)arguments.get(argCount - 1);
+			lastArgBinding = resolveTypeBinding(lastArg);
+			if (lastArgBinding == null) {
+				return;
+			}
+		}
+		if (methodBinding.isVarargs() && !(paramCount == argCount && parameterTypes[paramCount - 1].getDimensions() == lastArgBinding.getDimensions())) {
 			// if this method is a varargs, and if the method is invoked using the varargs syntax
 			// (multiple arguments) and not an array
 			Iterator iterator= arguments.iterator();
@@ -2750,8 +2824,6 @@
 				}
 			}
 		} 
-
-		return false;
 	}
 	
 	/* (non-Javadoc)
@@ -2908,8 +2980,10 @@
 		if (!isActive()) {
 			return false;
 		}
-		ITypeBinding typeBinding  = node.resolveBinding();
-		push(new PushType(getTypeName(typeBinding)));
+		ITypeBinding typeBinding  = resolveTypeBinding(node);
+		if (typeBinding != null) {
+			push(new PushType(getTypeName(typeBinding)));
+		}
 		return false;
 	}
 
@@ -2954,7 +3028,7 @@
 				default:
 					setHasError(true);
 					addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_unrecognized_postfix_operator____15 + opToken); 
-					break;
+					return false;
 			}
 			push(new Value(fCounter));
 			push(new Dup());
@@ -2962,12 +3036,16 @@
 			storeInstruction(); // value
 			push(new DupX1());
 			storeInstruction(); // dup_x1
-			unBoxing(operand.resolveTypeBinding());
+			ITypeBinding typeBinding = resolveTypeBinding(operand);
+			if (typeBinding == null) {
+				return false;
+			}
+			unBoxing(typeBinding);
 			storeInstruction(); // un-boxing
 			push(new PushInt(1));
 			storeInstruction(); // push 1
 			storeInstruction(); // operator
-			boxing(operand.resolveTypeBinding(), null);
+			boxing(typeBinding, null);
 			storeInstruction(); // boxing
 			storeInstruction(); // assignment
 			push(new Pop(assignmentInstruction.getSize() + 1));
@@ -2986,7 +3064,7 @@
 			default:
 				setHasError(true);
 				addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_unrecognized_postfix_operator____15 + opToken); 
-				break;
+				return false;
 		}
 
 		return true;
@@ -3017,6 +3095,10 @@
 			
 			int expressionUnBoxedTypeId= getUnBoxedTypeId(operand);
 			
+			ITypeBinding typeBinding = resolveTypeBinding(operand);
+			if (typeBinding == null) {
+				return false;
+			}
 			if (char1 == '\0') {
 				switch (char0) {
 					case '+': // unary plus
@@ -3034,10 +3116,10 @@
 					default:
 						setHasError(true);
 						addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_unrecognized_prefix_operator____16 + opToken); 
-						break;
+						return false;
 				}
 	
-				unBoxing(operand.resolveTypeBinding());
+				unBoxing(typeBinding);
 				operand.accept(this);
 				storeInstruction(); // un-boxing
 				
@@ -3048,7 +3130,7 @@
 				
 				operand.accept(this);
 				
-				boxing(operand.resolveTypeBinding(), null);
+				boxing(typeBinding, null);
 				
 				switch (char1) {
 					case '+':
@@ -3060,10 +3142,10 @@
 					default:
 						setHasError(true);
 						addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_unrecognized_prefix_operator____16 + opToken); 
-						break;
+						return false;
 				}
 				
-				unBoxing(operand.resolveTypeBinding());
+				unBoxing(typeBinding);
 				push(new Dup());
 				storeInstruction(); // dupe
 				storeInstruction(); // un-boxing
@@ -3120,6 +3202,7 @@
 		if (unrecognized) {
 			setHasError(true);
 			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_unrecognized_prefix_operator____16 + opToken); 
+			return false;
 		}
 
 		return true;
@@ -3132,8 +3215,10 @@
 		if (!isActive()) {
 			return false;
 		}
-		ITypeBinding typeBinding  = node.resolveBinding();
-		push(new PushPrimitiveType(getTypeName(typeBinding)));
+		ITypeBinding typeBinding  = resolveTypeBinding(node);
+		if (typeBinding != null) {
+			push(new PushPrimitiveType(getTypeName(typeBinding)));
+		}
 		return false;
 	}
 
@@ -3149,14 +3234,20 @@
 			return true;
 		}
 
-		IBinding binding = node.resolveBinding();
+		IBinding binding = resolveBinding(node);
+		if (binding == null) {
+			return false;
+		}
 		switch (binding.getKind()) {
 			case IBinding.TYPE:
 				node.getName().accept(this);
 				break;
 			case IBinding.VARIABLE:
 				SimpleName fieldName= node.getName();
-				IVariableBinding fieldBinding= (IVariableBinding) fieldName.resolveBinding();
+				IVariableBinding fieldBinding= (IVariableBinding) resolveBinding(fieldName);
+				if (fieldBinding == null) {
+					return false;
+				}
 				ITypeBinding declaringTypeBinding= fieldBinding.getDeclaringClass();
 				String fieldId = fieldName.getIdentifier();
 
@@ -3184,8 +3275,10 @@
 		if (!isActive()) {
 			return false;
 		}
-		ITypeBinding typeBinding  = node.resolveBinding();
-		push(new PushType(getTypeName(typeBinding)));
+		ITypeBinding typeBinding  = resolveTypeBinding(node);
+		if (typeBinding != null) {
+			push(new PushType(getTypeName(typeBinding)));
+		}
 		return false;
 	}
 
@@ -3212,14 +3305,11 @@
 			return true;
 		}
 
-		IBinding binding = node.resolveBinding();
-
-		String variableId = node.getIdentifier();
+		IBinding binding = resolveBinding(node);
 		if (binding == null) {
-			setHasError(true);
-			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_binding_null_for__17 + variableId); 
 			return true;
 		}
+		String variableId = node.getIdentifier();
 
 		switch (binding.getKind()) {
 			case IBinding.TYPE:
@@ -3260,9 +3350,10 @@
 			return false;
 		}
 
-		ITypeBinding typeBinding  = node.resolveBinding();
-		push(new PushType(getTypeName(typeBinding)));
-
+		ITypeBinding typeBinding  = resolveTypeBinding(node);
+		if (typeBinding != null) {
+			push(new PushType(getTypeName(typeBinding)));
+		}
 		return false;
 	}
 
@@ -3281,15 +3372,17 @@
 		if (!isActive()) {
 			return false;
 		}
-		ITypeBinding typeBinding= node.getType().resolveBinding();
-		int typeDimension= typeBinding.getDimensions();
-		if (typeDimension != 0) {
-			typeBinding= typeBinding.getElementType();
-		}
-		Expression initializer= node.getInitializer();
-		push(new LocalVariableCreation(node.getName().getIdentifier(), getTypeSignature(typeBinding), typeDimension, typeBinding.isPrimitive(), initializer != null, fCounter));
-		if (initializer != null) {
-			initializer.accept(this);
+		ITypeBinding typeBinding= resolveTypeBinding(node.getType());
+		if (typeBinding != null) {
+			int typeDimension= typeBinding.getDimensions();
+			if (typeDimension != 0) {
+				typeBinding= typeBinding.getElementType();
+			}
+			Expression initializer= node.getInitializer();
+			push(new LocalVariableCreation(node.getName().getIdentifier(), getTypeSignature(typeBinding), typeDimension, typeBinding.isPrimitive(), initializer != null, fCounter));
+			if (initializer != null) {
+				initializer.accept(this);
+			}
 		}
 		return false;
 	}
@@ -3328,7 +3421,10 @@
 		}
 
 		SimpleName fieldName= node.getName();
-		IVariableBinding fieldBinding= (IVariableBinding) fieldName.resolveBinding();
+		IVariableBinding fieldBinding= (IVariableBinding) resolveBinding(fieldName);
+		if (fieldBinding == null) {
+			return false;
+		}
 		ITypeBinding declaringTypeBinding= fieldBinding.getDeclaringClass();
 		String fieldId = fieldName.getIdentifier();
 
@@ -3339,8 +3435,16 @@
 			int superLevel= 1;
 			int enclosingLevel= 0;
 			if (qualifier != null) {
-				superLevel= getSuperLevel(qualifier.resolveTypeBinding(), declaringTypeBinding);
-				enclosingLevel= getEnclosingLevel(node, (ITypeBinding)qualifier.resolveBinding());
+				ITypeBinding typeBinding = resolveTypeBinding(qualifier);
+				if (typeBinding == null) {
+					return false;
+				}
+				superLevel= getSuperLevel(typeBinding, declaringTypeBinding);
+				ITypeBinding binding = (ITypeBinding)resolveBinding(qualifier);
+				if (binding == null) {
+					return false;
+				}
+				enclosingLevel= getEnclosingLevel(node, binding);
 			}
 			push(new PushFieldVariable(fieldId, superLevel, fCounter));
 			push(new PushThis(enclosingLevel));
@@ -3360,15 +3464,15 @@
 			return false;
 		}
 
-		IMethodBinding methodBinding = (IMethodBinding) node.getName().resolveBinding();
+		IMethodBinding methodBinding = (IMethodBinding) resolveBinding(node.getName());
+		if (methodBinding == null) {
+			return false;
+		}
 
 		if (containsALocalType(methodBinding)) {
 			setHasError(true);
-			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Method_which_contains_a_local_type_as_parameter_cannot_be_used_in_an_evaluation_expression_32); 
-		}
-
-		if (hasErrors()) {
-			return true;
+			addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Method_which_contains_a_local_type_as_parameter_cannot_be_used_in_an_evaluation_expression_32);
+			return false;
 		}
 
 		ITypeBinding[] parameterTypes = methodBinding.getParameterTypes();
@@ -3383,7 +3487,11 @@
 			push(new SendMessage(selector, signature, paramCount, getTypeSignature(methodBinding.getDeclaringClass()), fCounter));
 			int enclosingLevel= 0;
 			if (qualifier != null) {
-				enclosingLevel= getEnclosingLevel(node, (ITypeBinding)qualifier.resolveBinding());
+				ITypeBinding typeBinding = (ITypeBinding)resolveBinding(qualifier);
+				if (typeBinding == null) {
+					return false;
+				}
+				enclosingLevel= getEnclosingLevel(node, typeBinding);
 			}
 			push(new PushThis(enclosingLevel));
 			storeInstruction();
@@ -3391,7 +3499,14 @@
 
 		List arguments = node.arguments();
 		int argCount = arguments.size();
-		if (methodBinding.isVarargs() && !(paramCount == argCount && parameterTypes[paramCount - 1].getDimensions() == ((Expression)arguments.get(argCount - 1)).resolveTypeBinding().getDimensions())) {
+		ITypeBinding lastArgBinding = null;
+		if (methodBinding.isVarargs()) {
+			lastArgBinding = resolveTypeBinding((Expression)arguments.get(argCount - 1));
+			if (lastArgBinding == null) {
+				return false;
+			}
+		}
+		if (methodBinding.isVarargs() && !(paramCount == argCount && parameterTypes[paramCount - 1].getDimensions() == lastArgBinding.getDimensions())) {
 			// if this method is a varargs, and if the method is invoked using the varargs syntax
 			// (multiple arguments) and not an array
 			Iterator iterator= arguments.iterator();
@@ -3584,7 +3699,11 @@
 		Name qualifier= node.getQualifier();
 		int enclosingLevel= 0;
 		if (qualifier != null) {
-			enclosingLevel= getEnclosingLevel(node, (ITypeBinding)qualifier.resolveBinding());
+			ITypeBinding binding = (ITypeBinding)resolveBinding(qualifier);
+			if (binding == null) {
+				return false;
+			}
+			enclosingLevel= getEnclosingLevel(node, binding);
 		}
 		push(new PushThis(enclosingLevel));
 
@@ -3611,7 +3730,7 @@
 		}
 		setHasError(true);
 		addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Try_statement_cannot_be_used_in_an_evaluation_expression_23); 
-		return true;
+		return false;
 	}
 
 	/**
@@ -3693,16 +3812,19 @@
 		ASTNode parent= node.getParent();
 		switch (parent.getNodeType()) {
 			case ASTNode.VARIABLE_DECLARATION_EXPRESSION:
-				varTypeBinding= ((VariableDeclarationExpression)parent).getType().resolveBinding();
+				varTypeBinding= resolveTypeBinding(((VariableDeclarationExpression)parent).getType());
 				break;
 			case ASTNode.VARIABLE_DECLARATION_STATEMENT:
-				varTypeBinding= ((VariableDeclarationStatement)parent).getType().resolveBinding();
+				varTypeBinding= resolveTypeBinding(((VariableDeclarationStatement)parent).getType());
 				break;
 			default:
 				setHasError(true);
 				addErrorMessage(EvaluationEngineMessages.ASTInstructionCompiler_Error_in_type_declaration_statement); 
 				return false;
 		}
+		if (varTypeBinding == null) {
+			return false;
+		}
 		int typeDimension= varTypeBinding.getDimensions();
 		ITypeBinding elementBinding = varTypeBinding;
 		if (typeDimension != 0) {
@@ -3766,6 +3888,9 @@
 
 	private int getTypeId(Expression expression) {
 		ITypeBinding typeBinding = expression.resolveTypeBinding();
+		if (typeBinding == null) {
+			return Instruction.T_undefined;
+		}
 		String typeName = typeBinding.getQualifiedName();
 		if (typeBinding.isPrimitive()) {
 			return getPrimitiveTypeId(typeName);
@@ -3778,6 +3903,9 @@
 
 	private int getUnBoxedTypeId(Expression expression) {
 		ITypeBinding typeBinding = expression.resolveTypeBinding();
+		if (typeBinding == null) {
+			return Instruction.T_undefined;
+		}
 		String typeName = typeBinding.getQualifiedName();
 		if (typeBinding.isPrimitive()) {
 			return getPrimitiveTypeId(typeName);
@@ -3811,7 +3939,7 @@
 			return getPrimitiveTypeId(((PrimitiveType)type).getPrimitiveTypeCode().toString());
 		} else if (type.isSimpleType()) {
 			SimpleType simpleType = (SimpleType) type;
-			if ("java.lang.String".equals(simpleType.getName())){ //$NON-NLS-1$
+			if ("java.lang.String".equals(simpleType.getName().getFullyQualifiedName())){ //$NON-NLS-1$
 				return Instruction.T_String;
 			} 
 			return Instruction.T_Object;
@@ -3880,4 +4008,68 @@
 		}
 		return Instruction.T_undefined;
 	}
+	
+	/**
+	 * Resolves and returns the type binding from the given expression reporting an error
+	 * if the binding is <code>null</code>.
+	 *  
+	 * @param expression expression to resolve type binding for
+	 * @return type binding or <code>null</code> if not available
+	 */
+	private ITypeBinding resolveTypeBinding(Expression expression) {
+		ITypeBinding typeBinding = expression.resolveTypeBinding();
+		if (typeBinding == null) {
+			setHasError(true);
+			addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_3, new String[]{expression.toString()}));
+		}
+		return typeBinding;
+	}
+	
+	/**
+	 * Resolves and returns the type binding for the give type reporting an error
+	 * if the binding is <code>null</code>.
+	 * 
+	 * @param type type to resolve binding for
+	 * @return type binding or <code>null</code> if not available
+	 */
+	private ITypeBinding resolveTypeBinding(Type type) {
+		ITypeBinding typeBinding = type.resolveBinding();
+		if (typeBinding == null) {
+			setHasError(true);
+			addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_3, new String[]{type.toString()}));
+		}
+		return typeBinding;
+	}
+	
+	/**
+	 * Resolves and returns the binding for the given name reporting an error
+	 * if the binding is <code>null</code>.
+	 * 
+	 * @param name name to resolve binding for
+	 * @return binding or <code>null</code> if not available
+	 */
+	private IBinding resolveBinding(Name name) {
+		IBinding binding = name.resolveBinding();
+		if (binding == null) {
+			setHasError(true);
+			addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_5, new String[]{name.getFullyQualifiedName()}));
+		}
+		return binding;
+	}	
+	
+	/**
+	 * Resolves and returns the type binding for the given name reporting an error
+	 * if the binding is <code>null</code>.
+	 * 
+	 * @param name name to resolve type binding for
+	 * @return type binding or <code>null</code> if not available
+	 */
+	private ITypeBinding resolveTypeBinding(Name name) {
+		ITypeBinding typeBinding = name.resolveTypeBinding();
+		if (typeBinding == null) {
+			setHasError(true);
+			addErrorMessage(MessageFormat.format(EvaluationEngineMessages.ASTInstructionCompiler_3, new String[]{name.getFullyQualifiedName()}));
+		}
+		return typeBinding;
+	}
 }
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java
index 50ee1d8..ccfba0f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,7 +28,6 @@
 
 	public static String ASTInstructionCompiler_unrecognized_postfix_operator____15;
 	public static String ASTInstructionCompiler_unrecognized_prefix_operator____16;
-	public static String ASTInstructionCompiler_binding_null_for__17;
 
 	public static String ASTInstructionCompiler_super_constructor_invocation_cannot_be_used_in_an_evaluation_expression_19;
 	public static String ASTInstructionCompiler_Try_statement_cannot_be_used_in_an_evaluation_expression_23;
@@ -48,8 +47,12 @@
 	public static String ASTEvaluationEngine_AST_evaluation_engine_cannot_evaluate_expression;
 	public static String ASTEvaluationEngine_An_unknown_error_occurred_during_evaluation;
 	public static String ASTEvaluationEngine_Cannot_perform_nested_evaluations;
+	public static String ASTInstructionCompiler_3;
 	public static String ASTInstructionCompiler_36;
 	public static String ASTInstructionCompiler_0;
+	public static String ASTInstructionCompiler_1;
+	public static String ASTInstructionCompiler_2;
+	public static String ASTInstructionCompiler_5;
 
 	static {
 		// load message values from bundle file
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties
index e186512..648e82f 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/EvaluationEngineMessages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
+# Copyright (c) 2000, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -22,7 +22,6 @@
 
 ASTInstructionCompiler_unrecognized_postfix_operator____15=unrecognized postfix operator :
 ASTInstructionCompiler_unrecognized_prefix_operator____16=unrecognized prefix operator :
-ASTInstructionCompiler_binding_null_for__17=binding == null for
 
 ASTInstructionCompiler_super_constructor_invocation_cannot_be_used_in_an_evaluation_expression_19=super constructor invocation cannot be used in an evaluation expression
 ASTInstructionCompiler_Try_statement_cannot_be_used_in_an_evaluation_expression_23=Try statement cannot be used in an evaluation expression
@@ -43,8 +42,12 @@
 ASTEvaluationEngine_An_unknown_error_occurred_during_evaluation=An unknown error occurred during evaluation
 ASTEvaluationEngine_Cannot_perform_nested_evaluations=Cannot perform nested evaluations.
 
+ASTInstructionCompiler_3=Unable to resolve type binding for: {0}
 ASTInstructionCompiler_36=Local type field access cannot be used in an evaluation expression
 ASTInstructionCompiler_0=Enum declaration cannot be used in an evaluation expression
+ASTInstructionCompiler_1=Unable to resolve type binding of constructor: {0}
+ASTInstructionCompiler_2=Unable to resolve type binding of declaring type of: {0}
+ASTInstructionCompiler_5=Unable to resolve binding for: {0}
 ASTEvaluationEngine_0=Unable to evaluate expressions in the context of an interface
 ASTEvaluationEngine_1=Unable to retrieve type for java.lang.Object
 ArrayRuntimeContext_0=Unable to retrieve type for java.lang.Object
