diff --git a/src/main/java/de/prob2/jupyter/Command.java b/src/main/java/de/prob2/jupyter/Command.java
index ee1361accd0fa0a7a9984fe7c81acafbd06dad36..01fccee5bdd5b9fc6a801eb77e5298d014016141 100644
--- a/src/main/java/de/prob2/jupyter/Command.java
+++ b/src/main/java/de/prob2/jupyter/Command.java
@@ -43,7 +43,7 @@ public interface Command {
 	
 	public abstract @Nullable DisplayData run(final @NotNull ParsedArguments args);
 	
-	public abstract @Nullable DisplayData inspect(final @NotNull String argString, final int at);
+	public abstract @NotNull ParameterInspectors getParameterInspectors();
 	
 	public abstract @Nullable ReplacementOptions complete(final @NotNull String argString, final int at);
 }
diff --git a/src/main/java/de/prob2/jupyter/CommandUtils.java b/src/main/java/de/prob2/jupyter/CommandUtils.java
index 10c97352290f59a9518756d325cf8c3fc867e95d..c36d84ecd2e2798039646a2f31de4cfa1d27ceff 100644
--- a/src/main/java/de/prob2/jupyter/CommandUtils.java
+++ b/src/main/java/de/prob2/jupyter/CommandUtils.java
@@ -90,7 +90,7 @@ public final class CommandUtils {
 		}
 	}
 	
-	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString) {
+	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString, final int upToPosition) {
 		final SplitArguments splitArgs = new SplitArguments(Collections.emptyMap());
 		PositionedString remainingArgs = new PositionedString(argString, 0);
 		if (parameters.getBodyParam().isPresent()) {
@@ -102,6 +102,7 @@ public final class CommandUtils {
 			}
 		}
 		
+		Parameter<?> parameterAtPosition = null;
 		for (int i = 0; i < parameters.getPositionalParameters().size();) {
 			final Parameter<?> param = parameters.getPositionalParameters().get(i);
 			if (remainingArgs.getValue().isEmpty()) {
@@ -112,12 +113,29 @@ public final class CommandUtils {
 			splitArgs.add(param, splitSingleArg.getSplitArg());
 			remainingArgs = splitSingleArg.getRemainingArgString();
 			
+			if (remainingArgs.getValue().isEmpty() || remainingArgs.getStartPosition() > upToPosition) {
+				parameterAtPosition = param;
+				break;
+			}
+			
 			if (!param.isRepeating()) {
 				i++;
 			}
 		}
 		
-		return new SplitResult(splitArgs, remainingArgs);
+		if (parameters.getBodyParam().isPresent() && splitArgs.containsKey(parameters.getBodyParam().get())) {
+			final List<PositionedString> bodyParamValues = splitArgs.get(parameters.getBodyParam().get());
+			assert bodyParamValues.size() == 1;
+			if (upToPosition >= bodyParamValues.get(0).getStartPosition()) {
+				parameterAtPosition = parameters.getBodyParam().get();
+			}
+		}
+		
+		return new SplitResult(splitArgs, parameterAtPosition, remainingArgs);
+	}
+	
+	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString) {
+		return splitArgs(parameters, argString, argString.length());
 	}
 	
 	private static <T> void validateSplitParameter(final @NotNull ParsedArguments parsed, final @NotNull SplitArguments splitArgs, final @NotNull Parameter<T> param) {
@@ -290,25 +308,6 @@ public final class CommandUtils {
 		);
 	}
 	
-	public static @Nullable DisplayData inspectArgs(final @NotNull String argString, final int at, final @NotNull Inspector @NotNull... inspectors) {
-		final Matcher argSplitMatcher = ARG_SPLIT_PATTERN.matcher(argString);
-		int argStart = 0;
-		int argEnd = argString.length();
-		int i = 0;
-		while (argSplitMatcher.find()) {
-			if (argSplitMatcher.end() > at) {
-				argEnd = argSplitMatcher.start();
-				break;
-			}
-			argStart = argSplitMatcher.end();
-			if (i >= inspectors.length-1) {
-				break;
-			}
-			i++;
-		}
-		return inspectors[i].inspect(argString.substring(argStart, argEnd), at - argStart);
-	}
-	
 	public static @Nullable ReplacementOptions completeArgs(final @NotNull String argString, final int at, final @NotNull Completer @NotNull... completers) {
 		final Matcher argSplitMatcher = ARG_SPLIT_PATTERN.matcher(argString);
 		int argStart = 0;
diff --git a/src/main/java/de/prob2/jupyter/ParameterInspectors.java b/src/main/java/de/prob2/jupyter/ParameterInspectors.java
new file mode 100644
index 0000000000000000000000000000000000000000..e848396c77a2e2b5bb15a280c66a9be54a4864aa
--- /dev/null
+++ b/src/main/java/de/prob2/jupyter/ParameterInspectors.java
@@ -0,0 +1,41 @@
+package de.prob2.jupyter;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import com.google.common.base.MoreObjects;
+
+import org.jetbrains.annotations.NotNull;
+
+public final class ParameterInspectors {
+	public static final @NotNull ParameterInspectors NONE = new ParameterInspectors(Collections.emptyMap());
+	
+	private final @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> inspectors;
+	
+	public ParameterInspectors(final @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> inspectors) {
+		super();
+		
+		this.inspectors = Collections.unmodifiableMap(new HashMap<>(inspectors));
+	}
+	
+	public @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> getInspectors() {
+		return this.inspectors;
+	}
+	
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(this)
+			.add("inspectors", this.getInspectors())
+			.toString();
+	}
+	
+	public @NotNull Optional<CommandUtils.Inspector> getInspectorForParameter(final @NotNull Parameter<?> parameter) {
+		if (this.getInspectors().containsKey(parameter)) {
+			return Optional.of(this.getInspectors().get(parameter));
+		} else {
+			return Optional.empty();
+		}
+	}
+}
diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java
index 9e6f0c46fd5bf179b06d4fe5bcbb900b903a47b1..b2c986437ef99fde95b885ba0041580da3c563f4 100644
--- a/src/main/java/de/prob2/jupyter/ProBKernel.java
+++ b/src/main/java/de/prob2/jupyter/ProBKernel.java
@@ -13,6 +13,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
@@ -353,6 +354,23 @@ public final class ProBKernel extends BaseKernel {
 		}
 	}
 	
