anchor.diff:  ///
   /// Exposes an API for starting and stopping mimicking.
   class MimicableState extends State<Mimicable> {
  -  Size _size;
  -  bool _beingMimicked = false;
  +  Size _placeholderSize;
  +
  +  Rect get _globalBounds {
  +    assert(mounted);
  +    RenderBox box = context.findRenderObject();
  +    assert(box != null);
  +    assert(box.hasSize);
  +    assert(!box.needsLayout);
  +    // TODO(abarth): The bounds will be wrong if there's a scale or rotation transform involved
  +    return box.localToGlobal(Point.origin) & box.size;
  +  }
   
     /// Start the mimicking process.
     ///
  -  /// The child of this object will no longer be built at this location in the
  -  /// tree.  Instead, this widget will build a transparent placeholder with the
  -  /// same dimensions as the widget had when the mimicking process started.
  +  /// The child of this object will no longer be built at this
  +  /// location in the tree. Instead, this widget will build a
  +  /// transparent placeholder with the same dimensions as the widget
  +  /// had when the mimicking process started.
  +  ///
  +  /// If you use startMimic(), it is your responsibility to do
  +  /// something with the returned [MimicableHandle]; typically,
  +  /// passing it to a [Mimic] widget. To mimic the child in the
  +  /// [Overlay], consider using [liftToOverlay()] instead.
     MimicableHandle startMimic() {
  -    assert(!_beingMimicked);
  -    assert(_size != null);
  +    assert(_placeholderSize == null);
  +    RenderBox box = context.findRenderObject();
  +    assert(box != null);
  +    assert(box.hasSize);
  +    assert(!box.needsLayout);
       setState(() {
  -      _beingMimicked = true;
  +      _placeholderSize = box.size;
       });
       return new MimicableHandle._(this);
     }
   
  -  /// Mimic this object in the enclosing overlay.
  -  ///
  -  /// The child of this object will no longer be built at this location in the
  -  /// tree.  Instead, (1) this widget will build a transparent placeholder with
  -  /// the same dimensions as the widget had when the mimicking process started
  -  /// and (2) the child will be placed in the enclosing overlay.
  +  /// Start the mimicking process and mimic this object in the
  +  /// enclosing [Overlay].
  +  ///
  +  /// The child of this object will no longer be built at this
  +  /// location in the tree. Instead, (1) this widget will build a
  +  /// transparent placeholder with the same dimensions as the widget
  +  /// had when the mimicking process started and (2) the child will be
  +  /// placed in the enclosing overlay.
     MimicOverlayEntry liftToOverlay() {
       OverlayState overlay = Overlay.of(context);
       assert(overlay != null); // You need an overlay to lift into.
  
positive.code: 
  /// An overlay entry that is mimicking another widget.
  class MimicOverlayEntry {
    MimicOverlayEntry._(this._key) {
      _overlayEntry = new OverlayEntry(builder: _build);
      _initialGlobalBounds = _key.globalBounds;
    }
  
    Rect _initialGlobalBounds;
  
    MimicableHandle _key;
    OverlayEntry _overlayEntry;
  
    // Animation state
  
negative.code:     Duration duration,
      Curve curve: Curves.linear
    }) {
      assert(_handle != null);
      assert(_overlayEntry != null);
      assert(targetKey != null);
      assert(duration != null);
  