diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
index 62dea73..cd84004 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
@@ -5163,8 +5163,8 @@
 	cu.codeComplete(cu.getSourceRange().getOffset() + cu.getSourceRange().getLength(), requestor);
 	assertEquals(
 		"should have two methods of 'foo'",
-		"element:foo    completion:foo()    relevance:"+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED + R_METHOD_OVERLOAD)+"\n" +
-		"element:foo    completion:foo()    relevance:"+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED + R_METHOD_OVERLOAD),
+		"element:foo    completion:foo()    relevance:"+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED)+"\n" +
+		"element:foo    completion:foo()    relevance:"+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED),
 		requestor.getResults());
 }
 /*
@@ -13323,32 +13323,9 @@
 	int tStart = str.lastIndexOf("xBar(1,") + "xBar(1,".length();
 	int tEnd = tStart;
 
-	assertResults("finalize[METHOD_REF]{CompletionPrefixMethodName3.this.finalize(), Ljava.lang.Object;, ()V, finalize, null, replace[150, 150], token[150, 150], 44}\n"
-			+ "notify[METHOD_REF]{CompletionPrefixMethodName3.this.notify(), Ljava.lang.Object;, ()V, notify, null, replace[150, 150], token[150, 150], 44}\n"
-			+ "notifyAll[METHOD_REF]{CompletionPrefixMethodName3.this.notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, replace[150, 150], token[150, 150], 44}\n"
-			+ "wait[METHOD_REF]{CompletionPrefixMethodName3.this.wait(), Ljava.lang.Object;, ()V, wait, null, replace[150, 150], token[150, 150], 44}\n"
-			+ "wait[METHOD_REF]{CompletionPrefixMethodName3.this.wait(), Ljava.lang.Object;, (J)V, wait, (millis), replace[150, 150], token[150, 150], 44}\n"
-			+ "wait[METHOD_REF]{CompletionPrefixMethodName3.this.wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), replace[150, 150], token[150, 150], 44}\n"
-			+ "finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, replace[150, 150], token[150, 150], 47}\n"
-			+ "foo[METHOD_REF]{foo(), LCompletionPrefixMethodName3$classFoo;, ()V, foo, null, replace[150, 150], token[150, 150], 47}\n"
-			+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, replace[150, 150], token[150, 150], 47}\n"
-			+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, replace[150, 150], token[150, 150], 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, replace[150, 150], token[150, 150], 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), replace[150, 150], token[150, 150], 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), replace[150, 150], token[150, 150], 47}\n"
-			+ "clone[METHOD_REF]{CompletionPrefixMethodName3.this.clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, replace[150, 150], token[150, 150], 49}\n"
-			+ "equals[METHOD_REF]{CompletionPrefixMethodName3.this.equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace[150, 150], token[150, 150], 49}\n"
-			+ "getClass[METHOD_REF]{CompletionPrefixMethodName3.this.getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, replace[150, 150], token[150, 150], 49}\n"
-			+ "toString[METHOD_REF]{CompletionPrefixMethodName3.this.toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, replace[150, 150], token[150, 150], 49}\n"
-			+ "CompletionPrefixMethodName3[TYPE_REF]{CompletionPrefixMethodName3, , LCompletionPrefixMethodName3;, null, null, replace[150, 150], token[150, 150], 52}\n"
-			+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, replace[150, 150], token[150, 150], 52}\n"
-			+ "equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace[150, 150], token[150, 150], 52}\n"
-			+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, replace[150, 150], token[150, 150], 52}\n"
-			+ "toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, replace[150, 150], token[150, 150], 52}\n"
-			+ "xBar[METHOD_REF]{CompletionPrefixMethodName3.this.xBar(1,, LCompletionPrefixMethodName3;, (II)I, xBar, (a, b), replace["+rStart1+", "+rEnd1+"], token["+tStart+", "+tEnd+"], "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME+ R_NON_RESTRICTED)+"}\n"
-			+ "xBar[METHOD_REF]{, LCompletionPrefixMethodName3$classFoo;, (II)I, xBar, (a, b), replace["+rStart2+", "+rEnd2+"], token["+tStart+", "+tEnd+"], "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED)+"}\n"
-			+ "hashCode[METHOD_REF]{CompletionPrefixMethodName3.this.hashCode(), Ljava.lang.Object;, ()I, hashCode, null, replace[150, 150], token[150, 150], 79}\n"
-			+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, replace[150, 150], token[150, 150], 82}",
+	assertResults(
+		"xBar[METHOD_REF]{CompletionPrefixMethodName3.this.xBar(1,, LCompletionPrefixMethodName3;, (II)I, xBar, (a, b), replace["+rStart1+", "+rEnd1+"], token["+tStart+", "+tEnd+"], "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME+ R_NON_RESTRICTED)+"}\n"+
+		"xBar[METHOD_REF]{, LCompletionPrefixMethodName3$classFoo;, (II)I, xBar, (a, b), replace["+rStart2+", "+rEnd2+"], token["+tStart+", "+tEnd+"], "+(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED)+"}",
 		requestor.getResults());
 }
 public void testCompletionQualifiedAllocationType1() throws JavaModelException {
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
index ec79b7b..90aad65 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
@@ -4670,7 +4670,7 @@
             "toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, "+normalRelevance+"}\n" +
             "List<java.lang.Long>[TYPE_REF]{List, java.util, Ljava.util.List<Ljava.lang.Long;>;, null, null, "+expectedTypeRelevance+"}\n" +
             "findAll[METHOD_REF]{findAll(), Ltest.TestApp;, ()Ljava.util.List<Ljava.lang.String;>;, findAll, null, "+expectedTypeRelevance+"}\n" +
-            "load[METHOD_REF]{, Ltest.TestApp;, (Ljava.util.List<Ljava.lang.Long;>;)Ljava.util.List<Ljava.lang.String;>;, load, (ids), 86}",
+            "load[METHOD_REF]{load(), Ltest.TestApp;, (Ljava.util.List<Ljava.lang.Long;>;)Ljava.util.List<Ljava.lang.String;>;, load, (ids), "+expectedTypeRelevance+"}",
     		requestor.getResults());
 }
 public void testBug539617_alloc() throws JavaModelException {
@@ -4711,8 +4711,8 @@
 	String completeBehind = "meth(";
 	int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
 	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-	int relevance =  R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED + R_METHOD_OVERLOAD;
-	int relevanceExpectedType = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE  + R_METHOD_OVERLOAD;
+	int relevance =  R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED;
+	int relevanceExpectedType = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_EXACT_NAME + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE;
 	assertResults(
 			"meth[METHOD_REF]{, LCodeCompletion;, (Ljava.lang.String;Z)Ljava.lang.Number;, meth, (arg, flag), "+relevance+"}\n" +
 			"meth[METHOD_REF]{, LCodeCompletion;, (Ljava.lang.String;)Ljava.lang.Double;, meth, (arg), "+relevanceExpectedType+"}",
@@ -5306,8 +5306,8 @@
     this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner, new NullProgressMonitor());
 
     String result = requestor.getResults();
-	assertTrue(String.format("Result doesn''t contain defaultParam method (%s)", result),
-    		result.contains("defaultParam[METHOD_REF]{, LBug573313;, (I)Ljava.util.concurrent.TimeUnit;, defaultParam, (amout), 118}"));
+	assertTrue(String.format("Result doesn''t contain enum literal SECONDS (%s)", result),
+    		result.contains("defaultParam[METHOD_REF]{, LBug573313;, (I)Ljava.util.concurrent.TimeUnit;, defaultParam, (amout), 86}"));
 
 }
 public void testBug573313_MethodParametersCompletions_InCompleteMessageSendOnMiddleParam_MethodCompletionsForType_2() throws JavaModelException {
@@ -5682,8 +5682,8 @@
 
     String result = requestor.getResults();
 	assertTrue(String.format("Result doesn't contain expected methods (%s)", result),
-    		result.contains("sorted[METHOD_REF]{, Ljava.util.stream.Stream<Ljava.lang.String;>;, ()Ljava.util.stream.Stream<Ljava.lang.String;>;, sorted, null, 88}\n"
-    				+ "sorted[METHOD_REF]{, Ljava.util.stream.Stream<Ljava.lang.String;>;, (Ljava.util.Comparator<-Ljava.lang.String;>;)Ljava.util.stream.Stream<Ljava.lang.String;>;, sorted, (arg0), 88}"));
+    		result.contains("sorted[METHOD_REF]{, Ljava.util.stream.Stream<Ljava.lang.String;>;, ()Ljava.util.stream.Stream<Ljava.lang.String;>;, sorted, null, 56}\n"
+    				+ "sorted[METHOD_REF]{, Ljava.util.stream.Stream<Ljava.lang.String;>;, (Ljava.util.Comparator<-Ljava.lang.String;>;)Ljava.util.stream.Stream<Ljava.lang.String;>;, sorted, (arg0), 56}"));
 }
 public void testBug563020_lambdaWithMethodRef_overloadedMethodref_expectCompletionForNextChainWithToken() throws JavaModelException {
 	this.workingCopies = new ICompilationUnit[1];
@@ -5948,11 +5948,7 @@
 	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
 	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
 	String result = requestor.getResults();
-	assertResults("LambdaFreeze2[TYPE_REF]{LambdaFreeze2, , LLambdaFreeze2;, null, null, 52}\n"
-			+ "SUPPLIER[FIELD_REF]{SUPPLIER, LLambdaFreeze2;, Ljava.util.function.Supplier<Ljava.util.Date;>;, SUPPLIER, null, 52}\n"
-			+ "calendar[LOCAL_VARIABLE_REF]{calendar, null, Ljava.util.Calendar;, calendar, null, 52}\n"
-			+ "num[FIELD_REF]{num, LLambdaFreeze2;, I, num, null, 82}\n"
-			+ "getMinimum[METHOD_REF]{, Ljava.util.Calendar;, (I)I, getMinimum, (arg0), 86}",
+	assertResults("getMinimum[METHOD_REF]{, Ljava.util.Calendar;, (I)I, getMinimum, (arg0), 86}",
 			result);
 }
 public void testBug574912_comment6b() throws JavaModelException {
@@ -6028,91 +6024,4 @@
 			"completion token location={STATEMENT_START}", // this is required for sysout template proposal
 			requestor.getContext());
 }
-public void testBug575149_expectOverloadedMethodsAndVariablesRankedWithExpectedType() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-	this.workingCopies[0] = getWorkingCopy(
-			"Completion/src/Bug443091.java",
-			"import java.util.function.Consumer;\n" +
-			"import java.util.function.Function;\n" +
-			"\n" +
-			"public class Bug443091 {\n" +
-			"	private void foo() {\n" +
-			" 		Consumer<Integer> capture = null;\n" +
-			"		forEach()" +
-			"	}\n" +
-			"	private void forEach(Consumer<Integer> in) {}\n" +
-			"	private void forEach(Function<Integer, String> in) {}\n" +
-			"}\n");
-
-	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-	requestor.allowAllRequiredProposals();
-	String str = this.workingCopies[0].getSource();
-	String completeBehind = "forEach(";
-	int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-	String result = requestor.getResults();
-	assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 47}\n"
-			+ "foo[METHOD_REF]{foo(), LBug443091;, ()V, foo, null, 47}\n"
-			+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 47}\n"
-			+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 47}\n"
-			+ "Bug443091[TYPE_REF]{Bug443091, , LBug443091;, null, null, 52}\n"
-			+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 52}\n"
-			+ "equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 52}\n"
-			+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<*>;, getClass, null, 52}\n"
-			+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 52}\n"
-			+ "toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 52}\n"
-			+ "Consumer<java.lang.Integer>[TYPE_REF]{Consumer, java.util.function, Ljava.util.function.Consumer<Ljava.lang.Integer;>;, null, null, 82}\n"
-			+ "Function<java.lang.Integer,java.lang.String>[TYPE_REF]{Function, java.util.function, Ljava.util.function.Function<Ljava.lang.Integer;Ljava.lang.String;>;, null, null, 82}\n"
-			+ "capture[LOCAL_VARIABLE_REF]{capture, null, Ljava.util.function.Consumer<Ljava.lang.Integer;>;, capture, null, 82}\n"
-			+ "forEach[METHOD_REF]{, LBug443091;, (Ljava.util.function.Consumer<Ljava.lang.Integer;>;)V, forEach, (in), 88}\n"
-			+ "forEach[METHOD_REF]{, LBug443091;, (Ljava.util.function.Function<Ljava.lang.Integer;Ljava.lang.String;>;)V, forEach, (in), 88}",
-			result);
-
-}
-public void testBug575149_expectRemainingOverloadedMethodsMatchingFilledArguments() throws JavaModelException {
-	this.workingCopies = new ICompilationUnit[1];
-	this.workingCopies[0] = getWorkingCopy(
-			"Completion/src/Bug443091.java",
-			"import java.util.function.Consumer;\n" +
-			"import java.util.function.Function;\n" +
-			"\n" +
-			"public class Bug443091 {\n" +
-			"	private void foo() {\n" +
-			" 		Consumer<Integer> capture = null;\n" +
-			"		forEach(capture, )" +
-			"	}\n" +
-			"	private void forEach(Consumer<Integer> in) {}\n" +
-			"	private void forEach(Consumer<Integer> in, Integer limit) {}\n" +
-			"}\n");
-
-	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-	requestor.allowAllRequiredProposals();
-	String str = this.workingCopies[0].getSource();
-	String completeBehind = "forEach(capture, ";
-	int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-	String result = requestor.getResults();
-	assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 47}\n"
-			+ "foo[METHOD_REF]{foo(), LBug443091;, ()V, foo, null, 47}\n"
-			+ "forEach[METHOD_REF]{forEach(), LBug443091;, (Ljava.util.function.Consumer<Ljava.lang.Integer;>;)V, forEach, (in), 47}\n"
-			+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 47}\n"
-			+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 47}\n"
-			+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 47}\n"
-			+ "Bug443091[TYPE_REF]{Bug443091, , LBug443091;, null, null, 52}\n"
-			+ "capture[LOCAL_VARIABLE_REF]{capture, null, Ljava.util.function.Consumer<Ljava.lang.Integer;>;, capture, null, 52}\n"
-			+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 52}\n"
-			+ "equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 52}\n"
-			+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<*>;, getClass, null, 52}\n"
-			+ "toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 52}\n"
-			+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 72}\n"
-			+ "Integer[TYPE_REF]{Integer, java.lang, Ljava.lang.Integer;, null, null, 82}\n"
-			+ "forEach[METHOD_REF]{, LBug443091;, (Ljava.util.function.Consumer<Ljava.lang.Integer;>;Ljava.lang.Integer;)V, forEach, (in, limit), 83}",
-			result);
-
-}
 }
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index 11a4ccc..0002480 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -844,9 +844,6 @@
 	private int foundConstructorsCount;
 	private ObjectVector acceptedConstructors;
 
-	// Introduce to disable Bug575149
-	private static final boolean DISABLE_OVERLOAD_EXPERIMENT = Boolean.parseBoolean(System.getProperty("org.eclipse.jdt.disableOverloadExperiment", "false")); //$NON-NLS-1$ //$NON-NLS-2$
-
 	/**
 	 * The CompletionEngine is responsible for computing source completions.
 	 *
@@ -1978,7 +1975,7 @@
 		} else if (astNode instanceof CompletionOnMethodReturnType) {
 			completionOnMethodReturnType(astNode, scope);
 		} else if (astNode instanceof CompletionOnSingleNameReference) {
-			completionOnSingleNameReference(astNode, astNodeParent, scope, insideTypeAnnotation, qualifiedBinding);
+			completionOnSingleNameReference(astNode, astNodeParent, scope, insideTypeAnnotation);
 		} else if (astNode instanceof CompletionOnProvidesInterfacesQualifiedTypeReference) {
 			completionOnProvidesInterfacesQualifiedTypeReference(astNode, astNodeParent, qualifiedBinding, scope);
 		} else if (astNode instanceof CompletionOnProvidesInterfacesSingleTypeReference) {
@@ -3187,9 +3184,9 @@
 		CompletionOnMessageSend messageSend = (CompletionOnMessageSend) astNode;
 		TypeBinding[] argTypes = computeTypes(messageSend.arguments);
 		this.completionToken = messageSend.selector;
-		ObjectVector methodsFound = new ObjectVector();
 		if (qualifiedBinding == null) {
 			if (!this.requestor.isIgnored(CompletionProposal.METHOD_REF)) {
+				ObjectVector methodsFound = new ObjectVector();
 
 				findImplicitMessageSends(this.completionToken, argTypes, scope, messageSend, scope, methodsFound);
 
@@ -3211,7 +3208,7 @@
 				argTypes,
 				(ReferenceBinding)((ReferenceBinding) qualifiedBinding).capture(scope, messageSend.receiver.sourceStart, messageSend.receiver.sourceEnd),
 				scope,
-				methodsFound,
+				new ObjectVector(),
 				false,
 				true,
 				messageSend,
@@ -3227,30 +3224,6 @@
 				-1,
 				-1);
 		}
-
-		if(this.assistNodeInJavadoc > 0 || DISABLE_OVERLOAD_EXPERIMENT) {
-			return;
-		}
-		// find completions for first parameters of matching overloaded methods.
-		CompletionOnSingleNameReference name = new CompletionOnSingleNameReference(new char[0], (((long)(messageSend.sourceEnd + 1)) << 32) + (messageSend.sourceEnd + 1), false);
-
-		MessageSend send = new MessageSend();
-		send.receiver = messageSend.receiver;
-		send.typeArguments = messageSend.typeArguments;
-		send.bits = messageSend.bits;
-		send.sourceStart = messageSend.sourceStart;
-		send.sourceEnd = messageSend.sourceEnd;
-		send.selector = messageSend.selector;
-		send.arguments = messageSend.arguments;
-		send.resolveType((BlockScope) scope);
-
-		computeExpectedTypes(send, name, scope);
-		if(this.expectedTypesPtr > -1) {
-			// rest of the completion logic must based on first argument completion with the following positions
-			this.startPosition = this.endPosition = name.sourceStart;
-			this.tokenStart = this.tokenEnd = name.sourceStart;
-			completionOnSingleNameReference(name, messageSend, scope, false, qualifiedBinding, methodsFound);
-		}
 	}
 
 	private void completionOnMessageSendName(ASTNode astNode, Binding qualifiedBinding, Scope scope) {
@@ -3801,11 +3774,7 @@
 	}
 
 	private void completionOnSingleNameReference(ASTNode astNode, ASTNode astNodeParent, Scope scope,
-			boolean insideTypeAnnotation, Binding qualifiedBinding) {
-		completionOnSingleNameReference(astNode, astNodeParent, scope, insideTypeAnnotation, qualifiedBinding, new ObjectVector());
-	}
-	private void completionOnSingleNameReference(ASTNode astNode, ASTNode astNodeParent, Scope scope,
-			boolean insideTypeAnnotation, Binding qualifiedBinding, ObjectVector methodsFound) {
+			boolean insideTypeAnnotation) {
 		CompletionOnSingleNameReference singleNameReference = (CompletionOnSingleNameReference) astNode;
 		this.completionToken = singleNameReference.token;
 		SwitchStatement switchStatement = astNodeParent instanceof SwitchStatement ? (SwitchStatement) astNodeParent : null;
@@ -3877,28 +3846,13 @@
 
 			checkCancel();
 
-			if(!DISABLE_OVERLOAD_EXPERIMENT && this.assistNodeInJavadoc == 0 && singleNameReference.token.length == 0
-					&& methodsFound.size() == 0	&& (astNodeParent instanceof MessageSend)) {
-				MessageSend message = (MessageSend) astNodeParent;
-
-				// find only overloads by performing a exact match
-				findMethods(message.selector, null, computeTypes(message.arguments),
-						(ReferenceBinding)((ReferenceBinding) message.actualReceiverType).capture(scope, message.receiver.sourceStart, message.receiver.sourceEnd),
-						scope, methodsFound, false, true, message, scope,
-						false, message.receiver instanceof SuperReference,
-						false,
-						null, null, null,
-						false, null,
-						-1, -1);
-			}
-
 			findVariablesAndMethods(
 				this.completionToken,
 				scope,
 				singleNameReference,
 				scope,
 				insideTypeAnnotation,
-				singleNameReference.isInsideAnnotationAttribute, methodsFound);
+				singleNameReference.isInsideAnnotationAttribute);
 
 			checkCancel();
 
@@ -4541,7 +4495,7 @@
 			}
 		}
 
-		if(this.expectedTypesPtr > -1 && this.expectedTypesPtr + 1 != this.expectedTypes.length) {
+		if(this.expectedTypesPtr + 1 != this.expectedTypes.length) {
 			System.arraycopy(this.expectedTypes, 0, this.expectedTypes = new TypeBinding[this.expectedTypesPtr + 1], 0, this.expectedTypesPtr + 1);
 		}
 	}
@@ -4593,6 +4547,9 @@
 		InvocationSite invocationSite,
 		boolean isStatic) {
 
+		if (arguments == null)
+			return;
+
 		MethodBinding[] methods = binding.availableMethods();
 		nextMethod : for (int i = 0; i < methods.length; i++) {
 			MethodBinding method = methods[i];
@@ -4610,30 +4567,24 @@
 			if(!CharOperation.equals(method.selector, selector)) continue nextMethod;
 
 			TypeBinding[] parameters = method.parameters;
-			if(method.parameters.length == 0) {
+			if(parameters.length < arguments.length)
 				continue nextMethod;
-			}
 
-			int completionArgIndex = 0;
-			if(arguments != null) {
-				if(parameters.length < arguments.length)
+			int length = arguments.length - 1;
+			int completionArgIndex = arguments.length - 1;
+
+			for (int j = 0; j < length; j++) {
+				Expression argument = arguments[j];
+				TypeBinding argType = argument.resolvedType;
+				if(argType != null && !argType.erasure().isCompatibleWith(parameters[j].erasure()))
 					continue nextMethod;
 
-				int length = arguments.length - 1;
-				completionArgIndex = arguments.length - 1;
-
-				for (int j = 0; j < length; j++) {
-					Expression argument = arguments[j];
-					TypeBinding argType = argument.resolvedType;
-					if(argType != null && !argType.erasure().isCompatibleWith(parameters[j].erasure()))
-						continue nextMethod;
-
-					if((argument.sourceStart >= this.startPosition)
-							&& (argument.sourceEnd <= this.endPosition)) {
-						completionArgIndex = j;
-					}
+				if((argument.sourceStart >= this.startPosition)
+						&& (argument.sourceEnd <= this.endPosition)) {
+					completionArgIndex = j;
 				}
 			}
+
 			TypeBinding expectedType = method.parameters[completionArgIndex];
 			if(expectedType != null) {
 				addExpectedType(expectedType, scope);
@@ -5026,14 +4977,6 @@
 		return 0;
 	}
 
-	private int computeRelevanceForOverload(MethodBinding method, char[] overloadSelector, boolean completingOverloadedMethod) {
-		if(!DISABLE_OVERLOAD_EXPERIMENT && CharOperation.equals(method.selector, overloadSelector) && completingOverloadedMethod) {
-			return R_METHOD_OVERLOAD;
-		}
-		return 0;
-	}
-
-
 	private long computeTargetedElement(CompletionOnAnnotationOfType fakeNode) {
 		ASTNode annotatedElement = fakeNode.potentialAnnotatedNode;
 
@@ -9245,22 +9188,6 @@
 		int minTypeArgLength = typeArgTypes == null ? 0 : typeArgTypes.length;
 		int minArgLength = argTypes == null ? 0 : argTypes.length;
 
-		// find if the current method in search is an overloaded method.
-		int sameNameCount = 0;
-		boolean currentMethodIsOverloaded = false;
-		if(this.assistNodeInJavadoc == 0) {
-			for (MethodBinding methodBinding : methods) {
-				if(CharOperation.equals(methodName, methodBinding.selector) &&
-						TypeBinding.equalsEquals(receiverType, methodBinding.declaringClass)) {
-					sameNameCount++;
-					if(sameNameCount == 2) {
-						currentMethodIsOverloaded = true;
-						break;
-					}
-				}
-			}
-		}
-
 		next : for (int f = methods.length; --f >= 0;) {
 			MethodBinding method = methods[f];
 
@@ -9470,7 +9397,6 @@
 				relevance += computeRelevanceForMissingElements(missingElementsHaveProblems);
 			}
 			relevance += computeRelevanceForSuper(method, scope, invocationSite);
-			relevance += computeRelevanceForOverload(method, methodName, currentMethodIsOverloaded);
 			this.noProposal = false;
 
 			if (castedReceiver == null) {
@@ -12713,25 +12639,13 @@
 		}
 
 	}
-
-	private void findVariablesAndMethods(
-			char[] token,
-			Scope scope,
-			InvocationSite invocationSite,
-			Scope invocationScope,
-			boolean insideTypeAnnotation,
-			boolean insideAnnotationAttribute) {
-		findVariablesAndMethods(token, scope, invocationSite, invocationScope, insideTypeAnnotation,
-				insideAnnotationAttribute, new ObjectVector());
-	}
-
 	private void findVariablesAndMethods(
 		char[] token,
 		Scope scope,
 		InvocationSite invocationSite,
 		Scope invocationScope,
 		boolean insideTypeAnnotation,
-		boolean insideAnnotationAttribute, ObjectVector methodsFound) {
+		boolean insideAnnotationAttribute) {
 
 		if (token == null)
 			return;
@@ -12745,6 +12659,7 @@
 
 		ObjectVector localsFound = new ObjectVector();
 		ObjectVector fieldsFound = new ObjectVector();
+		ObjectVector methodsFound = new ObjectVector();
 
 		Scope currentScope = scope;
 
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java
index f412bfd..6e43a84 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java
@@ -61,5 +61,4 @@
 	int R_FINAL = 3; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346
 	int R_CONSTRUCTOR = 3; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=373409
 	int R_MODULE_DECLARATION = 31;
-	int R_METHOD_OVERLOAD = 32;
 }
