anchor.diff:    String toString() => 'Leaf: [${_node.key}]';
   }
   
  +class App extends VComponent {
  +  List<g.Node> _nodes;
  +
  +  set node(List<g.Node> newNodes) {
  +    _nodes = newNodes;
  +    invalidate();
  +  }
  +
  +  App(ComponentBase parent, this._nodes) : super(parent, new html.DivElement());
  +
  +  List<v.Node> build() {
  +    return [NodeComponent.virtual(0, this, new g.Node(0, true, _nodes))];
  +  }
  +}
  +
   
   class Benchmark extends BenchmarkBase {
     List<g.Node> a;
     List<g.Node> b;
     html.Element _container;
   
  -  l.RootComponent _root;
  -  l.VComponentElement _vComponent;
  -  html.Element _rootElement;
  +  UpdateLoop _updateLoop;
  +  RootComponent _root;
  +
  +  App _app;
  +  html.Element _element;
   
     Benchmark(this.a, this.b, this._container) : super('VComponent');
   
     void render() {
  -    _vComponent = NodeComponent.virtual(0, _root, new g.Node(0, false, this.a));
  -    _rootElement = _vComponent.render();
  -    _container.append(_rootElement);
  -    _root.attached();
  +    _app = new App(_root, a);
  +    _root.injectComponent(_app, _container);
     }
   
     void update() {
  -    final newVComponent = NodeComponent.virtual(0, _root, new g.Node(0, true, this.b));
  -    _vComponent.diff(newVComponent);
  +    _app.node = b;
       _root.update();
     }
   
     void setup() {
  -    _root = new l.RootComponent();
  +    _updateLoop = new UpdateLoop();
  +    _root = new RootComponent(_updateLoop);
     }
   
     void teardown() {
  -    _rootElement.remove();
  -    _root = null;
  +    _container.children.clear();
     }
   }
positive.code: import 'package:vdom_benchmark/benchmark.dart';
  import 'package:vdom_benchmark/generator.dart' as g;
  import 'package:vdom/vdom.dart' as v;
  import 'package:liquid/liquid.dart' as l;
  
  class NodeComponent extends l.VComponent {
    g.Node _node;
  
    NodeComponent(l.ComponentBase parent, this._node) :
      super(parent, new html.DivElement());
  
    void updateProperties(g.Node node) {
      _node = node;
      if (_node.dirty) {
        invalidate();
      }
    }
  
    /// Should be auto-generated by pub transformer
    static l.VComponentElement virtual(Object key, l.ComponentBase parent, g.Node node) {
      return new l.VComponentElement(key, (component) {
        if (component == null) {
          return new NodeComponent(parent, node);
        } else {
          component.updateProperties(node);
          return component;
        }
      });
    }
  
    List<v.Node> build() {
      final result = [];
  
negative.code:     return result;
    }
  
    void updateProperties(g.Node node) {
      _node = node;
      if (_node.dirty) {
        invalidate();
      }
    }
  
    /// Should be auto-generated by pub transformer
    static VDomComponent virtual(Object key, ComponentBase parent, g.Node node) {
      return new VDomComponent(key, (component) {
        if (component == null) {
          return new NodeComponent(parent, node);
        } else {
          component.updateProperties(node);
          return component;
        }
      });
    }
  
    String toString() => 'Node: [$_node]';
  }
  
  class LeafComponent extends VComponent {
    g.Node _node;
  
    LeafComponent(ComponentBase parent, this._node) : super(parent, new html.SpanElement());
  
    void updateProperties(g.Node node) {
      _node = node;
  