diff --git a/examples/media_test/media_test.cc b/examples/media_test/media_test.cc
index c1f0d19..5d76004 100644
--- a/examples/media_test/media_test.cc
+++ b/examples/media_test/media_test.cc
@@ -20,8 +20,7 @@
 }
 
 MediaTest::MediaTest(mojo::ApplicationImpl* app,
-                     const std::string& input_file_name)
-    : state_(MediaState::UNPREPARED) {
+                     const std::string& input_file_name) {
   MediaFactoryPtr factory;
   ConnectToService(app->shell(), "mojo:media_factory", GetProxy(&factory));
 
@@ -57,13 +56,19 @@
                                     MediaPlayerStatusPtr status) {
   if (status) {
     // Process status received from the player.
-    previous_state_ = state_;
-    state_ = status->state;
-
     if (status->timeline_transform) {
       timeline_function_ = status->timeline_transform.To<TimelineFunction>();
     }
 
+    previous_state_ = state_;
+    if (status->end_of_stream) {
+      state_ = State::kEnded;
+    } else if (timeline_function_.subject_delta() == 0) {
+      state_ = State::kPaused;
+    } else {
+      state_ = State::kPlaying;
+    }
+
     metadata_ = status->metadata.Pass();
 
     if (update_callback_ != nullptr) {
diff --git a/examples/media_test/media_test.h b/examples/media_test/media_test.h
index da5473e..fc17161 100644
--- a/examples/media_test/media_test.h
+++ b/examples/media_test/media_test.h
@@ -19,6 +19,8 @@
 // Model for media test application.
 class MediaTest {
  public:
+  enum class State { kPaused, kPlaying, kEnded };
+
   using UpdateCallback = std::function<void()>;
 
   static std::unique_ptr<MediaTest> Create(mojo::ApplicationImpl* app,
@@ -41,10 +43,10 @@
   void Seek(int64_t position_ns) { media_player_->Seek(position_ns); }
 
   // Returns the previous state of the player.
-  MediaState previous_state() const { return previous_state_; }
+  State previous_state() const { return previous_state_; }
 
   // Returns the current state of the player.
-  MediaState state() const { return state_; }
+  State state() const { return state_; }
 
   // Returns the current presentation time in nanoseconds.
   int64_t position_ns() const;
@@ -61,8 +63,8 @@
                            MediaPlayerStatusPtr status = nullptr);
 
   MediaPlayerPtr media_player_;
-  MediaState previous_state_ = MediaState::UNPREPARED;
-  MediaState state_ = MediaState::UNPREPARED;
+  State previous_state_ = State::kPaused;
+  State state_ = State::kPaused;
   TimelineFunction timeline_function_;
   MediaMetadataPtr metadata_;
   UpdateCallback update_callback_;
diff --git a/examples/media_test/media_test_app.cc b/examples/media_test/media_test_app.cc
index 0c42f22..ff4ba3d 100644
--- a/examples/media_test/media_test_app.cc
+++ b/examples/media_test/media_test_app.cc
@@ -105,8 +105,8 @@
   }
 
   void HandleMediaTestUpdateCallback() {
-    if (media_test_->state() == MediaState::ENDED &&
-        media_test_->previous_state() != MediaState::ENDED) {
+    if (media_test_->state() == MediaTest::State::kEnded &&
+        media_test_->previous_state() != MediaTest::State::kEnded) {
       // MediaTest doesn't appreciate being deleted in this callback.
       // Next time Poll runs, we move on to the next file.
       base::MessageLoop::current()->PostTask(
@@ -169,15 +169,11 @@
   // Returns a string describing the MediaTest object's state.
   const char* state_string() const {
     switch (media_test_->state()) {
-      case MediaState::FAULT:
-        return "FAULT";
-      case MediaState::UNPREPARED:
-        return "unprepared";
-      case MediaState::PAUSED:
+      case MediaTest::State::kPaused:
         return "paused";
-      case MediaState::PLAYING:
+      case MediaTest::State::kPlaying:
         return "playing";
-      case MediaState::ENDED:
+      case MediaTest::State::kEnded:
         return "ended";
     }
     return "UNSUPPORTED STATE VALUE";
@@ -237,13 +233,13 @@
   // Toggles between play and pause (prepared) states.
   void TogglePlayPause() {
     switch (media_test_->state()) {
-      case MediaState::PAUSED:
+      case MediaTest::State::kPaused:
         media_test_->Play();
         break;
-      case MediaState::PLAYING:
+      case MediaTest::State::kPlaying:
         media_test_->Pause();
         break;
-      case MediaState::ENDED:
+      case MediaTest::State::kEnded:
         if (input_file_names_.size() == 1) {
           // Replaying the only file. Reuse the same MediaTest instance.
           media_test_->Seek(0);
diff --git a/mojo/dart/packages/mojo_services/BUILD.gn b/mojo/dart/packages/mojo_services/BUILD.gn
index 28cd6fd..2075a2c 100644
--- a/mojo/dart/packages/mojo_services/BUILD.gn
+++ b/mojo/dart/packages/mojo_services/BUILD.gn
@@ -59,7 +59,6 @@
   "lib/mojo/media/media_player.mojom.dart",
   "lib/mojo/media/media_sink.mojom.dart",
   "lib/mojo/media/media_source.mojom.dart",
-  "lib/mojo/media/media_state.mojom.dart",
   "lib/mojo/media/media_transport.mojom.dart",
   "lib/mojo/media/media_type_converter.mojom.dart",
   "lib/mojo/media/media_types.mojom.dart",
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
index df9cd3e..7145119 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
@@ -422,7 +422,7 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
-  Object timelineControlSite = null;
+  timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite = null;
 
   _AudioTrackGetTimelineControlSiteParams() : super(kVersions.last.size);
 
@@ -599,8 +599,8 @@
     return p;
   }
   dynamic describe([Function responseFactory = null]);
-  void configure(AudioTrackConfiguration configuration, Object pipe);
-  void getTimelineControlSite(Object timelineControlSite);
+  void configure(AudioTrackConfiguration configuration, media_transport_mojom.MediaConsumerInterfaceRequest pipe);
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite);
   void setGain(double dbGain);
   static const double kMutedGain = -160.0;
   static const double kMaxGain = 20.0;
@@ -719,7 +719,7 @@
     ctrl.sendMessage(params,
         _audioTrackMethodConfigureName);
   }
-  void getTimelineControlSite(Object timelineControlSite) {
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
     if (!ctrl.isBound) {
       ctrl.proxyError("The Proxy is closed.");
       return;
@@ -878,7 +878,7 @@
   void configure(AudioTrackConfiguration configuration, media_transport_mojom.MediaConsumerInterfaceRequest pipe) {
     return impl.configure(configuration, pipe);
   }
-  void getTimelineControlSite(Object timelineControlSite) {
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
     return impl.getTimelineControlSite(timelineControlSite);
   }
   void setGain(double dbGain) {
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
index d570d96..07e4b28 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
@@ -8,7 +8,6 @@
 import 'package:mojo/core.dart' as core;
 import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
 import 'package:mojo_services/mojo/media/media_metadata.mojom.dart' as media_metadata_mojom;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
 import 'package:mojo_services/mojo/timelines.mojom.dart' as timelines_mojom;
 
 
@@ -17,8 +16,8 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(32, 0)
   ];
-  media_state_mojom.MediaState state = null;
   timelines_mojom.TimelineTransform timelineTransform = null;
+  bool endOfStream = false;
   media_metadata_mojom.MediaMetadata metadata = null;
 
   MediaPlayerStatus() : super(kVersions.last.size);
@@ -58,16 +57,12 @@
     }
     if (mainDataHeader.version >= 0) {
       
-        result.state = media_state_mojom.MediaState.decode(decoder0, 8);
-        if (result.state == null) {
-          throw new bindings.MojoCodecError(
-            'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
-        }
+      var decoder1 = decoder0.decodePointer(8, true);
+      result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
     }
     if (mainDataHeader.version >= 0) {
       
-      var decoder1 = decoder0.decodePointer(16, true);
-      result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
+      result.endOfStream = decoder0.decodeBool(16, 0);
     }
     if (mainDataHeader.version >= 0) {
       
@@ -80,20 +75,20 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     try {
-      encoder0.encodeEnum(state, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "state of struct MediaPlayerStatus: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeStruct(timelineTransform, 16, true);
+      encoder0.encodeStruct(timelineTransform, 8, true);
     } on bindings.MojoCodecError catch(e) {
       e.message = "Error encountered while encoding field "
           "timelineTransform of struct MediaPlayerStatus: $e";
       rethrow;
     }
     try {
+      encoder0.encodeBool(endOfStream, 16, 0);
+    } on bindings.MojoCodecError catch(e) {
+      e.message = "Error encountered while encoding field "
+          "endOfStream of struct MediaPlayerStatus: $e";
+      rethrow;
+    }
+    try {
       encoder0.encodeStruct(metadata, 24, true);
     } on bindings.MojoCodecError catch(e) {
       e.message = "Error encountered while encoding field "
@@ -104,15 +99,15 @@
 
   String toString() {
     return "MediaPlayerStatus("
-           "state: $state" ", "
            "timelineTransform: $timelineTransform" ", "
+           "endOfStream: $endOfStream" ", "
            "metadata: $metadata" ")";
   }
 
   Map toJson() {
     Map map = new Map();
-    map["state"] = state;
     map["timelineTransform"] = timelineTransform;
+    map["endOfStream"] = endOfStream;
     map["metadata"] = metadata;
     return map;
   }
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
index 6b73e31..291fa4f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
@@ -7,103 +7,11 @@
 import 'package:mojo/bindings.dart' as bindings;
 import 'package:mojo/core.dart' as core;
 import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
 import 'package:mojo_services/mojo/media/media_transport.mojom.dart' as media_transport_mojom;
-import 'package:mojo_services/mojo/timelines.mojom.dart' as timelines_mojom;
+import 'package:mojo_services/mojo/media/timeline_controller.mojom.dart' as timeline_controller_mojom;
 
 
 
-class MediaSinkStatus extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  media_state_mojom.MediaState state = null;
-  timelines_mojom.TimelineTransform timelineTransform = null;
-
-  MediaSinkStatus() : super(kVersions.last.size);
-
-  static MediaSinkStatus deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static MediaSinkStatus decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    MediaSinkStatus result = new MediaSinkStatus();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-        result.state = media_state_mojom.MediaState.decode(decoder0, 8);
-        if (result.state == null) {
-          throw new bindings.MojoCodecError(
-            'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
-        }
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(16, true);
-      result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeEnum(state, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "state of struct MediaSinkStatus: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeStruct(timelineTransform, 16, true);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "timelineTransform of struct MediaSinkStatus: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "MediaSinkStatus("
-           "state: $state" ", "
-           "timelineTransform: $timelineTransform" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["state"] = state;
-    map["timelineTransform"] = timelineTransform;
-    return map;
-  }
-}
-
-
 class _MediaSinkGetConsumerParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
@@ -175,15 +83,15 @@
 }
 
 
-class _MediaSinkGetStatusParams extends bindings.Struct {
+class _MediaSinkGetTimelineControlSiteParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
-  int versionLastSeen = 0;
+  timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite = null;
 
-  _MediaSinkGetStatusParams() : super(kVersions.last.size);
+  _MediaSinkGetTimelineControlSiteParams() : super(kVersions.last.size);
 
-  static _MediaSinkGetStatusParams deserialize(bindings.Message message) {
+  static _MediaSinkGetTimelineControlSiteParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -192,11 +100,11 @@
     return result;
   }
 
-  static _MediaSinkGetStatusParams decode(bindings.Decoder decoder0) {
+  static _MediaSinkGetTimelineControlSiteParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    _MediaSinkGetStatusParams result = new _MediaSinkGetStatusParams();
+    _MediaSinkGetTimelineControlSiteParams result = new _MediaSinkGetTimelineControlSiteParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -218,7 +126,7 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      result.versionLastSeen = decoder0.decodeUint64(8);
+      result.timelineControlSite = decoder0.decodeInterfaceRequest(8, false, timeline_controller_mojom.MediaTimelineControlSiteStub.newFromEndpoint);
     }
     return result;
   }
@@ -226,233 +134,27 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     try {
-      encoder0.encodeUint64(versionLastSeen, 8);
+      encoder0.encodeInterfaceRequest(timelineControlSite, 8, false);
     } on bindings.MojoCodecError catch(e) {
       e.message = "Error encountered while encoding field "
-          "versionLastSeen of struct _MediaSinkGetStatusParams: $e";
+          "timelineControlSite of struct _MediaSinkGetTimelineControlSiteParams: $e";
       rethrow;
     }
   }
 
   String toString() {
-    return "_MediaSinkGetStatusParams("
-           "versionLastSeen: $versionLastSeen" ")";
+    return "_MediaSinkGetTimelineControlSiteParams("
+           "timelineControlSite: $timelineControlSite" ")";
   }
 
   Map toJson() {
-    Map map = new Map();
-    map["versionLastSeen"] = versionLastSeen;
-    return map;
-  }
-}
-
-
-class MediaSinkGetStatusResponseParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  int version = 0;
-  MediaSinkStatus status = null;
-
-  MediaSinkGetStatusResponseParams() : super(kVersions.last.size);
-
-  static MediaSinkGetStatusResponseParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static MediaSinkGetStatusResponseParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    MediaSinkGetStatusResponseParams result = new MediaSinkGetStatusResponseParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.version = decoder0.decodeUint64(8);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(16, false);
-      result.status = MediaSinkStatus.decode(decoder1);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeUint64(version, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "version of struct MediaSinkGetStatusResponseParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeStruct(status, 16, false);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "status of struct MediaSinkGetStatusResponseParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "MediaSinkGetStatusResponseParams("
-           "version: $version" ", "
-           "status: $status" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["version"] = version;
-    map["status"] = status;
-    return map;
-  }
-}
-
-
-class _MediaSinkPlayParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(8, 0)
-  ];
-
-  _MediaSinkPlayParams() : super(kVersions.last.size);
-
-  static _MediaSinkPlayParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _MediaSinkPlayParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _MediaSinkPlayParams result = new _MediaSinkPlayParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    encoder.getStructEncoderAtOffset(kVersions.last);
-  }
-
-  String toString() {
-    return "_MediaSinkPlayParams("")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    return map;
-  }
-}
-
-
-class _MediaSinkPauseParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(8, 0)
-  ];
-
-  _MediaSinkPauseParams() : super(kVersions.last.size);
-
-  static _MediaSinkPauseParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _MediaSinkPauseParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _MediaSinkPauseParams result = new _MediaSinkPauseParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    encoder.getStructEncoderAtOffset(kVersions.last);
-  }
-
-  String toString() {
-    return "_MediaSinkPauseParams("")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    return map;
+    throw new bindings.MojoCodecError(
+        'Object containing handles cannot be encoded to JSON.');
   }
 }
 
 const int _mediaSinkMethodGetConsumerName = 0;
-const int _mediaSinkMethodGetStatusName = 1;
-const int _mediaSinkMethodPlayName = 2;
-const int _mediaSinkMethodPauseName = 3;
+const int _mediaSinkMethodGetTimelineControlSiteName = 1;
 
 class _MediaSinkServiceDescription implements service_describer.ServiceDescription {
   dynamic getTopLevelInterface([Function responseFactory]) =>
@@ -488,10 +190,7 @@
     return p;
   }
   void getConsumer(media_transport_mojom.MediaConsumerInterfaceRequest consumer);
-  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]);
-  void play();
-  void pause();
-  static const int kInitialStatus = 0;
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite);
 }
 
 abstract class MediaSinkInterface
