* @param cs A <code>ChangeSet</code> to update.
     */
    public void csDisposeSettlement(Settlement settlement, ChangeSet cs) {
        logger.finest("Disposing of " + settlement.getName());
        ServerPlayer owner = (ServerPlayer) settlement.getOwner();
        HashMap<Settlement, Integer> votes = new HashMap<Settlement, Integer>();

        // Try to reassign the tiles
        List<Tile> owned = settlement.getOwnedTiles();
        Tile centerTile = settlement.getTile();
        Settlement centerClaimant = null;

        while (!owned.isEmpty()) {
            Tile tile = owned.remove(0);
            votes.clear();
            for (Tile t : tile.getSurroundingTiles(1)) {
                // For each lost tile, find any neighbouring
                // settlements and give them a shout at claiming the tile.
                // Note that settlements now can own tiles outside
                // their radius--- if we encounter any of these clean
                // them up too.
                Settlement s = t.getOwningSettlement();
                if (s == null) {
                    ;
                } else if (s.isDisposed() || s.getOwner() == null) {
                    // BR#3375773 found a case where tiles were still
                    // owned by a settlement that had been previously
                    // destroyed.  Keep things simple and just clear
                    // the ownership on these.  The bug occurred
                    // because settlement.getOwnedTiles() was missing
                    // some tiles, which should be fixed, but we can
                    // be defensive here.
                    t.setOwningSettlement(null);
                } else if (s == settlement) {
                    // Add this to the tiles to process if its not
                    // there already.
                    if (!owned.contains(t)) owned.add(t);
                } else if (s.getOwner().canOwnTile(tile)
                           && (s.getOwner().isIndian()
                               || s.getTile().getDistanceTo(tile) <= s.getRadius())) {
                    // Weight claimant settlements:
                    //   settlements owned by the same player
                    //     > settlements owned by same type of player
                    //     > other settlements
                    int value = (s.getOwner() == owner) ? 3
                        : (s.getOwner().isEuropean() == owner.isEuropean()) ? 2
                        : 1;
                    if (votes.get(s) != null) value += votes.get(s).intValue();
                    votes.put(s, new Integer(value));
                }
            }
            Settlement bestClaimant = null;
            int bestClaim = 0;
            for (Entry<Settlement, Integer> vote : votes.entrySet()) {
                if (vote.getValue().intValue() > bestClaim) {
                    bestClaimant = vote.getKey();
                    bestClaim = vote.getValue().intValue();
                }
            }
            if (tile == centerTile) {
                centerClaimant = bestClaimant; // Defer until settlement gone
            } else {
                if (bestClaimant == null) {
                    tile.changeOwnership(null, null);
                } else {
                    tile.changeOwnership(bestClaimant.getOwner(), bestClaimant);
                }
                cs.add(See.perhaps().always(owner), tile);
            }
        }

        // Settlement goes away
        if (!owner.removeSettlement(settlement)) {
            throw new IllegalStateException("Failed to remove settlement: "
                + settlement);
        }
        if (owner.hasSettlement(settlement)) {
            throw new IllegalStateException("Still has settlement: "
                + settlement);
        }
        cs.addDispose(See.perhaps().always(owner), centerTile, settlement);
        // Now the settlement is gone, the center tile can be claimed.
        if (centerClaimant != null) {
            centerTile.changeOwnership(centerClaimant.getOwner(),
                                       centerClaimant);
        }
    }