diff --git a/dlls/hhctrl.ocx/Makefile.in b/dlls/hhctrl.ocx/Makefile.in
index 0ce6d65..bc17b2f 100644
--- a/dlls/hhctrl.ocx/Makefile.in
+++ b/dlls/hhctrl.ocx/Makefile.in
@@ -3,14 +3,16 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = hhctrl.ocx
-IMPORTS   = advapi32 comctl32 shell32 ole32 user32 gdi32 kernel32
+IMPORTS   = advapi32 comctl32 shell32 ole32 oleaut32 user32 gdi32 kernel32
+EXTRALIBS = -luuid
 
 C_SRCS = \
 	chm.c \
 	help.c \
 	hhctrl.c \
 	main.c \
-	regsvr.c
+	regsvr.c \
+	webbrowser.c
 
 RC_SRCS = hhctrl.rc
 
diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index a96182a..f52134e 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -32,6 +32,7 @@
 
 #include "resource.h"
 #include "chm.h"
+#include "webbrowser.h"
 
 /* Window type defaults */
 
@@ -45,6 +46,7 @@
 {
     HH_WINTYPEW *pHHWinType;
     CHMInfo *pCHMInfo;
+    WBInfo *pWBInfo;
     HINSTANCE hInstance;
     LPWSTR szCmdLine;
     HWND hwndTabCtrl;
@@ -387,6 +389,9 @@
     if (!hWnd)
         return FALSE;
 
+    if (!WB_EmbedBrowser(pHHInfo->pWBInfo, hwndParent))
+        return FALSE;
+
     /* store the pointer to the HH info struct */
     SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)pHHInfo);
 
@@ -572,6 +577,7 @@
 
     pHHInfo->pHHWinType = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HH_WINTYPEW));
     pHHInfo->pCHMInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(CHMInfo));
+    pHHInfo->pWBInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(WBInfo));
     pHHInfo->hInstance = hInstance;
     pHHInfo->szCmdLine = szCmdLine;
 
@@ -607,6 +613,21 @@
         CHM_CloseCHM(pHHInfo->pCHMInfo);
         HeapFree(GetProcessHeap(), 0, pHHInfo->pCHMInfo);
     }
+
+    if (pHHInfo->pWBInfo)
+    {
+        WB_UnEmbedBrowser(pHHInfo->pWBInfo);
+        HeapFree(GetProcessHeap(), 0, pHHInfo->pWBInfo);
+    }
+}
+
+static void HH_OpenDefaultTopic(HHInfo *pHHInfo)
+{
+    WCHAR url[MAX_PATH];
+    LPCWSTR defTopic = pHHInfo->pHHWinType->pszFile;
+
+    CHM_CreateITSUrl(pHHInfo->pCHMInfo, defTopic, url);
+    WB_Navigate(pHHInfo->pWBInfo, url);
 }
 
 static BOOL HH_OpenCHM(HHInfo *pHHInfo)
@@ -636,6 +657,8 @@
         return -1;
     }
 
