JRE-612 [followup]
diff --git a/src/windows/classes/sun/awt/Win32GraphicsDevice.java b/src/windows/classes/sun/awt/Win32GraphicsDevice.java
index ec2d8c2..1e18cd4 100644
--- a/src/windows/classes/sun/awt/Win32GraphicsDevice.java
+++ b/src/windows/classes/sun/awt/Win32GraphicsDevice.java
@@ -524,8 +524,8 @@
         defaultConfig = null;
         configs = null;
         // pass on to all top-level windows on this display
-        topLevels.notifyListeners();
         initScaleFactors();
+        topLevels.notifyListeners();
     }
 
     /**
diff --git a/src/windows/classes/sun/awt/windows/WFramePeer.java b/src/windows/classes/sun/awt/windows/WFramePeer.java
index 6140c2c..ecb9dec 100644
--- a/src/windows/classes/sun/awt/windows/WFramePeer.java
+++ b/src/windows/classes/sun/awt/windows/WFramePeer.java
@@ -111,6 +111,14 @@
     }
 
     @Override
+    public void displayChanged() {
+        super.displayChanged();
+        updateIcon();
+    }
+
+    private native void updateIcon();
+
+    @Override
     public boolean updateGraphicsData(GraphicsConfiguration gc) {
         boolean result = super.updateGraphicsData(gc);
         Rectangle bounds = AWTAccessor.getFrameAccessor().
diff --git a/src/windows/native/sun/windows/awt_Frame.cpp b/src/windows/native/sun/windows/awt_Frame.cpp
index 8dca9a4..5ee0c48 100644
--- a/src/windows/native/sun/windows/awt_Frame.cpp
+++ b/src/windows/native/sun/windows/awt_Frame.cpp
@@ -1188,6 +1188,19 @@
     }
 }
 
+void _UpdateIcon(void* p) {
+    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+    jobject self = reinterpret_cast<jobject>(p);
+    PDATA pData;
+    JNI_CHECK_PEER_GOTO(self, ret);
+
+    AwtFrame* frame = (AwtFrame*)pData;
+    frame->DoUpdateIcon();
+ret:
+    env->DeleteGlobalRef(self);
+}
+
 void AwtFrame::DoUpdateIcon()
 {
     //Workaround windows bug:
@@ -1974,6 +1987,17 @@
     CATCH_BAD_ALLOC;
 }
 
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WFramePeer_updateIcon(JNIEnv *env, jobject self)
+{
+    TRY;
+
+    AwtToolkit::GetInstance().InvokeFunction(_UpdateIcon, env->NewGlobalRef(self));
+    // global ref is deleted in _UpdateIcon()
+
+    CATCH_BAD_ALLOC;
+}
+
 } /* extern "C" */
 
 static bool SetFocusToPluginControl(HWND hwndPlugin)
diff --git a/src/windows/native/sun/windows/awt_Window.cpp b/src/windows/native/sun/windows/awt_Window.cpp
index 4a542a6..21e5e56 100644
--- a/src/windows/native/sun/windows/awt_Window.cpp
+++ b/src/windows/native/sun/windows/awt_Window.cpp
@@ -1756,13 +1756,6 @@
     return mrConsume;
 }
 
-void _DoUpdateIcon(void *p)
-{
-    DASSERT(p);
-    AwtWindow* window = reinterpret_cast<AwtWindow*>(p);
-    window->DoUpdateIcon();
-}
-
 /*
  * Override AwtComponent's move handling to first update the
  * java AWT target's position fields directly, since Windows
@@ -1784,7 +1777,7 @@
         m_screenNum = GetScreenImOn();
     }
     else if (CheckIfOnNewScreen()) {
-        AwtToolkit::GetInstance().InvokeFunctionLater(_DoUpdateIcon, (void*)this);
+        DoUpdateIcon();
     }
 
     /* Update the java AWT target component's fields directly */