Make naming consistent across channel APIs (#3574)

diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn
index 36ee6a1..16b18b4 100644
--- a/shell/platform/android/BUILD.gn
+++ b/shell/platform/android/BUILD.gn
@@ -78,16 +78,17 @@
     "io/flutter/app/FlutterActivity.java",
     "io/flutter/app/FlutterApplication.java",
     "io/flutter/plugin/common/ActivityLifecycleListener.java",
+    "io/flutter/plugin/common/BasicMessageChannel.java",
     "io/flutter/plugin/common/BinaryCodec.java",
+    "io/flutter/plugin/common/BinaryMessenger.java",
     "io/flutter/plugin/common/FlutterException.java",
-    "io/flutter/plugin/common/FlutterEventChannel.java",
-    "io/flutter/plugin/common/FlutterMessageChannel.java",
-    "io/flutter/plugin/common/FlutterMethodChannel.java",
+    "io/flutter/plugin/common/EventChannel.java",
     "io/flutter/plugin/common/JSONMessageCodec.java",
     "io/flutter/plugin/common/JSONMethodCodec.java",
     "io/flutter/plugin/common/JSONUtil.java",
     "io/flutter/plugin/common/MessageCodec.java",
     "io/flutter/plugin/common/MethodCall.java",
+    "io/flutter/plugin/common/MethodChannel.java",
     "io/flutter/plugin/common/MethodCodec.java",
     "io/flutter/plugin/common/StandardMessageCodec.java",
     "io/flutter/plugin/common/StandardMethodCodec.java",
diff --git a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java
new file mode 100644
index 0000000..ae7a165
--- /dev/null
+++ b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java
@@ -0,0 +1,154 @@
+// Copyright 2017 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.
+
+package io.flutter.plugin.common;
+
+import android.util.Log;
+import java.nio.ByteBuffer;
+import io.flutter.plugin.common.BinaryMessenger.BinaryReply;
+import io.flutter.plugin.common.BinaryMessenger.BinaryMessageHandler;
+
+/**
+ * A named channel for communicating with the Flutter application using semi-structured messages.
+ *
+ * Messages are encoded into binary before being sent, and binary messages received are decoded
+ * into Java objects. The {@link MessageCodec} used must be compatible with the
+ * one used by the Flutter application. This can be achieved by creating a PlatformChannel
+ * counterpart of this channel on the Dart side. The static Java type of messages sent and received
+ * is Object, but only values supported by the specified {@link MessageCodec} can be used.
+ *
+ * The channel supports basic message send/receive operations. All communication is asynchronous.
+ *
+ * Identically named channels may interfere with each other's communication.
+ */
+public final class BasicMessageChannel<T> {
+    private static final String TAG = "FlutterMessageChannel#";
+
+    private final BinaryMessenger messenger;
+    private final String name;
+    private final MessageCodec<T> codec;
+
+    /**
+     * Creates a new channel associated with the specified {@link BinaryMessenger}
+     * and with the specified name and {@link MessageCodec}.
+     *
+     * @param messenger a {@link BinaryMessenger}.
+     * @param name a channel name String.
+     * @param codec a {@link MessageCodec}.
+     */
+    public BasicMessageChannel(BinaryMessenger messenger, String name, MessageCodec<T> codec) {
+        assert messenger != null;
+        assert name != null;
+        assert codec != null;
+        this.messenger = messenger;
+        this.name = name;
+        this.codec = codec;
+    }
+
+    /**
+     * Sends the specified message to the Flutter application on this channel.
+     *
+     * @param message the message, possibly null.
+     */
+    public void send(T message) {
+        send(message, null);
+    }
+
+    /**
+     * Sends the specified message to the Flutter application, optionally expecting a reply.
+     *
+     * @param message the message, possibly null.
+     * @param callback a {@link Reply} callback, possibly null.
+     */
+    public void send(T message, final Reply<T> callback) {
+        messenger.send(name, codec.encodeMessage(message),
+            callback == null ? null : new IncomingReplyHandler(callback));
+    }
+
+    /**
+     * Registers a message handler on this channel.
+     *
+     * Overrides any existing handler registration (for messages, method calls, or streams).
+     *
+     * @param handler a {@link MessageHandler}, or null to deregister.
+     */
+    public void setMessageHandler(final MessageHandler<T> handler) {
+        messenger.setMessageHandler(name,
+            handler == null ? null : new IncomingMessageHandler(handler));
+    }
+
+    /**
+     * A handler of incoming messages.
+     */
+    public interface MessageHandler<T> {
+
+        /**
+         * Handles the specified message.
+         *
+         * @param message the message, possibly null.
+         * @param reply a {@link Reply} for providing a single message reply.
+         */
+        void onMessage(T message, Reply<T> reply);
+    }
+
+    /**
+     * Message reply callback. Used to submit a reply to an incoming
+     * message from Flutter. Also used in the dual capacity to handle a reply
+     * received from Flutter after sending a message.
+     */
+    public interface Reply<T> {
+        /**
+         * Handles the specified message reply.
+         *
+         * @param reply the reply, possibly null.
+         */
+        void reply(T reply);
+    }
+
+    private final class IncomingReplyHandler implements BinaryReply {
+        private final Reply<T> callback;
+
+        private IncomingReplyHandler(Reply<T> callback) {
+            this.callback = callback;
+        }
+
+        @Override
+        public void reply(ByteBuffer reply) {
+            try {
+                callback.reply(codec.decodeMessage(reply));
+            } catch (Exception e) {
+                Log.e(TAG + name, "Failed to handle message reply", e);
+            }
+        }
+    }
+
+    private final class IncomingMessageHandler implements BinaryMessageHandler {
+        private final MessageHandler<T> handler;
+
+        private IncomingMessageHandler(MessageHandler<T> handler) {
+            this.handler = handler;
+        }
+
+        @Override
+        public void onMessage(ByteBuffer message, final BinaryReply callback) {
+            try {
+                handler.onMessage(codec.decodeMessage(message), new Reply<T>() {
+                    private boolean done = false;
+
+                    @Override
+                    public void reply(T reply) {
+                        if (done) {
+                            throw new IllegalStateException("Call result already provided");
+                        }
+                        callback.reply(codec.encodeMessage(reply));
+                        done = true;
+                    }
+                });
+            } catch (Exception e) {
+                Log.e(TAG + name, "Failed to handle message", e);
+                callback.reply(null);
+            }
+        }
+    }
+}
diff --git a/shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java b/shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java
new file mode 100644
index 0000000..1d91871
--- /dev/null
+++ b/shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java
@@ -0,0 +1,75 @@
+package io.flutter.plugin.common;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Facility for communicating with Flutter using asynchronous message passing with binary messages.
+ * The Flutter Dart code can use {@code BinaryMessages} to participate.
+ *
+ * @see BasicMessageChannel , which supports message passing with Strings and semi-structured messages.
+ * @see MethodChannel , which supports communication using asynchronous method invocation.
+ * @see EventChannel , which supports communication using event streams.
+ */
+public interface BinaryMessenger {
+    /**
+     * Sends a binary message to the Flutter application. The Flutter Dart code can register a
+     * platform message handler with {@code BinaryMessages} that will receive these messages.
+     *
+     * @param channel the name {@link String} of the channel that will receive this message.
+     * @param message the message payload, a {@link ByteBuffer} with the message bytes between position
+     * zero and current position, or null.
+     */
+    void send(String channel, ByteBuffer message);
+
+    /**
+     * Sends a binary message to the Flutter application,
+     *
+     * @param channel the name {@link String} of the channel that will receive this message.
+     * @param message the message payload, a {@link ByteBuffer} with the message bytes between position
+     * zero and current position, or null.
+     * @param callback a {@link BinaryReply} callback invoked when the Flutter application responds to the
+     * message, possibly null.
+     */
+    void send(String channel, ByteBuffer message, BinaryReply callback);
+
+    /**
+     * Registers a handler to be invoked when the Flutter application sends a message
+     * to its host platform.
+     *
+     * Registration overwrites any previous registration for the same channel name.
+     * Use a {@code null} handler to unregister.
+     *
+     * @param channel the name {@link String} of the channel.
+     * @param handler a {@link BinaryMessageHandler} to be invoked on incoming messages.
+     */
+    void setMessageHandler(String channel, BinaryMessageHandler handler);
+
+    /**
+     * Handler for incoming binary messages from Flutter.
+     */
+    interface BinaryMessageHandler {
+        /**
+         * Handles the specified message.
+         *
+         * @param message the message {@link ByteBuffer} payload.
+         * @param reply A {@link BinaryReply} used for submitting a reply back to Flutter.
+         */
+        void onMessage(ByteBuffer message, BinaryReply reply);
+    }
+
+    /**
+     * Binary message reply callback. Used to submit a reply to an incoming
+     * message from Flutter. Also used in the dual capacity to handle a reply
+     * received from Flutter after sending a message.
+     */
+    interface BinaryReply {
+        /**
+         * Handles the specified reply.
+         *
+         * @param reply the reply payload, a {@link ByteBuffer} or null. Senders of outgoing
+         * replies must place the reply bytes between position zero and current position.
+         * Reply receivers can read from the buffer directly.
+         */
+        void reply(ByteBuffer reply);
+    }
+}
diff --git a/shell/platform/android/io/flutter/plugin/common/FlutterEventChannel.java b/shell/platform/android/io/flutter/plugin/common/EventChannel.java
similarity index 64%
rename from shell/platform/android/io/flutter/plugin/common/FlutterEventChannel.java
rename to shell/platform/android/io/flutter/plugin/common/EventChannel.java
index 04a6aff..0bd6e16 100644
--- a/shell/platform/android/io/flutter/plugin/common/FlutterEventChannel.java
+++ b/shell/platform/android/io/flutter/plugin/common/EventChannel.java
@@ -5,9 +5,8 @@
 package io.flutter.plugin.common;
 
 import android.util.Log;
-import io.flutter.view.FlutterView;
-import io.flutter.view.FlutterView.BinaryMessageResponse;
-import io.flutter.view.FlutterView.OnBinaryMessageListenerAsync;
+import io.flutter.plugin.common.BinaryMessenger.BinaryMessageHandler;
+import io.flutter.plugin.common.BinaryMessenger.BinaryReply;
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicReference;
@@ -27,37 +26,37 @@
  * The identity of the channel is given by its name, so other uses of that name
  * with may interfere with this channel's communication.
  */
-public final class FlutterEventChannel {
-    private static final String TAG = "FlutterEventChannel#";
+public final class EventChannel {
+    private static final String TAG = "EventChannel#";
 
-    private final FlutterView view;
+    private final BinaryMessenger messenger;
     private final String name;
     private final MethodCodec codec;
 
     /**
-     * Creates a new channel associated with the specified {@link FlutterView} and with the
-     * specified name and the standard {@link MethodCodec}.
+     * Creates a new channel associated with the specified {@link BinaryMessenger}
+     * and with the specified name and the standard {@link MethodCodec}.
      *
-     * @param view a {@link FlutterView}.
+     * @param messenger a {@link BinaryMessenger}.
      * @param name a channel name String.
      */
-    public FlutterEventChannel(FlutterView view, String name) {
-        this(view, name, StandardMethodCodec.INSTANCE);
+    public EventChannel(BinaryMessenger messenger, String name) {
+        this(messenger, name, StandardMethodCodec.INSTANCE);
     }
 
     /**
-     * Creates a new channel associated with the specified {@link FlutterView} and with the
-     * specified name and {@link MethodCodec}.
+     * Creates a new channel associated with the specified {@link BinaryMessenger}
+     * and with the specified name and {@link MethodCodec}.
      *
-     * @param view a {@link FlutterView}.
+     * @param messenger a {@link BinaryMessenger}.
      * @param name a channel name String.
      * @param codec a {@link MessageCodec}.
      */
-    public FlutterEventChannel(FlutterView view, String name, MethodCodec codec) {
-        assert view != null;
+    public EventChannel(BinaryMessenger messenger, String name, MethodCodec codec) {
+        assert messenger != null;
         assert name != null;
         assert codec != null;
-        this.view = view;
+        this.messenger = messenger;
         this.name = name;
         this.codec = codec;
     }
@@ -70,15 +69,13 @@
      * @param handler a {@link StreamHandler}, or null to deregister.
      */
     public void setStreamHandler(final StreamHandler handler) {
-        view.addOnBinaryMessageListenerAsync(name,
-            handler == null ? null : new StreamListener(handler));
+        messenger.setMessageHandler(name, handler == null ? null : new IncomingStreamRequestHandler(handler));
     }
 
     /**
-     * Strategy for handling event streams. Supports dual use:
-     * Producers of events to be sent to Flutter act as clients of this interface
-     * for sending events. Consumers of events sent from Flutter implement
-     * this interface for handling received events.
+     * Event callback. Supports dual use: Producers of events to be sent to Flutter
+     * act as clients of this interface for sending events. Consumers of events sent
+     * from Flutter implement this interface for handling received events.
      */
     public interface EventSink {
         /**
@@ -106,16 +103,16 @@
     }
 
     /**
-     * A call-back interface for handling stream setup and tear-down requests.
+     * Handler of stream setup and tear-down requests.
      */
     public interface StreamHandler {
         /**
          * Handles a request to set up an event stream.
          *
          * @param arguments Stream configuration arguments, possibly null.
-         * @param eventSink An {@link EventSink} for sending events to the Flutter receiver.
+         * @param events An {@link EventSink} for emitting events to the Flutter receiver.
          */
-        void onListen(Object arguments, EventSink eventSink);
+        void onListen(Object arguments, EventSink events);
 
         /**
          * Handles a request to tear down an event stream.
@@ -125,55 +122,54 @@
         void onCancel(Object arguments);
     }
 
-    private final class StreamListener implements OnBinaryMessageListenerAsync {
+    private final class IncomingStreamRequestHandler implements BinaryMessageHandler {
         private final StreamHandler handler;
         private final AtomicReference<EventSink> activeSink = new AtomicReference<>(null);
 
-        StreamListener(StreamHandler handler) {
+        IncomingStreamRequestHandler(StreamHandler handler) {
             this.handler = handler;
         }
 
         @Override
-        public void onMessage(FlutterView view, ByteBuffer message,
-            final BinaryMessageResponse response) {
+        public void onMessage(ByteBuffer message, final BinaryReply reply) {
             final MethodCall call = codec.decodeMethodCall(message);
             if (call.method.equals("listen")) {
-                onListen(call.arguments, response);
+                onListen(call.arguments, reply);
             } else if (call.method.equals("cancel")) {
-                onCancel(call.arguments, response);
+                onCancel(call.arguments, reply);
             } else {
-                response.send(null);
+                reply.reply(null);
             }
         }
 
-        private void onListen(Object arguments, BinaryMessageResponse response) {
+        private void onListen(Object arguments, BinaryReply callback) {
             final EventSink eventSink = new EventSinkImplementation();
             if (activeSink.compareAndSet(null, eventSink)) {
                 try {
                     handler.onListen(arguments, eventSink);
-                    response.send(codec.encodeSuccessEnvelope(null));
+                    callback.reply(codec.encodeSuccessEnvelope(null));
                 } catch (Exception e) {
                     activeSink.set(null);
                     Log.e(TAG + name, "Failed to open event stream", e);
-                    response.send(codec.encodeErrorEnvelope("error", e.getMessage(), null));
+                    callback.reply(codec.encodeErrorEnvelope("error", e.getMessage(), null));
                 }
             } else {
-                response.send(codec.encodeErrorEnvelope("error", "Stream already active", null));
+                callback.reply(codec.encodeErrorEnvelope("error", "Stream already active", null));
             }
         }
 
-        private void onCancel(Object arguments, BinaryMessageResponse response) {
+        private void onCancel(Object arguments, BinaryReply callback) {
             final EventSink oldSink = activeSink.getAndSet(null);
             if (oldSink != null) {
                 try {
                     handler.onCancel(arguments);
-                    response.send(codec.encodeSuccessEnvelope(null));
+                    callback.reply(codec.encodeSuccessEnvelope(null));
                 } catch (Exception e) {
                     Log.e(TAG + name, "Failed to close event stream", e);
-                    response.send(codec.encodeErrorEnvelope("error", e.getMessage(), null));
+                    callback.reply(codec.encodeErrorEnvelope("error", e.getMessage(), null));
                 }
             } else {
-                response.send(codec.encodeErrorEnvelope("error", "No active stream to cancel", null));
+                callback.reply(codec.encodeErrorEnvelope("error", "No active stream to cancel", null));
             }
         }
 
@@ -183,10 +179,9 @@
                  if (activeSink.get() != this) {
                      return;
                  }
-                 FlutterEventChannel.this.view.sendBinaryMessage(
+                 EventChannel.this.messenger.send(
                      name,
-                     codec.encodeSuccessEnvelope(event),
-                     null);
+                     codec.encodeSuccessEnvelope(event));
              }
 
              @Override
@@ -195,10 +190,9 @@
                  if (activeSink.get() != this) {
                      return;
                  }
-                 FlutterEventChannel.this.view.sendBinaryMessage(
+                 EventChannel.this.messenger.send(
                      name,
-                     codec.encodeErrorEnvelope(errorCode, errorMessage, errorDetails),
-                     null);
+                     codec.encodeErrorEnvelope(errorCode, errorMessage, errorDetails));
              }
 
              @Override
@@ -206,7 +200,7 @@
                  if (activeSink.get() != this) {
                      return;
                  }
-                 FlutterEventChannel.this.view.sendBinaryMessage(name, null, null);
+                 EventChannel.this.messenger.send(name, null);
              }
          }
     }
diff --git a/shell/platform/android/io/flutter/plugin/common/FlutterMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/FlutterMessageChannel.java
deleted file mode 100644
index b8d8f53..0000000
--- a/shell/platform/android/io/flutter/plugin/common/FlutterMessageChannel.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2017 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.
-
-package io.flutter.plugin.common;
-
-import android.util.Log;
-import io.flutter.view.FlutterView;
-import io.flutter.view.FlutterView.BinaryMessageReplyCallback;
-import io.flutter.view.FlutterView.BinaryMessageResponse;
-import io.flutter.view.FlutterView.OnBinaryMessageListenerAsync;
-import java.nio.ByteBuffer;
-
-/**
- * A named channel for communicating with the Flutter application using semi-structured messages.
- *
- * Messages are encoded into binary before being sent, and binary messages received are decoded
- * into Java objects. The {@link MessageCodec} used must be compatible with the
- * one used by the Flutter application. This can be achieved by creating a PlatformChannel
- * counterpart of this channel on the Dart side. The static Java type of messages sent and received
- * is Object, but only values supported by the specified {@link MessageCodec} can be used.
- *
- * The channel supports basic message send/receive operations, handling incoming method
- * invocations, and emitting event streams. All communication is asynchronous.
- *
- * Identically named channels may interfere with each other's communication.
- */
-public final class FlutterMessageChannel<T> {
-    private static final String TAG = "FlutterMessageChannel#";
-
-    private final FlutterView view;
-    private final String name;
-    private final MessageCodec<T> codec;
-
-    /**
-     * Creates a new channel associated with the specified {@link FlutterView} and with the
-     * specified name and {@link MessageCodec}.
-     *
-     * @param view a {@link FlutterView}.
-     * @param name a channel name String.
-     * @param codec a {@link MessageCodec}.
-     */
-    public FlutterMessageChannel(FlutterView view, String name, MessageCodec<T> codec) {
-        assert view != null;
-        assert name != null;
-        assert codec != null;
-        this.view = view;
-        this.name = name;
-        this.codec = codec;
-    }
-
-    /**
-     * Sends the specified message to the Flutter application on this channel.
-     *
-     * @param message the message, possibly null.
-     */
-    public void send(T message) {
-        send(message, null);
-    }
-
-    /**
-     * Sends the specified message to the Flutter application, optionally expecting a reply.
-     *
-     * @param message the message, possibly null.
-     * @param handler a {@link ReplyHandler} call-back, possibly null.
-     */
-    public void send(T message, final ReplyHandler<T> handler) {
-        view.sendBinaryMessage(name, codec.encodeMessage(message),
-            handler == null ? null : new ReplyCallback(handler));
-    }
-
-    /**
-     * Registers a message handler on this channel.
-     *
-     * Overrides any existing handler registration (for messages, method calls, or streams).
-     *
-     * @param handler a {@link MessageHandler}, or null to deregister.
-     */
-    public void setMessageHandler(final MessageHandler<T> handler) {
-        view.addOnBinaryMessageListenerAsync(name,
-            handler == null ? null : new MessageListener(handler));
-    }
-
-    /**
-     * A call-back interface for handling replies to outgoing messages.
-     */
-    public interface ReplyHandler<T> {
-        /**
-         * Handle the specified reply.
-         *
-         * @param reply the reply, possibly null.
-         */
-        void onReply(T reply);
-    }
-
-    /**
-     * A call-back interface for handling incoming messages.
-     */
-    public interface MessageHandler<T> {
-
-        /**
-         * Handles the specified message.
-         *
-         * @param message The message, possibly null.
-         * @param reply A {@link Reply} for providing a single message reply.
-         */
-        void onMessage(T message, Reply<T> reply);
-    }
-
-    /**
-     * Response interface for sending results back to Flutter.
-     */
-    public interface Reply<T> {
-        /**
-         * Submits a reply.
-         *
-         * @param reply The result, possibly null.
-         */
-        void send(T reply);
-    }
-
-    private final class ReplyCallback implements BinaryMessageReplyCallback {
-        private final ReplyHandler<T> handler;
-
-        private ReplyCallback(ReplyHandler<T> handler) {
-            this.handler = handler;
-        }
-
-        @Override
-        public void onReply(ByteBuffer reply) {
-            handler.onReply(codec.decodeMessage(reply));
-        }
-    }
-
-    private final class MessageListener implements OnBinaryMessageListenerAsync {
-        private final MessageHandler<T> handler;
-
-        private MessageListener(MessageHandler<T> handler) {
-            this.handler = handler;
-        }
-
-        @Override
-        public void onMessage(FlutterView view, ByteBuffer message,
-            final BinaryMessageResponse response) {
-            try {
-                handler.onMessage(codec.decodeMessage(message), new Reply<T>() {
-                    private boolean done = false;
-
-                    @Override
-                    public void send(T reply) {
-                        if (done) {
-                            throw new IllegalStateException("Call result already provided");
-                        }
-                        response.send(codec.encodeMessage(reply));
-                        done = true;
-                    }
-                });
-            } catch (Exception e) {
-                Log.e(TAG + name, "Failed to handle message", e);
-                response.send(null);
-            }
-        }
-    }
-}
diff --git a/shell/platform/android/io/flutter/plugin/common/MethodCall.java b/shell/platform/android/io/flutter/plugin/common/MethodCall.java
index 8fafdc8..b6a423a 100644
--- a/shell/platform/android/io/flutter/plugin/common/MethodCall.java
+++ b/shell/platform/android/io/flutter/plugin/common/MethodCall.java
@@ -8,7 +8,7 @@
 import org.json.JSONObject;
 
 /**
- * Command object representing a method call on a {@link FlutterMethodChannel}.
+ * Command object representing a method call on a {@link MethodChannel}.
  */
 public final class MethodCall {
     /**
diff --git a/shell/platform/android/io/flutter/plugin/common/FlutterMethodChannel.java b/shell/platform/android/io/flutter/plugin/common/MethodChannel.java
similarity index 63%
rename from shell/platform/android/io/flutter/plugin/common/FlutterMethodChannel.java
rename to shell/platform/android/io/flutter/plugin/common/MethodChannel.java
index 1a9e9f8..ab04fbc 100644
--- a/shell/platform/android/io/flutter/plugin/common/FlutterMethodChannel.java
+++ b/shell/platform/android/io/flutter/plugin/common/MethodChannel.java
@@ -5,10 +5,8 @@
 package io.flutter.plugin.common;
 
 import android.util.Log;
-import io.flutter.view.FlutterView;
-import io.flutter.view.FlutterView.BinaryMessageReplyCallback;
-import io.flutter.view.FlutterView.BinaryMessageResponse;
-import io.flutter.view.FlutterView.OnBinaryMessageListenerAsync;
+import io.flutter.plugin.common.BinaryMessenger.BinaryMessageHandler;
+import io.flutter.plugin.common.BinaryMessenger.BinaryReply;
 import java.nio.ByteBuffer;
 
 /**
@@ -25,37 +23,37 @@
  * The identity of the channel is given by its name, so other uses of that name
  * with may interfere with this channel's communication.
  */
-public final class FlutterMethodChannel {
-    private static final String TAG = "FlutterMethodChannel#";
+public final class MethodChannel {
+    private static final String TAG = "MethodChannel#";
 
-    private final FlutterView view;
+    private final BinaryMessenger messenger;
     private final String name;
     private final MethodCodec codec;
 
     /**
-     * Creates a new channel associated with the specified {@link FlutterView} and with the
-     * specified name and the standard {@link MethodCodec}.
+     * Creates a new channel associated with the specified {@link BinaryMessenger}
+     * and with the specified name and the standard {@link MethodCodec}.
      *
-     * @param view a {@link FlutterView}.
+     * @param messenger a {@link BinaryMessenger}.
      * @param name a channel name String.
      */
-    public FlutterMethodChannel(FlutterView view, String name) {
-        this(view, name, StandardMethodCodec.INSTANCE);
+    public MethodChannel(BinaryMessenger messenger, String name) {
+        this(messenger, name, StandardMethodCodec.INSTANCE);
     }
 
     /**
-     * Creates a new channel associated with the specified {@link FlutterView} and with the
+     * Creates a new channel associated with the specified {@link BinaryMessenger} and with the
      * specified name and {@link MethodCodec}.
      *
-     * @param view a {@link FlutterView}.
+     * @param messenger a {@link BinaryMessenger}.
      * @param name a channel name String.
      * @param codec a {@link MessageCodec}.
      */
-    public FlutterMethodChannel(FlutterView view, String name, MethodCodec codec) {
-        assert view != null;
+    public MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec) {
+        assert messenger != null;
         assert name != null;
         assert codec != null;
-        this.view = view;
+        this.messenger = messenger;
         this.name = name;
         this.codec = codec;
     }
@@ -75,11 +73,11 @@
      *
      * @param method the name String of the method.
      * @param arguments the arguments for the invocation, possibly null.
-     * @param handler a {@link Response} handler for the invocation result.
+     * @param callback a {@link Result} callback for the invocation result.
      */
-    public void invokeMethod(String method, Object arguments, Response handler) {
-        view.sendBinaryMessage(name, codec.encodeMethodCall(new MethodCall(method, arguments)),
-            handler == null ? null : new MethodCallResultCallback(handler));
+    public void invokeMethod(String method, Object arguments, Result callback) {
+        messenger.send(name, codec.encodeMethodCall(new MethodCall(method, arguments)),
+            callback == null ? null : new IncomingResultHandler(callback));
     }
 
     /**
@@ -90,17 +88,17 @@
      * @param handler a {@link MethodCallHandler}, or null to deregister.
      */
     public void setMethodCallHandler(final MethodCallHandler handler) {
-        view.addOnBinaryMessageListenerAsync(name,
-            handler == null ? null : new MethodCallListener(handler));
+        messenger.setMessageHandler(name,
+            handler == null ? null : new IncomingMethodCallHandler(handler));
     }
 
     /**
-     * Strategy for handling the result of a method call. Supports dual use:
-     * Implementations of methods to be invoked by Flutter act as clients of this interface
-     * for sending results back to Flutter. Invokers of Flutter methods provide
-     * implementations of this interface for handling results received from Flutter.
+     * Method call result callback. Supports dual use: Implementations of methods
+     * to be invoked by Flutter act as clients of this interface for sending results
+     * back to Flutter. Invokers of Flutter methods provide implementations of this
+     * interface for handling results received from Flutter.
      */
-    public interface Response {
+    public interface Result {
         /**
          * Handles a successful result.
          *
@@ -124,66 +122,65 @@
     }
 
     /**
-     * A call-back interface for handling incoming method calls.
+     * A handler of incoming method calls.
      */
     public interface MethodCallHandler {
         /**
          * Handles the specified method call.
          *
          * @param call A {@link MethodCall}.
-         * @param response A {@link Response} for providing a single method call result.
+         * @param result A {@link Result} used for submitting the result of the call.
          */
-        void onMethodCall(MethodCall call, Response response);
+        void onMethodCall(MethodCall call, Result result);
     }
 
-    private final class MethodCallResultCallback implements BinaryMessageReplyCallback {
-        private final Response handler;
+    private final class IncomingResultHandler implements BinaryReply {
+        private final Result callback;
 
-        MethodCallResultCallback(Response handler) {
-            this.handler = handler;
+        IncomingResultHandler(Result callback) {
+            this.callback = callback;
         }
 
         @Override
-        public void onReply(ByteBuffer reply) {
+        public void reply(ByteBuffer reply) {
             if (reply == null) {
-                handler.notImplemented();
+                callback.notImplemented();
             } else {
                 try {
                     final Object result = codec.decodeEnvelope(reply);
-                    handler.success(result);
+                    callback.success(result);
                 } catch (FlutterException e) {
-                    handler.error(e.code, e.getMessage(), e.details);
+                    callback.error(e.code, e.getMessage(), e.details);
                 }
             }
         }
     }
 
-    private final class MethodCallListener implements OnBinaryMessageListenerAsync {
+    private final class IncomingMethodCallHandler implements BinaryMessageHandler {
         private final MethodCallHandler handler;
 
-        MethodCallListener(MethodCallHandler handler) {
+        IncomingMethodCallHandler(MethodCallHandler handler) {
             this.handler = handler;
         }
 
         @Override
-        public void onMessage(FlutterView view, ByteBuffer message,
-            final BinaryMessageResponse response) {
+        public void onMessage(ByteBuffer message, final BinaryReply reply) {
             final MethodCall call = codec.decodeMethodCall(message);
             try {
-                handler.onMethodCall(call, new Response() {
+                handler.onMethodCall(call, new Result() {
                     private boolean done = false;
 
                     @Override
                     public void success(Object result) {
                         checkDone();
-                        response.send(codec.encodeSuccessEnvelope(result));
+                        reply.reply(codec.encodeSuccessEnvelope(result));
                         done = true;
                     }
 
                     @Override
                     public void error(String errorCode, String errorMessage, Object errorDetails) {
                         checkDone();
-                        response.send(codec.encodeErrorEnvelope(
+                        reply.reply(codec.encodeErrorEnvelope(
                             errorCode, errorMessage, errorDetails));
                         done = true;
                     }
@@ -191,7 +188,7 @@
                     @Override
                     public void notImplemented() {
                         checkDone();
-                        response.send(null);
+                        reply.reply(null);
                         done = true;
                     }
 
@@ -203,7 +200,7 @@
                 });
             } catch (Exception e) {
                 Log.e(TAG + name, "Failed to handle method call", e);
-                response.send(codec.encodeErrorEnvelope("error", e.getMessage(), null));
+                reply.reply(codec.encodeErrorEnvelope("error", e.getMessage(), null));
             }
         }
     }
diff --git a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
index e2adba3..4d38445 100644
--- a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
+++ b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
@@ -9,7 +9,7 @@
 import android.view.inputmethod.BaseInputConnection;
 import android.view.KeyEvent;
 
-import io.flutter.plugin.common.FlutterMethodChannel;
+import io.flutter.plugin.common.MethodChannel;
 import io.flutter.view.FlutterView;
 
 import java.util.Arrays;
@@ -19,11 +19,11 @@
 class InputConnectionAdaptor extends BaseInputConnection {
     private final int mClient;
     private final TextInputPlugin mPlugin;
-    private final FlutterMethodChannel mFlutterChannel;
+    private final MethodChannel mFlutterChannel;
     private final Map<String, Object> mOutgoingState;
 
     public InputConnectionAdaptor(FlutterView view, int client,
-        TextInputPlugin plugin, FlutterMethodChannel flutterChannel) {
+        TextInputPlugin plugin, MethodChannel flutterChannel) {
         super(view, true);
         mClient = client;
         mPlugin = plugin;
diff --git a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java
index 7125f9d..d0727f1 100644
--- a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java
+++ b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java
@@ -11,9 +11,9 @@
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputMethodManager;
 
-import io.flutter.plugin.common.FlutterMethodChannel;
-import io.flutter.plugin.common.FlutterMethodChannel.MethodCallHandler;
-import io.flutter.plugin.common.FlutterMethodChannel.Response;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.MethodChannel.Result;
 import io.flutter.plugin.common.JSONMethodCodec;
 import io.flutter.plugin.common.JSONUtil;
 import io.flutter.plugin.common.MethodCall;
@@ -31,7 +31,7 @@
 
     private final Activity mActivity;
     private final FlutterView mView;
-    private final FlutterMethodChannel mFlutterChannel;
+    private final MethodChannel mFlutterChannel;
     private int mClient = 0;
     private JSONObject mConfiguration;
     private JSONObject mLatestState;
@@ -39,37 +39,37 @@
     public TextInputPlugin(Activity activity, FlutterView view) {
         mActivity = activity;
         mView = view;
-        mFlutterChannel = new FlutterMethodChannel(view, "flutter/textinput",
+        mFlutterChannel = new MethodChannel(view, "flutter/textinput",
             JSONMethodCodec.INSTANCE);
         mFlutterChannel.setMethodCallHandler(this);
     }
 
     @Override
-    public void onMethodCall(MethodCall call, Response response) {
+    public void onMethodCall(MethodCall call, Result result) {
         String method = call.method;
         Object args = call.arguments;
         try {
             if (method.equals("TextInput.show")) {
                 showTextInput(mView);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("TextInput.hide")) {
                 hideTextInput(mView);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("TextInput.setClient")) {
                 final JSONArray argumentList = (JSONArray) args;
                 setTextInputClient(mView, argumentList.getInt(0), argumentList.getJSONObject(1));
-                response.success(null);
+                result.success(null);
             } else if (method.equals("TextInput.setEditingState")) {
                 setTextInputEditingState(mView, (JSONObject) args);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("TextInput.clearClient")) {
                 clearTextInputClient();
-                response.success(null);
+                result.success(null);
             } else {
-                response.notImplemented();
+                result.notImplemented();
             }
         } catch (JSONException e) {
-            response.error("error", "JSON error: " + e.getMessage(), null);
+            result.error("error", "JSON error: " + e.getMessage(), null);
         }
     }
 
diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java
index 0ffb001..3331861 100644
--- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java
+++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java
@@ -17,12 +17,11 @@
 import android.view.SoundEffectConstants;
 import android.view.View;
 
-import io.flutter.plugin.common.FlutterMethodChannel;
 import io.flutter.util.PathUtils;
 
 import io.flutter.plugin.common.ActivityLifecycleListener;
-import io.flutter.plugin.common.FlutterMethodChannel.MethodCallHandler;
-import io.flutter.plugin.common.FlutterMethodChannel.Response;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.MethodChannel.Result;
 import io.flutter.plugin.common.MethodCall;
 
 import org.json.JSONArray;
@@ -44,48 +43,48 @@
     }
 
     @Override
-    public void onMethodCall(MethodCall call, Response response) {
+    public void onMethodCall(MethodCall call, Result result) {
         String method = call.method;
         Object arguments = call.arguments;
         try {
             if (method.equals("SystemSound.play")) {
                 playSystemSound((String) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("HapticFeedback.vibrate")) {
                 vibrateHapticFeedback();
-                response.success(null);
+                result.success(null);
             } else if (method.equals("UrlLauncher.launch")) {
                 launchURL((String) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("SystemChrome.setPreferredOrientations")) {
                 setSystemChromePreferredOrientations((JSONArray) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("SystemChrome.setApplicationSwitcherDescription")) {
                 setSystemChromeApplicationSwitcherDescription((JSONObject) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("SystemChrome.setEnabledSystemUIOverlays")) {
                 setSystemChromeEnabledSystemUIOverlays((JSONArray) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("SystemChrome.setSystemUIOverlayStyle")) {
                 setSystemChromeSystemUIOverlayStyle((String) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("SystemNavigator.pop")) {
                 popSystemNavigator();
-                response.success(null);
+                result.success(null);
             } else if (method.equals("Clipboard.getData")) {
-                response.success(getClipboardData((String) arguments));
+                result.success(getClipboardData((String) arguments));
             } else if (method.equals("Clipboard.setData")) {
                 setClipboardData((JSONObject) arguments);
-                response.success(null);
+                result.success(null);
             } else if (method.equals("PathProvider.getTemporaryDirectory")) {
-                response.success(getPathProviderTemporaryDirectory());
+                result.success(getPathProviderTemporaryDirectory());
             } else if (method.equals("PathProvider.getApplicationDocumentsDirectory")) {
-                response.success(getPathProviderApplicationDocumentsDirectory());
+                result.success(getPathProviderApplicationDocumentsDirectory());
             } else {
-                response.notImplemented();
+                result.notImplemented();
             }
         } catch (JSONException e) {
-            response.error("error", "JSON error: " + e.getMessage(), null);
+            result.error("error", "JSON error: " + e.getMessage(), null);
         }
     }
 
diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java
index 6644ed4..34b32c6 100644
--- a/shell/platform/android/io/flutter/view/FlutterView.java
+++ b/shell/platform/android/io/flutter/view/FlutterView.java
@@ -28,12 +28,8 @@
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
 
-import io.flutter.plugin.common.ActivityLifecycleListener;
-import io.flutter.plugin.common.FlutterMessageChannel;
-import io.flutter.plugin.common.FlutterMethodChannel;
-import io.flutter.plugin.common.JSONMessageCodec;
-import io.flutter.plugin.common.JSONMethodCodec;
-import io.flutter.plugin.common.StringCodec;
+import io.flutter.plugin.common.*;
+import io.flutter.plugin.common.MethodChannel;
 import io.flutter.plugin.editing.TextInputPlugin;
 import io.flutter.plugin.platform.PlatformPlugin;
 
@@ -54,7 +50,7 @@
  * An Android view containing a Flutter app.
  */
 public class FlutterView extends SurfaceView
-    implements AccessibilityManager.AccessibilityStateChangeListener {
+    implements BinaryMessenger, AccessibilityManager.AccessibilityStateChangeListener {
 
     private static final String TAG = "FlutterView";
 
@@ -72,15 +68,15 @@
     }
 
     private final TextInputPlugin mTextInputPlugin;
-    private final Map<String, OnBinaryMessageListenerAsync> mMessageListeners;
+    private final Map<String, BinaryMessageHandler> mMessageHandlers;
     private final SurfaceHolder.Callback mSurfaceCallback;
     private final ViewportMetrics mMetrics;
     private final AccessibilityManager mAccessibilityManager;
-    private final FlutterMethodChannel mFlutterLocalizationChannel;
-    private final FlutterMethodChannel mFlutterNavigationChannel;
-    private final FlutterMessageChannel<Object> mFlutterKeyEventChannel;
-    private final FlutterMessageChannel<String> mFlutterLifecycleChannel;
-    private final FlutterMessageChannel<Object> mFlutterSystemChannel;
+    private final MethodChannel mFlutterLocalizationChannel;
+    private final MethodChannel mFlutterNavigationChannel;
+    private final BasicMessageChannel<Object> mFlutterKeyEventChannel;
+    private final BasicMessageChannel<String> mFlutterLifecycleChannel;
+    private final BasicMessageChannel<Object> mFlutterSystemChannel;
     private final BroadcastReceiver mDiscoveryReceiver;
     private final List<ActivityLifecycleListener> mActivityLifecycleListeners;
     private long mNativePlatformView;
@@ -134,22 +130,22 @@
         mAccessibilityManager = (AccessibilityManager) getContext()
             .getSystemService(Context.ACCESSIBILITY_SERVICE);
 
-        mMessageListeners = new HashMap<>();
+        mMessageHandlers = new HashMap<>();
         mActivityLifecycleListeners = new ArrayList<>();
 
         // Configure the platform plugins and flutter channels.
-        mFlutterLocalizationChannel = new FlutterMethodChannel(this, "flutter/localization",
+        mFlutterLocalizationChannel = new MethodChannel(this, "flutter/localization",
             JSONMethodCodec.INSTANCE);
-        mFlutterNavigationChannel = new FlutterMethodChannel(this, "flutter/navigation",
+        mFlutterNavigationChannel = new MethodChannel(this, "flutter/navigation",
             JSONMethodCodec.INSTANCE);
-        mFlutterKeyEventChannel = new FlutterMessageChannel<>(this, "flutter/keyevent",
+        mFlutterKeyEventChannel = new BasicMessageChannel<>(this, "flutter/keyevent",
             JSONMessageCodec.INSTANCE);
-        mFlutterLifecycleChannel = new FlutterMessageChannel<>(this, "flutter/lifecycle",
+        mFlutterLifecycleChannel = new BasicMessageChannel<>(this, "flutter/lifecycle",
             StringCodec.INSTANCE);
-        mFlutterSystemChannel = new FlutterMessageChannel<>(this, "flutter/system",
+        mFlutterSystemChannel = new BasicMessageChannel<>(this, "flutter/system",
             JSONMessageCodec.INSTANCE);
         PlatformPlugin platformPlugin = new PlatformPlugin((Activity) getContext());
-        FlutterMethodChannel flutterPlatformChannel = new FlutterMethodChannel(this,
+        MethodChannel flutterPlatformChannel = new MethodChannel(this,
             "flutter/platform", JSONMethodCodec.INSTANCE);
         flutterPlatformChannel.setMethodCallHandler(platformPlugin);
         addActivityLifecycleListener(platformPlugin);
@@ -604,44 +600,44 @@
     }
 
     // Called by native to send us a platform message.
-    private void handlePlatformMessage(String channel, byte[] message, final int responseId) {
-        OnBinaryMessageListenerAsync listener = mMessageListeners.get(channel);
-        if (listener != null) {
+    private void handlePlatformMessage(String channel, byte[] message, final int replyId) {
+        BinaryMessageHandler handler = mMessageHandlers.get(channel);
+        if (handler != null) {
             try {
                 final ByteBuffer buffer = (message == null ? null : ByteBuffer.wrap(message));
-                listener.onMessage(this, buffer,
-                    new BinaryMessageResponse() {
+                handler.onMessage(buffer,
+                    new BinaryReply() {
                         @Override
-                        public void send(ByteBuffer response) {
-                            if (response == null) {
+                        public void reply(ByteBuffer reply) {
+                            if (reply == null) {
                                 nativeInvokePlatformMessageEmptyResponseCallback(mNativePlatformView,
-                                    responseId);
+                                    replyId);
                             } else {
                                 nativeInvokePlatformMessageResponseCallback(mNativePlatformView,
-                                    responseId, response, response.position());
+                                    replyId, reply, reply.position());
                             }
                         }
                     });
             } catch (Exception ex) {
                 Log.e(TAG, "Uncaught exception in binary message listener", ex);
-                nativeInvokePlatformMessageEmptyResponseCallback(mNativePlatformView, responseId);
+                nativeInvokePlatformMessageEmptyResponseCallback(mNativePlatformView, replyId);
             }
             return;
         }
-        nativeInvokePlatformMessageEmptyResponseCallback(mNativePlatformView, responseId);
+        nativeInvokePlatformMessageEmptyResponseCallback(mNativePlatformView, replyId);
     }
 
-    private int mNextResponseId = 1;
-    private final Map<Integer, BinaryMessageReplyCallback> mPendingResponses = new HashMap<>();
+    private int mNextReplyId = 1;
+    private final Map<Integer, BinaryReply> mPendingReplies = new HashMap<>();
 
     // Called by native to respond to a platform message that we sent.
-    private void handlePlatformMessageResponse(int responseId, byte[] response) {
-        BinaryMessageReplyCallback callback = mPendingResponses.remove(responseId);
+    private void handlePlatformMessageResponse(int replyId, byte[] reply) {
+        BinaryReply callback = mPendingReplies.remove(replyId);
         if (callback != null) {
             try {
-                callback.onReply(response == null ? null : ByteBuffer.wrap(response));
+                callback.reply(reply == null ? null : ByteBuffer.wrap(reply));
             } catch (Exception ex) {
-                Log.e(TAG, "Uncaught exception in binary message listener reply", ex);
+                Log.e(TAG, "Uncaught exception in binary message handler reply", ex);
             }
         }
     }
@@ -764,71 +760,35 @@
         return true;
     }
 
-    /**
-     * Send a binary message to the Flutter application. The Flutter Dart code can register a
-     * platform message handler that will receive these messages.
-     *
-     * @param channel Name of the channel that will receive this message.
-     * @param message Message payload, a {@link ByteBuffer} with the message bytes between position
-     * zero and current position, or null.
-     * @param callback Callback that receives a reply from the Flutter application.
-     */
-    public void sendBinaryMessage(String channel, ByteBuffer message,
-        BinaryMessageReplyCallback callback) {
-        int responseId = 0;
+    @Override
+    public void send(String channel, ByteBuffer message) {
+      send(channel, message, null);
+    }
+
+    @Override
+    public void send(String channel, ByteBuffer message, BinaryReply callback) {
+        int replyId = 0;
         if (callback != null) {
-            responseId = mNextResponseId++;
-            mPendingResponses.put(responseId, callback);
+            replyId = mNextReplyId++;
+            mPendingReplies.put(replyId, callback);
         }
         if (message == null) {
-            nativeDispatchEmptyPlatformMessage(mNativePlatformView, channel, responseId);
+            nativeDispatchEmptyPlatformMessage(mNativePlatformView, channel, replyId);
         } else {
             nativeDispatchPlatformMessage(mNativePlatformView, channel, message,
-                message.position(), responseId);
+                message.position(), replyId);
         }
     }
 
-    /**
-     * Callback invoked when the app replies to a binary message sent with sendBinaryMessage.
-     */
-    public interface BinaryMessageReplyCallback {
-
-        void onReply(ByteBuffer reply);
-    }
-
-    /**
-     * Register a callback to be invoked when the Flutter application sends a message
-     * to its host.  The reply to the message can be provided asynchronously.
-     *
-     * @param channel Name of the channel used by the application.
-     * @param listener Called when messages arrive.
-     */
-    public void addOnBinaryMessageListenerAsync(String channel,
-        OnBinaryMessageListenerAsync listener) {
-        if (listener == null) {
-            mMessageListeners.remove(channel);
+    @Override
+    public void setMessageHandler(String channel, BinaryMessageHandler handler) {
+        if (handler == null) {
+            mMessageHandlers.remove(channel);
         } else {
-            mMessageListeners.put(channel, listener);
+            mMessageHandlers.put(channel, handler);
         }
     }
 
-    public interface OnBinaryMessageListenerAsync {
-
-        /**
-         * Called when a message is received from the Flutter app.
-         *
-         * @param view The Flutter view hosting the app.
-         * @param message Message payload.
-         * @param response Used to send a reply back to the app.
-         */
-        void onMessage(FlutterView view, ByteBuffer message, BinaryMessageResponse response);
-    }
-
-    public interface BinaryMessageResponse {
-
-        void send(ByteBuffer reply);
-    }
-
     /**
      * Broadcast receiver used to discover active Flutter instances.
      */
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterBinaryMessenger.h b/shell/platform/darwin/ios/framework/Headers/FlutterBinaryMessenger.h
index 50984db..606c131 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterBinaryMessenger.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterBinaryMessenger.h
@@ -11,25 +11,35 @@
 
 NS_ASSUME_NONNULL_BEGIN
 /**
- A strategy for handling a binary message reply.
+ A message reply callback.
+
+ Used for submitting a binary reply back to a Flutter message sender. Also used
+ in the dual capacity for handling a binary message reply received from Flutter.
+
+ - Parameters:
+   - reply: The reply.
  */
-typedef void (^FlutterBinaryReplyHandler)(NSData* _Nullable reply);
+typedef void (^FlutterBinaryReply)(NSData* _Nullable reply);
 
 /**
- A strategy for handling incoming binary messages and to send asynchronous
- replies.
+ A strategy for handling incoming binary messages from Flutter and to send
+ asynchronous replies back to Flutter.
+
+ - Parameters:
+   - message: The message.
+   - reply: A callback for submitting a reply to the sender.
  */
-typedef void (^FlutterBinaryMessageHandler)(
-    NSData* _Nullable message,
-    FlutterBinaryReplyHandler replyHandler);
+typedef void (^FlutterBinaryMessageHandler)(NSData* _Nullable message, FlutterBinaryReply reply);
 
 /**
  A facility for communicating with the Flutter side using asynchronous message
  passing with binary messages.
 
  - SeeAlso:
-   - `FlutterMessageChannel`, which supports communication using structured messages.
-   - `FlutterMethodChannel`, which supports communication using asynchronous method calls.
+   - `FlutterBasicMessageChannel`, which supports communication using structured
+ messages.
+   - `FlutterMethodChannel`, which supports communication using asynchronous
+ method calls.
    - `FlutterEventChannel`, which supports commuication using event streams.
  */
 FLUTTER_EXPORT
@@ -39,24 +49,23 @@
  no reply.
 
  - Parameters:
+   - channel: The channel name.
    - message: The message.
-   - channelName: The channel name.
  */
-- (void)sendBinaryMessage:(NSData* _Nullable)message
-              channelName:(NSString*)channelName;
+- (void)sendOnChannel:(NSString*)channel message:(NSData* _Nullable)message;
 
 /**
  Sends a binary message to the Flutter side on the specified channel, expecting
  an asynchronous reply.
 
  - Parameters:
+   - channel: The channel name.
    - message: The message.
-   - channelName: The channel name.
-   - handler: A reply handler.
+   - callback: A callback for receiving a reply.
  */
-- (void)sendBinaryMessage:(NSData* _Nullable)message
-              channelName:(NSString*)channelName
-       binaryReplyHandler:(FlutterBinaryReplyHandler _Nullable)handler;
+- (void)sendOnChannel:(NSString*)channel
+              message:(NSData* _Nullable)message
+          binaryReply:(FlutterBinaryReply _Nullable)callback;
 
 /**
  Registers a message handler for incoming binary messages from the Flutter side
@@ -66,11 +75,11 @@
  existing handler.
 
  - Parameters:
-   - channelName: The channel name.
+   - channel: The channel name.
    - handler: The message handler.
  */
-- (void)setBinaryMessageHandlerOnChannel:(NSString*)channelName
-                    binaryMessageHandler:(FlutterBinaryMessageHandler _Nullable)handler;
+- (void)setMessageHandlerOnChannel:(NSString*)channel
+              binaryMessageHandler:(FlutterBinaryMessageHandler _Nullable)handler;
 @end
 NS_ASSUME_NONNULL_END
 #endif  // FLUTTER_FLUTTERBINARYMESSENGER_H_
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterChannels.h b/shell/platform/darwin/ios/framework/Headers/FlutterChannels.h
index 4fd71ac..6c417f4 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterChannels.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterChannels.h
@@ -10,30 +10,34 @@
 
 NS_ASSUME_NONNULL_BEGIN
 /**
- A strategy for handling a message reply.
+ A message reply callback.
+
+ Used for submitting a reply back to a Flutter message sender. Also used in
+ the dual capacity for handling a message reply received from Flutter.
 
  - Parameter reply: The reply.
  */
-typedef void (^FlutterReplyHandler)(id _Nullable reply);
+typedef void (^FlutterReply)(id _Nullable reply);
 
 /**
- A strategy for handling a message.
+ A strategy for handling incoming messages from Flutter and to send
+ asynchronous replies back to Flutter.
 
  - Parameters:
-   - message: The incoming message.
-   - replyHandler: A call-back to asynchronously supply a reply to the message.
+   - message: The message.
+   - reply: A callback for submitting a reply to the sender.
  */
-typedef void (^FlutterMessageHandler)(id _Nullable message,
-                                      FlutterReplyHandler replyHandler);
+typedef void (^FlutterMessageHandler)(id _Nullable message, FlutterReply callback);
 
 /**
- A channel for communicating with the Flutter side using asynchronous message
- passing.
+ A channel for communicating with the Flutter side using basic, asynchronous
+ message passing.
  */
 FLUTTER_EXPORT
-@interface FlutterMessageChannel : NSObject
+@interface FlutterBasicMessageChannel : NSObject
 /**
- Creates a `FlutterMessageChannel` with the specified name and binary messenger.
+ Creates a `FlutterBasicMessageChannel` with the specified name and binary
+ messenger.
 
  The channel name logically identifies the channel; identically named channels
  interfere with each other's communication.
@@ -51,7 +55,8 @@
                        binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger;
 
 /**
- Creates a `FlutterMessageChannel` with the specified name, binary messenger,
+ Creates a `FlutterBasicMessageChannel` with the specified name, binary
+ messenger,
  and message codec.
 
  The channel name logically identifies the channel; identically named channels
@@ -70,8 +75,8 @@
                                  codec:(NSObject<FlutterMessageCodec>*)codec;
 
 /**
- Initializes a `FlutterMessageChannel` with the specified nane, binary messenger,
- and message codec.
+ Initializes a `FlutterBasicMessageChannel` with the specified name, binary
+ messenger, and message codec.
 
  The channel name logically identifies the channel; identically named channels
  interfere with each other's communication.
@@ -91,18 +96,20 @@
 /**
  Sends the specified message to the Flutter side, ignoring any reply.
 
- - Parameter message: The message. Must be supported by the codec of this channel.
+ - Parameter message: The message. Must be supported by the codec of this
+ channel.
  */
 - (void)sendMessage:(id _Nullable)message;
 
 /**
- Sends the specified message to the Flutter side, expecting an asynchronous reply.
+ Sends the specified message to the Flutter side, expecting an asynchronous
+ reply.
 
  - Parameters:
    - message: The message. Must be supported by the codec of this channel.
-   - handler: The reply handler.
+   - callback: A callback to be invoked with the message reply from Flutter.
  */
-- (void)sendMessage:(id _Nullable)message replyHandler:(FlutterReplyHandler _Nullable)handler;
+- (void)sendMessage:(id _Nullable)message reply:(FlutterReply _Nullable)callback;
 
 /**
  Registers a message handler with this channel.
@@ -116,29 +123,27 @@
 @end
 
 /**
- A receiver of the result of a method call.
+ A method call result callback.
 
- - Parameter result: The result. Will be a `FlutterError` instance, if the method
-   call resulted in an error on the Flutter side. Will be
-   `FlutterMethodNotImplemented`, if the method called was not implemented on
-   the Flutter side. All other values, including `nil` should be interpreted
-   as successful results.
+ Used for submitting a method call result back to a Flutter caller. Also used in
+ the dual capacity for handling a method call result received from Flutter.
+
+ - Parameter result: The result.
  */
-typedef void (^FlutterResultReceiver)(id _Nullable result);
+typedef void (^FlutterResult)(id _Nullable result);
 
 /**
  A strategy for handling method calls.
 
  - Parameters:
    - call: The incoming method call.
-   - resultReceiver: A call-back to asynchronously supply the result of the call.
-     Invoke the call-back with a `FlutterError` to indicate that the call failed.
-     Invoke the call-back with `FlutterMethodNotImplemented` to indicate that the
-     method was unknown. Any other values, including `nil` are interpreted as
+   - result: A callback to asynchronously submit the result of the call.
+     Invoke the callback with a `FlutterError` to indicate that the call failed.
+     Invoke the callback with `FlutterMethodNotImplemented` to indicate that the
+     method was unknown. Any other values, including `nil`, are interpreted as
      successful results.
  */
-typedef void (^FlutterMethodCallHandler)(FlutterMethodCall* call,
-                                         FlutterResultReceiver resultReceiver);
+typedef void (^FlutterMethodCallHandler)(FlutterMethodCall* call, FlutterResult result);
 
 /**
  A constant used with `FlutterMethodCallHandler` to respond to the call of an
@@ -147,7 +152,6 @@
 FLUTTER_EXPORT
 extern NSObject const* FlutterMethodNotImplemented;
 
-
 /**
  A channel for communicating with the Flutter side using invocation of
  asynchronous methods.
@@ -190,7 +194,7 @@
  */
 + (instancetype)methodChannelWithName:(NSString*)name
                       binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
-                             codec:(NSObject<FlutterMethodCodec>*)codec;
+                                codec:(NSObject<FlutterMethodCodec>*)codec;
 
 /**
  Initializes a `FlutterMethodChannel` with the specified name, binary messenger,
@@ -230,15 +234,15 @@
    - method: The name of the method to invoke.
    - arguments: The arguments. Must be a value supported by the codec of this
      channel.
-   - resultReceiver: A call-back for receipt of an asynchronous result.
+   - result: A callback that will be invoked with the asynchronous result.
      The result will be a `FlutterError` instance, if the method call resulted
      in an error on the Flutter side. Will be `FlutterMethodNotImplemented`, if
      the method called was not implemented on the Flutter side. Any other value,
-     including `nil` should be interpreted as successful results.
+     including `nil`, should be interpreted as successful results.
  */
 - (void)invokeMethod:(NSString*)method
            arguments:(id _Nullable)arguments
-      resultReceiver:(FlutterResultReceiver _Nullable)resultReceiver;
+              result:(FlutterResult _Nullable)callback;
 
 /**
  Registers a handler for method calls from the Flutter side.
@@ -252,14 +256,11 @@
 @end
 
 /**
- A strategy for consuming events.
+ An event sink callback.
 
- - Parameter event: The event. Will be a `FlutterError` instance, if the
-   event represents an error. Will be `FlutterEndOfEventStream`, if no more
-   events will be emitted. All other values, including `nil` should be
-   interpreted as success events.
+ - Parameter event: The event.
  */
-typedef void (^FlutterEventReceiver)(id _Nullable event);
+typedef void (^FlutterEventSink)(id _Nullable event);
 
 /**
  A strategy for exposing an event stream to the Flutter side.
@@ -274,15 +275,15 @@
 
  - Parameters:
    - arguments: Arguments for the stream.
-   - eventReceiver: A call-back to asynchronously emit events. Invoke the
-     call-back with a `FlutterError` to emit an error event. Invoke the
-     call-back with `FlutterEndOfEventStream` to indicate that no more
+   - events: A callback to asynchronously emit events. Invoke the
+     callback with a `FlutterError` to emit an error event. Invoke the
+     callback with `FlutterEndOfEventStream` to indicate that no more
      events will be emitted. Any other value, including `nil` are emitted as
      successful events.
  - Returns: A FlutterError instance, if setup fails.
  */
 - (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
-                                   eventReceiver:(FlutterEventReceiver)eventReceiver;
+                                       eventSink:(FlutterEventSink)events;
 
 /**
  Tears down an event stream.
@@ -372,7 +373,7 @@
 
  - Parameter handler: The stream handler.
  */
-- (void)setStreamHandler:(NSObject<FlutterStreamHandler>* _Nullable)streamHandler;
+- (void)setStreamHandler:(NSObject<FlutterStreamHandler>* _Nullable)handler;
 @end
 NS_ASSUME_NONNULL_END
 
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterCodecs.h b/shell/platform/darwin/ios/framework/Headers/FlutterCodecs.h
index f16ceaa..f1c4b28 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterCodecs.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterCodecs.h
@@ -95,8 +95,7 @@
    - method: the name of the method to call.
    - arguments: the arguments value.
  */
-+ (instancetype)methodCallWithMethodName:(NSString*)method
-                               arguments:(id _Nullable)arguments;
++ (instancetype)methodCallWithMethodName:(NSString*)method arguments:(id _Nullable)arguments;
 
 /**
  The method name.
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterDartProject.h b/shell/platform/darwin/ios/framework/Headers/FlutterDartProject.h
index 2e1d6eb..79c7a7a 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterDartProject.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterDartProject.h
@@ -12,16 +12,13 @@
 FLUTTER_EXPORT
 @interface FlutterDartProject : NSObject
 
-- (instancetype)initWithPrecompiledDartBundle:(NSBundle*)bundle
-    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithPrecompiledDartBundle:(NSBundle*)bundle NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initWithFLXArchive:(NSURL*)archiveURL
                           dartMain:(NSURL*)dartMainURL
-                          packages:(NSURL*)dartPackages
-    NS_DESIGNATED_INITIALIZER;
+                          packages:(NSURL*)dartPackages NS_DESIGNATED_INITIALIZER;
 
-- (instancetype)initWithFLXArchiveWithScriptSnapshot:(NSURL*)archiveURL
-    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithFLXArchiveWithScriptSnapshot:(NSURL*)archiveURL NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initFromDefaultSourceForConfiguration;
 
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterMacros.h b/shell/platform/darwin/ios/framework/Headers/FlutterMacros.h
index 6ce43fd..4e32b6c 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterMacros.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterMacros.h
@@ -17,7 +17,7 @@
 
 #ifndef NS_ASSUME_NONNULL_BEGIN
 #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
-#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")
-#endif // defined(NS_ASSUME_NONNULL_BEGIN)
+#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
+#endif  // defined(NS_ASSUME_NONNULL_BEGIN)
 
 #endif  // FLUTTER_FLUTTERMACROS_H_
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h b/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h
index d6f9257..20955f3 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h
@@ -17,8 +17,7 @@
 
 - (instancetype)initWithProject:(FlutterDartProject*)project
                         nibName:(NSString*)nibNameOrNil
-                         bundle:(NSBundle*)nibBundleOrNil
-    NS_DESIGNATED_INITIALIZER;
+                         bundle:(NSBundle*)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
 
 - (void)handleStatusBarTouches:(UIEvent*)event;
 @end
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterChannels.mm b/shell/platform/darwin/ios/framework/Source/FlutterChannels.mm
index ed13168..86bef50 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterChannels.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterChannels.mm
@@ -6,7 +6,7 @@
 
 #pragma mark - Basic message channel
 
-@implementation FlutterMessageChannel {
+@implementation FlutterBasicMessageChannel {
   NSObject<FlutterBinaryMessenger>* _messenger;
   NSString* _name;
   NSObject<FlutterMessageCodec>* _codec;
@@ -14,13 +14,16 @@
 + (instancetype)messageChannelWithName:(NSString*)name
                        binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
   NSObject<FlutterMessageCodec>* codec = [FlutterStandardMessageCodec sharedInstance];
-  return [FlutterMessageChannel messageChannelWithName:name binaryMessenger:messenger codec:codec];
+  return [FlutterBasicMessageChannel messageChannelWithName:name
+                                            binaryMessenger:messenger
+                                                      codec:codec];
 }
 + (instancetype)messageChannelWithName:(NSString*)name
                        binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
                                  codec:(NSObject<FlutterMessageCodec>*)codec {
-  return [[[FlutterMessageChannel alloc] initWithName:name binaryMessenger:messenger codec:codec]
-      autorelease];
+  return
+      [[[FlutterBasicMessageChannel alloc] initWithName:name binaryMessenger:messenger codec:codec]
+          autorelease];
 }
 
 - (instancetype)initWithName:(NSString*)name
@@ -42,31 +45,28 @@
 }
 
 - (void)sendMessage:(id)message {
-  [_messenger sendBinaryMessage:[_codec encode:message] channelName:_name];
+  [_messenger sendOnChannel:_name message:[_codec encode:message]];
 }
 
-- (void)sendMessage:(id)message replyHandler:(FlutterReplyHandler)handler {
-  FlutterBinaryReplyHandler replyHandler = ^(NSData* reply) {
-    if (handler)
-      handler([_codec decode:reply]);
+- (void)sendMessage:(id)message reply:(FlutterReply)callback {
+  FlutterBinaryReply reply = ^(NSData* data) {
+    if (callback)
+      callback([_codec decode:data]);
   };
-  [_messenger sendBinaryMessage:[_codec encode:message]
-                    channelName:_name
-             binaryReplyHandler:replyHandler];
+  [_messenger sendOnChannel:_name message:[_codec encode:message] binaryReply:reply];
 }
 
 - (void)setMessageHandler:(FlutterMessageHandler)handler {
   if (!handler) {
-    [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:nil];
+    [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
     return;
   }
-  FlutterBinaryMessageHandler messageHandler =
-      ^(NSData* message, FlutterBinaryReplyHandler replyHandler) {
-        handler([_codec decode:message], ^(id reply) {
-          replyHandler([_codec encode:reply]);
-        });
-      };
-  [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
+  FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
+    handler([_codec decode:message], ^(id reply) {
+      callback([_codec encode:reply]);
+    });
+  };
+  [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
 }
 @end
 
@@ -188,40 +188,38 @@
   FlutterMethodCall* methodCall =
       [FlutterMethodCall methodCallWithMethodName:method arguments:arguments];
   NSData* message = [_codec encodeMethodCall:methodCall];
-  [_messenger sendBinaryMessage:message channelName:_name];
+  [_messenger sendOnChannel:_name message:message];
 }
 
-- (void)invokeMethod:(NSString*)method
-           arguments:(id)arguments
-      resultReceiver:(FlutterResultReceiver)resultReceiver {
+- (void)invokeMethod:(NSString*)method arguments:(id)arguments result:(FlutterResult)callback {
   FlutterMethodCall* methodCall =
       [FlutterMethodCall methodCallWithMethodName:method arguments:arguments];
   NSData* message = [_codec encodeMethodCall:methodCall];
-  FlutterBinaryReplyHandler replyHandler = ^(NSData* reply) {
-    if (resultReceiver) {
-      resultReceiver((reply == nil) ? FlutterMethodNotImplemented : [_codec decodeEnvelope:reply]);
+  FlutterBinaryReply reply = ^(NSData* data) {
+    if (callback) {
+      callback((data == nil) ? FlutterMethodNotImplemented : [_codec decodeEnvelope:data]);
     }
   };
-  [_messenger sendBinaryMessage:message channelName:_name binaryReplyHandler:replyHandler];
+  [_messenger sendOnChannel:_name message:message binaryReply:reply];
 }
 
 - (void)setMethodCallHandler:(FlutterMethodCallHandler)handler {
   if (!handler) {
-    [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:nil];
+    [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
     return;
   }
-  FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReplyHandler reply) {
+  FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
     FlutterMethodCall* call = [_codec decodeMethodCall:message];
     handler(call, ^(id result) {
       if (result == FlutterMethodNotImplemented)
-        reply(nil);
+        callback(nil);
       else if ([result isKindOfClass:[FlutterError class]])
-        reply([_codec encodeErrorEnvelope:(FlutterError*)result]);
+        callback([_codec encodeErrorEnvelope:(FlutterError*)result]);
       else
-        reply([_codec encodeSuccessEnvelope:result]);
+        callback([_codec encodeSuccessEnvelope:result]);
     });
   };
-  [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
+  [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
 }
 @end
 
@@ -260,37 +258,36 @@
 
 - (void)setStreamHandler:(NSObject<FlutterStreamHandler>*)handler {
   if (!handler) {
-    [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:nil];
+    [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
     return;
   }
-  FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReplyHandler reply) {
+  FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
     FlutterMethodCall* call = [_codec decodeMethodCall:message];
     if ([call.method isEqual:@"listen"]) {
-      FlutterEventReceiver eventReceiver = ^(id event) {
+      FlutterEventSink eventSink = ^(id event) {
         if (event == FlutterEndOfEventStream)
-          [_messenger sendBinaryMessage:nil channelName:_name];
+          [_messenger sendOnChannel:_name message:nil];
         else if ([event isKindOfClass:[FlutterError class]])
-          [_messenger sendBinaryMessage:[_codec encodeErrorEnvelope:(FlutterError*)event]
-                            channelName:_name];
+          [_messenger sendOnChannel:_name
+                            message:[_codec encodeErrorEnvelope:(FlutterError*)event]];
         else
-          [_messenger sendBinaryMessage:[_codec encodeSuccessEnvelope:event] channelName:_name];
+          [_messenger sendOnChannel:_name message:[_codec encodeSuccessEnvelope:event]];
       };
-      FlutterError* error =
-          [handler onListenWithArguments:call.arguments eventReceiver:eventReceiver];
+      FlutterError* error = [handler onListenWithArguments:call.arguments eventSink:eventSink];
       if (error)
-        reply([_codec encodeErrorEnvelope:error]);
+        callback([_codec encodeErrorEnvelope:error]);
       else
-        reply([_codec encodeSuccessEnvelope:nil]);
+        callback([_codec encodeSuccessEnvelope:nil]);
     } else if ([call.method isEqual:@"cancel"]) {
       FlutterError* error = [handler onCancelWithArguments:call.arguments];
       if (error)
-        reply([_codec encodeErrorEnvelope:error]);
+        callback([_codec encodeErrorEnvelope:error]);
       else
-        reply([_codec encodeSuccessEnvelope:nil]);
+        callback([_codec encodeSuccessEnvelope:nil]);
     } else {
-      reply(nil);
+      callback(nil);
     }
   };
-  [_messenger setBinaryMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
+  [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
 }
 @end
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterDartSource.h b/shell/platform/darwin/ios/framework/Source/FlutterDartSource.h
index ebf869b..8cdfc4a 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterDartSource.h
+++ b/shell/platform/darwin/ios/framework/Source/FlutterDartSource.h
@@ -20,8 +20,7 @@
                         packages:(NSURL*)packages
                       flxArchive:(NSURL*)flxArchive NS_DESIGNATED_INITIALIZER;
 
-- (instancetype)initWithFLXArchiveWithScriptSnapshot:(NSURL*)flxArchive
-    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithFLXArchiveWithScriptSnapshot:(NSURL*)flxArchive NS_DESIGNATED_INITIALIZER;
 
 - (void)validate:(ValidationResult)result;
 
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h
index 72c93ab..6ddc181 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h
+++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h
@@ -9,7 +9,7 @@
 
 @interface FlutterPlatformPlugin : NSObject
 
--(void)handleMethodCall:(FlutterMethodCall*)call resultReceiver:(FlutterResultReceiver)resultReceiver;
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;
 
 @end
 
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm
index 21ecfb4..e9246cf 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm
@@ -40,45 +40,44 @@
 
 @implementation FlutterPlatformPlugin
 
-- (void)handleMethodCall:(FlutterMethodCall*)call
-          resultReceiver:(FlutterResultReceiver)resultReceiver {
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
   NSString* method = call.method;
   id args = call.arguments;
   if ([method isEqualToString:@"SystemSound.play"]) {
     [self playSystemSound:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"HapticFeedback.vibrate"]) {
     [self vibrateHapticFeedback];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"UrlLauncher.launch"]) {
     [self launchURL:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"SystemChrome.setPreferredOrientations"]) {
     [self setSystemChromePreferredOrientations:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"SystemChrome.setApplicationSwitcherDescription"]) {
     [self setSystemChromeApplicationSwitcherDescription:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"SystemChrome.setEnabledSystemUIOverlays"]) {
     [self setSystemChromeEnabledSystemUIOverlays:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"SystemChrome.setSystemUIOverlayStyle"]) {
     [self setSystemChromeSystemUIOverlayStyle:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"SystemNavigator.pop"]) {
     [self popSystemNavigator];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"Clipboard.getData"]) {
-    resultReceiver([self getClipboardData:args]);
+    result([self getClipboardData:args]);
   } else if ([method isEqualToString:@"Clipboard.setData"]) {
     [self setClipboardData:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"PathProvider.getTemporaryDirectory"]) {
-    resultReceiver([self getPathProviderTemporaryDirectory]);
+    result([self getPathProviderTemporaryDirectory]);
   } else if ([method isEqualToString:@"PathProvider.getApplicationDocumentsDirectory"]) {
-    resultReceiver([self getPathProviderApplicationDocumentsDirectory]);
+    result([self getPathProviderApplicationDocumentsDirectory]);
   } else {
-    resultReceiver(FlutterMethodNotImplemented);
+    result(FlutterMethodNotImplemented);
   }
 }
 
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterStandardCodec_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterStandardCodec_Internal.h
index a49aec5..ccd46e6 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterStandardCodec_Internal.h
+++ b/shell/platform/darwin/ios/framework/Source/FlutterStandardCodec_Internal.h
@@ -25,12 +25,10 @@
 };
 
 namespace shell {
-FlutterStandardField FlutterStandardFieldForDataType(
-    FlutterStandardDataType type) {
+FlutterStandardField FlutterStandardFieldForDataType(FlutterStandardDataType type) {
   return (FlutterStandardField)(type + FlutterStandardFieldUInt8Data);
 }
-FlutterStandardDataType FlutterStandardDataTypeForField(
-    FlutterStandardField field) {
+FlutterStandardDataType FlutterStandardDataTypeForField(FlutterStandardField field) {
   return (FlutterStandardDataType)(field - FlutterStandardFieldUInt8Data);
 }
 UInt8 elementSizeForFlutterStandardDataType(FlutterStandardDataType type) {
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h
index 5c1096e..7eaa71a 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h
+++ b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h
@@ -11,7 +11,7 @@
 @interface FlutterTextInputPlugin : NSObject
 
 @property(nonatomic, assign) id<FlutterTextInputDelegate> textInputDelegate;
--(void)handleMethodCall:(FlutterMethodCall*)call resultReceiver:(FlutterResultReceiver)resultReceiver;
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;
 
 @end
 
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm
index fec5e44..83c1a88 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm
@@ -282,7 +282,8 @@
   return [FlutterTextRange rangeWithNSRange:NSMakeRange(fromIndex, toIndex - fromIndex)];
 }
 
-/** Returns the range of the character sequence at the specified index in the text. */
+/** Returns the range of the character sequence at the specified index in the
+ * text. */
 - (NSRange)rangeForCharacterAtIndex:(NSUInteger)index {
   if (index < self.text.length)
     [self.text rangeOfComposedCharacterSequenceAtIndex:index];
@@ -397,8 +398,10 @@
 
 #pragma mark - UITextInput cursor, selection rect handling
 
-// The following methods are required to support force-touch cursor positioning and to position the
-// candidates view for multi-stage input methods (e.g., Japanese) when using a physical keyboard.
+// The following methods are required to support force-touch cursor positioning
+// and to position the
+// candidates view for multi-stage input methods (e.g., Japanese) when using a
+// physical keyboard.
 
 - (CGRect)firstRectForRange:(UITextRange*)range {
   // TODO(cbracken) Implement.
@@ -496,27 +499,26 @@
   [super dealloc];
 }
 
-- (void)handleMethodCall:(FlutterMethodCall*)call
-          resultReceiver:(FlutterResultReceiver)resultReceiver {
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
   NSString* method = call.method;
   id args = call.arguments;
   if ([method isEqualToString:@"TextInput.show"]) {
     [self showTextInput];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"TextInput.hide"]) {
     [self hideTextInput];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"TextInput.setClient"]) {
     [self setTextInputClient:[args[0] intValue] withConfiguration:args[1]];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"TextInput.setEditingState"]) {
     [self setTextInputEditingState:args];
-    resultReceiver(nil);
+    result(nil);
   } else if ([method isEqualToString:@"TextInput.clearClient"]) {
     [self clearTextInputClient];
-    resultReceiver(nil);
+    result(nil);
   } else {
-    resultReceiver(FlutterMethodNotImplemented);
+    result(FlutterMethodNotImplemented);
   }
 }
 
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
index 4b13f06..50abff0 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
@@ -69,8 +69,8 @@
   fml::scoped_nsprotocol<FlutterMethodChannel*> _navigationChannel;
   fml::scoped_nsprotocol<FlutterMethodChannel*> _platformChannel;
   fml::scoped_nsprotocol<FlutterMethodChannel*> _textInputChannel;
-  fml::scoped_nsprotocol<FlutterMessageChannel*> _lifecycleChannel;
-  fml::scoped_nsprotocol<FlutterMessageChannel*> _systemChannel;
+  fml::scoped_nsprotocol<FlutterBasicMessageChannel*> _lifecycleChannel;
+  fml::scoped_nsprotocol<FlutterBasicMessageChannel*> _systemChannel;
   BOOL _initialized;
 }
 
@@ -141,28 +141,26 @@
       binaryMessenger:self
                 codec:[FlutterJSONMethodCodec sharedInstance]]);
 
-  _lifecycleChannel.reset([[FlutterMessageChannel alloc]
+  _lifecycleChannel.reset([[FlutterBasicMessageChannel alloc]
          initWithName:@"flutter/lifecycle"
       binaryMessenger:self
                 codec:[FlutterStringCodec sharedInstance]]);
 
-  _systemChannel.reset([[FlutterMessageChannel alloc]
+  _systemChannel.reset([[FlutterBasicMessageChannel alloc]
          initWithName:@"flutter/system"
       binaryMessenger:self
                 codec:[FlutterJSONMessageCodec sharedInstance]]);
 
   _platformPlugin.reset([[FlutterPlatformPlugin alloc] init]);
-  [_platformChannel.get()
-      setMethodCallHandler:^(FlutterMethodCall* call, FlutterResultReceiver resultReceiver) {
-        [_platformPlugin.get() handleMethodCall:call resultReceiver:resultReceiver];
-      }];
+  [_platformChannel.get() setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
+    [_platformPlugin.get() handleMethodCall:call result:result];
+  }];
 
   _textInputPlugin.reset([[FlutterTextInputPlugin alloc] init]);
   _textInputPlugin.get().textInputDelegate = self;
-  [_textInputChannel.get()
-      setMethodCallHandler:^(FlutterMethodCall* call, FlutterResultReceiver resultReceiver) {
-        [_textInputPlugin.get() handleMethodCall:call resultReceiver:resultReceiver];
-      }];
+  [_textInputChannel.get() setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
+    [_textInputPlugin.get() handleMethodCall:call result:result];
+  }];
 
   [self setupNotificationCenterObservers];
 
@@ -561,15 +559,15 @@
   });
 }
 
-#pragma mark - Application Messages
+#pragma mark - FlutterBinaryMessenger
 
-- (void)sendBinaryMessage:(NSData*)message channelName:(NSString*)channel {
-  [self sendBinaryMessage:message channelName:channel binaryReplyHandler:nil];
+- (void)sendOnChannel:(NSString*)channel message:(NSData*)message {
+  [self sendOnChannel:channel message:message binaryReply:nil];
 }
 
-- (void)sendBinaryMessage:(NSData*)message
-              channelName:(NSString*)channel
-       binaryReplyHandler:(FlutterBinaryReplyHandler)callback {
+- (void)sendOnChannel:(NSString*)channel
+              message:(NSData*)message
+          binaryReply:(FlutterBinaryReply)callback {
   NSAssert(channel, @"The channel must not be null");
   ftl::RefPtr<PlatformMessageResponseDarwin> response =
       (callback == nil) ? nullptr
@@ -583,9 +581,9 @@
   _platformView->DispatchPlatformMessage(platformMessage);
 }
 
-- (void)setBinaryMessageHandlerOnChannel:(NSString*)channel
-                    binaryMessageHandler:(FlutterBinaryMessageHandler)handler {
-  NSAssert(channel, @"The channel name must not be null");
+- (void)setMessageHandlerOnChannel:(NSString*)channel
+              binaryMessageHandler:(FlutterBinaryMessageHandler)handler {
+  NSAssert(channel, @"The channel must not be null");
   _platformView->platform_message_router().SetMessageHandler(channel.UTF8String, handler);
 }
 @end
diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h
index 4e3467a..f7db838 100644
--- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h
+++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h
@@ -54,8 +54,7 @@
 
  private:
   SemanticsObject* GetOrCreateObject(int32_t id);
-  void VisitObjectsRecursively(SemanticsObject* object,
-                               std::unordered_set<int>* visited_objects);
+  void VisitObjectsRecursively(SemanticsObject* object, std::unordered_set<int>* visited_objects);
   void ReleaseObjects(const std::unordered_map<int, SemanticsObject*>& objects);
 
   UIView* view_;
diff --git a/shell/platform/darwin/ios/framework/Source/platform_message_router.h b/shell/platform/darwin/ios/framework/Source/platform_message_router.h
index c04b152..4245a02 100644
--- a/shell/platform/darwin/ios/framework/Source/platform_message_router.h
+++ b/shell/platform/darwin/ios/framework/Source/platform_message_router.h
@@ -20,12 +20,10 @@
 
   void HandlePlatformMessage(ftl::RefPtr<blink::PlatformMessage> message);
 
-  void SetMessageHandler(const std::string& channel,
-                         FlutterBinaryMessageHandler handler);
+  void SetMessageHandler(const std::string& channel, FlutterBinaryMessageHandler handler);
 
  private:
-  std::unordered_map<std::string, FlutterBinaryMessageHandler>
-      message_handlers_;
+  std::unordered_map<std::string, FlutterBinaryMessageHandler> message_handlers_;
 
   FTL_DISALLOW_COPY_AND_ASSIGN(PlatformMessageRouter);
 };
diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h
index fa30510..39b608e 100644
--- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h
+++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h
@@ -5,8 +5,8 @@
 #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_VSYNC_WAITER_IOS_H_
 #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_VSYNC_WAITER_IOS_H_
 
-#include "lib/ftl/macros.h"
 #include "flutter/shell/common/vsync_waiter.h"
+#include "lib/ftl/macros.h"
 
 #if __OBJC__
 @class VSyncClient;
diff --git a/travis/licenses_golden/licenses_flutter b/travis/licenses_golden/licenses_flutter
index 4ef778c..fb61ca2 100644
--- a/travis/licenses_golden/licenses_flutter
+++ b/travis/licenses_golden/licenses_flutter
@@ -1072,6 +1072,7 @@
 FILE: ../../../flutter/lib/ui/window/window.h
 FILE: ../../../flutter/runtime/platform_impl.h
 FILE: ../../../flutter/shell/common/skia_event_tracer_impl.cc
+FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONUtil.java
 FILE: ../../../flutter/shell/platform/darwin/desktop/Info.plist
@@ -1422,14 +1423,14 @@
 FILE: ../../../flutter/lib/ui/painting/vertices.h
 FILE: ../../../flutter/shell/gpu/gpu_surface_software.cc
 FILE: ../../../flutter/shell/gpu/gpu_surface_software.h
+FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/BinaryCodec.java
-FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/FlutterEventChannel.java
+FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/EventChannel.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/FlutterException.java
-FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/FlutterMessageChannel.java
-FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/FlutterMethodChannel.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/MessageCodec.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodCall.java
+FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodChannel.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/MethodCodec.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/StandardMessageCodec.java
 FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/StandardMethodCodec.java