WIP: Device layer port to nRF52840

Network Telementry Manager Implementation. The following telemetry
mechanisms there implemented:
  -- Thread Network Telemetry
  -- Thread Network Topology
  -- Thread Network Telemetry Full Statistical Data
  -- WiFi Network Telemetry
  -- Weave Tunnel Telemetry

Thread network telemetry is relavant and enabled for nRF52840 platform.

WiFi network and Weave tunnel telemetry are enabled for ESP32 platform.
diff --git a/build/esp32/components/openweave/Kconfig b/build/esp32/components/openweave/Kconfig
index 274d22b..2e5aa05 100644
--- a/build/esp32/components/openweave/Kconfig
+++ b/build/esp32/components/openweave/Kconfig
@@ -720,4 +720,35 @@
     
     endmenu
 
+    menu "Network Telemetry Options"
+    
+        config ENABLE_WIFI_TELEMETRY
+            bool "Enable WiFi Telemetry"
+            default y
+            help
+                Enable automatically uploading Wi-Fi telemetry via trait on an interval.
+        
+        config ENABLE_THREAD_TELEMETRY
+            bool "Enable Thread Telemetry"
+            default n
+            help
+                Enable automatically uploading minimal Thread telemetry and topology via trait on an interval.
+
+        config ENABLE_THREAD_TELEMETRY_FULL
+            bool "Enable Full Thread Telemetry"
+            default n
+            help
+                Enable automatically uploading all Thread telemetry and topology via trait on an interval.
+                This is suitable for products that have router capability.
+
+                This option can be enabled only when Thread telemetry is enabled.
+        
+        config ENABLE_TUNNEL_TELEMETRY
+            bool "Enable Weave Tunnel Telemetry"
+            default y
+            help
+                Enable automatically uploading Weave tunnel telemetry via trait on an interval.
+    
+    endmenu
+
 endmenu
diff --git a/src/adaptations/device-layer/ESP32/ConnectivityManagerImpl.cpp b/src/adaptations/device-layer/ESP32/ConnectivityManagerImpl.cpp
index 661e442..e6a03fc 100644
--- a/src/adaptations/device-layer/ESP32/ConnectivityManagerImpl.cpp
+++ b/src/adaptations/device-layer/ESP32/ConnectivityManagerImpl.cpp
@@ -50,6 +50,11 @@
 #error "WiFi AP support must be enabled when building for ESP32"
 #endif
 
+#if WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+#include <Weave/Support/TraitEventUtils.h>
+#include <nest/trait/network/TelemetryNetworkTrait.h>
+#include <nest/trait/network/TelemetryNetworkWifiTrait.h>
+#endif
 
 using namespace ::nl;
 using namespace ::nl::Weave;
@@ -187,6 +192,154 @@
     SystemLayer.ScheduleWork(DriveAPState, NULL);
 }
 
+#define WIFI_BAND_2_4GHZ 2400
+#define WIFI_BAND_5_0GHZ 5000
+
+static uint16_t Map2400MHz(const uint8_t inChannel)
+{
+    uint16_t frequency = 0;
+
+    if (inChannel >= 1 && inChannel <= 13) {
+        frequency = 2412 + ((inChannel - 1) * 5);
+
+    } else if (inChannel == 14) {
+        frequency = 2484;
+
+    }
+
+    return frequency;
+}
+
+static uint16_t Map5000MHz(const uint8_t inChannel)
+{
+    uint16_t frequency = 0;
+
+    switch (inChannel) {
+
+    case 183: frequency = 4915; break;
+    case 184: frequency = 4920; break;
+    case 185: frequency = 4925; break;
+    case 187: frequency = 4935; break;
+    case 188: frequency = 4940; break;
+    case 189: frequency = 4945; break;
+    case 192: frequency = 4960; break;
+    case 196: frequency = 4980; break;
+    case 7:   frequency = 5035; break;
+    case 8:   frequency = 5040; break;
+    case 9:   frequency = 5045; break;
+    case 11:  frequency = 5055; break;
+    case 12:  frequency = 5060; break;
+    case 16:  frequency = 5080; break;
+    case 34:  frequency = 5170; break;
+    case 36:  frequency = 5180; break;
+    case 38:  frequency = 5190; break;
+    case 40:  frequency = 5200; break;
+    case 42:  frequency = 5210; break;
+    case 44:  frequency = 5220; break;
+    case 46:  frequency = 5230; break;
+    case 48:  frequency = 5240; break;
+    case 52:  frequency = 5260; break;
+    case 56:  frequency = 5280; break;
+    case 60:  frequency = 5300; break;
+    case 64:  frequency = 5320; break;
+    case 100: frequency = 5500; break;
+    case 104: frequency = 5520; break;
+    case 108: frequency = 5540; break;
+    case 112: frequency = 5560; break;
+    case 116: frequency = 5580; break;
+    case 120: frequency = 5600; break;
+    case 124: frequency = 5620; break;
+    case 128: frequency = 5640; break;
+    case 132: frequency = 5660; break;
+    case 136: frequency = 5680; break;
+    case 140: frequency = 5700; break;
+    case 149: frequency = 5745; break;
+    case 153: frequency = 5765; break;
+    case 157: frequency = 5785; break;
+    case 161: frequency = 5805; break;
+    case 165: frequency = 5825; break;
+
+    }
+
+    return frequency;
+}
+
+static uint16_t MapFrequency(const uint16_t inBand, const uint8_t inChannel)
+{
+    uint16_t frequency = 0;
+
+    if (inBand == WIFI_BAND_2_4GHZ) {
+        frequency = Map2400MHz(inChannel);
+
+    } else if (inBand == WIFI_BAND_5_0GHZ) {
+        frequency = Map5000MHz(inChannel);
+
+    }
+
+    return frequency;
+}
+
+WEAVE_ERROR ConnectivityManagerImpl::_GetAndLogWifiStatsCounters(void)
+{
+    WEAVE_ERROR err;
+    nl::Weave::Profiles::DataManagement_Current::event_id_t eventId;
+    Schema::Nest::Trait::Network::TelemetryNetworkWifiTrait::NetworkWiFiStatsEvent statsEvent;
+    wifi_config_t wifiConfig;
+    uint8_t primaryChannel;
+    wifi_second_chan_t secondChannel;
+
+    VerifyOrExit(_IsWiFiStationConnected() && _IsWiFiStationConnected(), err = WEAVE_NO_ERROR);
+
+    err = esp_wifi_get_config(ESP_IF_WIFI_STA, &wifiConfig);
+    if (err != ESP_OK)
+    {
+        WeaveLogError(DeviceLayer, "esp_wifi_get_config() failed: %s", nl::ErrorStr(err));
+    }
+    SuccessOrExit(err);
+
+    err = esp_wifi_get_channel(&primaryChannel, &secondChannel);
+    if (err != ESP_OK)
+    {
+        WeaveLogError(DeviceLayer, "esp_wifi_get_channel() failed: %s", nl::ErrorStr(err));
+    }
+    SuccessOrExit(err);
+
+    statsEvent.bssid            = (wifiConfig.sta.bssid[4] << 8) | wifiConfig.sta.bssid[5];
+    statsEvent.freq             = MapFrequency(WIFI_BAND_2_4GHZ, primaryChannel);
+    statsEvent.rssi             = 0;
+    statsEvent.bcnRecvd         = 0;
+    statsEvent.bcnLost          = 0;
+    statsEvent.pktMcastRx       = 0;
+    statsEvent.pktUcastRx       = 0;
+    statsEvent.currTxRate       = 0;
+    statsEvent.currRxRate       = 0;
+    statsEvent.sleepTimePercent = 0;
+    statsEvent.numOfAp          = 0;
+
+    WeaveLogProgress(DeviceLayer,
+                     "WiFi-Telemtry\n"
+                     "BSSID:         %x\n"
+                     "freq:          %d\n"
+                     "rssi:          %d\n"
+                     "bcn recvd:     %d\n"
+                     "bcn lost:      %d\n"
+                     "mcast:         %d\n"
+                     "ucast:         %d\n"
+                     "rx rate:       %d\n"
+                     "tx rate:       %d\n"
+                     "sleep percent: %d\n"
+                     "Num of AP:     %d\n",
+                     statsEvent.bssid, statsEvent.freq, statsEvent.rssi, statsEvent.bcnRecvd, statsEvent.bcnLost,
+                     statsEvent.pktMcastRx, statsEvent.pktUcastRx, statsEvent.currRxRate, statsEvent.currTxRate,
+                     statsEvent.sleepTimePercent, statsEvent.numOfAp);
+
+    eventId = nl::LogEvent(&statsEvent);
+    WeaveLogProgress(DeviceLayer, "WiFi Telemetry Stats Event Id: %u\n", eventId);
+
+exit:
+    return err;
+}
+
 WEAVE_ERROR ConnectivityManagerImpl::_SetServiceTunnelMode(ServiceTunnelMode val)
 {
     WEAVE_ERROR err = WEAVE_NO_ERROR;
diff --git a/src/adaptations/device-layer/Makefile.am b/src/adaptations/device-layer/Makefile.am
index 034857e..995eb6b 100644
--- a/src/adaptations/device-layer/Makefile.am
+++ b/src/adaptations/device-layer/Makefile.am
@@ -54,6 +54,7 @@
     include/Weave/DeviceLayer/FreeRTOS/GenericPlatformManagerImpl_FreeRTOS.h \
     include/Weave/DeviceLayer/FreeRTOS/GenericPlatformManagerImpl_FreeRTOS.ipp \
     include/Weave/DeviceLayer/GeneralUtils.h \
+    include/Weave/DeviceLayer/NetworkTelemetryManager.h \
     include/Weave/DeviceLayer/PlatformManager.h \
     include/Weave/DeviceLayer/TimeSyncManager.h \
     include/Weave/DeviceLayer/TraitManager.h \
@@ -79,7 +80,11 @@
     include/Weave/DeviceLayer/internal/ServiceProvisioningServer.h \
     include/Weave/DeviceLayer/internal/ServiceTunnelAgent.h \
     include/Weave/DeviceLayer/internal/WeaveDeviceLayerInternal.h \
+    trait-support/nest/trait/network/TelemetryNetworkTrait.h \
+    trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h \
+    trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h \
     trait-support/weave/trait/description/DeviceIdentityTrait.h \
+    trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h \
     $(NULL)
 
 if CONFIG_DEVICE_LAYER
@@ -102,6 +107,7 @@
     FabricProvisioningServer.cpp          \
     GeneralUtils.cpp                      \
     Globals.cpp                           \
+    NetworkTelemetryManager.cpp           \
     PersistedStorage.cpp                  \
     ServiceDirectoryManager.cpp           \
     ServiceProvisioningServer.cpp         \
@@ -111,7 +117,11 @@
     TestDeviceIds.cpp                     \
     TimeSyncManager.cpp                   \
     TraitManager.cpp                      \
+    trait-support/nest/trait/network/TelemetryNetworkTrait.cpp \
+    trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp \
+    trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp \
     trait-support/weave/trait/description/DeviceIdentityTrait.cpp \
+    trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp \
     $(NULL)
 
 if WEAVE_DEVICE_LAYER_TARGET_ESP32
diff --git a/src/adaptations/device-layer/Makefile.in b/src/adaptations/device-layer/Makefile.in
index 94244e2..26b4925 100644
--- a/src/adaptations/device-layer/Makefile.in
+++ b/src/adaptations/device-layer/Makefile.in
@@ -217,11 +217,16 @@
 	DeviceControlServer.cpp DeviceDescriptionServer.cpp \
 	DeviceIdentityTraitDataSource.cpp DeviceNetworkInfo.cpp \
 	EchoServer.cpp FabricProvisioningServer.cpp GeneralUtils.cpp \
-	Globals.cpp PersistedStorage.cpp ServiceDirectoryManager.cpp \
+	Globals.cpp NetworkTelemetryManager.cpp \
+	PersistedStorage.cpp ServiceDirectoryManager.cpp \
 	ServiceProvisioningServer.cpp ServiceTunnelAgent.cpp \
 	SystemEventSupport.cpp SystemTimerSupport.cpp \
 	TestDeviceIds.cpp TimeSyncManager.cpp TraitManager.cpp \
+	trait-support/nest/trait/network/TelemetryNetworkTrait.cpp \
+	trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp \
+	trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp \
 	trait-support/weave/trait/description/DeviceIdentityTrait.cpp \
+	trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp \
 	ESP32/AESBlockCipher.cpp ESP32/BLEManagerImpl.cpp \
 	ESP32/ConfigurationManagerImpl.cpp \
 	ESP32/ConnectivityManagerImpl.cpp ESP32/Entropy.cpp \
@@ -276,6 +281,7 @@
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-FabricProvisioningServer.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-GeneralUtils.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-Globals.$(OBJEXT) \
+@CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-NetworkTelemetryManager.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-PersistedStorage.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-ServiceDirectoryManager.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-ServiceProvisioningServer.$(OBJEXT) \
@@ -285,7 +291,11 @@
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-TestDeviceIds.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-TimeSyncManager.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	libDeviceLayer_a-TraitManager.$(OBJEXT) \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.$(OBJEXT) \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.$(OBJEXT) \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.$(OBJEXT) \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.$(OBJEXT) \
 @CONFIG_DEVICE_LAYER_TRUE@	$(am__objects_1) $(am__objects_2)
 libDeviceLayer_a_OBJECTS = $(am_libDeviceLayer_a_OBJECTS)
 AM_V_P = $(am__v_P_@AM_V@)
@@ -635,6 +645,7 @@
     include/Weave/DeviceLayer/FreeRTOS/GenericPlatformManagerImpl_FreeRTOS.h \
     include/Weave/DeviceLayer/FreeRTOS/GenericPlatformManagerImpl_FreeRTOS.ipp \
     include/Weave/DeviceLayer/GeneralUtils.h \
+    include/Weave/DeviceLayer/NetworkTelemetryManager.h \
     include/Weave/DeviceLayer/PlatformManager.h \
     include/Weave/DeviceLayer/TimeSyncManager.h \
     include/Weave/DeviceLayer/TraitManager.h \
@@ -660,7 +671,11 @@
     include/Weave/DeviceLayer/internal/ServiceProvisioningServer.h \
     include/Weave/DeviceLayer/internal/ServiceTunnelAgent.h \
     include/Weave/DeviceLayer/internal/WeaveDeviceLayerInternal.h \
+    trait-support/nest/trait/network/TelemetryNetworkTrait.h \
+    trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h \
+    trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h \
     trait-support/weave/trait/description/DeviceIdentityTrait.h \
+    trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h \
     $(NULL)
 
 @CONFIG_DEVICE_LAYER_TRUE@lib_LIBRARIES = libDeviceLayer.a
@@ -677,6 +692,7 @@
 @CONFIG_DEVICE_LAYER_TRUE@	DeviceNetworkInfo.cpp EchoServer.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	FabricProvisioningServer.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	GeneralUtils.cpp Globals.cpp \
+@CONFIG_DEVICE_LAYER_TRUE@	NetworkTelemetryManager.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	PersistedStorage.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	ServiceDirectoryManager.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	ServiceProvisioningServer.cpp \
@@ -685,7 +701,11 @@
 @CONFIG_DEVICE_LAYER_TRUE@	SystemTimerSupport.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	TestDeviceIds.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	TimeSyncManager.cpp TraitManager.cpp \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/TelemetryNetworkTrait.cpp \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	trait-support/weave/trait/description/DeviceIdentityTrait.cpp \
+@CONFIG_DEVICE_LAYER_TRUE@	trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp \
 @CONFIG_DEVICE_LAYER_TRUE@	$(NULL) $(am__append_1) \
 @CONFIG_DEVICE_LAYER_TRUE@	$(am__append_2)
 all: all-am
@@ -753,6 +773,21 @@
 
 clean-libLIBRARIES:
 	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
+trait-support/nest/trait/network/$(am__dirstamp):
+	@$(MKDIR_P) trait-support/nest/trait/network
+	@: > trait-support/nest/trait/network/$(am__dirstamp)
+trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) trait-support/nest/trait/network/$(DEPDIR)
+	@: > trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp)
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.$(OBJEXT):  \
+	trait-support/nest/trait/network/$(am__dirstamp) \
+	trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp)
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.$(OBJEXT):  \
+	trait-support/nest/trait/network/$(am__dirstamp) \
+	trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp)
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.$(OBJEXT):  \
+	trait-support/nest/trait/network/$(am__dirstamp) \
+	trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp)
 trait-support/weave/trait/description/$(am__dirstamp):
 	@$(MKDIR_P) trait-support/weave/trait/description
 	@: > trait-support/weave/trait/description/$(am__dirstamp)
