diff --git a/dlls/shell32/ebrowser.c b/dlls/shell32/ebrowser.c
index 1a71e02..ff035ba 100644
--- a/dlls/shell32/ebrowser.c
+++ b/dlls/shell32/ebrowser.c
@@ -35,6 +35,7 @@
 
 typedef struct _ExplorerBrowserImpl {
     const IExplorerBrowserVtbl *lpVtbl;
+    const IShellBrowserVtbl *lpsbVtbl;
     LONG ref;
     BOOL destroyed;
 } ExplorerBrowserImpl;
@@ -54,6 +55,10 @@
     {
         *ppvObject = This;
     }
+    else if(IsEqualIID(riid, &IID_IShellBrowser))
+    {
+        *ppvObject = &This->lpsbVtbl;
+    }
 
     if(*ppvObject)
     {
@@ -255,6 +260,204 @@
     IExplorerBrowser_fnGetCurrentView
 };
 
+/**************************************************************************
+ * IShellBrowser Implementation
+ */
+
+static inline ExplorerBrowserImpl *impl_from_IShellBrowser(IShellBrowser *iface)
+{
+    return (ExplorerBrowserImpl *)((char*)iface - FIELD_OFFSET(ExplorerBrowserImpl, lpsbVtbl));
+}
+
+static HRESULT WINAPI IShellBrowser_fnQueryInterface(IShellBrowser *iface,
+                                                     REFIID riid, void **ppvObject)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p\n", This);
+    return IUnknown_QueryInterface((IUnknown*) This, riid, ppvObject);
+}
+
+static ULONG WINAPI IShellBrowser_fnAddRef(IShellBrowser *iface)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p\n", This);
+    return IUnknown_AddRef((IUnknown*) This);
+}
+
+static ULONG WINAPI IShellBrowser_fnRelease(IShellBrowser *iface)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p\n", This);
+    return IUnknown_Release((IUnknown*) This);
+}
+
+static HRESULT WINAPI IShellBrowser_fnGetWindow(IShellBrowser *iface, HWND *phwnd)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%p)\n", This, phwnd);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnContextSensitiveHelp(IShellBrowser *iface,
+                                                           BOOL fEnterMode)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%d)\n", This, fEnterMode);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnInsertMenusSB(IShellBrowser *iface,
+                                                    HMENU hmenuShared,
+                                                    LPOLEMENUGROUPWIDTHS lpMenuWidths)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p (%p, %p)\n", This, hmenuShared, lpMenuWidths);
+
+    /* Not implemented. */
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnSetMenuSB(IShellBrowser *iface,
+                                                HMENU hmenuShared,
+                                                HOLEMENU holemenuReserved,
+                                                HWND hwndActiveObject)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p (%p, %p, %p)\n", This, hmenuShared, holemenuReserved, hwndActiveObject);
+
+    /* Not implemented. */
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnRemoveMenusSB(IShellBrowser *iface,
+                                                    HMENU hmenuShared)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p (%p)\n", This, hmenuShared);
+
+    /* Not implemented. */
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnSetStatusTextSB(IShellBrowser *iface,
+                                                      LPCOLESTR pszStatusText)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%s)\n", This, debugstr_w(pszStatusText));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnEnableModelessSB(IShellBrowser *iface,
+                                                       BOOL fEnable)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%d)\n", This, fEnable);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnTranslateAcceleratorSB(IShellBrowser *iface,
+                                                             MSG *pmsg, WORD wID)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%p, 0x%x)\n", This, pmsg, wID);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnBrowseObject(IShellBrowser *iface,
+                                                   LPCITEMIDLIST pidl, UINT wFlags)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnGetViewStateStream(IShellBrowser *iface,
+                                                         DWORD grfMode,
+                                                         IStream **ppStrm)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (0x%x, %p)\n", This, grfMode, ppStrm);
+
+    *ppStrm = NULL;
+    return E_FAIL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnGetControlWindow(IShellBrowser *iface,
+                                                       UINT id, HWND *phwnd)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    TRACE("%p (%d, %p)\n", This, id, phwnd);
+
+    /* Not implemented. */
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnSendControlMsg(IShellBrowser *iface,
+                                                     UINT id, UINT uMsg,
+                                                     WPARAM wParam, LPARAM lParam,
+                                                     LRESULT *pret)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%d, %d, %lx, %lx, %p)\n", This, id, uMsg, wParam, lParam, pret);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnQueryActiveShellView(IShellBrowser *iface,
+                                                           IShellView **ppshv)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%p)\n", This, ppshv);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnOnViewWindowActive(IShellBrowser *iface,
+                                                         IShellView *pshv)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%p)\n", This, pshv);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IShellBrowser_fnSetToolbarItems(IShellBrowser *iface,
+                                                      LPTBBUTTONSB lpButtons,
+                                                      UINT nButtons, UINT uFlags)
+{
+    ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface);
+    FIXME("stub, %p (%p, %d, 0x%x)\n", This, lpButtons, nButtons, uFlags);
+
+    return E_NOTIMPL;
+}
+
+static const IShellBrowserVtbl vt_IShellBrowser = {
+    IShellBrowser_fnQueryInterface,
+    IShellBrowser_fnAddRef,
+    IShellBrowser_fnRelease,
+    IShellBrowser_fnGetWindow,
+    IShellBrowser_fnContextSensitiveHelp,
+    IShellBrowser_fnInsertMenusSB,
+    IShellBrowser_fnSetMenuSB,
+    IShellBrowser_fnRemoveMenusSB,
+    IShellBrowser_fnSetStatusTextSB,
+    IShellBrowser_fnEnableModelessSB,
+    IShellBrowser_fnTranslateAcceleratorSB,
+    IShellBrowser_fnBrowseObject,
+    IShellBrowser_fnGetViewStateStream,
+    IShellBrowser_fnGetControlWindow,
+    IShellBrowser_fnSendControlMsg,
+    IShellBrowser_fnQueryActiveShellView,
+    IShellBrowser_fnOnViewWindowActive,
+    IShellBrowser_fnSetToolbarItems
+};
+
 HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
 {
     ExplorerBrowserImpl *eb;
@@ -270,6 +473,7 @@
     eb = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ExplorerBrowserImpl));
     eb->ref = 1;
     eb->lpVtbl = &vt_IExplorerBrowser;