@@ -527,26 +226,6 @@
 
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
-      case _mediaSinkMethodGetStatusName:
-        var r = MediaSinkGetStatusResponseParams.deserialize(
-            message.payload);
-        if (!message.header.hasRequestId) {
-          proxyError("Expected a message with a valid request Id.");
-          return;
-        }
-        Completer c = completerMap[message.header.requestId];
-        if (c == null) {
-          proxyError(
-              "Message had unknown request Id: ${message.header.requestId}");
-          return;
-        }
-        completerMap.remove(message.header.requestId);
-        if (c.isCompleted) {
-          proxyError("Response completer already completed");
-          return;
-        }
-        c.complete(r);
-        break;
       default:
         proxyError("Unexpected message type: ${message.header.type}");
         close(immediate: true);
@@ -598,32 +277,15 @@
     ctrl.sendMessage(params,
         _mediaSinkMethodGetConsumerName);
   }
-  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-    var params = new _MediaSinkGetStatusParams();
-    params.versionLastSeen = versionLastSeen;
-    return ctrl.sendMessageWithRequestId(
-        params,
-        _mediaSinkMethodGetStatusName,
-        -1,
-        bindings.MessageHeader.kMessageExpectsResponse);
-  }
-  void play() {
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
     if (!ctrl.isBound) {
       ctrl.proxyError("The Proxy is closed.");
       return;
     }
-    var params = new _MediaSinkPlayParams();
+    var params = new _MediaSinkGetTimelineControlSiteParams();
+    params.timelineControlSite = timelineControlSite;
     ctrl.sendMessage(params,
-        _mediaSinkMethodPlayName);
-  }
-  void pause() {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _MediaSinkPauseParams();
-    ctrl.sendMessage(params,
-        _mediaSinkMethodPauseName);
+        _mediaSinkMethodGetTimelineControlSiteName);
   }
 }
 
@@ -649,12 +311,6 @@
   String get serviceName => MediaSink.serviceName;
 
 
-  MediaSinkGetStatusResponseParams _mediaSinkGetStatusResponseParamsFactory(int version, MediaSinkStatus status) {
-    var result = new MediaSinkGetStatusResponseParams();
-    result.version = version;
-    result.status = status;
-    return result;
-  }
 
   dynamic handleMessage(bindings.ServiceMessage message) {
     if (bindings.ControlMessageHandler.isControlMessage(message)) {
@@ -671,33 +327,10 @@
             message.payload);
         _impl.getConsumer(params.consumer);
         break;
-      case _mediaSinkMethodGetStatusName:
-        var params = _MediaSinkGetStatusParams.deserialize(
+      case _mediaSinkMethodGetTimelineControlSiteName:
+        var params = _MediaSinkGetTimelineControlSiteParams.deserialize(
             message.payload);
-        var response = _impl.getStatus(params.versionLastSeen,_mediaSinkGetStatusResponseParamsFactory);
-        if (response is Future) {
-          return response.then((response) {
-            if (response != null) {
-              return buildResponseWithId(
-                  response,
-                  _mediaSinkMethodGetStatusName,
-                  message.header.requestId,
-                  bindings.MessageHeader.kMessageIsResponse);
-            }
-          });
-        } else if (response != null) {
-          return buildResponseWithId(
-              response,
-              _mediaSinkMethodGetStatusName,
-              message.header.requestId,
-              bindings.MessageHeader.kMessageIsResponse);
-        }
-        break;
-      case _mediaSinkMethodPlayName:
-        _impl.play();
-        break;
-      case _mediaSinkMethodPauseName:
-        _impl.pause();
+        _impl.getTimelineControlSite(params.timelineControlSite);
         break;
       default:
         throw new bindings.MojoCodecError("Unexpected message name");
@@ -760,14 +393,8 @@
   void getConsumer(media_transport_mojom.MediaConsumerInterfaceRequest consumer) {
     return impl.getConsumer(consumer);
   }
-  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
-    return impl.getStatus(versionLastSeen,responseFactory);
-  }
-  void play() {
-    return impl.play();
-  }
-  void pause() {
-    return impl.pause();
+  void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
+    return impl.getTimelineControlSite(timelineControlSite);
   }
 }
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
index 002702d..bfd80b4 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
@@ -8,7 +8,6 @@
 import 'package:mojo/core.dart' as core;
 import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
 import 'package:mojo_services/mojo/media/media_metadata.mojom.dart' as media_metadata_mojom;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
 import 'package:mojo_services/mojo/media/media_transport.mojom.dart' as media_transport_mojom;
 import 'package:mojo_services/mojo/media/media_types.mojom.dart' as media_types_mojom;
 
@@ -118,9 +117,8 @@
 
 class MediaSourceStatus extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
+    const bindings.StructDataHeader(16, 0)
   ];
-  media_state_mojom.MediaState state = null;
   media_metadata_mojom.MediaMetadata metadata = null;
 
   MediaSourceStatus() : super(kVersions.last.size);