@@ -762,6 +797,15 @@
 trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.$(OBJEXT):  \
 	trait-support/weave/trait/description/$(am__dirstamp) \
 	trait-support/weave/trait/description/$(DEPDIR)/$(am__dirstamp)
+trait-support/weave/trait/telemetry/tunnel/$(am__dirstamp):
+	@$(MKDIR_P) trait-support/weave/trait/telemetry/tunnel
+	@: > trait-support/weave/trait/telemetry/tunnel/$(am__dirstamp)
+trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)
+	@: > trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/$(am__dirstamp)
+trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.$(OBJEXT):  \
+	trait-support/weave/trait/telemetry/tunnel/$(am__dirstamp) \
+	trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/$(am__dirstamp)
 ESP32/$(am__dirstamp):
 	@$(MKDIR_P) ESP32
 	@: > ESP32/$(am__dirstamp)
@@ -860,7 +904,9 @@
 	-rm -f LwIP/*.$(OBJEXT)
 	-rm -f OpenThread/*.$(OBJEXT)
 	-rm -f nRF5/*.$(OBJEXT)
+	-rm -f trait-support/nest/trait/network/*.$(OBJEXT)
 	-rm -f trait-support/weave/trait/description/*.$(OBJEXT)
+	-rm -f trait-support/weave/trait/telemetry/tunnel/*.$(OBJEXT)
 
 distclean-compile:
 	-rm -f *.tab.c
@@ -874,6 +920,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-FabricProvisioningServer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-GeneralUtils.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-Globals.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-PersistedStorage.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-ServiceDirectoryManager.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libDeviceLayer_a-ServiceProvisioningServer.Po@am__quote@
@@ -910,7 +957,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@nRF5/$(DEPDIR)/libDeviceLayer_a-ThreadStackManagerImpl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@nRF5/$(DEPDIR)/libDeviceLayer_a-nRF5Config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@nRF5/$(DEPDIR)/libDeviceLayer_a-nRF5Utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@trait-support/weave/trait/description/$(DEPDIR)/libDeviceLayer_a-DeviceIdentityTrait.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Po@am__quote@
 
 .cpp.o:
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -1062,6 +1113,20 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libDeviceLayer_a-Globals.obj `if test -f 'Globals.cpp'; then $(CYGPATH_W) 'Globals.cpp'; else $(CYGPATH_W) '$(srcdir)/Globals.cpp'; fi`
 
+libDeviceLayer_a-NetworkTelemetryManager.o: NetworkTelemetryManager.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libDeviceLayer_a-NetworkTelemetryManager.o -MD -MP -MF $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Tpo -c -o libDeviceLayer_a-NetworkTelemetryManager.o `test -f 'NetworkTelemetryManager.cpp' || echo '$(srcdir)/'`NetworkTelemetryManager.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Tpo $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='NetworkTelemetryManager.cpp' object='libDeviceLayer_a-NetworkTelemetryManager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libDeviceLayer_a-NetworkTelemetryManager.o `test -f 'NetworkTelemetryManager.cpp' || echo '$(srcdir)/'`NetworkTelemetryManager.cpp
+
+libDeviceLayer_a-NetworkTelemetryManager.obj: NetworkTelemetryManager.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libDeviceLayer_a-NetworkTelemetryManager.obj -MD -MP -MF $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Tpo -c -o libDeviceLayer_a-NetworkTelemetryManager.obj `if test -f 'NetworkTelemetryManager.cpp'; then $(CYGPATH_W) 'NetworkTelemetryManager.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkTelemetryManager.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Tpo $(DEPDIR)/libDeviceLayer_a-NetworkTelemetryManager.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='NetworkTelemetryManager.cpp' object='libDeviceLayer_a-NetworkTelemetryManager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libDeviceLayer_a-NetworkTelemetryManager.obj `if test -f 'NetworkTelemetryManager.cpp'; then $(CYGPATH_W) 'NetworkTelemetryManager.cpp'; else $(CYGPATH_W) '$(srcdir)/NetworkTelemetryManager.cpp'; fi`
+
 libDeviceLayer_a-PersistedStorage.o: PersistedStorage.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libDeviceLayer_a-PersistedStorage.o -MD -MP -MF $(DEPDIR)/libDeviceLayer_a-PersistedStorage.Tpo -c -o libDeviceLayer_a-PersistedStorage.o `test -f 'PersistedStorage.cpp' || echo '$(srcdir)/'`PersistedStorage.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libDeviceLayer_a-PersistedStorage.Tpo $(DEPDIR)/libDeviceLayer_a-PersistedStorage.Po
@@ -1188,6 +1253,48 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libDeviceLayer_a-TraitManager.obj `if test -f 'TraitManager.cpp'; then $(CYGPATH_W) 'TraitManager.cpp'; else $(CYGPATH_W) '$(srcdir)/TraitManager.cpp'; fi`
 
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.o: trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.o -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
+
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.obj: trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.obj -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp'; fi`
+
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.o: trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.o -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
+
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.obj: trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.obj -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWifiTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWifiTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp'; fi`
+
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.o: trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.o -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.o `test -f 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp' || echo '$(srcdir)/'`trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
+
+trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.obj: trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.obj -MD -MP -MF trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Tpo -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Tpo trait-support/nest/trait/network/$(DEPDIR)/libDeviceLayer_a-TelemetryNetworkWpanTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp' object='trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/nest/trait/network/libDeviceLayer_a-TelemetryNetworkWpanTrait.obj `if test -f 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; then $(CYGPATH_W) 'trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp'; fi`
+
 trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.o: trait-support/weave/trait/description/DeviceIdentityTrait.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.o -MD -MP -MF trait-support/weave/trait/description/$(DEPDIR)/libDeviceLayer_a-DeviceIdentityTrait.Tpo -c -o trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.o `test -f 'trait-support/weave/trait/description/DeviceIdentityTrait.cpp' || echo '$(srcdir)/'`trait-support/weave/trait/description/DeviceIdentityTrait.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/weave/trait/description/$(DEPDIR)/libDeviceLayer_a-DeviceIdentityTrait.Tpo trait-support/weave/trait/description/$(DEPDIR)/libDeviceLayer_a-DeviceIdentityTrait.Po
@@ -1202,6 +1309,20 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/weave/trait/description/libDeviceLayer_a-DeviceIdentityTrait.obj `if test -f 'trait-support/weave/trait/description/DeviceIdentityTrait.cpp'; then $(CYGPATH_W) 'trait-support/weave/trait/description/DeviceIdentityTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/weave/trait/description/DeviceIdentityTrait.cpp'; fi`
 
+trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.o: trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.o -MD -MP -MF trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Tpo -c -o trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.o `test -f 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp' || echo '$(srcdir)/'`trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Tpo trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp' object='trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.o `test -f 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp' || echo '$(srcdir)/'`trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
+
+trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.obj: trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.obj -MD -MP -MF trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Tpo -c -o trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.obj `if test -f 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; then $(CYGPATH_W) 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Tpo trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/libDeviceLayer_a-TelemetryTunnelTrait.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp' object='trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o trait-support/weave/trait/telemetry/tunnel/libDeviceLayer_a-TelemetryTunnelTrait.obj `if test -f 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; then $(CYGPATH_W) 'trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; else $(CYGPATH_W) '$(srcdir)/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp'; fi`
+
 ESP32/libDeviceLayer_a-AESBlockCipher.o: ESP32/AESBlockCipher.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libDeviceLayer_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ESP32/libDeviceLayer_a-AESBlockCipher.o -MD -MP -MF ESP32/$(DEPDIR)/libDeviceLayer_a-AESBlockCipher.Tpo -c -o ESP32/libDeviceLayer_a-AESBlockCipher.o `test -f 'ESP32/AESBlockCipher.cpp' || echo '$(srcdir)/'`ESP32/AESBlockCipher.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ESP32/$(DEPDIR)/libDeviceLayer_a-AESBlockCipher.Tpo ESP32/$(DEPDIR)/libDeviceLayer_a-AESBlockCipher.Po
@@ -1711,8 +1832,12 @@
 	-rm -f OpenThread/$(am__dirstamp)
 	-rm -f nRF5/$(DEPDIR)/$(am__dirstamp)
 	-rm -f nRF5/$(am__dirstamp)
+	-rm -f trait-support/nest/trait/network/$(DEPDIR)/$(am__dirstamp)
+	-rm -f trait-support/nest/trait/network/$(am__dirstamp)
 	-rm -f trait-support/weave/trait/description/$(DEPDIR)/$(am__dirstamp)
 	-rm -f trait-support/weave/trait/description/$(am__dirstamp)
+	-rm -f trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)/$(am__dirstamp)
+	-rm -f trait-support/weave/trait/telemetry/tunnel/$(am__dirstamp)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -1723,7 +1848,7 @@
 	mostlyclean-am
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) ESP32/$(DEPDIR) FreeRTOS/$(DEPDIR) LwIP/$(DEPDIR) OpenThread/$(DEPDIR) nRF5/$(DEPDIR) trait-support/weave/trait/description/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) ESP32/$(DEPDIR) FreeRTOS/$(DEPDIR) LwIP/$(DEPDIR) OpenThread/$(DEPDIR) nRF5/$(DEPDIR) trait-support/nest/trait/network/$(DEPDIR) trait-support/weave/trait/description/$(DEPDIR) trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
@@ -1769,7 +1894,7 @@
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) ESP32/$(DEPDIR) FreeRTOS/$(DEPDIR) LwIP/$(DEPDIR) OpenThread/$(DEPDIR) nRF5/$(DEPDIR) trait-support/weave/trait/description/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) ESP32/$(DEPDIR) FreeRTOS/$(DEPDIR) LwIP/$(DEPDIR) OpenThread/$(DEPDIR) nRF5/$(DEPDIR) trait-support/nest/trait/network/$(DEPDIR) trait-support/weave/trait/description/$(DEPDIR) trait-support/weave/trait/telemetry/tunnel/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
diff --git a/src/adaptations/device-layer/NetworkTelemetryManager.cpp b/src/adaptations/device-layer/NetworkTelemetryManager.cpp
new file mode 100644
index 0000000..fc376ea
--- /dev/null
+++ b/src/adaptations/device-layer/NetworkTelemetryManager.cpp
@@ -0,0 +1,238 @@
+/*
+ *
+ *    Copyright (c) 2019 Google LLC.
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ *    @file
+ *      Implementation for the Weave Device Layer Network Telemetry object.
+ *
+ */
+
+#include <Weave/DeviceLayer/internal/WeaveDeviceLayerInternal.h>
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_NETWORK_TELEMETRY
+
+#include <Weave/DeviceLayer/NetworkTelemetryManager.h>
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+#include <Weave/DeviceLayer/ThreadStackManager.h>
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+#include <Weave/Support/TraitEventUtils.h>
+#include <Weave/DeviceLayer/internal/ServiceTunnelAgent.h>
+#include <Weave/Profiles/weave-tunneling/WeaveTunnelAgent.h>
+#include <weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h>
+#endif
+
+using namespace nl::Weave::DeviceLayer;
+using namespace nl::Weave::DeviceLayer::Internal;
+
+WeaveTelemetryBase::WeaveTelemetryBase()
+{
+}
+
+void WeaveTelemetryBase::Init(uint32_t aIntervalMsec)
+{
+    SetPollingInterval(aIntervalMsec);
+    Enable();
+}
+
+void WeaveTelemetryBase::Enable(void)
+{
+    mEnabled = true;
+    StartPollingTimer();
+}
+
+void WeaveTelemetryBase::Disable(void)
+{
+    mEnabled = false;
+    StopPollingTimer();
+}
+
+void WeaveTelemetryBase::StartPollingTimer(void)
+{
+    SystemLayer.StartTimer(mInterval, sHandleTimer, this);
+}
+
+void WeaveTelemetryBase::StopPollingTimer(void)
+{
+    SystemLayer.CancelTimer(sHandleTimer, this);
+}
+
+void WeaveTelemetryBase::HandleTimer(void)
+{
+    GetTelemetryStatsAndLogEvent();
+
+    StartPollingTimer();
+}
+
+NetworkTelemetryManager::NetworkTelemetryManager(void)
+{
+}
+
+WEAVE_ERROR NetworkTelemetryManager::Init(void)
+{
+    WEAVE_ERROR err = WEAVE_NO_ERROR;
+
+    WeaveLogProgress(DeviceLayer, "Initiating Network Telemetry & Topology\n");
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+    mWiFiTelemetry.Init(WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS);
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+    mThreadTelemetry.Init(WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS);
+    mThreadTopology.Init(WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS);
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+    mTunnelTelemetry.Init(WEAVE_DEVICE_CONFIG_DEFAULT_TUNNEL_TELEMETRY_INTERVAL_MS);
+#endif
+
+    return err;
+}
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+void WiFiTelemetry::GetTelemetryStatsAndLogEvent(void)
+{
+    WEAVE_ERROR err;
+
+    err = ConnectivityMgr().GetAndLogWifiStatsCounters();
+    SuccessOrExit(err);
+
+exit:
+    return;
+}
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+void ThreadTelemetry::GetTelemetryStatsAndLogEvent(void)
+{
+    WEAVE_ERROR err;
+
+    err = ThreadStackMgr().GetAndLogThreadStatsCounters();
+    SuccessOrExit(err);
+
+exit:
+    return;
+}
+
+void ThreadTopology::GetTelemetryStatsAndLogEvent(void)
+{
+    WEAVE_ERROR err;
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL
+    err = ThreadStackMgr().GetAndLogThreadTopologyFull();
+    SuccessOrExit(err);
+#else
+    err = ThreadStackMgr().GetAndLogThreadTopologyMinimal();
+    SuccessOrExit(err);
+#endif
+
+exit:
+    return;
+}
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+void TunnelTelemetry::GetTelemetryStatsAndLogEvent(void)
+{
+    nl::Weave::Profiles::DataManagement_Current::event_id_t eventId;
+    nl::Weave::Profiles::WeaveTunnel::WeaveTunnelStatistics tunnelStats;
+    Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TelemetryTunnelStatsEvent statsEvent;
+
+    ServiceTunnelAgent.GetWeaveTunnelStatistics(tunnelStats);
+
+    statsEvent.txBytesToService       = tunnelStats.mPrimaryStats.mTxBytesToService;
+    statsEvent.rxBytesFromService     = tunnelStats.mPrimaryStats.mRxBytesFromService;
+    statsEvent.txMessagesToService    = tunnelStats.mPrimaryStats.mTxMessagesToService;
+    statsEvent.rxMessagesFromService  = tunnelStats.mPrimaryStats.mRxMessagesFromService;
+    statsEvent.tunnelDownCount        = tunnelStats.mPrimaryStats.mTunnelDownCount;
+    statsEvent.tunnelConnAttemptCount = tunnelStats.mPrimaryStats.mTunnelConnAttemptCount;
+
+    statsEvent.lastTimeTunnelWentDown    = tunnelStats.mPrimaryStats.mLastTimeTunnelWentDown;
+    statsEvent.lastTimeTunnelEstablished = tunnelStats.mPrimaryStats.mLastTimeTunnelEstablished;
+
+    statsEvent.droppedMessagesCount = tunnelStats.mDroppedMessagesCount;
+
+    switch (ServiceTunnelAgent.GetWeaveTunnelAgentState())
+    {
+    case nl::Weave::Profiles::WeaveTunnel::WeaveTunnelAgent::kState_Initialized_NoTunnel:
+        statsEvent.currentTunnelState = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_STATE_NO_TUNNEL;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::WeaveTunnelAgent::kState_PrimaryTunModeEstablished:
+        statsEvent.currentTunnelState = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_STATE_PRIMARY_ESTABLISHED;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::WeaveTunnelAgent::kState_BkupOnlyTunModeEstablished:
+        statsEvent.currentTunnelState =
+            Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_STATE_BACKUP_ONLY_ESTABLISHED;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::WeaveTunnelAgent::kState_PrimaryAndBkupTunModeEstablished:
+        statsEvent.currentTunnelState =
+            Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_STATE_PRIMARY_AND_BACKUP_ESTABLISHED;
+        break;
+    default:
+        break;
+    }
+
+    switch (tunnelStats.mCurrentActiveTunnel)
+    {
+    case nl::Weave::Profiles::WeaveTunnel::kType_TunnelUnknown:
+        statsEvent.currentActiveTunnel = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_TYPE_NONE;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::kType_TunnelPrimary:
+        statsEvent.currentActiveTunnel = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_TYPE_PRIMARY;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::kType_TunnelBackup:
+        statsEvent.currentActiveTunnel = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_TYPE_BACKUP;
+        break;
+    case nl::Weave::Profiles::WeaveTunnel::kType_TunnelShortcut:
+        statsEvent.currentActiveTunnel = Schema::Weave::Trait::Telemetry::Tunnel::TelemetryTunnelTrait::TUNNEL_TYPE_SHORTCUT;
+        break;
+    default:
+        break;
+    }
+
+    WeaveLogProgress(DeviceLayer,
+                     "Weave Tunnel Counters\n"
+                     "Tx Messages:                   %d\n"
+                     "Rx Messages:                   %d\n"
+                     "Tunnel Down Count:             %d\n"
+                     "Tunnel Conn Attempt Count:     %d\n"
+                     "Tunnel State:                  %d\n"
+                     "CurrentActiveTunnel:           %d\n",
+                     statsEvent.txMessagesToService, statsEvent.rxMessagesFromService, statsEvent.tunnelDownCount, statsEvent.tunnelConnAttemptCount,
+                     statsEvent.currentTunnelState, statsEvent.currentActiveTunnel);
+
+    WeaveLogProgress(DeviceLayer,
+                     "Weave Tunnel Time Stamps\n"
+                     "LastTime TunnelWentDown:       %" PRIu64 "\n"
+                     "LastTime TunnelEstablished:    %" PRIu64 "\n",
+                     statsEvent.lastTimeTunnelWentDown, statsEvent.lastTimeTunnelEstablished);
+
+    eventId = nl::LogEvent(&statsEvent);
+    WeaveLogProgress(DeviceLayer, "Weave Tunnel Tolopoly Stats Event Id: %u\n", eventId);
+
+    return;
+}
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_NETWORK_TELEMETRY
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/ConnectivityManager.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/ConnectivityManager.h
index 752aa92..26b38d0 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/ConnectivityManager.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/ConnectivityManager.h
@@ -110,6 +110,8 @@
     uint32_t GetWiFiAPIdleTimeoutMS(void);
     void SetWiFiAPIdleTimeoutMS(uint32_t val);
 
