diff --git a/queries/html_tags/indents.scm b/queries/html_tags/indents.scm
index 7b9d6afe1..a9e0794f5 100644
--- a/queries/html_tags/indents.scm
+++ b/queries/html_tags/indents.scm
@@ -1,9 +1,32 @@
[
- (element)
+ (
+ (element
+ (start_tag
+ (tag_name) @_not_special)
+ )
+ (#not-any-of? @_not_special "meta" "link")
+ )
+ (element (self_closing_tag))
] @indent
+; These tags are usually written one-lined and doesnt use self-closing tags so special-cased them
+; but add indent to the tag to make sure attributes inside them are still indented if written multi-lined
+(
+ (start_tag
+ (tag_name) @_special)
+ (#any-of? @_special "meta" "link")
+) @indent
+
+
+; These are the nodes that will be captured when we do `normal o`
+; But last element has already been ended, so capturing this
+; to mark end of last element
+(element (end_tag [">"] @indent_end))
+(element (self_closing_tag "/>" @indent_end))
+
+; Script/style elements aren't indented, so only branch the end tag of other elements
+(element (end_tag) @branch)
[
- (end_tag)
">"
"/>"
] @branch
diff --git a/tests/indent/html/issue-3986.html b/tests/indent/html/issue-3986.html
new file mode 100644
index 000000000..2e6d9f0d6
--- /dev/null
+++ b/tests/indent/html/issue-3986.html
@@ -0,0 +1,4 @@
+