diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RArgumentMatchingTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RArgumentMatchingTest.java
index f8c65bb..7d4ec79 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RArgumentMatchingTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RArgumentMatchingTest.java
@@ -144,155 +144,180 @@
 	
 	
 	@Test
-	public void PipeContext_match_simple() {
+	public void PipeTarget_match_simple() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "c");
 		
-		assertArgsPipeTarget(argsDef, "1, 2",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "b=1, c=2",		newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "a=1, 2",			newIntList(1, 0, 2));
-		assertArgsPipeTarget(argsDef, "1, a=2",			newIntList(1, 2, 0));
-		assertArgsPipeTarget(argsDef, "1, b=2",			newIntList(0, 2, 1));
-		assertArgsPipeTarget(argsDef, "b=1, 2",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "c=1, 2",			newIntList(0, 2, 1));
-		assertArgsPipeTarget(argsDef, "a=1, b=2",		newIntList(2, 0, 1));
-		assertArgsPipeTarget(argsDef, "b=1, a=2",		newIntList(2, 1, 0));
-		assertArgsPipeTarget(argsDef, "c=1, b=2",		newIntList(0, 2, 1));
+		assertArgs_PipeTarget(argsDef, "1, 2",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "b=1, c=2",		newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "a=1, 2",		newIntList(1, 0, 2));
+		assertArgs_PipeTarget(argsDef, "1, a=2",		newIntList(1, 2, 0));
+		assertArgs_PipeTarget(argsDef, "1, b=2",		newIntList(0, 2, 1));
+		assertArgs_PipeTarget(argsDef, "b=1, 2",		newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "c=1, 2",		newIntList(0, 2, 1));
+		assertArgs_PipeTarget(argsDef, "a=1, b=2",		newIntList(2, 0, 1));
+		assertArgs_PipeTarget(argsDef, "b=1, a=2",		newIntList(2, 1, 0));
+		assertArgs_PipeTarget(argsDef, "c=1, b=2",		newIntList(0, 2, 1));
 	}
 	
 	@Test
-	public void PipeContext_match_lessThanDef() {
+	public void PipeTarget_match_lessThanDef() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "c");
 		
-		assertArgsPipeTarget(argsDef, "1",				newIntList(0, 1));
-		assertArgsPipeTarget(argsDef, "b=1",			newIntList(0, 1));
-		assertArgsPipeTarget(argsDef, "a=1",			newIntList(1, 0));
-		assertArgsPipeTarget(argsDef, "c=1",			newIntList(0, 2));
+		assertArgs_PipeTarget(argsDef, "1",				newIntList(0, 1));
+		assertArgs_PipeTarget(argsDef, "b=1",			newIntList(0, 1));
+		assertArgs_PipeTarget(argsDef, "a=1",			newIntList(1, 0));
+		assertArgs_PipeTarget(argsDef, "c=1",			newIntList(0, 2));
 	}
 	
 	@Test
-	public void PipeContext_match_emptyArg1() {
+	public void PipeTarget_match_emptyArg1() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "c");
 		
-		assertArgsPipeTarget(argsDef, ", 2",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "b=, 2",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "a=, 2",			newIntList(1, 0, 2));
-		assertArgsPipeTarget(argsDef, ", a=2",			newIntList(1, 2, 0));
-		assertArgsPipeTarget(argsDef, "c=, 2",			newIntList(0, 2, 1));
-		assertArgsPipeTarget(argsDef, "a=, b=2",		newIntList(2, 0, 1));
-		assertArgsPipeTarget(argsDef, "b=, a=2",		newIntList(2, 1, 0));
+		assertArgs_PipeTarget(argsDef, ", 2",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "b=, 2",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "a=, 2",			newIntList(1, 0, 2));
+		assertArgs_PipeTarget(argsDef, ", a=2",			newIntList(1, 2, 0));
+		assertArgs_PipeTarget(argsDef, "c=, 2",			newIntList(0, 2, 1));
+		assertArgs_PipeTarget(argsDef, "a=, b=2",		newIntList(2, 0, 1));
+		assertArgs_PipeTarget(argsDef, "b=, a=2",		newIntList(2, 1, 0));
 	}
 	
 	@Test
