diff --git a/Make.rules.in b/Make.rules.in
index 66b5ff9..778a766 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -144,6 +144,7 @@
 	rpcrt4 \
 	serialui \
 	setupapi \
+	shdocvw \
 	shell32 \
 	shfolder \
 	shlwapi \
diff --git a/configure b/configure
index 2285cfa..34c83fe 100755
--- a/configure
+++ b/configure
@@ -6836,6 +6836,7 @@
 dlls/rpcrt4/Makefile
 dlls/serialui/Makefile
 dlls/setupapi/Makefile
+dlls/shdocvw/Makefile
 dlls/shell32/Makefile
 dlls/shfolder/Makefile
 dlls/shlwapi/Makefile
@@ -7078,6 +7079,7 @@
 dlls/rpcrt4/Makefile
 dlls/serialui/Makefile
 dlls/setupapi/Makefile
+dlls/shdocvw/Makefile
 dlls/shell32/Makefile
 dlls/shfolder/Makefile
 dlls/shlwapi/Makefile
diff --git a/configure.in b/configure.in
index 94424c4..37305e1 100644
--- a/configure.in
+++ b/configure.in
@@ -1179,6 +1179,7 @@
 dlls/rpcrt4/Makefile
 dlls/serialui/Makefile
 dlls/setupapi/Makefile
+dlls/shdocvw/Makefile
 dlls/shell32/Makefile
 dlls/shfolder/Makefile
 dlls/shlwapi/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index 15daa42..a95af69 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -48,6 +48,7 @@
 	rpcrt4/librpcrt4.@LIBEXT@ \
 	serialui/libserialui.@LIBEXT@ \
 	setupapi/libsetupapi.@LIBEXT@ \
+	shdocvw/libshdocvw.@LIBEXT@ \
 	shell32/libshell32.@LIBEXT@ \
 	shfolder/libshfolder.@LIBEXT@ \
 	shlwapi/libshlwapi.@LIBEXT@ \
@@ -163,6 +164,7 @@
 	rpcrt4 \
 	serialui \
 	setupapi \
+	shdocvw \
 	shell32 \
 	shfolder \
 	shlwapi \
@@ -337,6 +339,9 @@
 libsetupapi.@LIBEXT@ libsetupx.@LIBEXT@: setupapi/libsetupapi.@LIBEXT@
 	$(RM) $@ && $(LN_S) setupapi/libsetupapi.@LIBEXT@ $@
 
+libshdocvw.@LIBEXT@: shdocvw/libshdocvw.@LIBEXT@
+	$(RM) $@ && $(LN_S) shdocvw/libshdocvw.@LIBEXT@ $@
+
 libshell32.@LIBEXT@ libshell.@LIBEXT@: shell32/libshell32.@LIBEXT@
 	$(RM) $@ && $(LN_S) shell32/libshell32.@LIBEXT@ $@
 
@@ -439,6 +444,7 @@
 rpcrt4/librpcrt4.@LIBEXT@: libkernel32.@LIBEXT@ libntdll.@LIBEXT@
 serialui/libserialui.@LIBEXT@: libuser32.@LIBEXT@ libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
 setupapi/libsetupapi.@LIBEXT@: libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
+shdocvw/libshdocvw.@LIBEXT@: libole32.@LIBEXT@ libntdll.@LIBEXT@
 shell32/libshell32.@LIBEXT@: libole32.@LIBEXT@ libshlwapi.@LIBEXT@ libcomctl32.@LIBEXT@ libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libadvapi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
 shfolder/libshfolder.@LIBEXT@: libshell32.@LIBEXT@
 shlwapi/libshlwapi.@LIBEXT@: libadvapi32.@LIBEXT@ libuser32.@LIBEXT@ libgdi32.@LIBEXT@ libkernel32.@LIBEXT@ libntdll.@LIBEXT@
