We are trying to adopt custom elements for some parts of your UI and ran into the issue that during an update to the tree, custom attributes on the the custom elements are not removed correctly as can be seen here: http://jsbin.com/ferohipaje/edit?html,output (you will need to click on "false" and then inspect the DOM node in the dev tools of the browser).

I've tracked the issue to the `_updateDOMProperties` method in `ReactDOMComponent.js`. It seems that there is a special check in the loop for `nextProps`:

``` js
else if (isCustomComponent(this._tag, nextProps)) {
  if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
    DOMPropertyOperations.setValueForAttribute(getNode(this), propKey, nextProp);
  }
}
```

But the corresponding section is missing for `lastProps` (deleting), which results in the incorrect behavior.

I'm starting the work on the patch.

return (str + '').replace(/([.?*+\^$\[\]\\(){}|-])/g, '\\$1');
    }
    beforeEach(function() {
      var ReactDefaultInjection = require('ReactDefaultInjection');
      ReactDefaultInjection.inject();
      var ReactDOMComponent = require('ReactDOMComponent');
      var ReactReconcileTransaction = require('ReactReconcileTransaction');
      var NodeStub = function(initialProps) {
        this._currentElement = {props: initialProps};
        this._rootNodeID = 'test';
      };
      Object.assign(NodeStub.prototype, ReactDOMComponent.Mixin);
      genMarkup = function(props) {
        var transaction = new ReactReconcileTransaction();
        return (new NodeStub(props))._createOpenTagMarkupAndPutListeners(
          transaction,
          props
        );
      };
      this.addMatchers({
        toHaveAttribute: function(attr, value) {
          var expected = '(?:^|\\s)' + attr + '=[\\\'"]';
          if (typeof value !== 'undefined') {
            expected += quoteRegexp(value) + '[\\\'"]';
          }
          return this.actual.match(new RegExp(expected));
        },
      });