-	public void PipeContext_match_emptyArg2() {
+	public void PipeTarget_match_emptyArg2() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "c");
 		
-		assertArgsPipeTarget(argsDef, "1, ",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "b=1, ",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "a=1, ",			newIntList(1, 0, 2));
-		assertArgsPipeTarget(argsDef, "1, a=",			newIntList(1, 2, 0));
-		assertArgsPipeTarget(argsDef, "b=1, ",			newIntList(0, 1, 2));
-		assertArgsPipeTarget(argsDef, "c=1, ",			newIntList(0, 2, 1));
-		assertArgsPipeTarget(argsDef, "a=1, b=",		newIntList(2, 0, 1));
-		assertArgsPipeTarget(argsDef, "b=1, a=",		newIntList(2, 1, 0));
-		assertArgsPipeTarget(argsDef, "c=1, a=",		newIntList(1, 2, 0));
+		assertArgs_PipeTarget(argsDef, "1, ",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "b=1, ",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "a=1, ",			newIntList(1, 0, 2));
+		assertArgs_PipeTarget(argsDef, "1, a=",			newIntList(1, 2, 0));
+		assertArgs_PipeTarget(argsDef, "b=1, ",			newIntList(0, 1, 2));
+		assertArgs_PipeTarget(argsDef, "c=1, ",			newIntList(0, 2, 1));
+		assertArgs_PipeTarget(argsDef, "a=1, b=",		newIntList(2, 0, 1));
+		assertArgs_PipeTarget(argsDef, "b=1, a=",		newIntList(2, 1, 0));
+		assertArgs_PipeTarget(argsDef, "c=1, a=",		newIntList(1, 2, 0));
 	}
 	
 	@Test
-	public void PipeContext_match_partialMatch() {
+	public void PipeTarget_match_partialMatch() {
 		final ArgsDefinition argsDef = new ArgsDefinition("aaa", "bbb", "bb", "c");
 		
-		assertArgsPipeTarget(argsDef, "bbb=1, b=2, 3",	newIntList(0, 1, 2, 3));
-		assertArgsPipeTarget(argsDef, "bbb=1, b=2, b=3", newIntList(0, 1, 2, -1));
-		assertArgsPipeTarget(argsDef, "b=1, b=2, bbb=3", newIntList(0, 2, -1, 1));
-		assertArgsPipeTarget(argsDef, "b=1, 2",			newIntList(0, -1, 1));
-		assertArgsPipeTarget(argsDef, "a=1, 2",			newIntList(1, 0, 2));
-		assertArgsPipeTarget(argsDef, "a=1, b=2",		newIntList(1, 0, -1));
+		assertArgs_PipeTarget(argsDef, "bbb=1, b=2, 3",	newIntList(0, 1, 2, 3));
+		assertArgs_PipeTarget(argsDef, "bbb=1, b=2, b=3", newIntList(0, 1, 2, -1));
+		assertArgs_PipeTarget(argsDef, "b=1, b=2, bbb=3", newIntList(0, 2, -1, 1));
+		assertArgs_PipeTarget(argsDef, "b=1, 2",		newIntList(0, -1, 1));
+		assertArgs_PipeTarget(argsDef, "a=1, 2",		newIntList(1, 0, 2));
+		assertArgs_PipeTarget(argsDef, "a=1, b=2",		newIntList(1, 0, -1));
 	}
 	
 	@Test
-	public void PipeContext_match_ellipsisAtEnd() {
+	public void PipeTarget_match_ellipsisAtEnd() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "...");
 		
-		assertArgsPipeTarget(argsDef, "a=1, b=2, 3",	newIntList(2, 0, 1, 2),	newIntList(E, D, D, E));
-		assertArgsPipeTarget(argsDef, "a=1, b=2, 3, 4",	newIntList(2, 0, 1, 2, 2), newIntList(E, D, D, E, E));
-		assertArgsPipeTarget(argsDef, "a=1, 2, 3",		newIntList(1, 0, 2, 2),	newIntList(D, D, E, E));
-		assertArgsPipeTarget(argsDef, "1, b=2, 3",		newIntList(0, 2, 1, 2),	newIntList(D, E, D, E));
-		assertArgsPipeTarget(argsDef, "",				newIntList(0),			newIntList(D));
-		assertArgsPipeTarget(argsDef, "a=1",			newIntList(1, 0),		newIntList(D, D));
-		assertArgsPipeTarget(argsDef, "x=1, y=2",		newIntList(0, 2, 2),	newIntList(D, E, E));
+		assertArgs_PipeTarget(argsDef, "a=1, b=2, 3",	newIntList(2, 0, 1, 2),	newIntList(E, D, D, E));
+		assertArgs_PipeTarget(argsDef, "a=1, b=2, 3, 4", newIntList(2, 0, 1, 2, 2), newIntList(E, D, D, E, E));
+		assertArgs_PipeTarget(argsDef, "a=1, 2, 3",		newIntList(1, 0, 2, 2),	newIntList(D, D, E, E));
+		assertArgs_PipeTarget(argsDef, "1, b=2, 3",		newIntList(0, 2, 1, 2),	newIntList(D, E, D, E));
+		assertArgs_PipeTarget(argsDef, "",				newIntList(0),			newIntList(D));
+		assertArgs_PipeTarget(argsDef, "a=1",			newIntList(1, 0),		newIntList(D, D));
+		assertArgs_PipeTarget(argsDef, "x=1, y=2",		newIntList(0, 2, 2),	newIntList(D, E, E));
 	}
 	
 	
 	@Test