@@ -160,15 +158,7 @@
     }
     if (mainDataHeader.version >= 0) {
       
-        result.state = media_state_mojom.MediaState.decode(decoder0, 8);
-        if (result.state == null) {
-          throw new bindings.MojoCodecError(
-            'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
-        }
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(16, true);
+      var decoder1 = decoder0.decodePointer(8, true);
       result.metadata = media_metadata_mojom.MediaMetadata.decode(decoder1);
     }
     return result;
@@ -177,14 +167,7 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     try {
-      encoder0.encodeEnum(state, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "state of struct MediaSourceStatus: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeStruct(metadata, 16, true);
+      encoder0.encodeStruct(metadata, 8, true);
     } on bindings.MojoCodecError catch(e) {
       e.message = "Error encountered while encoding field "
           "metadata of struct MediaSourceStatus: $e";
@@ -194,13 +177,11 @@
 
   String toString() {
     return "MediaSourceStatus("
-           "state: $state" ", "
            "metadata: $metadata" ")";
   }
 
   Map toJson() {
     Map map = new Map();
-    map["state"] = state;
     map["metadata"] = metadata;
     return map;
   }
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart
deleted file mode 100644
index afeb2af..0000000
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library media_state_mojom;
-import 'package:mojo/bindings.dart' as bindings;
-
-
-class MediaState extends bindings.MojoEnum {
-  static const MediaState fault = const MediaState._(0);
-  static const MediaState unprepared = const MediaState._(1);
-  static const MediaState paused = const MediaState._(2);
-  static const MediaState playing = const MediaState._(3);
-  static const MediaState ended = const MediaState._(4);
-
-  const MediaState._(int v) : super(v);
-
-  static const Map<String, MediaState> valuesMap = const {
-    "fault": fault,
-    "unprepared": unprepared,
-    "paused": paused,
-    "playing": playing,
-    "ended": ended,
-  };
-  static const List<MediaState> values = const [
-    fault,
-    unprepared,
-    paused,
-    playing,
-    ended,
-  ];
-
-  static MediaState valueOf(String name) => valuesMap[name];
-
-  factory MediaState(int v) {
-    switch (v) {
-      case 0:
-        return MediaState.fault;
-      case 1:
-        return MediaState.unprepared;
-      case 2:
-        return MediaState.paused;
-      case 3:
-        return MediaState.playing;
-      case 4:
-        return MediaState.ended;
-      default:
-        return null;
-    }
-  }
-
-  static MediaState decode(bindings.Decoder decoder0, int offset) {
-    int v = decoder0.decodeUint32(offset);
-    MediaState result = new MediaState(v);
-    if (result == null) {
-      throw new bindings.MojoCodecError(
-          'Bad value $v for enum MediaState.');
-    }
-    return result;
-  }
-
-  String toString() {
-    switch(this) {
-      case fault:
-        return 'MediaState.fault';
-      case unprepared:
-        return 'MediaState.unprepared';
-      case paused:
-        return 'MediaState.paused';
-      case playing:
-        return 'MediaState.playing';
-      case ended:
-        return 'MediaState.ended';
-      default:
-        return null;
-    }
-  }
-
-  int toJson() => mojoEnumValue;
-}
-
-
-
-
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
deleted file mode 100644
index f810a8a..0000000
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
+++ /dev/null
@@ -1,1235 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library rate_control_mojom;
-import 'dart:async';
-import 'package:mojo/bindings.dart' as bindings;
-import 'package:mojo/core.dart' as core;
-import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
-
-
-
-class TimelineQuad extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(32, 0)
-  ];
-  int referenceOffset = 0;
-  int targetOffset = 0;
-  int referenceDelta = 0;
-  int targetDelta = 1;
-
-  TimelineQuad() : super(kVersions.last.size);
-
-  static TimelineQuad deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static TimelineQuad decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    TimelineQuad result = new TimelineQuad();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceOffset = decoder0.decodeInt64(8);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetOffset = decoder0.decodeInt64(16);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceDelta = decoder0.decodeUint32(24);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetDelta = decoder0.decodeUint32(28);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeInt64(referenceOffset, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceOffset of struct TimelineQuad: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeInt64(targetOffset, 16);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetOffset of struct TimelineQuad: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(referenceDelta, 24);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceDelta of struct TimelineQuad: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(targetDelta, 28);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetDelta of struct TimelineQuad: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "TimelineQuad("
-           "referenceOffset: $referenceOffset" ", "
-           "targetOffset: $targetOffset" ", "
-           "referenceDelta: $referenceDelta" ", "
-           "targetDelta: $targetDelta" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["referenceOffset"] = referenceOffset;
-    map["targetOffset"] = targetOffset;
-    map["referenceDelta"] = referenceDelta;
-    map["targetDelta"] = targetDelta;
-    return map;
-  }
-}
-
-
-class TimelineTransform extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  static const int kLocalTimeId = 4294967295;
-  static const int kContextual = 4294967294;
-  TimelineQuad quad = null;
-  int referenceTimelineId = 4294967294;
-  int targetTimelineId = 4294967295;
-
-  TimelineTransform() : super(kVersions.last.size);
-
-  static TimelineTransform deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static TimelineTransform decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    TimelineTransform result = new TimelineTransform();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(8, false);
-      result.quad = TimelineQuad.decode(decoder1);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceTimelineId = decoder0.decodeUint32(16);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetTimelineId = decoder0.decodeUint32(20);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeStruct(quad, 8, false);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "quad of struct TimelineTransform: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(referenceTimelineId, 16);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceTimelineId of struct TimelineTransform: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(targetTimelineId, 20);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetTimelineId of struct TimelineTransform: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "TimelineTransform("
-           "quad: $quad" ", "
-           "referenceTimelineId: $referenceTimelineId" ", "
-           "targetTimelineId: $targetTimelineId" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["quad"] = quad;
-    map["referenceTimelineId"] = referenceTimelineId;
-    map["targetTimelineId"] = targetTimelineId;
-    return map;
-  }
-}
-
-
-class _RateControlGetCurrentTransformParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(8, 0)
-  ];
-
-  _RateControlGetCurrentTransformParams() : super(kVersions.last.size);
-
-  static _RateControlGetCurrentTransformParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlGetCurrentTransformParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlGetCurrentTransformParams result = new _RateControlGetCurrentTransformParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    encoder.getStructEncoderAtOffset(kVersions.last);
-  }
-
-  String toString() {
-    return "_RateControlGetCurrentTransformParams("")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    return map;
-  }
-}
-
-
-class RateControlGetCurrentTransformResponseParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(16, 0)
-  ];
-  TimelineTransform trans = null;
-
-  RateControlGetCurrentTransformResponseParams() : super(kVersions.last.size);
-
-  static RateControlGetCurrentTransformResponseParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static RateControlGetCurrentTransformResponseParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    RateControlGetCurrentTransformResponseParams result = new RateControlGetCurrentTransformResponseParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(8, false);
-      result.trans = TimelineTransform.decode(decoder1);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeStruct(trans, 8, false);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "trans of struct RateControlGetCurrentTransformResponseParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "RateControlGetCurrentTransformResponseParams("
-           "trans: $trans" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["trans"] = trans;
-    return map;
-  }
-}
-
-
-class _RateControlSetCurrentQuadParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(16, 0)
-  ];
-  TimelineQuad quad = null;
-
-  _RateControlSetCurrentQuadParams() : super(kVersions.last.size);
-
-  static _RateControlSetCurrentQuadParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlSetCurrentQuadParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlSetCurrentQuadParams result = new _RateControlSetCurrentQuadParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(8, false);
-      result.quad = TimelineQuad.decode(decoder1);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeStruct(quad, 8, false);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "quad of struct _RateControlSetCurrentQuadParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "_RateControlSetCurrentQuadParams("
-           "quad: $quad" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["quad"] = quad;
-    return map;
-  }
-}
-
-
-class _RateControlSetTargetTimelineIdParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(16, 0)
-  ];
-  int id = 0;
-
-  _RateControlSetTargetTimelineIdParams() : super(kVersions.last.size);
-
-  static _RateControlSetTargetTimelineIdParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlSetTargetTimelineIdParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlSetTargetTimelineIdParams result = new _RateControlSetTargetTimelineIdParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.id = decoder0.decodeUint32(8);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeUint32(id, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "id of struct _RateControlSetTargetTimelineIdParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "_RateControlSetTargetTimelineIdParams("
-           "id: $id" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["id"] = id;
-    return map;
-  }
-}
-
-
-class _RateControlSetRateParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(16, 0)
-  ];
-  int referenceDelta = 0;
-  int targetDelta = 0;
-
-  _RateControlSetRateParams() : super(kVersions.last.size);
-
-  static _RateControlSetRateParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlSetRateParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlSetRateParams result = new _RateControlSetRateParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceDelta = decoder0.decodeUint32(8);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetDelta = decoder0.decodeUint32(12);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeUint32(referenceDelta, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceDelta of struct _RateControlSetRateParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(targetDelta, 12);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetDelta of struct _RateControlSetRateParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "_RateControlSetRateParams("
-           "referenceDelta: $referenceDelta" ", "
-           "targetDelta: $targetDelta" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["referenceDelta"] = referenceDelta;
-    map["targetDelta"] = targetDelta;
-    return map;
-  }
-}
-
-
-class _RateControlSetRateAtReferenceTimeParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  int referenceDelta = 0;
-  int targetDelta = 0;
-  int referenceTime = 0;
-
-  _RateControlSetRateAtReferenceTimeParams() : super(kVersions.last.size);
-
-  static _RateControlSetRateAtReferenceTimeParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlSetRateAtReferenceTimeParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlSetRateAtReferenceTimeParams result = new _RateControlSetRateAtReferenceTimeParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceDelta = decoder0.decodeUint32(8);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetDelta = decoder0.decodeUint32(12);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceTime = decoder0.decodeInt64(16);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeUint32(referenceDelta, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceDelta of struct _RateControlSetRateAtReferenceTimeParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(targetDelta, 12);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetDelta of struct _RateControlSetRateAtReferenceTimeParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeInt64(referenceTime, 16);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceTime of struct _RateControlSetRateAtReferenceTimeParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "_RateControlSetRateAtReferenceTimeParams("
-           "referenceDelta: $referenceDelta" ", "
-           "targetDelta: $targetDelta" ", "
-           "referenceTime: $referenceTime" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["referenceDelta"] = referenceDelta;
-    map["targetDelta"] = targetDelta;
-    map["referenceTime"] = referenceTime;
-    return map;
-  }
-}
-
-
-class _RateControlSetRateAtTargetTimeParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  int referenceDelta = 0;
-  int targetDelta = 0;
-  int targetTime = 0;
-
-  _RateControlSetRateAtTargetTimeParams() : super(kVersions.last.size);
-
-  static _RateControlSetRateAtTargetTimeParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlSetRateAtTargetTimeParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlSetRateAtTargetTimeParams result = new _RateControlSetRateAtTargetTimeParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.referenceDelta = decoder0.decodeUint32(8);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetDelta = decoder0.decodeUint32(12);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.targetTime = decoder0.decodeInt64(16);
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeUint32(referenceDelta, 8);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "referenceDelta of struct _RateControlSetRateAtTargetTimeParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeUint32(targetDelta, 12);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetDelta of struct _RateControlSetRateAtTargetTimeParams: $e";
-      rethrow;
-    }
-    try {
-      encoder0.encodeInt64(targetTime, 16);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "targetTime of struct _RateControlSetRateAtTargetTimeParams: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "_RateControlSetRateAtTargetTimeParams("
-           "referenceDelta: $referenceDelta" ", "
-           "targetDelta: $targetDelta" ", "
-           "targetTime: $targetTime" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["referenceDelta"] = referenceDelta;
-    map["targetDelta"] = targetDelta;
-    map["targetTime"] = targetTime;
-    return map;
-  }
-}
-
-
-class _RateControlCancelPendingChangesParams extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(8, 0)
-  ];
-
-  _RateControlCancelPendingChangesParams() : super(kVersions.last.size);
-
-  static _RateControlCancelPendingChangesParams deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static _RateControlCancelPendingChangesParams decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    _RateControlCancelPendingChangesParams result = new _RateControlCancelPendingChangesParams();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    encoder.getStructEncoderAtOffset(kVersions.last);
-  }
-
-  String toString() {
-    return "_RateControlCancelPendingChangesParams("")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    return map;
-  }
-}
-
-const int _rateControlMethodGetCurrentTransformName = 0;
-const int _rateControlMethodSetCurrentQuadName = 1;
-const int _rateControlMethodSetTargetTimelineIdName = 2;
-const int _rateControlMethodSetRateName = 3;
-const int _rateControlMethodSetRateAtReferenceTimeName = 4;
-const int _rateControlMethodSetRateAtTargetTimeName = 5;
-const int _rateControlMethodCancelPendingChangesName = 6;
-
-class _RateControlServiceDescription implements service_describer.ServiceDescription {
-  dynamic getTopLevelInterface([Function responseFactory]) =>
-      responseFactory(null);
-
-  dynamic getTypeDefinition(String typeKey, [Function responseFactory]) =>
-      responseFactory(null);
-
-  dynamic getAllTypeDefinitions([Function responseFactory]) =>
-      responseFactory(null);
-}
-
-abstract class RateControl {
-  static const String serviceName = null;
-
-  static service_describer.ServiceDescription _cachedServiceDescription;
-  static service_describer.ServiceDescription get serviceDescription {
-    if (_cachedServiceDescription == null) {
-      _cachedServiceDescription = new _RateControlServiceDescription();
-    }
-    return _cachedServiceDescription;
-  }
-
-  static RateControlProxy connectToService(
-      bindings.ServiceConnector s, String url, [String serviceName]) {
-    RateControlProxy p = new RateControlProxy.unbound();
-    String name = serviceName ?? RateControl.serviceName;
-    if ((name == null) || name.isEmpty) {
-      throw new core.MojoApiError(
-          "If an interface has no ServiceName, then one must be provided.");
-    }
-    s.connectToService(url, p, name);
-    return p;
-  }
-  dynamic getCurrentTransform([Function responseFactory = null]);
-  void setCurrentQuad(TimelineQuad quad);
-  void setTargetTimelineId(int id);
-  void setRate(int referenceDelta, int targetDelta);
-  void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime);
-  void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime);
-  void cancelPendingChanges();
-}
-
-abstract class RateControlInterface
-    implements bindings.MojoInterface<RateControl>,
-               RateControl {
-  factory RateControlInterface([RateControl impl]) =>
-      new RateControlStub.unbound(impl);
-  factory RateControlInterface.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint,
-      [RateControl impl]) =>
-      new RateControlStub.fromEndpoint(endpoint, impl);
-}
-
-abstract class RateControlInterfaceRequest
-    implements bindings.MojoInterface<RateControl>,
-               RateControl {
-  factory RateControlInterfaceRequest() =>
-      new RateControlProxy.unbound();
-}
-
-class _RateControlProxyControl
-    extends bindings.ProxyMessageHandler
-    implements bindings.ProxyControl<RateControl> {
-  _RateControlProxyControl.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
-
-  _RateControlProxyControl.fromHandle(
-      core.MojoHandle handle) : super.fromHandle(handle);
-
-  _RateControlProxyControl.unbound() : super.unbound();
-
-  String get serviceName => RateControl.serviceName;
-
-  void handleResponse(bindings.ServiceMessage message) {
-    switch (message.header.type) {
-      case _rateControlMethodGetCurrentTransformName:
-        var r = RateControlGetCurrentTransformResponseParams.deserialize(
-            message.payload);
-        if (!message.header.hasRequestId) {
-          proxyError("Expected a message with a valid request Id.");
-          return;
-        }
-        Completer c = completerMap[message.header.requestId];
-        if (c == null) {
-          proxyError(
-              "Message had unknown request Id: ${message.header.requestId}");
-          return;
-        }
-        completerMap.remove(message.header.requestId);
-        if (c.isCompleted) {
-          proxyError("Response completer already completed");
-          return;
-        }
-        c.complete(r);
-        break;
-      default:
-        proxyError("Unexpected message type: ${message.header.type}");
-        close(immediate: true);
-        break;
-    }
-  }
-
-  RateControl get impl => null;
-  set impl(RateControl _) {
-    throw new core.MojoApiError("The impl of a Proxy cannot be set.");
-  }
-
-  @override
-  String toString() {
-    var superString = super.toString();
-    return "_RateControlProxyControl($superString)";
-  }
-}
-
-class RateControlProxy
-    extends bindings.Proxy<RateControl>
-    implements RateControl,
-               RateControlInterface,
-               RateControlInterfaceRequest {
-  RateControlProxy.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint)
-      : super(new _RateControlProxyControl.fromEndpoint(endpoint));
-
-  RateControlProxy.fromHandle(core.MojoHandle handle)
-      : super(new _RateControlProxyControl.fromHandle(handle));
-
-  RateControlProxy.unbound()
-      : super(new _RateControlProxyControl.unbound());
-
-  static RateControlProxy newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RateControlProxy"));
-    return new RateControlProxy.fromEndpoint(endpoint);
-  }
-
-
-  dynamic getCurrentTransform([Function responseFactory = null]) {
-    var params = new _RateControlGetCurrentTransformParams();
-    return ctrl.sendMessageWithRequestId(
-        params,
-        _rateControlMethodGetCurrentTransformName,
-        -1,
-        bindings.MessageHeader.kMessageExpectsResponse);
-  }
-  void setCurrentQuad(TimelineQuad quad) {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlSetCurrentQuadParams();
-    params.quad = quad;
-    ctrl.sendMessage(params,
-        _rateControlMethodSetCurrentQuadName);
-  }
-  void setTargetTimelineId(int id) {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlSetTargetTimelineIdParams();
-    params.id = id;
-    ctrl.sendMessage(params,
-        _rateControlMethodSetTargetTimelineIdName);
-  }
-  void setRate(int referenceDelta, int targetDelta) {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlSetRateParams();
-    params.referenceDelta = referenceDelta;
-    params.targetDelta = targetDelta;
-    ctrl.sendMessage(params,
-        _rateControlMethodSetRateName);
-  }
-  void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlSetRateAtReferenceTimeParams();
-    params.referenceDelta = referenceDelta;
-    params.targetDelta = targetDelta;
-    params.referenceTime = referenceTime;
-    ctrl.sendMessage(params,
-        _rateControlMethodSetRateAtReferenceTimeName);
-  }
-  void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlSetRateAtTargetTimeParams();
-    params.referenceDelta = referenceDelta;
-    params.targetDelta = targetDelta;
-    params.targetTime = targetTime;
-    ctrl.sendMessage(params,
-        _rateControlMethodSetRateAtTargetTimeName);
-  }
-  void cancelPendingChanges() {
-    if (!ctrl.isBound) {
-      ctrl.proxyError("The Proxy is closed.");
-      return;
-    }
-    var params = new _RateControlCancelPendingChangesParams();
-    ctrl.sendMessage(params,
-        _rateControlMethodCancelPendingChangesName);
-  }
-}
-
-class _RateControlStubControl
-    extends bindings.StubMessageHandler
-    implements bindings.StubControl<RateControl> {
-  RateControl _impl;
-
-  _RateControlStubControl.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
-      : super.fromEndpoint(endpoint, autoBegin: impl != null) {
-    _impl = impl;
-  }
-
-  _RateControlStubControl.fromHandle(
-      core.MojoHandle handle, [RateControl impl])
-      : super.fromHandle(handle, autoBegin: impl != null) {
-    _impl = impl;
-  }
-
-  _RateControlStubControl.unbound([this._impl]) : super.unbound();
-
-  String get serviceName => RateControl.serviceName;
-
-
-  RateControlGetCurrentTransformResponseParams _rateControlGetCurrentTransformResponseParamsFactory(TimelineTransform trans) {
-    var result = new RateControlGetCurrentTransformResponseParams();
-    result.trans = trans;
-    return result;
-  }
-
-  dynamic handleMessage(bindings.ServiceMessage message) {
-    if (bindings.ControlMessageHandler.isControlMessage(message)) {
-      return bindings.ControlMessageHandler.handleMessage(this,
-                                                          0,
-                                                          message);
-    }
-    if (_impl == null) {
-      throw new core.MojoApiError("$this has no implementation set");
-    }
-    switch (message.header.type) {
-      case _rateControlMethodGetCurrentTransformName:
-        var response = _impl.getCurrentTransform(_rateControlGetCurrentTransformResponseParamsFactory);
-        if (response is Future) {
-          return response.then((response) {
-            if (response != null) {
-              return buildResponseWithId(
-                  response,
-                  _rateControlMethodGetCurrentTransformName,
-                  message.header.requestId,
-                  bindings.MessageHeader.kMessageIsResponse);
-            }
-          });
-        } else if (response != null) {
-          return buildResponseWithId(
-              response,
-              _rateControlMethodGetCurrentTransformName,
-              message.header.requestId,
-              bindings.MessageHeader.kMessageIsResponse);
-        }
-        break;
-      case _rateControlMethodSetCurrentQuadName:
-        var params = _RateControlSetCurrentQuadParams.deserialize(
-            message.payload);
-        _impl.setCurrentQuad(params.quad);
-        break;
-      case _rateControlMethodSetTargetTimelineIdName:
-        var params = _RateControlSetTargetTimelineIdParams.deserialize(
-            message.payload);
-        _impl.setTargetTimelineId(params.id);
-        break;
-      case _rateControlMethodSetRateName:
-        var params = _RateControlSetRateParams.deserialize(
-            message.payload);
-        _impl.setRate(params.referenceDelta, params.targetDelta);
-        break;
-      case _rateControlMethodSetRateAtReferenceTimeName:
-        var params = _RateControlSetRateAtReferenceTimeParams.deserialize(
-            message.payload);
-        _impl.setRateAtReferenceTime(params.referenceDelta, params.targetDelta, params.referenceTime);
-        break;
-      case _rateControlMethodSetRateAtTargetTimeName:
-        var params = _RateControlSetRateAtTargetTimeParams.deserialize(
-            message.payload);
-        _impl.setRateAtTargetTime(params.referenceDelta, params.targetDelta, params.targetTime);
-        break;
-      case _rateControlMethodCancelPendingChangesName:
-        _impl.cancelPendingChanges();
-        break;
-      default:
-        throw new bindings.MojoCodecError("Unexpected message name");
-        break;
-    }
-    return null;
-  }
-
-  RateControl get impl => _impl;
-  set impl(RateControl d) {
-    if (d == null) {
-      throw new core.MojoApiError("$this: Cannot set a null implementation");
-    }
-    if (isBound && (_impl == null)) {
-      beginHandlingEvents();
-    }
-    _impl = d;
-  }
-
-  @override
-  void bind(core.MojoMessagePipeEndpoint endpoint) {
-    super.bind(endpoint);
-    if (!isOpen && (_impl != null)) {
-      beginHandlingEvents();
-    }
-  }
-
-  @override
-  String toString() {
-    var superString = super.toString();
-    return "_RateControlStubControl($superString)";
-  }
-
-  int get version => 0;
-}
-
-class RateControlStub
-    extends bindings.Stub<RateControl>
-    implements RateControl,
-               RateControlInterface,
-               RateControlInterfaceRequest {
-  RateControlStub.unbound([RateControl impl])
-      : super(new _RateControlStubControl.unbound(impl));
-
-  RateControlStub.fromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
-      : super(new _RateControlStubControl.fromEndpoint(endpoint, impl));
-
-  RateControlStub.fromHandle(
-      core.MojoHandle handle, [RateControl impl])
-      : super(new _RateControlStubControl.fromHandle(handle, impl));
-
-  static RateControlStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RateControlStub"));
-    return new RateControlStub.fromEndpoint(endpoint);
-  }
-
-
-  dynamic getCurrentTransform([Function responseFactory = null]) {
-    return impl.getCurrentTransform(responseFactory);
-  }
-  void setCurrentQuad(TimelineQuad quad) {
-    return impl.setCurrentQuad(quad);
-  }
-  void setTargetTimelineId(int id) {
-    return impl.setTargetTimelineId(id);
-  }
-  void setRate(int referenceDelta, int targetDelta) {
-    return impl.setRate(referenceDelta, targetDelta);
-  }
-  void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
-    return impl.setRateAtReferenceTime(referenceDelta, targetDelta, referenceTime);
-  }
-  void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
-    return impl.setRateAtTargetTime(referenceDelta, targetDelta, targetTime);
-  }
-  void cancelPendingChanges() {
-    return impl.cancelPendingChanges();
-  }
-}
-
-
-
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
index 8ea67ec..a457963 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
@@ -485,8 +485,46 @@
 
 abstract class MediaTimelineController {
   static const String serviceName = null;
-  void addControlSite(Object controlSite);
-  void getControlSite(Object controlSite);
+
+  static service_describer.ServiceDescription _cachedServiceDescription;
+  static service_describer.ServiceDescription get serviceDescription {
+    if (_cachedServiceDescription == null) {
+      _cachedServiceDescription = new _MediaTimelineControllerServiceDescription();
+    }
+    return _cachedServiceDescription;
+  }
+
+  static MediaTimelineControllerProxy connectToService(
+      bindings.ServiceConnector s, String url, [String serviceName]) {
+    MediaTimelineControllerProxy p = new MediaTimelineControllerProxy.unbound();
+    String name = serviceName ?? MediaTimelineController.serviceName;
+    if ((name == null) || name.isEmpty) {
+      throw new core.MojoApiError(
+          "If an interface has no ServiceName, then one must be provided.");
+    }
+    s.connectToService(url, p, name);
+    return p;
+  }
+  void addControlSite(MediaTimelineControlSiteInterface controlSite);
+  void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite);
+}
+
+abstract class MediaTimelineControllerInterface
+    implements bindings.MojoInterface<MediaTimelineController>,
+               MediaTimelineController {
+  factory MediaTimelineControllerInterface([MediaTimelineController impl]) =>
+      new MediaTimelineControllerStub.unbound(impl);
+  factory MediaTimelineControllerInterface.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint,
+      [MediaTimelineController impl]) =>
+      new MediaTimelineControllerStub.fromEndpoint(endpoint, impl);
+}
+
+abstract class MediaTimelineControllerInterfaceRequest
+    implements bindings.MojoInterface<MediaTimelineController>,
+               MediaTimelineController {
+  factory MediaTimelineControllerInterfaceRequest() =>
+      new MediaTimelineControllerProxy.unbound();
 }
 
 class _MediaTimelineControllerProxyControl
