diff --git a/src/collectors/all.h b/src/collectors/all.h
index 2052bdf1c7..6892d131e5 100644
--- a/src/collectors/all.h
+++ b/src/collectors/all.h
@@ -56,7 +56,53 @@
 #define NETDATA_CHART_PRIO_SYSTEM_PACKETS              7001 // freebsd only
 #define NETDATA_CHART_PRIO_WINDOWS_THREADS             8001 // Windows only
 #define NETDATA_CHART_PRIO_WINDOWS_THERMAL_ZONES       8002 // Windows only
-#define NETDATA_CHART_PRIO_WINDOWS_HYPERV              9000 // Windows only
+
+// ----------------------------------------------------------------------------
+// Hyper-V
+
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE 20000
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE_BY_RUN_CONTEXT 20010
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL 20020
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL_GUEST_VISIBLE 20030
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PRESSURE_CURRENT 20040
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_PHYSICAL_PAGES_ALLOCATED 20050
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_REMOTE_PHYSICAL_PAGES 20060
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_TRAFFIC 20070
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_IPSEC_TRAFFIC 20080
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS 20090
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_BROADCAST_PACKETS 20100
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_MULTICAST_PACKETS 20110
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_DIRECTED_PACKETS 20120
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS_DROPPED 20130
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_BYTES 20140
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_ERRORS 20150
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_OPERATIONS 20160
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VMS_HEALTH 20170
+
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_TRAFFIC 20400
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS 20410
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_BROADCAST_PACKETS 20420
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_MULTICAST_PACKETS 20430
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DIRECTED_PACKETS 20440
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS_FLOODED 20450
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DROPPED_PACKETS 20460
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_EXTENSIONS_DROPPED_PACKETS 20470
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_LEARNED_MAC_ADDRESSES 20470
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PURGED_MAC_ADDRESSES 20480
+
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_IO_TLB_FLUSH 20600
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_FLUSH_ENTRIES 20610
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_PAGES 20620
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ADDRESS_SPACE 20630
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ATTACHED_DEVICES 20640
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_DMA_ERRORS 20650
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_ERRORS 20660
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_THROTTLE_EVENTS 20670
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEPOSITED_PAGES 20680
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_PAGES 20690
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_SPACE_PAGES 20700
+#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_MODIFICATIONS 20710
+// ----------------------------------------------------------------------------
 
 // CPU per core
 
diff --git a/src/collectors/windows.plugin/perflib-hyperv.c b/src/collectors/windows.plugin/perflib-hyperv.c
index e890a8f397..5233619953 100644
--- a/src/collectors/windows.plugin/perflib-hyperv.c
+++ b/src/collectors/windows.plugin/perflib-hyperv.c
@@ -9,8 +9,6 @@
 
 #define HYPERV  "hyperv"
 
-static long chart_priority = NETDATA_CHART_PRIO_WINDOWS_HYPERV;
-
 static void get_and_sanitize_instance_value(
     PERF_DATA_BLOCK *pDataBlock,
     PERF_OBJECT_TYPE *pObjectType,
@@ -19,7 +17,7 @@ static void get_and_sanitize_instance_value(
     size_t buffer_size)
 {
     // char wstr[8192];
-    if (!getInstanceName(pDataBlock, pObjectType, pi, buffer, sizeof(buffer_size))) {
+    if (!getInstanceName(pDataBlock, pObjectType, pi, buffer, buffer_size)) {
         strncpyz(buffer, "[unknown]", buffer_size - 1);
         // return;
     }
@@ -153,7 +151,7 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                     "bytes",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL,
                     update_every,
                     RRDSET_TYPE_LINE);
 
@@ -167,7 +165,7 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                     "bytes",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL_GUEST_VISIBLE,
                     update_every,
                     RRDSET_TYPE_LINE);
 
@@ -181,14 +179,14 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                     "percentage",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PRESSURE_CURRENT,
                     update_every,
                     RRDSET_TYPE_LINE);
 
