Added an initial (mostly stub) implementation of MSHTML.DLL.

diff --git a/configure b/configure
index f67b913..ddfc435 100755
--- a/configure
+++ b/configure
@@ -16712,7 +16712,7 @@
 MAKE_PROG_RULES=programs/Makeprog.rules
 
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3dx8/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msdmo/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrtd/Makefile dlls/msvideo/Makefile dlls/msvideo/msrle32/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winenas/Makefile dlls/winmm/winejack/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/uuid/Makefile libs/wine/Makefile libs/wpp/Makefile miscemu/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/regtest/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile"
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3dx8/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrtd/Makefile dlls/msvideo/Makefile dlls/msvideo/msrle32/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winenas/Makefile dlls/winmm/winejack/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/uuid/Makefile libs/wine/Makefile libs/wpp/Makefile miscemu/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/regtest/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile"
 
 
 cat >confcache <<\_ACEOF
@@ -17302,6 +17302,7 @@
   "dlls/msacm/msg711/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/msg711/Makefile" ;;
   "dlls/msacm/winemp3/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/winemp3/Makefile" ;;
   "dlls/msdmo/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msdmo/Makefile" ;;
+  "dlls/mshtml/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mshtml/Makefile" ;;
   "dlls/msi/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msi/Makefile" ;;
   "dlls/msimg32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msimg32/Makefile" ;;
   "dlls/msisys/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msisys/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 05a06df..a7df4ca 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1452,6 +1452,7 @@
 dlls/msacm/msg711/Makefile
 dlls/msacm/winemp3/Makefile
 dlls/msdmo/Makefile
+dlls/mshtml/Makefile
 dlls/msi/Makefile
 dlls/msimg32/Makefile
 dlls/msisys/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index eea9cd4..1abc45f 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -58,6 +58,7 @@
 	msacm/msg711 \
 	msacm/winemp3 \
 	msdmo \
+	mshtml \
 	msi \
 	msimg32 \
 	msisys \
@@ -248,6 +249,7 @@
 	msadp32.acm$(DLLEXT) \
 	msdmo.dll$(DLLEXT) \
 	msg711.acm$(DLLEXT) \
+	mshtml.dll$(DLLEXT) \
 	msi.dll$(DLLEXT) \
 	msimg32.dll$(DLLEXT) \
 	msisys.ocx$(DLLEXT) \
@@ -484,6 +486,9 @@
 msg711.acm$(DLLEXT): msacm/msg711/msg711.acm$(DLLEXT)
 	$(RM) $@ && $(LN_S) msacm/msg711/msg711.acm$(DLLEXT) $@
 
+mshtml.dll$(DLLEXT): mshtml/mshtml.dll$(DLLEXT)
+	$(RM) $@ && $(LN_S) mshtml/mshtml.dll$(DLLEXT) $@
+
 msi.dll$(DLLEXT): msi/msi.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) msi/msi.dll$(DLLEXT) $@
 
@@ -724,6 +729,7 @@
 	libmpr \
 	libmsacm32 \
 	libmsdmo \
+	libmshtml \
 	libmsi \
 	libmsimg32 \
 	libmsnet32 \
@@ -1000,6 +1006,11 @@
 libmsdmo.a: msdmo/msdmo.spec.def
 	$(DLLTOOL) -k -l $@ -d msdmo/msdmo.spec.def
 
+libmshtml.def: mshtml/mshtml.spec.def
+	$(RM) $@ && $(LN_S) mshtml/mshtml.spec.def $@
+libmshtml.a: mshtml/mshtml.spec.def
+	$(DLLTOOL) -k -l $@ -d mshtml/mshtml.spec.def
+
 libmsi.def: msi/msi.spec.def
 	$(RM) $@ && $(LN_S) msi/msi.spec.def $@
 libmsi.a: msi/msi.spec.def
@@ -1319,6 +1330,7 @@
 mpr/mpr.spec.def: $(WINEBUILD)
 msacm/msacm32.spec.def: $(WINEBUILD)
 msdmo/msdmo.spec.def: $(WINEBUILD)
