diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/correction/RLinkedNamesAssistProposal.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/correction/RLinkedNamesAssistProposal.java
index b1ec7d5..f2480bd 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/correction/RLinkedNamesAssistProposal.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/correction/RLinkedNamesAssistProposal.java
@@ -16,6 +16,8 @@
 
 import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 
+import static org.eclipse.statet.ecommons.ui.actions.UIActions.NO_COMMAND_ID;
+
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.link.LinkedPositionGroup;
@@ -28,6 +30,7 @@
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.internal.r.ui.RUIMessages;
+import org.eclipse.statet.ltk.ui.LtkActions;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.AssistInvocationContext;
 import org.eclipse.statet.ltk.ui.sourceediting.assist.LinkedNamesAssistProposal;
 import org.eclipse.statet.r.core.model.RElementAccess;
@@ -37,7 +40,7 @@
 
 
 @NonNullByDefault
-public class RLinkedNamesAssistProposal extends LinkedNamesAssistProposal {
+public class RLinkedNamesAssistProposal extends LinkedNamesAssistProposal<AssistInvocationContext> {
 	
 	
 	public static final int IN_FILE= 1;
@@ -55,28 +58,9 @@
 	
 	public RLinkedNamesAssistProposal(final int mode,
 			final AssistInvocationContext invocationContext, final RElementAccess access) {
-		super(invocationContext);
+		super(init(invocationContext, mode, false));
 		this.mode= mode;
 		this.region= null;
-		switch (mode) {
-		case IN_FILE:
-			init(RUIMessages.Proposal_RenameInFile_label,
-					RUIMessages.Proposal_RenameInFile_description,
-					90 );
-			break;
-		case IN_FILE_PRECEDING:
-			init(RUIMessages.Proposal_RenameInFilePrecending_label,
-					RUIMessages.Proposal_RenameInFilePrecending_description,
-					85 );
-			break;
-		case IN_FILE_FOLLOWING:
-			init(RUIMessages.Proposal_RenameInFileFollowing_label,
-					RUIMessages.Proposal_RenameInFileFollowing_description,
-					84 );
-			break;
-		default:
-			throw new IllegalArgumentException();
-		}
 		this.access= access;
 		this.isReplFName= checkReplFName();
 	}
@@ -84,20 +68,47 @@
 	public RLinkedNamesAssistProposal(final int mode,
 			final AssistInvocationContext invocationContext, final RElementAccess access,
 			final TextRegion region) {
-		super(invocationContext);
+		super(init(invocationContext, mode, true));
 		this.mode= mode;
 		this.region= nonNullAssert(region);
+		this.access= access;
+		this.isReplFName= checkReplFName();
+	}
+	
+	private static ProposalParameters<AssistInvocationContext> init(
+			final AssistInvocationContext invocationContext,
+			final int mode, final boolean withRegion) {
 		switch (mode) {
+		case IN_FILE:
+			return new ProposalParameters<>(invocationContext,
+					LtkActions.QUICK_ASSIST_RENAME_IN_FILE,
+					RUIMessages.Proposal_RenameInFile_label,
+					RUIMessages.Proposal_RenameInFile_description,
+					90 );
+		case IN_FILE_PRECEDING:
+			return new ProposalParameters<>(invocationContext,
+					NO_COMMAND_ID,
+					RUIMessages.Proposal_RenameInFilePrecending_label,
+					RUIMessages.Proposal_RenameInFilePrecending_description,
+					85 );
+		case IN_FILE_FOLLOWING:
+			return new ProposalParameters<>(invocationContext,
+					NO_COMMAND_ID,
+					RUIMessages.Proposal_RenameInFileFollowing_label,
+					RUIMessages.Proposal_RenameInFileFollowing_description,
+					84 );
 		case IN_CHUNK:
-			init(RUIMessages.Proposal_RenameInChunk_label,
+			if (!withRegion) {
+				throw new IllegalArgumentException();
+			}
+			return new ProposalParameters<>(invocationContext,
+					NO_COMMAND_ID,
+					RUIMessages.Proposal_RenameInChunk_label,
 					RUIMessages.Proposal_RenameInChunk_description,
 					89 );
-			break;
 		default:
 			throw new IllegalArgumentException();
 		}
-		this.access= access;
-		this.isReplFName= checkReplFName();
 	}
 	
 	private boolean checkReplFName() {
@@ -128,27 +139,27 @@
 		}
 		
 		int idx= 0;
-		{	final RAstNode nameNode= nonNullAssert(this.access.getNameNode());
-			idx= addPosition(group, document, RAsts.getElementNameRegion(nameNode), idx);
+		{	final var nameNode= nonNullAssert(this.access.getNameNode());
+			idx= addPosition(group, document, nameNode, idx);
 			if (idx == 0) {
 				return;
 			}
 		}
 		if (this.mode == IN_FILE || this.mode == IN_FILE_FOLLOWING) {
 			for (int i= current + 1; i < allAccess.size(); i++) {
-				final RAstNode nameNode= allAccess.get(i).getNameNode();
+				final var nameNode= allAccess.get(i).getNameNode();
 				if (nameNode != null) {
-					idx= addPosition(group, document, RAsts.getElementNameRegion(nameNode), idx);
+					idx= addPosition(group, document, nameNode, idx);
 				}
 			}
 		}
 		else if (this.mode == IN_CHUNK) {
 			final int regionOffset= getChunkRegion().getEndOffset();
 			for (int i= current + 1; i < allAccess.size(); i++) {
-				final RAstNode nameNode= allAccess.get(i).getNameNode();
+				final var nameNode= allAccess.get(i).getNameNode();
 				if (nameNode != null) {
 					if (regionOffset > nameNode.getStartOffset()) {
-						idx= addPosition(group, document, RAsts.getElementNameRegion(nameNode), idx);
+						idx= addPosition(group, document, nameNode, idx);
 					}
 					else {
 						break;
@@ -158,19 +169,19 @@
 		}
 		if (this.mode == IN_FILE || this.mode == IN_FILE_PRECEDING) {
 			for (int i= 0; i < current; i++) {
-				final RAstNode nameNode= allAccess.get(i).getNameNode();
+				final var nameNode= allAccess.get(i).getNameNode();
 				if (nameNode != null) {
-					idx= addPosition(group, document, RAsts.getElementNameRegion(nameNode), idx);
+					idx= addPosition(group, document, nameNode, idx);
 				}
 			}
 		}
 		else if (this.mode == IN_CHUNK) {
 			final int regionOffset= getChunkRegion().getStartOffset();
 			for (int i= 0; i < current; i++) {
-				final RAstNode nameNode= allAccess.get(i).getNameNode();
+				final var nameNode= allAccess.get(i).getNameNode();
 				if (nameNode != null) {
 					if (regionOffset <= nameNode.getStartOffset()) {
-						idx= addPosition(group, document, RAsts.getElementNameRegion(nameNode), idx);
+						idx= addPosition(group, document, nameNode, idx);
 					}
 				}
 			}
@@ -178,9 +189,9 @@
 	}
 	
 	
-	@Override
 	protected int addPosition(final LinkedPositionGroup group, final IDocument document,
-			@Nullable TextRegion position, final int idx) throws BadLocationException {
+			final RAstNode nameNode, final int idx) throws BadLocationException {
+		TextRegion position= RAsts.getElementNameRegion(nameNode);
 		if (this.isReplFName && position != null
 				&& document.get(position.getStartOffset(), position.getLength())
 						.endsWith(RTerminal.S_ARROW_LEFT) ) {