-	public void AssignContext_match_simple() {
+	public void ReplCall_match_simple() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "value", "b");
 		
-		assertArgsAssign(argsDef, "1, 2",				newIntList(0, 2));
-		assertArgsAssign(argsDef, "a=1, 2",				newIntList(0, 2));
-		assertArgsAssign(argsDef, "1, a=2",				newIntList(2, 0));
-		assertArgsAssign(argsDef, "b=1, 2",				newIntList(0, 2));
-		assertArgsAssign(argsDef, "a=1, b=2",			newIntList(0, 2));
-		assertArgsAssign(argsDef, "b=1, a=2",			newIntList(2, 0));
+		assertArgs_ReplCall(argsDef, "1, 2",			newIntList(0, 2));
+		assertArgs_ReplCall(argsDef, "a=1, 2",			newIntList(0, 2));
+		assertArgs_ReplCall(argsDef, "1, a=2",			newIntList(2, 0));
+		assertArgs_ReplCall(argsDef, "b=1, 2",			newIntList(0, 2));
+		assertArgs_ReplCall(argsDef, "a=1, b=2",		newIntList(0, 2));
+		assertArgs_ReplCall(argsDef, "b=1, a=2",		newIntList(2, 0));
 	}
 	
 	@Test
-	public void AssignContext_match_lessThanDef() {
+	public void ReplCall_match_noValueArg() {
+		final ArgsDefinition argsDef = new ArgsDefinition("a", "b");
+		
+		assertArgs_ReplCall(argsDef, "1, 2",			newIntList(0, 1), N);
+		assertArgs_ReplCall(argsDef, "a=1, 2",			newIntList(0, 1), N);
+		assertArgs_ReplCall(argsDef, "1, a=2",			newIntList(1, 0), N);
+		assertArgs_ReplCall(argsDef, "b=1, 2",			newIntList(0, 1), N);
+		assertArgs_ReplCall(argsDef, "a=1, b=2",		newIntList(0, 1), N);
+		assertArgs_ReplCall(argsDef, "b=1, a=2",		newIntList(1, 0), N);
+	}
+	
+	@Test
+	public void ReplCall_match_lessThanDef() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "value");
 		
-		assertArgsAssign(argsDef, "1",					newIntList(0));
-		assertArgsAssign(argsDef, "a=1",				newIntList(0));
-		assertArgsAssign(argsDef, "b=2",				newIntList(0));
+		assertArgs_ReplCall(argsDef, "1",				newIntList(0));
+		assertArgs_ReplCall(argsDef, "a=1",				newIntList(0));
+		assertArgs_ReplCall(argsDef, "b=2",				newIntList(0));
 	}
 	
 	@Test
-	public void AssignContext_match_moreThanDef() {
+	public void ReplCall_match_moreThanDef() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "value");
 		
