* @param direction The direction of a settlement to negotiate with.
     */
    private void moveTradeColony(Unit unit, Direction direction) {
        Settlement settlement = getSettlementAt(unit.getTile(), direction);
        if (settlement == null) return;

        // Can not negotiate with the REF.
        Player player = unit.getOwner();
        if (settlement.getOwner() == player.getREFPlayer()) {
            throw new IllegalStateException("Unit tried to negotiate with REF");
        }

        ModelMessage m = null;
        String nation
            = Messages.message(settlement.getOwner().getNationName());
        DiplomaticTrade ourAgreement = null;
        DiplomaticTrade agreement = null;
        TradeStatus status;
        for (;;) {
            ourAgreement = gui.showNegotiationDialog(unit, settlement,
                                                     agreement);
            if (agreement == null && (ourAgreement == null
                    || ourAgreement.getStatus() == TradeStatus.REJECT_TRADE))
                break;
            agreement = ourAgreement;
            if (agreement.getStatus() != TradeStatus.PROPOSE_TRADE) {
                askServer().diplomacy(freeColClient.getGame(), unit,
                                      settlement, agreement);
                gui.updateMenuBar();
                break;
            }

            agreement = askServer().diplomacy(freeColClient.getGame(), unit,
                                              settlement, agreement);
            status = (agreement == null) ? TradeStatus.REJECT_TRADE
                : agreement.getStatus();
            switch (status) {
            case PROPOSE_TRADE:
                continue; // counter proposal, try again
            case ACCEPT_TRADE:
                m = new ModelMessage(MessageType.FOREIGN_DIPLOMACY,
                                     "negotiationDialog.offerAccepted",
                                     settlement)
                    .addName("%nation%", nation);
                break;
            case REJECT_TRADE:
                m = new ModelMessage(MessageType.FOREIGN_DIPLOMACY,
                                     "negotiationDialog.offerRejected",
                                     settlement)
                    .addName("%nation%", nation);
                break;
            default:
                throw new IllegalStateException("Bogus trade status" + status);
            }
            player.addModelMessage(m);
            break; // only counter proposals should loop
        }
        nextActiveUnit();
    }