* @param unit The missionary <code>Unit</code>.
     * @param settlement The <code>IndianSettlement</code> to establish at.
     * @return An <code>Element</code> encapsulating this action.
     */
    public Element establishMission(ServerPlayer serverPlayer, Unit unit,
                                    IndianSettlement settlement) {
        ChangeSet cs = new ChangeSet();
        csSpeakToChief(serverPlayer, settlement, false, cs);

        Unit missionary = settlement.getMissionary();
        if (missionary != null) {
            ServerPlayer enemy = (ServerPlayer) missionary.getOwner();
            enemy.csKillMissionary(settlement, cs);
        }

        // Result depends on tension wrt this settlement.
        // Establish if at least not angry.
        switch (settlement.getAlarm(serverPlayer).getLevel()) {
        case HATEFUL: case ANGRY:
            cs.add(See.perhaps().always(serverPlayer),
                (FreeColGameObject) unit.getLocation());
            cs.addDispose(See.perhaps().always(serverPlayer),
                unit.getLocation(), unit);
            break;
        case HAPPY: case CONTENT: case DISPLEASED:
            cs.add(See.perhaps().always(serverPlayer), unit.getTile());
            unit.setLocation(null);
            unit.setMovesLeft(0);
            cs.add(See.only(serverPlayer), unit);
            settlement.changeMissionary(unit);
            settlement.setConvertProgress(0);
            List<FreeColGameObject> modifiedSettlements
                = ((ServerIndianSettlement)settlement).modifyAlarm(serverPlayer,
                    ALARM_NEW_MISSIONARY);
            modifiedSettlements.remove(settlement);
            if (!modifiedSettlements.isEmpty()) {
                cs.add(See.only(serverPlayer), modifiedSettlements);
            }
            break;
        }
        Tile tile = settlement.getTile();
        tile.updatePlayerExploredTile(serverPlayer, true);
        cs.add(See.perhaps().always(serverPlayer), tile);
        String messageId = "indianSettlement.mission."
            + settlement.getAlarm(serverPlayer).getKey();
        cs.addMessage(See.only(serverPlayer),
            new ModelMessage(ModelMessage.MessageType.FOREIGN_DIPLOMACY,
                             messageId, serverPlayer, unit)
                .addStringTemplate("%nation%", settlement.getOwner().getNationName()));

        // Others can see missionary disappear and settlement acquire
        // mission.
        sendToOthers(serverPlayer, cs);
        return cs.build(serverPlayer);
    }