-		assertArgsAssign(argsDef, "1, 2",				newIntList(0, -1),		newIntList(D, N));
+		assertArgs_ReplCall(argsDef, "1, 2",			newIntList(0, -1),		newIntList(D, N));
 	}
 	
 	@Test
-	public void AssignContext_match_emptyArg1() {
+	public void ReplCall_match_emptyArg1() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "value");
 		
-		assertArgsAssign(argsDef, ", 2",				newIntList(0, 1));
-		assertArgsAssign(argsDef, "a=, 2",				newIntList(0, 1));
-		assertArgsAssign(argsDef, ", a=2",				newIntList(1, 0));
-		assertArgsAssign(argsDef, "b=, 2",				newIntList(0, 1));
-		assertArgsAssign(argsDef, "a=, b=2",			newIntList(0, 1));
-		assertArgsAssign(argsDef, "b=, a=2",			newIntList(1, 0));
+		assertArgs_ReplCall(argsDef, ", 2",				newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "a=, 2",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, ", a=2",			newIntList(1, 0));
+		assertArgs_ReplCall(argsDef, "b=, 2",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "a=, b=2",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "b=, a=2",			newIntList(1, 0));
 	}
 	
 	@Test
-	public void AssignContext_match_emptyArg2() {
+	public void ReplCall_match_emptyArg2() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "value");
 		
-		assertArgsAssign(argsDef, "1, ",				newIntList(0, 1));
-		assertArgsAssign(argsDef, "a=1, ",				newIntList(0, 1));
-		assertArgsAssign(argsDef, "1, a=",				newIntList(1, 0));
-		assertArgsAssign(argsDef, "b=1, ",				newIntList(0, 1));
-		assertArgsAssign(argsDef, "a=1, b=",			newIntList(0, 1));
-		assertArgsAssign(argsDef, "b=1, a=",			newIntList(1, 0));
+		assertArgs_ReplCall(argsDef, "1, ",				newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "a=1, ",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "1, a=",			newIntList(1, 0));
+		assertArgs_ReplCall(argsDef, "b=1, ",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "a=1, b=",			newIntList(0, 1));
+		assertArgs_ReplCall(argsDef, "b=1, a=",			newIntList(1, 0));
 	}
 	
 	@Test
