diff --git a/IHP/HSX/HaskellParser.hs b/IHP/HSX/HaskellParser.hs
--- a/IHP/HSX/HaskellParser.hs
+++ b/IHP/HSX/HaskellParser.hs
@@ -2,7 +2,6 @@
 
 import Prelude
 import GHC.Parser.Lexer (ParseResult (..), PState (..))
-import qualified GHC.Parser.Errors.Ppr as ParserErrorPpr
 import GHC.Types.SrcLoc
 import qualified GHC.Parser as Parser
 import qualified GHC.Parser.Lexer as Lexer
@@ -16,16 +15,26 @@
 import GHC
 import IHP.HSX.HsExpToTH (toExp)
 
+import GHC.Types.Error
+import GHC.Utils.Outputable hiding ((<>))
+import GHC.Utils.Error
+import qualified GHC.Types.SrcLoc as SrcLoc
+
 parseHaskellExpression :: SourcePos -> [TH.Extension] -> String -> Either (Int, Int, String) TH.Exp
 parseHaskellExpression sourcePos extensions input =
         case expr of
             POk parserState result -> Right (toExp (unLoc result))
             PFailed parserState ->
                 let
-                    error = concatMap (show . ParserErrorPpr.pprError) (parserState.errors)
-                    realLoc = (psRealLoc parserState.loc)
-                    line = srcLocLine realLoc
-                    col = srcLocCol realLoc
+                    error = renderWithContext defaultSDocContext
+                        $ vcat
+                        $ map (formatBulleted defaultSDocContext)
+                        $ map diagnosticMessage
+                        $ map errMsgDiagnostic
+                        $ sortMsgBag Nothing
+                        $ getMessages parserState.errors
+                    line = SrcLoc.srcLocLine parserState.loc.psRealLoc
+                    col = SrcLoc.srcLocCol parserState.loc.psRealLoc
                 in
                     Left (line, col, error)
     where
@@ -50,4 +59,15 @@
         parseState = Lexer.initParserState parserOpts buffer location
 
         parserOpts :: Lexer.ParserOpts
-        parserOpts = Lexer.mkParserOpts EnumSet.empty (EnumSet.fromList extensions) False False False False
+        parserOpts = Lexer.mkParserOpts (EnumSet.fromList extensions) diagOpts [] False False False False
+
+diagOpts :: DiagOpts
+diagOpts =
+    DiagOpts
+    { diag_warning_flags = EnumSet.empty
+    , diag_fatal_warning_flags = EnumSet.empty
+    , diag_warn_is_error = False
+    , diag_reverse_errors = False
+    , diag_max_errors = Nothing
+    , diag_ppr_ctx = defaultSDocContext
+    }
diff --git a/IHP/HSX/HsExpToTH.hs b/IHP/HSX/HsExpToTH.hs
--- a/IHP/HSX/HsExpToTH.hs
+++ b/IHP/HSX/HsExpToTH.hs
@@ -74,7 +74,7 @@
 toPat :: Pat.Pat GhcPs -> TH.Pat
 toPat (Pat.VarPat _ (unLoc -> name)) = TH.VarP (toName name)
 toPat (TuplePat _ p _) = TH.TupP (map (toPat . unLoc) p)
-toPat (ParPat xP lP) = (toPat . unLoc) lP
+toPat (ParPat xP _ lP _) = (toPat . unLoc) lP
 toPat (ConPat pat_con_ext ((unLoc -> name)) pat_args) = TH.ConP (toName name) (map toType []) (map (toPat . unLoc) (Pat.hsConPatArgs pat_args))
 toPat (ViewPat pat_con pat_args pat_con_ext) = error "TH.ViewPattern not implemented"
 toPat (SumPat _ _ _ _) = error "TH.SumPat not implemented"
@@ -138,7 +138,7 @@
     tupArgs = fmap ((fmap toExp) . toTupArg) args
 
 -- toExp (Expr.List _ xs)                        = TH.ListE (fmap toExp xs)
-toExp (Expr.HsPar _ e)
+toExp (Expr.HsPar _ _ e _)
   = TH.ParensE (toExp . unLoc $ e)
 
 toExp (Expr.SectionL _ (unLoc -> a) (unLoc -> b))
@@ -155,9 +155,9 @@
         let
             f (unLoc -> x) = (name, value)
                 where
-                    value = toExp $ unLoc $ hsRecFieldArg x
+                    value = toExp $ unLoc $ hfbRHS x
                     name =
