Index: trunk/src/VBox/Main/HostImpl.cpp
===================================================================
--- trunk/src/VBox/Main/HostImpl.cpp	(revision 11466)
+++ trunk/src/VBox/Main/HostImpl.cpp	(revision 11467)
@@ -2739,4 +2739,5 @@
     pm::SubMetric *cpuLoadKernel = new pm::SubMetric ("CPU/Load/Kernel");
     pm::SubMetric *cpuLoadIdle   = new pm::SubMetric ("CPU/Load/Idle");
+    pm::SubMetric *cpuMhzSM      = new pm::SubMetric ("CPU/MHZ");
     pm::SubMetric *ramUsageTotal = new pm::SubMetric ("RAM/Usage/Total");
     pm::SubMetric *ramUsageUsed  = new pm::SubMetric ("RAM/Usage/Used");
@@ -2750,4 +2751,7 @@
                                           cpuLoadIdle);
     aCollector->registerBaseMetric (cpuLoad);
+    pm::BaseMetric *cpuMhz =
+        metricFactory->createHostCpuMHz (objptr, cpuMhzSM);
+    aCollector->registerBaseMetric (cpuMhz);
     pm::BaseMetric *ramUsage =
         metricFactory->createHostRamUsage (objptr, ramUsageTotal, ramUsageUsed,
@@ -2777,4 +2781,12 @@
                                                new pm::AggregateMin()));
     aCollector->registerMetric (new pm::Metric(cpuLoad, cpuLoadIdle,
+                                               new pm::AggregateMax()));
+
+    aCollector->registerMetric (new pm::Metric(cpuMhz, cpuMhzSM, 0));
+    aCollector->registerMetric (new pm::Metric(cpuMhz, cpuMhzSM,
+                                               new pm::AggregateAvg()));
+    aCollector->registerMetric (new pm::Metric(cpuMhz, cpuMhzSM,
+                                               new pm::AggregateMin()));
+    aCollector->registerMetric (new pm::Metric(cpuMhz, cpuMhzSM,
                                                new pm::AggregateMax()));
 
Index: trunk/src/VBox/Main/Makefile.kmk
===================================================================
--- trunk/src/VBox/Main/Makefile.kmk	(revision 11466)
+++ trunk/src/VBox/Main/Makefile.kmk	(revision 11467)
@@ -276,5 +276,5 @@
 VBoxSVC_SOURCES.win     +=     win/PerformanceWin.cpp
 VBoxSVC_LDFLAGS.solaris += -lkstat
-VBoxSVC_LDFLAGS.win     += wbemuuid.lib
+VBoxSVC_LDFLAGS.win     += wbemuuid.lib powrprof.lib
 endif
 
Index: trunk/src/VBox/Main/testcase/Makefile.kmk
===================================================================
--- trunk/src/VBox/Main/testcase/Makefile.kmk	(revision 11466)
+++ trunk/src/VBox/Main/testcase/Makefile.kmk	(revision 11467)
@@ -113,5 +113,5 @@
 tstCollector_INCS     = ../include
 tstCollector_LDFLAGS.solaris += -lkstat
-tstCollector_LDFLAGS.win += wbemuuid.lib
+tstCollector_LDFLAGS.win += wbemuuid.lib powrprof.lib
 
 
Index: trunk/src/VBox/Main/win/PerformanceWin.cpp
===================================================================
--- trunk/src/VBox/Main/win/PerformanceWin.cpp	(revision 11466)
+++ trunk/src/VBox/Main/win/PerformanceWin.cpp	(revision 11467)
@@ -23,5 +23,9 @@
 
 #include <Wbemidl.h>
+extern "C" {
+#include <powrprof.h>
+}
 #include <iprt/err.h>
+#include <iprt/mp.h>
 
 #include "Logging.h"
@@ -334,7 +338,35 @@
 }
 
+typedef struct _PROCESSOR_POWER_INFORMATION {
+  ULONG  Number;
+  ULONG  MaxMhz;
+  ULONG  CurrentMhz;
+  ULONG  MhzLimit;
+  ULONG  MaxIdleState;
+  ULONG  CurrentIdleState;
+} PROCESSOR_POWER_INFORMATION , *PPROCESSOR_POWER_INFORMATION;
+
 int CollectorWin::getHostCpuMHz(ULONG *mhz)
 {
-    return VERR_NOT_IMPLEMENTED;
+    uint64_t uTotalMhz   = 0;
+    RTCPUID  nProcessors = RTMpGetCount();
+    PPROCESSOR_POWER_INFORMATION ppi = new PROCESSOR_POWER_INFORMATION[nProcessors];
+    LONG ns = CallNtPowerInformation(ProcessorInformation, NULL, 0, ppi,
+        nProcessors * sizeof(PROCESSOR_POWER_INFORMATION));
+    if (ns)
+    {
+        Log(("CallNtPowerInformation() -> %x\n", ns));
+        return VERR_INTERNAL_ERROR;
+    }
+
+    /* Compute an average over all CPUs */
+    for (unsigned i = 0; i < nProcessors;  i++)
+        uTotalMhz += ppi[i].CurrentMhz;
+    *mhz = (ULONG)(uTotalMhz / nProcessors);
+
+    LogFlowThisFunc(("mhz=%u\n", *mhz));
+    LogFlowThisFuncLeave();
+
+    return VINF_SUCCESS;
 }
 