+    WEAVE_ERROR GetAndLogWifiStatsCounters(void);
+
     // Thread Methods
     ThreadMode GetThreadMode(void);
     WEAVE_ERROR SetThreadMode(ThreadMode val);
@@ -305,6 +307,11 @@
     static_cast<ImplClass*>(this)->_SetWiFiAPIdleTimeoutMS(val);
 }
 
+inline WEAVE_ERROR ConnectivityManager::GetAndLogWifiStatsCounters(void)
+{
+    return static_cast<ImplClass*>(this)->_GetAndLogWifiStatsCounters();
+}
+
 inline bool ConnectivityManager::HaveServiceConnectivityViaTunnel(void)
 {
     return static_cast<ImplClass*>(this)->_HaveServiceConnectivityViaTunnel();
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/ConnectivityManagerImpl.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/ConnectivityManagerImpl.h
index 27329ff..fa5218f 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/ConnectivityManagerImpl.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/ConnectivityManagerImpl.h
@@ -92,6 +92,7 @@
     void _MaintainOnDemandWiFiAP(void);
     uint32_t _GetWiFiAPIdleTimeoutMS(void);
     void _SetWiFiAPIdleTimeoutMS(uint32_t val);
+    WEAVE_ERROR _GetAndLogWifiStatsCounters(void);
     bool _HaveIPv4InternetConnectivity(void);
     bool _HaveIPv6InternetConnectivity(void);
     ServiceTunnelMode _GetServiceTunnelMode(void);
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/WeaveDevicePlatformConfig.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/WeaveDevicePlatformConfig.h
index e60f087..fb834e3 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/WeaveDevicePlatformConfig.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/ESP32/WeaveDevicePlatformConfig.h
@@ -69,5 +69,9 @@
 #define WEAVE_DEVICE_CONFIG_USE_TEST_PAIRING_CODE CONFIG_USE_TEST_PAIRING_CODE
 #define WEAVE_DEVICE_CONFIG_USE_TEST_SERIAL_NUMBER CONFIG_USE_TEST_SERIAL_NUMBER
 #define WEAVE_DEVICE_CONFIG_ENABLE_TRAIT_MANAGER CONFIG_ENABLE_TRAIT_MANAGER
+#define WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY CONFIG_ENABLE_WIFI_TELEMETRY
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY CONFIG_ENABLE_THREAD_TELEMETRY
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL CONFIG_ENABLE_THREAD_TELEMETRY_FULL
+#define WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY CONFIG_ENABLE_TUNNEL_TELEMETRY
 
 #endif // WEAVE_DEVICE_PLATFORM_CONFIG_H
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/NetworkTelemetryManager.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/NetworkTelemetryManager.h
new file mode 100644
index 0000000..f4f42bb
--- /dev/null
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/NetworkTelemetryManager.h
@@ -0,0 +1,150 @@
+/*
+ *
+ *    Copyright (c) 2019 Google LLC.
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ *    @file
+ *      Defines the Weave Device Layer Network Telemetry Manager object.
+ *
+ */
+
+#include <Weave/DeviceLayer/WeaveDeviceConfig.h>
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_NETWORK_TELEMETRY
+
+#ifndef NETWORK_TELEMETRY_MANAGER_H
+#define NETWORK_TELEMETRY_MANAGER_H
+
+namespace nl {
+namespace Weave {
+namespace DeviceLayer {
+namespace Internal {
+
+#include <SystemLayer/SystemLayer.h>
+
+/**
+ * This is a base class that handles network telemetry functions
+ * for different networks.
+ */
+class WeaveTelemetryBase
+{
+public:
+    WeaveTelemetryBase();
+
+    void Init(uint32_t aIntervalMsec);
+
+    void Enable(void);
+    void Disable(void);
+    bool IsEnabled(void) const;
+    void SetPollingInterval(uint32_t aIntervalMsec);
+    uint32_t GetPollingInterval(void) const;
+
+private:
+    void StartPollingTimer(void);
+    void StopPollingTimer(void);
+    void HandleTimer(void);
+    static void sHandleTimer(nl::Weave::System::Layer * aLayer, void * aAppState, WEAVE_ERROR aError);
+    virtual void GetTelemetryStatsAndLogEvent(void) = 0;
+
+private:
+    bool mEnabled;
+    uint32_t mInterval;
+};
+
+inline bool WeaveTelemetryBase::IsEnabled(void) const
+{
+    return mEnabled;
+}
+
+inline void WeaveTelemetryBase::SetPollingInterval(uint32_t aIntervalMsec)
+{
+    mInterval = aIntervalMsec;
+}
+
+inline uint32_t WeaveTelemetryBase::GetPollingInterval(void) const
+{
+    return mInterval;
+}
+
+inline void WeaveTelemetryBase::sHandleTimer(nl::Weave::System::Layer * aLayer, void * aAppState, WEAVE_ERROR aError)
+{
+    static_cast<WeaveTelemetryBase *>(aAppState)->HandleTimer();
+}
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+class WiFiTelemetry : public WeaveTelemetryBase
+{
+protected:
+    virtual void GetTelemetryStatsAndLogEvent(void);
+};
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+class ThreadTelemetry : public WeaveTelemetryBase
+{
+protected:
+    virtual void GetTelemetryStatsAndLogEvent(void);
+};
+
+class ThreadTopology : public WeaveTelemetryBase
+{
+protected:
+    virtual void GetTelemetryStatsAndLogEvent(void);
+};
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+class TunnelTelemetry : public WeaveTelemetryBase
+{
+protected:
+    virtual void GetTelemetryStatsAndLogEvent(void);
+};
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+
+
+class NetworkTelemetryManager
+{
+public:
+    NetworkTelemetryManager(void);
+
+    WEAVE_ERROR Init(void);
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+    WiFiTelemetry mWiFiTelemetry;
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+    ThreadTelemetry mThreadTelemetry;
+    ThreadTopology mThreadTopology;
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+    TunnelTelemetry mTunnelTelemetry;
+#endif
+};
+
+} // namespace Internal
+} // namespace DeviceLayer
+} // namespace Weave
+} // namespace nl
+
+#endif // NETWORK_TELEMETRY_MANAGER_H
+
+#endif // WEAVE_DEVICE_CONFIG_ENABLE_NETWORK_TELEMETRY
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.h
index dc1c7e6..1a74929 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.h
@@ -28,7 +28,6 @@
 
 #include <openthread/instance.h>
 
-
 namespace nl {
 namespace Weave {
 namespace DeviceLayer {
@@ -75,6 +74,9 @@
     WEAVE_ERROR _SetThreadProvision(const DeviceNetworkInfo & netInfo);
     void _ClearThreadProvision(void);
     bool _HaveMeshConnectivity(void);
+    WEAVE_ERROR _GetAndLogThreadStatsCounters(void);
+    WEAVE_ERROR _GetAndLogThreadTopologyMinimal(void);
+    WEAVE_ERROR _GetAndLogThreadTopologyFull(void);
 
     // ===== Members available to the implementation subclass.
 
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.ipp b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.ipp
index f1898f8..e787ef9 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.ipp
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread.ipp
@@ -32,14 +32,18 @@
 #include <Weave/Profiles/network-provisioning/NetworkProvisioning.h>
 #include <Weave/DeviceLayer/internal/DeviceNetworkInfo.h>
 #include <Weave/Support/crypto/WeaveRNG.h>
+#include <Weave/Support/TraitEventUtils.h>
+#include <nest/trait/network/TelemetryNetworkWpanTrait.h>
 
 #include <openthread/thread.h>
 #include <openthread/tasklet.h>
 #include <openthread/link.h>
 #include <openthread/dataset.h>
 #include <openthread/dataset_ftd.h>
+#include <openthread/thread_ftd.h>
 
 using namespace ::nl::Weave::Profiles::NetworkProvisioning;
+using namespace Schema::Nest::Trait::Network;
 
 extern "C" void otSysProcessDrivers(otInstance *aInstance);
 
@@ -395,6 +399,414 @@
 }
 
 template<class ImplClass>
+WEAVE_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_GetAndLogThreadStatsCounters(void)
+{
+    WEAVE_ERROR err = WEAVE_NO_ERROR;
+    otError otErr;
+    nl::Weave::Profiles::DataManagement_Current::event_id_t eventId;
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NetworkWpanStatsEvent counterEvent = { 0 };
+    const otMacCounters *macCounters;
+    const otIpCounters *ipCounters;
+    otOperationalDataset activeDataset;
+    otDeviceRole role;
+
+    Impl()->LockThreadStack();
+
+    // Get Mac Counters
+    macCounters = otLinkGetCounters(mOTInst);
+
+    // Rx Counters
+    counterEvent.phyRx                = macCounters->mRxTotal;
+    counterEvent.macUnicastRx         = macCounters->mRxUnicast;
+    counterEvent.macBroadcastRx       = macCounters->mRxBroadcast;
+    counterEvent.macRxData            = macCounters->mRxData;
+    counterEvent.macRxDataPoll        = macCounters->mRxDataPoll;
+    counterEvent.macRxBeacon          = macCounters->mRxBeacon;
+    counterEvent.macRxBeaconReq       = macCounters->mRxBeaconRequest;
+    counterEvent.macRxOtherPkt        = macCounters->mRxOther;
+    counterEvent.macRxFilterWhitelist = macCounters->mRxAddressFiltered;
+    counterEvent.macRxFilterDestAddr  = macCounters->mRxDestAddrFiltered;
+
+    // Tx Counters
+    counterEvent.phyTx          = macCounters->mTxTotal;
+    counterEvent.macUnicastTx   = macCounters->mTxUnicast;
+    counterEvent.macBroadcastTx = macCounters->mTxBroadcast;
+    counterEvent.macTxAckReq    = macCounters->mTxAckRequested;
+    counterEvent.macTxNoAckReq  = macCounters->mTxNoAckRequested;
+    counterEvent.macTxAcked     = macCounters->mTxAcked;
+    counterEvent.macTxData      = macCounters->mTxData;
+    counterEvent.macTxDataPoll  = macCounters->mTxDataPoll;
+    counterEvent.macTxBeacon    = macCounters->mTxBeacon;
+    counterEvent.macTxBeaconReq = macCounters->mTxBeaconRequest;
+    counterEvent.macTxOtherPkt  = macCounters->mTxOther;
+    counterEvent.macTxRetry     = macCounters->mTxRetry;
+
+    // Tx Error Counters
+    counterEvent.macTxFailCca = macCounters->mTxErrCca;
+
+    // Rx Error Counters
+    counterEvent.macRxFailDecrypt         = macCounters->mRxErrSec;
+    counterEvent.macRxFailNoFrame         = macCounters->mRxErrNoFrame;
+    counterEvent.macRxFailUnknownNeighbor = macCounters->mRxErrUnknownNeighbor;
+    counterEvent.macRxFailInvalidSrcAddr  = macCounters->mRxErrInvalidSrcAddr;
+    counterEvent.macRxFailFcs             = macCounters->mRxErrFcs;
+    counterEvent.macRxFailOther           = macCounters->mRxErrOther;
+
+    // Get Ip Counters
+    ipCounters = otThreadGetIp6Counters(mOTInst);
+
+    // Ip Counters
+    counterEvent.ipTxSuccess = ipCounters->mTxSuccess;
+    counterEvent.ipRxSuccess = ipCounters->mRxSuccess;
+    counterEvent.ipTxFailure = ipCounters->mTxFailure;
+    counterEvent.ipRxFailure = ipCounters->mRxFailure;
+
+    if (otDatasetIsCommissioned(mOTInst))
+    {
+        otErr = otDatasetGetActive(mOTInst, &activeDataset);
+        VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+        if (activeDataset.mComponents.mIsChannelPresent)
+        {
+            counterEvent.channel = activeDataset.mChannel;
+        }
+    }
+
+    role = otThreadGetDeviceRole(mOTInst);
+
+    switch (role)
+    {
+    case OT_DEVICE_ROLE_LEADER:
+        counterEvent.nodeType |= TelemetryNetworkWpanTrait::NODE_TYPE_LEADER;
+        // Intentional fall-through: if it's a leader, then it's also a router
+    case OT_DEVICE_ROLE_ROUTER:
+        counterEvent.nodeType |= TelemetryNetworkWpanTrait::NODE_TYPE_ROUTER;
+        break;
+    case OT_DEVICE_ROLE_CHILD:
+    case OT_DEVICE_ROLE_DISABLED:
+    case OT_DEVICE_ROLE_DETACHED:
+    default:
+        counterEvent.nodeType = 0;
+        break;
+    }
+
+    counterEvent.threadType = TelemetryNetworkWpanTrait::THREAD_TYPE_OPENTHREAD;
+
+    WeaveLogProgress(DeviceLayer,
+                     "Rx Counters:\n"
+                     "PHY Rx Total:                 %d\n"
+                     "MAC Rx Unicast:               %d\n"
+                     "MAC Rx Broadcast:             %d\n"
+                     "MAC Rx Data:                  %d\n"
+                     "MAC Rx Data Polls:            %d\n"
+                     "MAC Rx Beacons:               %d\n"
+                     "MAC Rx Beacon Reqs:           %d\n"
+                     "MAC Rx Other:                 %d\n"
+                     "MAC Rx Filtered Whitelist:    %d\n"
+                     "MAC Rx Filtered DestAddr:     %d\n",
+                     counterEvent.phyRx, counterEvent.macUnicastRx, counterEvent.macBroadcastRx, counterEvent.macRxData,
+                     counterEvent.macRxDataPoll, counterEvent.macRxBeacon, counterEvent.macRxBeaconReq, counterEvent.macRxOtherPkt,
+                     counterEvent.macRxFilterWhitelist, counterEvent.macRxFilterDestAddr);
+
+    WeaveLogProgress(DeviceLayer,
+                     "Tx Counters:\n"
+                     "PHY Tx Total:                 %d\n"
+                     "MAC Tx Unicast:               %d\n"
+                     "MAC Tx Broadcast:             %d\n"
+                     "MAC Tx Data:                  %d\n"
+                     "MAC Tx Data Polls:            %d\n"
+                     "MAC Tx Beacons:               %d\n"
+                     "MAC Tx Beacon Reqs:           %d\n"
+                     "MAC Tx Other:                 %d\n"
+                     "MAC Tx Retry:                 %d\n"
+                     "MAC Tx CCA Fail:              %d\n",
+                     counterEvent.phyTx, counterEvent.macUnicastTx, counterEvent.macBroadcastTx, counterEvent.macTxData,
+                     counterEvent.macTxDataPoll, counterEvent.macTxBeacon, counterEvent.macTxBeaconReq, counterEvent.macTxOtherPkt,
+                     counterEvent.macTxRetry, counterEvent.macTxFailCca);
+
+    WeaveLogProgress(DeviceLayer,
+                     "Failure Counters:\n"
+                     "MAC Rx Decrypt Fail:          %d\n"
+                     "MAC Rx No Frame Fail:         %d\n"
+                     "MAC Rx Unknown Neighbor Fail: %d\n"
+                     "MAC Rx Invalid Src Addr Fail: %d\n"
+                     "MAC Rx FCS Fail:              %d\n"
+                     "MAC Rx Other Fail:            %d\n",
+                     counterEvent.macRxFailDecrypt, counterEvent.macRxFailNoFrame, counterEvent.macRxFailUnknownNeighbor,
+                     counterEvent.macRxFailInvalidSrcAddr, counterEvent.macRxFailFcs, counterEvent.macRxFailOther);
+
+    eventId = nl::LogEvent(&counterEvent);
+    WeaveLogProgress(DeviceLayer, "OpenThread Telemetry Stats Event Id: %u\n", eventId);
+
+    Impl()->UnlockThreadStack();
+
+exit:
+    return err;
+}
+
+template<class ImplClass>
+WEAVE_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_GetAndLogThreadTopologyMinimal(void)
+{
+    WEAVE_ERROR err = WEAVE_NO_ERROR;
+    otError otErr;
+    nl::Weave::Profiles::DataManagement_Current::event_id_t eventId;
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NetworkWpanTopoMinimalEvent topologyEvent = { 0 };
+    const otExtAddress *extAddress;
+
+    Impl()->LockThreadStack();
+
+    topologyEvent.rloc16 = otThreadGetRloc16(mOTInst);
+
+    // Router ID is the top 6 bits of the RLOC
+    topologyEvent.routerId = (topologyEvent.rloc16 >> 10) & 0x3f;
+
+    topologyEvent.leaderRouterId = otThreadGetLeaderRouterId(mOTInst);
+
+    otErr = otThreadGetParentAverageRssi(mOTInst, &topologyEvent.parentAverageRssi);
+    VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+    otErr = otThreadGetParentLastRssi(mOTInst, &topologyEvent.parentLastRssi);
+    VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+    topologyEvent.partitionId = otThreadGetPartitionId(mOTInst);
+
+    extAddress = otLinkGetExtendedAddress(mOTInst);
+
+    topologyEvent.extAddress.mBuf = (uint8_t *)extAddress;
+    topologyEvent.extAddress.mLen = sizeof(otExtAddress);
+
+    topologyEvent.instantRssi = otPlatRadioGetRssi(mOTInst);
+
+    WeaveLogProgress(DeviceLayer,
+                     "Thread Topology:\n"
+                     "RLOC16:           %04X\n"
+                     "Router ID:        %u\n"
+                     "Leader Router ID: %u\n"
+                     "Parent Avg RSSI:  %d\n"
+                     "Parent Last RSSI: %d\n"
+                     "Partition ID:     %d\n"
+                     "Extended Address: %02X%02X:%02X%02X:%02X%02X:%02X%02X\n"
+                     "Instant RSSI:     %d\n",
+                     topologyEvent.rloc16, topologyEvent.routerId, topologyEvent.leaderRouterId, topologyEvent.parentAverageRssi,
+                     topologyEvent.parentLastRssi, topologyEvent.partitionId, topologyEvent.extAddress.mBuf[0], topologyEvent.extAddress.mBuf[1],
+                     topologyEvent.extAddress.mBuf[2], topologyEvent.extAddress.mBuf[3], topologyEvent.extAddress.mBuf[4],
+                     topologyEvent.extAddress.mBuf[5], topologyEvent.extAddress.mBuf[6], topologyEvent.extAddress.mBuf[7], topologyEvent.instantRssi);
+
+    eventId = nl::LogEvent(&topologyEvent);
+    WeaveLogProgress(DeviceLayer, "OpenThread Telemetry Stats Event Id: %u\n", eventId);
+
+    Impl()->UnlockThreadStack();
+
+exit:
+    if (err != WEAVE_NO_ERROR)
+    {
+        WeaveLogError(DeviceLayer, "GetAndLogThreadTopologyMinimul failed: %s", nl::ErrorStr(err));
+    }
+
+    return err;
+}
+
+#define TELEM_NEIGHBOR_TABLE_SIZE (64)
+#define TELEM_PRINT_BUFFER_SIZE (64)
+
+template<class ImplClass>
+WEAVE_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_GetAndLogThreadTopologyFull(void)
+{
+    WEAVE_ERROR err = WEAVE_NO_ERROR;
+    otError otErr;
+    nl::Weave::Profiles::DataManagement_Current::EventOptions neighborTopoOpts(true);
+    nl::Weave::Profiles::DataManagement_Current::event_id_t eventId;
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NetworkWpanTopoFullEvent fullTopoEvent = { 0 };
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::TopoEntryEvent neighborTopoEvent = { 0 };
+    otIp6Address * leaderAddr = NULL;
+    uint8_t * networkData = NULL;
+    uint8_t * stableNetworkData = NULL;
+    uint8_t networkDataLen = 0;
+    uint8_t stableNetworkDataLen = 0;
+    const otExtAddress * extAddress;
+    otNeighborInfo neighborInfo[TELEM_NEIGHBOR_TABLE_SIZE];
+    otNeighborInfoIterator iter;
+    otNeighborInfoIterator iterCopy;
+    char printBuf[TELEM_PRINT_BUFFER_SIZE];
+
+    Impl()->LockThreadStack();
+
+    fullTopoEvent.rloc16 = otThreadGetRloc16(mOTInst);
+
+    // Router ID is the top 6 bits of the RLOC
+    fullTopoEvent.routerId = (fullTopoEvent.rloc16 >> 10) & 0x3f;
+
+    fullTopoEvent.leaderRouterId = otThreadGetLeaderRouterId(mOTInst);
+
+    otErr = otThreadGetLeaderRloc(mOTInst, leaderAddr);
+    VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+    fullTopoEvent.leaderAddress.mBuf = leaderAddr->mFields.m8;
+    fullTopoEvent.leaderAddress.mLen = OT_IP6_ADDRESS_SIZE;
+
+    fullTopoEvent.leaderWeight = otThreadGetLeaderWeight(mOTInst);
+
+    fullTopoEvent.leaderLocalWeight = otThreadGetLocalLeaderWeight(mOTInst);
+
+    otErr = otNetDataGet(mOTInst, false, networkData, &networkDataLen);
+    VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+    fullTopoEvent.networkData.mBuf = networkData;
+    fullTopoEvent.networkData.mLen = networkDataLen;
+
+    fullTopoEvent.networkDataVersion = otNetDataGetVersion(mOTInst);
+
+    otErr = otNetDataGet(mOTInst, true, stableNetworkData, &stableNetworkDataLen);
+    VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+    fullTopoEvent.stableNetworkData.mBuf = stableNetworkData;
+    fullTopoEvent.stableNetworkData.mLen = stableNetworkDataLen;
+
+    fullTopoEvent.stableNetworkDataVersion = otNetDataGetStableVersion(mOTInst);
+
+    // Deprecated property
+    fullTopoEvent.preferredRouterId = -1;
+
+    extAddress = otLinkGetExtendedAddress(mOTInst);
+
+    fullTopoEvent.extAddress.mBuf = (uint8_t *)extAddress;
+    fullTopoEvent.extAddress.mLen = sizeof(otExtAddress);
+
+    fullTopoEvent.partitionId = otThreadGetPartitionId(mOTInst);
+
+    fullTopoEvent.instantRssi = otPlatRadioGetRssi(mOTInst);
+
+    iter = OT_NEIGHBOR_INFO_ITERATOR_INIT;
+    iterCopy = OT_NEIGHBOR_INFO_ITERATOR_INIT;
+    fullTopoEvent.neighborTableSize = 0;
+    fullTopoEvent.childTableSize = 0;
+
+    while (otThreadGetNextNeighborInfo(mOTInst, &iter, &neighborInfo[iter]) == OT_ERROR_NONE)
+    {
+        fullTopoEvent.neighborTableSize++;
+        if (neighborInfo[iterCopy].mIsChild)
+        {
+            fullTopoEvent.childTableSize++;
+        }
+        iterCopy = iter;
+    }
+
+    WeaveLogProgress(DeviceLayer,
+                     "Thread Topology:\n"
+                     "RLOC16:                %04X\n"
+                     "Router ID:             %u\n"
+                     "Leader Router ID:      %u\n"
+                     "Leader Address:        %02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X\n"
+                     "Leader Weight:         %d\n"
+                     "Local Leader Weight:   %d\n"
+                     "Network Data Len:      %d\n"
+                     "Network Data Version:  %d\n"
+                     "Extended Address:      %02X%02X:%02X%02X:%02X%02X:%02X%02X\n"
+                     "Partition ID:          %X\n"
+                     "Instant RSSI:          %d\n"
+                     "Neighbor Table Length: %d\n"
+                     "Child Table Length:    %d\n",
+                     fullTopoEvent.rloc16, fullTopoEvent.routerId, fullTopoEvent.leaderRouterId,
+                     fullTopoEvent.leaderAddress.mBuf[0], fullTopoEvent.leaderAddress.mBuf[1], fullTopoEvent.leaderAddress.mBuf[2], fullTopoEvent.leaderAddress.mBuf[3],
+                     fullTopoEvent.leaderAddress.mBuf[4], fullTopoEvent.leaderAddress.mBuf[5], fullTopoEvent.leaderAddress.mBuf[6], fullTopoEvent.leaderAddress.mBuf[7],
+                     fullTopoEvent.leaderAddress.mBuf[8], fullTopoEvent.leaderAddress.mBuf[9], fullTopoEvent.leaderAddress.mBuf[10], fullTopoEvent.leaderAddress.mBuf[11],
+                     fullTopoEvent.leaderAddress.mBuf[12], fullTopoEvent.leaderAddress.mBuf[13], fullTopoEvent.leaderAddress.mBuf[14], fullTopoEvent.leaderAddress.mBuf[15],
+                     fullTopoEvent.leaderWeight, fullTopoEvent.leaderLocalWeight, fullTopoEvent.networkData.mLen, fullTopoEvent.networkDataVersion,
+                     fullTopoEvent.extAddress.mBuf[0], fullTopoEvent.extAddress.mBuf[1], fullTopoEvent.extAddress.mBuf[2], fullTopoEvent.extAddress.mBuf[3],
+                     fullTopoEvent.extAddress.mBuf[4], fullTopoEvent.extAddress.mBuf[5], fullTopoEvent.extAddress.mBuf[6], fullTopoEvent.extAddress.mBuf[7],
+                     fullTopoEvent.partitionId, fullTopoEvent.instantRssi, fullTopoEvent.neighborTableSize, fullTopoEvent.childTableSize);
+
+    eventId = nl::LogEvent(&fullTopoEvent);
+    WeaveLogProgress(DeviceLayer, "OpenThread Full Topology Event Id: %u\n", eventId);
+
+    // Populate the neighbor event options.
+    // This way the neighbor topology entries are linked to the actual topology full event.
+    neighborTopoOpts.relatedEventID = eventId;
+    neighborTopoOpts.relatedImportance = TelemetryNetworkWpanTrait::NetworkWpanTopoFullEvent::Schema.mImportance;
+
+    // Handle each neighbor event seperatly.
+    for (uint32_t i = 0; i < fullTopoEvent.neighborTableSize; i++)
+    {
+        otNeighborInfo * neighbor           = &neighborInfo[i];
+
+        neighborTopoEvent.extAddress.mBuf   = neighbor->mExtAddress.m8;
+        neighborTopoEvent.extAddress.mLen   = sizeof(uint64_t);
+
+        neighborTopoEvent.rloc16            = neighbor->mRloc16;
+        neighborTopoEvent.linkQualityIn     = neighbor->mLinkQualityIn;
+        neighborTopoEvent.averageRssi       = neighbor->mAverageRssi;
+        neighborTopoEvent.age               = neighbor->mAge;
+        neighborTopoEvent.rxOnWhenIdle      = neighbor->mRxOnWhenIdle;
+        // TODO: not supported in old version of OpenThread used by Nordic SDK.
+        // neighborTopoEvent.fullFunction      = neighbor->mFullThreadDevice;
+        neighborTopoEvent.fullFunction      = false;
+        neighborTopoEvent.secureDataRequest = neighbor->mSecureDataRequest;
+        neighborTopoEvent.fullNetworkData   = neighbor->mFullNetworkData;
+        neighborTopoEvent.lastRssi          = neighbor->mLastRssi;
+        neighborTopoEvent.linkFrameCounter  = neighbor->mLinkFrameCounter;
+        neighborTopoEvent.mleFrameCounter   = neighbor->mMleFrameCounter;
+        neighborTopoEvent.isChild           = neighbor->mIsChild;
+
+        if (neighborTopoEvent.isChild)
+        {
+            otChildInfo * child =  NULL;
+            otErr = otThreadGetChildInfoById(mOTInst, neighborTopoEvent.rloc16, child);
+            VerifyOrExit(otErr == OT_ERROR_NONE, err = MapOpenThreadError(otErr));
+
+            neighborTopoEvent.timeout            = child->mTimeout;
+            neighborTopoEvent.networkDataVersion = child->mNetworkDataVersion;
+
+            neighborTopoEvent.SetTimeoutPresent();
+            neighborTopoEvent.SetNetworkDataVersionPresent();
+
+            snprintf(printBuf, TELEM_PRINT_BUFFER_SIZE, ", Timeout: %10lu NetworkDataVersion: %3d",
+                               neighborTopoEvent.timeout, neighborTopoEvent.networkDataVersion);
+        }
+        else
+        {
+            neighborTopoEvent.SetTimeoutNull();
+            neighborTopoEvent.SetNetworkDataVersionNull();
+
+            printBuf[0] = 0;
+        }
+
+        WeaveLogProgress(DeviceLayer,
+                         "TopoEntry[%u]:     %02X%02X:%02X%02X:%02X%02X:%02X%02X\n"
+                         "RLOC:              %04X\n"
+                         "Age:               %3d\n"
+                         "LQI:               %1d\n"
+                         "AvgRSSI:           %3d\n"
+                         "LastRSSI:          %3d\n"
+                         "LinkFrameCounter:  %10d\n"
+                         "MleFrameCounter:   %10d\n"
+                         "RxOnWhenIdle:      %c\n"
+                         "SecureDataRequest: %c\n"
+                         "FullFunction:      %c\n"
+                         "FullNetworkData:   %c\n"
+                         "IsChild:           %c%s\n",
+                         i, neighborTopoEvent.extAddress.mBuf[0], neighborTopoEvent.extAddress.mBuf[1], neighborTopoEvent.extAddress.mBuf[2],
+                         neighborTopoEvent.extAddress.mBuf[3], neighborTopoEvent.extAddress.mBuf[4], neighborTopoEvent.extAddress.mBuf[5],
+                         neighborTopoEvent.extAddress.mBuf[6], neighborTopoEvent.extAddress.mBuf[7], neighborTopoEvent.rloc16, neighborTopoEvent.age,
+                         neighborTopoEvent.linkQualityIn, neighborTopoEvent.averageRssi, neighborTopoEvent.lastRssi, neighborTopoEvent.linkFrameCounter,
+                         neighborTopoEvent.mleFrameCounter, neighborTopoEvent.rxOnWhenIdle ? 'Y' : 'n', neighborTopoEvent.secureDataRequest ? 'Y' : 'n',
+                         neighborTopoEvent.fullFunction ? 'Y' : 'n', neighborTopoEvent.fullNetworkData ? 'Y' : 'n',
+                         neighborTopoEvent.isChild ? 'Y' : 'n', printBuf);
+
+        eventId = nl::LogEvent(&neighborTopoEvent, neighborTopoOpts);
+        WeaveLogProgress(DeviceLayer, "OpenThread Neighbor TopoEntry[%u] Event Id: %ld\n", i, eventId);
+    }
+
+    Impl()->UnlockThreadStack();
+
+exit:
+    if (err != WEAVE_NO_ERROR)
+    {
+        WeaveLogError(DeviceLayer, "GetAndLogThreadTopologyFull failed: %s", nl::ErrorStr(err));
+    }
+    return err;
+}
+
+template<class ImplClass>
 WEAVE_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::DoInit(otInstance * otInst)
 {
     WEAVE_ERROR err = WEAVE_NO_ERROR;
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/ThreadStackManager.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/ThreadStackManager.h
index 2bf6ab8..8fdf3a5 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/ThreadStackManager.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/ThreadStackManager.h
@@ -63,6 +63,9 @@
     bool TryLockThreadStack(void);
     void UnlockThreadStack(void);
     bool HaveRouteToAddress(const IPAddress & destAddr);
+    WEAVE_ERROR GetAndLogThreadStatsCounters(void);
+    WEAVE_ERROR GetAndLogThreadTopologyMinimal(void);
+    WEAVE_ERROR GetAndLogThreadTopologyFull(void);
 
 private:
 
@@ -218,6 +221,21 @@
     return static_cast<ImplClass*>(this)->_HaveMeshConnectivity();
 }
 
+inline WEAVE_ERROR ThreadStackManager::GetAndLogThreadStatsCounters(void)
+{
+    return static_cast<ImplClass*>(this)->_GetAndLogThreadStatsCounters();
+}
+
+inline WEAVE_ERROR ThreadStackManager::GetAndLogThreadTopologyMinimal(void)
+{
+    return static_cast<ImplClass*>(this)->_GetAndLogThreadTopologyMinimal();
+}
+
+inline WEAVE_ERROR ThreadStackManager::GetAndLogThreadTopologyFull(void)
+{
+    return static_cast<ImplClass*>(this)->_GetAndLogThreadTopologyFull();
+}
+
 } // namespace DeviceLayer
 } // namespace Weave
 } // namespace nl
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/WeaveDeviceConfig.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/WeaveDeviceConfig.h
index 1459e06..b88a74f 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/WeaveDeviceConfig.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/WeaveDeviceConfig.h
@@ -569,5 +569,92 @@
 #define WEAVE_DEVICE_CONFIG_DISABLE_ACCOUNT_PAIRING 0
 #endif
 