diff --git a/dlls/shdocvw/.cvsignore b/dlls/shdocvw/.cvsignore
new file mode 100644
index 0000000..d74a544
--- /dev/null
+++ b/dlls/shdocvw/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+shdocvw.spec.c
diff --git a/dlls/shdocvw/Makefile.in b/dlls/shdocvw/Makefile.in
new file mode 100644
index 0000000..2d1d177
--- /dev/null
+++ b/dlls/shdocvw/Makefile.in
@@ -0,0 +1,22 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = shdocvw
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = \
+	classinfo.c \
+	events.c \
+	factory.c \
+	misc.c \
+	oleobject.c \
+	persist.c \
+	shdocvw_main.c \
+	webbrowser.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/shdocvw/classinfo.c b/dlls/shdocvw/classinfo.c
new file mode 100644
index 0000000..58e1ec4
--- /dev/null
+++ b/dlls/shdocvw/classinfo.c
@@ -0,0 +1,153 @@
+/*
+ * Implementation of IProvideClassInfo interfaces for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IProvideClassInfo interface
+ *
+ * FIXME: Should we just pass in the IProvideClassInfo2 methods rather
+ *        reimplementing them here?
+ */
+
+static HRESULT WINAPI WBPCI_QueryInterface(LPPROVIDECLASSINFO iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPCI_AddRef(LPPROVIDECLASSINFO iface)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPCI_Release(LPPROVIDECLASSINFO iface)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Return an ITypeInfo interface to retrieve type library info about
+ * this control.
+ */
+static HRESULT WINAPI WBPCI_GetClassInfo(LPPROVIDECLASSINFO iface, LPTYPEINFO *ppTI)
+{
+    FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IProvideClassInfo virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IProvideClassInfo) WBPCI_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPCI_QueryInterface,
+    WBPCI_AddRef,
+    WBPCI_Release,
+    WBPCI_GetClassInfo
+};
+
+IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IProvideClassInfo2 interface (inherits from
+ * IProvideClassInfo).
+ */
+
+static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,
+                                            REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Return an ITypeInfo interface to retrieve type library info about
+ * this control.
+ */
+static HRESULT WINAPI WBPCI2_GetClassInfo(LPPROVIDECLASSINFO2 iface, LPTYPEINFO *ppTI)
+{
+    FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
+    return S_OK;
+}
+
+/* Get the IID for generic default event callbacks.  This IID will
+ * in theory be used to later query for an IConnectionPoint to connect
+ * an event sink (callback implmentation in the OLE control site)
+ * to this control.
+*/
+static HRESULT WINAPI WBPCI2_GetGUID(LPPROVIDECLASSINFO2 iface,
+                                     DWORD dwGuidKind, GUID *pGUID)
+{
+    FIXME("stub: dwGuidKind = %ld, pGUID = %s\n", dwGuidKind, debugstr_guid(pGUID));
+
+    if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID)
+    {
+        FIXME ("Requested unsupported GUID type: %ld\n", dwGuidKind);
+        return E_FAIL;  /* Is there a better return type here? */
+    }
+
+    /* FIXME: Returning IPropertyNotifySink interface, but should really
+     * return a more generic event set (???) dispinterface.
+     * However, this hack, allows a control site to return with success
+     * (MFC's COleControlSite falls back to older IProvideClassInfo interface
+     * if GetGUID() fails to return a non-NULL GUID).
+     */
+    memcpy(pGUID, &IID_IPropertyNotifySink, sizeof(GUID));
+    FIXME("Wrongly returning IPropertyNotifySink interface %s\n",
+          debugstr_guid(pGUID));
+
+    return S_OK;
+}
+
+/**********************************************************************
+ * IProvideClassInfo virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IProvideClassInfo2) WBPCI2_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPCI2_QueryInterface,
+    WBPCI2_AddRef,
+    WBPCI2_Release,
+    WBPCI2_GetClassInfo,
+    WBPCI2_GetGUID
+};
+
+IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl, 1 };
diff --git a/dlls/shdocvw/events.c b/dlls/shdocvw/events.c
new file mode 100644
index 0000000..20ab506
--- /dev/null
+++ b/dlls/shdocvw/events.c
@@ -0,0 +1,196 @@
+/*
+ * Implementation of event-related interfaces for IE Web Browser control:
+ *
+ *  - IConnectionPointContainer
+ *  - IConnectionPoint
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+
+/**********************************************************************
+ * Implement the IConnectionPointContainer interface
+ */
+
+static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Get a list of connection points inside this container. */
+static HRESULT WINAPI WBCPC_EnumConnectionPoints(LPCONNECTIONPOINTCONTAINER iface,
+                                                 LPENUMCONNECTIONPOINTS *ppEnum)
+{
+    FIXME("stub: IEnumConnectionPoints = %p\n", *ppEnum);
+    return S_OK;
+}
+
+/* Retrieve the connection point in this container associated with the
+ * riid interface.  When events occur in the control, the control can
+ * call backwards into its embedding site, through these interfaces.
+ */
+static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface,
+                                                REFIID riid, LPCONNECTIONPOINT *ppCP)
+{
+    TRACE(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP);
+
+    /* For now, return the same IConnectionPoint object for both
+     * event interface requests.
+     */
+    if (IsEqualGUID (&IID_INotifyDBEvents, riid))
+    {
+        TRACE("Returning connection point %p for IID_INotifyDBEvents\n",
+              &SHDOCVW_ConnectionPoint);
+        *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IPropertyNotifySink, riid))
+    {
+        TRACE("Returning connection point %p for IID_IPropertyNotifySink\n",
+              &SHDOCVW_ConnectionPoint);
+        *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
+        return S_OK;
+    }
+
+    return E_FAIL;
+}
+
+/**********************************************************************
+ * IConnectionPointContainer virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IConnectionPointContainer) WBCPC_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCPC_QueryInterface,
+    WBCPC_AddRef,
+    WBCPC_Release,
+    WBCPC_EnumConnectionPoints,
+    WBCPC_FindConnectionPoint
+};
+
+IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = { &WBCPC_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IConnectionPoint interface
+ */
+
+static HRESULT WINAPI WBCP_QueryInterface(LPCONNECTIONPOINT iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBCP_AddRef(LPCONNECTIONPOINT iface)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBCP_Release(LPCONNECTIONPOINT iface)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBCP_GetConnectionInterface(LPCONNECTIONPOINT iface, IID* pIId)
+{
+    FIXME("stub: %s\n", debugstr_guid(pIId));
+    return S_OK;
+}
+
+/* Get this connection point's owning container */
+static HRESULT WINAPI
+WBCP_GetConnectionPointContainer(LPCONNECTIONPOINT iface,
+                                 LPCONNECTIONPOINTCONTAINER *ppCPC)
+{
+    FIXME("stub: IConnectionPointContainer = %p\n", *ppCPC);
+    return S_OK;
+}
+
+/* Connect the pUnkSink event-handling implementation (in the control site)
+ * to this connection point.  Return a handle to this connection in
+ * pdwCookie (for later use in Unadvise()).
+ */
+static HRESULT WINAPI WBCP_Advise(LPCONNECTIONPOINT iface,
+                                  LPUNKNOWN pUnkSink, DWORD *pdwCookie)
+{
+    static int new_cookie;
+
+    FIXME("stub: IUnknown = %p, connection cookie = %ld\n", pUnkSink, *pdwCookie);
+
+    *pdwCookie = ++new_cookie;
+    TRACE ("Returning cookie = %ld\n", *pdwCookie);
+
+    return S_OK;
+}
+
+/* Disconnect this implementation from the connection point. */
+static HRESULT WINAPI WBCP_Unadvise(LPCONNECTIONPOINT iface,
+                                    DWORD dwCookie)
+{
+    FIXME("stub: cookie to disconnect = %ld\n", dwCookie);
+    return S_OK;
+}
+
+/* Get a list of connections in this connection point. */
+static HRESULT WINAPI WBCP_EnumConnections(LPCONNECTIONPOINT iface,
+                                           LPENUMCONNECTIONS *ppEnum)
+{
+    FIXME("stub: IEnumConnections = %p\n", *ppEnum);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IConnectionPoint virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IConnectionPoint) WBCP_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCP_QueryInterface,
+    WBCP_AddRef,
+    WBCP_Release,
+    WBCP_GetConnectionInterface,
+    WBCP_GetConnectionPointContainer,
+    WBCP_Advise,
+    WBCP_Unadvise,
+    WBCP_EnumConnections
+};
+
+IConnectionPointImpl SHDOCVW_ConnectionPoint = { &WBCP_Vtbl, 1 };
diff --git a/dlls/shdocvw/factory.c b/dlls/shdocvw/factory.c
new file mode 100644
index 0000000..f4a4257
--- /dev/null
+++ b/dlls/shdocvw/factory.c
@@ -0,0 +1,107 @@
+/*
+ * Implementation of class factory for IE Web Browser
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IWebBrowser class factory
+ *
+ * (Based on implementation in ddraw/main.c)
+ */
+
+/**********************************************************************
+ * WBCF_QueryInterface (IUnknown)
+ */
+static HRESULT WINAPI WBCF_QueryInterface(LPCLASSFACTORY iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    TRACE ("\n");
+
+    /*
+     * Perform a sanity check on the parameters.
+     */
+    if ((This == NULL) || (ppobj == NULL) )
+        return E_INVALIDARG;
+
+    return E_NOINTERFACE;
+}
+
+/************************************************************************
+ * WBCF_AddRef (IUnknown)
+ */
+static ULONG WINAPI WBCF_AddRef(LPCLASSFACTORY iface)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+/************************************************************************
+ * WBCF_Release (IUnknown)
+ */
+static ULONG WINAPI WBCF_Release(LPCLASSFACTORY iface)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/************************************************************************
+ * WBCF_CreateInstance (IClassFactory)
+ */
+static HRESULT WINAPI WBCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    /* Don't support aggregation (yet?) */
+    if (pOuter)
+    {
+        TRACE ("Failed attempt to aggregate IWebBrowser\n");
+        return CLASS_E_NOAGGREGATION;
+    }
+
+    TRACE("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
+
+    if ((IsEqualGUID (&IID_IOleObject, riid)))
+    {
+        TRACE ("Instantiating IOleObject component\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleObject;
+
+        return S_OK;
+    }
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/************************************************************************
+ * WBCF_LockServer (IClassFactory)
+ */
+static HRESULT WINAPI WBCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+    FIXME("(%p)->(%d),stub!\n", This, dolock);
+    return S_OK;
+}
+
+static ICOM_VTABLE(IClassFactory) WBCF_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCF_QueryInterface,
+    WBCF_AddRef,
+    WBCF_Release,
+    WBCF_CreateInstance,
+    WBCF_LockServer
+};
+
+IClassFactoryImpl SHDOCVW_ClassFactory = { &WBCF_Vtbl, 1 };
diff --git a/dlls/shdocvw/misc.c b/dlls/shdocvw/misc.c
new file mode 100644
index 0000000..707f2a0
--- /dev/null
+++ b/dlls/shdocvw/misc.c
@@ -0,0 +1,80 @@
+/*
+ * Implementation of miscellaneous interfaces for IE Web Browser control:
+ *
+ *  - IQuickActivate
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IQuickActivate interface
+ */
+
+static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Alternative interface for quicker, easier activation of a control. */
+static HRESULT WINAPI WBQA_QuickActivate(LPQUICKACTIVATE iface,
+                                         QACONTAINER *pQaContainer,
+                                         QACONTROL *pQaControl)
+{
+    FIXME("stub: QACONTAINER = %p, QACONTROL = %p\n", pQaContainer, pQaControl);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBQA_SetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
+{
+    FIXME("stub: LPSIZEL = %p\n", pSizel);
+    return E_NOINTERFACE;
+}
+
+static HRESULT WINAPI WBQA_GetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
+{
+    FIXME("stub: LPSIZEL = %p\n", pSizel);
+    return E_NOINTERFACE;
+}
+
+/**********************************************************************
+ * IQuickActivate virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IQuickActivate) WBQA_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBQA_QueryInterface,
+    WBQA_AddRef,
+    WBQA_Release,
+    WBQA_QuickActivate,
+    WBQA_SetContentExtent,
+    WBQA_GetContentExtent
+};
+
+IQuickActivateImpl SHDOCVW_QuickActivate = { &WBQA_Vtbl, 1 };
diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c
new file mode 100644
index 0000000..c48d8cc
--- /dev/null
+++ b/dlls/shdocvw/oleobject.c
@@ -0,0 +1,603 @@
+/*
+ * Implementation of IOleObject interfaces for IE Web Browser
+ *
+ * - IOleObject
+ * - IOleInPlaceObject
+ * - IOleControl
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+#include "ole2.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IOleObject interface for the web browser component
+ *
+ * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
+ */
+
+static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface);
+static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface);
+
+/************************************************************************
+ * WBOOBJ_QueryInterface (IUnknown)
+ *
+ * Interfaces we need to (at least pretend to) retrieve:
+ *
+ *   a6bc3ac0-dbaa-11ce-9de3-00aa004bb851  IID_IProvideClassInfo2
+ *   b196b283-bab4-101a-b69c-00aa00341d07  IID_IProvideClassInfo
+ *   cf51ed10-62fe-11cf-bf86-00a0c9034836  IID_IQuickActivate
+ *   7fd52380-4e07-101b-ae2d-08002b2ec713  IID_IPersistStreamInit
+ *   0000010a-0000-0000-c000-000000000046  IID_IPersistStorage
+ *   b196b284-bab4-101a-b69c-00aa00341d07  IID_IConnectionPointContainer
+ */
+static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
+                                            REFIID riid, void** ppobj)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    /*
+     * Perform a sanity check on the parameters.
+     */
+    if ((This == NULL) || (ppobj == NULL) )
+        return E_INVALIDARG;
+
+    if (IsEqualGUID (&IID_IPersistStorage, riid))
+    {
+        TRACE("Returning IID_IPersistStorage interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_PersistStorage;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IPersistStreamInit, riid))
+    {
+        TRACE("Returning IID_IPersistStreamInit interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_PersistStreamInit;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IProvideClassInfo, riid))
+    {
+        TRACE("Returning IID_IProvideClassInfo interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IProvideClassInfo2, riid))
+    {
+        TRACE("Returning IID_IProvideClassInfo2 interface %p\n",
+              &SHDOCVW_ProvideClassInfo2);
+        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo2;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IQuickActivate, riid))
+    {
+        TRACE("Returning IID_IQuickActivate interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_QuickActivate;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IConnectionPointContainer, riid))
+    {
+        TRACE("Returning IID_IConnectionPointContainer interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_ConnectionPointContainer;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IOleInPlaceObject, riid))
+    {
+        TRACE("Returning IID_IOleInPlaceObject interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleInPlaceObject;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IOleControl, riid))
+    {
+        TRACE("Returning IID_IOleControl interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleControl;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IWebBrowser, riid))
+    {
+        TRACE("Returning IID_IWebBrowser interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IDispatch, riid))
+    {
+        TRACE("Returning IID_IDispatch interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+
+    TRACE ("Failed to find iid = %s\n", debugstr_guid(riid));
+
+    return E_NOINTERFACE;
+}
+
+/************************************************************************
+ * WBOOBJ_AddRef (IUnknown)
+ */
+static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+/************************************************************************
+ * WBOOBJ_Release (IUnknown)
+ */
+static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/************************************************************************
+ * WBOOBJ_SetClientSite (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
+                                           LPOLECLIENTSITE pClientSite)
+{
+    FIXME("stub: (%p, %p)\n", iface, pClientSite);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetClientSite (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
+                                           LPOLECLIENTSITE* ppClientSite)
+{
+    FIXME("stub: (%p)\n", *ppClientSite);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetHostNames (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
+                                          LPCOLESTR szContainerObj)
+{
+    FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
+          debugstr_w(szContainerObj));
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Close (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
+{
+    FIXME("stub: ()\n");
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetMoniker (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
+                                        DWORD dwWhichMoniker, IMoniker* pmk)
+{
+    FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetMoniker (IOleObject)
+ *
+ * Delegate this request to the client site if we have one.
+ */
+static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
+                                        DWORD dwWhichMoniker, LPMONIKER *ppmk)
+{
+    FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
+    return E_UNSPEC;
+}
+
+/************************************************************************
+ * WBOOBJ_InitFromData (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
+                                          BOOL fCreation, DWORD dwReserved)
+{
+    FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetClipboardData (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
+                                              LPDATAOBJECT *ppDataObject)
+{
+    FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_DoVerb (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
+                                    LPOLECLIENTSITE pActiveSite, LONG lindex,
+                                    HWND hwndParent, LPCRECT lprcPosRect)
+{
+    FIXME(": stub iVerb = %ld\n", iVerb);
+    switch (iVerb)
+    {
+    case OLEIVERB_INPLACEACTIVATE:
+        FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
+        break;
+    case OLEIVERB_HIDE:
+        FIXME ("stub for OLEIVERB_HIDE\n");
+        break;
+    }
+
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_EnumVerbs (IOleObject)
+ *
+ * Delegate to OleRegEnumVerbs.
+ */
+static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
+                                       IEnumOLEVERB** ppEnumOleVerb)
+{
+    TRACE("(%p, %p)\n", iface, ppEnumOleVerb);
+
+    return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
+}
+
+/************************************************************************
+ * WBOOBJ_EnumVerbs (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
+{
+    FIXME(": Stub\n");
+    return E_NOTIMPL;
+}
+
+/************************************************************************
+ * WBOOBJ_IsUpToDate (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
+{
+    FIXME("(%p)\n", iface);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetUserClassID (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
+{
+    FIXME("stub: (%p, %p)\n", iface, pClsid);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetUserType (IOleObject)
+ *
+ * Delegate to OleRegGetUserType.
+ */
+static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
+                                         LPOLESTR* pszUserType)
+{
+    TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);
+
+    return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
+}
+
+/************************************************************************
+ * WBOOBJ_SetExtent (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
+                                       SIZEL* psizel)
+{
+    FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
+          psizel->cx, psizel->cy);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetExtent (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
+                                       SIZEL* psizel)
+{
+    FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Advise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
+                                    DWORD* pdwConnection)
+{
+    FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Unadvise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
+{
+    FIXME("stub: (%p, %ld)\n", iface, dwConnection);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_EnumAdvise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
+{
+    FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetMiscStatus (IOleObject)
+ *
+ * Delegate to OleRegGetMiscStatus.
+ */
+static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
+                                           DWORD* pdwStatus)
+{
+    HRESULT hres;
+
+    TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
+
+    hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
+
+    if (FAILED(hres))
+        *pdwStatus = 0;
+
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetColorScheme (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
+                                            struct tagLOGPALETTE* pLogpal)
+{
+    FIXME("stub: (%p, %p))\n", iface, pLogpal);
+    return OLE_E_NOTRUNNING;
+}
+
+/**********************************************************************
+ * IOleObject virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOOBJ_QueryInterface,
+    WBOOBJ_AddRef,
+    WBOOBJ_Release,
+    WBOOBJ_SetClientSite,
+    WBOOBJ_GetClientSite,
+    WBOOBJ_SetHostNames,
+    WBOOBJ_Close,
+    WBOOBJ_SetMoniker,
+    WBOOBJ_GetMoniker,
+    WBOOBJ_InitFromData,
+    WBOOBJ_GetClipboardData,
+    WBOOBJ_DoVerb,
+    WBOOBJ_EnumVerbs,
+    WBOOBJ_Update,
+    WBOOBJ_IsUpToDate,
+    WBOOBJ_GetUserClassID,
+    WBOOBJ_GetUserType,
+    WBOOBJ_SetExtent,
+    WBOOBJ_GetExtent,
+    WBOOBJ_Advise,
+    WBOOBJ_Unadvise,
+    WBOOBJ_EnumAdvise,
+    WBOOBJ_GetMiscStatus,
+    WBOOBJ_SetColorScheme
+};
+
+IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IOleInPlaceObject interface
+ */
+
+static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
+                                            REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
+{
+#if 0
+    /* Create a fake window to fool MFC into believing that we actually
+     * have an implemented browser control.  Avoids the assertion.
+     */
+    HWND hwnd;
+    hwnd = CreateWindowA("BUTTON", "Web Control",
+                        WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
+                        CW_USEDEFAULT, CW_USEDEFAULT, 600,
+                        400, NULL, NULL, NULL, NULL);
+
+    *phwnd = hwnd;
+    TRACE ("Returning hwnd = %d\n", hwnd);
+#endif
+
+    FIXME("stub HWND* = %p\n", phwnd);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
+                                                  BOOL fEnterMode)
+{
+    FIXME("stub fEnterMode = %d\n", fEnterMode);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
+                                            LPCRECT lprcPosRect, LPCRECT lprcClipRect)
+{
+    FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IOleInPlaceObject virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOIPO_QueryInterface,
+    WBOIPO_AddRef,
+    WBOIPO_Release,
+    WBOIPO_GetWindow,
+    WBOIPO_ContextSensitiveHelp,
+    WBOIPO_InPlaceDeactivate,
+    WBOIPO_UIDeactivate,
+    WBOIPO_SetObjectRects,
+    WBOIPO_ReactivateAndUndo
+};
+
+IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IOleControl interface
+ */
+
+static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
+{
+    FIXME("stub: LPCONTROLINFO = %p\n", pCI);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
+{
+    FIXME("stub: MSG* = %p\n", pMsg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
+{
+    FIXME("stub: DISPID = %ld\n", dispID);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
+{
+    FIXME("stub: bFreeze = %d\n", bFreeze);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IOleControl virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleControl) WBOC_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOC_QueryInterface,
+    WBOC_AddRef,
+    WBOC_Release,
+    WBOC_GetControlInfo,
+    WBOC_OnMnemonic,
+    WBOC_OnAmbientPropertyChange,
+    WBOC_FreezeEvents
+};
+
+IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };
diff --git a/dlls/shdocvw/persist.c b/dlls/shdocvw/persist.c
new file mode 100644
index 0000000..cc0df76
--- /dev/null
+++ b/dlls/shdocvw/persist.c
@@ -0,0 +1,186 @@
+/*
+ * Implementation of IPersist interfaces for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IPersistStorage interface
+ */
+
+static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)
+{
+    FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_IsDirty(LPPERSISTSTORAGE iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_InitNew(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_Load(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_Save(LPPERSISTSTORAGE iface, LPSTORAGE pStg,
+                                BOOL fSameAsLoad)
+{
+    FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_SaveCompleted(LPPERSISTSTORAGE iface, LPSTORAGE pStgNew)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStgNew);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IPersistStorage virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IPersistStorage) WBPS_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPS_QueryInterface,
+    WBPS_AddRef,
+    WBPS_Release,
+    WBPS_GetClassID,
+    WBPS_IsDirty,
+    WBPS_InitNew,
+    WBPS_Load,
+    WBPS_Save,
+    WBPS_SaveCompleted
+};
+
+IPersistStorageImpl SHDOCVW_PersistStorage = { &WBPS_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IPersistStreamInit interface
+ */
+
+static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)
+{
+    FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_IsDirty(LPPERSISTSTREAMINIT iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_Load(LPPERSISTSTREAMINIT iface, LPSTREAM pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_Save(LPPERSISTSTREAMINIT iface, LPSTREAM pStg,
+                                BOOL fSameAsLoad)
+{
+    FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_GetSizeMax(LPPERSISTSTREAMINIT iface,
+                                       ULARGE_INTEGER *pcbSize)
+{
+    FIXME("stub: ULARGE_INTEGER = %p\n", pcbSize);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_InitNew(LPPERSISTSTREAMINIT iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IPersistStreamInit virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IPersistStreamInit) WBPSI_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPSI_QueryInterface,
+    WBPSI_AddRef,
+    WBPSI_Release,
+    WBPSI_GetClassID,
+    WBPSI_IsDirty,
+    WBPSI_Load,
+    WBPSI_Save,
+    WBPSI_GetSizeMax,
+    WBPSI_InitNew
+};
+
+IPersistStreamInitImpl SHDOCVW_PersistStreamInit = { &WBPSI_Vtbl, 1 };
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
new file mode 100644
index 0000000..0d72c76
--- /dev/null
+++ b/dlls/shdocvw/shdocvw.h
@@ -0,0 +1,193 @@
+/*
+ * Header includes for shdocvw.dll
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#ifndef __WINE_SHDOCVW_H
+#define __WINE_SHDOCVW_H
+
+/* FIXME: Is there a better way to deal with all these includes? */
+#include "wingdi.h"
+#include "winbase.h"
+#include "winuser.h"
+
+#include "wine/obj_base.h"
+#include "wine/obj_storage.h"
+#include "wine/obj_misc.h"
+#include "wine/obj_moniker.h"
+#include "wine/obj_inplace.h"
+#include "wine/obj_dataobject.h"
+#include "wine/obj_oleobj.h"
+#include "wine/obj_oleaut.h"
+#include "wine/obj_olefont.h"
+#include "wine/obj_dragdrop.h"
+#include "wine/obj_oleview.h"
+#include "wine/obj_control.h"
+#include "wine/obj_connection.h"
+#include "wine/obj_property.h"
+#include "wine/obj_oleundo.h"
+#include "wine/obj_webbrowser.h"
+
+/**********************************************************************
+ * IClassFactory declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IClassFactory);
+    DWORD ref;
+} IClassFactoryImpl;
+
+extern IClassFactoryImpl SHDOCVW_ClassFactory;
+
+
+/**********************************************************************
+ * IOleObject declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleObject);
+    DWORD ref;
+} IOleObjectImpl;
+
+extern IOleObjectImpl SHDOCVW_OleObject;
+
+
+/**********************************************************************
+ * IOleInPlaceObject declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleInPlaceObject);
+    DWORD ref;
+} IOleInPlaceObjectImpl;
+
+extern IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject;
+
+
+/**********************************************************************
+ * IOleControl declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleControl);
+    DWORD ref;
+} IOleControlImpl;
+
+extern IOleControlImpl SHDOCVW_OleControl;
+
+
+/**********************************************************************
+ * IWebBrowser declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IWebBrowser);
+    DWORD ref;
+} IWebBrowserImpl;
+
+extern IWebBrowserImpl SHDOCVW_WebBrowser;
+
+
+/**********************************************************************
+ * IProvideClassInfo declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IProvideClassInfo);
+    DWORD ref;
+} IProvideClassInfoImpl;
+
+extern IProvideClassInfoImpl SHDOCVW_ProvideClassInfo;
+
+
+/**********************************************************************
+ * IProvideClassInfo2 declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IProvideClassInfo2);
+    DWORD ref;
+} IProvideClassInfo2Impl;
+
+extern IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2;
+
+
+/**********************************************************************
+ * IPersistStorage declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IPersistStorage);
+    DWORD ref;
+} IPersistStorageImpl;
+
+extern IPersistStorageImpl SHDOCVW_PersistStorage;
+
+
+/**********************************************************************
+ * IPersistStreamInit declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IPersistStreamInit);
+    DWORD ref;
+} IPersistStreamInitImpl;
+
+extern IPersistStreamInitImpl SHDOCVW_PersistStreamInit;
+
+
+/**********************************************************************
+ * IQuickActivate declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IQuickActivate);
+    DWORD ref;
+} IQuickActivateImpl;
+
+extern IQuickActivateImpl SHDOCVW_QuickActivate;
+
+
+/**********************************************************************
+ * IConnectionPointContainer declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IConnectionPointContainer);
+    DWORD ref;
+} IConnectionPointContainerImpl;
+
+extern IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer;
+
+
+/**********************************************************************
+ * IConnectionPoint declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IConnectionPoint);
+    DWORD ref;
+} IConnectionPointImpl;
+
+extern IConnectionPointImpl SHDOCVW_ConnectionPoint;
+
+
+/* Other stuff.. */
+
+DEFINE_GUID(IID_INotifyDBEvents,
+0xdb526cc0, 0xd188, 0x11cd, 0xad, 0x48, 0x0, 0xaa, 0x0, 0x3c, 0x9c, 0xb6);
+
+#endif /* __WINE_SHDOCVW_H */
diff --git a/dlls/shdocvw/shdocvw.spec b/dlls/shdocvw/shdocvw.spec
new file mode 100644
index 0000000..0ae0767
--- /dev/null
+++ b/dlls/shdocvw/shdocvw.spec
@@ -0,0 +1,34 @@
+name	shdocvw
+type	win32
+
+import	ole32.dll
+import	ntdll.dll
+
+debug_channels (shdocvw)
+
+108 stub AddUrlToFavorites
+109 stdcall DllCanUnloadNow() SHDOCVW_DllCanUnloadNow
+312 stdcall DllGetClassObject(long long ptr) SHDOCVW_DllGetClassObject
+113 stdcall DllGetVersion(ptr) SHDOCVW_DllGetVersion
+114 stdcall DllInstall(long wstr) SHDOCVW_DllInstall
+124 stdcall DllRegisterServer() SHDOCVW_DllRegisterServer
+126 stub DllRegisterWindowClasses
+127 stdcall DllUnregisterServer() SHDOCVW_DllUnregisterServer
+128 stub DoAddToFavDlg
+129 stub DoAddToFavDlgW
+132 stub DoFileDownload
+133 stub DoFileDownloadEx
+134 stub DoOrganizeFavDlg
+144 stub DoOrganizeFavDlgW
+106 stub HlinkFindFrame
+155 stub HlinkFrameNavigate
+155 stub HlinkFrameNavigateNHL
+156 stub IEWriteErrorLog
+157 stub OpenURL
+163 stub SHAddSubscribeFavorite
+166 stub SHGetIDispatchForFolder
+168 stub SetQueryNetSessionCount
+107 stub SetShellOfflineState
+182 stub SoftwareUpdateMessageBox
+184 stub URLQualifyA
+186 stub URLQualifyW
diff --git a/dlls/shdocvw/shdocvw_main.c b/dlls/shdocvw/shdocvw_main.c
new file mode 100644
index 0000000..cde3a76
--- /dev/null
+++ b/dlls/shdocvw/shdocvw_main.c
@@ -0,0 +1,81 @@
+/*
+ * SHDOCVW - Internet Explorer Web Control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+
+#include "initguid.h"
+#include "ole2.h"
+#include "shlwapi.h"
+
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/***********************************************************************
+ *              DllCanUnloadNow (SHDOCVW.109) */
+HRESULT WINAPI SHDOCVW_DllCanUnloadNow(void)
+{
+    FIXME("(void): stub\n");
+
+    return S_FALSE;
+}
+
+/*************************************************************************
+ *              DllGetClassObject (SHDOCVW.312)
+ */
+HRESULT WINAPI SHDOCVW_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+    TRACE("\n");
+
+    if (IsEqualGUID(&IID_IClassFactory, riid))
+    {
+        /* Pass back our shdocvw class factory */
+        *ppv = (LPVOID)&SHDOCVW_ClassFactory;
+        IClassFactory_AddRef((IClassFactory*)&SHDOCVW_ClassFactory);
+
+        return S_OK;
+    }
+
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/***********************************************************************
+ *              DllGetVersion (SHDOCVW.113)
+ */
+HRESULT WINAPI SHDOCVW_DllGetVersion (DLLVERSIONINFO *pdvi)
+{
+    FIXME("(void): stub\n");
+    return S_FALSE;
+}
+
+/*************************************************************************
+ *              DllInstall (SHDOCVW.114)
+ */
+HRESULT WINAPI SHDOCVW_DllInstall(BOOL bInstall, LPCWSTR cmdline)
+{
+   FIXME("(%s, %s): stub!\n", bInstall ? "TRUE":"FALSE", debugstr_w(cmdline));
+
+   return S_OK;
+}
+
+/***********************************************************************
+ *		DllRegisterServer (SHDOCVW.124)
+ */
+HRESULT WINAPI SHDOCVW_DllRegisterServer()
+{
+    FIXME("(), stub!\n");
+    return S_OK;
+}
+
+/***********************************************************************
+ *		DllUnregisterServer (SHDOCVW.127)
+ */
+HRESULT WINAPI SHDOCVW_DllUnregisterServer()
+{
+    FIXME("(), stub!\n");
+    return S_OK;
+}
+
diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c
new file mode 100644
index 0000000..544a587
--- /dev/null
+++ b/dlls/shdocvw/webbrowser.c
@@ -0,0 +1,267 @@
+/*
+ * Implementation of IWebBrowser interface for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IWebBrowser interface
+ */
+
+static HRESULT WINAPI WB_QueryInterface(LPWEBBROWSER iface, REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WB_AddRef(LPWEBBROWSER iface)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WB_Release(LPWEBBROWSER iface)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* IDispatch methods */
+static HRESULT WINAPI WB_GetTypeInfoCount(LPWEBBROWSER iface, UINT *pctinfo)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GetTypeInfo(LPWEBBROWSER iface, UINT iTInfo, LCID lcid,
+                                     LPTYPEINFO *ppTInfo)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GetIDsOfNames(LPWEBBROWSER iface, REFIID riid,
+                                       LPOLESTR *rgszNames, UINT cNames,
+                                       LCID lcid, DISPID *rgDispId)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Invoke(LPWEBBROWSER iface, DISPID dispIdMember,
+                                REFIID riid, LCID lcid, WORD wFlags,
+                                DISPPARAMS *pDispParams, VARIANT *pVarResult,
+                                EXCEPINFO *pExepInfo, UINT *puArgErr)
+{
+    FIXME("stub dispIdMember = %d, IID = %s\n", (int)dispIdMember, debugstr_guid(riid));
+    return S_OK;
+}
+
+/* IWebBrowser methods */
+static HRESULT WINAPI WB_GoBack(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoForward(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoHome(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoSearch(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Navigate(LPWEBBROWSER iface, BSTR *URL,
+                                  VARIANT *Flags, VARIANT *TargetFrameName,
+                                  VARIANT *PostData, VARIANT *Headers)
+{
+    FIXME("stub: URL = %p (%p, %p, %p, %p)\n", URL, Flags, TargetFrameName,
+          PostData, Headers);
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Refresh(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Refresh2(LPWEBBROWSER iface, VARIANT *Level)
+{
+    FIXME("stub: %p\n", Level);
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Stop(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Application(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Parent(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Container(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Document(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_TopLevelContainer(LPWEBBROWSER iface, VARIANT *pBool)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Type(LPWEBBROWSER iface, BSTR *Type)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Left(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Left(LPWEBBROWSER iface, long Left)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Top(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Top(LPWEBBROWSER iface, long Top)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Width(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Width(LPWEBBROWSER iface, long Width)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Height(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Height(LPWEBBROWSER iface, long Height)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_LocationName(LPWEBBROWSER iface, BSTR *LocationName)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_LocationURL(LPWEBBROWSER iface, BSTR *LocationURL)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Busy(LPWEBBROWSER iface, VARIANT *pBool)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IWebBrowser virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IWebBrowser) WB_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WB_QueryInterface,
+    WB_AddRef,
+    WB_Release,
+    WB_GetTypeInfoCount,
+    WB_GetTypeInfo,
+    WB_GetIDsOfNames,
+    WB_Invoke,
+    WB_GoBack,
+    WB_GoForward,
+    WB_GoHome,
+    WB_GoSearch,
+    WB_Navigate,
+    WB_Refresh,
+    WB_Refresh2,
+    WB_Stop,
+    WB_get_Application,
+    WB_get_Parent,
+    WB_get_Container,
+    WB_get_Document,
+    WB_get_TopLevelContainer,
+    WB_get_Type,
+    WB_get_Left,
+    WB_put_Left,
+    WB_get_Top,
+    WB_put_Top,
+    WB_get_Width,
+    WB_put_Width,
+    WB_get_Height,
+    WB_put_Height,
+    WB_get_LocationName,
+    WB_get_LocationURL,
+    WB_get_Busy
+};
+
+IWebBrowserImpl SHDOCVW_WebBrowser = { &WB_Vtbl, 1 };
diff --git a/documentation/Makefile.in b/documentation/Makefile.in
index 375994c..cad418e 100644
--- a/documentation/Makefile.in
+++ b/documentation/Makefile.in
@@ -4,7 +4,7 @@
 VPATH     = @srcdir@
 MODULE    = none
 BOOKNAME  = wine-doc
-DB2HTML   = $(SRCDIR)/db2html-winehq
+DB2HTML   = db2html
 
 EXTRASUBDIRS = samples status
 
diff --git a/include/wine/obj_webbrowser.h b/include/wine/obj_webbrowser.h
new file mode 100644
index 0000000..fb9f3d6
--- /dev/null
+++ b/include/wine/obj_webbrowser.h
@@ -0,0 +1,100 @@
+/*
+ * Defines the COM interfaces and APIs related to the IE Web browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#ifndef __WINE_WINE_OBJ_WEBBROWSER_H
+#define __WINE_WINE_OBJ_WEBBROWSER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+
+/*****************************************************************************
+ * Predeclare the interfaces and class IDs
+ */
+DEFINE_GUID(IID_IWebBrowser, 0xeab22ac1, 0x30c1, 0x11cf, 0xa7, 0xeb, 0x00, 0x00, 0xc0, 0x5b, 0xae, 0x0b);
+typedef struct IWebBrowser IWebBrowser, *LPWEBBROWSER;
+
+DEFINE_GUID(CLSID_WebBrowser, 0x8856f961, 0x340a, 0x11d0, 0xa9, 0x6b, 0x00, 0xc0, 0x4f, 0xd7, 0x05, 0xa2);
+
+/*****************************************************************************
+ * IWebBrowser interface
+ */
+#define ICOM_INTERFACE IWebBrowser
+#define IWebBrowser_METHODS \
+	ICOM_METHOD(HRESULT,GoBack) \
+	ICOM_METHOD(HRESULT,GoForward) \
+	ICOM_METHOD(HRESULT,GoHome) \
+	ICOM_METHOD(HRESULT,GoSearch) \
+	ICOM_METHOD5(HRESULT,Navigate, BSTR*,URL, VARIANT*,Flags, VARIANT*,TargetFrameName, \
+                                       VARIANT*,PostData, VARIANT*,Headers) \
+	ICOM_METHOD(HRESULT,Refresh) \
+	ICOM_METHOD1(HRESULT,Refresh2, VARIANT*,Level) \
+	ICOM_METHOD(HRESULT,Stop) \
+	ICOM_METHOD1(HRESULT,get_Application, void**,ppDisp) \
+	ICOM_METHOD1(HRESULT,get_Parent, void**,ppDisp) \
+	ICOM_METHOD1(HRESULT,get_Container, void**,ppDisp) \
+	ICOM_METHOD1(HRESULT,get_Document, void**,ppDisp) \
+	ICOM_METHOD1(HRESULT,get_TopLevelContainer, VARIANT*,pBool) \
+	ICOM_METHOD1(HRESULT,get_Type, BSTR*,Type) \
+	ICOM_METHOD1(HRESULT,get_Left, long*,pl) \
+	ICOM_METHOD1(HRESULT,put_Left, long,Left) \
+	ICOM_METHOD1(HRESULT,get_Top, long*,pl) \
+	ICOM_METHOD1(HRESULT,put_Top, long,Top) \
+	ICOM_METHOD1(HRESULT,get_Width, long*,pl) \
+	ICOM_METHOD1(HRESULT,put_Width, long,Width) \
+	ICOM_METHOD1(HRESULT,get_Height, long*,pl) \
+	ICOM_METHOD1(HRESULT,put_Height, long,Height) \
+	ICOM_METHOD1(HRESULT,get_LocationName, BSTR*,LocationName) \
+	ICOM_METHOD1(HRESULT,get_LocationURL, BSTR*,LocationURL) \
+	ICOM_METHOD1(HRESULT,get_Busy, VARIANT*,pBool)
+#define IWebBrowser_IMETHODS \
+	IDispatch_METHODS \
+	IWebBrowser_METHODS
+ICOM_DEFINE(IWebBrowser,IDispatch)
+#undef ICOM_INTERFACE
+
+/*** IUnknown methods ***/
+#define IWebBrowser_QueryInterface(p,a,b)      ICOM_CALL2(QueryInterface,p,a,b)
+#define IWebBrowser_AddRef(p)                  ICOM_CALL (AddRef,p)
+#define IWebBrowser_Release(p)                 ICOM_CALL (Release,p)
+/*** IDispatch methods ***/
+#define IWebBrowser_GetTypeInfoCount(p,a)      ICOM_CALL1 (GetTypeInfoCount,p,a)
+#define IWebBrowser_GetTypeInfo(p,a,b,c)       ICOM_CALL3 (GetTypeInfo,p,a,b,c)
+#define IWebBrowser_GetIDsOfNames(p,a,b,c,d,e) ICOM_CALL5 (GetIDsOfNames,p,a,b,c,d,e)
+#define IWebBrowser_Invoke(p,a,b,c,d,e,f,g,h)  ICOM_CALL8 (Invoke,p,a,b,c,d,e,f,g,h)
+/*** IWebBrowserContainer methods ***/
+#define IWebBrowser_GoBack(p,a)      ICOM_CALL1(GoBack,p,a)
+#define IWebBrowser_GoForward(p,a)      ICOM_CALL1(GoForward,p,a)
+#define IWebBrowser_GoHome(p,a)      ICOM_CALL1(GoHome,p,a)
+#define IWebBrowser_GoSearch(p,a)      ICOM_CALL1(GoSearch,p,a)
+#define IWebBrowser_Navigate(p,a)      ICOM_CALL1(Navigate,p,a)
+#define IWebBrowser_Refresh(p,a)      ICOM_CALL1(Refresh,p,a)
+#define IWebBrowser_Refresh2(p,a)      ICOM_CALL1(Refresh2,p,a)
+#define IWebBrowser_Stop(p,a)      ICOM_CALL1(Stop,p,a)
+#define IWebBrowser_get_Application(p,a)      ICOM_CALL1(get_Application,p,a)
+#define IWebBrowser_get_Parent(p,a)      ICOM_CALL1(get_Parent,p,a)
+#define IWebBrowser_get_Container(p,a)      ICOM_CALL1(get_Container,p,a)
+#define IWebBrowser_get_Document(p,a)      ICOM_CALL1(get_Document,p,a)
+#define IWebBrowser_get_TopLevelContainer(p,a)      ICOM_CALL1(get_TopLevelContainer,p,a)
+#define IWebBrowser_get_Type(p,a)      ICOM_CALL1(get_Type,p,a)
+#define IWebBrowser_get_Left(p,a)      ICOM_CALL1(get_Left,p,a)
+#define IWebBrowser_put_Left(p,a)      ICOM_CALL1(put_Left,p,a)
+#define IWebBrowser_get_Top(p,a)      ICOM_CALL1(get_Top,p,a)
+#define IWebBrowser_put_Top(p,a)      ICOM_CALL1(put_Top,p,a)
+#define IWebBrowser_get_Width(p,a)      ICOM_CALL1(get_Width,p,a)
+#define IWebBrowser_put_Width(p,a)      ICOM_CALL1(put_Width,p,a)
+#define IWebBrowser_get_Height(p,a)      ICOM_CALL1(get_Height,p,a)
+#define IWebBrowser_put_Height(p,a)      ICOM_CALL1(put_Height,p,a)
+#define IWebBrowser_get_LocationName(p,a)      ICOM_CALL1(get_LocationName,p,a)
+#define IWebBrowser_get_LocationURL(p,a)      ICOM_CALL1(get_LocationURL,p,a)
+#define IWebBrowser_get_Busy(p,a)      ICOM_CALL1(get_Busy,p,a)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
+#endif /* __WINE_WINE_OBJ_WEBBROWSER_H */
diff --git a/winedefault.reg b/winedefault.reg
index 7b455a0..abaa020 100644
--- a/winedefault.reg
+++ b/winedefault.reg
@@ -151,3 +151,24 @@
 @="dsound.dll"
 "ThreadingModel"="Both"
 
+#
+# Entries for IWebBrowser
+# Used by Internet Explorer HTML-rendering control
+#
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}]
+@="Shortcut"
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}\InProcServer32]
+@="shdocvw.dll"
+"ThreadingModel"="Apartment"
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}]
+@="Shortcut"
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}\InProcServer32]
+@="shdocvw.dll"
+"ThreadingModel"="Apartment"
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}\shellex\MayChangeDefaultMenu]
+@=""
