diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 986397c1b48..0a41522fa8f 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1442,11 +1442,55 @@ static HRESULT WINAPI HTMLDocument_createStyleSheet(IHTMLDocument2 *iface, BSTR
LONG lIndex, IHTMLStyleSheet **ppnewStyleSheet)
{
HTMLDocument *This = impl_from_IHTMLDocument2(iface);
+ nsIDOMHTMLHeadElement *head_elem;
+ IHTMLStyleElement *style_elem;
+ HTMLElement *elem;
+ nsresult nsres;
+ HRESULT hres;
- FIXME("(%p)->(%s %d %p) semi-stub\n", This, debugstr_w(bstrHref), lIndex, ppnewStyleSheet);
+ static const WCHAR styleW[] = {'s','t','y','l','e',0};
- *ppnewStyleSheet = HTMLStyleSheet_Create(NULL);
- return S_OK;
+ TRACE("(%p)->(%s %d %p)\n", This, debugstr_w(bstrHref), lIndex, ppnewStyleSheet);
+
+ if(!This->doc_node->nsdoc) {
+ FIXME("not a real doc object\n");
+ return E_NOTIMPL;
+ }
+
+ if(lIndex != -1)
+ FIXME("Unsupported lIndex %d\n", lIndex);
+
+ if(bstrHref) {
+ FIXME("semi-stub for href %s\n", debugstr_w(bstrHref));
+ *ppnewStyleSheet = HTMLStyleSheet_Create(NULL);
+ return S_OK;
+ }
+
+ hres = create_element(This->doc_node, styleW, &elem);
+ if(FAILED(hres))
+ return hres;
+
+ nsres = nsIDOMHTMLDocument_GetHead(This->doc_node->nsdoc, &head_elem);
+ if(NS_SUCCEEDED(nsres)) {
+ nsIDOMNode *tmp_node;
+
+ nsres = nsIDOMHTMLHeadElement_AppendChild(head_elem, (nsIDOMNode*)elem->nselem, &tmp_node);
+ nsIDOMHTMLHeadElement_Release(head_elem);
+ if(NS_SUCCEEDED(nsres) && tmp_node)
+ nsIDOMNode_Release(tmp_node);
+ }
+ if(NS_FAILED(nsres)) {
+ IHTMLElement_Release(&elem->IHTMLElement_iface);
+ return E_FAIL;
+ }
+
+ hres = IHTMLElement_QueryInterface(&elem->IHTMLElement_iface, &IID_IHTMLStyleElement, (void**)&style_elem);
+ assert(hres == S_OK);
+ IHTMLElement_Release(&elem->IHTMLElement_iface);
+
+ hres = IHTMLStyleElement_get_styleSheet(style_elem, ppnewStyleSheet);
+ IHTMLStyleElement_Release(style_elem);
+ return hres;
}
static const IHTMLDocument2Vtbl HTMLDocumentVtbl = {