+// -------------------- Network Telemetry Configuration --------------------
+
+/**
+ * @def WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+ *
+ * @brief
+ *   Enable automatically uploading Wi-Fi telemetry via trait on an interval.
+ */
+#ifndef WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY
+#define WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY (0)
+#endif
+
+/**
+ * @def WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+ *
+ * @brief
+ *   Enable automatically uploading minimal Thread telemetry and topology via trait on an interval.
+ */
+#ifndef WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY (0)
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY && !WEAVE_DEVICE_CONFIG_ENABLE_THREAD
+#error "If WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY set, then WEAVE_DEVICE_CONFIG_ENABLE_THREAD must also be set."
+#endif
+
+/**
+ * @def WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL
+ *
+ * @brief
+ *   Enable automatically uploading all Thread telemetry and topology via trait on an interval.
+ *   This is suitable for products that have router capability.
+ *
+ * @note
+ *   If set, WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY must also be set.
+ */
+#ifndef WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL (0)
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL && !WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY
+#error "If WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL set, then WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY must also be set."
+#endif
+
+/**
+ * @def WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+ *
+ * @brief
+ *   Enable automatically uploading Weave tunnel telemetry via trait on an interval.
+ */
+#ifndef WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY
+#define WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY (0)
+#endif
+
+#if WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY && !WEAVE_CONFIG_ENABLE_TUNNELING
+#error "If WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY set, then WEAVE_CONFIG_ENABLE_TUNNELING must also be set."
+#endif
+
+// Enable Network Telemetry feature if it is enabled for at lease one network.
+#define WEAVE_DEVICE_CONFIG_ENABLE_NETWORK_TELEMETRY  (WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY || \
+                                                       WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY || \
+                                                       WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY)
+
+/**
+ *  @def WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS
+ *
+ *  @brief
+ *    This sets the default interval at which network telemetry events
+ *    will be logged to Weave buffers. This can be overwritten at runtime
+ *    with a trait.
+ *
+ */
+#ifndef WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS
+#define WEAVE_DEVICE_CONFIG_DEFAULT_TELEMETRY_INTERVAL_MS 90000
+#endif
+
+/**
+ *  @def WEAVE_DEVICE_CONFIG_DEFAULT_TUNNEL_TELEMETRY_INTERVAL_MS
+ *
+ *  @brief
+ *    This sets the default interval at which Weave tunnel telemetry events
+ *    will be logged to Weave buffers.
+ *
+ */
+#ifndef WEAVE_DEVICE_CONFIG_DEFAULT_TUNNEL_TELEMETRY_INTERVAL_MS
+#define WEAVE_DEVICE_CONFIG_DEFAULT_TUNNEL_TELEMETRY_INTERVAL_MS 300000
+#endif
 
 #endif // WEAVE_DEVICE_CONFIG_H
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/internal/GenericConnectivityManagerImpl_NoWiFi.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/internal/GenericConnectivityManagerImpl_NoWiFi.h
index 09922fe..cd9c3b8 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/internal/GenericConnectivityManagerImpl_NoWiFi.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/internal/GenericConnectivityManagerImpl_NoWiFi.h
@@ -73,6 +73,7 @@
     void _MaintainOnDemandWiFiAP(void);
     uint32_t _GetWiFiAPIdleTimeoutMS(void);
     void _SetWiFiAPIdleTimeoutMS(uint32_t val);
