chop chop chop
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 9943dbd..685098b 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -114,26 +114,9 @@
 static void add_to_pollset_locked(grpc_chttp2_transport *t,
                                   grpc_pollset *pollset);
 
-<<<<<<< HEAD
-static void schedule_cb(transport *t, op_closure closure, int success);
-static void maybe_finish_read(transport *t, stream *s);
-static void maybe_join_window_updates(transport *t, stream *s);
-static void finish_reads(transport *t);
-static void add_to_pollset_locked(transport *t, grpc_pollset *pollset);
-static void perform_op_locked(transport *t, stream *s,
-                              grpc_transport_stream_op *op);
-static void add_metadata_batch(transport *t, stream *s);
-
-static void flowctl_trace(transport *t, const char *flow, gpr_int32 window,
-                          gpr_uint32 id, gpr_int32 delta) {
-  gpr_log(GPR_DEBUG, "HTTP:FLOW:%p:%d:%s: %d + %d = %d", t, id, flow, window,
-          delta, window + delta);
-}
-=======
 /** Start new streams that have been created if we can */
 static void maybe_start_some_streams(
     grpc_chttp2_transport_global *transport_global);
->>>>>>> 48f0a13f3872876787f4d7588b396db914319b1b
 
 /*
  * CONSTRUCTION/DESTRUCTION/REFCOUNTING
@@ -385,16 +368,9 @@
 }
 
 static int init_stream(grpc_transport *gt, grpc_stream *gs,
-<<<<<<< HEAD
-                       const void *server_data,
-                       grpc_transport_stream_op *initial_op) {
-  transport *t = (transport *)gt;
-  stream *s = (stream *)gs;
-=======
                        const void *server_data, grpc_transport_stream_op *initial_op) {
   grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
   grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
->>>>>>> 48f0a13f3872876787f4d7588b396db914319b1b
 
   memset(s, 0, sizeof(*s));
 
@@ -635,14 +611,9 @@
   }
 }
 
-<<<<<<< HEAD
-static void perform_op_locked(transport *t, stream *s,
-                              grpc_transport_stream_op *op) {
-=======
 static void perform_op_locked(grpc_chttp2_transport_global *transport_global,
                               grpc_chttp2_stream_global *stream_global,
                               grpc_transport_stream_op *op) {
->>>>>>> 48f0a13f3872876787f4d7588b396db914319b1b
   if (op->cancel_with_status != GRPC_STATUS_OK) {
     cancel_from_api(transport_global, stream_global, op->cancel_with_status);
   }
@@ -699,15 +670,9 @@
 }
 
 static void perform_op(grpc_transport *gt, grpc_stream *gs,
-<<<<<<< HEAD
-                       grpc_transport_stream_op *op) {
-  transport *t = (transport *)gt;
-  stream *s = (stream *)gs;
-=======
                        grpc_transport_stream_op *op) {
   grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
   grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
->>>>>>> 48f0a13f3872876787f4d7588b396db914319b1b
 
   lock(t);
   perform_op_locked(&t->global, &s->global, op);
diff --git a/src/core/transport/transport.c b/src/core/transport/transport.c
index a73c32d..40faa27 100644
--- a/src/core/transport/transport.c
+++ b/src/core/transport/transport.c
@@ -58,9 +58,14 @@
                                         initial_op);
 }
 
-void grpc_transport_perform_op(grpc_transport *transport, grpc_stream *stream,
+void grpc_transport_perform_stream_op(grpc_transport *transport, grpc_stream *stream,
                                grpc_transport_stream_op *op) {
-  transport->vtable->perform_op(transport, stream, op);
+  transport->vtable->perform_stream_op(transport, stream, op);
+}
+
+void grpc_transport_perform_op(grpc_transport *transport,
+                               grpc_transport_op *op) {
+  transport->vtable->perform_op(transport, op);
 }
 
 void grpc_transport_add_to_pollset(grpc_transport *transport,
diff --git a/src/core/transport/transport.h b/src/core/transport/transport.h
index fbfed46..7f6a37d 100644
--- a/src/core/transport/transport.h
+++ b/src/core/transport/transport.h
@@ -43,7 +43,6 @@
 
 /* forward declarations */
 typedef struct grpc_transport grpc_transport;
-typedef struct grpc_transport_callbacks grpc_transport_callbacks;
 
 /* grpc_stream doesn't actually exist. It's used as a typesafe
    opaque pointer for whatever data the transport wants to track
@@ -62,7 +61,8 @@
   GRPC_STREAM_CLOSED
 } grpc_stream_state;
 
-/* Transport op: a set of operations to perform on a transport */
+/* Transport stream op: a set of operations to perform on a transport
+   against a single stream */
 typedef struct grpc_transport_stream_op {
   grpc_iomgr_closure *on_consumed;
 
@@ -83,30 +83,27 @@
   grpc_call_context_element *context;
 } grpc_transport_stream_op;
 