@@ -555,7 +593,7 @@
     ctrl.sendMessage(params,
         _mediaTimelineControllerMethodAddControlSiteName);
   }
-  void getControlSite(Object controlSite) {
+  void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite) {
     if (!ctrl.isBound) {
       ctrl.proxyError("The Proxy is closed.");
       return;
@@ -671,7 +709,7 @@
   void addControlSite(MediaTimelineControlSiteInterface controlSite) {
     return impl.addControlSite(controlSite);
   }
-  void getControlSite(Object controlSite) {
+  void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite) {
     return impl.getControlSite(controlSite);
   }
 }
diff --git a/mojo/services/media/common/interfaces/BUILD.gn b/mojo/services/media/common/interfaces/BUILD.gn
index ffdb131..d3bf18d 100644
--- a/mojo/services/media/common/interfaces/BUILD.gn
+++ b/mojo/services/media/common/interfaces/BUILD.gn
@@ -9,7 +9,6 @@
   sources = [
     "media_common.mojom",
     "media_metadata.mojom",
-    "media_state.mojom",
     "media_transport.mojom",
     "media_types.mojom",
     "timelines.mojom",
diff --git a/mojo/services/media/common/interfaces/media_state.mojom b/mojo/services/media/common/interfaces/media_state.mojom
deleted file mode 100644
index 76a6536..0000000
--- a/mojo/services/media/common/interfaces/media_state.mojom
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[DartPackage="mojo_services"]
-module mojo.media;
-
-// Expresses the overall state of a media component.
-enum MediaState {
-  // Unable to function due to error. Fault details are provided elsewhere.
-  // TODO(dalesat): Eliminate this state.
-  FAULT,
-
-  // Requires preparation in order to function.
-  UNPREPARED,
-
-  // Prepared, rate zero (paused).
-  PAUSED,
-
-  // Prepared, rate non-zero.
-  PLAYING,
-
-  // Stopped playing because end-of-stream was encountered.
-  ENDED,
-};
diff --git a/mojo/services/media/common/interfaces/timelines.mojom b/mojo/services/media/common/interfaces/timelines.mojom
index 39e4aef..1347712 100644
--- a/mojo/services/media/common/interfaces/timelines.mojom
+++ b/mojo/services/media/common/interfaces/timelines.mojom
@@ -40,15 +40,18 @@
 
 // A push-mode consumer of timeline updates.
 interface TimelineConsumer {
-  // Sets the timeline transform at the indicated effective time. Exactly one
-  // of the effective_*_time values must be kUnspecifiedTime.
+  // Sets the timeline transform at the indicated effective time. At least one
+  // of the effective_*_time values must be kUnspecifiedTime. If both are
+  // kUnspecifiedTime, the requested change is implemented as soon as possible.
   // effective_subject_time can only be specified if the current subject_delta
   // isn’t zero. reference_delta may not be zero. subject_time may be
   // kUnspecifiedTime to indicate that the new transform subject_time should
-  // be inferred from the effective time. The new transform reference_time is
-  // always inferred from the effective time. The callback is called at the
-  // effective time or when a pending operation is cancelled due to a
-  // subsequent call, in which case the 'completed' value is false.
+  // be inferred from the effective time. The reference time for the new
+  // transform (the reference time that will correspond to the specified or
+  // inferred subject_time) is always inferred from the effective time. The
+  // callback is called at the effective time or when a pending operation is
+  // cancelled due to a subsequent call, in which case the 'completed' value is
+  // false.
   SetTimelineTransform(
       int64 subject_time,
       uint32 reference_delta,
diff --git a/mojo/services/media/control/interfaces/media_player.mojom b/mojo/services/media/control/interfaces/media_player.mojom
index 49f4aa4..6b3d0ed 100644
--- a/mojo/services/media/control/interfaces/media_player.mojom
+++ b/mojo/services/media/control/interfaces/media_player.mojom
@@ -6,7 +6,6 @@
 module mojo.media;
 
 import "mojo/services/media/common/interfaces/media_metadata.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
 import "mojo/services/media/common/interfaces/timelines.mojom";
 
 // Plays media.
@@ -22,8 +21,6 @@
   Pause();
 
   // Seeks to the specified position, specified in nanoseconds.
-  // TODO(dalesat): Consider adding relative vs remote flag.
-  // TODO(dalesat): Consider adding parameters regarding desired precision.
   Seek(int64 position);
 
   // Gets the status. To get the status immediately, call
@@ -35,13 +32,13 @@
 
 // MediaPlayer status information.
 struct MediaPlayerStatus {
-  // Current state of the player.
-  MediaState state;
-
   // Transform translating local time to presentation time. Reverse translation
   // (presentation time to local time) is only valid when media is playing.
   mojo.TimelineTransform? timeline_transform;
 
+  // Indicates whether presentation has reached end-of-stream.
+  bool end_of_stream;
+
   // Describes the media.
   MediaMetadata? metadata;
 };
diff --git a/mojo/services/media/control/interfaces/media_sink.mojom b/mojo/services/media/control/interfaces/media_sink.mojom
index ac6c311..85711a1 100644
--- a/mojo/services/media/control/interfaces/media_sink.mojom
+++ b/mojo/services/media/control/interfaces/media_sink.mojom
@@ -5,11 +5,8 @@
 [DartPackage="mojo_services"]
 module mojo.media;
 
-import "mojo/services/media/common/interfaces/media_common.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
 import "mojo/services/media/common/interfaces/media_transport.mojom";
-import "mojo/services/media/common/interfaces/media_types.mojom";
-import "mojo/services/media/common/interfaces/timelines.mojom";
+import "mojo/services/media/core/interfaces/timeline_controller.mojom";
 
 // TODO(dalesat): Define a media sink that multiplexes streams.
 
@@ -17,32 +14,9 @@
 interface MediaSink {
   // TODO(dalesat): Support fanout to many destinations.
 
-  // Special value for GetStatus version_last_seen parameter to get the current
-  // status immediately.
-  const uint64 kInitialStatus = 0;
-
   // Gets the consumer for the stream to be delivered.
   GetConsumer(MediaConsumer& consumer);
 
-  // Gets the status. To get the status immediately, call
-  // GetStatus(kInitialStatus). To get updates thereafter, pass the version
-  // sent in the previous callback.
-  GetStatus(uint64 version_last_seen)
-      => (uint64 version, MediaSinkStatus status);
-
-  // Starts playback.
-  Play();
-
-  // Pauses playback.
-  Pause();
-};
-
-// MediaSink status information.
-struct MediaSinkStatus {
-  // Current state of the sink.
-  MediaState state;
-
-  // Transform translating local time to presentation time. Reverse translation
-  // (presentation time to local time) is only valid when media is playing.
-  mojo.TimelineTransform? timeline_transform;
+  // Request the timeline control site for this sink
+  GetTimelineControlSite(MediaTimelineControlSite& timeline_control_site);
 };
diff --git a/mojo/services/media/control/interfaces/media_source.mojom b/mojo/services/media/control/interfaces/media_source.mojom
index b1b89d0..4bac510 100644
--- a/mojo/services/media/control/interfaces/media_source.mojom
+++ b/mojo/services/media/control/interfaces/media_source.mojom
@@ -5,9 +5,7 @@
 [DartPackage="mojo_services"]
 module mojo.media;
 
-import "mojo/services/media/common/interfaces/media_common.mojom";
 import "mojo/services/media/common/interfaces/media_metadata.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
 import "mojo/services/media/common/interfaces/media_transport.mojom";
 import "mojo/services/media/common/interfaces/media_types.mojom";
 
@@ -59,9 +57,6 @@
 
 // Describes the media source.
 struct MediaSourceStatus {
-  // Current state of the source.
-  MediaState state;
-
   // Describes the media.
   MediaMetadata? metadata;
 };
diff --git a/services/media/audio/audio_pipe.cc b/services/media/audio/audio_pipe.cc
index eba55cd..476af5d 100644
--- a/services/media/audio/audio_pipe.cc
+++ b/services/media/audio/audio_pipe.cc
@@ -18,12 +18,14 @@
     AudioServerImpl* server,
     std::vector<Region>&& regions,  // NOLINT(build/c++11)
     int64_t start_pts,
-    int64_t end_pts)
+    int64_t end_pts,
+    uint32_t frame_count)
   : state_(std::move(state)),
     server_(server),
     regions_(std::move(regions)),
     start_pts_(start_pts),
-    end_pts_(end_pts)  {
+    end_pts_(end_pts),
+    frame_count_(frame_count) {
   DCHECK(state_);
   DCHECK(server_);
 }
@@ -130,7 +132,8 @@
                            server_,
                            std::move(regions),
                            start_pts,
-                           next_pts_)));
+                           next_pts_,
+                           frame_count)));
 
    if (!prime_callback_.is_null()) {
      // Prime was requested. Call the callback to indicate priming is complete.
diff --git a/services/media/audio/audio_pipe.h b/services/media/audio/audio_pipe.h
index d1fd7e2..eaf3d11 100644
--- a/services/media/audio/audio_pipe.h
+++ b/services/media/audio/audio_pipe.h
@@ -58,7 +58,10 @@
 
     // Accessor for the regions in the shared buffer which contain the actual
     // sample data.
-    const std::vector<Region>& regions() const { return  regions_; }
+    const std::vector<Region>& regions() const { return regions_; }
+
+    uint32_t frame_count() const { return frame_count_; }
+    const MediaPacketStatePtr& state() const { return state_; }
 
    private:
     friend class AudioPipe;
@@ -66,7 +69,8 @@
                    AudioServerImpl* server,
                    std::vector<Region>&& regions,  // NOLINT(build/c++11)
                    int64_t start_pts,
-                   int64_t end_pts);
+                   int64_t end_pts,
+                   uint32_t frame_count);
 
     MediaPacketStatePtr state_;
     AudioServerImpl* server_;