+	private static @Nullable DisplayData inspectCommandArguments(final @NotNull Command command, final @NotNull String argString, final int at) {
+		final SplitResult split = CommandUtils.splitArgs(command.getParameters(), argString, at);
+		if (split.getParameterAtPosition().isPresent()) {
+			final Optional<CommandUtils.Inspector> inspector = command.getParameterInspectors().getInspectorForParameter(split.getParameterAtPosition().get());
+			if (inspector.isPresent()) {
+				final List<PositionedString> argsAtPosition = split.getArguments().get(split.getParameterAtPosition().get());
+				assert !argsAtPosition.isEmpty();
+				final PositionedString lastArgument = argsAtPosition.get(argsAtPosition.size() - 1);
+				return inspector.get().inspect(lastArgument.getValue(), at - lastArgument.getStartPosition());
+			} else {
+				return null;
+			}
+		} else {
+			return null;
+		}
+	}
+	
 	@Override
 	public @Nullable DisplayData inspect(final @NotNull String code, final int at, final boolean extraDetail) {
 		// Note: We ignore the extraDetail parameter, because in practice it is always false. This is because the inspect_request messages sent by Jupyter Notebook always have their detail_level set to 0.
@@ -373,7 +391,7 @@ public final class ProBKernel extends BaseKernel {
 					// The cursor is somewhere in the command arguments, ask the command to inspect.
 					assert name != null;
 					final String argString = commandMatcher.group(2) == null ? "" : commandMatcher.group(2);
-					return command.inspect(argString, at - argOffset);
+					return inspectCommandArguments(command, argString, at - argOffset);
 				}
 			} else {
 				// Invalid command, can't inspect.
@@ -381,7 +399,7 @@ public final class ProBKernel extends BaseKernel {
 			}
 		} else {
 			// The code is not a valid command, ask :eval to inspect.
-			return this.getCommands().get(":eval").inspect(code, at);
+			return inspectCommandArguments(this.getCommands().get(":eval"), code, at);
 		}
 	}
 	
