anchor.diff:            changeSet.changedItems.
               forEach((k, Change v) => change[k] = v.newValue);
   
  -          if (_communicator.diffInProgress) {
  -            modifiedFieldsOfData(data).addAll(change.keys);
  -          }
  +          Map<String, num> tokens = {};
  +          
  +          change.keys.forEach((field) {
  +            tokens[field] = nextTokenForDataField(data, field);
  +          });
             
             _connection.send(() => new ClientRequest("sync", {
               "action" : "change",
  
positive.code:     collection = new DataCollection();
      _communicator = new Communicator(_connection, collectionName,
          (List<Map> data) {handleData(data, collection, _author);},
          (List<Map> diff) {
            handleDiff(diff, this, _author);
            _clearModifiedFields();
          });
      start();
    }
  
    Set<String> modifiedFieldsOfData(Data data) {
      if (!_modifiedFields.containsKey(data["_id"])) {
        _modifiedFields[data["_id"]] = new Set();
      }
      
      return _modifiedFields[data["_id"]];
    }
    
    void _clearModifiedFields() {
      _modifiedFields.clear();
    }
    
    void _setupListeners() {
  
negative.code:             "_id": data["_id"],
              "change" : change,
              "author" : _author
            })).then((_) {
              // TODO: check if server really accepted the change
              tokens.forEach((field, token) {
                if (tokenForDataField(data, field) == token) {
                  _clearTokenForDataField(data, field);
                }
              });
            });
          });
  
          event["change"].removedItems.forEach((data) {
  