diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 86f2ca0c471..18d3e315c77 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -925,8 +925,10 @@ static HRESULT WINAPI HTMLStyle_get_textDecorationNone(IHTMLStyle *iface, VARIAN
 static HRESULT WINAPI HTMLStyle_put_textDecorationUnderline(IHTMLStyle *iface, VARIANT_BOOL v)
 {
     HTMLStyle *This = HTMLSTYLE_THIS(iface);
-    FIXME("(%p)->(%x)\n", This, v);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%x)\n", This, v);
+
+    return set_style_attr(This, STYLEID_TEXT_DECORATION, v ? valUnderline : emptyW, 0);
 }
 
 static HRESULT WINAPI HTMLStyle_get_textDecorationUnderline(IHTMLStyle *iface, VARIANT_BOOL *p)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index feafcd187cb..bcb14ef4ea7 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -2561,6 +2561,17 @@ static void test_default_style(IHTMLStyle *style)
     ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
     ok(b == VARIANT_FALSE, "textDecorationUnderline = %x\n", b);
 
+    hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_TRUE);
+    ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
+    ok(b == VARIANT_FALSE, "textDecorationUnderline = %x\n", b);
+
+    hres = IHTMLStyle_get_textDecorationUnderline(style, &b);
+    ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
+    ok(b == VARIANT_TRUE, "textDecorationUnderline = %x\n", b);
+
+    hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_FALSE);
+    ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres);
+
     b = 0xfefe;
     hres = IHTMLStyle_get_textDecorationLineThrough(style, &b);
     ok(hres == S_OK, "get_textDecorationLineThrough failed: %08x\n", hres);