Implemented stubs for IWebBrowser in shdocvw.dll.

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]
+@=""