diff --git a/stdlib/2.7/HTMLParser.pyi b/stdlib/2.7/HTMLParser.pyi
new file mode 100644
index 000000000..ae6c3099a
--- /dev/null
+++ b/stdlib/2.7/HTMLParser.pyi
@@ -0,0 +1,28 @@
+from typing import List, Tuple, AnyStr
+from markupbase import ParserBase
+
+class HTMLParser(ParserBase):
+ def __init__(self, *args, convert_charrefs: bool) -> None: ...
+ def feed(self, feed: AnyStr) -> None: ...
+ def close(self) -> None: ...
+ def reset(self) -> None: ...
+
+ def get_starttag_text(self) -> AnyStr: ...
+ def set_cdata_mode(self, AnyStr) -> None: ...
+ def clear_cdata_mode(self) -> None: ...
+
+ def handle_startendtag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_starttag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_endtag(self, tag: AnyStr): ...
+ def handle_charref(self, name: AnyStr): ...
+ def handle_entityref(self, name: AnyStr): ...
+ def handle_data(self, data: AnyStr): ...
+ def handle_comment(self, data: AnyStr): ...
+ def handle_decl(self, decl: AnyStr): ...
+ def handle_pi(self, data: AnyStr): ...
+
+ def unknown_decl(self, data: AnyStr): ...
+
+ def unescape(self, s: AnyStr) -> AnyStr: ...
+
+class HTMLParseError(Exception): ...
diff --git a/stdlib/2.7/markupbase.pyi b/stdlib/2.7/markupbase.pyi
new file mode 100644
index 000000000..129b49b90
--- /dev/null
+++ b/stdlib/2.7/markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+ def __init__(self) -> None: ...
+ def error(self, message: str) -> None: ...
+ def reset(self) -> None: ...
+ def getpos(self) -> Tuple[int, int]: ...
+
+ def unkown_decl(self, data: str) -> None: ...
diff --git a/stdlib/3/_markupbase.pyi b/stdlib/3/_markupbase.pyi
new file mode 100644
index 000000000..129b49b90
--- /dev/null
+++ b/stdlib/3/_markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+ def __init__(self) -> None: ...
+ def error(self, message: str) -> None: ...
+ def reset(self) -> None: ...
+ def getpos(self) -> Tuple[int, int]: ...
+
+ def unkown_decl(self, data: str) -> None: ...
diff --git a/stdlib/3/html/__init__.pyi b/stdlib/3/html/__init__.pyi
index e69de29bb..c8577ea2e 100644
--- a/stdlib/3/html/__init__.pyi
+++ b/stdlib/3/html/__init__.pyi
@@ -0,0 +1,4 @@
+from typing import AnyStr
+
+def escape(s: AnyStr, quote: bool) -> AnyStr: ...
+def unescape(s: AnyStr) -> AnyStr: ...
diff --git a/stdlib/3/html/parser.pyi b/stdlib/3/html/parser.pyi
new file mode 100644
index 000000000..4328f3f77
--- /dev/null
+++ b/stdlib/3/html/parser.pyi
@@ -0,0 +1,28 @@
+from typing import AnyStr, List, Tuple
+from _markupbase import ParserBase
+
+class HTMLParser(ParserBase):
+ def __init__(self, *args, convert_charrefs: bool) -> None: ...
+ def feed(self, feed: AnyStr) -> None: ...
+ def close(self) -> None: ...
+ def reset(self) -> None: ...
+
+ def get_starttag_text(self) -> AnyStr: ...
+ def set_cdata_mode(self, AnyStr) -> None: ...
+ def clear_cdata_mode(self) -> None: ...
+
+ def handle_startendtag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_starttag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_endtag(self, tag: AnyStr): ...
+ def handle_charref(self, name: AnyStr): ...
+ def handle_entityref(self, name: AnyStr): ...
+ def handle_data(self, data: AnyStr): ...
+ def handle_comment(self, data: AnyStr): ...
+ def handle_decl(self, decl: AnyStr): ...
+ def handle_pi(self, data: AnyStr): ...
+
+ def unknown_decl(self, data: AnyStr): ...
+
+ def unescape(self, s: AnyStr) -> AnyStr: ...
+
+class HTMLParseError(Exception): ...
diff --git a/third_party/2.7/six/moves/__init__.pyi b/third_party/2.7/six/moves/__init__.pyi
index aef863dec..2329d9156 100644
--- a/third_party/2.7/six/moves/__init__.pyi
+++ b/third_party/2.7/six/moves/__init__.pyi
@@ -20,6 +20,7 @@ from __builtin__ import xrange as xrange
from itertools import izip as zip
from itertools import izip_longest as zip_longest
import six.moves.cPickle as cPickle
+import HTMLParser as html_parser
import six.moves.urllib_parse as urllib_parse
import six.moves.urllib_error as urllib_error
diff --git a/third_party/3/six/moves/__init__.pyi b/third_party/3/six/moves/__init__.pyi
index 00dedd754..e7d36321b 100644
--- a/third_party/3/six/moves/__init__.pyi
+++ b/third_party/3/six/moves/__init__.pyi
@@ -23,6 +23,7 @@ from builtins import range as xrange
from builtins import zip as zip
from itertools import zip_longest as zip_longest
import six.moves.cPickle as cPickle
+import html.parser as html_parser
import six.moves.urllib_parse as urllib_parse
import six.moves.urllib_error as urllib_error