-                        case unLoc (hsRecFieldLbl x) of
+                        case unLoc (hfbLHS x) of
                             Unambiguous _ (unLoc -> name) -> toName name
                             Ambiguous _ (unLoc -> name) -> toName name
         in
@@ -181,15 +181,15 @@
 
 toExp (Expr.HsProjection _ locatedFields) =
   let
-    extractFieldLabel (HsFieldLabel _ locatedStr) = locatedStr
-    extractFieldLabel _ = error "Don't know how to handle XHsFieldLabel constructor..."
+    extractFieldLabel (DotFieldOcc _ locatedStr) = locatedStr
+    extractFieldLabel _ = error "Don't know how to handle XDotFieldOcc constructor..."
   in
     TH.ProjectionE (NonEmpty.map (unpackFS . unLoc . extractFieldLabel . unLoc) locatedFields)
 
 toExp (Expr.HsGetField _ expr locatedField) =
   let
-    extractFieldLabel (HsFieldLabel _ locatedStr) = locatedStr
-    extractFieldLabel _ = error "Don't know how to handle XHsFieldLabel constructor..."
+    extractFieldLabel (DotFieldOcc _ locatedStr) = locatedStr
+    extractFieldLabel _ = error "Don't know how to handle XDotFieldOcc constructor..."
   in
     TH.GetFieldE (toExp (unLoc expr)) (unpackFS . unLoc . extractFieldLabel . unLoc $ locatedField)
 
diff --git a/IHP/HSX/Parser.hs b/IHP/HSX/Parser.hs
--- a/IHP/HSX/Parser.hs
+++ b/IHP/HSX/Parser.hs
@@ -43,7 +43,8 @@
     | PreEscapedTextNode !Text -- ^ Used in @script@ or @style@ bodies
     | SplicedNode !Haskell.Exp -- ^ Inline haskell expressions like @{myVar}@ or @{f "hello"}@
     | Children ![Node]
-    | CommentNode !Text
+    | CommentNode !Text -- ^ A Comment that is rendered in the final HTML
+    | NoRenderCommentNode -- ^ A comment that is not rendered in the final HTML
     deriving (Eq, Show)
 
 -- | Parses a HSX text and returns a 'Node'
@@ -79,7 +80,7 @@
     pure node
 
 hsxElement :: Parser Node
-hsxElement = try hsxComment <|> try hsxSelfClosingElement <|> hsxNormalElement
+hsxElement = try hsxNoRenderComment <|> try hsxComment <|> try hsxSelfClosingElement <|> hsxNormalElement
 
 manyHsxElement :: Parser Node
 manyHsxElement = do
@@ -138,7 +139,14 @@
     space
     pure (CommentNode (cs body))
 
+hsxNoRenderComment :: Parser Node
+hsxNoRenderComment = do
+    string "{-"
+    manyTill (satisfy (const True)) (string "-}")
+    space
+    pure NoRenderCommentNode
 
+
 hsxNodeAttributes :: Parser a -> Parser [Attribute]
 hsxNodeAttributes end = staticAttributes
     where
@@ -155,7 +163,7 @@
 
 hsxSplicedAttributes :: Parser Attribute
 hsxSplicedAttributes = do
-    (pos, name) <- between (string "{...") (string "}") do
+    (pos, name) <- between (do char '{'; optional space; string "...") (string "}") do
             pos <- getSourcePos
             code <- takeWhile1P Nothing (\c -> c /= '}')
             pure (pos, code)
@@ -279,7 +287,7 @@
 
 hsxElementName :: Parser Text
 hsxElementName = do
-    name <- takeWhile1P (Just "identifier") (\c -> Char.isAlphaNum c || c == '_' || c == '-')
+    name <- takeWhile1P (Just "identifier") (\c -> Char.isAlphaNum c || c == '_' || c == '-' || c == '!')
     let isValidParent = name `Set.member` parents
     let isValidLeaf = name `Set.member` leafs
     let isValidCustomWebComponent = "-" `Text.isInfixOf` name
@@ -387,6 +395,8 @@
         , "cellspacing", "cellpadding", "bgcolor", "classes"
         , "loading"
         , "frameborder", "allow", "allowfullscreen", "nonce", "referrerpolicy", "slot"
+        , "kind"
+        , "html"
         ]
 
 parents :: Set Text
@@ -578,6 +588,7 @@
         , "link"
         , "meta"
         , "param"
