void updateFrom(int sender) {
        int changes = 0;
        for (int level=0; level<maxLevel; level++) {
            for (int zip=0; zip<maxOrder; zip++) {
                int[] offer = station[sender].promise[level];
                if (offer[zip] != 0) {
                  // known region
                   if (offer[zip] < delay[level][zip] || route[level][zip] == sender) {
                       // better offer or current dest
                       if (station[sender].route[level][zip] != nodeNum) {
                           // no flip
                           if (delay[level][zip] != offer[zip])
                               changes++;
                           delay[level][zip] = offer[zip];
                           route[level][zip] = sender;
                       }
                   }
               }
            }
            if (station[sender].zip[level] != zip[level]) {
                break;
            }
        }
        if (changes > 0) {
            // trace ("update from", station[sender], new Integer(changes));
            scheduleUpdate();
        }
    }