public Element handle(FreeColServer server, Player player,
                          Connection connection) {
        ServerPlayer serverPlayer = server.getPlayer(connection);

        Unit unit;
        try {
            unit = player.getFreeColGameObject(unitId, Unit.class);
        } catch (Exception e) {
            return DOMMessage.clientError(e.getMessage());
        }

        Tile tile;
        try {
            tile = unit.getNeighbourTile(directionString);
        } catch (Exception e) {
            return DOMMessage.clientError(e.getMessage());
        }

        IndianSettlement is = tile.getIndianSettlement();
        if (is == null) {
            return DOMMessage.clientError("There is no native settlement at: "
                + tile.getId());
        }

        Unit missionary = is.getMissionary();
        if (denounce) {
            if (missionary == null) {
                return DOMMessage.clientError("Denouncing an empty mission at: "
                    + is.getId());
            } else if (missionary.getOwner() == player) {
                return DOMMessage.clientError("Denouncing our own missionary at: "
                    + is.getId());
            }
        } else {
            if (missionary != null) {
                return DOMMessage.clientError("Establishing extra mission at: "
                    + is.getId());
            }
        }

        MoveType type = unit.getMoveType(is.getTile());
        if (type != MoveType.ENTER_INDIAN_SETTLEMENT_WITH_MISSIONARY) {
            return DOMMessage.clientError("Unable to enter " + is.getName()
                + ": " + type.whyIllegal());
        }

        // Valid, proceed to denounce/establish.
        return (denounce)
            ? server.getInGameController()
                .denounceMission(serverPlayer, unit, is)
            : server.getInGameController()
                .establishMission(serverPlayer, unit, is);
    }