anchor.diff:                          value = bindings[match[3]];
                       }
                   }
  +                if (bindings is! ObservableMap) {
  +                    bindings = new ObservableMap.from(bindings);
  +                }
                   callback(left_key, right_key, value);
  -                if (bindings is ObservableMap) {
  -                    bindings.changes.listen((record) {
  -                        if (record.first is PropertyChangeRecord) {
  -                            // TODO check why we get a PropertyChangeRecord the first time
  -                        } else if (record.first is MapChangeRecord) {
  -                            if (record.first.key == right_key) {
  -                                callback(left_key, right_key, record.first.newValue);
  -                            }
  -                        }
  -                    });
  -                }
  +                bindings.changes.listen((record) {
  +                    if (record.first is MapChangeRecord) {
  +                        if (record.first.key == right_key) {
  +                            callback(left_key, right_key, record.first.newValue);
  +                        }
  +                    }
  +                });
               });
           }
       }
  
positive.code:                 var template = element.children.first.clone(true);
                  element.children.clear();
                  List list = bindings[element.dataset['bind-foreach']];
                  list.forEach((e) {
                      var new_element = template.clone(true);
                      new Template.bindContainer(new_element, e, router);
                      element.children.add(new_element);
                  });
                  element.dataset.remove('bind-foreach');
              });
  
negative.code:     void _bindParameters(String parameters, Map bindings, BindingCallback callback, { expectFunction: false }) {
          var pattern = new RegExp(r"^{");
          if (!pattern.hasMatch(parameters)) {
              if (bindings is! ObservableMap) {
                  bindings = new ObservableMap.from(bindings);
              }
              callback(null, parameters, bindings[parameters]);
              bindings.changes.listen((record) {
                  if (record.first is MapChangeRecord) {
                      if (record.first.key == parameters) {
                          callback(null, parameters, bindings[parameters]);
                      }
                  }
              });
          } else {
              var left_key, right_key, value;
              pattern = new RegExp(r"(([\w-]*)\s*:\s*([\w-]*)),?\s*");
  