-	public void AssignContext_match_partialMatch() {
+	public void ReplCall_match_partialMatch() {
 		final ArgsDefinition argsDef = new ArgsDefinition("aaa", "a", "value", "b");
 		
-		assertArgsAssign(argsDef, "a=1, aa=2, 3",	newIntList(1, 0, 3));
+		assertArgs_ReplCall(argsDef, "a=1, aa=2, 3",	newIntList(1, 0, 3));
 	}
 	
 	@Test
-	public void AssignContext_match_ellipsisAtEnd() {
+	public void ReplCall_match_ellipsisAtEnd() {
 		final ArgsDefinition argsDef = new ArgsDefinition("a", "value", "b", "...");
 		
-		assertArgsAssign(argsDef, "a=1, b=2, 3",		newIntList(0, 2, 3),	newIntList(D, D, E));
-		assertArgsAssign(argsDef, "a=1, b=2, 3, 4",		newIntList(0, 2, 3, 3), newIntList(D, D, E, E));
-		assertArgsAssign(argsDef, "a=1, 2, 3",			newIntList(0, 2, 3),	newIntList(D, D, E));
-		assertArgsAssign(argsDef, "1, b=2, 3",			newIntList(0, 2, 3), 	newIntList(D, D, E));
-		assertArgsAssign(argsDef, "",					newIntList(),			newIntList());
-		assertArgsAssign(argsDef, "a=1",				newIntList(0),			newIntList(D));
-		assertArgsAssign(argsDef, "x=1, y=2",			newIntList(0, 3),		newIntList(D, E));
+		assertArgs_ReplCall(argsDef, "a=1, b=2, 3",		newIntList(0, 2, 3),	newIntList(D, D, E));
+		assertArgs_ReplCall(argsDef, "a=1, b=2, 3, 4",	newIntList(0, 2, 3, 3), newIntList(D, D, E, E));
+		assertArgs_ReplCall(argsDef, "a=1, 2, 3",		newIntList(0, 2, 3),	newIntList(D, D, E));
+		assertArgs_ReplCall(argsDef, "1, b=2, 3",		newIntList(0, 2, 3), 	newIntList(D, D, E));
+		assertArgs_ReplCall(argsDef, "",				newIntList(),			newIntList());
+		assertArgs_ReplCall(argsDef, "a=1",				newIntList(0),			newIntList(D));
+		assertArgs_ReplCall(argsDef, "x=1, y=2",		newIntList(0, 3),		newIntList(D, E));
+	}
+	
+	@Test
+	public void ReplCall_match_ellipsisAtEnd_noValueArg() {
+		final ArgsDefinition argsDef = new ArgsDefinition("a", "b", "...");
+		
+		assertArgs_ReplCall(argsDef, "a=1, b=2, 3",		newIntList(0, 1, 2),	newIntList(D, D, E), E);
+		assertArgs_ReplCall(argsDef, "a=1, b=2, 3, 4",	newIntList(0, 1, 2, 2), newIntList(D, D, E, E), E);
+		assertArgs_ReplCall(argsDef, "a=1, 2, 3",		newIntList(0, 1, 2),	newIntList(D, D, E), E);
+		assertArgs_ReplCall(argsDef, "1, b=2, 3",		newIntList(0, 1, 2), 	newIntList(D, D, E), E);
+		assertArgs_ReplCall(argsDef, "",				newIntList(),			newIntList(), E);
+		assertArgs_ReplCall(argsDef, "a=1",				newIntList(0),			newIntList(D), E);
+		assertArgs_ReplCall(argsDef, "x=1, y=2",		newIntList(0, 2),		newIntList(D, E), E);
 	}
 	
 	
@@ -301,16 +326,16 @@
 		final ArgsDefinition argsDef= new ArgsDefinition("a", "b", "...");
 		final ArgsDefinition argsAssignDef = new ArgsDefinition("a", "b", "value", "...");
 		
-		assertArgs(argsDef, (FCall)parseExpr("f(c= 3, 1)"), newIntList(2, 0));
-		assertArgs(argsDef, (FCall)parseExpr("x <- f(c= 3, 1)").getChild(1), newIntList(2, 0));
+		assertArgs_AutoContext(argsDef, (FCall)parseExpr("f(c= 3, 1)"), newIntList(2, 0));
+		assertArgs_AutoContext(argsDef, (FCall)parseExpr("x <- f(c= 3, 1)").getChild(1), newIntList(2, 0));
 		
-		assertArgs(argsDef, (FCall)parseExpr("0 |> f(c= 3, 1)").getChild(1), newIntList(0, 2, 1));
-		assertArgs(argsDef, (FCall)parseExpr("0 |> (\\(a, b, ...){})(c= 3, 1)").getChild(1), newIntList(0, 2, 1));
+		assertArgs_AutoContext(argsDef, (FCall)parseExpr("0 |> f(c= 3, 1)").getChild(1), newIntList(0, 2, 1));
+		assertArgs_AutoContext(argsDef, (FCall)parseExpr("0 |> (\\(a, b, ...){})(c= 3, 1)").getChild(1), newIntList(0, 2, 1));
 		
-		assertArgs(argsDef, (FCall)parseExpr("f(x, c= 3, 1) <- 1").getChild(0), newIntList(0, 2, 1));
-		assertArgs(argsAssignDef, (FCall)parseExpr("f(x, c= 3, 1) <- 1").getChild(0), newIntList(0, 3, 1));
-		assertArgs(argsAssignDef, (FCall)parseExpr("f(x, c= 3, 1) = 1").getChild(0), newIntList(0, 3, 1));
-		assertArgs(argsAssignDef, (FCall)parseExpr("1 -> f(x, c= 3, 1)").getChild(1), newIntList(0, 3, 1));
+		assertArgs_AutoContext(argsDef, (FCall)parseExpr("f(x, c= 3, 1) <- 1").getChild(0), newIntList(0, 2, 1));
+		assertArgs_AutoContext(argsAssignDef, (FCall)parseExpr("f(x, c= 3, 1) <- 1").getChild(0), newIntList(0, 3, 1));
+		assertArgs_AutoContext(argsAssignDef, (FCall)parseExpr("f(x, c= 3, 1) = 1").getChild(0), newIntList(0, 3, 1));
+		assertArgs_AutoContext(argsAssignDef, (FCall)parseExpr("1 -> f(x, c= 3, 1)").getChild(1), newIntList(0, 3, 1));
 	}
 	
 	
@@ -414,7 +439,7 @@
 		assertArgs(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs));
 	}
 	