+    eb->lpsbVtbl = &vt_IShellBrowser;
 
     ret = IExplorerBrowser_QueryInterface((IExplorerBrowser*)eb, riid, ppv);
     IExplorerBrowser_Release((IExplorerBrowser*)eb);
diff --git a/dlls/shell32/tests/ebrowser.c b/dlls/shell32/tests/ebrowser.c
index 35c87bd..e2e4b4f 100644
--- a/dlls/shell32/tests/ebrowser.c
+++ b/dlls/shell32/tests/ebrowser.c
@@ -55,7 +55,7 @@
 
     test_qinterface(IID_IUnknown, S_OK);
     test_qinterface(IID_IExplorerBrowser, S_OK);
-    todo_wine test_qinterface(IID_IShellBrowser, S_OK);
+    test_qinterface(IID_IShellBrowser, S_OK);
     todo_wine test_qinterface(IID_IOleWindow, S_OK);
     todo_wine test_qinterface(IID_ICommDlgBrowser, S_OK);
     todo_wine test_qinterface(IID_ICommDlgBrowser2, S_OK);
@@ -77,6 +77,58 @@
     ok(lres == 0, "Got %d\n", lres);
 }
 
+static void test_SB_misc(void)
+{
+    IExplorerBrowser *peb;
+    IShellBrowser *psb;
+    HRESULT hr;
+    HWND retHwnd;
+    LONG lres;
+
+    ebrowser_instantiate(&peb);
+    hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
+    ok(hr == S_OK, "Got 0x%08x\n", hr);
+    if(FAILED(hr))
+    {
+        skip("Failed to get IShellBrowser interface.\n");
+        return;
+    }
+
+    /* Some unimplemented methods */
+    retHwnd = (HWND)0xDEADBEEF;
+    hr = IShellBrowser_GetControlWindow(psb, FCW_TOOLBAR, &retHwnd);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+    ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
+
+    hr = IShellBrowser_GetControlWindow(psb, FCW_STATUS, &retHwnd);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+    ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
+
+    hr = IShellBrowser_GetControlWindow(psb, FCW_TREE, &retHwnd);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+    ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
+
+    hr = IShellBrowser_GetControlWindow(psb, FCW_PROGRESS, &retHwnd);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+    ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
+
+    /* ::InsertMenuSB */
+    hr = IShellBrowser_InsertMenusSB(psb, NULL, NULL);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+
+    /* ::RemoveMenusSB */
+    hr = IShellBrowser_RemoveMenusSB(psb, NULL);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+
+    /* ::SetMenuSB */
+    hr = IShellBrowser_SetMenuSB(psb, NULL, NULL, NULL);
+    ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
+
+    IShellBrowser_Release(psb);
+    lres = IExplorerBrowser_Release(peb);
+    ok(lres == 0, "Got %d\n", lres);
+}
+
 static BOOL test_instantiate_control(void)
 {
     IExplorerBrowser *peb;
@@ -103,6 +155,7 @@
     }
 
     test_QueryInterface();
+    test_SB_misc();
 
     OleUninitialize();
 }