-                p->rd_CurrentPressure = rrddim_add(p->st_pressure, "pressure", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
-                p->rd_PhysicalMemory = rrddim_add(p->st_vm_memory_physical, "assigned_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
-                p->rd_GuestVisiblePhysicalMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "visible_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
-                p->rd_GuestAvailableMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "available_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
+                p->rd_CurrentPressure = rrddim_add(p->st_pressure, "pressure", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+                p->rd_PhysicalMemory = rrddim_add(p->st_vm_memory_physical, "assigned", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
+                p->rd_GuestVisiblePhysicalMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "visible", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
+                p->rd_GuestAvailableMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "available", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE);
 
                 rrdlabels_add(p->st_vm_memory_physical->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
                 rrdlabels_add(p->st_pressure->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
@@ -250,7 +248,7 @@ static bool do_hyperv_vid_partition(PERF_DATA_BLOCK *pDataBlock, int update_ever
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_PHYSICAL_PAGES_ALLOCATED,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -264,7 +262,7 @@ static bool do_hyperv_vid_partition(PERF_DATA_BLOCK *pDataBlock, int update_ever
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_REMOTE_PHYSICAL_PAGES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -329,14 +327,12 @@ static bool do_hyperv_health_summary(PERF_DATA_BLOCK *pDataBlock, int update_eve
             "vms",
             _COMMON_PLUGIN_NAME,
             _COMMON_PLUGIN_MODULE_NAME,
-            chart_priority++,
+            NETDATA_CHART_PRIO_WINDOWS_HYPERV_VMS_HEALTH,
             update_every,
             RRDSET_TYPE_STACKED);
 
         p->rd_HealthCritical = rrddim_add(p->st_health, "critical", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
         p->rd_HealthOk = rrddim_add(p->st_health, "ok", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-
-        rrdlabels_add(p->st_health->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
     }
 
     SETP_DIM_VALUE(st_health, HealthCritical);
@@ -490,14 +486,13 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_SPACE_PAGES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_DeviceSpacePages4K = rrddim_add(p->st_device_space_pages, "4K", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
             p->rd_DeviceSpacePages2M = rrddim_add(p->st_device_space_pages, "2M", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
             p->rd_DeviceSpacePages1G = rrddim_add(p->st_device_space_pages, "1G", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_device_space_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_gpa_space_pages = rrdset_create_localhost(
                 "root_partition_gpa_space_pages",
@@ -509,14 +504,13 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_PAGES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_GPASpacePages4K = rrddim_add(p->st_gpa_space_pages, "4K", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
             p->rd_GPASpacePages2M = rrddim_add(p->st_gpa_space_pages, "2M", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
             p->rd_GPASpacePages1G = rrddim_add(p->st_gpa_space_pages, "1G", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_gpa_space_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_gpa_space_modifications = rrdset_create_localhost(
                 "root_partition_gpa_space_modifications",
@@ -528,13 +522,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "modifications/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_MODIFICATIONS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_GPASpaceModifications =
                 rrddim_add(p->st_gpa_space_modifications, "gpa", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_gpa_space_modifications->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_attached_devices = rrdset_create_localhost(
                 "root_partition_attached_devices",
@@ -546,12 +539,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "devices",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ATTACHED_DEVICES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_AttachedDevices = rrddim_add(p->st_attached_devices, "attached", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_attached_devices->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_deposited_pages = rrdset_create_localhost(
                 "root_partition_deposited_pages",
@@ -563,12 +555,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEPOSITED_PAGES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_DepositedPages = rrddim_add(p->st_deposited_pages, "gpa", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_deposited_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_DeviceDMAErrors = rrdset_create_localhost(
                 "root_partition_device_dma_errors",
@@ -580,13 +571,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "requests",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_DMA_ERRORS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_DeviceDMAErrors =
                 rrddim_add(p->st_DeviceDMAErrors, "illegal_dma", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_DeviceDMAErrors->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_DeviceInterruptErrors = rrdset_create_localhost(
                 "root_partition_device_interrupt_errors",
@@ -598,13 +588,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "requests",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_ERRORS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_DeviceInterruptErrors =
                 rrddim_add(p->st_DeviceInterruptErrors, "illegal_interrupt", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_DeviceInterruptErrors->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_DeviceInterruptThrottleEvents = rrdset_create_localhost(
                 "root_partition_device_interrupt_throttle_events",
@@ -616,14 +605,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "events",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_THROTTLE_EVENTS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_DeviceInterruptThrottleEvents =
                 rrddim_add(p->st_DeviceInterruptThrottleEvents, "throttling", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(
-                p->st_DeviceInterruptThrottleEvents->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_IOΤLBFlushesSec = rrdset_create_localhost(
                 "root_partition_io_tlb_flush",
@@ -635,12 +622,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "flushes/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_IO_TLB_FLUSH,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_IOΤLBFlushesSec = rrddim_add(p->st_IOΤLBFlushesSec, "gpa", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
-            rrdlabels_add(p->st_IOΤLBFlushesSec->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_AddressSpaces = rrdset_create_localhost(
                 "root_partition_address_space",
@@ -652,12 +638,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "address spaces",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ADDRESS_SPACE,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_AddressSpaces = rrddim_add(p->st_AddressSpaces, "address_spaces", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_AddressSpaces->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_VirtualTLBPages = rrdset_create_localhost(
                 "root_partition_virtual_tlb_pages",
@@ -669,12 +654,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "pages",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_PAGES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_VirtualTLBPages = rrddim_add(p->st_VirtualTLBPages, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
-            rrdlabels_add(p->st_VirtualTLBPages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_VirtualTLBFlushEntiresSec = rrdset_create_localhost(
                 "root_partition_virtual_tlb_flush_entries",
@@ -686,13 +670,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve
                 "flushes/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_FLUSH_ENTRIES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
             p->rd_VirtualTLBFlushEntiresSec =
                 rrddim_add(p->st_VirtualTLBFlushEntiresSec, "flushes", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
-            rrdlabels_add(p->st_VirtualTLBFlushEntiresSec->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
         }
 
         // Set the data for each dimension
@@ -822,10 +805,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve
                     HYPERV,
                     HYPERV".vm_storage_device_operations",
                     "VM storage device IOPS",
-                    "operations/sec",
+                    "operations/s",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_OPERATIONS,
                     update_every,
                     RRDSET_TYPE_LINE);
 
@@ -843,10 +826,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve
                     HYPERV,
                     HYPERV".vm_storage_device_bytes",
                     "VM storage device IO",
-                    "bytes/sec",
+                    "bytes/s",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_BYTES,
                     update_every,
                     RRDSET_TYPE_AREA);
 
@@ -864,10 +847,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve
                     HYPERV,
                     HYPERV".vm_storage_device_errors",
                     "VM storage device errors",
-                    "errors/sec",
+                    "errors/s",
                     _COMMON_PLUGIN_NAME,
                     _COMMON_PLUGIN_MODULE_NAME,
-                    chart_priority++,
+                    NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_ERRORS,
                     update_every,
                     RRDSET_TYPE_LINE);
 
@@ -1050,21 +1033,21 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
             p->charts_created =  true;
 
             p->st_bytes = rrdset_create_localhost(
-                "vswitch_bytes",
+                "vswitch_traffic",
                 windows_shared_buffer,
                 NULL,
                 HYPERV,
-                HYPERV ".vswitch_bytes",
+                HYPERV ".vswitch_traffic",
                 "Virtual switch traffic",
-                "bytes/sec",
+                "kilobits/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_TRAFFIC,
                 update_every,
-                RRDSET_TYPE_LINE);
+                RRDSET_TYPE_AREA);
 
-            p->rd_BytesReceivedSec = rrddim_add(p->st_bytes, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
-            p->rd_BytesSentSec = rrddim_add(p->st_bytes, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_BytesReceivedSec = rrddim_add(p->st_bytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_BytesSentSec = rrddim_add(p->st_bytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL);
             rrdlabels_add(p->st_bytes->rrdlabels, "vswitch", windows_shared_buffer, RRDLABEL_SRC_AUTO);
 
             p->st_packets = rrdset_create_localhost(
@@ -1074,10 +1057,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_packets",
                 "Virtual switch packets",
-                "packets/sec",
+                "packets/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1092,10 +1075,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_directed_packets",
                 "Virtual switch directed packets",
-                "packets/sec",
+                "packets/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DIRECTED_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1112,10 +1095,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_broadcast_packets",
                 "Virtual switch broadcast packets",
-                "packets/sec",
+                "packets/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_BROADCAST_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1132,10 +1115,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_multicast_packets",
                 "Virtual switch multicast packets",
-                "packets/sec",
+                "packets/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_MULTICAST_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1152,10 +1135,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_dropped_packets",
                 "Virtual switch dropped packets",
-                "drops/sec",
+                "drops/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DROPPED_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1172,10 +1155,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_extensions_dropped_packets",
                 "Virtual switch extensions dropped packets",
-                "drops/sec",
+                "drops/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_EXTENSIONS_DROPPED_PACKETS,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1192,10 +1175,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_packets_flooded",
                 "Virtual switch flooded packets",
-                "packets/sec",
+                "packets/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS_FLOODED,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1209,10 +1192,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_learned_mac_addresses",
                 "Virtual switch learned MAC addresses",
-                "mac addresses/sec",
+                "mac addresses/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_LEARNED_MAC_ADDRESSES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1226,10 +1209,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
                 HYPERV,
                 HYPERV ".vswitch_purged_mac_addresses",
                 "Virtual switch purged MAC addresses",
-                "mac addresses/sec",
+                "mac addresses/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PURGED_MAC_ADDRESSES,
                 update_every,
                 RRDSET_TYPE_LINE);
 
@@ -1279,17 +1262,58 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void
     return true;
 }
 
-
 struct hypervisor_network_adapter {
     bool collected_metadata;
     bool charts_created;
 
-    RRDSET *st_packets;
+    RRDSET *st_dropped_packets;
     DEFINE_RD(DroppedPacketsOutgoingSec);
     DEFINE_RD(DroppedPacketsIncomingSec);
 
+    RRDSET *st_send_receive_packets;
+    DEFINE_RD(PacketsSentSec);
+    DEFINE_RD(PacketsReceivedSec);
+
+    RRDSET *st_send_receive_bytes;
+    DEFINE_RD(BytesSentSec);
+    DEFINE_RD(BytesReceivedSec);
+
+    RRDSET *st_IPsecoffloadBytes;
+    DEFINE_RD(IPsecoffloadBytesReceivedSec);
+    DEFINE_RD(IPsecoffloadBytesSentSec);
+
+    RRDSET *st_DirectedPackets;
+    DEFINE_RD(DirectedPacketsSentSec);
+    DEFINE_RD(DirectedPacketsReceivedSec);
+
+    RRDSET *st_BroadcastPackets;
+    DEFINE_RD(BroadcastPacketsSentSec);
+    DEFINE_RD(BroadcastPacketsReceivedSec);
+
+    RRDSET *st_MulticastPackets;
+    DEFINE_RD(MulticastPacketsSentSec);
+    DEFINE_RD(MulticastPacketsReceivedSec);
+
     COUNTER_DATA DroppedPacketsOutgoingSec;
     COUNTER_DATA DroppedPacketsIncomingSec;
+
+    COUNTER_DATA PacketsSentSec;
+    COUNTER_DATA PacketsReceivedSec;
+
+    COUNTER_DATA BytesSentSec;
+    COUNTER_DATA BytesReceivedSec;
+
+    COUNTER_DATA IPsecoffloadBytesReceivedSec;
+    COUNTER_DATA IPsecoffloadBytesSentSec;
+
+    COUNTER_DATA DirectedPacketsSentSec;
+    COUNTER_DATA DirectedPacketsReceivedSec;
+
+    COUNTER_DATA BroadcastPacketsSentSec;
+    COUNTER_DATA BroadcastPacketsReceivedSec;
+
+    COUNTER_DATA MulticastPacketsSentSec;
+    COUNTER_DATA MulticastPacketsReceivedSec;
 };
 
 // Initialize the keys for the root partition metrics
@@ -1297,6 +1321,21 @@ void initialize_hyperv_network_adapter_keys(struct hypervisor_network_adapter *p
 {
     p->DroppedPacketsOutgoingSec.key = "Dropped Packets Outgoing/sec";
     p->DroppedPacketsIncomingSec.key = "Dropped Packets Incoming/sec";
+
+    p->PacketsSentSec.key = "Packets Sent/sec";
+    p->PacketsReceivedSec.key = "Packets Received/sec";
+
+    p->BytesSentSec.key = "Bytes Sent/sec";
+    p->BytesReceivedSec.key = "Bytes Received/sec";
+
+    p->IPsecoffloadBytesReceivedSec.key = "IPsec offload Bytes Receive/sec";
+    p->IPsecoffloadBytesSentSec.key =     "IPsec offload Bytes Sent/sec";
+    p->DirectedPacketsSentSec.key =       "Directed Packets Sent/sec";
+    p->DirectedPacketsReceivedSec.key =   "Directed Packets Received/sec";
+    p->BroadcastPacketsSentSec.key =      "Broadcast Packets Sent/sec";
+    p->BroadcastPacketsReceivedSec.key =  "Broadcast Packets Received/sec";
+    p->MulticastPacketsSentSec.key =      "Multicast Packets Sent/sec";
+    p->MulticastPacketsReceivedSec.key =  "Multicast Packets Received/sec";
 }
 
 void dict_hyperv_network_adapter_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
@@ -1333,32 +1372,197 @@ static bool do_hyperv_network_adapter(PERF_DATA_BLOCK *pDataBlock, int update_ev
         GET_INSTANCE_COUNTER(DroppedPacketsIncomingSec);
         GET_INSTANCE_COUNTER(DroppedPacketsOutgoingSec);
 
+        GET_INSTANCE_COUNTER(PacketsReceivedSec);
+        GET_INSTANCE_COUNTER(PacketsSentSec);
+
+        GET_INSTANCE_COUNTER(BytesReceivedSec);
+        GET_INSTANCE_COUNTER(BytesSentSec);
+
+        GET_INSTANCE_COUNTER(IPsecoffloadBytesReceivedSec);
+        GET_INSTANCE_COUNTER(IPsecoffloadBytesSentSec);
+
+        GET_INSTANCE_COUNTER(DirectedPacketsSentSec);
+        GET_INSTANCE_COUNTER(DirectedPacketsReceivedSec);
+
+        GET_INSTANCE_COUNTER(BroadcastPacketsSentSec);
+        GET_INSTANCE_COUNTER(BroadcastPacketsReceivedSec);
+
+        GET_INSTANCE_COUNTER(MulticastPacketsSentSec);
+        GET_INSTANCE_COUNTER(MulticastPacketsReceivedSec);
+
         if (!p->charts_created) {
             p->charts_created = true;
-            p->st_packets = rrdset_create_localhost(
+            p->st_dropped_packets = rrdset_create_localhost(
                 "vm_net_interface_packets_dropped",
                 windows_shared_buffer,
                 NULL,
                 HYPERV,
                 HYPERV".vm_net_interface_packets_dropped",
                 "VM interface packets dropped",
-                "drops/sec",
+                "drops/s",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS_DROPPED,
                 update_every,
                 RRDSET_TYPE_LINE);
 
-            p->rd_DroppedPacketsIncomingSec = rrddim_add(p->st_packets, "incoming", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
-            p->rd_DroppedPacketsOutgoingSec = rrddim_add(p->st_packets, "outgoing", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_DroppedPacketsIncomingSec = rrddim_add(p->st_dropped_packets, "incoming", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_DroppedPacketsOutgoingSec = rrddim_add(p->st_dropped_packets, "outgoing", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+
+            rrdlabels_add(p->st_dropped_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_send_receive_packets = rrdset_create_localhost(
+                "vm_net_interface_packets",
+                windows_shared_buffer,
+                NULL,
+                HYPERV,
+                HYPERV ".vm_net_interface_packets",
+                "VM interface packets",
+                "packets/s",
+                _COMMON_PLUGIN_NAME,
+                _COMMON_PLUGIN_MODULE_NAME,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_PacketsReceivedSec = rrddim_add(p->st_send_receive_packets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_PacketsSentSec = rrddim_add(p->st_send_receive_packets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+
+            rrdlabels_add(p->st_send_receive_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_send_receive_bytes = rrdset_create_localhost(
+              "vm_net_interface_traffic",
+              windows_shared_buffer,
+              NULL,
+              HYPERV,
+              HYPERV ".vm_net_interface_traffic",
+              "VM interface traffic",
+              "kilobits/s",
+              _COMMON_PLUGIN_NAME,
+              _COMMON_PLUGIN_MODULE_NAME,
+              NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_TRAFFIC,
+              update_every,
+              RRDSET_TYPE_AREA);
+
+            p->rd_BytesReceivedSec = rrddim_add(p->st_send_receive_bytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_BytesSentSec = rrddim_add(p->st_send_receive_bytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_send_receive_bytes->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_IPsecoffloadBytes = rrdset_create_localhost(
+                "vm_net_interface_ipsec_traffic",
+                windows_shared_buffer,
+                NULL,
+                HYPERV,
+                HYPERV ".vm_net_interface_ipsec_traffic",
+                "VM interface traffic",
+                "kilobits/s",
+                _COMMON_PLUGIN_NAME,
+                _COMMON_PLUGIN_MODULE_NAME,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_IPSEC_TRAFFIC,
+                update_every,
+                RRDSET_TYPE_AREA);
+
+            p->rd_IPsecoffloadBytesReceivedSec =
+                rrddim_add(p->st_IPsecoffloadBytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_IPsecoffloadBytesSentSec =
+                rrddim_add(p->st_IPsecoffloadBytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(
+                p->st_IPsecoffloadBytes->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_DirectedPackets = rrdset_create_localhost(
+                "vm_net_interface_directed_packets",
+                windows_shared_buffer,
+                NULL,
+                HYPERV,
+                HYPERV ".vm_net_interface_directed_packets",
+                "VM interface traffic",
+                "packets/s",
+                _COMMON_PLUGIN_NAME,
+                _COMMON_PLUGIN_MODULE_NAME,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_DIRECTED_PACKETS,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_DirectedPacketsReceivedSec =
+                rrddim_add(p->st_DirectedPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_DirectedPacketsSentSec =
+                rrddim_add(p->st_DirectedPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(
+                p->st_DirectedPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_BroadcastPackets = rrdset_create_localhost(
+                "vm_net_interface_broadcast_packets",
+                windows_shared_buffer,
+                NULL,
+                HYPERV,
+                HYPERV ".vm_net_interface_broadcast_packets",
+                "VM interface broadcast",
+                "packets/s",
+                _COMMON_PLUGIN_NAME,
+                _COMMON_PLUGIN_MODULE_NAME,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_BroadcastPacketsReceivedSec =
+                rrddim_add(p->st_BroadcastPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_BroadcastPacketsSentSec =
+                rrddim_add(p->st_BroadcastPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(
+                p->st_BroadcastPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_MulticastPackets = rrdset_create_localhost(
+                "vm_net_interface_multicast_packets",
+                windows_shared_buffer,
+                NULL,
+                HYPERV,
+                HYPERV ".vm_net_interface_multicast_packets",
+                "VM interface multicast",
+                "packets/s",
+                _COMMON_PLUGIN_NAME,
+                _COMMON_PLUGIN_MODULE_NAME,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_MULTICAST_PACKETS,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_MulticastPacketsReceivedSec =
+                rrddim_add(p->st_MulticastPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            p->rd_MulticastPacketsSentSec =
+                rrddim_add(p->st_MulticastPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(
+                p->st_MulticastPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
 
-            rrdlabels_add(p->st_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO);
         }
 
-        SETP_DIM_VALUE(st_packets, DroppedPacketsIncomingSec);
-        SETP_DIM_VALUE(st_packets, DroppedPacketsOutgoingSec);
+        SETP_DIM_VALUE(st_dropped_packets, DroppedPacketsIncomingSec);
+        SETP_DIM_VALUE(st_dropped_packets, DroppedPacketsOutgoingSec);
 
-        rrdset_done(p->st_packets);
+        SETP_DIM_VALUE(st_send_receive_packets, PacketsReceivedSec);
+        SETP_DIM_VALUE(st_send_receive_packets, PacketsSentSec);
+
+        SETP_DIM_VALUE(st_send_receive_bytes, BytesReceivedSec);
+        SETP_DIM_VALUE(st_send_receive_bytes, BytesSentSec);
+
+        SETP_DIM_VALUE(st_IPsecoffloadBytes, IPsecoffloadBytesReceivedSec);
+        SETP_DIM_VALUE(st_IPsecoffloadBytes, IPsecoffloadBytesSentSec);
+
+        SETP_DIM_VALUE(st_DirectedPackets, DirectedPacketsSentSec);
+        SETP_DIM_VALUE(st_DirectedPackets, DirectedPacketsReceivedSec);
+
+        SETP_DIM_VALUE(st_BroadcastPackets, BroadcastPacketsSentSec);
+        SETP_DIM_VALUE(st_BroadcastPackets, BroadcastPacketsReceivedSec);
+
+        SETP_DIM_VALUE(st_MulticastPackets,MulticastPacketsSentSec);
+        SETP_DIM_VALUE(st_MulticastPackets,MulticastPacketsReceivedSec);
+
+        rrdset_done(p->st_IPsecoffloadBytes);
+        rrdset_done(p->st_DirectedPackets);
+        rrdset_done(p->st_BroadcastPackets);
+        rrdset_done(p->st_MulticastPackets);
+        rrdset_done(p->st_send_receive_bytes);
+        rrdset_done(p->st_send_receive_packets);
+        rrdset_done(p->st_dropped_packets);
     }
     return true;
 }
@@ -1375,9 +1579,17 @@ struct hypervisor_processor {
     DEFINE_RD(HypervisorRunTime);
     DEFINE_RD(RemoteRunTime);
 
+    RRDSET *st_HypervisorProcessorTotal;
+    DEFINE_RD(TotalRunTime);
+
     COUNTER_DATA GuestRunTime;
     COUNTER_DATA HypervisorRunTime;
     COUNTER_DATA RemoteRunTime;
+    COUNTER_DATA TotalRunTime;
+    collected_number GuestRunTime_total;
+    collected_number HypervisorRunTime_total;
+    collected_number RemoteRunTime_total;
+    collected_number TotalRunTime_total;
 };
 
 
@@ -1386,6 +1598,11 @@ void initialize_hyperv_processor_keys(struct hypervisor_processor *p)
     p->GuestRunTime.key = "% Guest Run Time";
     p->HypervisorRunTime.key = "% Hypervisor Run Time";
     p->RemoteRunTime.key = "% Remote Run Time";
+    p->TotalRunTime.key = "% Total Run Time";
+    p->GuestRunTime_total = 0;
+    p->HypervisorRunTime_total = 0;
+    p->RemoteRunTime_total = 0;
+    p->TotalRunTime_total = 0;
 }
 
 void dict_hyperv_processor_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
@@ -1410,9 +1627,13 @@ static bool do_hyperv_processor(PERF_DATA_BLOCK *pDataBlock, int update_every, v
 
         get_and_sanitize_instance_value(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer));
 
-        if(strcasecmp(windows_shared_buffer, "_Total") == 0)
+        if (strcasecmp(windows_shared_buffer, "_Total") == 0)
             continue;
 
+        char *vm = strchr(windows_shared_buffer, ':');
+        if (vm)
+            *vm = '\0';
+
         struct hypervisor_processor *p = dictionary_set(item->instance, windows_shared_buffer, NULL, sizeof(*p));
 
         if (!p->collected_metadata) {
@@ -1422,39 +1643,77 @@ static bool do_hyperv_processor(PERF_DATA_BLOCK *pDataBlock, int update_every, v
         GET_INSTANCE_COUNTER(GuestRunTime);
         GET_INSTANCE_COUNTER(HypervisorRunTime);
         GET_INSTANCE_COUNTER(RemoteRunTime);
+        GET_INSTANCE_COUNTER(TotalRunTime);
 
         if (!p->charts_created) {
             p->charts_created = true;
-            p->st_HypervisorProcessor = rrdset_create_localhost(
+            p->st_HypervisorProcessorTotal = rrdset_create_localhost(
                 "vm_cpu_usage",
                 windows_shared_buffer,
                 NULL,
                 HYPERV,
                 HYPERV ".vm_cpu_usage",
-                "VM CPU usage (100% = 1 core)",
+                "VM CPU usage",
                 "percentage",
                 _COMMON_PLUGIN_NAME,
                 _COMMON_PLUGIN_MODULE_NAME,
-                chart_priority++,
+                NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE,
                 update_every,
                 RRDSET_TYPE_STACKED);
 
+            p->rd_TotalRunTime =
+                rrddim_add(p->st_HypervisorProcessorTotal, "usage", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_HypervisorProcessorTotal->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
+
+            p->st_HypervisorProcessor = rrdset_create_localhost(
+               "vm_cpu_usage_by_run_context",
+               windows_shared_buffer,
+               NULL,
+               HYPERV,
+               HYPERV ".vm_cpu_usage_by_run_context",
+               "VM CPU usage by run context",
+               "percentage",
+               _COMMON_PLUGIN_NAME,
+               _COMMON_PLUGIN_MODULE_NAME,
+               NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE_BY_RUN_CONTEXT,
+               update_every,
+               RRDSET_TYPE_STACKED);
+
             p->rd_GuestRunTime =
-                rrddim_add(p->st_HypervisorProcessor, "guest", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
+                rrddim_add(p->st_HypervisorProcessor, "guest", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
             p->rd_HypervisorRunTime =
-                rrddim_add(p->st_HypervisorProcessor, "hypervisor", NULL, -1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
+                rrddim_add(p->st_HypervisorProcessor, "hypervisor", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
             p->rd_RemoteRunTime =
-                rrddim_add(p->st_HypervisorProcessor, "remote", NULL, -1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
+                rrddim_add(p->st_HypervisorProcessor, "remote", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
 
             rrdlabels_add(p->st_HypervisorProcessor->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO);
         }
 
-        SETP_DIM_VALUE(st_HypervisorProcessor, GuestRunTime);
-        SETP_DIM_VALUE(st_HypervisorProcessor, HypervisorRunTime);
-        SETP_DIM_VALUE(st_HypervisorProcessor, RemoteRunTime);
-
-        rrdset_done(p->st_HypervisorProcessor);
+        p->GuestRunTime_total += (collected_number)p->GuestRunTime.current.Data;
+        p->HypervisorRunTime_total += (collected_number)p->HypervisorRunTime.current.Data;
+        p->RemoteRunTime_total += (collected_number)p->RemoteRunTime.current.Data;
+        p->TotalRunTime_total += (collected_number)p->TotalRunTime.current.Data;
     }
+
+    {
+        struct hypervisor_processor *p;
+        dfe_start_read(item->instance, p) {
+            rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_HypervisorRunTime, (collected_number) p->HypervisorRunTime_total);
+            rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_GuestRunTime, (collected_number) p->GuestRunTime_total);
+            rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_RemoteRunTime, (collected_number) p->RemoteRunTime_total);
+            rrdset_done(p->st_HypervisorProcessor);
+
+            rrddim_set_by_pointer(p->st_HypervisorProcessorTotal, p->rd_TotalRunTime, (collected_number) p->TotalRunTime_total);
+            rrdset_done(p->st_HypervisorProcessorTotal);
+
+            p->GuestRunTime_total = 0;
+            p->HypervisorRunTime_total = 0;
+            p->RemoteRunTime_total = 0;
+            p->TotalRunTime_total = 0;
+        }
+        dfe_done(p);
+    }
+
     return true;
 }