-	private void assertArgsPipeTarget(final ArgsDefinition argsDef, final String code,
+	private void assertArgs_PipeTarget(final ArgsDefinition argsDef, final String code,
 			final ImIntList expectedDefIdxs, final ImIntList expectedMatchTypes) {
 		final FCall.Args callArgs= parseArgs(code);
 		final RAstNode sourceNode= new NumberConst(RTerminal.NUM_INT);
@@ -538,17 +563,17 @@
 		assertNull(matchedArgs.getArgValueNode(-1));
 	}
 	
-	private void assertArgsPipeTarget(final ArgsDefinition argsDef, final String code,
+	private void assertArgs_PipeTarget(final ArgsDefinition argsDef, final String code,
 			final ImIntList expectedDefIdxs) {
-		assertArgsPipeTarget(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs));
+		assertArgs_PipeTarget(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs));
 	}
 	
-	private void assertArgsAssign(final ArgsDefinition argsDef, final String code,
-			final ImIntList expectedDefIdxs, final ImIntList expectedMatchTypes) {
+	private void assertArgs_ReplCall(final ArgsDefinition argsDef, final String code,
+			final ImIntList expectedDefIdxs, final ImIntList expectedMatchTypes, final int expectedValueType) {
 		final FCall.Args callArgs= parseArgs(code);
-		final RAstNode sourceNode= new NumberConst(RTerminal.NUM_INT);
+		final RAstNode replValueNode= new NumberConst(RTerminal.NUM_INT);
 		final FCallArgMatch matchedArgs= RAsts.matchArgs(callArgs, argsDef,
-				sourceNode, ImCollections.emptyList() );
+				replValueNode, ImCollections.emptyList() );
 		final int valueDefIdx= argsDef.indexOf("value");
 		
 		assertEquals(argsDef, matchedArgs.getArgsDefinition());
@@ -588,12 +613,20 @@
 				}
 			}
 		}
+		switch (expectedValueType) {
+		case E:
+			ellipsisCount++;
+			break;
+		case N:
+			nonmatchingCount++;
+			break;
+		}
 		
 		assertNull(matchedArgs.getArgDefinitionForInject(-1));
 		assertNull(matchedArgs.getArgDefinitionForFCall(-1));
 		
-		assertEquals(ellipsisCount, matchedArgs.ellipsisArgs.length);
-		assertEquals(nonmatchingCount, matchedArgs.otherArgs.length);
+		assertEquals(ellipsisCount, matchedArgs.ellipsisArgs.length, "ellipsisCount");
+		assertEquals(nonmatchingCount, matchedArgs.otherArgs.length, "failCount");
 		
 		// methods by defArgIdx
 		for (int defArgIdx= 0; defArgIdx < argsDef.size(); defArgIdx++) {
@@ -615,7 +648,7 @@
 				}
 			}
 			else if (defArgIdx == valueDefIdx) {
-				assertEquals(sourceNode, matchedArgs.getArgValueNode(defArgIdx));
+				assertEquals(replValueNode, matchedArgs.getArgValueNode(defArgIdx));
 			}
 			else {
 				assertNull(matchedArgs.getArgNode(defArgIdx));
@@ -623,16 +656,37 @@
 			}
 		}
 		
+		switch (expectedValueType) {
+		case E:
+			assertEquals(replValueNode, matchedArgs.ellipsisArgs[ellipsisCount - 1].getValueChild());
+			break;
+		case N:
+			assertEquals(replValueNode, matchedArgs.otherArgs[nonmatchingCount - 1].getValueChild());
+			break;
+		default:
+			break;
+		}
+		
 		assertNull(matchedArgs.getArgNode(-1));
 		assertNull(matchedArgs.getArgValueNode(-1));
 	}
 	