+mshtml/mshtml.spec.def: $(WINEBUILD)
 msi/msi.spec.def: $(WINEBUILD)
 msimg32/msimg32.spec.def: $(WINEBUILD)
 msnet32/msnet32.spec.def: $(WINEBUILD)
@@ -1436,6 +1448,7 @@
 msacm/msadp32/msadp32.acm$(DLLEXT): msacm/msadp32
 msdmo/msdmo.dll$(DLLEXT): msdmo
 msacm/msg711/msg711.acm$(DLLEXT): msacm/msg711
+mshtml/mshtml.dll$(DLLEXT): mshtml
 msi/msi.dll$(DLLEXT): msi
 msimg32/msimg32.dll$(DLLEXT): msimg32
 msisys/msisys.ocx$(DLLEXT): msisys
diff --git a/dlls/mshtml/.cvsignore b/dlls/mshtml/.cvsignore
new file mode 100644
index 0000000..18b485b4
--- /dev/null
+++ b/dlls/mshtml/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+mshtml.dll.dbg.c
+mshtml.spec.c
+mshtml.spec.def
diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in
new file mode 100644
index 0000000..fcfaa47
--- /dev/null
+++ b/dlls/mshtml/Makefile.in
@@ -0,0 +1,19 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = mshtml.dll
+IMPORTS   = user32 advapi32 kernel32 ntdll
+EXTRALIBS = $(LIBUNICODE) $(LIBUUID)
+EXTRADEFS = -DCOM_NO_WINDOWS_H
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = \
+	document.c \
+	main.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/mshtml/document.c b/dlls/mshtml/document.c
new file mode 100644
index 0000000..ce9e74e
--- /dev/null
+++ b/dlls/mshtml/document.c
@@ -0,0 +1,767 @@
+/*
+ *    HTML Document class
+ *
+ * Copyright 2003 Mike McCormack
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "docobj.h"
+#include "ole2.h"
+#include "uuids.h"
+#include "urlmon.h"
+#include "oleidl.h"
+#include "objidl.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+
+typedef struct _HTMLDocument_impl {
+    ICOM_VTABLE(IPersistMoniker) *IPersistMoniker_vtbl;
+    ICOM_VTABLE(IPersistFile) *IPersistFile_vtbl;
+    ICOM_VTABLE(IPersist) *IPersist_vtbl;
+    ICOM_VTABLE(IOleObject) *IOleObject_vtbl;
+    ICOM_VTABLE(IViewObject) *IViewObject_vtbl;
+    ICOM_VTABLE(IOleDocument) *IOleDocument_vtbl;
+    ULONG ref_count;
+    IOleClientSite *site;
+} HTMLDocument_impl;
+
+
+static ULONG WINAPI HTMLDocument_AddRef(HTMLDocument_impl *This)
+{
+    return ++This->ref_count;
+}
+
+static ULONG WINAPI HTMLDocument_Release(HTMLDocument_impl *This)
+{
+    ULONG count;
+
+    count = --This->ref_count ;
+    if( !count )
+        HeapFree( GetProcessHeap(), 0, This );
+    
+    return count;
+}
+
+static HRESULT WINAPI HTMLDocument_QueryInterface(
+         HTMLDocument_impl *This, REFIID riid, LPVOID *ppv)
+{
+    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppv);
+
+    if( IsEqualGUID( riid, &IID_IUnknown ) )
+    {
+        TRACE("returning IUnknown\n");
+        HTMLDocument_AddRef(This);
+        *ppv = This;
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IPersistMoniker ) )
+    {
+        TRACE("returning IPersistMoniker\n");
+        HTMLDocument_AddRef(This);
+        *ppv = This;
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IPersistFile ) )
+    {
+        TRACE("returning IPersistFile\n");
+        HTMLDocument_AddRef(This);
+        *ppv = &(This->IPersistFile_vtbl);
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IOleObject ) )
+    {
+        TRACE("returning IOleObject\n");
+        HTMLDocument_AddRef(This);
+        *ppv = &(This->IOleObject_vtbl);
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IPersist ) )
+    {
+        TRACE("returning IPersist\n");
+        HTMLDocument_AddRef(This);
+        *ppv = &(This->IPersist_vtbl);
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IViewObject ) )
+    {
+        TRACE("returning IViewObject\n");
+        HTMLDocument_AddRef(This);
+        *ppv = &(This->IViewObject_vtbl);
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IOleDocument ) )
+    {
+        TRACE("returning IOleDocument\n");
+        HTMLDocument_AddRef(This);
+        *ppv = &(This->IOleDocument_vtbl);
+        return S_OK;
+    }
+    if( IsEqualGUID( riid, &IID_IDispatch ) )
+    {
+        TRACE("returning IDispatch\n");
+    }
+    if( IsEqualGUID( riid, &IID_IOleCommandTarget ) )
+    {
+        TRACE("returning IOleCommandTarget\n");
+    }
+    return E_NOINTERFACE;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_QueryInterface(
+         IPersistMoniker *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static ULONG WINAPI fnIPersistMoniker_AddRef(IPersistMoniker *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIPersistMoniker_Release(IPersistMoniker *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIPersistMoniker_GetClassID(IPersistMoniker *iface,
+           CLSID *pClassID )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    FIXME("%p\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_IsDirty(IPersistMoniker *iface )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    FIXME("%p\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_Load(IPersistMoniker *iface,
+           BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    IStream *stm;
+    HRESULT r;
+    unsigned char buffer[0x201];
+    ULONG count;
+
+    TRACE("%p %d %p %p %08lx\n", This, 
+          fFullyAvailable, pimkName, pibc, grfMode);
+
+    r = IMoniker_BindToStorage( pimkName, pibc, NULL, 
+                                &IID_IStream, (LPVOID*) &stm );
+    if( FAILED( r ) )
+    {
+        TRACE("IMoniker_BindToStorage failed %08lx\n", r);
+        return r;
+    }
+
+    while( 1 )
+    {
+        r = IStream_Read( stm, buffer, sizeof buffer-1, &count);
+        if( FAILED( r ) )
+            break;
+        if( count == 0 )
+            break;
+        buffer[count]=0;
+        TRACE("%s\n",buffer);
+    }
+
+    IStream_Release( stm );
+
+    return S_OK;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_Save(IPersistMoniker *iface,
+           IMoniker *pinkName, LPBC pibc, BOOL fRemember )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    FIXME("%p %p %p %d\n", This, pinkName, pibc, fRemember);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_SaveCompleted(IPersistMoniker *iface,
+           IMoniker *pinkName, LPBC pibc )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    FIXME("%p %p %p\n", This, pinkName, pibc);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistMoniker_GetCurMoniker(IPersistMoniker *iface,
+           IMoniker **pinkName )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistMoniker_vtbl, iface);
+    FIXME("%p\n", This);
+    return E_NOTIMPL;
+}
+
+static ICOM_VTABLE(IPersistMoniker) IPersistMoniker_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIPersistMoniker_QueryInterface,
+    fnIPersistMoniker_AddRef,
+    fnIPersistMoniker_Release,
+    fnIPersistMoniker_GetClassID,
+    fnIPersistMoniker_IsDirty,
+    fnIPersistMoniker_Load,
+    fnIPersistMoniker_Save,
+    fnIPersistMoniker_SaveCompleted,
+    fnIPersistMoniker_GetCurMoniker
+};
+
+static ULONG WINAPI fnIPersistFile_AddRef(IPersistFile *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIPersistFile_Release(IPersistFile *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIPersistFile_QueryInterface(
+           IPersistFile *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static HRESULT WINAPI fnIPersistFile_GetClassID(IPersistFile *iface,
+           CLSID *pClassID )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+
+    TRACE("%p\n", This);
+
+    memcpy( pClassID, &CLSID_HTMLDocument, sizeof CLSID_HTMLDocument);
+    return S_OK;
+}
+
+static HRESULT WINAPI fnIPersistFile_IsDirty(IPersistFile *iface )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistFile_Load(IPersistFile *iface,
+           LPCOLESTR pszFileName, DWORD grfMode )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    FIXME("%p %s %08lx\n", This, debugstr_w(pszFileName), grfMode);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistFile_Save(IPersistFile *iface, 
+           LPCOLESTR pszFileName, BOOL fRemember )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    FIXME("%p %s %d\n", This, debugstr_w(pszFileName), fRemember);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistFile_SaveCompleted(IPersistFile *iface,
+           LPCOLESTR pszFileName )
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    FIXME("%p %s\n", This, debugstr_w(pszFileName));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIPersistFile_GetCurFile(IPersistFile *iface,
+           LPOLESTR* ppszFileName)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersistFile_vtbl, iface);
+    FIXME("%p %p\n",This,ppszFileName);
+    return E_NOTIMPL;
+}
+
+static ICOM_VTABLE(IPersistFile) IPersistFile_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIPersistFile_QueryInterface,
+    fnIPersistFile_AddRef,
+    fnIPersistFile_Release,
+    fnIPersistFile_GetClassID,
+    fnIPersistFile_IsDirty,
+    fnIPersistFile_Load,
+    fnIPersistFile_Save,
+    fnIPersistFile_SaveCompleted,
+    fnIPersistFile_GetCurFile,
+};
+
+static ULONG WINAPI fnIOleObject_AddRef(IOleObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIOleObject_Release(IOleObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIOleObject_QueryInterface(
+           IOleObject *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static HRESULT WINAPI fnIOleObject_SetClientSite(IOleObject *iface,
+           IOleClientSite *pClientSite)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+
+    TRACE("%p %p\n",This, pClientSite);
+
+    if( This->site )
+        IOleClientSite_Release( This->site );
+    if( pClientSite )
+        IOleClientSite_AddRef(pClientSite);
+    This->site = pClientSite;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI fnIOleObject_GetClientSite(IOleObject *iface,
+           IOleClientSite **ppClientSite)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+
+    TRACE("%p\n",This);
+
+    if( This->site )
+        IOleClientSite_AddRef( This->site );
+    *ppClientSite = This->site;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI fnIOleObject_SetHostNames(IOleObject *iface,
+           LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_Close(IOleObject *iface,
+           DWORD dwSaveOption)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_SetMoniker(IOleObject *iface,
+           DWORD dwWhichMoniker, IMoniker *pmk)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetMoniker(IOleObject *iface,
+           DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_InitFromData(IOleObject *iface,
+           IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetClipboardData(IOleObject *iface,
+           DWORD dwReserved, IDataObject **ppDataObject)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_DoVerb(IOleObject *iface,
+           LONG iVerb, struct tagMSG *lpmsg, IOleClientSite *pActiveSite,
+           LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+
+    TRACE("%p %ld %p %p %ld %p %p\n", This, 
+          iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
+
+    switch( iVerb )
+    {
+    case OLEIVERB_SHOW:
+        TRACE("OLEIVERB_SHOW  r = (%ld,%ld)-(%ld,%ld)\n",
+              lprcPosRect->left,  lprcPosRect->top,
+              lprcPosRect->right, lprcPosRect->bottom );
+        break;
+    }
+
+    /*return E_NOTIMPL; */
+    return S_OK;
+}
+
+static HRESULT WINAPI fnIOleObject_EnumVerbs(IOleObject *iface,
+           IEnumOLEVERB **ppEnumOleVerb)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_Update(IOleObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_IsUpToDate(IOleObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetUserClassID(IOleObject *iface,
+           CLSID *pClsid)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetUserType(IOleObject *iface,
+           DWORD dwFormOfType, LPOLESTR *pszUserType)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_SetExtent(IOleObject *iface,
+           DWORD dwDrawAspect, SIZEL *psizel)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetExtent(IOleObject *iface,
+           DWORD dwDrawAspect, SIZEL *psizel)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_Advise(IOleObject *iface,
+           IAdviseSink *pAdvSink, DWORD *pdwConnection)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_Unadvise(IOleObject *iface,
+           DWORD dwConnection)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_EnumAdvise(IOleObject *iface,
+           IEnumSTATDATA **ppenumAdvise)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_GetMiscStatus(IOleObject *iface,
+           DWORD dwAspect, DWORD *pdwStatus)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleObject_SetColorScheme(IOleObject *iface,
+           struct tagLOGPALETTE *pLogpal)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleObject_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static ICOM_VTABLE(IOleObject) IOleObject_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIOleObject_QueryInterface,
+    fnIOleObject_AddRef,
+    fnIOleObject_Release,
+    fnIOleObject_SetClientSite,
+    fnIOleObject_GetClientSite,
+    fnIOleObject_SetHostNames,
+    fnIOleObject_Close,
+    fnIOleObject_SetMoniker,
+    fnIOleObject_GetMoniker,
+    fnIOleObject_InitFromData,
+    fnIOleObject_GetClipboardData,
+    fnIOleObject_DoVerb,
+    fnIOleObject_EnumVerbs,
+    fnIOleObject_Update,
+    fnIOleObject_IsUpToDate,
+    fnIOleObject_GetUserClassID,
+    fnIOleObject_GetUserType,
+    fnIOleObject_SetExtent,
+    fnIOleObject_GetExtent,
+    fnIOleObject_Advise,
+    fnIOleObject_Unadvise,
+    fnIOleObject_EnumAdvise,
+    fnIOleObject_GetMiscStatus,
+    fnIOleObject_SetColorScheme,
+};
+
+static ULONG WINAPI fnIPersist_AddRef(IPersist *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersist_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIPersist_Release(IPersist *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersist_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIPersist_QueryInterface(
+           IPersist *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersist_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static HRESULT WINAPI fnIPersist_GetClassID(
+           IPersist *iface, CLSID * pClassID)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IPersist_vtbl, iface);
+    TRACE("%p %p\n", This, pClassID );
+    memcpy( pClassID, &CLSID_HTMLDocument, sizeof CLSID_HTMLDocument);
+    return S_OK;
+}
+
+static ICOM_VTABLE(IPersist) IPersist_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIPersist_QueryInterface,
+    fnIPersist_AddRef,
+    fnIPersist_Release,
+    fnIPersist_GetClassID,
+};
+
+static ULONG WINAPI fnIViewObject_AddRef(IViewObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIViewObject_Release(IViewObject *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIViewObject_QueryInterface(
+           IViewObject *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static HRESULT WINAPI fnIViewObject_Draw( IViewObject *iface,
+           DWORD dwDrawAspect, LONG lindex, void *pvAspect,
+           DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw,
+           LPCRECTL lprcBounds, LPCRECTL lprcWBounds, 
+           BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue),
+           DWORD dwContinue)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIViewObject_GetColorSet( IViewObject *iface,
+            DWORD dwDrawAspect, LONG lindex, void *pvAspect,
+            DVTARGETDEVICE *ptd, HDC hicTargetDevice,
+            struct tagLOGPALETTE **ppColorSet)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIViewObject_Freeze( IViewObject *iface,
+           DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIViewObject_Unfreeze( IViewObject *iface,
+           DWORD dwFreeze)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIViewObject_SetAdvise( IViewObject *iface,
+           DWORD aspects, DWORD advf, IAdviseSink *pAdvSink)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIViewObject_GetAdvise( IViewObject *iface,
+           DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IViewObject_vtbl, iface);
+    FIXME("%p\n",This);
+    return E_NOTIMPL;
+}
+
+
+static ICOM_VTABLE(IViewObject) IViewObject_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIViewObject_QueryInterface,
+    fnIViewObject_AddRef,
+    fnIViewObject_Release,
+    fnIViewObject_Draw,
+    fnIViewObject_GetColorSet,
+    fnIViewObject_Freeze,
+    fnIViewObject_Unfreeze,
+    fnIViewObject_SetAdvise,
+    fnIViewObject_GetAdvise,
+};
+
+static ULONG WINAPI fnIOleDocument_AddRef(IOleDocument *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    return HTMLDocument_AddRef(This);
+}
+
+static ULONG WINAPI fnIOleDocument_Release(IOleDocument *iface)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    return HTMLDocument_Release(This);
+}
+
+static HRESULT WINAPI fnIOleDocument_QueryInterface(
+           IOleDocument *iface, REFIID riid, LPVOID *ppv)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    return HTMLDocument_QueryInterface(This, riid, ppv);
+}
+
+static HRESULT WINAPI fnIOleDocument_CreateView(IOleDocument *iface,
+           IOleInPlaceSite *pIPSite, IStream *pstm, DWORD dwReserved, 
+           IOleDocumentView **ppView)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleDocument_GetDocMiscStatus(IOleDocument *iface,
+           DWORD *pdwStatus)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIOleDocument_EnumViews(IOleDocument *iface,
+           IEnumOleDocumentViews **ppEnum, IOleDocumentView **ppView)
+{
+    ICOM_THIS_MULTI(HTMLDocument_impl, IOleDocument_vtbl, iface);
+    TRACE("%p\n",This);
+    return E_NOTIMPL;
+}
+
+static ICOM_VTABLE(IOleDocument) IOleDocument_vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    fnIOleDocument_QueryInterface,
+    fnIOleDocument_AddRef,
+    fnIOleDocument_Release,
+    fnIOleDocument_CreateView,
+    fnIOleDocument_GetDocMiscStatus,
+    fnIOleDocument_EnumViews,
+};
+
+HRESULT HTMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
+{
+    HTMLDocument_impl *This;
+
+    TRACE("%p %p\n",pUnkOuter,ppObj);
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof (HTMLDocument_impl));
+    This->IPersistMoniker_vtbl = &IPersistMoniker_vtbl;
+    This->IPersistFile_vtbl = &IPersistFile_vtbl;
+    This->IOleObject_vtbl = &IOleObject_vtbl;
+    This->IPersist_vtbl = &IPersist_vtbl;
+    This->IViewObject_vtbl = &IViewObject_vtbl;
+    This->IOleDocument_vtbl = &IOleDocument_vtbl;
+    This->ref_count = 1;
+    This->site = NULL;
+
+    *ppObj = (LPVOID) This;
+
+    TRACE("(%p) <- %p\n", ppObj, This);
+    
+    return S_OK;
+}
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
new file mode 100644
index 0000000..6dad70b
--- /dev/null
+++ b/dlls/mshtml/main.c
@@ -0,0 +1,198 @@
+/*
+ *    MSHTML Class Factory
+ *
+ * Copyright 2002 Lionel Ulmer
+ * Copyright 2003 Mike McCormack
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "ole2.h"
+
+#include "uuids.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+
+extern HRESULT HTMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj);
+
+/* For the moment, do nothing here. */
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
+{
+    switch(fdwReason) {
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hInstDLL);
+	    break;
+	case DLL_PROCESS_DETACH:
+	    break;
+    }
+    return TRUE;
+}
+
+/******************************************************************************
+ * MSHTML ClassFactory
+ */
+typedef struct {
+    IClassFactory ITF_IClassFactory;
+
+    DWORD ref;
+    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
+} IClassFactoryImpl;
+
+struct object_creation_info
+{
+    const CLSID *clsid;
+    LPCSTR szClassName;
+    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
+};
+
+static const struct object_creation_info object_creation[] =
+{
+    { &CLSID_HTMLDocument, "HTMLDocument", HTMLDocument_create },
+};
+
+static HRESULT WINAPI
+HTMLCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
+{
+    ICOM_THIS(IClassFactoryImpl,iface);
+
+    if (IsEqualGUID(riid, &IID_IUnknown)
+	|| IsEqualGUID(riid, &IID_IClassFactory))
+    {
+	IClassFactory_AddRef(iface);
+	*ppobj = This;
+	return S_OK;
+    }
+
+    WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HTMLCF_AddRef(LPCLASSFACTORY iface) {
+    ICOM_THIS(IClassFactoryImpl,iface);
+    return ++(This->ref);
+}
+
+static ULONG WINAPI HTMLCF_Release(LPCLASSFACTORY iface) {
+    ICOM_THIS(IClassFactoryImpl,iface);
+
+    ULONG ref = --This->ref;
+
+    if (ref == 0)
+	HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+
+static HRESULT WINAPI HTMLCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
+					  REFIID riid, LPVOID *ppobj) {
+    ICOM_THIS(IClassFactoryImpl,iface);
+    HRESULT hres;
+    LPUNKNOWN punk;
+    
+    TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+
+    hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
+    if (FAILED(hres)) {
+        *ppobj = NULL;
+        return hres;
+    }
+    hres = IUnknown_QueryInterface(punk, riid, ppobj);
+    if (FAILED(hres)) {
+        *ppobj = NULL;
+	return hres;
+    }
+    IUnknown_Release(punk);
+    return hres;
+}
+
+static HRESULT WINAPI HTMLCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+    ICOM_THIS(IClassFactoryImpl,iface);
+    FIXME("(%p)->(%d),stub!\n",This,dolock);
+    return S_OK;
+}
+
+static ICOM_VTABLE(IClassFactory) HTMLCF_Vtbl =
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    HTMLCF_QueryInterface,
+    HTMLCF_AddRef,
+    HTMLCF_Release,
+    HTMLCF_CreateInstance,
+    HTMLCF_LockServer
+};
+
+
+HRESULT WINAPI MSHTML_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
+{
+    int i;
+    IClassFactoryImpl *factory;
+
+    TRACE("%s %s %p\n",debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+    
+    if ( !IsEqualGUID( &IID_IClassFactory, iid )
+	 && ! IsEqualGUID( &IID_IUnknown, iid) )
+	return E_NOINTERFACE;
+
+    for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
+    {
+	if (IsEqualGUID(object_creation[i].clsid, rclsid))
+	    break;
+    }
+
+    if (i == sizeof(object_creation)/sizeof(object_creation[0]))
+    {
+	FIXME("%s: no class found.\n", debugstr_guid(rclsid));
+	return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    TRACE("Creating a class factory for %s\n",object_creation[i].szClassName);
+
+    factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory));
+    if (factory == NULL) return E_OUTOFMEMORY;
+
+    factory->ITF_IClassFactory.lpVtbl = &HTMLCF_Vtbl;
+    factory->ref = 1;
+
+    factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
+
+    *ppv = &(factory->ITF_IClassFactory);
+
+    TRACE("(%p) <- %p\n", ppv, &(factory->ITF_IClassFactory) );
+
+    return S_OK;
+}
+
+HRESULT WINAPI MSHTML_DllCanUnloadNow(void)
+{
+    FIXME("\n");
+    return S_FALSE;
+}
+
+/* appears to have the same prototype as WinMain */
+INT WINAPI RunHTMLApplication( HINSTANCE hinst, HINSTANCE hPrevInst,
+                               LPCSTR szCmdLine, INT nCmdShow )
+{
+    FIXME("%p %p %s %d\n", hinst, hPrevInst, debugstr_a(szCmdLine), nCmdShow );
+    return 0;
+}
diff --git a/dlls/mshtml/mshtml.spec b/dlls/mshtml/mshtml.spec
new file mode 100644
index 0000000..a5effc0
--- /dev/null
+++ b/dlls/mshtml/mshtml.spec
@@ -0,0 +1,22 @@
+
+1 stub PrintHTML
+2 stub SvrTri_ClearCache
+3 stub CreateHTMLPropertyPage
+4 stdcall -private DllCanUnloadNow() MSHTML_DllCanUnloadNow
+5 stub DllEnumClassObjects
+6 stdcall -private DllGetClassObject(ptr ptr ptr) MSHTML_DllGetClassObject
+7 stub DllInstall
+8 stub DllRegisterServer
+9 stub DllUnregisterServer
+10 stub MatchExactGetIDsOfNames
+11 stub RNIGetCompatibleVersion
+12 stdcall RunHTMLApplication()
+13 stub ShowHTMLDialog
+14 stub ShowModalDialog
+15 stub ShowModelessHTMLDialog
+16 stub SvrTri_GetDLText
+17 stub SvrTri_NormalizeUA
+18 stub com_ms_osp_ospmrshl_classInit
+19 stub com_ms_osp_ospmrshl_copyToExternal
+20 stub com_ms_osp_ospmrshl_releaseByValExternal
+21 stub com_ms_osp_ospmrshl_toJava