@@ -74,6 +78,7 @@
     std::vector<Region> regions_;
     int64_t start_pts_;
     int64_t end_pts_;
+    uint32_t frame_count_;
   };
 
   AudioPipe(AudioTrackImpl* owner, AudioServerImpl* server);
diff --git a/services/media/audio/audio_track_impl.cc b/services/media/audio/audio_track_impl.cc
index 87f3418..55519aa 100644
--- a/services/media/audio/audio_track_impl.cc
+++ b/services/media/audio/audio_track_impl.cc
@@ -331,6 +331,12 @@
     DCHECK(output);
     output->PushToPendingQueue(packet);
   }
+
+  if (packet->state()->packet()->end_of_stream) {
+    timeline_control_site_.SetEndOfStreamPts(
+        (packet->state()->packet()->pts + packet->frame_count()) /
+            frames_per_ns_);
+  }
 }
 
 bool AudioTrackImpl::OnFlushRequested(const MediaConsumer::FlushCallback& cbk) {
diff --git a/services/media/common/timeline_control_site.cc b/services/media/common/timeline_control_site.cc
index 26dc07f..bafb5dd 100644
--- a/services/media/common/timeline_control_site.cc
+++ b/services/media/common/timeline_control_site.cc
@@ -36,7 +36,7 @@
           status = MediaTimelineControlSiteStatus::New();
           status->timeline_transform =
               TimelineTransform::From(current_timeline_function_);
-          status->end_of_stream = false; // TODO(dalesat): Provide this.
+          status->end_of_stream = ReachedEndOfStreamUnsafe();
         }
         callback.Run(version, status.Pass());
       });
@@ -82,6 +82,29 @@
   if (generation) {
     *generation = generation_;
   }
+
+  if (ReachedEndOfStreamUnsafe() && !end_of_stream_published_) {
+    end_of_stream_published_ = true;
+    task_runner_->PostTask(
+        FROM_HERE, base::Bind(&MojoPublisher<GetStatusCallback>::SendUpdates,
+                              base::Unretained(&status_publisher_)));
+  }
+}
+
+void TimelineControlSite::SetEndOfStreamPts(int64_t end_of_stream_pts) {
+  base::AutoLock lock(lock_);
+  if (end_of_stream_pts_ != end_of_stream_pts) {
+    end_of_stream_pts_ = end_of_stream_pts;
+    end_of_stream_published_ = false;
+  }
+}
+
+bool TimelineControlSite::ReachedEndOfStreamUnsafe() {
+  lock_.AssertAcquired();
+
+  return end_of_stream_pts_ != kUnspecifiedTime &&
+         current_timeline_function_(Timeline::local_now()) >=
+             end_of_stream_pts_;
 }
 
 void TimelineControlSite::GetStatus(uint64_t version_last_seen,
@@ -115,6 +138,12 @@
          current_timeline_function_.subject_delta() != 0);
   RCHECK(reference_delta != 0);
 
+  if (subject_time != kUnspecifiedTime &&
+      end_of_stream_pts_ != kUnspecifiedTime) {
+    end_of_stream_pts_ = kUnspecifiedTime;
+    end_of_stream_published_ = false;
+  }
+
   if (effective_subject_time != kUnspecifiedTime) {
     // Infer effective_reference_time from effective_subject_time.
     effective_reference_time =
diff --git a/services/media/common/timeline_control_site.h b/services/media/common/timeline_control_site.h
index 4b2506f..851073f 100644
--- a/services/media/common/timeline_control_site.h
+++ b/services/media/common/timeline_control_site.h
@@ -38,6 +38,9 @@
                                TimelineFunction* out,
                                uint32_t* generation = nullptr);
 