-	private void assertArgsAssign(final ArgsDefinition argsDef, final String code,
-			final ImIntList expectedDefIdxs) {
-		assertArgsAssign(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs));
+	private void assertArgs_ReplCall(final ArgsDefinition argsDef, final String code,
+			final ImIntList expectedDefIdxs, final ImIntList expectedMatchTypes) {
+		assertArgs_ReplCall(argsDef, code, expectedDefIdxs, expectedMatchTypes, D);
 	}
 	
-	private void assertArgs(final ArgsDefinition argsDef, final FCall fCallNode,
+	private void assertArgs_ReplCall(final ArgsDefinition argsDef, final String code,
+			final ImIntList expectedDefIdxs, final int expectedValueType) {
+		assertArgs_ReplCall(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs), expectedValueType);
+	}
+	
+	private void assertArgs_ReplCall(final ArgsDefinition argsDef, final String code,
+			final ImIntList expectedDefIdxs) {
+		assertArgs_ReplCall(argsDef, code, expectedDefIdxs, createMatchTypes(expectedDefIdxs), D);
+	}
+	
+	private void assertArgs_AutoContext(final ArgsDefinition argsDef, final FCall fCallNode,
 			final ImIntList expectedDefIdxs) {
 		final FCallArgMatch matchedArgs= RAsts.matchArgs(fCallNode, argsDef);
 		
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
index b09295e..d71a769 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
@@ -523,13 +523,14 @@
 	private static final int ELLIPSIS= -2;
 	private static final int TEST_PARTIAL= -3;
 	private static final int TEST_POSITION= -4;
+	private static final int NA= -5;
 		
 	/**
 	 * Reads the arguments of a function call for the given function definition
 	 * 
 	 * If follows mainly the R rules expect if R would fail.
 	 * 
-	 * 1) Exact matching on tags. 
+	 * 1) Exact matching on tags.
 	 *    a) First supplied named argument matching exactly a formal name
 	 *       is assigned to its formal arguments (position) in <code>argsNode</code>
 	 *    b) Additional supplied arguments matching exactly the formal name
@@ -554,14 +555,15 @@
 	 * 
 	 * @param fCallArgs the arguments of the function call
 	 * @param argsDefinition the arguments definition
-	 * @param inject0Args the injected arguments inserted at index 0
+	 * @param replValueArg the value node of the 'value' argument of a replacement function
+	 * @param inject0Args the value nodes of injected arguments inserted at index 0
 	 * @return the match
 	 */
 	public static FCallArgMatch matchArgs(final FCall.Args fCallArgs,
 			final ArgsDefinition argsDefinition,
-			final @Nullable RAstNode assignmentValueArg,
+			final @Nullable RAstNode replValueArg,
 			final ImList<? extends @Nullable RAstNode> inject0Args) {
-		if (assignmentValueArg != null && !inject0Args.isEmpty()) {
+		if (replValueArg != null && !inject0Args.isEmpty()) {
 			throw new IllegalArgumentException();
 		}
 		final int fCallArgStartIdx= inject0Args.size();
@@ -570,15 +572,30 @@
 		final FCall. @Nullable Arg[] allocatedArgs= (defArgsCount > 0) ?
 				new FCall. @Nullable Arg[defArgsCount] : Nullable_NO_ARGS;
 		final int ellipsisDefIdx= argsDefinition.indexOf("..."); //$NON-NLS-1$
-		final int assignmentValueDefIdx= (assignmentValueArg != null) ? argsDefinition.indexOf("value") : -1; //$NON-NLS-1$
+		final int replValueDefIdx= (replValueArg != null) ? argsDefinition.indexOf("value") : -1; //$NON-NLS-1$
 		
 		final int[] argsNode2argsDef= new int[nodeArgsCount];
+		int replValue2ArgsDef;
 		int ellipsisCount= 0;
 		int failCount= 0;
 		boolean testPartial= false;
 		
-		if (assignmentValueDefIdx > 0) {
-			allocatedArgs[assignmentValueDefIdx]= createInjectArg(fCallArgs, assignmentValueArg);
+		if (replValueArg != null) {
+			if (replValueDefIdx > 0) {
+				allocatedArgs[replValueDefIdx]= createInjectArg(fCallArgs, replValueArg);
+				replValue2ArgsDef= replValueDefIdx;
+			}
+			else if (replValueDefIdx == 0) {
+				replValue2ArgsDef= FAIL;
+				failCount++;
+			}
+			else {
+				replValue2ArgsDef= ELLIPSIS;
+				ellipsisCount++;
+			}
+		}
+		else {
+			replValue2ArgsDef= NA;
 		}
 		for (int nodeIdx= 0; nodeIdx < fCallArgStartIdx; nodeIdx++) {
 			argsNode2argsDef[nodeIdx]= TEST_POSITION;
@@ -654,7 +671,8 @@
 			}
 		}
 		
-		if (assignmentValueDefIdx > 0 && allocatedArgs[0] == null && nodeArgsCount > 0) {
+		if (replValueArg != null && replValueDefIdx != 0
+				&& allocatedArgs[0] == null && nodeArgsCount > 0) {
 			switch (argsNode2argsDef[0]) {
 			case FAIL:
 				break;
@@ -704,6 +722,9 @@
 					argsNode2argsDef[nodeIdx]= FAIL;
 				}
 			}
+			if (replValue2ArgsDef == ELLIPSIS) {
+				replValue2ArgsDef= FAIL;
+			}
 			failCount+= ellipsisCount;
 			ellipsisCount= 0;
 		}
@@ -727,6 +748,16 @@
 					continue ITER_ARGS;
 				}
 			}
+			switch (replValue2ArgsDef) {
+			case ELLIPSIS:
+				ellipsisArgs[ellipsisIdx++]= createInjectArg(fCallArgs, replValueArg);
+				break;
+			case FAIL:
+				otherArgs[otherIdx++]= createInjectArg(fCallArgs, replValueArg);
+				break;
+			default:
+				break;
+			}
 		}
 		return new FCallArgMatch(argsDefinition, fCallArgs, fCallArgStartIdx,
 				allocatedArgs, ellipsisArgs, otherArgs,
@@ -742,7 +773,7 @@
 	}
 	
 	public static FCallArgMatch matchArgs(final FCall fCallNode, final ArgsDefinition argsDef) {
-		@Nullable RAstNode assignmentValueArg= null;
+		@Nullable RAstNode replValueArg= null;
 		ImList<@Nullable RAstNode> inject0Args= ImCollections.emptyList();
 		final RAstNode parentNode= fCallNode.getRParent();
 		if (parentNode != null) {
@@ -759,7 +790,7 @@
 			case A_RIGHT:
 				{	final Assignment assignNode= (Assignment)parentNode;
 					if (assignNode.getTargetChild() == fCallNode) {
-						assignmentValueArg= assignNode.getSourceChild();
+						replValueArg= assignNode.getSourceChild();
 					}
 					break;
 				}
@@ -767,7 +798,7 @@
 				break;
 			}
 		}
