code: function(patch) {
  			// patch [key, null] means 'remove'
  			if (patch === null) {
  				this.remove();
  				return _getResolvedPromise(this);
  			}
  			// TODO: make sure that root node is not collapsed or modified
  			// copy (most) attributes to node.ATTR or node.data.ATTR
  			var name,
  				promise,
  				v,
  				IGNORE_MAP = { children: true, expanded: true, parent: true }; // TODO: should be global
  
  			for (name in patch) {
  				v = patch[name];
  				if (!IGNORE_MAP[name] && !$.isFunction(v)) {
  					if (NODE_ATTR_MAP[name]) {
  						this[name] = v;
  					} else {
  						this.data[name] = v;
  					}
  				}
  			}
  			// Remove and/or create children
  			if (patch.hasOwnProperty("children")) {
  				this.removeChildren();
  				if (patch.children) {
  					// only if not null and not empty list
  					// TODO: addChildren instead?
  					this._setChildren(patch.children);
  				}
  				// TODO: how can we APPEND or INSERT child nodes?
  			}
  			if (this.isVisible()) {
  				this.renderTitle();
  				this.renderStatus();
  			}
  			// Expand collapse (final step, since this may be async)
  			if (patch.hasOwnProperty("expanded")) {
  				promise = this.setExpanded(patch.expanded);
  			} else {
  				promise = _getResolvedPromise(this);
  			}
  			return promise;
  		}
docs: Modify existing child nodes.
  
  @param {NodePatch} patch
  @returns {$.Promise}
  @see FancytreeNode#addChildren