Ensure subchannel channelz only created if enabled
diff --git a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
index 1ecae16..390b4ee 100644
--- a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
@@ -328,8 +328,12 @@
   if (subchannel_list_ != nullptr) {
     for (size_t i = 0; i < subchannel_list_->num_subchannels(); ++i) {
       if (subchannel_list_->subchannel(i)->subchannel() != nullptr) {
-        cs.push_back(grpc_subchannel_get_uuid(
-            subchannel_list_->subchannel(i)->subchannel()));
+        grpc_core::channelz::SubchannelNode* subchannel_node =
+            grpc_subchannel_get_channelz_node(
+                subchannel_list_->subchannel(i)->subchannel());
+        if (subchannel_node != nullptr) {
+          cs.push_back(subchannel_node->subchannel_uuid());
+        }
       }
     }
   }
@@ -338,8 +342,12 @@
          ++i) {
       if (latest_pending_subchannel_list_->subchannel(i)->subchannel() !=
           nullptr) {
-        cs.push_back(grpc_subchannel_get_uuid(
-            latest_pending_subchannel_list_->subchannel(i)->subchannel()));
+        grpc_core::channelz::SubchannelNode* subchannel_node =
+            grpc_subchannel_get_channelz_node(
+                latest_pending_subchannel_list_->subchannel(i)->subchannel());
+        if (subchannel_node != nullptr) {
+          cs.push_back(subchannel_node->subchannel_uuid());
+        }
       }
     }
   }
diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc
index 6c4f186..0e349da 100644
--- a/src/core/ext/filters/client_channel/subchannel.cc
+++ b/src/core/ext/filters/client_channel/subchannel.cc
@@ -135,10 +135,8 @@
   /** our alarm */
   grpc_timer alarm;
 
-  /* the global uuid for this subchannel */
-  // TODO(ncteisen): move this into SubchannelNode while implementing
-  //  GetSubchannel.
-  intptr_t subchannel_uuid;
+  grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
+      channelz_subchannel;
 };
 
 struct grpc_subchannel_call {
@@ -379,14 +377,21 @@
   c->backoff.Init(backoff_options);
   gpr_mu_init(&c->mu);
 
-  // This is just a placeholder for now
-  c->subchannel_uuid = 42;
+  // This is just a placeholder channelz class for for now.
+  const grpc_arg* arg =
+      grpc_channel_args_find(c->args, GRPC_ARG_ENABLE_CHANNELZ);
+  bool channelz_enabled = grpc_channel_arg_get_bool(arg, false);
+  if (channelz_enabled) {
+    c->channelz_subchannel =
+        grpc_core::MakeRefCounted<grpc_core::channelz::SubchannelNode>();
+  }
 
   return grpc_subchannel_index_register(key, c);
 }
 
-intptr_t grpc_subchannel_get_uuid(grpc_subchannel* s) {
-  return s->subchannel_uuid;
+grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
+    grpc_subchannel* s) {
+  return s->channelz_subchannel.get();
 }
 
 static void continue_connect_locked(grpc_subchannel* c) {
diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h
index 590e80f..f76be81 100644
--- a/src/core/ext/filters/client_channel/subchannel.h
+++ b/src/core/ext/filters/client_channel/subchannel.h
@@ -71,6 +71,10 @@
 
 namespace grpc_core {
 
+namespace channelz {
+class SubchannelNode;
+}
+
 class ConnectedSubchannel : public RefCountedWithTracing<ConnectedSubchannel> {
  public:
   struct CallArgs {
@@ -115,7 +119,8 @@
 void grpc_subchannel_call_unref(
     grpc_subchannel_call* call GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
 
-intptr_t grpc_subchannel_get_uuid(grpc_subchannel* subchannel);
+grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
+    grpc_subchannel* subchannel);
 
 /** Returns a pointer to the parent data associated with \a subchannel_call.
     The data will be of the size specified in \a parent_data_size
diff --git a/src/core/lib/channel/channelz.cc b/src/core/lib/channel/channelz.cc
index d9bce98..5a0620c 100644
--- a/src/core/lib/channel/channelz.cc
+++ b/src/core/lib/channel/channelz.cc
@@ -131,5 +131,13 @@
       channel, channel_tracer_max_nodes);
 }
 
+SubchannelNode::SubchannelNode() : subchannel_uuid_(-1) {
+  subchannel_uuid_ = ChannelzRegistry::Register(this);
+}
+
+SubchannelNode::~SubchannelNode() {
+  ChannelzRegistry::Unregister(subchannel_uuid_);
+}
+
 }  // namespace channelz
 }  // namespace grpc_core
diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h
index e84c187..f2c5ecd 100644
--- a/src/core/lib/channel/channelz.h
+++ b/src/core/lib/channel/channelz.h
@@ -95,6 +95,24 @@
   ManualConstructor<ChannelTrace> trace_;
 };
 
+// Placeholds channelz class for subchannels. All this can do now is track its
+// uuid (this information is needed by the parent channelz class). In the next
+// PR I will build this out to support the GetSubchannel channelz request.
+class SubchannelNode : public RefCounted<SubchannelNode> {
+ public:
+  SubchannelNode();
+  virtual ~SubchannelNode();
+
+  intptr_t subchannel_uuid() { return subchannel_uuid_; }
+
+ protected:
+  GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
+  GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW
+
+ private:
+  intptr_t subchannel_uuid_;
+};
+
 // Creation functions
 
 typedef RefCountedPtr<ChannelNode> (*ChannelNodeCreationFunc)(grpc_channel*,