private Map<MoveMessageType, Board> getAppropriateMoveAfterShift(
			Board board, int playerID, Position targetPos, Position shiftPos,
			boolean shiftTarget) {
		PositionType forbiddenPos = board.getForbidden();

		if (!shiftPos.isInsertablePosition())
			throw new IllegalArgumentException("Invalid position of shiftcard");

		if (shiftPos.equals(forbiddenPos))
			throw new IllegalArgumentException(
					"Shiftcard mustn't be inserted at forbidden position");

		Card shiftCard = new Card(board.getShiftCard());

		MoveMessageType move = null;
		Board shadowBoard = null;

		Map<MoveMessageType, Board> possibleMoves = new HashMap<MoveMessageType, Board>();

		Position shiftedTarget = shiftTarget ? targetPos
				.getPositionAfterShift(shiftPos) : targetPos;

		if (shiftedTarget == null)
			return null;

		for (int k = 0; k < shiftCard.getDifferentRotationCount(); k++) {
			move = new MoveMessageType();
			move.setShiftPosition(shiftPos);
			move.setNewPinPos(shiftedTarget);
			move.setShiftCard(shiftCard);

			shadowBoard = (Board) board.clone();
			if (shadowBoard.validateTransition(move, playerID)) {
				// always call proceedTurn to apply changes to the
				// shadowBoard !!!
				shadowBoard.proceedTurn(move, playerID);

				possibleMoves.put(move, shadowBoard);
			}

			shiftCard = shiftCard.rotateClockwise();
		}

		return possibleMoves;
	}