Bug 574779: [R-Console] Adapt and revise tool command handlers

Change-Id: I1ff6823137c3df32622da6c1b9e79f2ddaa2e990
diff --git a/r/org.eclipse.statet.nico.core/META-INF/MANIFEST.MF b/r/org.eclipse.statet.nico.core/META-INF/MANIFEST.MF
index b187477..bdbae03 100644
--- a/r/org.eclipse.statet.nico.core/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.nico.core/META-INF/MANIFEST.MF
@@ -24,8 +24,7 @@
  org.eclipse.statet.jcommons.lang;version="4.5.0",
  org.eclipse.statet.jcommons.status;version="4.5.0",
  org.eclipse.statet.jcommons.status.eplatform;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core.util;version="4.5.0"
+ org.eclipse.statet.jcommons.ts.core;version="4.5.0"
 Export-Package: org.eclipse.statet.internal.nico.core;x-friends:="org.eclipse.statet.nico.ui",
  org.eclipse.statet.nico.core,
  org.eclipse.statet.nico.core.runtime,
diff --git a/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/HistoryOperationsHandler.java b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/HistoryOperationsHandler.java
index 9713c91..6488dd5 100644
--- a/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/HistoryOperationsHandler.java
+++ b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/HistoryOperationsHandler.java
@@ -17,73 +17,77 @@
 import static org.eclipse.statet.jcommons.status.Status.CANCEL_STATUS;
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
-import java.util.Map;
-
 import org.eclipse.core.filesystem.EFS;
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ErrorStatus;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
-import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;
-import org.eclipse.statet.jcommons.ts.core.ToolService;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.internal.nico.core.Messages;
 import org.eclipse.statet.nico.core.NicoCore;
+import org.eclipse.statet.nico.core.util.AbstractConsoleCommandHandler;
 
 
 /**
- * {@link #LOAD_HISTORY_ID}
- * {@link #SAVE_HISTORY_ID}
- * {@link #ADDTO_HISTORY_ID}
+ * {@link #LOAD_HISTORY_COMMAND_ID}
+ * {@link #SAVE_HISTORY_COMMAND_ID}
+ * {@link #ADDTO_HISTORY_COMMAND_ID}
  */
