diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp
index bbd1cfd7604ac92401250c24d0e5c80291f081cc..d147952804e3663732824c8f9e1f056770118f05 100644
--- a/widget/src/windows/nsWindow.cpp
+++ b/widget/src/windows/nsWindow.cpp
@@ -33,6 +33,11 @@
 #include "prtime.h"
 #include "nsIRenderingContextWin.h"
 
+#include "nsIMenu.h"
+#include "nsIMenuItem.h"
+#include "nsIMenuListener.h"
+#include "nsMenuItem.h"
+
 BOOL nsWindow::sIsRegistered = FALSE;
 
 nsWindow* nsWindow::gCurrentWindow = nsnull;
@@ -43,7 +48,10 @@ nsWindow* nsWindow::gCurrentWindow = nsnull;
 //     g_hinst - handle of the application instance 
 extern HINSTANCE g_hinst; 
 
-static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID);
+static NS_DEFINE_IID(kIWidgetIID,       NS_IWIDGET_IID);
+static NS_DEFINE_IID(kIMenuIID,         NS_IMENU_IID);
+static NS_DEFINE_IID(kIMenuItemIID,     NS_IMENUITEM_IID);
+//static NS_DEFINE_IID(kIMenuListenerIID, NS_IMENULISTENER_IID);
 
 //-------------------------------------------------------------------------
 //
@@ -73,6 +81,9 @@ nsWindow::nsWindow() : nsBaseWidget()
     mFont               = nsnull;
     mIsVisible          = PR_FALSE;
     mHas3DBorder        = PR_FALSE;
+    mMenuBar            = nsnull;
+    mMenuCmdId          = 0;
+
 }
 
 
@@ -1278,6 +1289,28 @@ void nsWindow::SetUpForPaint(HDC aHDC)
   ::SetBkMode (aHDC, TRANSPARENT);
 }
 
+//-------------------------------------------------------------------------
+nsIMenuItem * FindMenuItem(nsIMenu * aMenu, PRUint32 aId)
+{
+  PRUint32 i, count;
+  aMenu->GetItemCount(count);
+  for (i=0;i<count;i++) {
+    nsISupports * item;
+    aMenu->GetItemAt(i, item);
+    nsIMenuItem * menuItem;
+    nsIMenu     * menu;
+    if (NS_OK == item->QueryInterface(kIMenuItemIID, (void **)&menuItem)) {
+      if (((nsMenuItem *)menuItem)->GetCmdId() == (PRInt32)aId) {
+        return menuItem;
+      }
+    } else if (NS_OK == item->QueryInterface(kIMenuIID, (void **)&menu)) {
+      return FindMenuItem(menu, aId);
+    }
+  }
+  return nsnull;
+}
+
+
 //-------------------------------------------------------------------------
 //
 // Process all nsWindows messages
@@ -1300,6 +1333,23 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
             event.eventStructType = NS_MENU_EVENT;
             InitEvent(event, NS_MENU_SELECTED);
             result = DispatchWindowEvent(&event);
+            if (mMenuBar) {
+              PRUint32 i, count;
+              mMenuBar->GetMenuCount(count);
+              for (i=0;i<count;i++) {
+                nsIMenu * menu;
+                mMenuBar->GetMenuAt(i, menu);
+                nsIMenuItem * menuItem = FindMenuItem(menu, event.mCommand);
+                if (menuItem) {
+                  nsIMenuListener * listener;
+                  if (NS_OK == menuItem->QueryInterface(kIMenuListenerIID, (void **)&listener)) {
+                    listener->MenuSelected(event);
+                    NS_RELEASE(listener);
+                  }
+                  NS_RELEASE(menuItem);
+                }
+              }
+            }
             NS_RELEASE(event.widget);
           }
         }
@@ -2038,6 +2088,9 @@ PRBool nsWindow::AutoErase()
 
 NS_METHOD nsWindow::SetMenuBar(nsIMenuBar * aMenuBar) 
 {
+  mMenuBar = aMenuBar;
+  NS_ADDREF(mMenuBar);
+
   HMENU nativeMenuHandle;
   void * voidData;
   aMenuBar->GetNativeData(voidData);
diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h
index 8d9fce8c79ea20e95dcd9cfa63b451eb2abc7790..936e21d53003650596261e5e88056bbf28624cad 100644
--- a/widget/src/windows/nsWindow.h
+++ b/widget/src/windows/nsWindow.h
@@ -136,6 +136,8 @@ public:
     virtual PRBool          AutoErase();
     nsPoint*                GetLastPoint() { return &mLastPoint; }
 
+    PRInt32                 GetNewCmdMenuId() { mMenuCmdId++; return mMenuCmdId;}
+
 protected:
 
   virtual PRBool          ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *aRetValue);
@@ -197,6 +199,9 @@ protected:
     PRInt32     mPreferredWidth;
     PRInt32     mPreferredHeight;
 
+    nsIMenuBar * mMenuBar;
+    PRInt32      mMenuCmdId;
+
 
     // Enumeration of the methods which are accessable on the "main GUI thread"
     // via the CallMethod(...) mechanism...