diff --git a/src/main/java/de/prob2/jupyter/SplitResult.java b/src/main/java/de/prob2/jupyter/SplitResult.java
index 5ae46948ca6da7579e1a0113d721df010c8c11e5..1cf57685059a389f582f5ef40a95442262ff170a 100644
--- a/src/main/java/de/prob2/jupyter/SplitResult.java
+++ b/src/main/java/de/prob2/jupyter/SplitResult.java
@@ -1,15 +1,22 @@
 package de.prob2.jupyter;
 
+import java.util.Optional;
+
+import com.google.common.base.MoreObjects;
+
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public final class SplitResult {
 	private final @NotNull SplitArguments arguments;
+	private final @Nullable Parameter<?> parameterAtPosition;
 	private final @NotNull PositionedString remaining;
 	
-	public SplitResult(final @NotNull SplitArguments arguments, final @NotNull PositionedString remaining) {
+	public SplitResult(final @NotNull SplitArguments arguments, final @Nullable Parameter<?> parameterAtPosition, final @NotNull PositionedString remaining) {
 		super();
 		
 		this.arguments = arguments;
+		this.parameterAtPosition = parameterAtPosition;
 		this.remaining = remaining;
 	}
 	
@@ -17,7 +24,20 @@ public final class SplitResult {
 		return this.arguments;
 	}
 	
+	public @NotNull Optional<Parameter<?>> getParameterAtPosition() {
+		return Optional.ofNullable(this.parameterAtPosition);
+	}
+	
 	public @NotNull PositionedString getRemaining() {
 		return this.remaining;
 	}
+	
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(this)
+			.add("arguments", this.getArguments())
+			.add("parameterAtPosition", this.getParameterAtPosition())
+			.add("remaining", this.getRemaining())
+			.toString();
+	}
 }
diff --git a/src/main/java/de/prob2/jupyter/commands/AssertCommand.java b/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
index b886c6ff4af65425cb344c64bf8b62319ded8536..cfe9e22d5f6de80e6a48d5db7d37569abfbc68ee 100644
--- a/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -22,7 +23,6 @@ import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 import io.github.spencerpark.jupyter.kernel.display.mime.MIMEType;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class AssertCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula");
@@ -84,8 +84,10 @@ public final class AssertCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java b/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
index 28ca4af4f592ac2a5d775c85e28c6f22ba0966fc..a42e3c72f4d7cf5bd061d6dae768916cbfe081e1 100644
--- a/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
@@ -12,6 +12,7 @@ import de.prob.statespace.LoadedMachine;
 import de.prob.statespace.Trace;
 import de.prob.statespace.Transition;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -90,8 +91,8 @@ public final class BrowseCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/BsymbCommand.java b/src/main/java/de/prob2/jupyter/commands/BsymbCommand.java