+  // Sets the current end_of_stream status published by the control site.
+  void SetEndOfStreamPts(int64_t end_of_stream_pts);
+
   // MediaTimelineControlSite implementation.
   void GetStatus(uint64_t version_last_seen,
                  const GetStatusCallback& callback) override;
@@ -68,6 +71,9 @@
     return pending_timeline_function_.reference_time() != kUnspecifiedTime;
   }
 
+  // Determines whether end-of-stream has been reached.
+  bool ReachedEndOfStreamUnsafe();
+
   // Unbinds from clients and resets to initial state.
   void ResetUnsafe();
 
@@ -85,6 +91,8 @@
   TimelineFunction pending_timeline_function_;
   SetTimelineTransformCallback set_timeline_transform_callback_;
   uint32_t generation_ = 1;
+  int64_t end_of_stream_pts_ = kUnspecifiedTime;
+  bool end_of_stream_published_ = false;
   // END fields synchronized using lock_.
 };
 
diff --git a/services/media/factory_service/audio_track_controller.cc b/services/media/factory_service/audio_track_controller.cc
index 3b85597..5db316c 100644
--- a/services/media/factory_service/audio_track_controller.cc
+++ b/services/media/factory_service/audio_track_controller.cc
@@ -45,10 +45,12 @@
   MediaConsumerPtr consumer;
   audio_track_->Configure(config.Pass(), GetProxy(&consumer));
 
-  MediaTimelineControlSitePtr timeline_control_site;
-  audio_track_->GetTimelineControlSite(GetProxy(&timeline_control_site));
+  callback(consumer.Pass());
+}
 
-  callback(consumer.Pass(), timeline_control_site.Pass());
+void AudioTrackController::GetTimelineControlSite(
+    InterfaceRequest<MediaTimelineControlSite> req) {
+  audio_track_->GetTimelineControlSite(req.Pass());
 }
 
 }  // namespace media
diff --git a/services/media/factory_service/audio_track_controller.h b/services/media/factory_service/audio_track_controller.h
index 6a60dc9..0674e41 100644
--- a/services/media/factory_service/audio_track_controller.h
+++ b/services/media/factory_service/audio_track_controller.h
@@ -18,8 +18,7 @@
  public:
   using GetSupportedMediaTypesCallback = std::function<void(
       std::unique_ptr<std::vector<std::unique_ptr<StreamTypeSet>>>)>;
-  using ConfigureCallback =
-      std::function<void(MediaConsumerPtr, MediaTimelineControlSitePtr)>;
+  using ConfigureCallback = std::function<void(MediaConsumerPtr)>;
 
   AudioTrackController(const String& url, ApplicationImpl* app);
 
@@ -32,6 +31,9 @@
   void Configure(const std::unique_ptr<StreamType>& stream_type,
                  const ConfigureCallback& callback);
 
+  // Gets the timeline control site for the audio track.
+  void GetTimelineControlSite(InterfaceRequest<MediaTimelineControlSite> req);
+
  private:
   AudioTrackPtr audio_track_;
 };
diff --git a/services/media/factory_service/media_player_impl.cc b/services/media/factory_service/media_player_impl.cc
index 8fa10af..a963299 100644
--- a/services/media/factory_service/media_player_impl.cc
+++ b/services/media/factory_service/media_player_impl.cc
@@ -4,6 +4,7 @@
 
 #include "base/logging.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/services/media/common/cpp/timeline.h"
 #include "services/media/factory_service/media_player_impl.h"
 #include "services/media/framework/parts/reader.h"
 #include "services/media/framework/util/callback_joiner.h"