-public class HistoryOperationsHandler implements ToolCommandHandler {
+@NonNullByDefault
+public class HistoryOperationsHandler extends AbstractConsoleCommandHandler {
 	
 	
-	public static final String LOAD_HISTORY_ID = "console/loadHistory"; //$NON-NLS-1$
+	public static final String LOAD_HISTORY_COMMAND_ID= "console/loadHistory"; //$NON-NLS-1$
 	
-	public static final String SAVE_HISTORY_ID = "console/saveHistory"; //$NON-NLS-1$
+	public static final String SAVE_HISTORY_COMMAND_ID= "console/saveHistory"; //$NON-NLS-1$
 	
-	public static final String ADDTO_HISTORY_ID = "console/addtoHistory"; //$NON-NLS-1$
+	public static final String ADDTO_HISTORY_COMMAND_ID= "console/addtoHistory"; //$NON-NLS-1$
 	
 	
-	@Override
-	public Status execute(final String id, final ToolService service, final Map<String, Object> data,
-			final ProgressMonitor m) {
-		if (service instanceof ConsoleService) {
-			final ConsoleService console = (ConsoleService) service;
-			if (id.equals(LOAD_HISTORY_ID)) {
-				return loadHistory(console, data, m);
-			}
-			if (id.equals(SAVE_HISTORY_ID)) {
-				return saveHistory(console, data, m);
-			}
-			if (id.equals(ADDTO_HISTORY_ID)) {
-				final String item = ToolCommandHandlerUtils.getCheckedData(data, "text", String.class, true); //$NON-NLS-1$
-				console.getTool().getHistory().addCommand(item, console.getController().getCurrentSubmitType());
-				return OK_STATUS;
-			}
-		}
-		throw new UnsupportedOperationException();
+	public HistoryOperationsHandler() {
 	}
 	
 	
-	protected Status loadHistory(final ConsoleService tools, final Map<String, Object> data,
+	@Override
+	public Status execute(final String id, final ConsoleService service, final ToolCommandData data,
+			final ProgressMonitor m) {
+		switch (id) {
+		case LOAD_HISTORY_COMMAND_ID:
+			return loadHistory(service, data, m);
+		case SAVE_HISTORY_COMMAND_ID:
+			return saveHistory(service, data, m);
+			
+		case ADDTO_HISTORY_COMMAND_ID:
+			{	final String item= data.getStringRequired("text"); //$NON-NLS-1$
+				service.getTool().getHistory().addCommand(item,
+						service.getController().getCurrentSubmitType() );
+				return OK_STATUS;
+			}
+			
+		default:
+			throw new UnsupportedOperationException();
+		}
+	}
+	
+	
+	protected Status loadHistory(final ConsoleService tools, final ToolCommandData data,
 			final ProgressMonitor m) {
 		try {
-			CoreException fileException = null;
-			IFileStore fileStore = null;
-			final String filename = ToolCommandHandlerUtils.getCheckedData(data, "filename", String.class, true); //$NON-NLS-1$
-			final ToolWorkspace workspaceData = tools.getWorkspaceData();
+			CoreException fileException= null;
+			IFileStore fileStore= null;
+			final String filename= data.getStringRequired("filename"); //$NON-NLS-1$
+			final ToolWorkspace workspaceData= tools.getWorkspaceData();
 			try {
-				fileStore = workspaceData.toFileStore(filename);
+				fileStore= workspaceData.toFileStore(filename);
 			}
 			catch (final CoreException e) {
-				fileException = e;
+				fileException= e;
 			}
 			final Status status;
 			if (fileStore == null) {
@@ -104,23 +108,23 @@
 		}
 	}
 	
-	protected Status saveHistory(final ConsoleService tools, final Map<String, Object> data,
+	protected Status saveHistory(final ConsoleService tools, final ToolCommandData data,
 			final ProgressMonitor m) {
 		try {
-			CoreException fileException = null;
-			IFileStore fileStore = null;
+			CoreException fileException= null;
+			IFileStore fileStore= null;
 			final Status status;
 			
-			final String filename = ToolCommandHandlerUtils.getCheckedData(data, "filename", String.class, true); //$NON-NLS-1$
-			final ToolWorkspace workspaceData = tools.getWorkspaceData();
+			final String filename= data.getStringRequired("filename"); //$NON-NLS-1$
+			final ToolWorkspace workspaceData= tools.getWorkspaceData();
 			try {
-				fileStore = workspaceData.toFileStore(filename);
+				fileStore= workspaceData.toFileStore(filename);
 			}
 			catch (final CoreException e) {
-				fileException = e;
+				fileException= e;
 			}
 			if (fileStore == null) {
-				status = new ErrorStatus(NicoCore.BUNDLE_ID, NLS.bind(
+				status= new ErrorStatus(NicoCore.BUNDLE_ID, NLS.bind(
 								Messages.ToolController_FileOperation_error_CannotResolve_message,
 								filename ),
 						fileException );
diff --git a/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/ToolController.java b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/ToolController.java
index d87357d..acff6fa 100644
--- a/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/ToolController.java
+++ b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/runtime/ToolController.java
@@ -39,6 +39,7 @@
 import org.eclipse.statet.jcommons.collections.ImIdentityList;
 import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.Disposable;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.lang.ObjectUtils;
 import org.eclipse.statet.jcommons.lang.ObjectUtils.ToStringBuilder;
 import org.eclipse.statet.jcommons.status.CancelStatus;
@@ -48,8 +49,10 @@
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
+import org.eclipse.statet.jcommons.ts.core.BasicToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.SystemRunnable;
 import org.eclipse.statet.jcommons.ts.core.Tool;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
@@ -740,9 +743,10 @@
 		try {
 			final ToolCommandHandler handler= this.actionHandlers.get(SCHEDULE_QUIT_EVENT_ID);
 			if (handler != null) {
-				final Map<String, Object> data= new HashMap<>();
-				data.put("scheduledQuitRunnables", getQuitRunnables()); //$NON-NLS-1$
-				final Status status= executeHandler(SCHEDULE_QUIT_EVENT_ID, handler, data, new NullProgressMonitor());
+				final ToolCommandData data= new BasicToolCommandData(Map.of(
+						"scheduledQuitRunnables", getQuitRunnables() ));
+				final Status status= executeHandler(SCHEDULE_QUIT_EVENT_ID, handler, data,
+						new NullProgressMonitor() );
 				if (status != null && status.getSeverity() > Status.OK) {
 					schedule= false;
 				}
@@ -1730,7 +1734,8 @@
 		}
 		final ToolCommandHandler handler= getCommandHandler(REPORT_STATUS_EVENT_ID);
 		if (handler != null) {
-			final Map<String, Object> data= Collections.singletonMap(REPORT_STATUS_DATA_KEY, (Object) status);
+			final ToolCommandData data= new BasicToolCommandData(Map.of(
+					REPORT_STATUS_DATA_KEY, status ));
 			final Status reportStatus= executeHandler(REPORT_STATUS_EVENT_ID, handler, data, m);
 			if (reportStatus != null && reportStatus.getSeverity() == Status.OK) {
 				return;
@@ -1750,8 +1755,9 @@
 				null ));
 	}
 	
-	protected Status executeHandler(final String commandID, final ToolCommandHandler handler,
-			final Map<String, Object> data, final ProgressMonitor m) {
+	protected @Nullable Status executeHandler(final String commandID,
+			final ToolCommandHandler handler, final ToolCommandData data,
+			final ProgressMonitor m) {
 		try {
 			return handler.execute(commandID, this, data, m);
 		}
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/AbstractConsoleCommandHandler.java b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/util/AbstractConsoleCommandHandler.java
similarity index 79%
rename from r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/AbstractConsoleCommandHandler.java
rename to r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/util/AbstractConsoleCommandHandler.java
index 8e8dc2b..3354697 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/internal/nico/ui/AbstractConsoleCommandHandler.java
+++ b/r/org.eclipse.statet.nico.core/src/org/eclipse/statet/nico/core/util/AbstractConsoleCommandHandler.java
@@ -12,14 +12,13 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.internal.nico.ui;
-
-import java.util.Map;
+package org.eclipse.statet.nico.core.util;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
 
@@ -31,12 +30,12 @@
 	
 	
 	@Override
-	public Status execute(final String id, final ToolService service, final Map<String, Object> data,
+	public Status execute(final String id, final ToolService service, final ToolCommandData data,
 			final ProgressMonitor m) throws StatusException {
-		return execute(id, (ConsoleService) service, data, m);
+		return execute(id, (ConsoleService)service, data, m);
 	}
 	
-	protected abstract Status execute(final String id, final ConsoleService service, final Map<String, Object> data,
-			final ProgressMonitor m) throws StatusException;
+	protected abstract Status execute(String id, ConsoleService service, ToolCommandData data,
+			ProgressMonitor m) throws StatusException;
 	
 }
diff --git a/r/org.eclipse.statet.nico.ui/META-INF/MANIFEST.MF b/r/org.eclipse.statet.nico.ui/META-INF/MANIFEST.MF
index 2117321..d803c96 100644
--- a/r/org.eclipse.statet.nico.ui/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.nico.ui/META-INF/MANIFEST.MF
@@ -44,8 +44,7 @@
  org.eclipse.statet.jcommons.status;version="4.5.0",
  org.eclipse.statet.jcommons.status.eplatform;version="4.5.0",
  org.eclipse.statet.jcommons.text.core;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core.util;version="4.5.0"
+ org.eclipse.statet.jcommons.ts.core;version="4.5.0"
 Export-Package: org.eclipse.statet.nico.ui,
  org.eclipse.statet.nico.ui.actions,
  org.eclipse.statet.nico.ui.console,
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ChooseFileHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ChooseFileHandler.java
index 896d771..e3b1040 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ChooseFileHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ChooseFileHandler.java
@@ -17,9 +17,6 @@
 import static org.eclipse.statet.jcommons.status.Status.CANCEL_STATUS;
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.core.filesystem.IFileStore;
@@ -34,9 +31,11 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.ecommons.databinding.jface.DataBindingSupport;
 import org.eclipse.statet.ecommons.ui.dialogs.DialogUtils;
@@ -45,41 +44,54 @@
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 import org.eclipse.statet.ecommons.ui.workbench.ResourceInputComposite;
 
-import org.eclipse.statet.internal.nico.ui.AbstractConsoleCommandHandler;
 import org.eclipse.statet.internal.nico.ui.Messages;
 import org.eclipse.statet.internal.nico.ui.NicoUIPlugin;
 import org.eclipse.statet.nico.core.runtime.ConsoleService;
 import org.eclipse.statet.nico.core.runtime.IProgressInfo;
 import org.eclipse.statet.nico.core.runtime.ToolProcess;
+import org.eclipse.statet.nico.core.util.AbstractConsoleCommandHandler;
 
 
 /**
  * TODO: Better support for remote engines (resource mapping); disable OK button on errors?
  */
+@NonNullByDefault
 public class ChooseFileHandler extends AbstractConsoleCommandHandler {
 	
 	
-	public static final String CHOOSE_FILE_ID = "common/chooseFile"; //$NON-NLS-1$
+	public static final String CHOOSE_FILE_COMMAND_ID= "common/chooseFile"; //$NON-NLS-1$
 	
 	
 	private static class ChooseFileDialog extends ToolDialog {
 		
-		private final int fMode;
+		private final int mode;
 		
-		private final String fMessage;
+		private final String message;
 		
-		private ResourceInputComposite fLocationGroup;
-		private WritableValue fNewLocationString;
-		private final String fHistoryId;
+		private ResourceInputComposite locationGroup;
+		private final WritableValue<String> newLocationValue;
+		private final String historyId;
 		
 		
-		public ChooseFileDialog(final Shell shell, final ToolProcess tool, final String message, final boolean newFile) {
+		public ChooseFileDialog(final Shell shell, final ToolProcess tool, final String message,
+				final boolean newFile) {
 			super(tool, shell, null, Messages.Util_ChooseFile_Dialog_title);
 			
-			fMode = newFile ? (ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_SAVE)
-					: (ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_OPEN);
-			fMessage = message;
-			fHistoryId = "statet:"+getTool().getMainType()+":location.commonfile"; //$NON-NLS-1$ //$NON-NLS-2$
+			this.mode= newFile ?
+					(ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_SAVE) :
+					(ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_OPEN);
+			this.message= message;
+			this.historyId= "statet:" + getTool().getMainType() + ":location.commonfile"; //$NON-NLS-1$ //$NON-NLS-2$
+			
+			final IFileStore current= getTool().getWorkspaceData().getWorkspaceDir();
+			String dir= ""; //$NON-NLS-1$
+			if (current != null) {
+				final IPath path= URIUtil.toPath(current.toURI());
+				if (path != null) {
+					dir= path.toOSString();
+				}
+			}
+			this.newLocationValue= new WritableValue<>(dir, String.class);
 		}
 		
 		
@@ -90,48 +102,39 @@
 		
 		@Override
 		protected Control createDialogContent(final Composite parent) {
-			setTitle(fMessage);
+			setTitle(this.message);
 			
-			final Composite composite = new Composite(parent, SWT.NONE);
+			final Composite composite= new Composite(parent, SWT.NONE);
 			composite.setLayout(LayoutUtils.newCompositeGrid(1));
 			
-			final Composite inputComposite = new Composite(composite, SWT.NONE);
+			final Composite inputComposite= new Composite(composite, SWT.NONE);
 			inputComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
 			inputComposite.setLayout(LayoutUtils.newCompositeGrid(2));
 			
-			fLocationGroup = new ResourceInputComposite(inputComposite,
+			this.locationGroup= new ResourceInputComposite(inputComposite,
 					ResourceInputComposite.STYLE_COMBO,
-					fMode,
-					Messages.Util_ChooseFile_File_label);
-			fLocationGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-			final String[] history = getDialogSettings().getArray(fHistoryId);
-			fLocationGroup.setHistory(history);
+					this.mode,
+					Messages.Util_ChooseFile_File_label );
+			this.locationGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+			final String[] history= getDialogSettings().getArray(this.historyId);
+			this.locationGroup.setHistory(history);
 			
-			final DataBindingSupport databinding = new DataBindingSupport(composite);
+			final DataBindingSupport databinding= new DataBindingSupport(composite);
 			addBindings(databinding);
 			
-			fNewLocationString.setValue((history != null && history.length > 0) ? history[0] : ""); //$NON-NLS-1$
+			this.newLocationValue.setValue((history != null && history.length > 0) ? history[0] : ""); //$NON-NLS-1$
 			
-			databinding.installStatusListener(new TitleAreaStatusUpdater(this, fMessage));
+			databinding.installStatusListener(new TitleAreaStatusUpdater(this, this.message));
 			
 			return composite;
 		}
 		
 		protected void addBindings(final DataBindingSupport db) {
-			final IFileStore current = getTool().getWorkspaceData().getWorkspaceDir();
-			String dir = ""; //$NON-NLS-1$
-			if (current != null) {
-				final IPath path = URIUtil.toPath(current.toURI());
-				if (path != null) {
-					dir = path.toOSString();
-				}
-			}
-			fNewLocationString = new WritableValue(dir, String.class);
 			db.getContext().bindValue(
-					fLocationGroup.getObservable(),
-					fNewLocationString,
-					new UpdateValueStrategy<>()
-							.setAfterGetValidator(fLocationGroup.getValidator()),
+					this.locationGroup.getObservable(),
+					this.newLocationValue,
+					new UpdateValueStrategy<String, String>()
+							.setAfterGetValidator(this.locationGroup.getValidator()),
 					null );
 		}
 		
@@ -142,48 +145,42 @@
 		}
 		
 		public void saveSettings() {
-			final IDialogSettings settings = getDialogSettings();
-			DialogUtils.saveHistorySettings(settings, fHistoryId, (String) fNewLocationString.getValue());
+			final IDialogSettings settings= getDialogSettings();
+			DialogUtils.saveHistorySettings(settings, this.historyId, this.newLocationValue.getValue());
 		}
 		
 		public IFileStore getResource() {
-			return fLocationGroup.getResourceAsFileStore();
+			return this.locationGroup.getResourceAsFileStore();
 		}
 		
 	}
 	
 	
 	@Override
-	public Status execute(final String id, final ConsoleService service, final Map<String, Object> data,
+	public Status execute(final String id, final ConsoleService service, final ToolCommandData data,
 			final ProgressMonitor m) {
 		final String message;
-		{	String s = ToolCommandHandlerUtils.getCheckedData(data, "message", String.class, false);  //$NON-NLS-1$
+		{	String s= data.getString("message"); //$NON-NLS-1$
 			if (s == null) {
-				final IProgressInfo progressInfo = service.getController().getProgressInfo();
-				s = NLS.bind("Choose file (asked by {0}):", progressInfo.getLabel());
+				final IProgressInfo progressInfo= service.getController().getProgressInfo();
+				s= NLS.bind("Choose file (asked by {0}):", progressInfo.getLabel());
 			}
-			message = s;
+			message= s;
 		}
-		final Boolean newFile = ToolCommandHandlerUtils.getCheckedData(data, "newResource", Boolean.class, true); //$NON-NLS-1$
-		final AtomicReference<IFileStore> file= new AtomicReference<>();
-		final Runnable runnable = new Runnable() {
-			@Override
-			public void run() {
-				final ChooseFileDialog dialog = new ChooseFileDialog(UIAccess.getActiveWorkbenchShell(true),
-						service.getTool(), message, newFile.booleanValue());
-				dialog.setBlockOnOpen(true);
-				if (dialog.open() == Dialog.OK) {
-					file.set(dialog.getResource());
-				}
-			}
-		};
-		UIAccess.getDisplay().syncExec(runnable);
-		if (file.get() == null) {
+		final boolean newFile= data.getBooleanRequired("newResource"); //$NON-NLS-1$
+		final var file= UIAccess.<@Nullable IFileStore>syncExecGet(() -> {
+			final ChooseFileDialog dialog= new ChooseFileDialog(UIAccess.getActiveWorkbenchShell(true),
+					service.getTool(), message, newFile );
+			dialog.setBlockOnOpen(true);
+			return (dialog.open() == Dialog.OK) ? dialog.getResource() : null;
+		});
+		if (file == null) {
 			return CANCEL_STATUS;
 		}
-		{	final String fileName = file.get().toString();
-			data.put("filename", fileName); //$NON-NLS-1$
-			data.put("fileName", fileName); //$NON-NLS-1$
+		{	final String fileName= file.toString();
+			data.setReturnData("filename", fileName); //$NON-NLS-1$
+			data.setReturnData("fileName", fileName); //$NON-NLS-1$
+			data.setReturnData("filePath", fileName); //$NON-NLS-1$
 		}
 		return OK_STATUS;
 	}
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/EclipseIDEOperationsHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/EclipseIDEOperationsHandler.java
index f45d78a..586f4d9 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/EclipseIDEOperationsHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/EclipseIDEOperationsHandler.java
@@ -16,30 +16,29 @@
 
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
-import java.util.Map;
-
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.ide.IDE;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.status.ErrorStatus;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
-import org.eclipse.statet.internal.nico.ui.AbstractConsoleCommandHandler;
 import org.eclipse.statet.nico.core.runtime.ConsoleService;
 import org.eclipse.statet.nico.core.runtime.IToolEventHandler;
 import org.eclipse.statet.nico.core.runtime.ToolWorkspace;
+import org.eclipse.statet.nico.core.util.AbstractConsoleCommandHandler;
 import org.eclipse.statet.nico.ui.NicoUI;
 import org.eclipse.statet.nico.ui.views.HistoryView;
 
@@ -49,41 +48,46 @@
  *  {@link IToolEventHandler#SHOW_HISTORY_ID} - shows the history view
  * 
  */
+@NonNullByDefault
 public class EclipseIDEOperationsHandler extends AbstractConsoleCommandHandler {
 	
 	
-	public static final String SHOW_FILE_ID = "common/showFile"; //$NON-NLS-1$
+	public static final String OPEN_FILE_COMMAND_ID= "common/openFile";
+	@Deprecated
+	public static final String OPEN_FILE_COMMAND_OLD_ID= "common/showFile"; //$NON-NLS-1$
 	
-	public static final String SHOW_HISTORY_ID = "common/showHistory"; //$NON-NLS-1$
+	public static final String SHOW_HISTORY_COMMAND_ID= "common/showHistory"; //$NON-NLS-1$
 	
 	
 	@Override
-	public Status execute(final String id, final ConsoleService service, final Map<String, Object> data,
+	public Status execute(final String id, final ConsoleService service, final ToolCommandData data,
 			final ProgressMonitor m) {
-		if (id.equals(SHOW_FILE_ID)) {
-			final IFileStore fileStore;
-			final IFile workspaceFile;
-			String fileName = ToolCommandHandlerUtils.getCheckedData(data, "filename", String.class, false); //$NON-NLS-1$
-			if (fileName == null) {
-				fileName = ToolCommandHandlerUtils.getCheckedData(data, "fileName", String.class, true); //$NON-NLS-1$
-			}
-			final ToolWorkspace workspaceData = service.getWorkspaceData();
-			try {
-				fileStore = workspaceData.toFileStore(fileName);
-				workspaceFile = getWorkspaceFile(fileStore, m);
-			}
-			catch (final CoreException e) {
-				final Status status= new ErrorStatus(NicoUI.BUNDLE_ID,
-						"Failed to resolve filename.",
-						e );
-				service.handleStatus(status, m);
-				return status;
-			}
-			final Display display = UIAccess.getDisplay();
-			display.syncExec(new Runnable() {
-				@Override
-				public void run() {
-					final IWorkbenchPage page = NicoUI.getToolRegistry().findWorkbenchPage(service.getTool());
+		switch (id) {
+		case OPEN_FILE_COMMAND_ID:
+		case OPEN_FILE_COMMAND_OLD_ID:
+			{	final IFileStore fileStore;
+				final IFile workspaceFile;
+				String fileName= data.getString("filename"); //$NON-NLS-1$
+				if (fileName == null) {
+					fileName= data.getString("fileName"); //$NON-NLS-1$
+					if (fileName == null) {
+						fileName= data.getStringRequired("filePath"); //$NON-NLS-1$
+					}
+				}
+				final ToolWorkspace workspaceData= service.getWorkspaceData();
+				try {
+					fileStore= workspaceData.toFileStore(fileName);
+					workspaceFile= getWorkspaceFile(fileStore, m);
+				}
+				catch (final CoreException e) {
+					final Status status= new ErrorStatus(NicoUI.BUNDLE_ID,
+							"Failed to resolve filename.",
+							e );
+					service.handleStatus(status, m);
+					return status;
+				}
+				UIAccess.getDisplay().syncExec(() -> {
+					final IWorkbenchPage page= NicoUI.getToolRegistry().findWorkbenchPage(service.getTool());
 					try {
 						if (workspaceFile != null) {
 							IDE.openEditor(page, workspaceFile);
@@ -98,19 +102,16 @@
 								e );
 						service.handleStatus(status, m);
 					}
-				}
-			});
-			return OK_STATUS;
-		}
-		if (id.equals(SHOW_HISTORY_ID)) {
-			final String pattern = ToolCommandHandlerUtils.getCheckedData(data, "pattern", String.class, false); //$NON-NLS-1$
-			final Display display = UIAccess.getDisplay();
-			display.syncExec(new Runnable() {
-				@Override
-				public void run() {
+				});
+				return OK_STATUS;
+			}
+			
+		case SHOW_HISTORY_COMMAND_ID:
+			{	final String pattern= data.getString("pattern"); //$NON-NLS-1$
+				UIAccess.getDisplay().syncExec(() -> {
 					try {
-						final IWorkbenchPage page = NicoUI.getToolRegistry().findWorkbenchPage(service.getTool());
-						final HistoryView view = (HistoryView) page.showView(NicoUI.HISTORY_VIEW_ID);
+						final IWorkbenchPage page= NicoUI.getToolRegistry().findWorkbenchPage(service.getTool());
+						final HistoryView view= (HistoryView)page.showView(NicoUI.HISTORY_VIEW_ID);
 						if (pattern != null) {
 							view.search(pattern, false);
 						}
@@ -121,18 +122,20 @@
 								e );
 						service.handleStatus(status, m);
 					}
-				}
-			});
-			return OK_STATUS;
+				});
+				return OK_STATUS;
+			}
+			
+		default:
+			throw new UnsupportedOperationException();
 		}
-		throw new UnsupportedOperationException();
 	}
 	
-	private IFile getWorkspaceFile(final IFileStore fileStore, final ProgressMonitor m) throws CoreException {
-		final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		final IFile[] files = root.findFilesForLocationURI(fileStore.toURI());
+	private @Nullable IFile getWorkspaceFile(final IFileStore fileStore, final ProgressMonitor m) throws CoreException {
+		final IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
+		final IFile[] files= root.findFilesForLocationURI(fileStore.toURI());
 		if (files != null && files.length > 0) {
-			final IFile file = files[0];
+			final IFile file= files[0];
 			if (!file.exists()) { // Bug 549546
 				file.refreshLocal(0, EStatusUtils.convert(m));
 			}
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/LoginHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/LoginHandler.java
index 375de65..8ffaf6c 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/LoginHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/LoginHandler.java
@@ -23,7 +23,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.security.auth.callback.Callback;
@@ -51,12 +50,13 @@
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.status.ErrorStatus;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
 
 import org.eclipse.statet.ecommons.runtime.core.util.StatusUtils;
 import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
@@ -75,18 +75,19 @@
  * 
  * Uses Equinox Security storage to save login data
  */
+@NonNullByDefault
 public class LoginHandler implements IToolEventHandler {
 	
 	
-	private static final String SECURE_PREF_ROOT = "/statet/nico"; //$NON-NLS-1$
-	private static final String SECURE_PREF_CHARSET = "UTF-8"; //$NON-NLS-1$
-	private static final String SECURE_PREF_NAME_KEY = "name"; //$NON-NLS-1$
-	private static final String SECURE_PREF_PASSWORD_KEY = "password"; //$NON-NLS-1$
+	private static final String SECURE_PREF_ROOT= "/statet/nico"; //$NON-NLS-1$
+	private static final String SECURE_PREF_CHARSET= "UTF-8"; //$NON-NLS-1$
+	private static final String SECURE_PREF_NAME_KEY= "name"; //$NON-NLS-1$
+	private static final String SECURE_PREF_PASSWORD_KEY= "password"; //$NON-NLS-1$
 	
 	
 	private static class LoginDialog extends ToolMessageDialog {
 		
-		private String message;
+		private @Nullable String message;
 		private Callback[] callbacks;
 		
 		private boolean allowSave;
@@ -112,12 +113,12 @@
 			super.createMessageArea(parent);
 			
 			LayoutUtils.addGDDummy(parent);
-			final Composite inputComposite = new Composite(parent, SWT.NONE);
+			final Composite inputComposite= new Composite(parent, SWT.NONE);
 			inputComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
 			inputComposite.setLayout(LayoutUtils.newCompositeGrid(3));
 			
 			if (this.message != null) {
-				final Label label = new Label(inputComposite, SWT.WRAP);
+				final Label label= new Label(inputComposite, SWT.WRAP);
 				label.setText(this.message);
 				label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));
 				
@@ -126,8 +127,8 @@
 			
 			ITER_CALLBACKS: for (final Callback callback : this.callbacks) {
 				if (callback instanceof TextOutputCallback) {
-					final TextOutputCallback outputCallback = (TextOutputCallback) callback;
-					final Label icon = new Label(inputComposite, SWT.LEFT);
+					final TextOutputCallback outputCallback= (TextOutputCallback) callback;
+					final Label icon= new Label(inputComposite, SWT.LEFT);
 					switch (outputCallback.getMessageType()) {
 					case TextOutputCallback.ERROR:
 						icon.setImage(Display.getCurrent().getSystemImage(SWT.ICON_ERROR));
@@ -140,24 +141,24 @@
 						break;
 					}
 					icon.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-					final Label label = new Label(inputComposite, SWT.WRAP);
+					final Label label= new Label(inputComposite, SWT.WRAP);
 					label.setText(outputCallback.getMessage());
 					label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof NameCallback) {
-					final NameCallback nameCallback = (NameCallback) callback;
-					final Label label = new Label(inputComposite, SWT.LEFT);
+					final NameCallback nameCallback= (NameCallback) callback;
+					final Label label= new Label(inputComposite, SWT.LEFT);
 					label.setText(nameCallback.getPrompt()+':');
 					label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
-					final Text field = new Text(inputComposite, SWT.LEFT | SWT.BORDER);
-					final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-					gd.widthHint = LayoutUtils.hintWidth(field, 25);
+					final Text field= new Text(inputComposite, SWT.LEFT | SWT.BORDER);
+					final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
+					gd.widthHint= LayoutUtils.hintWidth(field, 25);
 					field.setLayoutData(gd);
 					
-					String init = nameCallback.getName();
+					String init= nameCallback.getName();
 					if (init == null || init.isEmpty()) {
-						init = nameCallback.getDefaultName();
+						init= nameCallback.getDefaultName();
 					}
 					if (init != null) {
 						field.setText(init);
@@ -167,7 +168,7 @@
 						@Override
 						public void run() {
 							if (LoginDialog.this.username == null) {
-								LoginDialog.this.username = field.getText();
+								LoginDialog.this.username= field.getText();
 							}
 							nameCallback.setName(field.getText());
 						}
@@ -175,13 +176,13 @@
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof PasswordCallback) {
-					final PasswordCallback passwordCallback = (PasswordCallback) callback;
-					final Label label = new Label(inputComposite, SWT.LEFT);
+					final PasswordCallback passwordCallback= (PasswordCallback) callback;
+					final Label label= new Label(inputComposite, SWT.LEFT);
 					label.setText(passwordCallback.getPrompt()+':');
 					label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
-					final Text field = new Text(inputComposite, SWT.LEFT | SWT.BORDER | SWT.PASSWORD);
-					final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-					gd.widthHint = LayoutUtils.hintWidth(field, 25);
+					final Text field= new Text(inputComposite, SWT.LEFT | SWT.BORDER | SWT.PASSWORD);
+					final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
+					gd.widthHint= LayoutUtils.hintWidth(field, 25);
 					field.setLayoutData(gd);
 					field.setTextLimit(50);
 					
@@ -194,18 +195,18 @@
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof TextInputCallback) {
-					final TextInputCallback inputCallback = (TextInputCallback) callback;
-					final Label label = new Label(inputComposite, SWT.LEFT);
+					final TextInputCallback inputCallback= (TextInputCallback) callback;
+					final Label label= new Label(inputComposite, SWT.LEFT);
 					label.setText(inputCallback.getPrompt()+':');
 					label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
-					final Text field = new Text(inputComposite, SWT.LEFT | SWT.BORDER | SWT.PASSWORD);
-					final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-					gd.widthHint = LayoutUtils.hintWidth(field, 25);
+					final Text field= new Text(inputComposite, SWT.LEFT | SWT.BORDER | SWT.PASSWORD);
+					final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
+					gd.widthHint= LayoutUtils.hintWidth(field, 25);
 					field.setLayoutData(gd);
 					
-					String init = inputCallback.getText();
+					String init= inputCallback.getText();
 					if (init == null || init.isEmpty()) {
-						init = inputCallback.getDefaultText();
+						init= inputCallback.getDefaultText();
 					}
 					if (init != null) {
 						field.setText(init);
@@ -224,7 +225,7 @@
 			if (this.allowSave) {
 				LayoutUtils.addSmallFiller(inputComposite, false);
 				
-				this.saveControl = new Button(inputComposite, SWT.CHECK);
+				this.saveControl= new Button(inputComposite, SWT.CHECK);
 				this.saveControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
 				this.saveControl.setText(Messages.Login_Dialog_Save_label);
 				this.saveControl.setSelection(false);
@@ -244,7 +245,7 @@
 		@Override
 		protected void okPressed() {
 			if (this.saveControl != null) {
-				this.save = this.saveControl.getSelection();
+				this.save= this.saveControl.getSelection();
 			}
 			for (final Runnable runnable : this.okRunners) {
 				runnable.run();
@@ -256,12 +257,12 @@
 	
 	
 	@Override
-	public Status execute(final String id, final ToolService service, final Map<String, Object> data,
+	public Status execute(final String id, final ToolService service, final ToolCommandData data,
 			final ProgressMonitor m) {
-		final ConsoleService console = (ConsoleService) service;
-		final boolean saveAllowed = ToolCommandHandlerUtils.getCheckedData(data, "save.allowed", Boolean.TRUE); //$NON-NLS-1$
-		final boolean saveActivated = ToolCommandHandlerUtils.getCheckedData(data, "save.activated", Boolean.FALSE); //$NON-NLS-1$
-		final Callback[] callbacks = ToolCommandHandlerUtils.getCheckedData(data, LOGIN_CALLBACKS_DATA_KEY, Callback[].class, true);
+		final ConsoleService console= (ConsoleService) service;
+		final boolean saveAllowed= data.getBoolean("save.allowed", true); //$NON-NLS-1$
+		final boolean saveActivated= data.getBoolean("save.activated", false); //$NON-NLS-1$
+		final Callback[] callbacks= data.getRequired(LOGIN_CALLBACKS_DATA_KEY, Callback[].class);
 		
 		ITER_CALLBACKS: for (final Callback callback : callbacks) {
 			if (callback instanceof TextOutputCallback
@@ -270,24 +271,22 @@
 					|| callback instanceof TextInputCallback) {
 				continue ITER_CALLBACKS;
 			}
-			final Status status = new ErrorStatus(NicoUI.BUNDLE_ID,
+			final Status status= new ErrorStatus(NicoUI.BUNDLE_ID,
 					Messages.Login_error_UnsupportedOperation_message,
 					new UnsupportedCallbackException(callback) );
 			StatusManager.getManager().handle(StatusUtils.convert(status), StatusManager.SHOW | StatusManager.LOG);
 			return status;
 		}
 		
-		final ToolProcess process = console.getTool();
+		final ToolProcess process= console.getTool();
 		if (id.equals(IToolEventHandler.LOGIN_REQUEST_EVENT_ID)) {
 			// count login tries
-			final int attempt = ToolCommandHandlerUtils.getCheckedData(data, "attempt", Integer.valueOf(1)); //$NON-NLS-1$
-			data.put("attempt", attempt+1); //$NON-NLS-1$
-			if (saveAllowed && attempt == 1) {
+			if (saveAllowed && data.getInt("attempt", -1) == 1) { //$NON-NLS-1$
 				if (readData(callbacks, getDataNode(process, data, false), data)) {
 					return OK_STATUS;
 				}
 			}
-			final String message = ToolCommandHandlerUtils.getCheckedData(data, LOGIN_MESSAGE_DATA_KEY, String.class, false);
+			final String message= data.getString(LOGIN_MESSAGE_DATA_KEY);
 			if (callbacks.length == 0) {
 				return OK_STATUS;
 			}
@@ -295,19 +294,19 @@
 			UIAccess.getDisplay().syncExec(new Runnable() {
 				@Override
 				public void run() {
-					final IWorkbenchWindow window = UIAccess.getActiveWorkbenchWindow(true);
-					final LoginDialog dialog = new LoginDialog(process, window.getShell());
-					dialog.message = message;
-					dialog.callbacks = callbacks;
-					dialog.allowSave = saveAllowed;
-					dialog.save = saveActivated;
+					final IWorkbenchWindow window= UIAccess.getActiveWorkbenchWindow(true);
+					final LoginDialog dialog= new LoginDialog(process, window.getShell());
+					dialog.message= message;
+					dialog.callbacks= callbacks;
+					dialog.allowSave= saveAllowed;
+					dialog.save= saveActivated;
 					if (dialog.open() == Dialog.OK) {
-						data.put("save.activated", Boolean.valueOf(dialog.allowSave && dialog.save)); //$NON-NLS-1$
-						data.put(LOGIN_USERNAME_DATA_KEY, dialog.username);
+						data.setReturnData("save.activated", (dialog.allowSave && dialog.save)); //$NON-NLS-1$
+						data.setReturnData(LOGIN_USERNAME_DATA_KEY, dialog.username);
 						result.set(OK_STATUS);
 					}
 					else {
-						data.put("save.activated", null); //$NON-NLS-1$
+						data.setReturnData("save.activated", null); //$NON-NLS-1$
 					}
 				}
 			});
@@ -326,36 +325,40 @@
 	}
 	
 	
-	private boolean readData(final Callback[] callbacks, final ISecurePreferences node, final Map<String, Object> data) {
+	private boolean readData(final Callback[] callbacks, final @Nullable ISecurePreferences node,
+			final ToolCommandData data) {
 		try {
-			int nameCount = 0;
-			int passwordCount = 0;
-			boolean complete = true;
-			final Charset charset = Charset.forName(SECURE_PREF_CHARSET);
+			int nameCount= 0;
+			int passwordCount= 0;
+			boolean complete= true;
+			final Charset charset= Charset.forName(SECURE_PREF_CHARSET);
 			ITER_CALLBACKS: for (final Callback callback : callbacks) {
 				if (callback instanceof TextOutputCallback) {
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof NameCallback) {
-					final NameCallback nameCallback = (NameCallback) callback;
-					String name = (node != null) ? node.get(SECURE_PREF_NAME_KEY + nameCount++, null) : null;
-					if (name == null || name.isEmpty() || Boolean.TRUE.equals(data.get(LOGIN_USERNAME_FORCE_DATA_KEY))) {
-						name = (String) data.get(LOGIN_USERNAME_DATA_KEY);
+					final NameCallback nameCallback= (NameCallback) callback;
+					String name= (node != null) ? node.get(SECURE_PREF_NAME_KEY + nameCount++, null) : null;
+					if (name == null || name.isEmpty()
+							|| Boolean.TRUE.equals(data.get(LOGIN_USERNAME_FORCE_DATA_KEY, Boolean.class)) ) {
+						name= data.get(LOGIN_USERNAME_DATA_KEY, String.class);
 					}
 					if (name != null && name.length() > 0) {
 						nameCallback.setName(name);
-						data.put(LOGIN_USERNAME_DATA_KEY, name);
+						data.setReturnData(LOGIN_USERNAME_DATA_KEY, name);
 					}
 					else {
-						complete = false;
+						complete= false;
 					}
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof PasswordCallback) {
-					final PasswordCallback passwordCallback = (PasswordCallback) callback;
-					final byte[] array = (node != null) ? node.getByteArray(SECURE_PREF_PASSWORD_KEY + passwordCount++, null) : null;
+					final PasswordCallback passwordCallback= (PasswordCallback) callback;
+					final byte[] array= (node != null) ?
+							node.getByteArray(SECURE_PREF_PASSWORD_KEY + passwordCount++, null) :
+							null;
 					if (array != null) {
-						final char[] password = charset.decode(ByteBuffer.wrap(array)).array();
+						final char[] password= charset.decode(ByteBuffer.wrap(array)).array();
 						passwordCallback.setPassword(password);
 						Arrays.fill(array, (byte) 0);
 						Arrays.fill(password, (char) 0);
@@ -363,8 +366,8 @@
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof TextInputCallback) {
-	//				final TextInputCallback inputCallback = (TextInputCallback) callback;
-					complete = false;
+	//				final TextInputCallback inputCallback= (TextInputCallback) callback;
+					complete= false;
 					continue ITER_CALLBACKS;
 				}
 			}
@@ -376,36 +379,36 @@
 		}
 	}
 	
-	private boolean saveData(final Callback[] callbacks, final ISecurePreferences node) {
+	private boolean saveData(final Callback[] callbacks, final @Nullable ISecurePreferences node) {
 		if (node == null) {
 			return false;
 		}
 		try {
-			int nameCount = 0;
-			int passwordCount = 0;
-			boolean complete = true;
-			final Charset charset = Charset.forName(SECURE_PREF_CHARSET);
+			int nameCount= 0;
+			int passwordCount= 0;
+			boolean complete= true;
+			final Charset charset= Charset.forName(SECURE_PREF_CHARSET);
 			ITER_CALLBACKS: for (final Callback callback : callbacks) {
 				if (callback instanceof TextOutputCallback) {
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof NameCallback) {
-					final NameCallback nameCallback = (NameCallback) callback;
+					final NameCallback nameCallback= (NameCallback) callback;
 					node.put(SECURE_PREF_NAME_KEY + nameCount++, nameCallback.getName(), true);
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof PasswordCallback) {
-					final PasswordCallback passwordCallback = (PasswordCallback) callback;
-					final char[] password = passwordCallback.getPassword();
-					final byte[] array = charset.encode(CharBuffer.wrap(password)).array();
+					final PasswordCallback passwordCallback= (PasswordCallback) callback;
+					final char[] password= passwordCallback.getPassword();
+					final byte[] array= charset.encode(CharBuffer.wrap(password)).array();
 					node.putByteArray(SECURE_PREF_PASSWORD_KEY + passwordCount++, array, true);
 					Arrays.fill(password, (char) 0);
 					Arrays.fill(array, (byte) 0);
 					continue ITER_CALLBACKS;
 				}
 				if (callback instanceof TextInputCallback) {
-	//				final TextInputCallback inputCallback = (TextInputCallback) callback;
-					complete = false;
+	//				final TextInputCallback inputCallback= (TextInputCallback) callback;
+					complete= false;
 					continue ITER_CALLBACKS;
 				}
 			}
@@ -418,17 +421,17 @@
 	}
 	
 	private @Nullable ISecurePreferences getDataNode(final ToolProcess process,
-			final Map<String, Object> data, final boolean create) {
-		final String id = ToolCommandHandlerUtils.getCheckedData(data, LOGIN_ADDRESS_DATA_KEY, String.class, false);
+			final ToolCommandData data, final boolean create) {
+		final String id= data.getString(LOGIN_ADDRESS_DATA_KEY);
 		if (id == null) {
 			return null;
 		}
-		final ISecurePreferences store = SecurePreferencesFactory.getDefault();
+		final ISecurePreferences store= SecurePreferencesFactory.getDefault();
 		if (store == null) {
 			return null;
 		}
 		
-		final String path = SECURE_PREF_ROOT + '/' +
+		final String path= SECURE_PREF_ROOT + '/' +
 				EncodingUtils.encodeSlashes(process.getMainType()) + '/' +
 				EncodingUtils.encodeSlashes(id);
 		if (!create && !store.nodeExists(path)) {
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/QuitHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/QuitHandler.java
index 89a24ab..9351da0 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/QuitHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/QuitHandler.java
@@ -19,7 +19,6 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -30,13 +29,14 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
 import org.eclipse.statet.jcommons.ts.core.Tool;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
-import org.eclipse.statet.jcommons.ts.core.ToolService;
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
@@ -46,13 +46,14 @@
 import org.eclipse.statet.nico.core.runtime.IToolEventHandler;
 import org.eclipse.statet.nico.core.runtime.ToolController;
 import org.eclipse.statet.nico.core.runtime.ToolProcess;
+import org.eclipse.statet.nico.core.util.AbstractConsoleCommandHandler;
 import org.eclipse.statet.nico.ui.NicoUI;
 
 
 /**
  * @see IToolEventHandler#SCHEDULE_QUIT_EVENT_ID
  */
-public class QuitHandler implements IToolEventHandler {
+public class QuitHandler extends AbstractConsoleCommandHandler implements IToolEventHandler {
 	
 	
 	private static class UIRunnable implements Runnable {
@@ -98,14 +99,15 @@
 		
 	}
 	
+	
 	@Override
-	public Status execute(final String id, final ToolService service, final Map<String, Object> data,
+	@NonNullByDefault
+	public Status execute(final String id, final ConsoleService service, final ToolCommandData data,
 			final ProgressMonitor m) {
-		final ConsoleService console= (ConsoleService) service;
 		if (PlatformUI.getWorkbench().isClosing()) {
-			final ToolController controller= console.getController();
+			final ToolController controller= service.getController();
 			if (controller != null) {
-				if (console.getTool().isProvidingFeatureSet(IRemoteEngineController.FEATURE_SET_ID)) {
+				if (service.getTool().isProvidingFeatureSet(IRemoteEngineController.FEATURE_SET_ID)) {
 					try {
 						((IRemoteEngineController) controller).disconnect(m);
 						return CANCEL_STATUS;
@@ -121,13 +123,13 @@
 			return CANCEL_STATUS;
 		}
 		
-		final List<ToolRunnable> quitRunnables= (List<ToolRunnable>) data.get("scheduledQuitRunnables");
+		final List<ToolRunnable> quitRunnables= data.getRequired("scheduledQuitRunnables", List.class);
 		if (quitRunnables.isEmpty()) {
 			return OK_STATUS; // run default= schedule quit
 		}
 		
 		final UIRunnable runner= new UIRunnable();
-		runner.controller= console.getController();
+		runner.controller= service.getController();
 		final ToolProcess process= runner.controller.getTool();
 		runner.dialogTitle= NLS.bind(Messages.TerminatingMonitor_title, process.getLabel(Tool.DEFAULT_LABEL));
 		runner.dialogMessage= NLS.bind(Messages.TerminatingMonitor_message, process.getLabel(Tool.LONG_LABEL));
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ReportStatusHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ReportStatusHandler.java
index 8dbc952..fc3a421 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ReportStatusHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/ReportStatusHandler.java
@@ -19,7 +19,6 @@
 import static org.eclipse.statet.nico.core.runtime.IToolEventHandler.REPORT_STATUS_DATA_KEY;
 
 import java.util.List;
-import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.eclipse.core.runtime.CoreException;
@@ -28,23 +27,25 @@
 import org.eclipse.ui.statushandlers.StatusManager;
 
 import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
-import org.eclipse.statet.internal.nico.ui.AbstractConsoleCommandHandler;
 import org.eclipse.statet.nico.core.NicoCore;
 import org.eclipse.statet.nico.core.NicoCoreMessages;
 import org.eclipse.statet.nico.core.runtime.ConsoleService;
 import org.eclipse.statet.nico.core.runtime.IToolEventHandler;
 import org.eclipse.statet.nico.core.runtime.ToolStreamMonitor;
+import org.eclipse.statet.nico.core.util.AbstractConsoleCommandHandler;
 
 
 /**
  * @see {@link IToolEventHandler#REPORT_STATUS_EVENT_ID}
  */
+@NonNullByDefault
 public class ReportStatusHandler extends AbstractConsoleCommandHandler {
 	
 	
@@ -52,10 +53,14 @@
 	private static final String INDENT= "    "; //$NON-NLS-1$
 	
 	
+	public ReportStatusHandler() {
+	}
+	
+	
 	@Override
-	public Status execute(final String id, final ConsoleService service, final Map<String, Object> data,
+	public Status execute(final String id, final ConsoleService service, final ToolCommandData data,
 			final ProgressMonitor m) {
-		final Status status= ToolCommandHandlerUtils.getCheckedData(data, REPORT_STATUS_DATA_KEY, Status.class, false);
+		final Status status= data.get(REPORT_STATUS_DATA_KEY, Status.class);
 		if (status != null) {
 			final String br= service.getWorkspaceData().getLineSeparator();
 			final String br1= br + INDENT;
diff --git a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/RunBlockingHandler.java b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/RunBlockingHandler.java
index 2ea4f6a..78e4085 100644
--- a/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/RunBlockingHandler.java
+++ b/r/org.eclipse.statet.nico.ui/src/org/eclipse/statet/nico/ui/util/RunBlockingHandler.java
@@ -18,7 +18,6 @@
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -27,14 +26,15 @@
 import org.eclipse.ui.progress.IProgressService;
 import org.eclipse.ui.statushandlers.StatusManager;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ErrorStatus;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
 
 import org.eclipse.statet.internal.nico.ui.Messages;
 import org.eclipse.statet.nico.core.NicoCore;
@@ -44,14 +44,19 @@
 /**
  * @see IToolEventHandler#RUN_BLOCKING_EVENT_ID
  */
+@NonNullByDefault
 public class RunBlockingHandler implements IToolEventHandler {
 	
 	
+	public RunBlockingHandler() {
+	}
+	
+	
 	@Override
-	public Status execute(final String id, final ToolService service, final Map<String, Object> data,
+	public Status execute(final String id, final ToolService service, final ToolCommandData data,
 			final ProgressMonitor m) {
-		final IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
-		final ToolRunnable toolRunnable = ToolCommandHandlerUtils.getCheckedData(data, RUN_RUNNABLE_DATA_KEY, ToolRunnable.class, true);
+		final IProgressService progressService= PlatformUI.getWorkbench().getProgressService();
+		final ToolRunnable toolRunnable= data.getRequired(RUN_RUNNABLE_DATA_KEY, ToolRunnable.class);
 		try {
 			progressService.busyCursorWhile(new IRunnableWithProgress() {
 				@Override
@@ -68,7 +73,7 @@
 			return OK_STATUS;
 		}
 		catch (final InvocationTargetException e) {
-			final Throwable targetException = e.getCause();
+			final Throwable targetException= e.getCause();
 			if (targetException instanceof StatusException
 					&& ((StatusException) targetException).getStatus().getSeverity() == Status.CANCEL) {
 				return CANCEL_STATUS;
diff --git a/r/org.eclipse.statet.r.apps/META-INF/MANIFEST.MF b/r/org.eclipse.statet.r.apps/META-INF/MANIFEST.MF
index c2c82bf..8b90c13 100644
--- a/r/org.eclipse.statet.r.apps/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.r.apps/META-INF/MANIFEST.MF
@@ -29,6 +29,5 @@
  org.eclipse.statet.jcommons.collections;version="4.5.0",
  org.eclipse.statet.jcommons.lang;version="4.5.0",
  org.eclipse.statet.jcommons.status;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core.util;version="4.5.0"
+ org.eclipse.statet.jcommons.ts.core;version="4.5.0"
 Export-Package: org.eclipse.statet.r.apps.ui
diff --git a/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRCommandHandler.java b/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRCommandHandler.java
index ad746f7..14efa34 100644
--- a/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRCommandHandler.java
+++ b/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRCommandHandler.java
@@ -16,14 +16,12 @@
 
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
-import java.util.Map;
-
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.nico.core.runtime.ToolController;
 import org.eclipse.statet.r.console.core.RProcess;
@@ -63,27 +61,34 @@
 	
 	
 	@Override
-	protected Status execute(final String id, final RToolService r,
-			final Map<String, Object> data,
+	protected Status execute(final String id, final RToolService r, final ToolCommandData data,
 			final ProgressMonitor m) throws StatusException {
-		if (id.equals(ON_APP_STARTED_ID)) {
-			if (this.currentRunner != null) {
-				this.currentRunner.onAppStarted(
-						ToolCommandHandlerUtils.getCheckedData(data, "url", String.class, false), //$NON-NLS-1$
-						ToolCommandHandlerUtils.getCheckedData(data, "typeId", String.class, false) ); //$NON-NLS-1$
+		final var currentRunner= this.currentRunner;
+		
+		switch (id) {
+		case ON_APP_STARTED_ID:
+			if (currentRunner != null) {
+				currentRunner.onAppStarted(
+						data.getStringRequired("url"), //$NON-NLS-1$
+						data.getString("typeId") ); //$NON-NLS-1$
 			}
-		}
-		if (id.equals(ON_APP_STOPPED_ID)) {
-			if (this.currentRunner != null) {
-				this.currentRunner.onAppStopped(
-						ToolCommandHandlerUtils.getCheckedData(data, "url", String.class, false) ); //$NON-NLS-1$
+			return OK_STATUS;
+			
+		case ON_APP_STOPPED_ID:
+			if (currentRunner != null) {
+				currentRunner.onAppStopped(
+						data.getString("url") ); //$NON-NLS-1$
 			}
+			return OK_STATUS;
+			
+		default:
+			throw new UnsupportedOperationException();
 		}
-		return OK_STATUS;
 	}
 	
 	void disconnect(final AppRunner runner) {
-		if (this.currentRunner == runner) {
+		final var currentRunner= this.currentRunner;
+		if (currentRunner == runner) {
 			this.currentRunner= null;
 		}
 	}
diff --git a/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRunner.java b/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRunner.java
index 8355ae6..3170cd5 100644
--- a/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRunner.java
+++ b/r/org.eclipse.statet.r.apps/src/org/eclipse/statet/internal/r/apps/ui/launching/AppRunner.java
@@ -44,6 +44,7 @@
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
+import org.eclipse.statet.jcommons.ts.core.BasicToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.RunnableStatus;
 import org.eclipse.statet.jcommons.ts.core.Tool;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
@@ -144,7 +145,8 @@
 						final Map<String, Object> connectionInfo= this.rProcess.getConnectionInfo();
 						if (connectionInfo != null && Objects.equals(connectionInfo.get("protocol"), "ssh")) {
 							this.remoteHost= LOCALHOST;
-							this.sshSession= RjsUtil.getSession(connectionInfo, m);
+							this.sshSession= RjsUtil
+									.getSession(new BasicToolCommandData(connectionInfo), m);
 						}
 					}
 					else {
diff --git a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RTermController.java b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RTermController.java
index b576d1c..f0d6111 100644
--- a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RTermController.java
+++ b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RTermController.java
@@ -24,7 +24,6 @@
 import java.io.OutputStreamWriter;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -45,6 +44,8 @@
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
+import org.eclipse.statet.jcommons.ts.core.BasicToolCommandData;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
@@ -309,7 +310,8 @@
 		final ToolCommandHandler handler= getCommandHandler(RUN_BLOCKING_EVENT_ID);
 		if (handler != null) {
 			final RTermCancelRunnable cancelRunnable= new RTermCancelRunnable();
-			final Map<String, Object> data= Collections.singletonMap(RUN_RUNNABLE_DATA_KEY, (Object) cancelRunnable);
+			final ToolCommandData data= new BasicToolCommandData(Map.of(
+					RUN_RUNNABLE_DATA_KEY, cancelRunnable ));
 			final Status status= executeHandler(RUN_BLOCKING_EVENT_ID, handler, data, null);
 			return (status != null && status.getSeverity() == Status.OK);
 		}
diff --git a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsController.java b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsController.java
index cc8201b..a8d1b31 100644
--- a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsController.java
+++ b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsController.java
@@ -28,7 +28,6 @@
 import java.rmi.RemoteException;
 import java.rmi.registry.Registry;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +46,7 @@
 import org.eclipse.osgi.util.NLS;
 
 import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.lang.SystemUtils;
 import org.eclipse.statet.jcommons.rmi.RMIAddress;
@@ -57,6 +57,8 @@
 import org.eclipse.statet.jcommons.status.Status;
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
+import org.eclipse.statet.jcommons.ts.core.BasicToolCommandData;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;
 import org.eclipse.statet.jcommons.ts.core.ToolRunnable;
 import org.eclipse.statet.jcommons.ts.core.ToolService;
@@ -101,7 +103,6 @@
 import org.eclipse.statet.r.nico.IRSrcref;
 import org.eclipse.statet.r.nico.RWorkspaceConfig;
 import org.eclipse.statet.rj.RjException;
-import org.eclipse.statet.rj.data.RDataJConverter;
 import org.eclipse.statet.rj.data.REnvironment;
 import org.eclipse.statet.rj.data.RLanguage;
 import org.eclipse.statet.rj.data.RList;
@@ -146,6 +147,7 @@
 import org.eclipse.statet.rj.services.RPlatform;
 import org.eclipse.statet.rj.services.RServiceControlExtension;
 import org.eclipse.statet.rj.ts.core.RTool;
+import org.eclipse.statet.rj.ts.core.util.RjToolCommandData;
 
 
 /**
@@ -244,9 +246,9 @@
 		@Override
 		protected void initGraphicFactory() {
 			final ToolCommandHandler handler= getCommandHandler(INIT_RGRAPHIC_FACTORY_HANDLER_ID);
-			final Map<String, Object> data= new HashMap<>();
+			final ToolCommandData data= new BasicToolCommandData();
 			final Status status= executeHandler(INIT_RGRAPHIC_FACTORY_HANDLER_ID, handler, data, null);
-			final RClientGraphicFactory factory= (RClientGraphicFactory) data.get("factory"); //$NON-NLS-1$
+			final RClientGraphicFactory factory= data.get("factory", RClientGraphicFactory.class); //$NON-NLS-1$
 			if (status != null && status.getSeverity() < Status.ERROR && factory != null) {
 				setGraphicFactory(factory, new ERClientGraphicActions(this, getTool()));
 			}
@@ -307,9 +309,8 @@
 		
 		@Override
 		protected RList handleUICallback(String commandId, final RList args,
+				final boolean acceptsAnswer,
 				final ProgressMonitor m) throws Exception {
-			// TODO: allow handlers to use RJ data objects
-			// TODO: allow handlers to return values
 			// TODO: provide extension point for event handlers
 			ToolCommandHandler handler= getCommandHandler(commandId);
 			if (handler == null && commandId.startsWith("r/")) {
@@ -320,18 +321,13 @@
 				}
 			}
 			if (handler != null) {
-				final RDataJConverter converter= new RDataJConverter();
-				converter.setKeepArray1(false);
-				converter.setRObjectFactory(RjsController.this.fRObjectFactory);
-				
-				final Map<String, Object> javaArgs= new HashMap<>();
-				if (args != null) {
-					for (int i= 0; i < args.getLength(); i++) {
-						javaArgs.put(args.getName(i), converter.toJava(args.get(i)));
+				final var data= new RjToolCommandData(args) {
+					@NonNull RList getAnswer() {
+						return getRJReturnData(RjsController.this.fRObjectFactory);
 					}
-				}
+				};
 				
-				final Status status= handler.execute(commandId, RjsController.this, javaArgs, m);
+				final Status status= handler.execute(commandId, RjsController.this, data, m);
 				switch (status.getSeverity()) {
 				case Status.OK:
 					break;
@@ -339,22 +335,15 @@
 					throw new StatusException(status);
 				}
 				
-				Map<String, Object> javaAnswer= null;
-				if (commandId.equals("common/chooseFile")) { //$NON-NLS-1$
-					javaAnswer= Collections.singletonMap(
-							"filename", javaArgs.get("filename") ); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				
-				if (javaAnswer != null) {
-					final RList answer= (RList) converter.toRJ(javaAnswer);
-					return answer;
+				if (acceptsAnswer && data.hasReturnData()) {
+					return data.getAnswer();
 				}
 				else {
 					return null;
 				}
 			}
 			
-			return super.handleUICallback(commandId, args, m);
+			return super.handleUICallback(commandId, args, acceptsAnswer, m);
 		}
 		
 		@Override
@@ -582,38 +571,44 @@
 		this.fRjsId= RjsComConfig.registerClientComHandler(this.fRjs);
 		this.fRjs.initClient(getTool(), this, this.rjsProperties, this.fRjsId);
 		try {
-			final Map<String, Object> data= new HashMap<>();
 			final ToolCommandHandler loginHandler= getCommandHandler(LOGIN_REQUEST_EVENT_ID);
 			String msg= null;
 			boolean connected= false;
+			int attempt= 0;
 			while (!connected) {
 				final Map<String, Object> connectionInfo= getTool().getConnectionInfo();
 				final ServerLogin login= this.rjsConnection.getServer().createLogin(Server.C_CONSOLE_CONNECT);
 				try {
+					final ToolCommandData data;
 					final ImList<Callback> callbacks= login.getCallbacks();
 					if (!callbacks.isEmpty()) {
+						if (loginHandler == null) {
+							throw new StatusException(new ErrorStatus(RConsoleCorePlugin.BUNDLE_ID,
+									"Login requested but not supported by this configuration." ));
+						}
+						
 						final List<Callback> checked= new ArrayList<>();
 						FxCallback fx= null;
 						for (final Callback callback : callbacks) {
 							if (callback instanceof FxCallback) {
-								fx= (FxCallback) callback;
+								fx= (FxCallback)callback;
 							}
 							else {
 								checked.add(callback);
 							}
 						}
 						
-						if (connectionInfo != null) {
-							data.putAll(connectionInfo);
+						{	final var dataMap= new HashMap<String, Object>();
+							if (connectionInfo != null) {
+								dataMap.putAll(connectionInfo);
+							}
+							dataMap.put(LOGIN_ADDRESS_DATA_KEY, (fx != null) ? this.address.getHost() : this.address.getAddress());
+							dataMap.put(LOGIN_MESSAGE_DATA_KEY, msg);
+							dataMap.put(LOGIN_CALLBACKS_DATA_KEY, checked.toArray(new Callback[checked.size()]));
+							dataMap.put("attempt", ++attempt);
+							data= new BasicToolCommandData(dataMap);
 						}
-						data.put(LOGIN_ADDRESS_DATA_KEY, (fx != null) ? this.address.getHost() : this.address.getAddress());
-						data.put(LOGIN_MESSAGE_DATA_KEY, msg);
-						data.put(LOGIN_CALLBACKS_DATA_KEY, checked.toArray(new Callback[checked.size()]));
 						
-						if (loginHandler == null) {
-							throw new StatusException(new ErrorStatus(RConsoleCorePlugin.BUNDLE_ID,
-									"Login requested but not supported by this configuration." ));
-						}
 						if (loginHandler.execute(LOGIN_REQUEST_EVENT_ID, this, data, m).getSeverity() != Status.OK) {
 							throw new StatusException(Status.CANCEL_STATUS);
 						}
@@ -624,6 +619,9 @@
 									fx, m.newSubMonitor(1) );
 						}
 					}
+					else {
+						data= null;
+					}
 					
 					msg= null;
 					m.checkCanceled();
@@ -633,18 +631,20 @@
 					REngine rjServer;
 					if ((this.rjsFlags & RJS_SETUP_CONSOLE) != 0) {
 						args.put("args", this.rArgs); //$NON-NLS-1$
-						rjServer= (REngine) this.rjsConnection.getServer().execute(Server.C_CONSOLE_START, args, login.createAnswer());
+						rjServer= (REngine)this.rjsConnection.getServer().execute(
+								Server.C_CONSOLE_START, args, login.createAnswer() );
 					}
 					else {
-						rjServer= (REngine) this.rjsConnection.getServer().execute(Server.C_CONSOLE_CONNECT, args, login.createAnswer());
+						rjServer= (REngine)this.rjsConnection.getServer().execute(
+								Server.C_CONSOLE_CONNECT, args, login.createAnswer() );
 					}
 					this.fRjs.setServer(rjServer, 0);
 					connected= true;
 					
-					if (!callbacks.isEmpty()) {
+					if (data != null) {
 						loginHandler.execute(LOGIN_OK_EVENT_ID, this, data, m);
 						if (connectionInfo != null) {
-							connectionInfo.put(LOGIN_USERNAME_DATA_KEY, data.get(LOGIN_USERNAME_DATA_KEY));
+							connectionInfo.put(LOGIN_USERNAME_DATA_KEY, data.getString(LOGIN_USERNAME_DATA_KEY));
 						}
 					}
 				}
diff --git a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsUtil.java b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsUtil.java
index 2545b8f..d658bdb 100644
--- a/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsUtil.java
+++ b/r/org.eclipse.statet.r.console.core/src/org/eclipse/statet/r/nico/impl/RjsUtil.java
@@ -54,6 +54,7 @@
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.ecommons.net.ssh.core.ISshSessionService;
 
@@ -65,7 +66,8 @@
 public class RjsUtil {
 	
 	
-	public static Session getSession(final Map<String, Object> loginData, final IProgressMonitor monitor) throws CoreException {
+	public static Session getSession(final Map<String, Object> loginData,
+			final IProgressMonitor monitor) throws CoreException {
 		final String username= (String)loginData.get(LOGIN_USERNAME_DATA_KEY);
 		final String sshHost= (String)loginData.get(LOGIN_SSH_HOST_DATA_KEY);
 		final Integer sshPort= (Integer)loginData.get(LOGIN_SSH_PORT_DATA_KEY);
@@ -75,14 +77,14 @@
 				monitor );
 	}
 	
-	public static Session getSession(final Map<String, Object> loginData, final ProgressMonitor m) throws StatusException {
-		final String username= (String)loginData.get(LOGIN_USERNAME_DATA_KEY);
-		final String sshHost= (String)loginData.get(LOGIN_SSH_HOST_DATA_KEY);
-		final Integer sshPort= (Integer)loginData.get(LOGIN_SSH_PORT_DATA_KEY);
+	public static Session getSession(final ToolCommandData loginData,
+			final ProgressMonitor m) throws StatusException {
+		final String username= loginData.getStringRequired(LOGIN_USERNAME_DATA_KEY);
+		final String sshHost= loginData.getStringRequired(LOGIN_SSH_HOST_DATA_KEY);
+		final int sshPort= loginData.getInt(LOGIN_SSH_PORT_DATA_KEY, ISshSessionService.SSH_DEFAULT_PORT);
 		
 		try {
-			return StatetCore.getSshSessionManager().getSshSession(
-					username, sshHost, (sshPort != null) ? sshPort.intValue() : ISshSessionService.SSH_DEFAULT_PORT,
+			return StatetCore.getSshSessionManager().getSshSession(username, sshHost, sshPort,
 					EStatusUtils.convert(m) );
 		}
 		catch (final CoreException e) {
diff --git a/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/r/console/ui/launching/RConsoleLaunching.java b/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/r/console/ui/launching/RConsoleLaunching.java
index 403f0fe..d0e64db 100644
--- a/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/r/console/ui/launching/RConsoleLaunching.java
+++ b/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/r/console/ui/launching/RConsoleLaunching.java
@@ -30,7 +30,7 @@
 import org.eclipse.statet.nico.ui.util.RunBlockingHandler;
 import org.eclipse.statet.r.console.core.AbstractRController;
 import org.eclipse.statet.r.core.RUtil;
-import org.eclipse.statet.r.ui.dataeditor.ShowElementCommandHandler;
+import org.eclipse.statet.r.ui.dataeditor.ShowRElementCommandHandler;
 import org.eclipse.statet.r.ui.graphics.RGraphicCommandHandler;
 import org.eclipse.statet.r.ui.pkgmanager.RPkgUICommandHandler;
 import org.eclipse.statet.r.ui.rhelp.RHelpUICommandHandler;
@@ -113,24 +113,30 @@
 		controller.addCommandHandler(IToolEventHandler.SCHEDULE_QUIT_EVENT_ID, new QuitHandler());
 		controller.addCommandHandler(IToolEventHandler.RUN_BLOCKING_EVENT_ID, new RunBlockingHandler());
 		controller.addCommandHandler(IToolEventHandler.REPORT_STATUS_EVENT_ID, new ReportStatusHandler());
+		
 		{	final ToolCommandHandler handler = new HistoryOperationsHandler();
-			controller.addCommandHandler(HistoryOperationsHandler.LOAD_HISTORY_ID, handler);
-			controller.addCommandHandler(HistoryOperationsHandler.SAVE_HISTORY_ID, handler);
-			controller.addCommandHandler(HistoryOperationsHandler.ADDTO_HISTORY_ID, handler);
-			controller.addCommandHandler(ChooseFileHandler.CHOOSE_FILE_ID, new ChooseFileHandler());
+			controller.addCommandHandler(HistoryOperationsHandler.LOAD_HISTORY_COMMAND_ID, handler);
+			controller.addCommandHandler(HistoryOperationsHandler.SAVE_HISTORY_COMMAND_ID, handler);
+			controller.addCommandHandler(HistoryOperationsHandler.ADDTO_HISTORY_COMMAND_ID, handler);
+		}
+		{	final ToolCommandHandler handler= new ChooseFileHandler();
+			controller.addCommandHandler(ChooseFileHandler.CHOOSE_FILE_COMMAND_ID, handler);
 		}
 		{	final ToolCommandHandler handler = new EclipseIDEOperationsHandler();
-			controller.addCommandHandler(EclipseIDEOperationsHandler.SHOW_FILE_ID, handler);
-			controller.addCommandHandler(EclipseIDEOperationsHandler.SHOW_HISTORY_ID, handler);
+			controller.addCommandHandler(EclipseIDEOperationsHandler.OPEN_FILE_COMMAND_ID, handler);
+			controller.addCommandHandler(EclipseIDEOperationsHandler.OPEN_FILE_COMMAND_OLD_ID, handler);
+			controller.addCommandHandler(EclipseIDEOperationsHandler.SHOW_HISTORY_COMMAND_ID, handler);
 		}
-		{	final ToolCommandHandler handler = new ShowElementCommandHandler();
-			controller.addCommandHandler(ShowElementCommandHandler.SHOW_ELEMENT_COMMAND_ID, handler);
+		{	final ToolCommandHandler handler = new ShowRElementCommandHandler();
+			controller.addCommandHandler(ShowRElementCommandHandler.SHOW_ELEMENT_COMMAND_ID, handler);
+			controller.addCommandHandler(ShowRElementCommandHandler.SHOW_ELEMENT_COMMAND_OLD_ID, handler);
 		}
 		{	final ToolCommandHandler handler = new RGraphicCommandHandler();
 			controller.addCommandHandler(AbstractRController.INIT_RGRAPHIC_FACTORY_HANDLER_ID, handler);
 		}
 		{	final ToolCommandHandler handler = new RHelpUICommandHandler();
 			controller.addCommandHandler(RHelpUICommandHandler.SHOW_HELP_COMMAND_ID, handler);
+			controller.addCommandHandler(RHelpUICommandHandler.SHOW_HELP_COMMAND_OLD_ID, handler);
 		}
 		if (controller.getTool().getREnv() != null) {
 			final ToolCommandHandler handler = new RPkgUICommandHandler();
diff --git a/r/org.eclipse.statet.r.ui/META-INF/MANIFEST.MF b/r/org.eclipse.statet.r.ui/META-INF/MANIFEST.MF
index 58d8a10..43b5297 100644
--- a/r/org.eclipse.statet.r.ui/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.r.ui/META-INF/MANIFEST.MF
@@ -67,7 +67,6 @@
  org.eclipse.statet.jcommons.text.core.input;version="4.5.0",
  org.eclipse.statet.jcommons.text.core.util;version="4.5.0",
  org.eclipse.statet.jcommons.ts.core;version="4.5.0",
- org.eclipse.statet.jcommons.ts.core.util;version="4.5.0",
  org.eclipse.statet.rj.renv.core;version="4.5.0"
 Export-Package: org.eclipse.statet.internal.r.objectbrowser;x-internal:=true,
  org.eclipse.statet.internal.r.ui;x-friends:="org.eclipse.statet.redocs.tex.r,org.eclipse.statet.redocs.wikitext.r",
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/RDataEditor.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/RDataEditor.java
index d3253e7..b076221 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/RDataEditor.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/RDataEditor.java
@@ -23,6 +23,7 @@
 import org.eclipse.ui.statushandlers.StatusManager;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.r.core.model.RElementName;
 import org.eclipse.statet.r.ui.RUI;
@@ -67,13 +68,14 @@
 	}
 	
 	public static void open(final IWorkbenchPage page, final RTool tool,
-			final RElementName elementName, final long[] indexes) {
+			final RElementName elementName,
+			final long @Nullable [] indexes) {
 		open(page, elementName, createFQRef(tool, elementName), indexes);
 	}
 	
 	public static void open(final IWorkbenchPage page,
 			final RElementName elementName, final FQRObjectRef<? extends RTool> elementRef,
-			final long[] indexes) {
+			final long @Nullable [] indexes) {
 		try {
 			final IEditorPart editor= IDE.openEditor(page,
 					new RLiveDataEditorInput(elementName, elementRef),
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowElementCommandHandler.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowRElementCommandHandler.java
similarity index 78%
rename from r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowElementCommandHandler.java
rename to r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowRElementCommandHandler.java
index 682e8ff..92036fe 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowElementCommandHandler.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/dataeditor/ShowRElementCommandHandler.java
@@ -16,7 +16,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.ui.IWorkbenchPage;
 
@@ -26,7 +25,7 @@
 import org.eclipse.statet.jcommons.status.StatusException;
 import org.eclipse.statet.jcommons.ts.core.SystemRunnable;
 import org.eclipse.statet.jcommons.ts.core.Tool;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
 
@@ -42,7 +41,7 @@
 
 
 @NonNullByDefault
-public class ShowElementCommandHandler extends AbstractRToolCommandHandler {
+public class ShowRElementCommandHandler extends AbstractRToolCommandHandler {
 	
 	
 	private static class CheckRunnable extends AbstractRToolRunnable implements SystemRunnable {
@@ -106,32 +105,38 @@
 	}
 	
 	
-	public static final String SHOW_ELEMENT_COMMAND_ID= "showElement"; //$NON-NLS-1$
+	public static final String SHOW_ELEMENT_COMMAND_ID= "r/showElement"; //$NON-NLS-1$
+	@Deprecated
+	public static final String SHOW_ELEMENT_COMMAND_OLD_ID= "showElement"; //$NON-NLS-1$
 	
 	
-	public ShowElementCommandHandler() {
+	public ShowRElementCommandHandler() {
 	}
 	
 	
 	@Override
-	public Status execute(final String id, final RToolService r, final Map<String, Object> data,
+	public Status execute(final String id, final RToolService r, final ToolCommandData data,
 			final ProgressMonitor m) throws StatusException {
-		if (id.equals(SHOW_ELEMENT_COMMAND_ID)) {
-			final RTool tool= r.getTool();
-			final String elementName= ToolCommandHandlerUtils.getCheckedData(data, "elementName",
-					String.class, true); 
-			final RElementName rElementName= RElementName.parseDefault(elementName);
-			if (rElementName != null) {
-				if (rElementName.getScope() != null) {
-					doOpen(tool, rElementName);
+		switch (id) {
+		case SHOW_ELEMENT_COMMAND_ID:
+		case SHOW_ELEMENT_COMMAND_OLD_ID:
+			{	final RTool tool= r.getTool();
+				final String elementName= data.getStringRequired("elementName");
+				final RElementName rElementName= RElementName.parseDefault(elementName);
+				if (rElementName != null) {
+					if (rElementName.getScope() != null) {
+						doOpen(tool, rElementName);
+					}
+					else {
+						tool.getQueue().addHot(new CheckRunnable(tool, rElementName));
+					}
 				}
-				else {
-					tool.getQueue().addHot(new CheckRunnable(tool, rElementName));
-				}
+				return Status.OK_STATUS;
 			}
-			return Status.OK_STATUS;
+			
+		default:
+			throw new UnsupportedOperationException();
 		}
-		throw new UnsupportedOperationException();
 	}
 	
 }
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/graphics/RGraphicCommandHandler.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/graphics/RGraphicCommandHandler.java
index 43e82e2..d166ebf 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/graphics/RGraphicCommandHandler.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/graphics/RGraphicCommandHandler.java
@@ -16,16 +16,17 @@
 
 import static org.eclipse.statet.jcommons.status.Status.OK_STATUS;
 
-import java.util.Map;
-
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.internal.r.ui.RUIPlugin;
 import org.eclipse.statet.rj.ts.core.AbstractRToolCommandHandler;
 import org.eclipse.statet.rj.ts.core.RToolService;
 
 
+@NonNullByDefault
 public class RGraphicCommandHandler extends AbstractRToolCommandHandler {
 	
 	
@@ -34,9 +35,9 @@
 	
 	
 	@Override
-	public Status execute(final String id, final RToolService r, final Map<String, Object> data,
+	public Status execute(final String id, final RToolService r, final ToolCommandData data,
 			final ProgressMonitor m) {
-		data.put("factory", RUIPlugin.getInstance().getCommonRGraphicFactory()); //$NON-NLS-1$
+		data.setReturnData("factory", RUIPlugin.getInstance().getCommonRGraphicFactory()); //$NON-NLS-1$
 		
 		return OK_STATUS;
 	}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgManagerUI.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgManagerUI.java
index 06004be..fc16cc8 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgManagerUI.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgManagerUI.java
@@ -30,6 +30,7 @@
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 
+import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.status.ErrorStatus;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
@@ -81,7 +82,7 @@
 	}
 	
 	public static Status openDialog(final RProcess tool, final Shell parentShell,
-			final int requestFlags, final StartAction startAction) {
+			final int requestFlags, final @Nullable StartAction startAction) {
 		final IRPkgManager.Ext manager= (IRPkgManager.Ext) getPackageManager(tool);
 		if (manager == null) {
 			return new ErrorStatus(RUI.BUNDLE_ID, "", null);
@@ -116,7 +117,7 @@
 	
 	public static RPkgManagerDialog openDialog(final IRPkgManager.Ext manager,
 			final RProcess tool, final Shell parentShell,
-			final StartAction startAction) {
+			final @Nullable StartAction startAction) {
 		final REnv rEnv= manager.getREnv();
 		
 		RPkgManagerDialog dialog= DIALOGS.get(rEnv);
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgUICommandHandler.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgUICommandHandler.java
index c731bce..1c557b0 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgUICommandHandler.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/pkgmanager/RPkgUICommandHandler.java
@@ -14,12 +14,12 @@
 
 package org.eclipse.statet.r.ui.pkgmanager;
 
-import java.util.Map;
-
 import org.eclipse.ui.IWorkbenchPage;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
 import org.eclipse.statet.nico.ui.NicoUI;
 import org.eclipse.statet.r.console.core.RProcess;
@@ -27,6 +27,7 @@
 import org.eclipse.statet.rj.ts.core.RToolService;
 
 
+@NonNullByDefault
 public class RPkgUICommandHandler extends AbstractRToolCommandHandler {
 	
 	
@@ -38,16 +39,18 @@
 	
 	
 	@Override
-	public Status execute(final String id, final RToolService r, final Map<String, Object> data,
+	public Status execute(final String id, final RToolService r, final ToolCommandData data,
 			final ProgressMonitor m) {
-		if (id.equals(OPEN_PACKAGE_MANAGER_COMMAND_ID)) {
-			final RProcess process= (RProcess) r.getTool();
-			final IWorkbenchPage page= NicoUI.getToolRegistry().findWorkbenchPage(process);
+		switch (id) {
+		case OPEN_PACKAGE_MANAGER_COMMAND_ID:
+			final IWorkbenchPage page= NicoUI.getToolRegistry().findWorkbenchPage(r.getTool());
 			
-			return RPkgManagerUI.openDialog(process, page.getWorkbenchWindow().getShell(), 0, null);
+			return RPkgManagerUI.openDialog((RProcess)r.getTool(),
+					page.getWorkbenchWindow().getShell(), 0, null );
+			
+		default:
+			throw new UnsupportedOperationException();
 		}
-		
-		throw new UnsupportedOperationException();
 	}
 	
 }
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/OpenRHelpHandler.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/OpenRHelpHandler.java
index 74bf193..7dfa921 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/OpenRHelpHandler.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/OpenRHelpHandler.java
@@ -19,13 +19,15 @@
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eclipse.ui.statushandlers.StatusManager;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.jcommons.status.ErrorStatus;
+import org.eclipse.statet.jcommons.status.InfoStatus;
+import org.eclipse.statet.jcommons.status.Status;
+import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
 
 import org.eclipse.statet.ecommons.ui.mpbv.BrowserSession;
 import org.eclipse.statet.ecommons.ui.util.UIAccess;
@@ -88,10 +90,10 @@
 		}
 	}
 	
-	public @Nullable IStatus execute(final RTool rTool, final @Nullable String urlString) {
+	public @Nullable Status execute(final RTool rTool, final @Nullable String urlString) {
 		final REnv rEnv= rTool.getREnv();
 		if (rEnv == null) {
-			return null;
+			return new InfoStatus(RUI.BUNDLE_ID, "Not supported for this R tool.");
 		}
 		final URI url= getUrl(rEnv, urlString);
 		if (url == null) {
@@ -111,10 +113,10 @@
 				return Status.OK_STATUS;
 			}
 			catch (final CoreException e) {
-				final IStatus status= new Status(IStatus.ERROR, RUI.BUNDLE_ID,
+				final Status status= new ErrorStatus(RUI.BUNDLE_ID,
 						"An error occured when opening R help page in R help view.",
 						e );
-				StatusManager.getManager().handle(status);
+				StatusManager.getManager().handle(EStatusUtils.convert(status));
 				return status;
 			}
 		});
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/RHelpUICommandHandler.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/RHelpUICommandHandler.java
index 50e970b..4cde7a4 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/RHelpUICommandHandler.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/rhelp/RHelpUICommandHandler.java
@@ -14,25 +14,22 @@
 
 package org.eclipse.statet.r.ui.rhelp;
 
-import java.util.Map;
-
-import org.eclipse.statet.jcommons.status.ErrorStatus;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.status.ProgressMonitor;
 import org.eclipse.statet.jcommons.status.Status;
-import org.eclipse.statet.jcommons.status.eplatform.EStatusUtils;
-import org.eclipse.statet.jcommons.ts.core.util.ToolCommandHandlerUtils;
+import org.eclipse.statet.jcommons.ts.core.ToolCommandData;
 
-import org.eclipse.statet.r.console.core.RProcess;
-import org.eclipse.statet.r.ui.RUI;
-import org.eclipse.statet.rj.renv.core.REnv;
 import org.eclipse.statet.rj.ts.core.AbstractRToolCommandHandler;
 import org.eclipse.statet.rj.ts.core.RToolService;
 
 
+@NonNullByDefault
 public class RHelpUICommandHandler extends AbstractRToolCommandHandler {
 	
 	
-	public static final String SHOW_HELP_COMMAND_ID= "showHelp"; //$NON-NLS-1$
+	public static final String SHOW_HELP_COMMAND_ID= "org.eclipse.statet.r.rhelp.showHelp"; //$NON-NLS-1$
+	@Deprecated
+	public static final String SHOW_HELP_COMMAND_OLD_ID= "showHelp"; //$NON-NLS-1$
 	
 	
 	public RHelpUICommandHandler() {
@@ -40,31 +37,31 @@
 	
 	
 	@Override
-	public Status execute(final String id, final RToolService r, final Map<String, Object> data,
+	public Status execute(final String id, final RToolService r, final ToolCommandData data,
 			final ProgressMonitor m) {
-		if (id.equals(SHOW_HELP_COMMAND_ID)) {
-			String url= ToolCommandHandlerUtils.getCheckedData(data, "url", String.class, true);
-			if (url.startsWith("html:///")) { //$NON-NLS-1$
-				int idx= url.indexOf("<head"); //$NON-NLS-1$
-				if (idx >= 0) {
-					idx= url.indexOf('>', idx+5);
+		switch (id) {
+		case SHOW_HELP_COMMAND_ID:
+		case SHOW_HELP_COMMAND_OLD_ID:
+			{	String url= data.getStringRequired("url");
+				if (url.startsWith("html:///")) { //$NON-NLS-1$
+					int idx= url.indexOf("<head"); //$NON-NLS-1$
 					if (idx >= 0) {
-						idx++;
-						url= url.substring(0, idx) + "<base href=\"about:\"/>" + url.substring(idx); //$NON-NLS-1$
+						idx= url.indexOf('>', idx+5);
+						if (idx >= 0) {
+							idx++;
+							url= url.substring(0, idx) + "<base href=\"about:\"/>" + url.substring(idx); //$NON-NLS-1$
+						}
 					}
 				}
+				
+				final OpenRHelpHandler handler= new OpenRHelpHandler(true);
+				final Status status= handler.execute(r.getTool(), url);
+				return (status != null) ? status : Status.OK_STATUS;
 			}
 			
-			final RProcess process= (RProcess) r.getTool();
-			final REnv rEnv= process.getREnv();
-			if (rEnv == null) {
-				return new ErrorStatus(RUI.BUNDLE_ID, "Not supported.");
-			}
-			final OpenRHelpHandler handler= new OpenRHelpHandler(true);
-			return EStatusUtils.convert(handler.execute(process, url));
+		default:
+			throw new UnsupportedOperationException();
 		}
-		
-		throw new UnsupportedOperationException();
 	}
 	
 }