index e799a475c480be6557364617ddad5e80987e767a..fd6b68e7ff26f932cc263c92460413f9d61f7185 100644
--- a/src/main/java/de/prob2/jupyter/commands/BsymbCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/BsymbCommand.java
@@ -3,6 +3,7 @@ package de.prob2.jupyter.commands;
 import com.google.inject.Inject;
 
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -53,8 +54,8 @@ public final class BsymbCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/CheckCommand.java b/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
index a20db9ea518bdc567efc0cbdfc021289bc8a37c1..6f8be9fe49bcce00c80220e98cec86def31e25ba 100644
--- a/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
@@ -23,6 +23,7 @@ import de.prob.unicode.UnicodeTranslator;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.UserErrorException;
@@ -31,7 +32,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class CheckCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle WHAT_PARAM = Parameter.required("what");
@@ -113,8 +113,8 @@ public final class CheckCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
index 0388125740feb74112eb864b4ee210a2dcde7295..d7d2a14e1c6e48232c1953167e2b18e67be91c8d 100644
--- a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
@@ -13,6 +13,7 @@ import de.prob.statespace.Transition;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class ConstantsCommand implements Command {
 	private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate");
@@ -80,8 +80,10 @@ public final class ConstantsCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/DotCommand.java b/src/main/java/de/prob2/jupyter/commands/DotCommand.java
index 9148588b82b129983318eff2e7c54a38a8e7a655..f1d39882f54db31ee4c0e41b08f9ac42ab1e94f4 100644
--- a/src/main/java/de/prob2/jupyter/commands/DotCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/DotCommand.java
@@ -10,6 +10,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -23,6 +24,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -135,12 +137,11 @@ public final class DotCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectArgs(
-			argString, at,
-			(commandName, at0) -> null, // TODO
-			CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
-		);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(ImmutableMap.of(
+			COMMAND_PARAM, (commandName, at) -> null, // TODO
+			FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
index 34c33999d0dd90c1198213fdb0bc15adfccf73c9..972926f604c67bea93cdf560bc89218c58c89596 100644
--- a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
@@ -10,6 +10,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -18,7 +19,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class EvalCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula");
@@ -67,8 +67,10 @@ public final class EvalCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
index 5515f0fe2ce18778489f2be6e5b6ac46935d482f..3b123e295e0de3d8b970ada4fae7bb576da3253b 100644
--- a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -15,6 +16,7 @@ import de.prob.statespace.Transition;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -86,12 +88,11 @@ public final class ExecCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectArgs(
-			argString, at,
-			(operation, at0) -> null, // TODO
-			CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
-		);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(ImmutableMap.of(
+			OPERATION_PARAM, (operation, at) -> null, // TODO
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/FindCommand.java b/src/main/java/de/prob2/jupyter/commands/FindCommand.java
index 88aa529a7a5e22693b219eb4ad5f9fc88d7cdd7d..055d4695a806fedb70446ddf77cc794c27a96008 100644
--- a/src/main/java/de/prob2/jupyter/commands/FindCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/FindCommand.java
@@ -12,6 +12,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -20,7 +21,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class FindCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle PREDICATE_PARAM = Parameter.requiredRemainder("predicate");
@@ -75,8 +75,10 @@ public final class FindCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/GotoCommand.java b/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
index 798d0e30e60f7d826e6c653061908d51def99896..557b7511a66bbe9f0b85119937568c23378da642 100644
--- a/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
@@ -8,6 +8,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.UserErrorException;
@@ -68,8 +69,8 @@ public final class GotoCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java b/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
index 083cef677e16b05fc9d75a544586428840cd4b93..2f085e925d93a914af2721f9f8d9597415a50da2 100644
--- a/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
@@ -12,6 +12,7 @@ import com.google.inject.Injector;
 import de.prob.scripting.ScriptEngineProvider;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -76,8 +77,8 @@ public final class GroovyCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/HelpCommand.java b/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
index 57d4418d55042e66cdafde6cf6a605d976f76c3b..9b9ca2f2b26e56868b67d549ada4a7018ab25611 100644
--- a/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
@@ -14,6 +14,7 @@ import com.google.inject.Injector;
 
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -23,7 +24,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class HelpCommand implements Command {
 	private static final @NotNull Parameter.OptionalSingle COMMAND_NAME_PARAM = Parameter.optional("commandName");
@@ -170,8 +170,8 @@ public final class HelpCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
index b93fc03a204377ecc3ae24fc867ec3467147ed5c..278de524c558353836cbf1f76b618fe15d8f0164 100644
--- a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
@@ -13,6 +13,7 @@ import de.prob.statespace.Transition;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class InitialiseCommand implements Command {
 	private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate");
@@ -80,8 +80,10 @@ public final class InitialiseCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/LetCommand.java b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
index 24868dedbe9836bdad718fdeb66cea441c0c8a05..d77fa45c58f0bada4e3aaf994f0ed407c3128d81 100644
--- a/src/main/java/de/prob2/jupyter/commands/LetCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -76,9 +77,9 @@ public final class LetCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
+	public @NotNull ParameterInspectors getParameterInspectors() {
 		// TODO
-		return null;
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java b/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
index 1a39922989576ab7b43621458866d096d9ea9dfa..92a416b8e7553e94d1ebfffafafc66ff246c4275 100644
--- a/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
@@ -4,6 +4,7 @@ import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.Map;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -13,6 +14,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -84,15 +86,11 @@ public final class LoadCellCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		final int newlinePos = argString.indexOf('\n');
-		if (newlinePos == -1 || at < newlinePos) {
-			// Cursor is on the first line, provide preference inspections.
-			return CommandUtils.inspectInPreferences(this.animationSelector.getCurrentTrace(), argString, at);
-		} else {
-			// Cursor is in the body, provide B inspections.
-			return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
-		}
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(ImmutableMap.of(
+			PREFS_PARAM, CommandUtils.preferencesInspector(this.animationSelector.getCurrentTrace()),
+			CODE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java b/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
index d8980f521b0b8e344a0760b1ad982935af1e8b27..123d0778629b4b23e6c63d1905c71c9c46e1ff46 100644
--- a/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
@@ -10,6 +10,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
@@ -22,6 +23,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -110,12 +112,11 @@ public final class LoadFileCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectArgs(
-			argString, at,
-			(filename, at0) -> null,
-			CommandUtils.preferencesInspector(this.animationSelector.getCurrentTrace())
-		);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(ImmutableMap.of(
+			FILE_NAME_PARAM, (filename, at) -> null,
+			PREFS_PARAM, CommandUtils.preferencesInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java b/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
index 8c45b168e80d43c306b85abb001d0e4a9c49bef4..65e1d91d0f2d5a029a977cdefcd8c15f7bad8ef8 100644
--- a/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
@@ -16,6 +16,7 @@ import de.prob.check.StateSpaceStats;
 import de.prob.statespace.AnimationSelector;
 import de.prob.statespace.StateSpace;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -128,8 +129,8 @@ public final class ModelCheckCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/PrefCommand.java b/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
index 2baac286b0be4cad5e1f5a4466d3f2abed3fc126..da0fe8a0c3722d919377cbbf8eec1299f73c0a36 100644
--- a/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
@@ -15,6 +15,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.UserErrorException;
@@ -110,8 +111,10 @@ public final class PrefCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInPreferences(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			PREFS_PARAM, CommandUtils.preferencesInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java b/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
index 752d0058d47cf37f4e568bb0c6dd6b8f7ff52efe..0cf7bbb3668c50c0095cf87d25d664bcdf24a607 100644
--- a/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
@@ -11,6 +11,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -18,7 +19,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class PrettyPrintCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle PREDICATE_PARAM = Parameter.requiredRemainder("predicate");
@@ -75,8 +75,10 @@ public final class PrettyPrintCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/RenderCommand.java b/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
index cafd252f42c27c165a4f72c5259483c185b1e811..7e1d4484399ec1b60aad4f07bc79b5d2db2e3759 100644
--- a/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
@@ -6,6 +6,7 @@ import com.google.inject.Inject;
 
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -60,8 +61,8 @@ public final class RenderCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/ShowCommand.java b/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
index 84441d3612e742607cc4e30ef14f4f6eed8bd71c..9621989cb875b74105bfe0b529f7b91f3c17f83a 100644
--- a/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
@@ -16,6 +16,7 @@ import de.prob.animator.domainobjects.AnimationMatrixEntry;
 import de.prob.statespace.AnimationSelector;
 import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -152,8 +153,8 @@ public final class ShowCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
index d8d3973ba9c77f0958b21899969e9110db832b35..3b29bc922580bd8cff545f8bf0039b68a555d4ae 100644
--- a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -16,6 +17,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -92,12 +94,11 @@ public final class SolveCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectArgs(
-			argString, at,
-			(solverName, at0) -> null, // TODO
-			CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
-		);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(ImmutableMap.of(
+			SOLVER_PARAM, (solverName, at) -> null, // TODO
+			PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/StatsCommand.java b/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
index 8c180dc3ebd6f9d74035aab0fd77827b6a5d2dd3..abe5917f948884b64b20bec2d3655fc7d70c2709 100644
--- a/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
@@ -6,6 +6,7 @@ import de.prob.animator.command.ComputeStateSpaceStatsCommand;
 import de.prob.check.StateSpaceStats;
 import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -81,8 +82,8 @@ public final class StatsCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/TableCommand.java b/src/main/java/de/prob2/jupyter/commands/TableCommand.java
index 74553f1ff311a956cdebca27389c28c7e113994a..0e09bfa11fb7ffbb22b60b0d1309658819058ebe 100644
--- a/src/main/java/de/prob2/jupyter/commands/TableCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TableCommand.java
@@ -19,6 +19,7 @@ import de.prob.unicode.UnicodeTranslator;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -27,7 +28,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class TableCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle EXPRESSION_PARAM = Parameter.requiredRemainder("expression");
@@ -111,8 +111,10 @@ public final class TableCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			EXPRESSION_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/TimeCommand.java b/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
index 844936bd5073437f76b521f3ffd66b7d7b54728c..0f653b2d769fa665c4727bae5c7d566a1c6d005c 100644
--- a/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
@@ -10,6 +10,7 @@ import com.google.inject.Injector;
 
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -73,8 +74,10 @@ public final class TimeCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return this.injector.getInstance(ProBKernel.class).inspect(argString, at, false);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			COMMAND_AND_ARGS_PARAM, (argString, at) -> this.injector.getInstance(ProBKernel.class).inspect(argString, at, false)
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/TraceCommand.java b/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
index b37af724e9cf22c59eb7ec66b28bd8558db21c93..6073818ea2d62d945a7ecde450a2943b5fd3141b 100644
--- a/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
@@ -8,6 +8,7 @@ import de.prob.statespace.AnimationSelector;
 import de.prob.statespace.Trace;
 import de.prob.statespace.Transition;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 
@@ -89,8 +90,8 @@ public final class TraceCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/TypeCommand.java b/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
index 67ed0c3f05e5a2e6ba7452a5e8860c905c72dadd..61c18438baf79c5c8f8fe4453eec70d7c527348f 100644
--- a/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
@@ -14,6 +14,7 @@ import de.prob.statespace.Trace;
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.CommandUtils;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -22,7 +23,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
 import io.github.spencerpark.jupyter.kernel.display.DisplayData;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 public final class TypeCommand implements Command {
 	private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula");
@@ -77,8 +77,10 @@ public final class TypeCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return new ParameterInspectors(Collections.singletonMap(
+			FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
+		));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/UnletCommand.java b/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
index c2bb02b109ba40fdad89348901491fe046cbf956..2d6960dba561fdfb97ebae9c99d6f6f7c9fdb741 100644
--- a/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
@@ -8,6 +8,7 @@ import com.google.inject.Injector;
 
 import de.prob2.jupyter.Command;
 import de.prob2.jupyter.Parameter;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -68,9 +69,9 @@ public final class UnletCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
+	public @NotNull ParameterInspectors getParameterInspectors() {
 		// TODO
-		return null;
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/VersionCommand.java b/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
index 8f6180e8dce88a5cfd817e34895b939eb851245b..147296df9ec5aa87039bed947d9a51bbfeec4343 100644
--- a/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
@@ -7,6 +7,7 @@ import de.prob.Main;
 import de.prob.animator.command.GetVersionCommand;
 import de.prob.statespace.AnimationSelector;
 import de.prob2.jupyter.Command;
+import de.prob2.jupyter.ParameterInspectors;
 import de.prob2.jupyter.Parameters;
 import de.prob2.jupyter.ParsedArguments;
 import de.prob2.jupyter.ProBKernel;
@@ -77,8 +78,8 @@ public final class VersionCommand implements Command {
 	}
 	
 	@Override
-	public @Nullable DisplayData inspect(final @NotNull String argString, final int at) {
-		return null;
+	public @NotNull ParameterInspectors getParameterInspectors() {
+		return ParameterInspectors.NONE;
 	}
 	
 	@Override