+    HH_OpenDefaultTopic(pHHInfo);
+    
     while (GetMessageW(&msg, 0, 0, 0))
     {
         TranslateMessage(&msg);
diff --git a/dlls/hhctrl.ocx/webbrowser.c b/dlls/hhctrl.ocx/webbrowser.c
new file mode 100644
index 0000000..1618cf1
--- /dev/null
+++ b/dlls/hhctrl.ocx/webbrowser.c
@@ -0,0 +1,728 @@
+/*
+ * WebBrowser Implementation
+ *
+ * Copyright 2005 James Hawkins
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "ole2.h"
+
+#include "webbrowser.h"
+
+#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
+
+static const SAFEARRAYBOUND ArrayBound = {1, 0};
+
+typedef struct IOleClientSiteImpl
+{
+    const IOleClientSiteVtbl *lpVtbl;
+    const IOleInPlaceSiteVtbl *lpvtblOleInPlaceSite;
+    const IOleInPlaceFrameVtbl *lpvtblOleInPlaceFrame;
+    const IDocHostUIHandlerVtbl *lpvtblDocHostUIHandler;
+
+    /* IOleClientSiteImpl data */
+    IOleObject *pBrowserObject;
+    LONG ref;
+
+    /* IOleInPlaceFrame data */
+    HWND hwndWindow;
+} IOleClientSiteImpl;
+
+static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    *ppvObj = NULL;
+
+    if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleClientSite))
+    {
+        *ppvObj = This;
+    }
+    else if (IsEqualIID(riid, &IID_IOleInPlaceSite))
+    {
+        *ppvObj = &(This->lpvtblOleInPlaceSite);
+    }
+    else if (IsEqualIID(riid, &IID_IDocHostUIHandler))
+    {
+        *ppvObj = &(This->lpvtblDocHostUIHandler);
+    }
+    else
+        return E_NOINTERFACE;
+
+    return S_OK;
+}
+
+static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface);
+    LONG refCount = InterlockedDecrement(&This->ref);
+
+    if (refCount)
+        return refCount;
+
+    HeapFree(GetProcessHeap(), 0, This);
+    return 0;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite *iface)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite *iface, LPOLECONTAINER *ppContainer)
+{
+    *ppContainer = NULL;
+
+    return E_NOINTERFACE;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite *iface)
+{
+    return NOERROR;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite *iface, BOOL fShow)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite *iface)
+{
+    return E_NOTIMPL;
+}
+
+static const IOleClientSiteVtbl MyIOleClientSiteTable =
+{
+    Site_QueryInterface,
+    Site_AddRef,
+    Site_Release,
+    Site_SaveObject,
+    Site_GetMoniker,
+    Site_GetContainer,
+    Site_ShowObject,
+    Site_OnShowWindow,
+    Site_RequestNewObjectLayout
+};
+
+static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface);
+    return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
+}
+
+static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface)
+{
+    return 1;
+}
+
+static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface)
+{
+    return 2;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler *iface, DOCHOSTUIINFO *pInfo)
+{
+    pInfo->cbSize = sizeof(DOCHOSTUIINFO);
+    pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
+    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
+
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler *iface, DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler *iface, BOOL fEnable)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler *iface, BOOL fActivate)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler *iface, LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler *iface, LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
+{
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler *iface, LPOLESTR *pchKey, DWORD dw)
+{
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler *iface, IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
+{
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler *iface, IDispatch **ppDispatch)
+{
+    *ppDispatch = NULL;
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler *iface, DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
+{
+    *ppchURLOut = NULL;
+    return S_FALSE;
+}
+
+static HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler *iface, IDataObject *pDO, IDataObject **ppDORet)
+{
+    *ppDORet = NULL;
+    return S_FALSE;
+}
+
+static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
+{
+    UI_QueryInterface,
+    UI_AddRef,
+    UI_Release,
+    UI_ShowContextMenu,
+    UI_GetHostInfo,
+    UI_ShowUI,
+    UI_HideUI,
+    UI_UpdateUI,
+    UI_EnableModeless,
+    UI_OnDocWindowActivate,
+    UI_OnFrameWindowActivate,
+    UI_ResizeBorder,
+    UI_TranslateAccelerator,
+    UI_GetOptionKeyPath,
+    UI_GetDropTarget,
+    UI_GetExternal,
+    UI_TranslateUrl,
+    UI_FilterDataObject
+};
+
+static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    return Site_QueryInterface((IOleClientSite *)This, riid, ppvObj);
+}
+
+static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface)
+{
+    return 1;
+}
+
+static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface)
+{
+    return 2;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    *lphwnd = This->hwndWindow;
+
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    *lplpFrame = (LPOLEINPLACEFRAME)&This->lpvtblOleInPlaceFrame;
+    *lplpDoc = NULL;
+
+    lpFrameInfo->fMDIApp = FALSE;
+    lpFrameInfo->hwndFrame = This->hwndWindow;
+    lpFrameInfo->haccel = NULL;
+    lpFrameInfo->cAccelEntries = 0;
+
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite *iface)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite *iface)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *iface)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface);
+    IOleInPlaceObject *inplace;
+
+    if (!IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject, (void **)&inplace))
+        IOleInPlaceObject_SetObjectRects(inplace, lprcPosRect, lprcPosRect);
+
+    return S_OK;
+}
+
+static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
+{
+    InPlace_QueryInterface,
+    InPlace_AddRef,
+    InPlace_Release,
+    InPlace_GetWindow,
+    InPlace_ContextSensitiveHelp,
+    InPlace_CanInPlaceActivate,
+    InPlace_OnInPlaceActivate,
+    InPlace_OnUIActivate,
+    InPlace_GetWindowContext,
+    InPlace_Scroll,
+    InPlace_OnUIDeactivate,
+    InPlace_OnInPlaceDeactivate,
+    InPlace_DiscardUndoState,
+    InPlace_DeactivateAndUndo,
+    InPlace_OnPosRectChange
+};
+
+static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
+{
+    return E_NOTIMPL;
+}
+
+static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
+{
+    return 1;
+}
+
+static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
+{
+    return 2;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
+{
+    ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
+    *lphwnd = This->hwndWindow;
+
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
+{
+    return E_NOTIMPL;
+}
+
+static const IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable =
+{
+    Frame_QueryInterface,
+    Frame_AddRef,
+    Frame_Release,
+    Frame_GetWindow,
+    Frame_ContextSensitiveHelp,
+    Frame_GetBorder,
+    Frame_RequestBorderSpace,
+    Frame_SetBorderSpace,
+    Frame_SetActiveObject,
+    Frame_InsertMenus,
+    Frame_SetMenu,
+    Frame_RemoveMenus,
+    Frame_SetStatusText,
+    Frame_EnableModeless,
+    Frame_TranslateAccelerator
+};
+
+static HRESULT STDMETHODCALLTYPE Storage_QueryInterface(IStorage *This, REFIID riid, LPVOID *ppvObj)
+{
+    return E_NOTIMPL;
+}
+
+static ULONG STDMETHODCALLTYPE Storage_AddRef(IStorage *This)
+{
+    return 1;
+}
+
+static ULONG STDMETHODCALLTYPE Storage_Release(IStorage *This)
+{
+    return 2;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_CreateStream(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_OpenStream(IStorage *This, const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_CreateStorage(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_OpenStorage(IStorage *This, const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_CopyTo(IStorage *This, DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_MoveElementTo(IStorage *This, const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_Commit(IStorage *This, DWORD grfCommitFlags)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_Revert(IStorage *This)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_EnumElements(IStorage *This, DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_DestroyElement(IStorage *This, const OLECHAR *pwcsName)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_RenameElement(IStorage *This, const WCHAR *pwcsOldName, const WCHAR *pwcsNewName)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_SetElementTimes(IStorage *This, const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_SetClass(IStorage *This, REFCLSID clsid)
+{
+    return S_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_SetStateBits(IStorage *This, DWORD grfStateBits, DWORD grfMask)
+{
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE Storage_Stat(IStorage *This, STATSTG *pstatstg, DWORD grfStatFlag)
+{
+    return E_NOTIMPL;
+}
+
+static const IStorageVtbl MyIStorageTable =
+{
+    Storage_QueryInterface,
+    Storage_AddRef,
+    Storage_Release,
+    Storage_CreateStream,
+    Storage_OpenStream,
+    Storage_CreateStorage,
+    Storage_OpenStorage,
+    Storage_CopyTo,
+    Storage_MoveElementTo,
+    Storage_Commit,
+    Storage_Revert,
+    Storage_EnumElements,
+    Storage_DestroyElement,
+    Storage_RenameElement,
+    Storage_SetElementTimes,
+    Storage_SetClass,
+    Storage_SetStateBits,
+    Storage_Stat
+};
+
+static IStorage MyIStorage = { &MyIStorageTable };
+
+BOOL WB_EmbedBrowser(WBInfo *pWBInfo, HWND hwndParent)
+{
+    IOleClientSiteImpl *iOleClientSiteImpl;
+    IOleObject *browserObject;
+    IWebBrowser2 *webBrowser2;
+    HRESULT hr;
+    RECT rc;
+
+    static const WCHAR hostNameW[] = {'H','o','s','t',' ','N','a','m','e',0};
+
+    iOleClientSiteImpl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                   sizeof(IOleClientSiteImpl));
+    if (!iOleClientSiteImpl)
+        return FALSE;
+
+    iOleClientSiteImpl->ref = 0;
+    iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable;
+    iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable;
+    iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable;
+    iOleClientSiteImpl->hwndWindow = hwndParent;
+    iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable;
+
+    hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
+                   (IOleClientSite *)iOleClientSiteImpl, &MyIStorage,
+                   (void **)&browserObject);
+    if (FAILED(hr)) goto error;
+
+    /* make the browser object accessible to the IOleClientSite implementation */
+    iOleClientSiteImpl->pBrowserObject = browserObject;
+    IOleObject_SetHostNames(browserObject, hostNameW, 0);
+
+    GetClientRect(hwndParent, &rc);
+
+    hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE);
+    if (FAILED(hr)) goto error;
+
+    hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
+                           (IOleClientSite *)iOleClientSiteImpl,
+                           -1, hwndParent, &rc);
+    if (FAILED(hr)) goto error;
+
+
+    hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2,
+                                   (void **)&webBrowser2);
+    if (SUCCEEDED(hr))
+    {
+        IWebBrowser2_put_Left(webBrowser2, 0);
+        IWebBrowser2_put_Top(webBrowser2, 0);
+        IWebBrowser2_put_Width(webBrowser2, rc.right);
+        IWebBrowser2_put_Height(webBrowser2, rc.bottom);
+
+        pWBInfo->pOleClientSite = (IOleClientSite *)iOleClientSiteImpl;
+        pWBInfo->pBrowserObject = browserObject;
+        pWBInfo->pWebBrowser2 = webBrowser2;
+        pWBInfo->hwndParent = hwndParent;
+
+        return TRUE;
+    }
+
+error:
+    WB_UnEmbedBrowser(pWBInfo);
+
+    if (webBrowser2)
+        IWebBrowser2_Release(webBrowser2);
+
+    HeapFree(GetProcessHeap(), 0, iOleClientSiteImpl);
+
+    return FALSE;
+}
+
+void WB_UnEmbedBrowser(WBInfo *pWBInfo)
+{
+    if (pWBInfo->pBrowserObject)
+    {
+        IOleObject_Close(pWBInfo->pBrowserObject, OLECLOSE_NOSAVE);
+        IOleObject_Release(pWBInfo->pBrowserObject);
+        pWBInfo->pBrowserObject = NULL;
+    }
+
+    if (pWBInfo->pWebBrowser2)
+    {
+        IWebBrowser2_Release(pWBInfo->pWebBrowser2);
+        pWBInfo->pWebBrowser2 = NULL;
+    }
+
+    if (pWBInfo->pOleClientSite)
+    {
+        IOleClientSite_Release(pWBInfo->pOleClientSite);
+        pWBInfo->pOleClientSite = NULL;
+    }
+}
+
+BOOL WB_Navigate(WBInfo *pWBInfo, LPCWSTR szUrl)
+{
+    IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2;
+    VARIANT myURL;
+
+    if (!pWebBrowser2)
+        return FALSE;
+
+    V_VT(&myURL) = VT_BSTR;
+    V_BSTR(&myURL) = SysAllocString(szUrl);
+
+    IWebBrowser2_Navigate2(pWebBrowser2, &myURL, 0, 0, 0, 0);
+    VariantClear(&myURL);
+
+    return TRUE;
+}
+
+void WB_ResizeBrowser(WBInfo *pWBInfo, DWORD dwWidth, DWORD dwHeight)
+{
+    IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2;
+
+    if (!pWebBrowser2)
+        return;
+
+    IWebBrowser2_put_Width(pWebBrowser2, dwWidth);
+    IWebBrowser2_put_Height(pWebBrowser2, dwHeight);
+}
+
+void WB_DoPageAction(WBInfo *pWBInfo, DWORD dwAction)
+{
+    IWebBrowser2 *pWebBrowser2 = pWBInfo->pWebBrowser2;
+
+    if (!pWebBrowser2)
+        return;
+
+    switch (dwAction)
+    {
+        case WB_GOBACK:
+            IWebBrowser2_GoBack(pWebBrowser2);
+            break;
+        case WB_GOFORWARD:
+            IWebBrowser2_GoForward(pWebBrowser2);
+            break;
+        case WB_GOHOME:
+            IWebBrowser2_GoHome(pWebBrowser2);
+            break;
+        case WB_SEARCH:
+            IWebBrowser2_GoSearch(pWebBrowser2);
+            break;
+        case WB_REFRESH:
+            IWebBrowser2_Refresh(pWebBrowser2);
+        case WB_STOP:
+            IWebBrowser2_Stop(pWebBrowser2);
+    }
+}
diff --git a/dlls/hhctrl.ocx/webbrowser.h b/dlls/hhctrl.ocx/webbrowser.h
new file mode 100644
index 0000000..dd5fa53
--- /dev/null
+++ b/dlls/hhctrl.ocx/webbrowser.h
@@ -0,0 +1,49 @@
+/*
+ * WebBrowser Include
+ *
+ * Copyright 2005 James Hawkins
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __WINE_WEBBROWSER_H
+#define __WINE_WEBBROWSER_H
+
+#include "exdisp.h"
+#include "mshtml.h"
+#include "mshtmhst.h"
+
+#define WB_GOBACK       0
+#define WB_GOFORWARD    1
+#define WB_GOHOME       2
+#define WB_SEARCH       3
+#define WB_REFRESH      4
+#define WB_STOP         5
+
+typedef struct WBInfo
+{
+    IOleClientSite *pOleClientSite;
+    IWebBrowser2 *pWebBrowser2;
+    IOleObject *pBrowserObject;
+    HWND hwndParent;
+} WBInfo;
+
+BOOL WB_EmbedBrowser(WBInfo *pWBInfo, HWND hwndParent);
+void WB_UnEmbedBrowser(WBInfo *pWBInfo);
+BOOL WB_Navigate(WBInfo *pWBInfo, LPCWSTR szUrl);
+void WB_ResizeBrowser(WBInfo *pWBInfo, DWORD dwWidth, DWORD dwHeight);
+void WB_DoPageAction(WBInfo *pWBInfo, DWORD dwAction);
+
+#endif /* __WINE_WEBBROWSER_H */