@@ -26,14 +27,14 @@
     : MediaFactoryService::Product<MediaPlayer>(this, request.Pass(), owner) {
   DCHECK(reader);
 
-  status_publisher_.SetCallbackRunner(
-      [this](const GetStatusCallback& callback, uint64_t version) {
-        MediaPlayerStatusPtr status = MediaPlayerStatus::New();
-        status->state = reported_media_state_;
-        status->timeline_transform = transform_.Clone();
-        status->metadata = metadata_.Clone();
-        callback.Run(version, status.Pass());
-      });
+  status_publisher_.SetCallbackRunner([this](const GetStatusCallback& callback,
+                                             uint64_t version) {
+    MediaPlayerStatusPtr status = MediaPlayerStatus::New();
+    status->timeline_transform = TimelineTransform::From(timeline_function_);
+    status->end_of_stream = AllSinksAtEndOfStream();
+    status->metadata = metadata_.Clone();
+    callback.Run(version, status.Pass());
+  });
 
   state_ = State::kWaiting;
 
@@ -71,7 +72,6 @@
     callback_joiner->WhenJoined([this]() {
       // The enabled streams are prepared.
       factory_.reset();
-      SetReportedMediaState(MediaState::PAUSED);
       state_ = State::kPaused;
       Update();
     });
@@ -84,63 +84,38 @@
   while (true) {
     switch (state_) {
       case State::kPaused:
-        if (target_position_ != kNotSeeking) {
+        if (target_position_ != kUnspecifiedTime) {
           WhenPausedAndSeeking();
           break;
         }
 
-        if (target_state_ == MediaState::PLAYING) {
+        if (target_state_ == State::kPlaying) {
           if (!flushed_) {
-            ChangeSinkStates(MediaState::PLAYING);
-            state_ = State::kWaitingForSinksToPlay;
+            SetSinkTimelineTransforms(1, 1);
+            state_ = State::kWaiting;
             break;
           }
 
           flushed_ = false;
           state_ = State::kWaiting;
           demux_->Prime([this]() {
-            ChangeSinkStates(MediaState::PLAYING);
-            state_ = State::kWaitingForSinksToPlay;
+            SetSinkTimelineTransforms(1, 1);
+            state_ = State::kWaiting;
             Update();
           });
         }
         return;
 
-      case State::kWaitingForSinksToPlay:
-        if (AllSinksAre(SinkState::kPlayingOrEnded)) {
-          state_ = State::kPlaying;
-          if (target_state_ == MediaState::PLAYING) {
-            SetReportedMediaState(MediaState::PLAYING);
-          }
-        }
-        return;
-
       case State::kPlaying:
-        if (target_position_ != kNotSeeking ||
-            target_state_ == MediaState::PAUSED) {
-          ChangeSinkStates(MediaState::PAUSED);
-          state_ = State::kWaitingForSinksToPause;
+        if (target_position_ != kUnspecifiedTime ||
+            target_state_ == State::kPaused) {
+          SetSinkTimelineTransforms(1, 0);
+          state_ = State::kWaiting;
           break;
         }
 
-        if (AllSinksAre(SinkState::kEnded)) {
-          target_state_ = MediaState::ENDED;
-          SetReportedMediaState(MediaState::ENDED);
-          state_ = State::kPaused;
-          break;
-        }
-        return;
-
-      case State::kWaitingForSinksToPause:
-        if (AllSinksAre(SinkState::kPausedOrEnded)) {
-          if (target_state_ == MediaState::PAUSED) {
-            if (AllSinksAre(SinkState::kEnded)) {
-              SetReportedMediaState(MediaState::ENDED);
-            } else {
-              SetReportedMediaState(MediaState::PAUSED);
-            }
-          }
-
+        if (AllSinksAtEndOfStream()) {
+          target_state_ = State::kPaused;
           state_ = State::kPaused;
           break;
         }
@@ -166,69 +141,71 @@
 
 void MediaPlayerImpl::WhenFlushedAndSeeking() {
   state_ = State::kWaiting;
-  DCHECK(target_position_ != kNotSeeking);
+  DCHECK(target_position_ != kUnspecifiedTime);
   demux_->Seek(target_position_, [this]() {
-    target_position_ = kNotSeeking;
+    transform_subject_time_ = target_position_;
+    target_position_ = kUnspecifiedTime;
     state_ = State::kPaused;
     Update();
   });
 }
 
-void MediaPlayerImpl::ChangeSinkStates(MediaState media_state) {
-  for (auto& stream : streams_) {
-    if (stream->enabled_) {
-      if (media_state == MediaState::PAUSED) {
-        stream->sink_->Pause();
-      } else {
-        stream->sink_->Play();
-      }
-    }
-  }
+void MediaPlayerImpl::SetSinkTimelineTransforms(uint32_t reference_delta,
+                                                uint32_t subject_delta) {
+  SetSinkTimelineTransforms(
+      transform_subject_time_, reference_delta, subject_delta,
+      Timeline::local_now() + kMinimumLeadTime, kUnspecifiedTime);
 }
 
-bool MediaPlayerImpl::AllSinksAre(SinkState sink_state) {
+void MediaPlayerImpl::SetSinkTimelineTransforms(
+    int64_t subject_time,
+    uint32_t reference_delta,
+    uint32_t subject_delta,
+    int64_t effective_reference_time,
+    int64_t effective_subject_time) {
+  std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create();
+
   for (auto& stream : streams_) {
     if (stream->enabled_) {
-      switch (sink_state) {
-        case SinkState::kPaused:
-          if (stream->state_ != MediaState::PAUSED) {
-            return false;
-          }
-          break;
-        case SinkState::kPlaying:
-          if (stream->state_ != MediaState::PLAYING) {
-            return false;
-          }
-          break;
-        case SinkState::kEnded:
-          if (stream->state_ != MediaState::ENDED) {
-            return false;
-          }
-          break;
-        case SinkState::kPausedOrEnded:
-          if (stream->state_ != MediaState::PAUSED &&
-              stream->state_ != MediaState::ENDED) {
-            return false;
-          }
-          break;
-        case SinkState::kPlayingOrEnded:
-          if (stream->state_ != MediaState::PLAYING &&
-              stream->state_ != MediaState::ENDED) {
-            return false;
-          }
-          break;
+      DCHECK(stream->timeline_consumer_);
+      callback_joiner->Spawn();
+      stream->timeline_consumer_->SetTimelineTransform(
+          subject_time, reference_delta, subject_delta,
+          effective_reference_time, effective_subject_time,
+          [this, callback_joiner](bool completed) {
+            callback_joiner->Complete();
+          });
+    }
+  }
+
+  transform_subject_time_ = kUnspecifiedTime;
+
+  callback_joiner->WhenJoined([this, subject_delta]() {
+    RCHECK(state_ == State::kWaiting);
+
+    if (subject_delta == 0) {
+      state_ = State::kPaused;
+    } else {
+      state_ = State::kPlaying;
+    }
+
+    Update();
+  });
+}
+
+bool MediaPlayerImpl::AllSinksAtEndOfStream() {
+  int result = false;
+
+  for (auto& stream : streams_) {
+    if (stream->enabled_) {
+      result = stream->end_of_stream_;
+      if (!result) {
+        break;
       }
     }
   }
 
-  return true;
-}
-
-void MediaPlayerImpl::SetReportedMediaState(MediaState media_state) {
-  if (reported_media_state_ != media_state) {
-    reported_media_state_ = media_state;
-    status_publisher_.SendUpdates();
-  }
+  return result;
 }
 
 void MediaPlayerImpl::GetStatus(uint64_t version_last_seen,
@@ -237,12 +214,12 @@
 }
 
 void MediaPlayerImpl::Play() {
-  target_state_ = MediaState::PLAYING;
+  target_state_ = State::kPlaying;
   Update();
 }
 
 void MediaPlayerImpl::Pause() {
-  target_state_ = MediaState::PAUSED;
+  target_state_ = State::kPaused;
   Update();
 }
 
@@ -304,24 +281,22 @@
   DCHECK(factory_);
 
   factory_->CreateSink(url, input_media_type.Clone(), GetProxy(&stream->sink_));
+  stream->sink_->GetTimelineControlSite(
+      GetProxy(&stream->timeline_control_site_));
+
+  HandleTimelineControlSiteStatusUpdates(stream);
+
+  stream->timeline_control_site_->GetTimelineConsumer(
+      GetProxy(&stream->timeline_consumer_));
 
   MediaConsumerPtr consumer;
   stream->sink_->GetConsumer(GetProxy(&consumer));
 
-  stream->decoded_producer_->Connect(
-      consumer.Pass(), [this, callback, stream]() {
-        stream->decoded_producer_.reset();
-
-        DCHECK(stream->state_ == MediaState::UNPREPARED);
-        DCHECK(reported_media_state_ == MediaState::UNPREPARED ||
-               reported_media_state_ == MediaState::FAULT);
-
-        stream->state_ = MediaState::PAUSED;
-
-        HandleSinkStatusUpdates(stream);
-
-        callback();
-      });
+  stream->decoded_producer_->Connect(consumer.Pass(),
+                                     [this, callback, stream]() {
+                                       stream->decoded_producer_.reset();
+                                       callback();
+                                     });
 }
 
 void MediaPlayerImpl::HandleDemuxMetadataUpdates(uint64_t version,
@@ -337,21 +312,22 @@
                       });
 }
 
-void MediaPlayerImpl::HandleSinkStatusUpdates(Stream* stream,
-                                              uint64_t version,
-                                              MediaSinkStatusPtr status) {
-  if (status && status->state > MediaState::UNPREPARED) {
-    // We transition to PAUSED when Connect completes.
-    DCHECK(stream->state_ > MediaState::UNPREPARED);
-    stream->state_ = status->state;
-    transform_ = status->timeline_transform.Pass();
+void MediaPlayerImpl::HandleTimelineControlSiteStatusUpdates(
+    Stream* stream,
+    uint64_t version,
+    MediaTimelineControlSiteStatusPtr status) {
+  if (status) {
+    // TODO(dalesat): Why does one sink determine timeline_function_?
+    timeline_function_ = status->timeline_transform.To<TimelineFunction>();
+    stream->end_of_stream_ = status->end_of_stream;
     status_publisher_.SendUpdates();
     Update();
   }
 
-  stream->sink_->GetStatus(
-      version, [this, stream](uint64_t version, MediaSinkStatusPtr status) {
-        HandleSinkStatusUpdates(stream, version, status.Pass());
+  stream->timeline_control_site_->GetStatus(
+      version, [this, stream](uint64_t version,
+                              MediaTimelineControlSiteStatusPtr status) {
+        HandleTimelineControlSiteStatusUpdates(stream, version, status.Pass());
       });
 }
 
diff --git a/services/media/factory_service/media_player_impl.h b/services/media/factory_service/media_player_impl.h
index 0a09d9c..d9b5be8 100644
--- a/services/media/factory_service/media_player_impl.h
+++ b/services/media/factory_service/media_player_impl.h
@@ -10,11 +10,14 @@
 
 #include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/services/media/common/cpp/timeline.h"
+#include "mojo/services/media/common/cpp/timeline_function.h"
 #include "mojo/services/media/common/interfaces/media_transport.mojom.h"
 #include "mojo/services/media/control/interfaces/media_factory.mojom.h"
 #include "mojo/services/media/core/interfaces/seeking_reader.mojom.h"
 #include "services/media/common/mojo_publisher.h"
 #include "services/media/factory_service/factory_service.h"
+#include "services/media/framework/util/callback_joiner.h"
 
 namespace mojo {
 namespace media {
@@ -41,24 +44,13 @@
   void Seek(int64_t position) override;
 
  private:
-  const int64_t kNotSeeking = std::numeric_limits<int64_t>::max();
+  static constexpr int64_t kMinimumLeadTime = Timeline::ns_from_ms(30);
 
   // Internal state.
   enum class State {
     kWaiting,  // Waiting for some work to complete.
     kPaused,
-    kWaitingForSinksToPlay,
     kPlaying,
-    kWaitingForSinksToPause
-  };
-
-  // For matching sink states.
-  enum class SinkState {
-    kPaused,
-    kPlaying,
-    kEnded,
-    kPausedOrEnded,
-    kPlayingOrEnded
   };
 
   struct Stream {
@@ -66,10 +58,12 @@
     ~Stream();
     size_t index_;
     bool enabled_ = false;
-    MediaState state_ = MediaState::UNPREPARED;
+    bool end_of_stream_ = false;
     MediaTypePtr media_type_;
     MediaTypeConverterPtr decoder_;
     MediaSinkPtr sink_;
+    MediaTimelineControlSitePtr timeline_control_site_;
+    TimelineConsumerPtr timeline_consumer_;
     MediaProducerPtr encoded_producer_;
     MediaProducerPtr decoded_producer_;
   };
@@ -87,14 +81,22 @@
   // Handles seeking in paused state with flushed pipeline.
   void WhenFlushedAndSeeking();
 
-  // Tells the sinks to change state.
-  void ChangeSinkStates(MediaState media_state);
+  // Sets the timeline transforms on all the sinks. transform_subject_time_ is
+  // used for the subject_time, and the effective_reference_time is now plus an
+  // epsilon.
+  void SetSinkTimelineTransforms(uint32_t reference_delta,
+                                 uint32_t subject_delta);
 
-  // Determines if all the enabled sinks have the specified state.
-  bool AllSinksAre(SinkState sink_state);
+  // Sets the timeline transforms on all the sinks.
+  void SetSinkTimelineTransforms(int64_t subject_time,
+                                 uint32_t reference_delta,
+                                 uint32_t subject_delta,
+                                 int64_t effective_reference_time,
+                                 int64_t effective_subject_time);
 
-  // Sets the reported_media_state_ field, calling StatusUpdated as needed.
-  void SetReportedMediaState(MediaState media_state);
+  // Determines if all the enabled sinks have reached end-of-stream. Returns
+  // false if there are no enabled streams.
+  bool AllSinksAtEndOfStream();
 
   // Prepares a stream.
   void PrepareStream(Stream* stream,
@@ -113,21 +115,23 @@
       uint64_t version = MediaDemux::kInitialMetadata,
       MediaMetadataPtr metadata = nullptr);
 
-  // Handles a status update from a sink. When called with the default
-  // argument values, initiates sink status updates.
-  void HandleSinkStatusUpdates(Stream* stream,
-                               uint64_t version = MediaSink::kInitialStatus,
-                               MediaSinkStatusPtr status = nullptr);
+  // Handles a status update from a control site. When called with the default
+  // argument values, initiates control site. status updates.
+  void HandleTimelineControlSiteStatusUpdates(
+      Stream* stream,
+      uint64_t version = MediaTimelineControlSite::kInitialStatus,
+      MediaTimelineControlSiteStatusPtr status = nullptr);
 
   MediaFactoryPtr factory_;
   MediaDemuxPtr demux_;
   std::vector<std::unique_ptr<Stream>> streams_;
   State state_ = State::kWaiting;
+  State target_state_ = State::kPaused;
   bool flushed_ = true;
-  MediaState reported_media_state_ = MediaState::UNPREPARED;
-  MediaState target_state_ = MediaState::PAUSED;
-  int64_t target_position_ = kNotSeeking;
-  TimelineTransformPtr transform_;
+  int64_t target_position_ = kUnspecifiedTime;
+  int64_t transform_subject_time_ = kUnspecifiedTime;
+  TimelineFunction timeline_function_;
+  CallbackJoiner set_transform_joiner_;
   MediaMetadataPtr metadata_;
   MojoPublisher<GetStatusCallback> status_publisher_;
 };
diff --git a/services/media/factory_service/media_sink_impl.cc b/services/media/factory_service/media_sink_impl.cc
index 1fec5bd..e6bbeec 100644
--- a/services/media/factory_service/media_sink_impl.cc
+++ b/services/media/factory_service/media_sink_impl.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 #include "base/logging.h"
-#include "mojo/services/media/common/cpp/timeline.h"
-#include "mojo/services/media/common/cpp/timeline_function.h"
 #include "services/media/factory_service/media_sink_impl.h"
 #include "services/media/framework/util/conversion_pipeline_builder.h"
 #include "services/media/framework_mojo/mojo_type_conversions.h"
@@ -32,16 +30,6 @@
   DCHECK(destination_url);
   DCHECK(media_type);
 
-  status_publisher_.SetCallbackRunner([this](const GetStatusCallback& callback,
-                                             uint64_t version) {
-    MediaSinkStatusPtr status = MediaSinkStatus::New();
-    status->state = (producer_state_ == MediaState::PAUSED && rate_ != 0.0)
-                        ? MediaState::PLAYING
-                        : producer_state_;
-    status->timeline_transform = TimelineTransform::From(timeline_function_);
-    callback.Run(version, status.Pass());
-  });
-
   PartRef consumer_ref = graph_.Add(consumer_);
   PartRef producer_ref = graph_.Add(producer_);
 
@@ -58,18 +46,9 @@
           DCHECK(producer_);
           graph_.FlushOutput(consumer_ref.output());
           producer_->FlushConnection(callback);
-          flushed_ = true;
         });
       });
 
-  producer_->SetStatusCallback([this](MediaState state) {
-    producer_state_ = state;
-    status_publisher_.SendUpdates();
-    if (state == MediaState::ENDED) {
-      Pause();
-    }
-  });
-
   // TODO(dalesat): Temporary, remove.
   if (destination_url == "nowhere") {
     // Throwing away the content.
@@ -104,38 +83,21 @@
                                 &graph_, &out, &producer_stream_type);
     if (!result) {
       // Failed to build conversion pipeline.
-      producer_state_ = MediaState::FAULT;
-      status_publisher_.SendUpdates();
+      LOG(WARNING) << "failed to build conversion pipeline";
+      // TODO(dalesat): Add problem reporting.
       return;
     }
 
     graph_.ConnectOutputToPart(out, producer_ref);
 
-    if (producer_stream_type->medium() == StreamType::Medium::kAudio) {
-      frames_per_ns_ =
-          TimelineRate(producer_stream_type->audio()->frames_per_second(),
-                       Timeline::ns_from_seconds(1));
-
-    } else {
-      // Unsupported producer stream type.
-      LOG(ERROR) << "unsupported producer stream type";
-      abort();
-    }
-
-    controller_->Configure(
-        std::move(producer_stream_type),
-        [this](MediaConsumerPtr consumer,
-               MediaTimelineControlSitePtr timeline_control_site) {
-          DCHECK(consumer);
-          DCHECK(timeline_control_site);
-          timeline_control_site->GetTimelineConsumer(
-              GetProxy(&timeline_consumer_));
-          producer_->Connect(consumer.Pass(), [this]() {
-            graph_.Prepare();
-            ready_.Occur();
-            MaybeSetRate();
-          });
-        });
+    controller_->Configure(std::move(producer_stream_type),
+                           [this](MediaConsumerPtr consumer) {
+                             DCHECK(consumer);
+                             producer_->Connect(consumer.Pass(), [this]() {
+                               graph_.Prepare();
+                               ready_.Occur();
+                             });
+                           });
   });
 }
 
@@ -145,69 +107,13 @@
   consumer_->AddBinding(consumer.Pass());
 }
 
-void MediaSinkImpl::GetStatus(uint64_t version_last_seen,
-                              const GetStatusCallback& callback) {
-  status_publisher_.Get(version_last_seen, callback);
-}
-
-void MediaSinkImpl::Play() {
-  target_rate_ = 1.0;
-  MaybeSetRate();
-}
-
-void MediaSinkImpl::Pause() {
-  target_rate_ = 0.0;
-  MaybeSetRate();
-}
-
-void MediaSinkImpl::MaybeSetRate() {
-  if (producer_state_ < MediaState::PAUSED || rate_ == target_rate_) {
-    return;
+void MediaSinkImpl::GetTimelineControlSite(
+    InterfaceRequest<MediaTimelineControlSite> req) {
+  if (!controller_) {
+    LOG(ERROR) << "GetTimelineControlSite not implemented for 'nowhere' case";
+    abort();
   }
-
-  if (!timeline_consumer_) {
-    rate_ = target_rate_;
-    status_publisher_.SendUpdates();
-    return;
-  }
-
-  // TODO(dalesat): start_local_time and start_presentation_time should be
-  // supplied via the mojo interface. For now, start_local_time is hard-coded
-  // to be 30ms in the future, and start_presentation_time is grabbed from the
-  // first primed packet or is calculated from start_local_time based on the
-  // previous timeline function.
-
-  // The local time when we want the rate to change.
-  int64_t start_local_time = Timeline::local_now() + Timeline::ns_from_ms(30);
-
-  // The media time corresponding to start_local_time.
-  int64_t start_presentation_time;
-  if (flushed_ && producer_->GetFirstPtsSinceFlush() != Packet::kUnknownPts) {
-    // We're getting started initially or after a flush/prime, so the media
-    // time corresponding to start_local_time should be the PTS of
-    // the first packet converted to ns (rather than frame) units.
-    start_presentation_time =
-        producer_->GetFirstPtsSinceFlush() / frames_per_ns_;
-  } else {
-    // We're resuming, so the media time corresponding to start_local_time can
-    // be calculated using the existing transform.
-    start_presentation_time = timeline_function_(start_local_time);
-  }
-
-  flushed_ = false;
-
-  // Update the transform.
-  timeline_function_ = TimelineFunction(
-      start_local_time, start_presentation_time, TimelineRate(target_rate_));
-
-  // Set the rate.
-  timeline_consumer_->SetTimelineTransform(
-      timeline_function_.subject_time(), timeline_function_.reference_delta(),
-      timeline_function_.subject_delta(), timeline_function_.reference_time(),
-      kUnspecifiedTime, [](bool completed) {});
-
-  rate_ = target_rate_;
-  status_publisher_.SendUpdates();
+  controller_->GetTimelineControlSite(req.Pass());
 }
 
 }  // namespace media
diff --git a/services/media/factory_service/media_sink_impl.h b/services/media/factory_service/media_sink_impl.h
index f323f62..320fad7 100644
--- a/services/media/factory_service/media_sink_impl.h
+++ b/services/media/factory_service/media_sink_impl.h
@@ -9,9 +9,8 @@
 
 #include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/services/media/common/cpp/timeline_function.h"
 #include "mojo/services/media/control/interfaces/media_sink.mojom.h"
-#include "services/media/common/mojo_publisher.h"
+#include "mojo/services/media/core/interfaces/timeline_controller.mojom.h"
 #include "services/media/factory_service/audio_track_controller.h"
 #include "services/media/factory_service/factory_service.h"
 #include "services/media/framework/graph.h"
@@ -39,12 +38,8 @@
   // MediaSink implementation.
   void GetConsumer(InterfaceRequest<MediaConsumer> consumer) override;
 
-  void GetStatus(uint64_t version_last_seen,
-                 const GetStatusCallback& callback) override;
-
-  void Play() override;
-
-  void Pause() override;
+  void GetTimelineControlSite(
+      InterfaceRequest<MediaTimelineControlSite> req) override;
 
  private:
   MediaSinkImpl(const String& destination_url,
@@ -52,23 +47,11 @@
                 InterfaceRequest<MediaSink> request,
                 MediaFactoryService* owner);
 
-  // Sets the rate if the producer is ready and the target rate differs from
-  // the current rate.
-  void MaybeSetRate();
-
   Incident ready_;
   Graph graph_;
   std::shared_ptr<MojoConsumer> consumer_;
   std::shared_ptr<MojoProducer> producer_;
   std::unique_ptr<AudioTrackController> controller_;
-  TimelineConsumerPtr timeline_consumer_;
-  float rate_ = 0.0f;
-  float target_rate_ = 0.0f;
-  MediaState producer_state_ = MediaState::UNPREPARED;
-  TimelineFunction timeline_function_;
-  TimelineRate frames_per_ns_;
-  bool flushed_ = true;
-  MojoPublisher<GetStatusCallback> status_publisher_;
 };
 
 }  // namespace media
diff --git a/services/media/factory_service/media_source_impl.cc b/services/media/factory_service/media_source_impl.cc
index 10311bc..c2e38db 100644
--- a/services/media/factory_service/media_source_impl.cc
+++ b/services/media/factory_service/media_source_impl.cc
@@ -41,7 +41,6 @@
   status_publisher_.SetCallbackRunner(
       [this](const GetStatusCallback& callback, uint64_t version) {
         MediaSourceStatusPtr status = MediaSourceStatus::New();
-        status->state = state_;
         status->metadata =
             demux_ ? MediaMetadata::From(demux_->metadata()) : nullptr;
         callback.Run(version, status.Pass());
@@ -49,15 +48,15 @@
 
   std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass());
   if (!reader_ptr) {
-    NOTREACHED() << "couldn't create reader";
-    state_ = MediaState::FAULT;
+    LOG(ERROR) << "couldn't create reader";
+    // TODO(dalesat): Add problem reporting.
     return;
   }
 
   demux_ = Demux::Create(reader_ptr);
   if (!demux_) {
-    NOTREACHED() << "couldn't create demux";
-    state_ = MediaState::FAULT;
+    LOG(ERROR) << "couldn't create demux";
+    // TODO(dalesat): Add problem reporting.
     return;
   }
 
@@ -138,7 +137,6 @@
     stream->EnsureSink();
   }
   graph_.Prepare();
-  state_ = MediaState::PAUSED;
   callback.Run();
   status_publisher_.SendUpdates();
 }
diff --git a/services/media/factory_service/media_source_impl.h b/services/media/factory_service/media_source_impl.h
index d056aa4..acc3b07 100644
--- a/services/media/factory_service/media_source_impl.h
+++ b/services/media/factory_service/media_source_impl.h
@@ -118,7 +118,6 @@
   std::shared_ptr<Demux> demux_;
   Incident init_complete_;
   std::vector<std::unique_ptr<Stream>> streams_;
-  MediaState state_ = MediaState::UNPREPARED;
   MojoPublisher<GetStatusCallback> status_publisher_;
 };
 
diff --git a/services/media/framework_mojo/mojo_formatting.cc b/services/media/framework_mojo/mojo_formatting.cc
index 7dfbc86..88baa16 100644
--- a/services/media/framework_mojo/mojo_formatting.cc
+++ b/services/media/framework_mojo/mojo_formatting.cc
@@ -384,21 +384,5 @@
   return "UNKNOWN FORMAT";
 }
 
