anchor.diff:      });
     }
   
  +  //
  +  // Overrides
  +  //
  +
  +  @override
  +  void inserted() {
  +    assert(!_childEventsWired);
  +
  +    // TODO: hold on to the subscription. Tear down at some point?
  +    filterPropertyChangeRecords(_editor, const Symbol('text'))
  +      .listen(_editorTextChanged);
  +
  +    _childEventsWired = true;
  +  }
  +
  +  //
  +  // Event handlers
  +  //
  +
     void handleNoteClick(Event e, var detail, Element target) {
       e.preventDefault();
       _noteClick(target.dataset['noteTitle']);
  +  }
  +
  +  //
  +  // Implementation
  +  //
  +
  +  void _editorTextChanged(_) {
  +    var title = _currentNote.title;
  +    var noteContent = new TextContent(_editor.text);
  +    _controller.updateNote(title, noteContent);
     }
   
     void _noteClick(String noteTitle) {
  
positive.code: import 'dart:html';
  import 'package:polymer/polymer.dart';
  import 'package:nv/src/controllers.dart';
  import 'package:nv/src/models.dart';
  import 'package:nv/init.dart' as init;
  import 'package:nv/elements/interfaces.dart';
  
  @CustomTag('app-element')
  class AppElement extends PolymerElement with ChangeNotifierMixin {
    bool get applyAuthorStyles => true;
  
    AppController _controller;
  
    AppController get controller => _controller;
  
  
negative.code:   }
  
    void _loadNote(Note note) {
      if(_currentNote != null) {
        throw new UnimplementedError('tbd');
      }
      assert(note.content is TextContent);
  
      _currentNote = note;
  
      TextContent content = note.content;
  
  