protected boolean evaluateSingleKeyword(String str) throws InterruptedException {
		if (super.evaluateSingleKeyword(str))
			return true;
		String strLC = str.toLowerCase();
		if ("paint".equals(strLC)) { // paint
			view.paintImmediately(0, 0, view.getWidth(), view.getHeight());
			return true;
		}
		if ("init".equals(strLC)) { // cause the initialization script to be executed, if any
			if (model.getInitializationScript() != null)
				model.runScript(model.getInitializationScript());
			return true;
		}
		if (strLC.startsWith("runtask")) { // run the task with the specified name
			String taskName = str.substring(7).trim();
			Loadable task = model.getJob().getTaskByName(taskName);
			if (task == null) {
				out(ScriptEvent.FAILED, "Task not found: " + taskName);
				return true;
			}
			task.execute();
			return true;
		}
		if ("snapshot".equals(strLC)) { // snapshot
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					if (view.getSnapshotListener() != null)
						view.getSnapshotListener().actionPerformed(null);
				}
			});
			return true;
		}
		if ("focus".equals(strLC)) { // focus
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					view.requestFocusInWindow();
				}
			});
			return true;
		}
		if ("run".equals(strLC)) { // run
			// FIXME: Why do we need to do this to make "delay modeltime" to work with a prior "run" command?
			try {
				Thread.sleep(100);
			}
			catch (InterruptedException e) {
			}
			model.run();
			model.notifyChange();
			notifyExecution("run");
			return true;
		}
		if (strLC.startsWith("stop")) {
			if ("stop".equals(strLC)) { // stop
				EventQueue.invokeLater(new Runnable() {
					public void run() {
						model.stop();
						notifyExecution("stop");
					}
				});
				return true;
			}
			if ("immediately".equals(strLC.substring(4).trim())) { // stop immediately
				EventQueue.invokeLater(new Runnable() {
					public void run() {
						model.stopImmediately();
						notifyExecution("stop");
					}
				});
				return true;
			}
		}
		if (strLC.startsWith("reset")) {
			if ("reset".equals(strLC)) { // reset
				evaluateLoadClause(view.getResourceAddress(), true);
				notifyExecution("reset");
				readdMouseAndKeyScripts(model.getInitializationScript());
				return true;
			}
			if ("silently".equals(strLC.substring(5).trim())) { // reset silently
				evaluateLoadClause(view.getResourceAddress(), true);
				readdMouseAndKeyScripts(model.getInitializationScript());
				return true;
			}
		}
		if ("remove".equals(strLC)) { // remove selected objects
			// CAUTION!!!!!!!!! PUTTING INTO EVENTQUEUE is dangerous if there are commands following it!
			removeSelectedObjects();
			// EventQueue.invokeLater(new Runnable() { public void run() { removeSelectedObjects(); } });
			model.notifyChange();
			return true;
		}
		return false;
	}