-const char* StringFromMediaState(MediaState value) {
-  switch (value) {
-    case MediaState::FAULT:
-      return "FAULT";
-    case MediaState::UNPREPARED:
-      return "UNPREPARED";
-    case MediaState::PAUSED:
-      return "PAUSED";
-    case MediaState::PLAYING:
-      return "PLAYING";
-    case MediaState::ENDED:
-      return "ENDED";
-  }
-  return "UNKNOWN MEDIA STATE";
-}
-
 }  // namespace media
 }  // namespace mojo
diff --git a/services/media/framework_mojo/mojo_formatting.h b/services/media/framework_mojo/mojo_formatting.h
index 020d47e..bf17c27 100644
--- a/services/media/framework_mojo/mojo_formatting.h
+++ b/services/media/framework_mojo/mojo_formatting.h
@@ -21,7 +21,6 @@
 // Mojo defines versions of operator<< for this that produce only numbers.
 const char* StringFromMediaTypeMedium(MediaTypeMedium value);
 const char* StringFromAudioSampleFormat(AudioSampleFormat value);
-const char* StringFromMediaState(MediaState value);
 
 // The following overloads add newlines.
 
diff --git a/services/media/framework_mojo/mojo_producer.cc b/services/media/framework_mojo/mojo_producer.cc
index 7fb0ae3..f0c9c27 100644
--- a/services/media/framework_mojo/mojo_producer.cc
+++ b/services/media/framework_mojo/mojo_producer.cc
@@ -42,7 +42,6 @@
 
   DCHECK(demand_callback_);
   demand_callback_(demand);
-  SetState(MediaState::PAUSED);
 
   if (consumer_.is_bound()) {
     consumer_->Prime([this, callback]() { callback.Run(); });
@@ -65,17 +64,6 @@
   } else {
     callback.Run();
   }
-
-  first_pts_since_flush_ = Packet::kUnknownPts;
-  end_of_stream_ = false;
-}
-
-void MojoProducer::SetStatusCallback(const StatusCallback& callback) {
-  status_callback_ = callback;
-}
-
-int64_t MojoProducer::GetFirstPtsSinceFlush() {
-  return first_pts_since_flush_;
 }
 
 PayloadAllocator* MojoProducer::allocator() {
@@ -89,22 +77,9 @@
 Demand MojoProducer::SupplyPacket(PacketPtr packet) {
   DCHECK(packet);
 
-  if (first_pts_since_flush_ == Packet::kUnknownPts) {
-    first_pts_since_flush_ = packet->pts();
-  }
-
   // If we're not connected, throw the packet away.
   if (!consumer_.is_bound()) {
-    if (packet->end_of_stream()) {
-      {
-        base::AutoLock lock(lock_);
-        end_of_stream_ = true;
-      }
-      SetState(MediaState::ENDED);
-      return Demand::kNegative;
-    }
-
-    return Demand::kNeutral;
+    return packet->end_of_stream() ? Demand::kNegative : Demand::kNeutral;
   }
 
   Demand demand;
@@ -112,12 +87,10 @@
   {
     base::AutoLock lock(lock_);
     DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_);
-    DCHECK(!end_of_stream_) << "packet pushed after end-of-stream";
 
     ++current_pushes_outstanding_;
 
     if (packet->end_of_stream()) {
-      end_of_stream_ = true;
       demand = Demand::kNegative;
       max_pushes_outstanding_ = 0;
     } else {
@@ -153,7 +126,6 @@
 void MojoProducer::Disconnect() {
   DCHECK(demand_callback_);
   demand_callback_(Demand::kNegative);
-  SetState(MediaState::UNPREPARED);
   consumer_.reset();
 }
 
@@ -174,22 +146,9 @@
 
         DCHECK(demand_callback_);
         demand_callback_(demand);
-
-        if (end_of_stream_ && packet->end_of_stream()) {
-          SetState(MediaState::ENDED);
-        }
       });
 }
 
-void MojoProducer::SetState(MediaState state) {
-  if (state_ != state) {
-    state_ = state;
-    if (status_callback_) {
-      status_callback_(state_);
-    }
-  }
-}
-
 MediaPacketPtr MojoProducer::CreateMediaPacket(const PacketPtr& packet) {
   DCHECK(packet);
 
diff --git a/services/media/framework_mojo/mojo_producer.h b/services/media/framework_mojo/mojo_producer.h
index 16865d1..fb8b12a 100644
--- a/services/media/framework_mojo/mojo_producer.h
+++ b/services/media/framework_mojo/mojo_producer.h
@@ -19,7 +19,6 @@
 // Implements MediaProducer to forward a stream across mojo.
 class MojoProducer : public MediaProducer, public ActiveSink {
  public:
-  using StatusCallback = std::function<void(MediaState)>;
   using PrimeConnectionCallback = mojo::Callback<void()>;
   using FlushConnectionCallback = mojo::Callback<void()>;
 
@@ -39,13 +38,6 @@
   // Unprimes and tells the connected consumer to flush.
   void FlushConnection(const FlushConnectionCallback& callback);
 
-  // Sets a callback for reporting status updates.
-  void SetStatusCallback(const StatusCallback& callback);
-
-  // Gets the first presentation time seen on any packet after the most recent
-  // flush or, if there has never been a flush, the first packet supplied.
-  int64_t GetFirstPtsSinceFlush();
-
   // ActiveSink implementation.
   PayloadAllocator* allocator() override;
 
@@ -66,9 +58,6 @@
   // TODO(dalesat): Don't use a raw pointer, if possible.
   void SendPacket(Packet* packet_raw_ptr, MediaPacketPtr media_packet);
 
-  // Sets the current state and calls the registered callback, if there is one.
-  void SetState(MediaState state);
-
   // Creates a MediaPacket from a Packet.
   MediaPacketPtr CreateMediaPacket(const PacketPtr& packet);
 
@@ -77,15 +66,11 @@
 
   BindingSet<MediaProducer> bindings_;
   MediaConsumerPtr consumer_;
-  StatusCallback status_callback_;
 
   mutable base::Lock lock_;
   // THE FIELDS BELOW SHOULD ONLY BE ACCESSED WITH lock_ TAKEN.
-  MediaState state_ = MediaState::UNPREPARED;
-  bool end_of_stream_ = false;
   DemandCallback demand_callback_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  int64_t first_pts_since_flush_ = Packet::kUnknownPts;
   // TODO(dalesat): Base this logic on presentation time or duration.
   uint32_t max_pushes_outstanding_ = 0;
   uint32_t current_pushes_outstanding_ = 0;
