diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RArgumentListContextInformation.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RArgumentListContextInformation.java
index 8b266ea..ae283a1 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RArgumentListContextInformation.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RArgumentListContextInformation.java
@@ -19,6 +19,8 @@
 
 import org.eclipse.statet.jcommons.collections.IntArrayList;
 import org.eclipse.statet.jcommons.collections.IntList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.ui.sourceediting.assist.AssistInformationProposal;
 import org.eclipse.statet.r.core.model.ArgsDefinition;
@@ -26,13 +28,14 @@
 import org.eclipse.statet.r.ui.RLabelProvider;
 
 
+@NonNullByDefault
 public class RArgumentListContextInformation implements AssistInformationProposal,
 		IContextInformationExtension {
 	
 	
 	private final int offset;
 	
-	private final ArgsDefinition args;
+	private final @Nullable ArgsDefinition args;
 	
 	private final String information;
 	private final int[] informationIndexes;
@@ -49,12 +52,12 @@
 	}
 	
 	
-	public ArgsDefinition getArguments() {
+	public @Nullable ArgsDefinition getArguments() {
 		return this.args;
 	}
 	
 	@Override
-	public Image getImage() {
+	public @Nullable Image getImage() {
 		return null;
 	}
 	
@@ -78,7 +81,7 @@
 	}
 	
 	@Override
-	public boolean equals(final Object obj) {
+	public boolean equals(final @Nullable Object obj) {
 		// prevent stacking of context information at the same position
 		return true;
 	}
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 bf010bd..95a5106 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
@@ -24,6 +24,8 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StyleRange;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.input.OffsetStringParserInput;
 
 import org.eclipse.statet.ltk.ast.core.AstInfo;
@@ -36,21 +38,21 @@
 import org.eclipse.statet.r.core.rsource.ast.RScanner;
 
 
+@NonNullByDefault
 public class RContextInformationValidator implements IContextInformationValidator, IContextInformationPresenter {
 	
 	
-	private ITextViewer fViewer;
-	private int fStartOffset;
+	private ITextViewer viewer;
+	private int startOffset;
 	
-	private IContextInformation fInfo;
+	private @Nullable IContextInformation info;
 	
-	private RArgumentListContextInformation fArgInfo;
-	private int fCurrentParameter;
-//	private RScanner scanner;
-	private long fScannedArgsStamp;
-	private Args fScannedArgs;
+	private @Nullable RArgumentListContextInformation argInfo;
+	private int currentParameter;
+	private long scannedArgsStamp;
+	private @Nullable Args scannedArgs;
 	
-	private int fLastPresentation = -2;
+	private int lastPresentation= -2;
 	
 	
 	public RContextInformationValidator() {
@@ -58,122 +60,125 @@
 	
 	
 	@Override
-	public boolean isContextInformationValid(final int offset) {
-		if (fInfo == null) {
-			return false;
-		}
-		final IDocument document = fViewer.getDocument();
-		if (offset < fStartOffset || offset > document.getLength()) {
-			return false;
-		}
-		if (fArgInfo != null) {
-			final Args args = getScannedArgs();
-			if (args != null) {
-				return (offset <= args.getEndOffset());
-			}
-		}
-		return (offset == fStartOffset);
-	}
-	
-	@Override
 	public void install(IContextInformation info, final ITextViewer viewer, final int offset) {
 		if (info instanceof AssistCompletionInformationProposalWrapper) {
 			info= ((AssistCompletionInformationProposalWrapper) info).getContextInformation();
 		}
 		
-		fScannedArgs = null;
-		fLastPresentation = -2;
+		this.scannedArgs= null;
+		this.lastPresentation= -2;
 		if (info instanceof RArgumentListContextInformation) {
-			fInfo = fArgInfo = (RArgumentListContextInformation) info;
-			fCurrentParameter = -1;
+			this.info= this.argInfo= (RArgumentListContextInformation) info;
+			this.currentParameter= -1;
 		}
 		else {
-			fInfo = info;
-			fArgInfo = null;
+			this.info= info;
+			this.argInfo= null;
 			return;
 		}
-		fViewer = viewer;
-		fStartOffset = offset;
+		this.viewer= viewer;
+		this.startOffset= offset;
+	}
+	
+	@Override
+	public boolean isContextInformationValid(final int offset) {
+		if (this.info == null) {
+			return false;
+		}
+		final IDocument document= this.viewer.getDocument();
+		if (offset < this.startOffset || offset > document.getLength()) {
+			return false;
+		}
+		final RArgumentListContextInformation argInfo= this.argInfo;
+		if (argInfo != null) {
+			final Args args= getScannedArgs();
+			if (args != null) {
+				return (offset <= args.getEndOffset());
+			}
+		}
+		return (offset == this.startOffset);
 	}
 	
 	@Override
 	public boolean updatePresentation(final int offset, final TextPresentation presentation) {
-		if (fArgInfo != null) {
-			final ArgsDefinition args = fArgInfo.getArguments();
+		if (this.info == null) {
+			return false;
+		}
+		final RArgumentListContextInformation argInfo= this.argInfo;
+		if (argInfo != null) {
+			final ArgsDefinition args= argInfo.getArguments();
 			if (args != null && args.size() > 0) {
-				final int argIndex = getCurrentArgInFDef(offset);
-				final int[] idxs = fArgInfo.getInformationDisplayStringArgumentIdxs();
+				final int argIndex= getCurrentArgInFDef(offset);
+				final int[] idxs= argInfo.getInformationDisplayStringArgumentIdxs();
 				if (argIndex >= 0 && argIndex < idxs.length) {
-					if (argIndex == fLastPresentation) {
+					if (argIndex == this.lastPresentation) {
 						return false;
 					}
-					final int start = idxs[argIndex];
-					final int stop = (argIndex+1 < idxs.length) ? idxs[argIndex+1] : fArgInfo.getInformationDisplayString().length();
+					final int start= idxs[argIndex];
+					final int stop= (argIndex+1 < idxs.length) ? idxs[argIndex+1] : argInfo.getInformationDisplayString().length();
 					presentation.clear();
 					presentation.addStyleRange(new StyleRange(start, stop-start, null, null, SWT.BOLD));
-					fLastPresentation = argIndex;
+					this.lastPresentation= argIndex;
 					return true;
 				}
 			}
 		}
-		if (fLastPresentation == -1) {
-			return false;
+		if (this.lastPresentation >= 0) {
+			presentation.clear();
+			this.lastPresentation= -1;
+			return true;
 		}
-		presentation.clear();
-		presentation.addStyleRange(new StyleRange(0, fInfo.getInformationDisplayString().length(),
-				null, null, SWT.NORMAL));
-		fLastPresentation = -1;
-		return true;
+		return false;
 	}
 	
-	private FCall.Args getScannedArgs() {
-		final AbstractDocument document = (AbstractDocument) fViewer.getDocument();
-		final long stamp = document.getModificationStamp();
-		if (fScannedArgs == null || fScannedArgsStamp != stamp) {
+	private FCall. @Nullable Args getScannedArgs() {
+		final AbstractDocument document= (AbstractDocument) this.viewer.getDocument();
+		final long stamp= document.getModificationStamp();
+		if (this.scannedArgs == null || this.scannedArgsStamp != stamp) {
 			try {
-				final String text= document.get(fStartOffset, Math.min(0x800, document.getLength() - fStartOffset));
+				final String text= document.get(this.startOffset, Math.min(0x800, document.getLength() - this.startOffset));
 				final RScanner scanner= new RScanner(AstInfo.LEVEL_MODEL_DEFAULT);
-				fScannedArgs= scanner.scanFCallArgs(
-						new OffsetStringParserInput(text, fStartOffset)
-								.init(fStartOffset, fStartOffset + text.length()),
+				this.scannedArgs= scanner.scanFCallArgs(
+						new OffsetStringParserInput(text, this.startOffset)
+								.init(this.startOffset, this.startOffset + text.length()),
 						true );
-				fScannedArgsStamp = stamp;
+				this.scannedArgsStamp= stamp;
 			}
 			catch (final Exception e) {
-				fScannedArgs = null;
+				this.scannedArgs= null;
 			}
 		}
 		
-		return fScannedArgs;
+		return this.scannedArgs;
 	}
 	
+	
 	private int getCurrentArgInFDef(final int offset) {
-		final int callArgIdx= getCurrentArgInFCall(offset);
-		if (callArgIdx >= 0) {
-			final FCallArgMatch match= RAst.matchArgs(getScannedArgs(), fArgInfo.getArguments());
-			final ArgsDefinition.Arg argDef= match.getArgDef(callArgIdx);
-			if (argDef != null) {
-				return argDef.index;
+		final Args args= getScannedArgs();
+		if (args != null) {
+			final int callArgIdx= getCurrentArgInFCall(args, offset);
+			if (callArgIdx >= 0) {
+				final FCallArgMatch match= RAst.matchArgs(args, this.argInfo.getArguments());
+				final ArgsDefinition.Arg argDef= match.getArgDef(callArgIdx);
+				if (argDef != null) {
+					return argDef.index;
+				}
 			}
 		}
 		return -1;
 	}
 	
-	private int getCurrentArgInFCall(final int offset) {
-		final Args args = getScannedArgs();
-		if (args != null) {
-			final int last = args.getChildCount()-1;
-			if (last == -1) {
-				return 0;
-			}
-			for (int i = 0; i < last; i++) {
-				if (offset <= args.getSeparatorOffset(i)) {
-					return i;
-				}
-			}
-			return last;
+	private static int getCurrentArgInFCall(final Args args, final int offset) {
+		final int last= args.getChildCount() - 1;
+		if (last == -1) {
+			return 0;
 		}
-		return -1;
+		for (int i= 0; i < last; i++) {
+			if (offset <= args.getSeparatorOffset(i)) {
+				return i;
+			}
+		}
+		return last;
 	}
 	
 }
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RElementCompletionProposal.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RElementCompletionProposal.java
index 49feacb..137aa55 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RElementCompletionProposal.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RElementCompletionProposal.java
@@ -18,7 +18,6 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IInformationControlCreator;
 import org.eclipse.jface.text.IRegion;
@@ -89,7 +88,17 @@
 		public RElementProposalParameters(final RAssistInvocationContext context, final int replacementOffset,
 				final SearchPattern namePattern,
 				final ElementLabelProvider labelProvider) {
-			this(context, replacementOffset, namePattern, 0, labelProvider);
+			super(context, replacementOffset, namePattern);
+			
+			this.labelProvider= labelProvider;
+		}
+		
+		/** Only for context information */
+		public RElementProposalParameters(final RAssistInvocationContext context, final int replacementOffset,
+				final ElementLabelProvider labelProvider) {
+			super(context, replacementOffset, 0);
+			
+			this.labelProvider= labelProvider;
 		}
 		
 	}
@@ -157,11 +166,6 @@
 		
 		
 		@Override
-		public boolean validate(final IDocument document, final int offset, final DocumentEvent event) {
-			return (offset == getInvocationContext().getInvocationOffset());
-		}
-		
-		@Override
 		public boolean isAutoInsertable() {
 			return true;
 		}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RElementCompletionComputer.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RElementCompletionComputer.java
index 467a84f..31a0402 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RElementCompletionComputer.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RElementCompletionComputer.java
@@ -650,7 +650,6 @@
 		if (fCallInfo != null) {
 			final RElementProposalParameters parameters= new RElementProposalParameters(
 					context, Math.max(fCallInfo.getNode().getArgsOpenOffset() + 1, 0),
-					null,
 					this.labelProvider );
 			
 			final FCallNamePattern pattern= new FCallNamePattern(fCallInfo.getAccess()) {
