private boolean csCompleteWork(Random random, ChangeSet cs) {
        setWorkLeft(-1);

        if (getLocation() instanceof HighSeas) {
            ServerPlayer owner = (ServerPlayer)getOwner();
            Europe europe = owner.getEurope();
            Map map = getGame().getMap();
            Location dst = getDestination();
            Location result = resolveDestination();
            if (result == europe) {
                logger.info(this + " arrives in Europe");
                if (getTradeRoute() != null) {
                    setMovesLeft(0);
                } else {
                    setDestination(null);
                    cs.addMessage(See.only(owner),
                        new ModelMessage(ModelMessage.MessageType.DEFAULT,
                                         "model.unit.arriveInEurope",
                                         europe, this)
                        .add("%europe%", europe.getNameKey()));
                }
                setState(UnitState.ACTIVE);
                setLocation(europe);
                cs.add(See.only(owner), europe, owner.getHighSeas());
            } else if (result instanceof Tile) {
                Tile tile = ((Tile)result).getSafeTile(owner, random);
                logger.info(this + " arrives in America at " + tile
                    + ((dst == null) ? "" : ", sailing for " + dst));
                if (dst instanceof Map) setDestination(null);
                csMove(tile, random, cs);
            } else {
                logger.warning(this + " has unsupported destination "
                               + getDestination());
            }
        } else {
            switch (getState()) {
            case FORTIFYING:
                setState(UnitState.FORTIFIED);
                break;
            case IMPROVING:
                csImproveTile(random, cs);
                return true;
            default:
                logger.warning("Unknown work completed, state=" + getState());
                setState(UnitState.ACTIVE);
                break;
            }
        }
        return false;
    }