diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro
index 791aa816714b7a8e868c9bcc2807982f334cbdf6..ba45a0699c09fc659e5afaeeaaef39cfd6029f12 100644
--- a/src/plugins/coreplugin/coreplugin.pro
+++ b/src/plugins/coreplugin/coreplugin.pro
@@ -168,6 +168,7 @@ RESOURCES += core.qrc \
 
 win32 {
     SOURCES += progressmanager/progressmanager_win.cpp
+    LIBS += -lole32
 }
 else:macx {
     OBJECTIVE_SOURCES += progressmanager/progressmanager_mac.mm
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
index 7418de8cf1bb5f4f8f25072672af5eae34f70c6a..fce083bf60ed3c53c48d13632b6b97376040f8b9 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
@@ -50,10 +50,7 @@ ProgressManagerPrivate::ProgressManagerPrivate(QObject *parent)
 
 ProgressManagerPrivate::~ProgressManagerPrivate()
 {
-}
-
-void ProgressManagerPrivate::init()
-{
+    cleanup();
 }
 
 void ProgressManagerPrivate::cancelTasks(const QString &type)
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm b/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm
index 296db9258ed79a0a3e9117c4a3a7a00a4e163f95..9d1a9ec10e6e96f0465d684ae8a7b1ad7278c926 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm
@@ -29,6 +29,14 @@
 
 #include "progressmanager_p.h"
 
+void Core::Internal::ProgressManagerPrivate::init()
+{
+}
+
+void Core::Internal::ProgressManagerPrivate::cleanup()
+{
+}
+
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
 #import <AppKit/NSDockTile.h>
 #import <AppKit/NSApplication.h>
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_p.h b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
index 80819a36d04a35b26333a6f5258e7265874a8993..e219fb7a7a684472aab08be71ca31c902c7d57d6 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_p.h
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_p.h
@@ -48,6 +48,7 @@ public:
     ProgressManagerPrivate(QObject *parent = 0);
     ~ProgressManagerPrivate();
     void init();
+    void cleanup();
 
     FutureProgress *addTask(const QFuture<void> &future, const QString &title, const QString &type,
                             ProgressFlags flags);
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp
index a427349c0fd8a1c867d0f1dda0ca2836feb56caf..2e4cb614bd23d27f5fc5123aa39555d0041799ba 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp
@@ -27,8 +27,91 @@
 **
 **************************************************************************/
 
+#include <QtCore/QVariant>
+#include <QtGui/QMainWindow>
+
+#include <coreplugin/icore.h>
+
 #include "progressmanager_p.h"
 
+// for windows progress bar
+#include <shobjidl.h>
+
+// Windows 7 SDK required
+#ifdef __ITaskbarList3_INTERFACE_DEFINED__
+
+namespace {
+    int total = 0;
+    ITaskbarList3* pITask = 0;
+}
+
+void Core::Internal::ProgressManagerPrivate::init()
+{
+    CoInitialize(NULL);
+    HRESULT hRes = CoCreateInstance(CLSID_TaskbarList,
+                                    NULL,CLSCTX_INPROC_SERVER,
+                                    IID_ITaskbarList3,(LPVOID*) &pITask);
+     if (FAILED(hRes))
+     {
+         pITask = 0;
+         CoUninitialize();
+         return;
+     }
+
+     pITask->HrInit();
+     return;
+}
+
+void Core::Internal::ProgressManagerPrivate::cleanup()
+{
+    if (pITask) {
+    pITask->Release();
+    pITask = NULL;
+    CoUninitialize();
+    }
+}
+
+
+void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text)
+{
+    Q_UNUSED(text)
+}
+
+void Core::Internal::ProgressManagerPrivate::setApplicationProgressRange(int min, int max)
+{
+    total = max-min;
+}
+
+void Core::Internal::ProgressManagerPrivate::setApplicationProgressValue(int value)
+{
+    if (pITask) {
+        WId winId = Core::ICore::instance()->mainWindow()->winId();
+        pITask->SetProgressValue(winId, value, total);
+    }
+}
+
+void Core::Internal::ProgressManagerPrivate::setApplicationProgressVisible(bool visible)
+{
+    if (!pITask)
+        return;
+
+    WId winId = Core::ICore::instance()->mainWindow()->winId();
+    if (visible)
+        pITask->SetProgressState(winId, TBPF_NORMAL);
+    else
+        pITask->SetProgressState(winId, TBPF_NOPROGRESS);
+}
+
+#else
+
+void Core::Internal::ProgressManagerPrivate::init()
+{
+}
+
+void Core::Internal::ProgressManagerPrivate::cleanup()
+{
+}
+
 void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text)
 {
     Q_UNUSED(text)
@@ -49,3 +132,6 @@ void Core::Internal::ProgressManagerPrivate::setApplicationProgressVisible(bool
 {
     Q_UNUSED(visible)
 }
+
+
+#endif // __ITaskbarList2_INTERFACE_DEFINED__
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp b/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp
index a427349c0fd8a1c867d0f1dda0ca2836feb56caf..69bc2d0dcd1690a7c1a8ca59b67464f4d3a61fbc 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp
@@ -29,6 +29,14 @@
 
 #include "progressmanager_p.h"
 
+void Core::Internal::ProgressManagerPrivate::init()
+{
+}
+
+void Core::Internal::ProgressManagerPrivate::cleanup()
+{
+}
+
 void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text)
 {
     Q_UNUSED(text)