+    WEAVE_ERROR _GetAndLogWifiStatsCounters(void);
     bool _CanStartWiFiScan();
     void _OnWiFiScanDone();
     void _OnWiFiStationProvisionChange();
@@ -182,6 +183,12 @@
 }
 
 template<class ImplClass>
+inline WEAVE_ERROR GenericConnectivityManagerImpl_NoWiFi<ImplClass>::_GetAndLogWifiStatsCounters(void)
+{
+    return WEAVE_ERROR_UNSUPPORTED_WEAVE_FEATURE;
+}
+
+template<class ImplClass>
 inline bool GenericConnectivityManagerImpl_NoWiFi<ImplClass>::_CanStartWiFiScan()
 {
     return false;
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/nRF5/WeaveDevicePlatformConfig.h b/src/adaptations/device-layer/include/Weave/DeviceLayer/nRF5/WeaveDevicePlatformConfig.h
index 3d6cec9..e79b6b5 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/nRF5/WeaveDevicePlatformConfig.h
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/nRF5/WeaveDevicePlatformConfig.h
@@ -78,4 +78,9 @@
 #define WEAVE_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE 8192
 #endif // WEAVE_DEVICE_CONFIG_THREAD_TASK_STACK_SIZE
 
+#define WEAVE_DEVICE_CONFIG_ENABLE_WIFI_TELEMETRY 0
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY 1
+#define WEAVE_DEVICE_CONFIG_ENABLE_THREAD_TELEMETRY_FULL 0
+#define WEAVE_DEVICE_CONFIG_ENABLE_TUNNEL_TELEMETRY 0
+
 #endif // WEAVE_DEVICE_PLATFORM_CONFIG_H
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
new file mode 100644
index 0000000..085cdc8
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp
@@ -0,0 +1,88 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_trait.proto
+ *
+ */
+
+#include <nest/trait/network/TelemetryNetworkTrait.h>
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkTrait {
+
+using namespace ::nl::Weave::Profiles::DataManagement;
+
+//
+// Property Table
+//
+
+const TraitSchemaEngine::PropertyInfo PropertyMap[] = {
+};
+
+//
+// Schema
+//
+
+const TraitSchemaEngine TraitSchema = {
+    {
+        kWeaveProfileId,
+        PropertyMap,
+        sizeof(PropertyMap) / sizeof(PropertyMap[0]),
+        1,
+#if (TDM_EXTENSION_SUPPORT) || (TDM_VERSIONING_SUPPORT)
+        2,
+#endif
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+#if (TDM_EXTENSION_SUPPORT)
+        NULL,
+#endif
+#if (TDM_VERSIONING_SUPPORT)
+        NULL,
+#endif
+    }
+};
+
+    //
+    // Events
+    //
+
+const nl::FieldDescriptor NetworkDHCPFailureEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkDHCPFailureEvent, reason), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 1
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkDHCPFailureEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkDHCPFailureEventFieldDescriptors)/sizeof(NetworkDHCPFailureEventFieldDescriptors[0]),
+    .mFields = NetworkDHCPFailureEventFieldDescriptors,
+    .mSize = sizeof(NetworkDHCPFailureEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkDHCPFailureEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x1,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 1,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+} // namespace TelemetryNetworkTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.h b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.h
new file mode 100644
index 0000000..b9bf340
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.h
@@ -0,0 +1,61 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp.h
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_trait.proto
+ *
+ */
+#ifndef _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_TRAIT_H_
+#define _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_TRAIT_H_
+
+#include <Weave/Profiles/data-management/DataManagement.h>
+#include <Weave/Support/SerializationUtils.h>
+
+
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkTrait {
+
+extern const nl::Weave::Profiles::DataManagement::TraitSchemaEngine TraitSchema;
+
+enum {
+      kWeaveProfileId = (0x235aU << 16) | 0x601U
+};
+
+//
+// Events
+//
+struct NetworkDHCPFailureEvent
+{
+    uint32_t reason;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x601U,
+        kEventTypeId = 0x1U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkDHCPFailureEvent_array {
+    uint32_t num;
+    NetworkDHCPFailureEvent *buf;
+};
+
+
+} // namespace TelemetryNetworkTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
+#endif // _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_TRAIT_H_
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
new file mode 100644
index 0000000..ec6d437
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp
@@ -0,0 +1,202 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_wifi_trait.proto
+ *
+ */
+
+#include <nest/trait/network/TelemetryNetworkWifiTrait.h>
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkWifiTrait {
+
+using namespace ::nl::Weave::Profiles::DataManagement;
+
+//
+// Property Table
+//
+
+const TraitSchemaEngine::PropertyInfo PropertyMap[] = {
+};
+
+//
+// Supported version
+//
+const ConstSchemaVersionRange traitVersion = { .mMinVersion = 1, .mMaxVersion = 2 };
+
+//
+// Schema
+//
+
+const TraitSchemaEngine TraitSchema = {
+    {
+        kWeaveProfileId,
+        PropertyMap,
+        sizeof(PropertyMap) / sizeof(PropertyMap[0]),
+        1,
+#if (TDM_EXTENSION_SUPPORT) || (TDM_VERSIONING_SUPPORT)
+        2,
+#endif
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+#if (TDM_EXTENSION_SUPPORT)
+        NULL,
+#endif
+#if (TDM_VERSIONING_SUPPORT)
+        &traitVersion,
+#endif
+    }
+};
+
+    //
+    // Events
+    //
+
+const nl::FieldDescriptor NetworkWiFiStatsEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, rssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 1
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, bcnRecvd), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, bcnLost), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 3
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, pktMcastRx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 4
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, pktUcastRx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 5
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, currRxRate), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 6
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, currTxRate), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 7
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, sleepTimePercent), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 8
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, bssid), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 9
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, freq), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 10
+    },
+
+    {
+        NULL, offsetof(NetworkWiFiStatsEvent, numOfAp), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 11
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWiFiStatsEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWiFiStatsEventFieldDescriptors)/sizeof(NetworkWiFiStatsEventFieldDescriptors[0]),
+    .mFields = NetworkWiFiStatsEventFieldDescriptors,
+    .mSize = sizeof(NetworkWiFiStatsEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWiFiStatsEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x1,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 2,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWiFiDeauthEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWiFiDeauthEvent, reason), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 1
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWiFiDeauthEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWiFiDeauthEventFieldDescriptors)/sizeof(NetworkWiFiDeauthEventFieldDescriptors[0]),
+    .mFields = NetworkWiFiDeauthEventFieldDescriptors,
+    .mSize = sizeof(NetworkWiFiDeauthEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWiFiDeauthEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x2,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 2,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWiFiInvalidKeyEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWiFiInvalidKeyEvent, reason), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 1
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWiFiInvalidKeyEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWiFiInvalidKeyEventFieldDescriptors)/sizeof(NetworkWiFiInvalidKeyEventFieldDescriptors[0]),
+    .mFields = NetworkWiFiInvalidKeyEventFieldDescriptors,
+    .mSize = sizeof(NetworkWiFiInvalidKeyEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWiFiInvalidKeyEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x3,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 2,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWiFiConnectionStatusChangeEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWiFiConnectionStatusChangeEvent, isConnected), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 1
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWiFiConnectionStatusChangeEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWiFiConnectionStatusChangeEventFieldDescriptors)/sizeof(NetworkWiFiConnectionStatusChangeEventFieldDescriptors[0]),
+    .mFields = NetworkWiFiConnectionStatusChangeEventFieldDescriptors,
+    .mSize = sizeof(NetworkWiFiConnectionStatusChangeEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWiFiConnectionStatusChangeEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x4,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 2,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+} // namespace TelemetryNetworkWifiTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h
new file mode 100644
index 0000000..278fece
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h
@@ -0,0 +1,134 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp.h
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_wifi_trait.proto
+ *
+ */
+#ifndef _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WIFI_TRAIT_H_
+#define _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WIFI_TRAIT_H_
+
+#include <Weave/Profiles/data-management/DataManagement.h>
+#include <Weave/Support/SerializationUtils.h>
+
+
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkWifiTrait {
+
+extern const nl::Weave::Profiles::DataManagement::TraitSchemaEngine TraitSchema;
+
+enum {
+      kWeaveProfileId = (0x235aU << 16) | 0x602U
+};
+
+//
+// Events
+//
+struct NetworkWiFiStatsEvent
+{
+    int8_t rssi;
+    uint32_t bcnRecvd;
+    uint32_t bcnLost;
+    uint32_t pktMcastRx;
+    uint32_t pktUcastRx;
+    uint32_t currRxRate;
+    uint32_t currTxRate;
+    uint8_t sleepTimePercent;
+    uint16_t bssid;
+    uint32_t freq;
+    uint32_t numOfAp;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x602U,
+        kEventTypeId = 0x1U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWiFiStatsEvent_array {
+    uint32_t num;
+    NetworkWiFiStatsEvent *buf;
+};
+
+
+struct NetworkWiFiDeauthEvent
+{
+    uint32_t reason;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x602U,
+        kEventTypeId = 0x2U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWiFiDeauthEvent_array {
+    uint32_t num;
+    NetworkWiFiDeauthEvent *buf;
+};
+
+
+struct NetworkWiFiInvalidKeyEvent
+{
+    uint32_t reason;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x602U,
+        kEventTypeId = 0x3U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWiFiInvalidKeyEvent_array {
+    uint32_t num;
+    NetworkWiFiInvalidKeyEvent *buf;
+};
+
+
+struct NetworkWiFiConnectionStatusChangeEvent
+{
+    bool isConnected;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x602U,
+        kEventTypeId = 0x4U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWiFiConnectionStatusChangeEvent_array {
+    uint32_t num;
+    NetworkWiFiConnectionStatusChangeEvent *buf;
+};
+
+
+} // namespace TelemetryNetworkWifiTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
+#endif // _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WIFI_TRAIT_H_
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
new file mode 100644
index 0000000..73e83e5
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp
@@ -0,0 +1,773 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_wpan_trait.proto
+ *
+ */
+
+#include <nest/trait/network/TelemetryNetworkWpanTrait.h>
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkWpanTrait {
+
+using namespace ::nl::Weave::Profiles::DataManagement;
+
+//
+// Property Table
+//
+
+const TraitSchemaEngine::PropertyInfo PropertyMap[] = {
+};
+
+//
+// Supported version
+//
+const ConstSchemaVersionRange traitVersion = { .mMinVersion = 1, .mMaxVersion = 3 };
+
+//
+// Schema
+//
+
+const TraitSchemaEngine TraitSchema = {
+    {
+        kWeaveProfileId,
+        PropertyMap,
+        sizeof(PropertyMap) / sizeof(PropertyMap[0]),
+        1,
+#if (TDM_EXTENSION_SUPPORT) || (TDM_VERSIONING_SUPPORT)
+        2,
+#endif
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+#if (TDM_EXTENSION_SUPPORT)
+        NULL,
+#endif
+#if (TDM_VERSIONING_SUPPORT)
+        &traitVersion,
+#endif
+    }
+};
+
+    //
+    // Events
+    //
+
+const nl::FieldDescriptor WpanParentLinkEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(WpanParentLinkEvent, rssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 1
+    },
+
+    {
+        NULL, offsetof(WpanParentLinkEvent, unicastCcaThresholdFailures), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 2
+    },
+
+    {
+        NULL, offsetof(WpanParentLinkEvent, unicastMacRetryCount), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 3
+    },
+
+};
+
+const nl::SchemaFieldDescriptor WpanParentLinkEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(WpanParentLinkEventFieldDescriptors)/sizeof(WpanParentLinkEventFieldDescriptors[0]),
+    .mFields = WpanParentLinkEventFieldDescriptors,
+    .mSize = sizeof(WpanParentLinkEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema WpanParentLinkEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x1,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWpanStatsEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, phyRx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 1
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, phyTx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 2
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macUnicastRx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 3
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macUnicastTx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 4
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macBroadcastRx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 5
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macBroadcastTx), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 6
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxAckReq), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 24
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxNoAckReq), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 25
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxAcked), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 26
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 27
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxDataPoll), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 28
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxBeacon), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 29
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxBeaconReq), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 30
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxOtherPkt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 31
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxRetry), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 32
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 33
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxDataPoll), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 34
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxBeacon), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 35
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxBeaconReq), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 36
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxOtherPkt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 37
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFilterWhitelist), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 38
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFilterDestAddr), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 39
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macTxFailCca), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 8
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailDecrypt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 12
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailNoFrame), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 20
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailUnknownNeighbor), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 21
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailInvalidSrcAddr), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 22
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailFcs), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 23
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macRxFailOther), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 40
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ipTxSuccess), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 41
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ipRxSuccess), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 42
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ipTxFailure), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 43
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ipRxFailure), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 44
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, nodeType), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 15
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, channel), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 16
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, radioTxPower), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 17
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, threadType), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 18
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ncpTxTotalTime), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 45
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, ncpRxTotalTime), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 46
+    },
+
+    {
+        NULL, offsetof(NetworkWpanStatsEvent, macCcaFailRate), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 47
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWpanStatsEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWpanStatsEventFieldDescriptors)/sizeof(NetworkWpanStatsEventFieldDescriptors[0]),
+    .mFields = NetworkWpanStatsEventFieldDescriptors,
+    .mSize = sizeof(NetworkWpanStatsEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWpanStatsEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x2,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWpanTopoMinimalEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, rloc16), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 1
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, routerId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 2
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, leaderRouterId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 3
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, parentAverageRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 4
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, parentLastRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 5
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, partitionId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 6
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, extAddress), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 7
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoMinimalEvent, instantRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 8
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWpanTopoMinimalEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWpanTopoMinimalEventFieldDescriptors)/sizeof(NetworkWpanTopoMinimalEventFieldDescriptors[0]),
+    .mFields = NetworkWpanTopoMinimalEventFieldDescriptors,
+    .mSize = sizeof(NetworkWpanTopoMinimalEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWpanTopoMinimalEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x3,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWpanTopoFullEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, rloc16), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 1
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, routerId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 2
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, leaderRouterId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 3
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, extAddress), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 15
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, leaderAddress), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 4
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, leaderWeight), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 5
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, leaderLocalWeight), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 6
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, networkData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 9
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, networkDataVersion), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 10
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, stableNetworkData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 11
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, stableNetworkDataVersion), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 12
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, preferredRouterId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 13
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, partitionId), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 14
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, deprecatedChildTable) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChildTableEntry_array, num), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeArray, 0), 7
+    },
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChildTableEntry::FieldSchema, offsetof(NetworkWpanTopoFullEvent, deprecatedChildTable) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChildTableEntry_array, buf), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 7
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, deprecatedNeighborTable) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NeighborTableEntry_array, num), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeArray, 0), 8
+    },
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NeighborTableEntry::FieldSchema, offsetof(NetworkWpanTopoFullEvent, deprecatedNeighborTable) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NeighborTableEntry_array, buf), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 8
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, childTableSize), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 16
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, neighborTableSize), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 17
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoFullEvent, instantRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 18
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWpanTopoFullEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWpanTopoFullEventFieldDescriptors)/sizeof(NetworkWpanTopoFullEventFieldDescriptors[0]),
+    .mFields = NetworkWpanTopoFullEventFieldDescriptors,
+    .mSize = sizeof(NetworkWpanTopoFullEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWpanTopoFullEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x4,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor TopoEntryEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(TopoEntryEvent, extAddress), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 1
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, rloc16), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 2
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, linkQualityIn), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 3
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, averageRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 4
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, age), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 5
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, rxOnWhenIdle), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 6
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, fullFunction), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 7
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, secureDataRequest), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 8
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, fullNetworkData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 9
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, lastRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 10
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, linkFrameCounter), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 11
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, mleFrameCounter), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 12
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, isChild), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 13
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, timeout), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 1), 14
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, networkDataVersion), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 1), 15
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, macFrameErrorRate), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 16
+    },
+
+    {
+        NULL, offsetof(TopoEntryEvent, ipMessageErrorRate), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 17
+    },
+
+};
+
+const nl::SchemaFieldDescriptor TopoEntryEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(TopoEntryEventFieldDescriptors)/sizeof(TopoEntryEventFieldDescriptors[0]),
+    .mFields = TopoEntryEventFieldDescriptors,
+    .mSize = sizeof(TopoEntryEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema TopoEntryEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x5,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor WpanChannelmonStatsEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(WpanChannelmonStatsEvent, channels) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChannelUtilization_array, num), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeArray, 0), 1
+    },
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChannelUtilization::FieldSchema, offsetof(WpanChannelmonStatsEvent, channels) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChannelUtilization_array, buf), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 1
+    },
+
+    {
+        NULL, offsetof(WpanChannelmonStatsEvent, samples), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+};
+
+const nl::SchemaFieldDescriptor WpanChannelmonStatsEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(WpanChannelmonStatsEventFieldDescriptors)/sizeof(WpanChannelmonStatsEventFieldDescriptors[0]),
+    .mFields = WpanChannelmonStatsEventFieldDescriptors,
+    .mSize = sizeof(WpanChannelmonStatsEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema WpanChannelmonStatsEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x6,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor WpanAntennaStatsEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(WpanAntennaStatsEvent, antennaStats) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::PerAntennaStats_array, num), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeArray, 0), 1
+    },
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::PerAntennaStats::FieldSchema, offsetof(WpanAntennaStatsEvent, antennaStats) + offsetof(Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::PerAntennaStats_array, buf), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 1
+    },
+
+    {
+        NULL, offsetof(WpanAntennaStatsEvent, antSwitchCnt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+};
+
+const nl::SchemaFieldDescriptor WpanAntennaStatsEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(WpanAntennaStatsEventFieldDescriptors)/sizeof(WpanAntennaStatsEventFieldDescriptors[0]),
+    .mFields = WpanAntennaStatsEventFieldDescriptors,
+    .mSize = sizeof(WpanAntennaStatsEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema WpanAntennaStatsEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x7,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+const nl::FieldDescriptor NetworkWpanTopoParentRespEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, rloc16), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 1
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, rssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 2
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, priority), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 3
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, extAddr), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 4
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, linkQuality3), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 5
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, linkQuality2), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 6
+    },
+
+    {
+        NULL, offsetof(NetworkWpanTopoParentRespEvent, linkQuality1), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 7
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NetworkWpanTopoParentRespEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NetworkWpanTopoParentRespEventFieldDescriptors)/sizeof(NetworkWpanTopoParentRespEventFieldDescriptors[0]),
+    .mFields = NetworkWpanTopoParentRespEventFieldDescriptors,
+    .mSize = sizeof(NetworkWpanTopoParentRespEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema NetworkWpanTopoParentRespEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x8,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 3,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+//
+// Event Structs
+//
+
+const nl::FieldDescriptor ChannelUtilizationFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(ChannelUtilization, channel), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 1
+    },
+
+    {
+        NULL, offsetof(ChannelUtilization, percentBusy), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 2
+    },
+
+};
+
+const nl::SchemaFieldDescriptor ChannelUtilization::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(ChannelUtilizationFieldDescriptors)/sizeof(ChannelUtilizationFieldDescriptors[0]),
+    .mFields = ChannelUtilizationFieldDescriptors,
+    .mSize = sizeof(ChannelUtilization)
+};
+
+
+const nl::FieldDescriptor PerAntennaStatsFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(PerAntennaStats, txSuccessCnt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 1
+    },
+
+    {
+        NULL, offsetof(PerAntennaStats, txFailCnt), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+    {
+        NULL, offsetof(PerAntennaStats, avgAckRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 3
+    },
+
+};
+
+const nl::SchemaFieldDescriptor PerAntennaStats::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(PerAntennaStatsFieldDescriptors)/sizeof(PerAntennaStatsFieldDescriptors[0]),
+    .mFields = PerAntennaStatsFieldDescriptors,
+    .mSize = sizeof(PerAntennaStats)
+};
+
+
+const nl::FieldDescriptor TopoEntryFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(TopoEntry, extAddress), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeByteString, 0), 1
+    },
+
+    {
+        NULL, offsetof(TopoEntry, rloc16), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt16, 0), 2
+    },
+
+    {
+        NULL, offsetof(TopoEntry, linkQualityIn), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 3
+    },
+
+    {
+        NULL, offsetof(TopoEntry, averageRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 4
+    },
+
+    {
+        NULL, offsetof(TopoEntry, age), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 5
+    },
+
+    {
+        NULL, offsetof(TopoEntry, rxOnWhenIdle), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 6
+    },
+
+    {
+        NULL, offsetof(TopoEntry, fullFunction), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 7
+    },
+
+    {
+        NULL, offsetof(TopoEntry, secureDataRequest), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 8
+    },
+
+    {
+        NULL, offsetof(TopoEntry, fullNetworkData), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 9
+    },
+
+    {
+        NULL, offsetof(TopoEntry, lastRssi), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt8, 0), 10
+    },
+
+};
+
+const nl::SchemaFieldDescriptor TopoEntry::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(TopoEntryFieldDescriptors)/sizeof(TopoEntryFieldDescriptors[0]),
+    .mFields = TopoEntryFieldDescriptors,
+    .mSize = sizeof(TopoEntry)
+};
+
+
+const nl::FieldDescriptor ChildTableEntryFieldDescriptors[] =
+{
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::TopoEntry::FieldSchema, offsetof(ChildTableEntry, topo), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 1
+    },
+
+    {
+        NULL, offsetof(ChildTableEntry, timeout), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+    {
+        NULL, offsetof(ChildTableEntry, networkDataVersion), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt8, 0), 3
+    },
+
+};
+
+const nl::SchemaFieldDescriptor ChildTableEntry::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(ChildTableEntryFieldDescriptors)/sizeof(ChildTableEntryFieldDescriptors[0]),
+    .mFields = ChildTableEntryFieldDescriptors,
+    .mSize = sizeof(ChildTableEntry)
+};
+
+
+const nl::FieldDescriptor NeighborTableEntryFieldDescriptors[] =
+{
+    {
+        &Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::TopoEntry::FieldSchema, offsetof(NeighborTableEntry, topo), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeStructure, 0), 1
+    },
+
+    {
+        NULL, offsetof(NeighborTableEntry, linkFrameCounter), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 2
+    },
+
+    {
+        NULL, offsetof(NeighborTableEntry, mleFrameCounter), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 3
+    },
+
+    {
+        NULL, offsetof(NeighborTableEntry, isChild), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeBoolean, 0), 4
+    },
+
+};
+
+const nl::SchemaFieldDescriptor NeighborTableEntry::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(NeighborTableEntryFieldDescriptors)/sizeof(NeighborTableEntryFieldDescriptors[0]),
+    .mFields = NeighborTableEntryFieldDescriptors,
+    .mSize = sizeof(NeighborTableEntry)
+};
+
+} // namespace TelemetryNetworkWpanTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
diff --git a/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h
new file mode 100644
index 0000000..6c5ce81
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h
@@ -0,0 +1,448 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp.h
+ *    SOURCE PROTO: nest/trait/network/telemetry_network_wpan_trait.proto
+ *
+ */
+#ifndef _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WPAN_TRAIT_H_
+#define _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WPAN_TRAIT_H_
+
+#include <Weave/Profiles/data-management/DataManagement.h>
+#include <Weave/Support/SerializationUtils.h>
+
+
+
+namespace Schema {
+namespace Nest {
+namespace Trait {
+namespace Network {
+namespace TelemetryNetworkWpanTrait {
+
+extern const nl::Weave::Profiles::DataManagement::TraitSchemaEngine TraitSchema;
+
+enum {
+      kWeaveProfileId = (0x235aU << 16) | 0x603U
+};
+
+//
+// Event Structs
+//
+
+struct ChannelUtilization
+{
+    uint8_t channel;
+    uint16_t percentBusy;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+};
+
+struct ChannelUtilization_array {
+    uint32_t num;
+    ChannelUtilization *buf;
+};
+
+struct PerAntennaStats
+{
+    uint32_t txSuccessCnt;
+    uint32_t txFailCnt;
+    int8_t avgAckRssi;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+};
+
+struct PerAntennaStats_array {
+    uint32_t num;
+    PerAntennaStats *buf;
+};
+
+struct TopoEntry
+{
+    nl::SerializedByteString extAddress;
+    uint16_t rloc16;
+    uint8_t linkQualityIn;
+    int8_t averageRssi;
+    uint32_t age;
+    bool rxOnWhenIdle;
+    bool fullFunction;
+    bool secureDataRequest;
+    bool fullNetworkData;
+    int8_t lastRssi;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+};
+
+struct TopoEntry_array {
+    uint32_t num;
+    TopoEntry *buf;
+};
+
+struct ChildTableEntry
+{
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::TopoEntry topo;
+    uint32_t timeout;
+    uint8_t networkDataVersion;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+};
+
+struct ChildTableEntry_array {
+    uint32_t num;
+    ChildTableEntry *buf;
+};
+
+struct NeighborTableEntry
+{
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::TopoEntry topo;
+    uint32_t linkFrameCounter;
+    uint32_t mleFrameCounter;
+    bool isChild;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+};
+
+struct NeighborTableEntry_array {
+    uint32_t num;
+    NeighborTableEntry *buf;
+};
+
+//
+// Events
+//
+struct WpanParentLinkEvent
+{
+    int8_t rssi;
+    uint16_t unicastCcaThresholdFailures;
+    uint16_t unicastMacRetryCount;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x1U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct WpanParentLinkEvent_array {
+    uint32_t num;
+    WpanParentLinkEvent *buf;
+};
+
+
+struct NetworkWpanStatsEvent
+{
+    int32_t phyRx;
+    int32_t phyTx;
+    int32_t macUnicastRx;
+    int32_t macUnicastTx;
+    int32_t macBroadcastRx;
+    int32_t macBroadcastTx;
+    int32_t macTxAckReq;
+    int32_t macTxNoAckReq;
+    int32_t macTxAcked;
+    int32_t macTxData;
+    int32_t macTxDataPoll;
+    int32_t macTxBeacon;
+    int32_t macTxBeaconReq;
+    int32_t macTxOtherPkt;
+    int32_t macTxRetry;
+    int32_t macRxData;
+    int32_t macRxDataPoll;
+    int32_t macRxBeacon;
+    int32_t macRxBeaconReq;
+    int32_t macRxOtherPkt;
+    int32_t macRxFilterWhitelist;
+    int32_t macRxFilterDestAddr;
+    int32_t macTxFailCca;
+    int32_t macRxFailDecrypt;
+    int32_t macRxFailNoFrame;
+    int32_t macRxFailUnknownNeighbor;
+    int32_t macRxFailInvalidSrcAddr;
+    int32_t macRxFailFcs;
+    int32_t macRxFailOther;
+    int32_t ipTxSuccess;
+    int32_t ipRxSuccess;
+    int32_t ipTxFailure;
+    int32_t ipRxFailure;
+    uint8_t nodeType;
+    uint8_t channel;
+    int8_t radioTxPower;
+    int32_t threadType;
+    uint32_t ncpTxTotalTime;
+    uint32_t ncpRxTotalTime;
+    uint16_t macCcaFailRate;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x2U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWpanStatsEvent_array {
+    uint32_t num;
+    NetworkWpanStatsEvent *buf;
+};
+
+
+struct NetworkWpanTopoMinimalEvent
+{
+    uint16_t rloc16;
+    uint8_t routerId;
+    uint8_t leaderRouterId;
+    int8_t parentAverageRssi;
+    int8_t parentLastRssi;
+    uint32_t partitionId;
+    nl::SerializedByteString extAddress;
+    int8_t instantRssi;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x3U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWpanTopoMinimalEvent_array {
+    uint32_t num;
+    NetworkWpanTopoMinimalEvent *buf;
+};
+
+
+struct NetworkWpanTopoFullEvent
+{
+    uint16_t rloc16;
+    uint8_t routerId;
+    uint8_t leaderRouterId;
+    nl::SerializedByteString extAddress;
+    nl::SerializedByteString leaderAddress;
+    uint8_t leaderWeight;
+    uint8_t leaderLocalWeight;
+    nl::SerializedByteString networkData;
+    uint8_t networkDataVersion;
+    nl::SerializedByteString stableNetworkData;
+    uint8_t stableNetworkDataVersion;
+    uint8_t preferredRouterId;
+    uint32_t partitionId;
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChildTableEntry_array deprecatedChildTable;
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::NeighborTableEntry_array deprecatedNeighborTable;
+    uint16_t childTableSize;
+    uint16_t neighborTableSize;
+    int8_t instantRssi;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x4U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWpanTopoFullEvent_array {
+    uint32_t num;
+    NetworkWpanTopoFullEvent *buf;
+};
+
+
+struct TopoEntryEvent
+{
+    nl::SerializedByteString extAddress;
+    uint16_t rloc16;
+    uint8_t linkQualityIn;
+    int8_t averageRssi;
+    uint32_t age;
+    bool rxOnWhenIdle;
+    bool fullFunction;
+    bool secureDataRequest;
+    bool fullNetworkData;
+    int8_t lastRssi;
+    uint32_t linkFrameCounter;
+    uint32_t mleFrameCounter;
+    bool isChild;
+    uint32_t timeout;
+    void SetTimeoutNull(void);
+    void SetTimeoutPresent(void);
+#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
+    bool IsTimeoutPresent(void);
+#endif
+    uint8_t networkDataVersion;
+    void SetNetworkDataVersionNull(void);
+    void SetNetworkDataVersionPresent(void);
+#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
+    bool IsNetworkDataVersionPresent(void);
+#endif
+    uint16_t macFrameErrorRate;
+    uint16_t ipMessageErrorRate;
+    uint8_t __nullified_fields__[2/8 + 1];
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x5U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct TopoEntryEvent_array {
+    uint32_t num;
+    TopoEntryEvent *buf;
+};
+
+inline void TopoEntryEvent::SetTimeoutNull(void)
+{
+    SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
+}
+
+inline void TopoEntryEvent::SetTimeoutPresent(void)
+{
+    CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
+}
+
+#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
+inline bool TopoEntryEvent::IsTimeoutPresent(void)
+{
+    return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0));
+}
+#endif
+inline void TopoEntryEvent::SetNetworkDataVersionNull(void)
+{
+    SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
+}
+
+inline void TopoEntryEvent::SetNetworkDataVersionPresent(void)
+{
+    CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
+}
+
+#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
+inline bool TopoEntryEvent::IsNetworkDataVersionPresent(void)
+{
+    return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1));
+}
+#endif
+
+struct WpanChannelmonStatsEvent
+{
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::ChannelUtilization_array channels;
+    uint32_t samples;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x6U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct WpanChannelmonStatsEvent_array {
+    uint32_t num;
+    WpanChannelmonStatsEvent *buf;
+};
+
+
+struct WpanAntennaStatsEvent
+{
+    Schema::Nest::Trait::Network::TelemetryNetworkWpanTrait::PerAntennaStats_array antennaStats;
+    uint32_t antSwitchCnt;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x7U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct WpanAntennaStatsEvent_array {
+    uint32_t num;
+    WpanAntennaStatsEvent *buf;
+};
+
+
+struct NetworkWpanTopoParentRespEvent
+{
+    uint16_t rloc16;
+    int8_t rssi;
+    int8_t priority;
+    nl::SerializedByteString extAddr;
+    uint8_t linkQuality3;
+    uint8_t linkQuality2;
+    uint8_t linkQuality1;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x235aU << 16) | 0x603U,
+        kEventTypeId = 0x8U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct NetworkWpanTopoParentRespEvent_array {
+    uint32_t num;
+    NetworkWpanTopoParentRespEvent *buf;
+};
+
+
+//
+// Enums
+//
+
+enum NodeType {
+    NODE_TYPE_ROUTER = 1,
+    NODE_TYPE_END = 2,
+    NODE_TYPE_SLEEPY_END = 3,
+    NODE_TYPE_MINIMAL_END = 4,
+    NODE_TYPE_OFFLINE = 5,
+    NODE_TYPE_DISABLED = 6,
+    NODE_TYPE_DETACHED = 7,
+    NODE_TYPE_NL_LURKER = 16,
+    NODE_TYPE_COMMISSIONER = 32,
+    NODE_TYPE_LEADER = 64,
+};
+
+enum ThreadType {
+    THREAD_TYPE_SILABS = 1,
+    THREAD_TYPE_OPENTHREAD = 2,
+};
+
+} // namespace TelemetryNetworkWpanTrait
+} // namespace Network
+} // namespace Trait
+} // namespace Nest
+} // namespace Schema
+#endif // _NEST_TRAIT_NETWORK__TELEMETRY_NETWORK_WPAN_TRAIT_H_
diff --git a/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp b/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
new file mode 100644
index 0000000..97a2774
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp
@@ -0,0 +1,130 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp
+ *    SOURCE PROTO: weave/trait/telemetry/tunnel/telemetry_tunnel_trait.proto
+ *
+ */
+
+#include <weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h>
+
+namespace Schema {
+namespace Weave {
+namespace Trait {
+namespace Telemetry {
+namespace Tunnel {
+namespace TelemetryTunnelTrait {
+
+using namespace ::nl::Weave::Profiles::DataManagement;
+
+//
+// Property Table
+//
+
+const TraitSchemaEngine::PropertyInfo PropertyMap[] = {
+};
+
+//
+// Schema
+//
+
+const TraitSchemaEngine TraitSchema = {
+    {
+        kWeaveProfileId,
+        PropertyMap,
+        sizeof(PropertyMap) / sizeof(PropertyMap[0]),
+        1,
+#if (TDM_EXTENSION_SUPPORT) || (TDM_VERSIONING_SUPPORT)
+        2,
+#endif
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+#if (TDM_EXTENSION_SUPPORT)
+        NULL,
+#endif
+#if (TDM_VERSIONING_SUPPORT)
+        NULL,
+#endif
+    }
+};
+
+    //
+    // Events
+    //
+
+const nl::FieldDescriptor TelemetryTunnelStatsEventFieldDescriptors[] =
+{
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, txBytesToService), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt64, 0), 1
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, rxBytesFromService), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt64, 0), 2
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, txMessagesToService), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 3
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, rxMessagesFromService), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 4
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, tunnelDownCount), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 5
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, tunnelConnAttemptCount), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 6
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, lastTimeTunnelWentDown), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt64, 0), 7
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, lastTimeTunnelEstablished), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt64, 0), 8
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, droppedMessagesCount), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeUInt32, 0), 9
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, currentTunnelState), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 10
+    },
+
+    {
+        NULL, offsetof(TelemetryTunnelStatsEvent, currentActiveTunnel), SET_TYPE_AND_FLAGS(nl::SerializedFieldTypeInt32, 0), 11
+    },
+
+};
+
+const nl::SchemaFieldDescriptor TelemetryTunnelStatsEvent::FieldSchema =
+{
+    .mNumFieldDescriptorElements = sizeof(TelemetryTunnelStatsEventFieldDescriptors)/sizeof(TelemetryTunnelStatsEventFieldDescriptors[0]),
+    .mFields = TelemetryTunnelStatsEventFieldDescriptors,
+    .mSize = sizeof(TelemetryTunnelStatsEvent)
+};
+const nl::Weave::Profiles::DataManagement::EventSchema TelemetryTunnelStatsEvent::Schema =
+{
+    .mProfileId = kWeaveProfileId,
+    .mStructureType = 0x1,
+    .mImportance = nl::Weave::Profiles::DataManagement::Debug,
+    .mDataSchemaVersion = 1,
+    .mMinCompatibleDataSchemaVersion = 1,
+};
+
+} // namespace TelemetryTunnelTrait
+} // namespace Tunnel
+} // namespace Telemetry
+} // namespace Trait
+} // namespace Weave
+} // namespace Schema
diff --git a/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h b/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h
new file mode 100644
index 0000000..20f137b
--- /dev/null
+++ b/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h
@@ -0,0 +1,91 @@
+
+/**
+ *    Copyright (c) 2019 Nest Labs, Inc.
+ *    All rights reserved.
+ *
+ *    THIS FILE IS GENERATED. DO NOT MODIFY.
+ *
+ *    SOURCE TEMPLATE: trait.cpp.h
+ *    SOURCE PROTO: weave/trait/telemetry/tunnel/telemetry_tunnel_trait.proto
+ *
+ */
+#ifndef _WEAVE_TRAIT_TELEMETRY_TUNNEL__TELEMETRY_TUNNEL_TRAIT_H_
+#define _WEAVE_TRAIT_TELEMETRY_TUNNEL__TELEMETRY_TUNNEL_TRAIT_H_
+
+#include <Weave/Profiles/data-management/DataManagement.h>
+#include <Weave/Support/SerializationUtils.h>
+
+
+
+namespace Schema {
+namespace Weave {
+namespace Trait {
+namespace Telemetry {
+namespace Tunnel {
+namespace TelemetryTunnelTrait {
+
+extern const nl::Weave::Profiles::DataManagement::TraitSchemaEngine TraitSchema;
+
+enum {
+      kWeaveProfileId = (0x0U << 16) | 0x1701U
+};
+
+//
+// Events
+//
+struct TelemetryTunnelStatsEvent
+{
+    uint64_t txBytesToService;
+    uint64_t rxBytesFromService;
+    uint32_t txMessagesToService;
+    uint32_t rxMessagesFromService;
+    uint32_t tunnelDownCount;
+    uint32_t tunnelConnAttemptCount;
+    int64_t lastTimeTunnelWentDown;
+    int64_t lastTimeTunnelEstablished;
+    uint32_t droppedMessagesCount;
+    int32_t currentTunnelState;
+    int32_t currentActiveTunnel;
+
+    static const nl::SchemaFieldDescriptor FieldSchema;
+
+    // Statically-known Event Struct Attributes:
+    enum {
+            kWeaveProfileId = (0x0U << 16) | 0x1701U,
+        kEventTypeId = 0x1U
+    };
+
+    static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
+};
+
+struct TelemetryTunnelStatsEvent_array {
+    uint32_t num;
+    TelemetryTunnelStatsEvent *buf;
+};
+
+
+//
+// Enums
+//
+
+enum TunnelType {
+    TUNNEL_TYPE_NONE = 1,
+    TUNNEL_TYPE_PRIMARY = 2,
+    TUNNEL_TYPE_BACKUP = 3,
+    TUNNEL_TYPE_SHORTCUT = 4,
+};
+
+enum TunnelState {
+    TUNNEL_STATE_NO_TUNNEL = 1,
+    TUNNEL_STATE_PRIMARY_ESTABLISHED = 2,
+    TUNNEL_STATE_BACKUP_ONLY_ESTABLISHED = 3,
+    TUNNEL_STATE_PRIMARY_AND_BACKUP_ESTABLISHED = 4,
+};
+
+} // namespace TelemetryTunnelTrait
+} // namespace Tunnel
+} // namespace Telemetry
+} // namespace Trait
+} // namespace Weave
+} // namespace Schema
+#endif // _WEAVE_TRAIT_TELEMETRY_TUNNEL__TELEMETRY_TUNNEL_TRAIT_H_
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 6802968..b6c5bf3 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -969,6 +969,7 @@
 $(nl_public_WeaveDeviceLayer_source_dirstem)/ConfigurationManager.h                   \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/ConnectivityManager.h                    \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/GeneralUtils.h                           \