-		return matchArgs(fCallNode.getArgsChild(), argsDef, assignmentValueArg, inject0Args);
+		return matchArgs(fCallNode.getArgsChild(), argsDef, replValueArg, inject0Args);
 	}
 	
 	
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
index a020f50..026d905 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
@@ -195,7 +195,7 @@
 		
 		final FCall fCallNode= info.getFCallNode();
 		// like org.eclipse.statet.r.core.rsource.ast.RAsts#matchArgs(FCall, ArgsDefinition)
-		@Nullable RAstNode assignmentValueArg= null;
+		@Nullable RAstNode replValueArg= null;
 		ImList<@Nullable RAstNode> inject0Args= ImCollections.emptyList();
 		final RAstNode parentNode= fCallNode.getRParent();
 		if (parentNode != null) {
@@ -212,7 +212,7 @@
 			case A_RIGHT:
 				{	final Assignment assignNode= (Assignment)parentNode;
 					if (assignNode.getTargetChild() == fCallNode) {
-						assignmentValueArg= assignNode.getSourceChild();
+						replValueArg= assignNode.getSourceChild();
 					}
 					break;
 				}
@@ -220,7 +220,7 @@
 				break;
 			}
 		}
-		return RAsts.matchArgs(argsNode, info.getArgsDefinition(), assignmentValueArg, inject0Args);
+		return RAsts.matchArgs(argsNode, info.getArgsDefinition(), replValueArg, inject0Args);
 	}
 	
 	
