diff --git a/src/core/ext/client_channel/client_channel_factory.c b/src/core/ext/client_channel/client_channel_factory.c
index 4900832d5734e813a9c491fd12572d18640006fe..01eee02979256d3a220cc7e3f7485ae9ce8e85e1 100644
--- a/src/core/ext/client_channel/client_channel_factory.c
+++ b/src/core/ext/client_channel/client_channel_factory.c
@@ -55,3 +55,35 @@ grpc_channel* grpc_client_channel_factory_create_channel(
   return factory->vtable->create_client_channel(exec_ctx, factory, target, type,
                                                 args);
 }
+
+static void *factory_arg_copy(void *factory) {
+  grpc_client_channel_factory_ref(factory);
+  return factory;
+}
+
+static void factory_arg_destroy(void *factory) {
+  // TODO(roth): Remove local exec_ctx when
+  // https://github.com/grpc/grpc/pull/8705 is merged.
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  grpc_client_channel_factory_unref(&exec_ctx, factory);
+  grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static int factory_arg_cmp(void *factory1, void *factory2) {
+  if (factory1 < factory2) return -1;
+  if (factory1 > factory2) return 1;
+  return 0;
+}
+
+static const grpc_arg_pointer_vtable factory_arg_vtable = {
+    factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
+
+grpc_arg grpc_client_channel_factory_create_channel_arg(
+    grpc_client_channel_factory *factory) {
+  grpc_arg arg;
+  arg.type = GRPC_ARG_POINTER;
+  arg.key = GRPC_ARG_CLIENT_CHANNEL_FACTORY;
+  arg.value.pointer.p = factory;
+  arg.value.pointer.vtable = &factory_arg_vtable;
+  return arg;
+}
diff --git a/src/core/ext/client_channel/client_channel_factory.h b/src/core/ext/client_channel/client_channel_factory.h
index 2b8fc577b3b67f3873d2c3fb0034a460b7a9bb4b..e7ad9188813a037d88e67bffb80f27d141f4abc1 100644
--- a/src/core/ext/client_channel/client_channel_factory.h
+++ b/src/core/ext/client_channel/client_channel_factory.h
@@ -83,4 +83,7 @@ grpc_channel *grpc_client_channel_factory_create_channel(
     const char *target, grpc_client_channel_type type,
     const grpc_channel_args *args);
 
+grpc_arg grpc_client_channel_factory_create_channel_arg(
+    grpc_client_channel_factory *factory);
+
 #endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H */
diff --git a/src/core/ext/transport/chttp2/client/insecure/channel_create.c b/src/core/ext/transport/chttp2/client/insecure/channel_create.c
index 3ad34b087076e2a5688c0134e1e0819f37b332e8..1e1bed10dc9633bdfc4bc4cc23f28ec537d22dbb 100644
--- a/src/core/ext/transport/chttp2/client/insecure/channel_create.c
+++ b/src/core/ext/transport/chttp2/client/insecure/channel_create.c
@@ -76,19 +76,6 @@ static const grpc_client_channel_factory_vtable client_channel_factory_vtable =
 static grpc_client_channel_factory client_channel_factory = {
     &client_channel_factory_vtable};
 
-static void *cc_factory_arg_copy(void *cc_factory) { return cc_factory; }
-
-static void cc_factory_arg_destroy(void *cc_factory) {}
-
-static int cc_factory_arg_cmp(void *cc_factory1, void *cc_factory2) {
-  if (cc_factory1 < cc_factory2) return -1;
-  if (cc_factory1 > cc_factory2) return 1;
-  return 0;
-}
-
-static const grpc_arg_pointer_vtable cc_factory_arg_vtable = {
-    cc_factory_arg_copy, cc_factory_arg_destroy, cc_factory_arg_cmp};
-
 /* Create a client channel:
    Asynchronously: - resolve target
                    - connect to it (trying alternatives as presented)
@@ -108,10 +95,7 @@ grpc_channel *grpc_insecure_channel_create(const char *target,
   new_args[0].type = GRPC_ARG_STRING;
   new_args[0].key = GRPC_ARG_SERVER_URI;
   new_args[0].value.string = (char *)target;
-  new_args[1].type = GRPC_ARG_POINTER;
-  new_args[1].key = GRPC_ARG_CLIENT_CHANNEL_FACTORY;
-  new_args[1].value.pointer.p = factory;
-  new_args[1].value.pointer.vtable = &cc_factory_arg_vtable;
+  new_args[1] = grpc_client_channel_factory_create_channel_arg(factory);
   grpc_channel_args *args_copy =
       grpc_channel_args_copy_and_add(args, new_args, GPR_ARRAY_SIZE(new_args));
   // Create channel.
diff --git a/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c b/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c
index 2bef684398729de80aa851b947658c24aa16b01f..2474f544cfdeb497660ca05cad3fcf5f164c7f05 100644
--- a/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c
+++ b/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c
@@ -97,28 +97,6 @@ static const grpc_client_channel_factory_vtable client_channel_factory_vtable =
      client_channel_factory_create_subchannel,
      client_channel_factory_create_channel};
 
-static void *cc_factory_arg_copy(void *cc_factory) {
-  client_channel_factory_ref(cc_factory);
-  return cc_factory;
-}
-
-static void cc_factory_arg_destroy(void *cc_factory) {
-  // TODO(roth): remove local exec_ctx when
-  // https://github.com/grpc/grpc/pull/8705 is merged
-  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  client_channel_factory_unref(&exec_ctx, cc_factory);
-  grpc_exec_ctx_finish(&exec_ctx);
-}
-
-static int cc_factory_arg_cmp(void *cc_factory1, void *cc_factory2) {
-  if (cc_factory1 < cc_factory2) return -1;
-  if (cc_factory1 > cc_factory2) return 1;
-  return 0;
-}
-
-static const grpc_arg_pointer_vtable cc_factory_arg_vtable = {
-    cc_factory_arg_copy, cc_factory_arg_destroy, cc_factory_arg_cmp};
-
 /* Create a secure client channel:
    Asynchronously: - resolve target
                    - connect to it (trying alternatives as presented)
@@ -165,10 +143,7 @@ grpc_channel *grpc_secure_channel_create(grpc_channel_credentials *creds,
   new_args[0].type = GRPC_ARG_STRING;
   new_args[0].key = GRPC_ARG_SERVER_URI;
   new_args[0].value.string = (char *)target;
-  new_args[1].type = GRPC_ARG_POINTER;
-  new_args[1].key = GRPC_ARG_CLIENT_CHANNEL_FACTORY;
-  new_args[1].value.pointer.p = f;
-  new_args[1].value.pointer.vtable = &cc_factory_arg_vtable;
+  new_args[1] = grpc_client_channel_factory_create_channel_arg(&f->base);
   new_args[2] = grpc_security_connector_to_arg(&security_connector->base);
   grpc_channel_args *args_copy = grpc_channel_args_copy_and_add(
       new_args_from_connector != NULL ? new_args_from_connector : args,