+$(nl_public_WeaveDeviceLayer_source_dirstem)/NetworkTelemetryManager.h                \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/PlatformManager.h                        \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/ThreadStackManager.h                     \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/TimeSyncManager.h                        \
@@ -977,6 +978,10 @@
 $(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceError.h                       \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceEvent.h                       \
 $(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceLayer.h                       \
+$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkTrait.h     \
+$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h \
+$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h \
+$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h \
 $(NULL)
 
 nl_public_WeaveDeviceLayer_internal_header_sources =                                                \
diff --git a/src/include/Makefile.in b/src/include/Makefile.in
index 8388d2e..7a6b959 100644
--- a/src/include/Makefile.in
+++ b/src/include/Makefile.in
@@ -1346,6 +1346,7 @@
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/ConfigurationManager.h                   \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/ConnectivityManager.h                    \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/GeneralUtils.h                           \
+@CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/NetworkTelemetryManager.h                \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/PlatformManager.h                        \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/ThreadStackManager.h                     \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/TimeSyncManager.h                        \
@@ -1354,6 +1355,10 @@
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceError.h                       \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceEvent.h                       \
 @CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/WeaveDeviceLayer.h                       \
+@CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkTrait.h     \
+@CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkWifiTrait.h \
+@CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/nest/trait/network/TelemetryNetworkWpanTrait.h \
+@CONFIG_DEVICE_LAYER_TRUE@$(nl_public_WeaveDeviceLayer_source_dirstem)/../../../trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.h \
 @CONFIG_DEVICE_LAYER_TRUE@$(NULL)
 
 @CONFIG_DEVICE_LAYER_TRUE@nl_public_WeaveDeviceLayer_internal_header_sources = \