+        , "!DOCTYPE"
         ]
 
 stripTextNodeWhitespaces nodes = stripLastTextNodeWhitespaces (stripFirstTextNodeWhitespaces nodes)
diff --git a/IHP/HSX/QQ.hs b/IHP/HSX/QQ.hs
--- a/IHP/HSX/QQ.hs
+++ b/IHP/HSX/QQ.hs
@@ -49,6 +49,7 @@
             pure $ Megaparsec.SourcePos (TH.loc_filename loc) (Megaparsec.mkPos line) (Megaparsec.mkPos col)
 
 compileToHaskell :: Node -> TH.ExpQ
+compileToHaskell (Node "!DOCTYPE" [StaticAttribute "html" (TextValue "html")] [] True) = [| Html5.docType |]
 compileToHaskell (Node name attributes children isLeaf) =
     let
         renderedChildren = TH.listE $ map compileToHaskell children
@@ -79,6 +80,7 @@
 compileToHaskell (PreEscapedTextNode value) = [| Html5.preEscapedText value |]
 compileToHaskell (SplicedNode expression) = [| toHtml $(pure expression) |]
 compileToHaskell (CommentNode value) = [| Html5.textComment value |]
+compileToHaskell (NoRenderCommentNode) = [| mempty |]
 
 
 toStringAttribute :: Attribute -> TH.ExpQ
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -222,11 +222,11 @@
 
 ### Syntax Rules
 
-While most HTML is also valid HSX, there are some difference you need to be aware of:
+While most HTML is also valid HSX, there are some differences you need to be aware of:
 
 #### Closing Tags
 
-Tags always need to have a closing tag or be self-closing: so instead of `<br>` you need to write `<br/>`
+Tags always need to have a closing tag or be self-closing: so instead of `<br>` you need to write `<br/>`.
 
 #### JSX Differences
 
@@ -292,11 +292,11 @@
 
 ```haskell
 render user = [hsx|
-    <p>Hi {get #name user}</p>
+    <p>Hi {user.name}</p>
     {renderCountry}
 |]
     where
-        renderCountry = case get #country user of
+        renderCountry = case user.country of
             Just country -> [hsx|<p><small>{country}</small></p>|]
             Nothing -> [hsx||]
 ```
@@ -304,7 +304,7 @@
 What about if the country is a empty string? A simple solution could look like this:
 
 ```haskell
-renderCountry = case get #country user of
+renderCountry = case user.country of
     Just "" -> [hsx||]
     Just country -> [hsx|<p>from {country}!</p>|]
     Nothing -> [hsx||]
diff --git a/ihp-hsx.cabal b/ihp-hsx.cabal
--- a/ihp-hsx.cabal
+++ b/ihp-hsx.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                ihp-hsx
-version:             1.0.0
+version:             1.1.0
 synopsis:            JSX-like but for Haskell
 description:         JSX-like templating syntax for Haskell
 license:             MIT
@@ -19,15 +19,15 @@
 library
     default-language: Haskell2010
     build-depends:
-          base               >= 4.16.3 && < 4.17
-        , blaze-html         >= 0.9.1 && < 0.10
-        , bytestring         >= 0.11.3 && < 0.12
-        , template-haskell   >= 2.18.0 && < 2.19
-        , text               >= 1.2.5 && < 1.3
-        , containers         >= 0.6.5 && < 0.7
-        , blaze-markup       >= 0.8.2 && < 0.9
-        , ghc                >= 9.2.4 && < 9.3
-        , megaparsec         >= 9.2.1 && < 9.3
+          base >= 4.17.0 && < 4.18
+        , blaze-html >= 0.9.1 && < 0.10
+        , bytestring >= 0.11.3 && < 0.12
+        , template-haskell >= 2.19.0 && < 2.20
+        , text >= 2.0.1 && < 2.1
+        , containers >= 0.6.6 && < 0.7
+        , blaze-markup >= 0.8.2 && < 0.9
+        , ghc >= 9.4.4 && < 9.5
+        , megaparsec >= 9.2.2 && < 9.3
         , string-conversions >= 0.4.0 && < 0.5
     default-extensions:
         OverloadedStrings
@@ -74,7 +74,11 @@
         -Winaccessible-code
         -Wmissed-specialisations
         -Wall-missed-specialisations
+        -fspecialise-aggressively
+        -funfolding-use-threshold=120
+        -fdicts-strict
         -fexpose-all-unfoldings
+        -optc-O3
     hs-source-dirs: .
     exposed-modules:
         IHP.HSX.Parser
