public final ExecResults executeImpl(ExecCommands newCommands) {
		validateCommands(newCommands);

		if (!isExecFinishedAndDisabled) {
			// from robot to battle
			commands.set(new ExecCommands(newCommands, true));
			print(newCommands.getOutputText());
		} else {
			// slow down spammer
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
			}
		}

		// If we are stopping, yet the robot took action (in onWin or onDeath),
		// stop now.
		if (battle.isAborted()) {
			isExecFinishedAndDisabled = true;
			throw new AbortedException();
		}
		if (isDead()) {
			isExecFinishedAndDisabled = true;
			throw new DeathException();
		}
		if (isHalt()) {
			isExecFinishedAndDisabled = true;
			if (isWinner) {
				throw new WinException();
			} else {
				throw new AbortedException();
			}
		}

		waitForNextTurn();

		checkSkippedTurn();

		// from battle to robot
		final ExecCommands resCommands = new ExecCommands(this.commands.get(),
				false);
		final RobotStatus resStatus = status.get();

		final boolean shouldWait = battle.isAborted()
				|| (battle.isLastRound() && isWinner());

		return new ExecResults(resCommands, resStatus, readoutEvents(),
				readoutTeamMessages(), readoutBullets(), isHalt(), shouldWait,
				isPaintEnabled());
	}