-/* Callbacks made from the transport to the upper layers of grpc. */
-struct grpc_transport_callbacks {
-  /* Initialize a new stream on behalf of the transport.
-     Must result in a call to
-     grpc_transport_init_stream(transport, ..., request) in the same call
-     stack.
-     Must not result in any other calls to the transport.
-
-     Arguments:
-       user_data     - the transport user data set at transport creation time
-       transport     - the grpc_transport instance making this call
-       request       - request parameters for this stream (owned by the caller)
-       server_data   - opaque transport dependent argument that should be passed
-                       to grpc_transport_init_stream
-     */
-  void (*accept_stream)(void *user_data, grpc_transport *transport,
-                        const void *server_data);
-
-  void (*goaway)(void *user_data, grpc_transport *transport,
-                 grpc_status_code status, gpr_slice debug);
-
-  /* The transport has been closed */
-  void (*closed)(void *user_data, grpc_transport *transport);
-};
+/** Transport op: a set of operations to perform on a transport as a whole */
+typedef struct grpc_transport_op {
+  /** connectivity monitoring */
+  grpc_iomgr_closure *on_connectivity_state_change;
+  grpc_connectivity_state *connectivity_state;
+  /** should the transport be disconnected */
+  int disconnect;
+  /** should we send a goaway? */
+  int send_goaway;
+  /** what should the goaway contain? */
+  grpc_status_code goaway_status;
+  gpr_slice *goaway_message;
+  /** set the callback for accepting new streams;
+      this is a permanent callback, unlike the other one-shot closures */
+  void (*set_accept_stream)(void *user_data, grpc_transport *transport, const void *server_data);
+  void *set_accept_stream_user_data;
+  /** add this transport to a pollset */
+  grpc_pollset *bind_pollset;
+  /** send a ping, call this back if not NULL */
+  grpc_iomgr_closure *send_ping;
+} grpc_transport_op;
 
 /* Returns the amount of memory required to store a grpc_stream for this
    transport */
@@ -144,10 +141,6 @@
                                                grpc_status_code status,
                                                grpc_mdstr *message);
 
-/* TODO(ctiller): remove this */
-void grpc_transport_add_to_pollset(grpc_transport *transport,
-                                   grpc_pollset *pollset);
-
 char *grpc_transport_stream_op_string(grpc_transport_stream_op *op);
 
 /* Send a batch of operations on a transport
@@ -159,9 +152,11 @@
      stream    - the stream on which to send the operations. This must be
                  non-NULL and previously initialized by the same transport.
      op        - a grpc_transport_stream_op specifying the op to perform */
-void grpc_transport_perform_op(grpc_transport *transport, grpc_stream *stream,
+void grpc_transport_perform_stream_op(grpc_transport *transport, grpc_stream *stream,
                                grpc_transport_stream_op *op);
 
+void grpc_transport_perform_op(grpc_transport *transport, grpc_transport_op *op);
+
 /* Send a ping on a transport
 
    Calls cb with user data when a response is received. */
@@ -180,7 +175,6 @@
 /* Return type for grpc_transport_setup_callback */
 typedef struct grpc_transport_setup_result {
   void *user_data;
-  const grpc_transport_callbacks *callbacks;
 } grpc_transport_setup_result;
 
 /* Given a transport, return callbacks for that transport. Used to finalize
diff --git a/src/core/transport/transport_impl.h b/src/core/transport/transport_impl.h
index 442b64c..b65b1d5 100644
--- a/src/core/transport/transport_impl.h
+++ b/src/core/transport/transport_impl.h
@@ -46,26 +46,17 @@
                      const void *server_data,
                      grpc_transport_stream_op *initial_op);
 
-  /* implementation of grpc_transport_send_batch */
+  /* implementation of grpc_transport_perform_stream_op */
+  void (*perform_stream_op)(grpc_transport *self, grpc_stream *stream,
+                     grpc_transport_stream_op *op);
+
+  /* implementation of grpc_transport_perform_op */
   void (*perform_op)(grpc_transport *self, grpc_stream *stream,
                      grpc_transport_stream_op *op);
 
-  /* implementation of grpc_transport_add_to_pollset */
-  void (*add_to_pollset)(grpc_transport *self, grpc_pollset *pollset);
-
   /* implementation of grpc_transport_destroy_stream */
   void (*destroy_stream)(grpc_transport *self, grpc_stream *stream);
 
-  /* implementation of grpc_transport_goaway */
-  void (*goaway)(grpc_transport *self, grpc_status_code status,
-                 gpr_slice debug_data);
-
-  /* implementation of grpc_transport_close */
-  void (*close)(grpc_transport *self);
-
-  /* implementation of grpc_transport_ping */
-  void (*ping)(grpc_transport *self, grpc_iomgr_closure *cb);
-
   /* implementation of grpc_transport_destroy */
   void (*destroy)(grpc_transport *self);
 } grpc_transport_vtable;