diff --git a/compiler/GHC/Hs/Type.hs b/compiler/GHC/Hs/Type.hs
index 3bbf6d82dddfae2c2ae9513c5106c41fd59357a6..d158f967847ba1df2cc970e974048635622c12ae 100644
--- a/compiler/GHC/Hs/Type.hs
+++ b/compiler/GHC/Hs/Type.hs
@@ -1438,5 +1438,5 @@ type instance Anno (HsOuterTyVarBndrs _ (GhcPass _)) = SrcSpanAnnA
 type instance Anno HsIPName = SrcAnn NoEpAnns
 type instance Anno (ConDeclField (GhcPass p)) = SrcSpanAnnA
 
-type instance Anno (FieldOcc (GhcPass p)) = SrcAnn NoEpAnns
-type instance Anno (AmbiguousFieldOcc (GhcPass p)) = SrcAnn NoEpAnns
+type instance Anno (FieldOcc (GhcPass p)) = SrcSpanAnnA
+type instance Anno (AmbiguousFieldOcc (GhcPass p)) = SrcSpanAnnA
diff --git a/compiler/GHC/Hs/Utils.hs b/compiler/GHC/Hs/Utils.hs
index 6f1d0d71a85d2ca914b85435a4ec0b61541933f4..efb5ffff7b9479c9bd4f3745355458715137ee5c 100644
--- a/compiler/GHC/Hs/Utils.hs
+++ b/compiler/GHC/Hs/Utils.hs
@@ -387,10 +387,13 @@ mkHsIsString src s  = OverLit noExtField (HsIsString   src s)
 mkHsDo     ctxt stmts      = HsDo noAnn ctxt stmts
 mkHsDoAnns ctxt stmts anns = HsDo anns  ctxt stmts
 mkHsComp ctxt stmts expr = mkHsCompAnns ctxt stmts expr noAnn
-mkHsCompAnns ctxt stmts expr anns = mkHsDoAnns ctxt (mkLocatedList (stmts ++ [last_stmt])) anns
+mkHsCompAnns ctxt stmts expr@(L l e) anns = mkHsDoAnns ctxt (L loc (stmts ++ [last_stmt])) anns
   where
-    -- Strip the annotations from the location, they are in the embedded expr
-    last_stmt = L (noAnnSrcSpan $ getLocA expr) $ mkLastStmt expr
+    -- Move the annotations to the top of the last_stmt
+    last = mkLastStmt (L (noAnnSrcSpan $ getLocA expr) e)
+    last_stmt = L l last
+    -- last_stmt actually comes first in a list comprehension, consider all spans
+    loc  = noAnnSrcSpan $ getHasLocList (last_stmt:stmts)
 
 -- restricted to GhcPs because other phases might need a SyntaxExpr
 mkHsIf :: LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs -> EpAnn AnnsIf
diff --git a/compiler/GHC/Iface/Ext/Ast.hs b/compiler/GHC/Iface/Ext/Ast.hs
index 317daa36c5cdeb349bfb456c06d876113145e0a4..26a7ea1127fb83c8963f17ad35cfb7459664f8e5 100644
--- a/compiler/GHC/Iface/Ext/Ast.hs
+++ b/compiler/GHC/Iface/Ext/Ast.hs
@@ -1161,7 +1161,7 @@ instance HiePass p => ToHie (LocatedA (HsExpr (GhcPass p))) where
         ]
       HsUnboundVar _ _ -> []  -- there is an unbound name here, but that causes trouble
       HsRecSel _ fld ->
-        [ toHie $ RFC RecFieldOcc Nothing (L (l2l mspan:: SrcAnn NoEpAnns) fld)
+        [ toHie $ RFC RecFieldOcc Nothing (L mspan fld)
         ]
       HsOverLabel {} -> []
       HsIPVar _ _ -> []
@@ -1439,14 +1439,15 @@ instance ( ToHie (RFContext label)
       , toHie expr
       ]
 
-instance HiePass p => ToHie (RFContext (LocatedAn NoEpAnns (FieldOcc (GhcPass p)))) where
+instance HiePass p => ToHie (RFContext (LocatedA (FieldOcc (GhcPass p)))) where
   toHie (RFC c rhs (L nspan f)) = concatM $ case f of
     FieldOcc fld _ ->
       case hiePass @p of
         HieRn -> [toHie $ C (RecField c rhs) (L (locA nspan) fld)]
         HieTc -> [toHie $ C (RecField c rhs) (L (locA nspan) fld)]
 
-instance HiePass p => ToHie (RFContext (LocatedAn NoEpAnns (AmbiguousFieldOcc (GhcPass p)))) where
+instance HiePass p => ToHie (RFContext (LocatedA (AmbiguousFieldOcc (GhcPass p)))) where
+
   toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of
     Unambiguous fld _ ->
       case hiePass @p of
diff --git a/compiler/GHC/Parser.y b/compiler/GHC/Parser.y
index d73dd07923b1fc6805f2671535f42405c8b3cb20..c082c493e459217d76110cdaa364ca38db48d700 100644
--- a/compiler/GHC/Parser.y
+++ b/compiler/GHC/Parser.y
@@ -1193,7 +1193,7 @@ importlist1 :: { OrdList (LIE GhcPs) }
 
 import  :: { OrdList (LIE GhcPs) }
         : qcname_ext export_subspec {% fmap (unitOL . reLocA . (sLL $1 $>)) $ mkModuleImpExp Nothing (fst $ unLoc $2) $1 (snd $ unLoc $2) }
-        | 'module' modid            {% fmap (unitOL . reLocA) $ acs (\cs -> sLL $1 $> (IEModuleContents (Nothing, EpAnn (glR $1) [mj AnnModule $1] cs) $2)) }
+        | 'module' modid            {% fmap (unitOL . reLocA) $ acs (\cs -> sLL $1 $> (IEModuleContents (Nothing, EpAnn (glEE $1 $>) [mj AnnModule $1] cs) $2)) }
         | 'pattern' qcon            { unitOL $ reLocA $ sLL $1 $> $ IEVar Nothing (sLLa $1 $> (IEPattern (glAA $1) $2)) }
 
 -----------------------------------------------------------------------------
@@ -1255,11 +1255,11 @@ topdecl :: { LHsDecl GhcPs }
         | stand_alone_deriving                  { sL1a $1 (DerivD noExtField (unLoc $1)) }
         | role_annot                            { sL1a $1 (RoleAnnotD noExtField (unLoc $1)) }
         | 'default' '(' comma_types0 ')'        {% acsA (\cs -> sLL $1 $>
-                                                    (DefD noExtField (DefaultDecl (EpAnn (glR $1) [mj AnnDefault $1,mop $2,mcp $4] cs) $3))) }
-        | 'foreign' fdecl                       {% acsA (\cs -> sLL $1 $> ((snd $ unLoc $2) (EpAnn (glR $1) (mj AnnForeign $1:(fst $ unLoc $2)) cs))) }
-        | '{-# DEPRECATED' deprecations '#-}'   {% acsA (\cs -> sLL $1 $> $ WarningD noExtField (Warnings ((EpAnn (glR $1) [mo $1,mc $3] cs), (getDEPRECATED_PRAGs $1)) (fromOL $2))) }
-        | '{-# WARNING' warnings '#-}'          {% acsA (\cs -> sLL $1 $> $ WarningD noExtField (Warnings ((EpAnn (glR $1) [mo $1,mc $3] cs), (getWARNING_PRAGs $1)) (fromOL $2))) }
-        | '{-# RULES' rules '#-}'               {% acsA (\cs -> sLL $1 $> $ RuleD noExtField (HsRules ((EpAnn (glR $1) [mo $1,mc $3] cs), (getRULES_PRAGs $1)) (reverse $2))) }
+                                                    (DefD noExtField (DefaultDecl (EpAnn (glEE $1 $>) [mj AnnDefault $1,mop $2,mcp $4] cs) $3))) }
+        | 'foreign' fdecl                       {% acsA (\cs -> sLL $1 $> ((snd $ unLoc $2) (EpAnn (glEE $1 $>) (mj AnnForeign $1:(fst $ unLoc $2)) cs))) }
+        | '{-# DEPRECATED' deprecations '#-}'   {% acsA (\cs -> sLL $1 $> $ WarningD noExtField (Warnings ((EpAnn (glEE $1 $>) [mo $1,mc $3] cs), (getDEPRECATED_PRAGs $1)) (fromOL $2))) }
+        | '{-# WARNING' warnings '#-}'          {% acsA (\cs -> sLL $1 $> $ WarningD noExtField (Warnings ((EpAnn (glEE $1 $>) [mo $1,mc $3] cs), (getWARNING_PRAGs $1)) (fromOL $2))) }
+        | '{-# RULES' rules '#-}'               {% acsA (\cs -> sLL $1 $> $ RuleD noExtField (HsRules ((EpAnn (glEE $1 $>) [mo $1,mc $3] cs), (getRULES_PRAGs $1)) (reverse $2))) }
         | annotation { $1 }
         | decl_no_th                            { $1 }
 
@@ -1348,7 +1348,7 @@ inst_decl :: { LInstDecl GhcPs }
        {% do { (binds, sigs, _, ats, adts, _) <- cvBindsAndSigs (snd $ unLoc $5)
              ; let anns = (mj AnnInstance $1 : (fst $ unLoc $5))
              ; let cid cs = ClsInstDecl
-                                     { cid_ext = ($2, EpAnn (glR $1) anns cs, NoAnnSortKey)
+                                     { cid_ext = ($2, EpAnn (spanAsAnchor (comb3 $1 $4 $5)) anns cs, NoAnnSortKey)
                                      , cid_poly_ty = $4, cid_binds = binds
                                      , cid_sigs = mkClassOpSigs sigs
                                      , cid_tyfam_insts = ats
@@ -1398,7 +1398,7 @@ deriv_strategy_no_via :: { LDerivStrategy GhcPs }
   | 'newtype'                   {% acsA (\cs -> sL1 $1 (NewtypeStrategy (EpAnn (glR $1) [mj AnnNewtype $1] cs))) }
 
 deriv_strategy_via :: { LDerivStrategy GhcPs }
-  : 'via' sigktype          {% acsA (\cs -> sLL $1 $> (ViaStrategy (XViaStrategyPs (EpAnn (glR $1) [mj AnnVia $1] cs)
+  : 'via' sigktype          {% acsA (\cs -> sLL $1 $> (ViaStrategy (XViaStrategyPs (EpAnn (glEE $1 $>) [mj AnnVia $1] cs)
                                                                            $2))) }
 
 deriv_standalone_strategy :: { Maybe (LDerivStrategy GhcPs) }
@@ -1463,7 +1463,7 @@ ty_fam_inst_eqn :: { LTyFamInstEqn GhcPs }
                     ; tvbs <- fromSpecTyVarBndrs $2
                     ; let loc = comb2 $1 $>
                     ; cs <- getCommentsFor loc
-                    ; mkTyFamInstEqn loc (mkHsOuterExplicit (EpAnn (glR $1) (mu AnnForall $1, mj AnnDot $3) cs) tvbs) $4 $6 [mj AnnEqual $5] }}
+                    ; mkTyFamInstEqn loc (mkHsOuterExplicit (EpAnn (glEE $1 $3) (mu AnnForall $1, mj AnnDot $3) cs) tvbs) $4 $6 [mj AnnEqual $5] }}
         | type '=' ktype
               {% mkTyFamInstEqn (comb2 $1 $>) mkHsOuterImplicit $1 $3 (mj AnnEqual $2:[]) }
               -- Note the use of type for the head; this allows
@@ -1594,13 +1594,13 @@ datafam_inst_hdr :: { Located (Maybe (LHsContext GhcPs), HsOuterFamEqnTyVarBndrs
                                                          >>= \tvbs ->
                                                              (acs (\cs -> (sLL $1 $>
                                                                                   (Just ( addTrailingDarrowC $4 $5 cs)
-                                                                                        , mkHsOuterExplicit (EpAnn (glR $1) (mu AnnForall $1, mj AnnDot $3) emptyComments) tvbs, $6))))
+                                                                                        , mkHsOuterExplicit (EpAnn (glEE $1 $3) (mu AnnForall $1, mj AnnDot $3) emptyComments) tvbs, $6))))
                                                     }
         | 'forall' tv_bndrs '.' type   {% do { hintExplicitForall $1
                                              ; tvbs <- fromSpecTyVarBndrs $2
                                              ; let loc = comb2 $1 $>
                                              ; cs <- getCommentsFor loc
-                                             ; return (sL loc (Nothing, mkHsOuterExplicit (EpAnn (glR $1) (mu AnnForall $1, mj AnnDot $3) cs) tvbs, $4))
+                                             ; return (sL loc (Nothing, mkHsOuterExplicit (EpAnn (glEE $1 $3) (mu AnnForall $1, mj AnnDot $3) cs) tvbs, $4))
                                        } }
         | context '=>' type         {% acs (\cs -> (sLL $1 $>(Just (addTrailingDarrowC $1 $2 cs), mkHsOuterImplicit, $3))) }
         | type                      { sL1 $1 (Nothing, mkHsOuterImplicit, $1) }
@@ -1627,7 +1627,7 @@ stand_alone_deriving :: { LDerivDecl GhcPs }
                 {% do { let { err = text "in the stand-alone deriving instance"
                                     <> colon <+> quotes (ppr $6) }
                       ; acsA (\cs -> sLL $1 $>
-                                 (DerivDecl ($4, EpAnn (glR $1) [mj AnnDeriving $1, mj AnnInstance $3] cs) (mkHsWildCardBndrs $6) $2 $5)) }}
+                                 (DerivDecl ($4, EpAnn (glEE $1 $>) [mj AnnDeriving $1, mj AnnInstance $3] cs) (mkHsWildCardBndrs $6) $2 $5)) }}
 
 -----------------------------------------------------------------------------
 -- Role annotations
@@ -1659,19 +1659,19 @@ pattern_synonym_decl :: { LHsDecl GhcPs }
          {%      let (name, args, as ) = $2 in
                  acsA (\cs -> sLL $1 $> . ValD noExtField $ mkPatSynBind name args $4
                                                     ImplicitBidirectional
-                      (EpAnn (glR $1) (as ++ [mj AnnPattern $1, mj AnnEqual $3]) cs)) }
+                      (EpAnn (glEE $1 $>) (as ++ [mj AnnPattern $1, mj AnnEqual $3]) cs)) }
 
         | 'pattern' pattern_synonym_lhs '<-' pat
          {%    let (name, args, as) = $2 in
                acsA (\cs -> sLL $1 $> . ValD noExtField $ mkPatSynBind name args $4 Unidirectional
-                       (EpAnn (glR $1) (as ++ [mj AnnPattern $1,mu AnnLarrow $3]) cs)) }
+                       (EpAnn (glEE $1 $>) (as ++ [mj AnnPattern $1,mu AnnLarrow $3]) cs)) }
 
         | 'pattern' pattern_synonym_lhs '<-' pat where_decls
             {% do { let (name, args, as) = $2
                   ; mg <- mkPatSynMatchGroup name $5
                   ; acsA (\cs -> sLL $1 $> . ValD noExtField $
                            mkPatSynBind name args $4 (ExplicitBidirectional mg)
-                            (EpAnn (glR $1) (as ++ [mj AnnPattern $1,mu AnnLarrow $3]) cs))
+                            (EpAnn (glEE $1 $>) (as ++ [mj AnnPattern $1,mu AnnLarrow $3]) cs))
                    }}
 
 pattern_synonym_lhs :: { (LocatedN RdrName, HsPatSynDetails GhcPs, [AddEpAnn]) }
@@ -1697,7 +1697,7 @@ where_decls :: { LocatedL (OrdList (LHsDecl GhcPs)) }
 pattern_synonym_sig :: { LSig GhcPs }
         : 'pattern' con_list '::' sigtype
                    {% acsA (\cs -> sLL $1 $>
-                                $ PatSynSig (EpAnn (glR $1) (AnnSig (mu AnnDcolon $3) [mj AnnPattern $1]) cs)
+                                $ PatSynSig (EpAnn (glEE $1 $>) (AnnSig (mu AnnDcolon $3) [mj AnnPattern $1]) cs)
                                   (toList $ unLoc $2) $4) }
 
 qvarcon :: { LocatedN RdrName }
@@ -1719,7 +1719,7 @@ decl_cls  : at_decl_cls                 { $1 }
                        do { v <- checkValSigLhs $2
                           ; let err = text "in default signature" <> colon <+>
                                       quotes (ppr $2)
-                          ; acsA (\cs -> sLL $1 $> $ SigD noExtField $ ClassOpSig (EpAnn (glR $1) (AnnSig (mu AnnDcolon $3) [mj AnnDefault $1]) cs) True [v] $4) }}
+                          ; acsA (\cs -> sLL $1 $> $ SigD noExtField $ ClassOpSig (EpAnn (glEE $1 $>) (AnnSig (mu AnnDcolon $3) [mj AnnDefault $1]) cs) True [v] $4) }}
 
 decls_cls :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) }  -- Reversed
           : decls_cls ';' decl_cls      {% if isNilOL (snd $ unLoc $1)
@@ -1844,7 +1844,7 @@ binds   ::  { Located (HsLocalBinds GhcPs) }
                                   ; return (sL1 $1 $ HsValBinds (fixValbindsAnn $ EpAnn (glR $1) (fst $ unLoc $1) cs) val_binds)} }
 
         | '{'            dbinds '}'     {% acs (\cs -> (L (comb3 $1 $2 $3)
-                                             $ HsIPBinds (EpAnn (glR $1) (AnnList (Just$ glR $2) (Just $ moc $1) (Just $ mcc $3) [] []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
+                                             $ HsIPBinds (EpAnn (spanAsAnchor (comb3 $1 $2 $3)) (AnnList (Just$ glR $2) (Just $ moc $1) (Just $ mcc $3) [] []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
 
         |     vocurly    dbinds close   {% acs (\cs -> (L (gl $2)
                                              $ HsIPBinds (EpAnn (glR $1) (AnnList (Just $ glR $2) Nothing Nothing [] []) cs) (IPBinds noExtField (reverse $ unLoc $2)))) }
@@ -1880,7 +1880,7 @@ rule    :: { LRuleDecl GhcPs }
          {%runPV (unECP $4) >>= \ $4 ->
            runPV (unECP $6) >>= \ $6 ->
            acsA (\cs -> (sLL $1 $> $ HsRule
-                                   { rd_ext = (EpAnn (glR $1) ((fstOf3 $3) (mj AnnEqual $5 : (fst $2))) cs, getSTRINGs $1)
+                                   { rd_ext = (EpAnn (glEE $1 $>) ((fstOf3 $3) (mj AnnEqual $5 : (fst $2))) cs, getSTRINGs $1)
                                    , rd_name = L (noAnnSrcSpan $ gl $1) (getSTRING $1)
                                    , rd_act = (snd $2) `orElse` AlwaysActive
                                    , rd_tyvs = sndOf3 $3, rd_tmvs = thdOf3 $3
@@ -1941,7 +1941,7 @@ rule_vars :: { [LRuleTyTmVar] }
 
 rule_var :: { LRuleTyTmVar }
         : varid                         { sL1a $1 (RuleTyTmVar noAnn $1 Nothing) }
-        | '(' varid '::' ctype ')'      {% acsA (\cs -> sLL $1 $> (RuleTyTmVar (EpAnn (glR $1) [mop $1,mu AnnDcolon $3,mcp $5] cs) $2 (Just $4))) }
+        | '(' varid '::' ctype ')'      {% acsA (\cs -> sLL $1 $> (RuleTyTmVar (EpAnn (glEE $1 $>) [mop $1,mu AnnDcolon $3,mcp $5] cs) $2 (Just $4))) }
 
 {- Note [Parsing explicit foralls in Rules]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2026,7 +2026,7 @@ deprecations :: { OrdList (LWarnDecl GhcPs) }
 -- SUP: TEMPORARY HACK, not checking for `module Foo'
 deprecation :: { OrdList (LWarnDecl GhcPs) }
         : namelist strings
-             {% fmap unitOL $ acsA (\cs -> sLL $1 $> $ (Warning (EpAnn (glR $1) (fst $ unLoc $2) cs) (unLoc $1)
+             {% fmap unitOL $ acsA (\cs -> sLL $1 $> $ (Warning (EpAnn (glEE $1 $>) (fst $ unLoc $2) cs) (unLoc $1)
                                           (DeprecatedTxt NoSourceText $ map stringLiteralToHsDocWst $ snd $ unLoc $2))) }
 
 strings :: { Located ([AddEpAnn],[Located StringLiteral]) }
@@ -2052,19 +2052,19 @@ stringlist :: { Located (OrdList (Located StringLiteral)) }
 annotation :: { LHsDecl GhcPs }
     : '{-# ANN' name_var aexp '#-}'      {% runPV (unECP $3) >>= \ $3 ->
                                             acsA (\cs -> sLL $1 $> (AnnD noExtField $ HsAnnotation
-                                            ((EpAnn (glR $1) (AnnPragma (mo $1) (mc $4) []) cs),
+                                            ((EpAnn (glEE $1 $>) (AnnPragma (mo $1) (mc $4) []) cs),
                                             (getANN_PRAGs $1))
                                             (ValueAnnProvenance $2) $3)) }
 
     | '{-# ANN' 'type' otycon aexp '#-}' {% runPV (unECP $4) >>= \ $4 ->
                                             acsA (\cs -> sLL $1 $> (AnnD noExtField $ HsAnnotation
-                                            ((EpAnn (glR $1) (AnnPragma (mo $1) (mc $5) [mj AnnType $2]) cs),
+                                            ((EpAnn (glEE $1 $>) (AnnPragma (mo $1) (mc $5) [mj AnnType $2]) cs),
                                             (getANN_PRAGs $1))
                                             (TypeAnnProvenance $3) $4)) }
 
     | '{-# ANN' 'module' aexp '#-}'      {% runPV (unECP $3) >>= \ $3 ->
                                             acsA (\cs -> sLL $1 $> (AnnD noExtField $ HsAnnotation
-                                                ((EpAnn (glR $1) (AnnPragma (mo $1) (mc $4) [mj AnnModule $2]) cs),
+                                                ((EpAnn (glEE $1 $>) (AnnPragma (mo $1) (mc $4) [mj AnnModule $2]) cs),
                                                 (getANN_PRAGs $1))
                                                  ModuleAnnProvenance $3)) }
 
@@ -2121,7 +2121,7 @@ opt_tyconsig :: { ([AddEpAnn], Maybe (LocatedN RdrName)) }
 sigktype :: { LHsSigType GhcPs }
         : sigtype              { $1 }
         | ctype '::' kind      {% acsA (\cs -> sLL $1 $> $ mkHsImplicitSigType $
-                                               sLLa $1 $> $ HsKindSig (EpAnn (glAR $1) [mu AnnDcolon $2] cs) $1 $3) }
+                                               sLLa $1 $> $ HsKindSig (EpAnn (glEE $1 $>) [mu AnnDcolon $2] cs) $1 $3) }
 
 -- Like ctype, but for types that obey the forall-or-nothing rule.
 -- See Note [forall-or-nothing rule] in GHC.Hs.Type. To avoid duplicating the
@@ -2152,16 +2152,16 @@ unpackedness :: { Located UnpackednessPragma }
 forall_telescope :: { Located (HsForAllTelescope GhcPs) }
         : 'forall' tv_bndrs '.'  {% do { hintExplicitForall $1
                                        ; acs (\cs -> (sLL $1 $> $
-                                           mkHsForAllInvisTele (EpAnn (glR $1) (mu AnnForall $1,mu AnnDot $3) cs) $2 )) }}
+                                           mkHsForAllInvisTele (EpAnn (glEE $1 $>) (mu AnnForall $1,mu AnnDot $3) cs) $2 )) }}
         | 'forall' tv_bndrs '->' {% do { hintExplicitForall $1
                                        ; req_tvbs <- fromSpecTyVarBndrs $2
                                        ; acs (\cs -> (sLL $1 $> $
-                                           mkHsForAllVisTele (EpAnn (glR $1) (mu AnnForall $1,mu AnnRarrow $3) cs) req_tvbs )) }}
+                                           mkHsForAllVisTele (EpAnn (glEE $1 $>) (mu AnnForall $1,mu AnnRarrow $3) cs) req_tvbs )) }}
 
 -- A ktype is a ctype, possibly with a kind annotation
 ktype :: { LHsType GhcPs }
         : ctype                { $1 }
-        | ctype '::' kind      {% acsA (\cs -> sLL $1 $> $ HsKindSig (EpAnn (glAR $1) [mu AnnDcolon $2] cs) $1 $3) }
+        | ctype '::' kind      {% acsA (\cs -> sLL $1 $> $ HsKindSig (EpAnn (glEE $1 $>) [mu AnnDcolon $2] cs) $1 $3) }
 
 -- A ctype is a for-all type
 ctype   :: { LHsType GhcPs }
@@ -2174,7 +2174,7 @@ ctype   :: { LHsType GhcPs }
                                                      , hst_xqual = NoExtField
                                                      , hst_body = $3 })) }
 
-        | ipvar '::' ctype            {% acsA (\cs -> sLL $1 $> (HsIParamTy (EpAnn (glR $1) [mu AnnDcolon $2] cs) (reLocA $1) $3)) }
+        | ipvar '::' ctype            {% acsA (\cs -> sLL $1 $> (HsIParamTy (EpAnn (glEE $1 $>) [mu AnnDcolon $2] cs) (reLocA $1) $3)) }
         | type                        { $1 }
 
 ----------------------
@@ -2207,16 +2207,16 @@ type :: { LHsType GhcPs }
         -- See Note [%shift: type -> btype]
         : btype %shift                 { $1 }
         | btype '->' ctype             {% acsA (\cs -> sLL $1 $>
-                                            $ HsFunTy (EpAnn (glAR $1) NoEpAnns cs) (HsUnrestrictedArrow (hsUniTok $2)) $1 $3) }
+                                            $ HsFunTy (EpAnn (glEE $1 $>) NoEpAnns cs) (HsUnrestrictedArrow (hsUniTok $2)) $1 $3) }
 
         | btype mult '->' ctype        {% hintLinear (getLoc $2)
                                        >> let arr = (unLoc $2) (hsUniTok $3)
                                           in acsA (\cs -> sLL $1 $>
-                                           $ HsFunTy (EpAnn (glAR $1) NoEpAnns cs) arr $1 $4) }
+                                           $ HsFunTy (EpAnn (glEE $1 $>) NoEpAnns cs) arr $1 $4) }
 
         | btype '->.' ctype            {% hintLinear (getLoc $2) >>
                                           acsA (\cs -> sLL $1 $>
-                                            $ HsFunTy (EpAnn (glAR $1) NoEpAnns cs) (HsLinearArrow (HsLolly (hsTok $2))) $1 $3) }
+                                            $ HsFunTy (EpAnn (glEE $1 $>) NoEpAnns cs) (HsLinearArrow (HsLolly (hsTok $2))) $1 $3) }
                                               -- [mu AnnLollyU $2] }
 
 mult :: { Located (LHsUniToken "->" "\8594" GhcPs -> HsArrow GhcPs) }
@@ -2266,38 +2266,38 @@ atype :: { LHsType GhcPs }
                                                ; return $ sL1a $1 (HsStarTy noExtField (isUnicode $1)) } }
 
         -- See Note [Whitespace-sensitive operator parsing] in GHC.Parser.Lexer
-        | PREFIX_TILDE atype             {% acsA (\cs -> sLL $1 $> (mkBangTy (EpAnn (glR $1) [mj AnnTilde $1] cs) SrcLazy $2)) }
-        | PREFIX_BANG  atype             {% acsA (\cs -> sLL $1 $> (mkBangTy (EpAnn (glR $1) [mj AnnBang $1] cs) SrcStrict $2)) }
+        | PREFIX_TILDE atype             {% acsA (\cs -> sLL $1 $> (mkBangTy (EpAnn (glEE $1 $>) [mj AnnTilde $1] cs) SrcLazy $2)) }
+        | PREFIX_BANG  atype             {% acsA (\cs -> sLL $1 $> (mkBangTy (EpAnn (glEE $1 $>) [mj AnnBang $1] cs) SrcStrict $2)) }
 
-        | '{' fielddecls '}'             {% do { decls <- acsA (\cs -> (sLL $1 $> $ HsRecTy (EpAnn (glR $1) (AnnList (listAsAnchorM $2) (Just $ moc $1) (Just $ mcc $3) [] []) cs) $2))
+        | '{' fielddecls '}'             {% do { decls <- acsA (\cs -> (sLL $1 $> $ HsRecTy (EpAnn (glEE $1 $>) (AnnList (listAsAnchorM $2) (Just $ moc $1) (Just $ mcc $3) [] []) cs) $2))
                                                ; checkRecordSyntax decls }}
                                                         -- Constructor sigs only
-        | '(' ')'                        {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glR $1) (AnnParen AnnParens (glAA $1) (glAA $2)) cs)
+        | '(' ')'                        {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glEE $1 $>) (AnnParen AnnParens (glAA $1) (glAA $2)) cs)
                                                     HsBoxedOrConstraintTuple []) }
         | '(' ktype ',' comma_types1 ')' {% do { h <- addTrailingCommaA $2 (gl $3)
-                                               ; acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glR $1) (AnnParen AnnParens (glAA $1) (glAA $5)) cs)
+                                               ; acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glEE $1 $>) (AnnParen AnnParens (glAA $1) (glAA $5)) cs)
                                                         HsBoxedOrConstraintTuple (h : $4)) }}
-        | '(#' '#)'                   {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glR $1) (AnnParen AnnParensHash (glAA $1) (glAA $2)) cs) HsUnboxedTuple []) }
-        | '(#' comma_types1 '#)'      {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glR $1) (AnnParen AnnParensHash (glAA $1) (glAA $3)) cs) HsUnboxedTuple $2) }
-        | '(#' bar_types2 '#)'        {% acsA (\cs -> sLL $1 $> $ HsSumTy (EpAnn (glR $1) (AnnParen AnnParensHash (glAA $1) (glAA $3)) cs) $2) }
-        | '[' ktype ']'               {% acsA (\cs -> sLL $1 $> $ HsListTy (EpAnn (glR $1) (AnnParen AnnParensSquare (glAA $1) (glAA $3)) cs) $2) }
-        | '(' ktype ')'               {% acsA (\cs -> sLL $1 $> $ HsParTy  (EpAnn (glR $1) (AnnParen AnnParens       (glAA $1) (glAA $3)) cs) $2) }
+        | '(#' '#)'                   {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glEE $1 $>) (AnnParen AnnParensHash (glAA $1) (glAA $2)) cs) HsUnboxedTuple []) }
+        | '(#' comma_types1 '#)'      {% acsA (\cs -> sLL $1 $> $ HsTupleTy (EpAnn (glEE $1 $>) (AnnParen AnnParensHash (glAA $1) (glAA $3)) cs) HsUnboxedTuple $2) }
+        | '(#' bar_types2 '#)'        {% acsA (\cs -> sLL $1 $> $ HsSumTy (EpAnn (glEE $1 $>) (AnnParen AnnParensHash (glAA $1) (glAA $3)) cs) $2) }
+        | '[' ktype ']'               {% acsA (\cs -> sLL $1 $> $ HsListTy (EpAnn (glEE $1 $>) (AnnParen AnnParensSquare (glAA $1) (glAA $3)) cs) $2) }
+        | '(' ktype ')'               {% acsA (\cs -> sLL $1 $> $ HsParTy  (EpAnn (glEE $1 $>) (AnnParen AnnParens       (glAA $1) (glAA $3)) cs) $2) }
         | quasiquote                  { mapLocA (HsSpliceTy noExtField) $1 }
         | splice_untyped              { mapLocA (HsSpliceTy noExtField) $1 }
                                       -- see Note [Promotion] for the followings
-        | SIMPLEQUOTE qcon_nowiredlist {% acsA (\cs -> sLL $1 $> $ HsTyVar (EpAnn (glR $1) [mj AnnSimpleQuote $1,mjN AnnName $2] cs) IsPromoted $2) }
+        | SIMPLEQUOTE qcon_nowiredlist {% acsA (\cs -> sLL $1 $> $ HsTyVar (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1,mjN AnnName $2] cs) IsPromoted $2) }
         | SIMPLEQUOTE  '(' ktype ',' comma_types1 ')'
                              {% do { h <- addTrailingCommaA $3 (gl $4)
-                                   ; acsA (\cs -> sLL $1 $> $ HsExplicitTupleTy (EpAnn (glR $1) [mj AnnSimpleQuote $1,mop $2,mcp $6] cs) (h : $5)) }}
-        | SIMPLEQUOTE  '[' comma_types0 ']'     {% acsA (\cs -> sLL $1 $> $ HsExplicitListTy (EpAnn (glR $1) [mj AnnSimpleQuote $1,mos $2,mcs $4] cs) IsPromoted $3) }
-        | SIMPLEQUOTE var                       {% acsA (\cs -> sLL $1 $> $ HsTyVar (EpAnn (glR $1) [mj AnnSimpleQuote $1,mjN AnnName $2] cs) IsPromoted $2) }
+                                   ; acsA (\cs -> sLL $1 $> $ HsExplicitTupleTy (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1,mop $2,mcp $6] cs) (h : $5)) }}
+        | SIMPLEQUOTE  '[' comma_types0 ']'     {% acsA (\cs -> sLL $1 $> $ HsExplicitListTy (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1,mos $2,mcs $4] cs) IsPromoted $3) }
+        | SIMPLEQUOTE var                       {% acsA (\cs -> sLL $1 $> $ HsTyVar (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1,mjN AnnName $2] cs) IsPromoted $2) }
 
         -- Two or more [ty, ty, ty] must be a promoted list type, just as
         -- if you had written '[ty, ty, ty]
         -- (One means a list type, zero means the list type constructor,
         -- so you have to quote those.)
         | '[' ktype ',' comma_types1 ']'  {% do { h <- addTrailingCommaA $2 (gl $3)
-                                                ; acsA (\cs -> sLL $1 $> $ HsExplicitListTy (EpAnn (glR $1) [mos $1,mcs $5] cs) NotPromoted (h:$4)) }}
+                                                ; acsA (\cs -> sLL $1 $> $ HsExplicitListTy (EpAnn (glEE $1 $>) [mos $1,mcs $5] cs) NotPromoted (h:$4)) }}
         | INTEGER              { sLLa $1 $> $ HsTyLit noExtField $ HsNumTy (getINTEGERs $1)
                                                            (il_value (getINTEGER $1)) }
         | CHAR                 { sLLa $1 $> $ HsTyLit noExtField $ HsCharTy (getCHARs $1)
@@ -2308,7 +2308,7 @@ atype :: { LHsType GhcPs }
         -- Type variables are never exported, so `M.tyvar` will be rejected by the renamer.
         -- We let it pass the parser because the renamer can generate a better error message.
         | QVARID                      {% let qname = mkQual tvName (getQVARID $1)
-                                         in  acsa (\cs -> sL1a $1 (HsTyVar (EpAnn (glR $1) [] cs) NotPromoted (sL1n $1 $ qname)))}
+                                         in  acsa (\cs -> sL1a $1 (HsTyVar (EpAnn (glEE $1 $>) [] cs) NotPromoted (sL1n $1 $ qname)))}
 
 -- An inst_type is what occurs in the head of an instance decl
 --      e.g.  (Foo a, Gaz b) => Wibble a b
@@ -2343,12 +2343,12 @@ tv_bndrs :: { [LHsTyVarBndr Specificity GhcPs] }
 
 tv_bndr :: { LHsTyVarBndr Specificity GhcPs }
         : tv_bndr_no_braces             { $1 }
-        | '{' tyvar '}'                 {% acsA (\cs -> sLL $1 $> (UserTyVar (EpAnn (glR $1) [moc $1, mcc $3] cs) InferredSpec $2)) }
-        | '{' tyvar '::' kind '}'       {% acsA (\cs -> sLL $1 $> (KindedTyVar (EpAnn (glR $1) [moc $1,mu AnnDcolon $3 ,mcc $5] cs) InferredSpec $2 $4)) }
+        | '{' tyvar '}'                 {% acsA (\cs -> sLL $1 $> (UserTyVar (EpAnn (glEE $1 $>) [moc $1, mcc $3] cs) InferredSpec $2)) }
+        | '{' tyvar '::' kind '}'       {% acsA (\cs -> sLL $1 $> (KindedTyVar (EpAnn (glEE $1 $>) [moc $1,mu AnnDcolon $3 ,mcc $5] cs) InferredSpec $2 $4)) }
 
 tv_bndr_no_braces :: { LHsTyVarBndr Specificity GhcPs }
-        : tyvar                         {% acsA (\cs -> (sL1 $1 (UserTyVar (EpAnn (glNR $1) [] cs) SpecifiedSpec $1))) }
-        | '(' tyvar '::' kind ')'       {% acsA (\cs -> (sLL $1 $> (KindedTyVar (EpAnn (glR $1) [mop $1,mu AnnDcolon $3 ,mcp $5] cs) SpecifiedSpec $2 $4))) }
+        : tyvar                         {% acsA (\cs -> (sL1 $1    (UserTyVar (EpAnn (glNR $1) [] cs) SpecifiedSpec $1))) }
+        | '(' tyvar '::' kind ')'       {% acsA (\cs -> (sLL $1 $> (KindedTyVar (EpAnn (glEE $1 $>) [mop $1,mu AnnDcolon $3 ,mcp $5] cs) SpecifiedSpec $2 $4))) }
 
 fds :: { Located ([AddEpAnn],[LHsFunDep GhcPs]) }
         : {- empty -}                   { noLoc ([],[]) }
@@ -2364,7 +2364,7 @@ fds1 :: { Located [LHsFunDep GhcPs] }
 
 fd :: { LHsFunDep GhcPs }
         : varids0 '->' varids0  {% acsA (\cs -> L (comb3 $1 $2 $3)
-                                       (FunDep (EpAnn (glR $1) [mu AnnRarrow $2] cs)
+                                       (FunDep (EpAnn (spanAsAnchor (comb3 $1 $2 $3)) [mu AnnRarrow $2] cs)
                                                (reverse (unLoc $1))
                                                (reverse (unLoc $3)))) }
 
@@ -2501,8 +2501,9 @@ fielddecl :: { LConDeclField GhcPs }
                                               -- A list because of   f,g :: Int
         : sig_vars '::' ctype
             {% acsA (\cs -> L (comb2 $1 $3)
-                      (ConDeclField (EpAnn (glR $1) [mu AnnDcolon $2] cs)
-                                    (reverse (map (\ln@(L l n) -> L (l2l l) $ FieldOcc noExtField ln) (unLoc $1))) $3 Nothing))}
+                      (ConDeclField (EpAnn (glEE $1 $>) [mu AnnDcolon $2] cs)
+                                    (reverse (map (\ln@(L l n)
+                                               -> L (fromTrailingN l) $ FieldOcc noExtField (L (noTrailingN l) n)) (unLoc $1))) $3 Nothing))}
 
 -- Reversed!
 maybe_derivings :: { Located (HsDeriving GhcPs) }
@@ -2519,15 +2520,15 @@ derivings :: { Located (HsDeriving GhcPs) }
 deriving :: { LHsDerivingClause GhcPs }
         : 'deriving' deriv_clause_types
               {% let { full_loc = comb2 $1 $> }
-                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glR $1) [mj AnnDeriving $1] cs) Nothing $2) }
+                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glEE $1 $>) [mj AnnDeriving $1] cs) Nothing $2) }
 
         | 'deriving' deriv_strategy_no_via deriv_clause_types
               {% let { full_loc = comb2 $1 $> }
-                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glR $1) [mj AnnDeriving $1] cs) (Just $2) $3) }
+                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glEE $1 $>) [mj AnnDeriving $1] cs) (Just $2) $3) }
 
         | 'deriving' deriv_clause_types deriv_strategy_via
               {% let { full_loc = comb2 $1 $> }
-                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glR $1) [mj AnnDeriving $1] cs) (Just $3) $2) }
+                 in acsA (\cs -> L full_loc $ HsDerivingClause (EpAnn (glEE $1 $>) [mj AnnDeriving $1] cs) (Just $3) $2) }
 
 deriv_clause_types :: { LDerivClauseTys GhcPs }
         : qtycon              { let { tc = sL1a $1 $ mkHsImplicitSigType $
@@ -2602,7 +2603,7 @@ gdrhs :: { Located [LGRHS GhcPs (LHsExpr GhcPs)] }
 
 gdrh :: { LGRHS GhcPs (LHsExpr GhcPs) }
         : '|' guardquals '=' exp  {% runPV (unECP $4) >>= \ $4 ->
-                                     acsA (\cs -> sL (comb2 $1 $>) $ GRHS (EpAnn (glR $1) (GrhsAnn (Just $ glAA $1) (mj AnnEqual $3)) cs) (unLoc $2) $4) }
+                                     acsA (\cs -> sL (comb2 $1 $>) $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ glAA $1) (mj AnnEqual $3)) cs) (unLoc $2) $4) }
 
 sigdecl :: { LHsDecl GhcPs }
         :
@@ -2611,7 +2612,7 @@ sigdecl :: { LHsDecl GhcPs }
                         {% do { $1 <- runPV (unECP $1)
                               ; v <- checkValSigLhs $1
                               ; acsA (\cs -> (sLL $1 $> $ SigD noExtField $
-                                  TypeSig (EpAnn (glAR $1) (AnnSig (mu AnnDcolon $2) []) cs) [v] (mkHsWildCardBndrs $3)))} }
+                                  TypeSig (EpAnn (glEE $1 $>) (AnnSig (mu AnnDcolon $2) []) cs) [v] (mkHsWildCardBndrs $3)))} }
 
         | var ',' sig_vars '::' sigtype
            {% do { v <- addTrailingCommaN $1 (gl $2)
@@ -2629,7 +2630,7 @@ sigdecl :: { LHsDecl GhcPs }
                                                 Nothing -> (NoSourceText, maxPrecedence)
                                                 Just l2 -> (fst $ unLoc l2, snd $ unLoc l2)
                    ; acsA (\cs -> sLL $1 $> $ SigD noExtField
-                            (FixSig (EpAnn (glR $1) (mj AnnInfix $1 : maybeToList mbPrecAnn) cs) (FixitySig noExtField (fromOL $ unLoc $3)
+                            (FixSig (EpAnn (glEE $1 $>) (mj AnnInfix $1 : maybeToList mbPrecAnn) cs) (FixitySig noExtField (fromOL $ unLoc $3)
                                     (Fixity fixText fixPrec (unLoc $1)))))
                    }}
 
@@ -2639,42 +2640,42 @@ sigdecl :: { LHsDecl GhcPs }
                 {% let (dcolon, tc) = $3
                    in acsA
                        (\cs -> sLL $1 $>
-                         (SigD noExtField (CompleteMatchSig ((EpAnn (glR $1) ([ mo $1 ] ++ dcolon ++ [mc $4]) cs), (getCOMPLETE_PRAGs $1)) $2 tc))) }
+                         (SigD noExtField (CompleteMatchSig ((EpAnn (glEE $1 $>) ([ mo $1 ] ++ dcolon ++ [mc $4]) cs), (getCOMPLETE_PRAGs $1)) $2 tc))) }
 
         -- This rule is for both INLINE and INLINABLE pragmas
         | '{-# INLINE' activation qvarcon '#-}'
-                {% acsA (\cs -> (sLL $1 $> $ SigD noExtField (InlineSig (EpAnn (glR $1) ((mo $1:fst $2) ++ [mc $4]) cs) $3
+                {% acsA (\cs -> (sLL $1 $> $ SigD noExtField (InlineSig (EpAnn (glEE $1 $>) ((mo $1:fst $2) ++ [mc $4]) cs) $3
                             (mkInlinePragma (getINLINE_PRAGs $1) (getINLINE $1)
                                             (snd $2))))) }
         | '{-# OPAQUE' qvar '#-}'
-                {% acsA (\cs -> (sLL $1 $> $ SigD noExtField (InlineSig (EpAnn (glR $1) [mo $1, mc $3] cs) $2
+                {% acsA (\cs -> (sLL $1 $> $ SigD noExtField (InlineSig (EpAnn (glEE $1 $>) [mo $1, mc $3] cs) $2
                             (mkOpaquePragma (getOPAQUE_PRAGs $1))))) }
         | '{-# SCC' qvar '#-}'
-          {% acsA (\cs -> sLL $1 $> (SigD noExtField (SCCFunSig ((EpAnn (glR $1) [mo $1, mc $3] cs), (getSCC_PRAGs $1)) $2 Nothing))) }
+          {% acsA (\cs -> sLL $1 $> (SigD noExtField (SCCFunSig ((EpAnn (glEE $1 $>) [mo $1, mc $3] cs), (getSCC_PRAGs $1)) $2 Nothing))) }
 
         | '{-# SCC' qvar STRING '#-}'
           {% do { scc <- getSCC $3
                 ; let str_lit = StringLiteral (getSTRINGs $3) scc Nothing
-                ; acsA (\cs -> sLL $1 $> (SigD noExtField (SCCFunSig ((EpAnn (glR $1) [mo $1, mc $4] cs), (getSCC_PRAGs $1)) $2 (Just ( sL1a $3 str_lit))))) }}
+                ; acsA (\cs -> sLL $1 $> (SigD noExtField (SCCFunSig ((EpAnn (glEE $1 $>) [mo $1, mc $4] cs), (getSCC_PRAGs $1)) $2 (Just ( sL1a $3 str_lit))))) }}
 
         | '{-# SPECIALISE' activation qvar '::' sigtypes1 '#-}'
              {% acsA (\cs ->
                  let inl_prag = mkInlinePragma (getSPEC_PRAGs $1)
                                              (NoUserInlinePrag, FunLike) (snd $2)
-                  in sLL $1 $> $ SigD noExtField (SpecSig (EpAnn (glR $1) (mo $1:mu AnnDcolon $4:mc $6:(fst $2)) cs) $3 (fromOL $5) inl_prag)) }
+                  in sLL $1 $> $ SigD noExtField (SpecSig (EpAnn (glEE $1 $>) (mo $1:mu AnnDcolon $4:mc $6:(fst $2)) cs) $3 (fromOL $5) inl_prag)) }
 
         | '{-# SPECIALISE_INLINE' activation qvar '::' sigtypes1 '#-}'
-             {% acsA (\cs -> sLL $1 $> $ SigD noExtField (SpecSig (EpAnn (glR $1) (mo $1:mu AnnDcolon $4:mc $6:(fst $2)) cs) $3 (fromOL $5)
+             {% acsA (\cs -> sLL $1 $> $ SigD noExtField (SpecSig (EpAnn (glEE $1 $>) (mo $1:mu AnnDcolon $4:mc $6:(fst $2)) cs) $3 (fromOL $5)
                                (mkInlinePragma (getSPEC_INLINE_PRAGs $1)
                                                (getSPEC_INLINE $1) (snd $2)))) }
 
         | '{-# SPECIALISE' 'instance' inst_type '#-}'
                 {% acsA (\cs -> sLL $1 $>
-                                  $ SigD noExtField (SpecInstSig ((EpAnn (glR $1) [mo $1,mj AnnInstance $2,mc $4] cs), (getSPEC_PRAGs $1)) $3)) }
+                                  $ SigD noExtField (SpecInstSig ((EpAnn (glEE $1 $>) [mo $1,mj AnnInstance $2,mc $4] cs), (getSPEC_PRAGs $1)) $3)) }
 
         -- A minimal complete definition
         | '{-# MINIMAL' name_boolformula_opt '#-}'
-            {% acsA (\cs -> sLL $1 $> $ SigD noExtField (MinimalSig ((EpAnn (glR $1) [mo $1,mc $3] cs), (getMINIMAL_PRAGs $1)) $2)) }
+            {% acsA (\cs -> sLL $1 $> $ SigD noExtField (MinimalSig ((EpAnn (glEE $1 $>) [mo $1,mc $3] cs), (getMINIMAL_PRAGs $1)) $2)) }
 
 activation :: { ([AddEpAnn],Maybe Activation) }
         -- See Note [%shift: activation -> {- empty -}]
@@ -2711,22 +2712,22 @@ exp   :: { ECP }
         | infixexp '-<' exp     {% runPV (unECP $1) >>= \ $1 ->
                                    runPV (unECP $3) >>= \ $3 ->
                                    fmap ecpFromCmd $
-                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glAR $1) (mu Annlarrowtail $2) cs) $1 $3
+                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glEE $1 $>) (mu Annlarrowtail $2) cs) $1 $3
                                                         HsFirstOrderApp True) }
         | infixexp '>-' exp     {% runPV (unECP $1) >>= \ $1 ->
                                    runPV (unECP $3) >>= \ $3 ->
                                    fmap ecpFromCmd $
-                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glAR $1) (mu Annrarrowtail $2) cs) $3 $1
+                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glEE $1 $>) (mu Annrarrowtail $2) cs) $3 $1
                                                       HsFirstOrderApp False) }
         | infixexp '-<<' exp    {% runPV (unECP $1) >>= \ $1 ->
                                    runPV (unECP $3) >>= \ $3 ->
                                    fmap ecpFromCmd $
-                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glAR $1) (mu AnnLarrowtail $2) cs) $1 $3
+                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glEE $1 $>) (mu AnnLarrowtail $2) cs) $1 $3
                                                       HsHigherOrderApp True) }
         | infixexp '>>-' exp    {% runPV (unECP $1) >>= \ $1 ->
                                    runPV (unECP $3) >>= \ $3 ->
                                    fmap ecpFromCmd $
-                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glAR $1) (mu AnnRarrowtail $2) cs) $3 $1
+                                   acsA (\cs -> sLL $1 $> $ HsCmdArrApp (EpAnn (glEE $1 $>) (mu AnnRarrowtail $2) cs) $3 $1
                                                       HsHigherOrderApp False) }
         -- See Note [%shift: exp -> infixexp]
         | infixexp %shift       { $1 }
@@ -2821,12 +2822,12 @@ prag_e :: { Located (HsPragE GhcPs) }
       : '{-# SCC' STRING '#-}'      {% do { scc <- getSCC $2
                                           ; acs (\cs -> (sLL $1 $>
                                              (HsPragSCC
-                                                ((EpAnn (glR $1) (AnnPragma (mo $1) (mc $3) [mj AnnValStr $2]) cs),
+                                                ((EpAnn (glEE $1 $>) (AnnPragma (mo $1) (mc $3) [mj AnnValStr $2]) cs),
                                                 (getSCC_PRAGs $1))
                                                 (StringLiteral (getSTRINGs $2) scc Nothing))))} }
       | '{-# SCC' VARID  '#-}'      {% acs (\cs -> (sLL $1 $>
                                              (HsPragSCC
-                                               ((EpAnn (glR $1) (AnnPragma (mo $1) (mc $3) [mj AnnVal $2]) cs),
+                                               ((EpAnn (glEE $1 $>) (AnnPragma (mo $1) (mc $3) [mj AnnVal $2]) cs),
                                                (getSCC_PRAGs $1))
                                                (StringLiteral NoSourceText (getVARID $2) Nothing)))) }
 
@@ -2844,7 +2845,7 @@ fexp    :: { ECP }
 
         | 'static' aexp              {% runPV (unECP $2) >>= \ $2 ->
                                         fmap ecpFromExp $
-                                        acsA (\cs -> sLL $1 $> $ HsStatic (EpAnn (glR $1) [mj AnnStatic $1] cs) $2) }
+                                        acsA (\cs -> sLL $1 $> $ HsStatic (EpAnn (glEE $1 $>) [mj AnnStatic $1] cs) $2) }
 
         | aexp                       { $1 }
 
@@ -2875,7 +2876,7 @@ aexp    :: { ECP }
                       mkHsLamPV (comb2 $1 $>) LamSingle
                             (sLLl $1 $>
                             [sLLa $1 $>
-                                         $ Match { m_ext = EpAnn (glR $1) [] emptyComments
+                                         $ Match { m_ext = EpAnn (glEE $1 $>) [] emptyComments
                                                  , m_ctxt = LamAlt LamSingle
                                                  , m_pats = $2
                                                  , m_grhss = unguardedGRHSs (comb2 $3 $4) $4 (EpAnn (glR $3) (GrhsAnn Nothing (mu AnnRarrow $3)) emptyComments) }])
@@ -2901,7 +2902,7 @@ aexp    :: { ECP }
 
         | 'if' ifgdpats                 {% hintMultiWayIf (getLoc $1) >>= \_ ->
                                            fmap ecpFromExp $
-                                           acsA (\cs -> sLL $1 $> $ HsMultiIf (EpAnn (glR $1) (mj AnnIf $1:(fst $ unLoc $2)) cs)
+                                           acsA (\cs -> sLL $1 $> $ HsMultiIf (EpAnn (glEE $1 $>) (mj AnnIf $1:(fst $ unLoc $2)) cs)
                                                      (reverse $ snd $ unLoc $2)) }
         | 'case' exp 'of' altslist(pats1) {% runPV (unECP $2) >>= \ ($2 :: LHsExpr GhcPs) ->
                                              return $ ECP $
@@ -2923,12 +2924,12 @@ aexp    :: { ECP }
                                               (mkHsDoAnns (MDoExpr $
                                                           fmap mkModuleNameFS (getMDO $1))
                                                           $2
-                                           (EpAnn (glR $1) (AnnList (Just $ glAR $2) Nothing Nothing [mj AnnMdo $1] []) cs) )) }
+                                           (EpAnn (glEE $1 $>) (AnnList (Just $ glAR $2) Nothing Nothing [mj AnnMdo $1] []) cs) )) }
         | 'proc' aexp '->' exp
                        {% (checkPattern <=< runPV) (unECP $2) >>= \ p ->
                            runPV (unECP $4) >>= \ $4@cmd ->
                            fmap ecpFromExp $
-                           acsA (\cs -> sLL $1 $> $ HsProc (EpAnn (glR $1) [mj AnnProc $1,mu AnnRarrow $3] cs) p (sLLa $1 $> $ HsCmdTop noExtField cmd)) }
+                           acsA (\cs -> sLL $1 $> $ HsProc (EpAnn (glEE $1 $>) [mj AnnProc $1,mu AnnRarrow $3] cs) p (sLLa $1 $> $ HsCmdTop noExtField cmd)) }
 
         | aexp1                 { $1 }
 
@@ -2946,7 +2947,7 @@ aexp1   :: { ECP }
             {% runPV (unECP $1) >>= \ $1 ->
                fmap ecpFromExp $ acsa (\cs ->
                  let fl = sLLa $2 $> (DotFieldOcc ((EpAnn (glR $2) (AnnFieldLabel (Just $ glAA $2)) emptyComments)) $3) in
-                 mkRdrGetField (noAnnSrcSpan $ comb2 $1 $>) $1 fl (EpAnn (glAR $1) NoEpAnns cs))  }
+                 mkRdrGetField (noAnnSrcSpan $ comb2 $1 $>) $1 fl (EpAnn (glEE $1 $>) NoEpAnns cs))  }
 
 
         | aexp2                { $1 }
@@ -2979,7 +2980,7 @@ aexp2   :: { ECP }
 
         -- This case is only possible when 'OverloadedRecordDotBit' is enabled.
         | '(' projection ')'            { ECP $
-                                            acsA (\cs -> sLL $1 $> $ mkRdrProjection (NE.reverse (unLoc $2)) (EpAnn (glR $1) (AnnProjection (glAA $1) (glAA $3)) cs))
+                                            acsA (\cs -> sLL $1 $> $ mkRdrProjection (NE.reverse (unLoc $2)) (EpAnn (glEE $1 $>) (AnnProjection (glAA $1) (glAA $3)) cs))
                                             >>= ecpFromExp'
                                         }
 
@@ -2999,40 +3000,40 @@ aexp2   :: { ECP }
         | splice_untyped { ECP $ pvA $ mkHsSplicePV $1 }
         | splice_typed   { ecpFromExp $ fmap (uncurry HsTypedSplice) (reLocA $1) }
 
-        | SIMPLEQUOTE  qvar     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mj AnnSimpleQuote $1] cs) (VarBr noExtField True  $2)) }
-        | SIMPLEQUOTE  qcon     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mj AnnSimpleQuote $1] cs) (VarBr noExtField True  $2)) }
-        | TH_TY_QUOTE tyvar     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mj AnnThTyQuote $1  ] cs) (VarBr noExtField False $2)) }
-        | TH_TY_QUOTE gtycon    {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mj AnnThTyQuote $1  ] cs) (VarBr noExtField False $2)) }
+        | SIMPLEQUOTE  qvar     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1] cs) (VarBr noExtField True  $2)) }
+        | SIMPLEQUOTE  qcon     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mj AnnSimpleQuote $1] cs) (VarBr noExtField True  $2)) }
+        | TH_TY_QUOTE tyvar     {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mj AnnThTyQuote $1  ] cs) (VarBr noExtField False $2)) }
+        | TH_TY_QUOTE gtycon    {% fmap ecpFromExp $ acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mj AnnThTyQuote $1  ] cs) (VarBr noExtField False $2)) }
         -- See Note [%shift: aexp2 -> TH_TY_QUOTE]
         | TH_TY_QUOTE %shift    {% reportEmptyDoubleQuotes (getLoc $1) }
         | '[|' exp '|]'       {% runPV (unECP $2) >>= \ $2 ->
                                  fmap ecpFromExp $
-                                 acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) (if (hasE $1) then [mj AnnOpenE $1, mu AnnCloseQ $3]
+                                 acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) (if (hasE $1) then [mj AnnOpenE $1, mu AnnCloseQ $3]
                                                                                          else [mu AnnOpenEQ $1,mu AnnCloseQ $3]) cs) (ExpBr noExtField $2)) }
         | '[||' exp '||]'     {% runPV (unECP $2) >>= \ $2 ->
                                  fmap ecpFromExp $
-                                 acsA (\cs -> sLL $1 $> $ HsTypedBracket (EpAnn (glR $1) (if (hasE $1) then [mj AnnOpenE $1,mc $3] else [mo $1,mc $3]) cs) $2) }
+                                 acsA (\cs -> sLL $1 $> $ HsTypedBracket (EpAnn (glEE $1 $>) (if (hasE $1) then [mj AnnOpenE $1,mc $3] else [mo $1,mc $3]) cs) $2) }
         | '[t|' ktype '|]'    {% fmap ecpFromExp $
-                                 acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mo $1,mu AnnCloseQ $3] cs) (TypBr noExtField $2)) }
+                                 acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mo $1,mu AnnCloseQ $3] cs) (TypBr noExtField $2)) }
         | '[p|' infixexp '|]' {% (checkPattern <=< runPV) (unECP $2) >>= \p ->
                                       fmap ecpFromExp $
-                                      acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) [mo $1,mu AnnCloseQ $3] cs) (PatBr noExtField p)) }
+                                      acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) [mo $1,mu AnnCloseQ $3] cs) (PatBr noExtField p)) }
         | '[d|' cvtopbody '|]' {% fmap ecpFromExp $
-                                  acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glR $1) (mo $1:mu AnnCloseQ $3:fst $2) cs) (DecBrL noExtField (snd $2))) }
+                                  acsA (\cs -> sLL $1 $> $ HsUntypedBracket (EpAnn (glEE $1 $>) (mo $1:mu AnnCloseQ $3:fst $2) cs) (DecBrL noExtField (snd $2))) }
         | quasiquote          { ECP $ pvA $ mkHsSplicePV $1 }
 
         -- arrow notation extension
         | '(|' aexp cmdargs '|)'  {% runPV (unECP $2) >>= \ $2 ->
                                       fmap ecpFromCmd $
-                                      acsA (\cs -> sLL $1 $> $ HsCmdArrForm (EpAnn (glR $1) (AnnList (Just $ glR $1) (Just $ mu AnnOpenB $1) (Just $ mu AnnCloseB $4) [] []) cs) $2 Prefix
+                                      acsA (\cs -> sLL $1 $> $ HsCmdArrForm (EpAnn (glEE $1 $>) (AnnList (glRM $1) (Just $ mu AnnOpenB $1) (Just $ mu AnnCloseB $4) [] []) cs) $2 Prefix
                                                            Nothing (reverse $3)) }
 
 projection :: { Located (NonEmpty (LocatedAn NoEpAnns (DotFieldOcc GhcPs))) }
 projection
         -- See Note [Whitespace-sensitive operator parsing] in GHC.Parsing.Lexer
         : projection TIGHT_INFIX_PROJ field
-                             {% acs (\cs -> sLL $1 $> ((sLLa $2 $> $ DotFieldOcc (EpAnn (glR $1) (AnnFieldLabel (Just $ glAA $2)) cs) $3) `NE.cons` unLoc $1)) }
-        | PREFIX_PROJ field  {% acs (\cs -> sLL $1 $> ((sLLa $1 $> $ DotFieldOcc (EpAnn (glR $1) (AnnFieldLabel (Just $ glAA $1)) cs) $2) :| [])) }
+                             {% acs (\cs -> sLL $1 $> ((sLLa $2 $> $ DotFieldOcc (EpAnn (glEE $1 $>) (AnnFieldLabel (Just $ glAA $2)) cs) $3) `NE.cons` unLoc $1)) }
+        | PREFIX_PROJ field  {% acs (\cs -> sLL $1 $> ((sLLa $1 $> $ DotFieldOcc (EpAnn (glEE $1 $>) (AnnFieldLabel (Just $ glAA $1)) cs) $2) :| [])) }
 
 splice_exp :: { LHsExpr GhcPs }
         : splice_untyped { fmap (HsUntypedSplice noAnn) (reLocA $1) }
@@ -3041,13 +3042,13 @@ splice_exp :: { LHsExpr GhcPs }
 splice_untyped :: { Located (HsUntypedSplice GhcPs) }
         -- See Note [Whitespace-sensitive operator parsing] in GHC.Parser.Lexer
         : PREFIX_DOLLAR aexp2   {% runPV (unECP $2) >>= \ $2 ->
-                                   acs (\cs -> sLL $1 $> $ HsUntypedSpliceExpr (EpAnn (glR $1) [mj AnnDollar $1] cs) $2) }
+                                   acs (\cs -> sLL $1 $> $ HsUntypedSpliceExpr (EpAnn (glEE $1 $>) [mj AnnDollar $1] cs) $2) }
 
 splice_typed :: { Located ((EpAnnCO, EpAnn [AddEpAnn]), LHsExpr GhcPs) }
         -- See Note [Whitespace-sensitive operator parsing] in GHC.Parser.Lexer
         : PREFIX_DOLLAR_DOLLAR aexp2
                                 {% runPV (unECP $2) >>= \ $2 ->
-                                   acs (\cs -> sLL $1 $> $ ((noAnn, EpAnn (glR $1) [mj AnnDollarDollar $1] cs), $2)) }
+                                   acs (\cs -> sLL $1 $> $ ((noAnn, EpAnn (glEE $1 $>) [mj AnnDollarDollar $1] cs), $2)) }
 
 cmdargs :: { [LHsCmdTop GhcPs] }
         : cmdargs acmd                  { $2 : $1 }
@@ -3359,7 +3360,7 @@ ifgdpats :: { Located ([AddEpAnn],[LGRHS GhcPs (LHsExpr GhcPs)]) }
 gdpat   :: { forall b. DisambECP b => PV (LGRHS GhcPs (LocatedA b)) }
         : '|' guardquals '->' exp
                                    { unECP $4 >>= \ $4 ->
-                                     acsA (\cs -> sL (comb2 $1 $>) $ GRHS (EpAnn (glR $1) (GrhsAnn (Just $ glAA $1) (mu AnnRarrow $3)) cs) (unLoc $2) $4) }
+                                     acsA (\cs -> sL (comb2 $1 $>) $ GRHS (EpAnn (glEE $1 $>) (GrhsAnn (Just $ glAA $1) (mu AnnRarrow $3)) cs) (unLoc $2) $4) }
 
 -- 'pat' recognises a pattern, including one with a bang at the top
 --      e.g.  "!x" or "!(x,y)" or "C a b" etc
@@ -3435,17 +3436,17 @@ stmt  :: { forall b. DisambECP b => PV (LStmt GhcPs (LocatedA b)) }
         : qual                          { $1 }
         | 'rec' stmtlist                {  $2 >>= \ $2 ->
                                            acsA (\cs -> (sLL $1 $> $ mkRecStmt
-                                                 (EpAnn (glR $1) (hsDoAnn $1 $2 AnnRec) cs)
+                                                 (EpAnn (glEE $1 $>) (hsDoAnn $1 $2 AnnRec) cs)
                                                   $2)) }
 
 qual  :: { forall b. DisambECP b => PV (LStmt GhcPs (LocatedA b)) }
     : bindpat '<-' exp                   { unECP $3 >>= \ $3 ->
                                            acsA (\cs -> sLL $1 $>
-                                            $ mkPsBindStmt (EpAnn (glAR $1) [mu AnnLarrow $2] cs) $1 $3) }
+                                            $ mkPsBindStmt (EpAnn (glEE $1 $>) [mu AnnLarrow $2] cs) $1 $3) }
     | exp                                { unECP $1 >>= \ $1 ->
                                            return $ sL1a $1 $ mkBodyStmt $1 }
     | 'let' binds                        { acsA (\cs -> (sLL $1 $>
-                                                $ mkLetStmt (EpAnn (glR $1) [mj AnnLet $1] cs) (unLoc $2))) }
+                                                $ mkLetStmt (EpAnn (glEE $1 $>) [mj AnnLet $1] cs) (unLoc $2))) }
 
 -----------------------------------------------------------------------------
 -- Record Field Update/Construction
@@ -3534,7 +3535,7 @@ dbinds  :: { Located [LIPBind GhcPs] } -- reversed
 
 dbind   :: { LIPBind GhcPs }
 dbind   : ipvar '=' exp                {% runPV (unECP $3) >>= \ $3 ->
-                                          acsA (\cs -> sLL $1 $> (IPBind (EpAnn (glR $1) [mj AnnEqual $2] cs) (reLocA $1) $3)) }
+                                          acsA (\cs -> sLL $1 $> (IPBind (EpAnn (glEE $1 $>) [mj AnnEqual $2] cs) (reLocA $1) $3)) }
 
 ipvar   :: { Located HsIPName }
         : IPDUPVARID            { sL1 $1 (HsIPName (getIPDUPVARID $1)) }
@@ -3765,7 +3766,7 @@ qopm    :: { forall b. DisambInfixOp b => PV (LocatedN b) }   -- used in section
 
 hole_op :: { forall b. DisambInfixOp b => PV (Located b) }   -- used in sections
 hole_op : '`' '_' '`'           { mkHsInfixHolePV (comb2 $1 $>)
-                                         (\cs -> EpAnn (glR $1) (EpAnnUnboundVar (glAA $1, glAA $3) (glAA $2)) cs) }
+                                         (\cs -> EpAnn (glEE $1 $>) (EpAnnUnboundVar (glAA $1, glAA $3) (glAA $2)) cs) }
 
 qvarop :: { LocatedN RdrName }
         : qvarsym               { $1 }
@@ -4310,6 +4311,12 @@ glMR :: Maybe (Located a) -> Located b -> Anchor
 glMR (Just la) _ = glR la
 glMR _ la = glR la
 
+glEE :: (HasLoc a, HasLoc b) => a -> b -> Anchor
+glEE x y = spanAsAnchor $ comb2 x y
+
+glRM :: Located a -> Maybe Anchor
+glRM (L l _) = Just $ spanAsAnchor l
+
 glAA :: Located a -> EpaLocation
 glAA = srcSpan2e . getLoc
 
@@ -4570,4 +4577,9 @@ adaptWhereBinds (Just (L l (b, mc))) = L l (b, maybe emptyComments id mc)
 
 combineHasLocs :: (HasLoc a, HasLoc b) => a -> b -> SrcSpan
 combineHasLocs a b = combineSrcSpans (getHasLoc a) (getHasLoc b)
+
+fromTrailingN :: SrcSpanAnnN -> SrcSpanAnnA
+fromTrailingN (SrcSpanAnn EpAnnNotUsed l) = SrcSpanAnn EpAnnNotUsed l
+fromTrailingN (SrcSpanAnn (EpAnn anc ann cs) l)
+    = SrcSpanAnn (EpAnn anc (AnnListItem (nann_trailing ann)) cs) l
 }
diff --git a/compiler/GHC/Parser/Annotation.hs b/compiler/GHC/Parser/Annotation.hs
index f15bbec30c481e847258dc3340281a1f770fabfa..65ccdfff07fd66ea71cf233da8f43b7bf5715981 100644
--- a/compiler/GHC/Parser/Annotation.hs
+++ b/compiler/GHC/Parser/Annotation.hs
@@ -46,6 +46,7 @@ module GHC.Parser.Annotation (
   -- ** Trailing annotations in lists
   TrailingAnn(..), trailingAnnToAddEpAnn,
   addTrailingAnnToA, addTrailingAnnToL, addTrailingCommaToN,
+  noTrailingN,
 
   -- ** Utilities for converting between different 'GenLocated' when
   -- ** we do not care about the annotations.
@@ -65,6 +66,7 @@ module GHC.Parser.Annotation (
   epAnnAnns, epAnnAnnsL,
   annParen2AddEpAnn,
   epAnnComments,
+  s_comments, s_entry,
 
   -- ** Working with locations of annotations
   sortLocatedA,
@@ -83,8 +85,9 @@ module GHC.Parser.Annotation (
   -- ** Working with comments in annotations
   noComments, comment, addCommentsToSrcAnn, setCommentsSrcAnn,
   addCommentsToEpAnn, setCommentsEpAnn,
-  transferAnnsA, transferAnnsOnlyA, transferCommentsOnlyA, commentsOnlyA,
-  removeCommentsA,
+  transferAnnsA, transferAnnsOnlyA, transferCommentsOnlyA,
+  transferPriorCommentsA, transferFollowingA,
+  commentsOnlyA, removeCommentsA,
 
   placeholderRealSpan,
   ) where
@@ -371,13 +374,6 @@ data EpaCommentTok =
   | EpaDocOptions      String     -- ^ doc options (prune, ignore-exports, etc)
   | EpaLineComment     String     -- ^ comment starting by "--"
   | EpaBlockComment    String     -- ^ comment in {- -}
-  | EpaEofComment                 -- ^ empty comment, capturing
-                                  -- location of EOF
-
-  -- See #19697 for a discussion of EpaEofComment's use and how it
-  -- should be removed in favour of capturing it in the location for
-  -- 'Located HsModule' in the parser.
-
     deriving (Eq, Data, Show)
 -- Note: these are based on the Token versions, but the Token type is
 -- defined in GHC.Parser.Lexer and bringing it in here would create a loop
@@ -409,7 +405,7 @@ data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq)
 -- sort the relative order.
 data EpaLocation = EpaSpan !RealSrcSpan !(Strict.Maybe BufSpan)
                  | EpaDelta !DeltaPos ![LEpaComment]
-               deriving (Data,Eq)
+               deriving (Data,Eq,Show)
 
 -- | Tokens embedded in the AST have an EpaLocation, unless they come from
 -- generated code (e.g. by TH).
@@ -539,7 +535,7 @@ data Anchor = Anchor        { anchor :: RealSrcSpan
 -- anchor to be freely moved, without worrying about recalculating the
 -- appropriate anchor span.
 data AnchorOperation = UnchangedAnchor
-                     | MovedAnchor DeltaPos
+                     | MovedAnchor !DeltaPos ![LEpaComment]
         deriving (Data, Eq, Show)
 
 
@@ -647,15 +643,19 @@ meaning we can have type LocatedN RdrName
 -- | Captures the location of punctuation occurring between items,
 -- normally in a list.  It is captured as a trailing annotation.
 data TrailingAnn
-  = AddSemiAnn EpaLocation    -- ^ Trailing ';'
-  | AddCommaAnn EpaLocation   -- ^ Trailing ','
-  | AddVbarAnn EpaLocation    -- ^ Trailing '|'
+  = AddSemiAnn    { ta_location :: EpaLocation }  -- ^ Trailing ';'
+  | AddCommaAnn   { ta_location :: EpaLocation }  -- ^ Trailing ','
+  | AddVbarAnn    { ta_location :: EpaLocation }  -- ^ Trailing '|'
+  | AddDarrowAnn  { ta_location :: EpaLocation }  -- ^ Trailing '=>'
+  | AddDarrowUAnn { ta_location :: EpaLocation }  -- ^ Trailing  "⇒"
   deriving (Data, Eq)
 
 instance Outputable TrailingAnn where
   ppr (AddSemiAnn ss)    = text "AddSemiAnn"    <+> ppr ss
   ppr (AddCommaAnn ss)   = text "AddCommaAnn"   <+> ppr ss
   ppr (AddVbarAnn ss)    = text "AddVbarAnn"    <+> ppr ss
+  ppr (AddDarrowAnn ss)  = text "AddDarrowAnn"  <+> ppr ss
+  ppr (AddDarrowUAnn ss) = text "AddDarrowUAnn" <+> ppr ss
 
 -- | Annotation for items appearing in a list. They can have one or
 -- more trailing punctuations items, such as commas or semicolons.
@@ -925,6 +925,8 @@ trailingAnnToAddEpAnn :: TrailingAnn -> AddEpAnn
 trailingAnnToAddEpAnn (AddSemiAnn ss)    = AddEpAnn AnnSemi ss
 trailingAnnToAddEpAnn (AddCommaAnn ss)   = AddEpAnn AnnComma ss
 trailingAnnToAddEpAnn (AddVbarAnn ss)    = AddEpAnn AnnVbar ss
+trailingAnnToAddEpAnn (AddDarrowUAnn ss) = AddEpAnn AnnDarrowU ss
+trailingAnnToAddEpAnn (AddDarrowAnn ss)  = AddEpAnn AnnDarrow ss
 
 -- | Helper function used in the parser to add a 'TrailingAnn' items
 -- to an existing annotation.
@@ -961,6 +963,11 @@ addTrailingCommaToN _ n l = n { anns = addTrailing (anns n) l }
     addTrailing :: NameAnn -> EpaLocation -> NameAnn
     addTrailing n l = n { nann_trailing = nann_trailing n ++ [AddCommaAnn l]}
 
+noTrailingN :: SrcSpanAnnN -> SrcSpanAnnN
+noTrailingN (SrcSpanAnn EpAnnNotUsed l) = SrcSpanAnn EpAnnNotUsed l
+noTrailingN (SrcSpanAnn s l)
+    = SrcSpanAnn (s { anns = (anns s) { nann_trailing = [] } }) l
+
 {-
 Note [list append in addTrailing*]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1165,6 +1172,13 @@ epAnnComments :: EpAnn an -> EpAnnComments
 epAnnComments EpAnnNotUsed = EpaComments []
 epAnnComments (EpAnn _ _ cs) = cs
 
+-- Forward compatibility
+s_comments :: SrcAnn ann -> EpAnnComments
+s_comments (SrcSpanAnn an _) = epAnnComments an
+
+s_entry :: SrcAnn ann -> EpaLocation
+s_entry = epaLocationFromSrcAnn
+
 -- ---------------------------------------------------------------------
 -- sortLocatedA :: [LocatedA a] -> [LocatedA a]
 sortLocatedA :: [GenLocated (SrcSpanAnn' a) e] -> [GenLocated (SrcSpanAnn' a) e]
@@ -1274,6 +1288,26 @@ transferAnnsA (SrcSpanAnn (EpAnn a an cs) l) to
       (SrcSpanAnn (EpAnn a an' cs') loc)
         -> SrcSpanAnn (EpAnn a (an' <> an) (cs' <> cs)) loc
 
+-- | Transfer trailing items but not comments from the annotations in the
+-- first 'SrcSpanAnnA' argument to those in the second.
+transferFollowingA :: SrcSpanAnnA -> SrcSpanAnnA -> (SrcSpanAnnA,  SrcSpanAnnA)
+transferFollowingA (SrcSpanAnn EpAnnNotUsed l1) (SrcSpanAnn ann2 l2)
+  = (SrcSpanAnn EpAnnNotUsed l1, SrcSpanAnn ann2 l2)
+transferFollowingA (SrcSpanAnn (EpAnn a1 an1 cs1) l1) (SrcSpanAnn EpAnnNotUsed l2)
+  = (SrcSpanAnn (EpAnn a1 noAnn cs1') l1, SrcSpanAnn (EpAnn (spanAsAnchor l2) an1 cs2') l2)
+  where
+    pc = priorComments cs1
+    fc = getFollowingComments cs1
+    cs1' = setPriorComments emptyComments pc
+    cs2' = setFollowingComments emptyComments fc
+transferFollowingA (SrcSpanAnn (EpAnn a1 an1 cs1) l1) (SrcSpanAnn (EpAnn a2 an2 cs2) l2)
+  = (SrcSpanAnn (EpAnn a1 noAnn cs1') l1, SrcSpanAnn (EpAnn a2 (an1 <> an2) cs2') l2)
+  where
+    pc = priorComments cs1
+    fc = getFollowingComments cs1
+    cs1' = setPriorComments emptyComments pc
+    cs2' = setFollowingComments cs2 fc
+
 -- | Transfer trailing items from the annotations in the
 -- first 'SrcSpanAnnA' argument to those in the second.
 transferAnnsOnlyA :: SrcSpanAnnA -> SrcSpanAnnA -> (SrcSpanAnnA,  SrcSpanAnnA)
@@ -1294,6 +1328,27 @@ transferCommentsOnlyA (SrcSpanAnn (EpAnn a an cs) l) (SrcSpanAnn EpAnnNotUsed l'
 transferCommentsOnlyA (SrcSpanAnn (EpAnn a an cs) l) (SrcSpanAnn (EpAnn a' an' cs') l')
   = (SrcSpanAnn (EpAnn a an emptyComments) l, SrcSpanAnn (EpAnn a' an' (cs <> cs')) l')
 
+-- | Transfer prior comments only from the annotations in the
+-- first 'SrcSpanAnnA' argument to those in the second.
+transferPriorCommentsA :: SrcSpanAnnA -> SrcSpanAnnA -> (SrcSpanAnnA,  SrcSpanAnnA)
+transferPriorCommentsA (SrcSpanAnn EpAnnNotUsed l1) (SrcSpanAnn ann2 l2)
+  = (SrcSpanAnn EpAnnNotUsed l1,  SrcSpanAnn ann2 l2)
+transferPriorCommentsA (SrcSpanAnn (EpAnn a1 an1 cs1) l1) (SrcSpanAnn EpAnnNotUsed l2)
+  = (SrcSpanAnn (EpAnn a1 an1 cs1') l1,  SrcSpanAnn (EpAnn (spanAsAnchor l2) noAnn cs2') l2)
+  where
+    pc = priorComments cs1
+    fc = getFollowingComments cs1
+    cs1' = setFollowingComments emptyComments fc
+    cs2' = setPriorComments emptyComments pc
+transferPriorCommentsA (SrcSpanAnn (EpAnn a1 an1 cs1) l1) (SrcSpanAnn (EpAnn a2 an2 cs2) l2)
+  = (SrcSpanAnn (EpAnn a1 an1 cs1') l1,  SrcSpanAnn (EpAnn a2 an2 cs2') l2)
+  where
+    pc = priorComments cs1
+    fc = getFollowingComments cs1
+    cs1' = setFollowingComments emptyComments fc
+    cs2' = setPriorComments cs2 (priorComments cs2 <> pc)
+
+
 -- | Remove the exact print annotations payload, leaving only the
 -- anchor and comments.
 commentsOnlyA :: NoAnn ann => SrcAnn ann -> SrcAnn ann
@@ -1379,8 +1434,8 @@ instance Outputable Anchor where
   ppr (Anchor a o)        = text "Anchor" <+> ppr a <+> ppr o
 
 instance Outputable AnchorOperation where
-  ppr UnchangedAnchor   = text "UnchangedAnchor"
-  ppr (MovedAnchor d)   = text "MovedAnchor" <+> ppr d
+  ppr UnchangedAnchor    = text "UnchangedAnchor"
+  ppr (MovedAnchor d cs) = text "MovedAnchor" <+> ppr d <+> ppr cs
 
 instance Outputable DeltaPos where
   ppr (SameLine c) = text "SameLine" <+> ppr c
diff --git a/compiler/GHC/ThToHs.hs b/compiler/GHC/ThToHs.hs
index 92aa77c0f547b004a677985b430c0073c82d0d3b..4abbec3647659ed2e5d8cc1765d1dac2caea02f7 100644
--- a/compiler/GHC/ThToHs.hs
+++ b/compiler/GHC/ThToHs.hs
@@ -1200,7 +1200,7 @@ which we don't want.
 -}
 
 cvtFld :: (RdrName -> CvtM t) -> (TH.Name, TH.Exp)
-       -> CvtM (LHsFieldBind GhcPs (LocatedAn NoEpAnns t) (LHsExpr GhcPs))
+       -> CvtM (LHsFieldBind GhcPs (LocatedA t) (LHsExpr GhcPs))
 cvtFld f (v,e)
   = do  { v' <- vNameL v
         ; lhs' <- traverse f v'
diff --git a/testsuite/tests/driver/recompChangedPackage/q/q.cabal b/testsuite/tests/driver/recompChangedPackage/q/q.cabal
index 01c41cd9d08ac84d70b50ad8f6a0af9242dbf891..f9f1e871cb8c6343ff915357c8812e0d7d463202 100644
--- a/testsuite/tests/driver/recompChangedPackage/q/q.cabal
+++ b/testsuite/tests/driver/recompChangedPackage/q/q.cabal
@@ -17,7 +17,7 @@ build-type:          Simple
 extra-source-files:  CHANGELOG.md
 
 library
-  exposed-modules: QLib
+  exposed-modules: QLib PLib
   -- other-modules:
   -- other-extensions:
   build-depends:       base >=4 && <5
diff --git a/testsuite/tests/ghc-api/exactprint/AddDecl1.expected.hs b/testsuite/tests/ghc-api/exactprint/AddDecl1.expected.hs
index 88ef0fdd7def14a4833f6886c02227cd8a9b10fb..5e2e71b874e84a4be079fa3e65a6fc6310b3bb00 100644
--- a/testsuite/tests/ghc-api/exactprint/AddDecl1.expected.hs
+++ b/testsuite/tests/ghc-api/exactprint/AddDecl1.expected.hs
@@ -1,9 +1,9 @@
 module AddDecl where
 
-nn = n2
-
 -- Adding a declaration to an existing file
 
+nn = n2
+
 -- | Do foo
 foo a b = a + b
 
diff --git a/testsuite/tests/ghc-api/exactprint/Test20239.stderr b/testsuite/tests/ghc-api/exactprint/Test20239.stderr
index bb84374f1e3217965c4ef578e51f44974ac3c895..877552eeac7ac61e1e724132f3c217cc911dbee8 100644
--- a/testsuite/tests/ghc-api/exactprint/Test20239.stderr
+++ b/testsuite/tests/ghc-api/exactprint/Test20239.stderr
@@ -198,7 +198,7 @@
                  (HsParTy
                   (EpAnn
                    (Anchor
-                    { Test20239.hs:7:50 }
+                    { Test20239.hs:7:50-86 }
                     (UnchangedAnchor))
                    (AnnParen
                     (AnnParens)
@@ -211,7 +211,7 @@
                    (HsFunTy
                     (EpAnn
                      (Anchor
-                      { Test20239.hs:7:51-60 }
+                      { Test20239.hs:7:51-85 }
                       (UnchangedAnchor))
                      (NoEpAnns)
                      (EpaComments
@@ -260,7 +260,7 @@
                        (HsParTy
                         (EpAnn
                          (Anchor
-                          { Test20239.hs:7:68 }
+                          { Test20239.hs:7:68-85 }
                           (UnchangedAnchor))
                          (AnnParen
                           (AnnParens)
@@ -311,7 +311,7 @@
                            (HsTupleTy
                             (EpAnn
                              (Anchor
-                              { Test20239.hs:7:83 }
+                              { Test20239.hs:7:83-84 }
                               (UnchangedAnchor))
                              (AnnParen
                               (AnnParens)
@@ -326,5 +326,5 @@
 
 
 
-Test20239.hs:5:15: [GHC-76037]
+Test20239.hs:5:15: error: [GHC-76037]
     Not in scope: type constructor or class ‘Method’
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr b/testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr
index 869c7609ff001c1f8a7ef7153da4c91f2c637602..2b0581e55bf53750aa56168d1b6d4864748aefe9 100644
--- a/testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr
@@ -83,7 +83,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544.hs:6:3-4 }
+           { T17544.hs:6:3-16 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544.hs:6:6-7 }))
@@ -106,7 +106,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { T17544.hs:6:9 }
+               { T17544.hs:6:9-16 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -220,7 +220,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544.hs:10:3-4 }
+           { T17544.hs:10:3-16 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544.hs:10:6-7 }))
@@ -243,7 +243,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { T17544.hs:10:9 }
+               { T17544.hs:10:9-16 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -355,7 +355,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544.hs:14:3-4 }
+           { T17544.hs:14:3-16 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544.hs:14:6-7 }))
@@ -378,7 +378,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { T17544.hs:14:9 }
+               { T17544.hs:14:9-16 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -493,7 +493,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544.hs:18:3-4 }
+           { T17544.hs:18:3-16 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544.hs:18:6-7 }))
@@ -516,7 +516,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { T17544.hs:18:9 }
+               { T17544.hs:18:9-16 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -561,7 +561,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544.hs:20:3-4 }
+           { T17544.hs:20:3-16 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544.hs:20:6-7 }))
@@ -584,7 +584,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { T17544.hs:20:9 }
+               { T17544.hs:20:9-16 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -750,7 +750,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:23:1-8 }
+          { T17544.hs:(23,1)-(25,18) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:23:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:23:17-21 }))]
@@ -1028,7 +1028,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:29:1-8 }
+          { T17544.hs:(29,1)-(31,18) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:29:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:29:17-21 }))]
@@ -1306,7 +1306,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:35:1-8 }
+          { T17544.hs:(35,1)-(37,18) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:35:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:35:17-21 }))]
@@ -1584,7 +1584,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:41:1-8 }
+          { T17544.hs:(41,1)-(43,18) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:41:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:41:17-21 }))]
@@ -1862,7 +1862,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:47:1-8 }
+          { T17544.hs:(47,1)-(49,18) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:47:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:47:17-21 }))]
@@ -2140,7 +2140,7 @@
         (Nothing)
         (EpAnn
          (Anchor
-          { T17544.hs:53:1-8 }
+          { T17544.hs:(53,1)-(55,20) }
           (UnchangedAnchor))
          [(AddEpAnn AnnInstance (EpaSpan { T17544.hs:53:1-8 }))
          ,(AddEpAnn AnnWhere (EpaSpan { T17544.hs:53:18-22 }))]
diff --git a/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr b/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
index 6d8d524ef17e1b3ea2d330b2514afb62d211b957..76a25034163039bcb0d480b4e1adf83347daaee0 100644
--- a/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
+++ b/testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
@@ -12,7 +12,7 @@
     (AnnsModule
      [(AddEpAnn AnnModule (EpaSpan { T17544_kw.hs:11:1-6 }))
      ,(AddEpAnn AnnWhere (EpaSpan { T17544_kw.hs:13:13-17 }))]
-      []
+     []
      (Just
       ((,)
        { T17544_kw.hs:25:1 }
@@ -211,7 +211,7 @@
               (HsTupleTy
                (EpAnn
                 (Anchor
-                 { T17544_kw.hs:19:18 }
+                 { T17544_kw.hs:19:18-19 }
                  (UnchangedAnchor))
                 (AnnParen
                  (AnnParens)
@@ -303,7 +303,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { T17544_kw.hs:24:5-13 }
+           { T17544_kw.hs:24:5-18 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { T17544_kw.hs:24:15-16 }))
diff --git a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
index 6389ffcc91bfb77d63c242b803c202cd685ec758..be08561529bcc29e84a7925dc09cce16e5395631 100644
--- a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
@@ -201,7 +201,7 @@
          (HsFunTy
           (EpAnn
            (Anchor
-            { DumpParsedAst.hs:9:16-18 }
+            { DumpParsedAst.hs:9:16-27 }
             (UnchangedAnchor))
            (NoEpAnns)
            (EpaComments
@@ -216,7 +216,7 @@
            (HsListTy
             (EpAnn
              (Anchor
-              { DumpParsedAst.hs:9:16 }
+              { DumpParsedAst.hs:9:16-18 }
               (UnchangedAnchor))
              (AnnParen
               (AnnParensSquare)
@@ -302,7 +302,7 @@
                (HsParTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:11:10 }
+                  { DumpParsedAst.hs:11:10-17 }
                   (UnchangedAnchor))
                  (AnnParen
                   (AnnParens)
@@ -374,7 +374,7 @@
                (HsParTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:11:26 }
+                  { DumpParsedAst.hs:11:26-36 }
                   (UnchangedAnchor))
                  (AnnParen
                   (AnnParens)
@@ -438,7 +438,7 @@
                (HsExplicitListTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:12:10 }
+                  { DumpParsedAst.hs:12:10-12 }
                   (UnchangedAnchor))
                  [(AddEpAnn AnnSimpleQuote (EpaSpan { DumpParsedAst.hs:12:10 }))
                  ,(AddEpAnn AnnOpenS (EpaSpan { DumpParsedAst.hs:12:11 }))
@@ -492,7 +492,7 @@
             (HsListTy
              (EpAnn
               (Anchor
-               { DumpParsedAst.hs:10:27 }
+               { DumpParsedAst.hs:10:27-29 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParensSquare)
@@ -652,7 +652,7 @@
                (HsParTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:15:25 }
+                  { DumpParsedAst.hs:15:25-29 }
                   (UnchangedAnchor))
                  (AnnParen
                   (AnnParens)
@@ -731,7 +731,7 @@
          (HsFunTy
           (EpAnn
            (Anchor
-            { DumpParsedAst.hs:17:12 }
+            { DumpParsedAst.hs:17:12-35 }
             (UnchangedAnchor))
            (NoEpAnns)
            (EpaComments
@@ -761,7 +761,7 @@
            (HsFunTy
             (EpAnn
              (Anchor
-              { DumpParsedAst.hs:17:17-27 }
+              { DumpParsedAst.hs:17:17-35 }
               (UnchangedAnchor))
              (NoEpAnns)
              (EpaComments
@@ -776,7 +776,7 @@
              (HsParTy
               (EpAnn
                (Anchor
-                { DumpParsedAst.hs:17:17 }
+                { DumpParsedAst.hs:17:17-27 }
                 (UnchangedAnchor))
                (AnnParen
                 (AnnParens)
@@ -789,7 +789,7 @@
                (HsFunTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:17:18 }
+                  { DumpParsedAst.hs:17:18-26 }
                   (UnchangedAnchor))
                  (NoEpAnns)
                  (EpaComments
@@ -1076,7 +1076,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { DumpParsedAst.hs:18:31 }
+               { DumpParsedAst.hs:18:31-39 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -1183,7 +1183,7 @@
           (HsFunTy
            (EpAnn
             (Anchor
-             { DumpParsedAst.hs:21:20 }
+             { DumpParsedAst.hs:21:20-33 }
              (UnchangedAnchor))
             (NoEpAnns)
             (EpaComments
@@ -1213,7 +1213,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { DumpParsedAst.hs:21:25 }
+               { DumpParsedAst.hs:21:25-33 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -1291,7 +1291,7 @@
            (HsParTy
             (EpAnn
              (Anchor
-              { DumpParsedAst.hs:22:22 }
+              { DumpParsedAst.hs:22:22-37 }
               (UnchangedAnchor))
              (AnnParen
               (AnnParens)
@@ -1304,7 +1304,7 @@
              (HsKindSig
               (EpAnn
                (Anchor
-                { DumpParsedAst.hs:22:23 }
+                { DumpParsedAst.hs:22:23-36 }
                 (UnchangedAnchor))
                [(AddEpAnn AnnDcolon (EpaSpan { DumpParsedAst.hs:22:25-26 }))]
                (EpaComments
@@ -1329,7 +1329,7 @@
                (HsFunTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:22:28 }
+                  { DumpParsedAst.hs:22:28-36 }
                   (UnchangedAnchor))
                  (NoEpAnns)
                  (EpaComments
@@ -1380,7 +1380,7 @@
            (HsFunTy
             (EpAnn
              (Anchor
-              { DumpParsedAst.hs:22:42-52 }
+              { DumpParsedAst.hs:22:42-60 }
               (UnchangedAnchor))
              (NoEpAnns)
              (EpaComments
@@ -1395,7 +1395,7 @@
              (HsParTy
               (EpAnn
                (Anchor
-                { DumpParsedAst.hs:22:42 }
+                { DumpParsedAst.hs:22:42-52 }
                 (UnchangedAnchor))
                (AnnParen
                 (AnnParens)
@@ -1408,7 +1408,7 @@
                (HsFunTy
                 (EpAnn
                  (Anchor
-                  { DumpParsedAst.hs:22:43 }
+                  { DumpParsedAst.hs:22:43-51 }
                   (UnchangedAnchor))
                  (NoEpAnns)
                  (EpaComments
@@ -1508,7 +1508,7 @@
                 (HsParTy
                  (EpAnn
                   (Anchor
-                   { DumpParsedAst.hs:23:10 }
+                   { DumpParsedAst.hs:23:10-34 }
                    (UnchangedAnchor))
                   (AnnParen
                    (AnnParens)
@@ -1523,7 +1523,7 @@
                    (HsForAllInvis
                     (EpAnn
                      (Anchor
-                      { DumpParsedAst.hs:23:11-16 }
+                      { DumpParsedAst.hs:23:11-20 }
                       (UnchangedAnchor))
                      ((,)
                       (AddEpAnn AnnForall (EpaSpan { DumpParsedAst.hs:23:11-16 }))
@@ -1550,7 +1550,7 @@
                     (HsFunTy
                      (EpAnn
                       (Anchor
-                       { DumpParsedAst.hs:23:22-25 }
+                       { DumpParsedAst.hs:23:22-33 }
                        (UnchangedAnchor))
                       (NoEpAnns)
                       (EpaComments
diff --git a/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr b/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
index 7b65432466d85a8b064342d9d32dc276e8561aaf..ea2a4172182da2ce6663f6b7e142c7d19aafa278 100644
--- a/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
@@ -315,7 +315,7 @@
               (HsListTy
                (EpAnn
                 (Anchor
-                 { DumpRenamedAst.hs:12:27 }
+                 { DumpRenamedAst.hs:12:27-29 }
                  (UnchangedAnchor))
                 (AnnParen
                  (AnnParensSquare)
@@ -373,7 +373,7 @@
            (HsFunTy
             (EpAnn
              (Anchor
-              { DumpRenamedAst.hs:11:16-18 }
+              { DumpRenamedAst.hs:11:16-27 }
               (UnchangedAnchor))
              (NoEpAnns)
              (EpaComments
@@ -388,7 +388,7 @@
              (HsListTy
               (EpAnn
                (Anchor
-                { DumpRenamedAst.hs:11:16 }
+                { DumpRenamedAst.hs:11:16-18 }
                 (UnchangedAnchor))
                (AnnParen
                 (AnnParensSquare)
@@ -448,7 +448,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { DumpRenamedAst.hs:16:20 }
+               { DumpRenamedAst.hs:16:20-33 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -471,7 +471,7 @@
               (HsFunTy
                (EpAnn
                 (Anchor
-                 { DumpRenamedAst.hs:16:25 }
+                 { DumpRenamedAst.hs:16:25-33 }
                  (UnchangedAnchor))
                 (NoEpAnns)
                 (EpaComments
@@ -530,7 +530,7 @@
                (HsKindSig
                 (EpAnn
                  (Anchor
-                  { DumpRenamedAst.hs:19:23 }
+                  { DumpRenamedAst.hs:19:23-36 }
                   (UnchangedAnchor))
                  [(AddEpAnn AnnDcolon (EpaSpan { DumpRenamedAst.hs:19:25-26 }))]
                  (EpaComments
@@ -548,7 +548,7 @@
                  (HsFunTy
                   (EpAnn
                    (Anchor
-                    { DumpRenamedAst.hs:19:28 }
+                    { DumpRenamedAst.hs:19:28-36 }
                     (UnchangedAnchor))
                    (NoEpAnns)
                    (EpaComments
@@ -585,7 +585,7 @@
              (HsFunTy
               (EpAnn
                (Anchor
-                { DumpRenamedAst.hs:19:42-52 }
+                { DumpRenamedAst.hs:19:42-60 }
                 (UnchangedAnchor))
                (NoEpAnns)
                (EpaComments
@@ -604,7 +604,7 @@
                  (HsFunTy
                   (EpAnn
                    (Anchor
-                    { DumpRenamedAst.hs:19:43 }
+                    { DumpRenamedAst.hs:19:43-51 }
                     (UnchangedAnchor))
                    (NoEpAnns)
                    (EpaComments
@@ -701,7 +701,7 @@
                       (HsFunTy
                        (EpAnn
                         (Anchor
-                         { DumpRenamedAst.hs:20:22-25 }
+                         { DumpRenamedAst.hs:20:22-33 }
                          (UnchangedAnchor))
                         (NoEpAnns)
                         (EpaComments
@@ -1061,7 +1061,7 @@
               (HsFunTy
                (EpAnn
                 (Anchor
-                 { DumpRenamedAst.hs:25:31 }
+                 { DumpRenamedAst.hs:25:31-39 }
                  (UnchangedAnchor))
                 (NoEpAnns)
                 (EpaComments
@@ -1129,7 +1129,7 @@
            (HsFunTy
             (EpAnn
              (Anchor
-              { DumpRenamedAst.hs:24:12 }
+              { DumpRenamedAst.hs:24:12-35 }
               (UnchangedAnchor))
              (NoEpAnns)
              (EpaComments
@@ -1152,7 +1152,7 @@
              (HsFunTy
               (EpAnn
                (Anchor
-                { DumpRenamedAst.hs:24:17-27 }
+                { DumpRenamedAst.hs:24:17-35 }
                 (UnchangedAnchor))
                (NoEpAnns)
                (EpaComments
@@ -1171,7 +1171,7 @@
                  (HsFunTy
                   (EpAnn
                    (Anchor
-                    { DumpRenamedAst.hs:24:18 }
+                    { DumpRenamedAst.hs:24:18-26 }
                     (UnchangedAnchor))
                    (NoEpAnns)
                    (EpaComments
@@ -1334,7 +1334,7 @@
               (HsListTy
                (EpAnn
                 (Anchor
-                 { DumpRenamedAst.hs:31:12 }
+                 { DumpRenamedAst.hs:31:12-14 }
                  (UnchangedAnchor))
                 (AnnParen
                  (AnnParensSquare)
@@ -1376,7 +1376,7 @@
                 (HsListTy
                  (EpAnn
                   (Anchor
-                   { DumpRenamedAst.hs:32:10 }
+                   { DumpRenamedAst.hs:32:10-12 }
                    (UnchangedAnchor))
                   (AnnParen
                    (AnnParensSquare)
diff --git a/testsuite/tests/parser/should_compile/DumpSemis.stderr b/testsuite/tests/parser/should_compile/DumpSemis.stderr
index 6ead4e3dceae94d9b01a98939da781aaafb908b0..2497f5ab94c54451599a997af1d146a5040b28d9 100644
--- a/testsuite/tests/parser/should_compile/DumpSemis.stderr
+++ b/testsuite/tests/parser/should_compile/DumpSemis.stderr
@@ -152,7 +152,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { DumpSemis.hs:9:1-3 }
+        { DumpSemis.hs:9:1-12 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:9:5-6 }))
@@ -195,7 +195,7 @@
             (HsTupleTy
              (EpAnn
               (Anchor
-               { DumpSemis.hs:9:11 }
+               { DumpSemis.hs:9:11-12 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParens)
@@ -394,7 +394,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { DumpSemis.hs:14:1-3 }
+        { DumpSemis.hs:14:1-12 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:14:5-6 }))
@@ -437,7 +437,7 @@
             (HsTupleTy
              (EpAnn
               (Anchor
-               { DumpSemis.hs:14:11 }
+               { DumpSemis.hs:14:11-12 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParens)
@@ -604,7 +604,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { DumpSemis.hs:21:1-3 }
+        { DumpSemis.hs:21:1-12 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:21:5-6 }))
@@ -647,7 +647,7 @@
             (HsTupleTy
              (EpAnn
               (Anchor
-               { DumpSemis.hs:21:11 }
+               { DumpSemis.hs:21:11-12 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParens)
@@ -1101,7 +1101,7 @@
         (ClassOpSig
          (EpAnn
           (Anchor
-           { DumpSemis.hs:29:3-7 }
+           { DumpSemis.hs:29:3-23 }
            (UnchangedAnchor))
           (AnnSig
            (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:29:9-10 }))
@@ -1124,7 +1124,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { DumpSemis.hs:29:12-16 }
+               { DumpSemis.hs:29:12-23 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -1183,7 +1183,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { DumpSemis.hs:31:1 }
+        { DumpSemis.hs:31:1-30 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:31:3-4 }))
@@ -1303,7 +1303,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { DumpSemis.hs:31:25 }
+               { DumpSemis.hs:31:25-30 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
diff --git a/testsuite/tests/parser/should_compile/KindSigs.stderr b/testsuite/tests/parser/should_compile/KindSigs.stderr
index 40dc650b73f37251c0efdb35445daad7833760d3..d047f37c72d5ce616285c591db83a4b691a8cedc 100644
--- a/testsuite/tests/parser/should_compile/KindSigs.stderr
+++ b/testsuite/tests/parser/should_compile/KindSigs.stderr
@@ -120,7 +120,7 @@
              (HsKindSig
               (EpAnn
                (Anchor
-                { KindSigs.hs:12:11-13 }
+                { KindSigs.hs:12:11-21 }
                 (UnchangedAnchor))
                [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:12:15-16 }))]
                (EpaComments
@@ -232,7 +232,7 @@
        (HsTupleTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:15:14 }
+          { KindSigs.hs:15:14-51 }
           (UnchangedAnchor))
          (AnnParen
           (AnnParens)
@@ -254,7 +254,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:15:16-18 }
+             { KindSigs.hs:15:16-26 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:15:20-21 }))]
             (EpaComments
@@ -317,7 +317,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:15:35-41 }
+             { KindSigs.hs:15:35-49 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:15:43-44 }))]
             (EpaComments
@@ -418,7 +418,7 @@
        (HsTupleTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:16:15-16 }
+          { KindSigs.hs:16:15-54 }
           (UnchangedAnchor))
          (AnnParen
           (AnnParensHash)
@@ -440,7 +440,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:16:18-20 }
+             { KindSigs.hs:16:18-28 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:16:22-23 }))]
             (EpaComments
@@ -503,7 +503,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:16:37-43 }
+             { KindSigs.hs:16:37-51 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:16:45-46 }))]
             (EpaComments
@@ -590,7 +590,7 @@
        (HsListTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:19:12 }
+          { KindSigs.hs:19:12-26 }
           (UnchangedAnchor))
          (AnnParen
           (AnnParensSquare)
@@ -603,7 +603,7 @@
          (HsKindSig
           (EpAnn
            (Anchor
-            { KindSigs.hs:19:14-16 }
+            { KindSigs.hs:19:14-24 }
             (UnchangedAnchor))
            [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:19:18-19 }))]
            (EpaComments
@@ -652,7 +652,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { KindSigs.hs:22:1-3 }
+        { KindSigs.hs:22:1-44 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:22:5-6 }))
@@ -676,7 +676,7 @@
           (HsFunTy
            (EpAnn
             (Anchor
-             { KindSigs.hs:22:8-20 }
+             { KindSigs.hs:22:8-44 }
              (UnchangedAnchor))
             (NoEpAnns)
             (EpaComments
@@ -691,7 +691,7 @@
             (HsParTy
              (EpAnn
               (Anchor
-               { KindSigs.hs:22:8 }
+               { KindSigs.hs:22:8-20 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParens)
@@ -704,7 +704,7 @@
               (HsKindSig
                (EpAnn
                 (Anchor
-                 { KindSigs.hs:22:9-11 }
+                 { KindSigs.hs:22:9-19 }
                  (UnchangedAnchor))
                 [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:22:13-14 }))]
                 (EpaComments
@@ -744,7 +744,7 @@
             (HsFunTy
              (EpAnn
               (Anchor
-               { KindSigs.hs:22:25-28 }
+               { KindSigs.hs:22:25-44 }
                (UnchangedAnchor))
               (NoEpAnns)
               (EpaComments
@@ -774,7 +774,7 @@
               (HsParTy
                (EpAnn
                 (Anchor
-                 { KindSigs.hs:22:33 }
+                 { KindSigs.hs:22:33-44 }
                  (UnchangedAnchor))
                 (AnnParen
                  (AnnParens)
@@ -787,7 +787,7 @@
                 (HsKindSig
                  (EpAnn
                   (Anchor
-                   { KindSigs.hs:22:34-35 }
+                   { KindSigs.hs:22:34-43 }
                    (UnchangedAnchor))
                   [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:22:37-38 }))]
                   (EpaComments
@@ -797,7 +797,7 @@
                   (HsTupleTy
                    (EpAnn
                     (Anchor
-                     { KindSigs.hs:22:34 }
+                     { KindSigs.hs:22:34-35 }
                      (UnchangedAnchor))
                     (AnnParen
                      (AnnParens)
@@ -946,7 +946,7 @@
        (HsExplicitListTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:26:13 }
+          { KindSigs.hs:26:13-29 }
           (UnchangedAnchor))
          [(AddEpAnn AnnSimpleQuote (EpaSpan { KindSigs.hs:26:13 }))
          ,(AddEpAnn AnnOpenS (EpaSpan { KindSigs.hs:26:14 }))
@@ -959,7 +959,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:26:16-19 }
+             { KindSigs.hs:26:16-27 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:26:21-22 }))]
             (EpaComments
@@ -1027,7 +1027,7 @@
        (HsExplicitListTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:27:14 }
+          { KindSigs.hs:27:14-45 }
           (UnchangedAnchor))
          [(AddEpAnn AnnOpenS (EpaSpan { KindSigs.hs:27:14 }))
          ,(AddEpAnn AnnCloseS (EpaSpan { KindSigs.hs:27:45 }))]
@@ -1047,7 +1047,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:27:16-19 }
+             { KindSigs.hs:27:16-27 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:27:21-22 }))]
             (EpaComments
@@ -1087,7 +1087,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:27:30-34 }
+             { KindSigs.hs:27:30-42 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:27:36-37 }))]
             (EpaComments
@@ -1169,7 +1169,7 @@
        (HsExplicitTupleTy
         (EpAnn
          (Anchor
-          { KindSigs.hs:28:16 }
+          { KindSigs.hs:28:16-44 }
           (UnchangedAnchor))
          [(AddEpAnn AnnSimpleQuote (EpaSpan { KindSigs.hs:28:16 }))
          ,(AddEpAnn AnnOpenP (EpaSpan { KindSigs.hs:28:17 }))
@@ -1189,7 +1189,7 @@
           (HsKindSig
            (EpAnn
             (Anchor
-             { KindSigs.hs:28:19-29 }
+             { KindSigs.hs:28:19-39 }
              (UnchangedAnchor))
             [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:28:31-32 }))]
             (EpaComments
@@ -1199,7 +1199,7 @@
             (HsExplicitListTy
              (EpAnn
               (Anchor
-               { KindSigs.hs:28:19 }
+               { KindSigs.hs:28:19-29 }
                (UnchangedAnchor))
               [(AddEpAnn AnnOpenS (EpaSpan { KindSigs.hs:28:19 }))
               ,(AddEpAnn AnnCloseS (EpaSpan { KindSigs.hs:28:29 }))]
@@ -1249,7 +1249,7 @@
             (HsListTy
              (EpAnn
               (Anchor
-               { KindSigs.hs:28:34 }
+               { KindSigs.hs:28:34-39 }
                (UnchangedAnchor))
               (AnnParen
                (AnnParensSquare)
@@ -1320,7 +1320,7 @@
        (HsKindSig
         (EpAnn
          (Anchor
-          { KindSigs.hs:31:21-23 }
+          { KindSigs.hs:31:21-31 }
           (UnchangedAnchor))
          [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:31:25-26 }))]
          (EpaComments
@@ -1369,7 +1369,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { KindSigs.hs:34:1-4 }
+        { KindSigs.hs:34:1-22 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:34:6-7 }))
@@ -1393,7 +1393,7 @@
           (HsParTy
            (EpAnn
             (Anchor
-             { KindSigs.hs:34:9 }
+             { KindSigs.hs:34:9-22 }
              (UnchangedAnchor))
             (AnnParen
              (AnnParens)
@@ -1406,7 +1406,7 @@
             (HsKindSig
              (EpAnn
               (Anchor
-               { KindSigs.hs:34:10-13 }
+               { KindSigs.hs:34:10-21 }
                (UnchangedAnchor))
               [(AddEpAnn AnnDcolon (EpaSpan { KindSigs.hs:34:15-16 }))]
               (EpaComments
diff --git a/testsuite/tests/parser/should_compile/T14189.stderr b/testsuite/tests/parser/should_compile/T14189.stderr
index 5fd2724f165014f6cb34b2704703e3857bcaeba1..431ae3845ae1a44d3ab1e20637674d2f24a1428e 100644
--- a/testsuite/tests/parser/should_compile/T14189.stderr
+++ b/testsuite/tests/parser/should_compile/T14189.stderr
@@ -114,7 +114,7 @@
               (L
                (SrcSpanAnn (EpAnn
                             (Anchor
-                             { T14189.hs:6:31 }
+                             { T14189.hs:6:31-42 }
                              (UnchangedAnchor))
                             (AnnList
                              (Just
diff --git a/testsuite/tests/parser/should_compile/T15323.stderr b/testsuite/tests/parser/should_compile/T15323.stderr
index 9ec7d7748d940af5c2722145af25b5be67d26fc6..1da3125d2a3027d004e3dba85286ed57bbf1ce5b 100644
--- a/testsuite/tests/parser/should_compile/T15323.stderr
+++ b/testsuite/tests/parser/should_compile/T15323.stderr
@@ -102,16 +102,16 @@
            (L
             (SrcSpanAnn (EpAnn
                          (Anchor
-                          { T15323.hs:6:20-25 }
+                          { T15323.hs:6:20-29 }
                           (UnchangedAnchor))
                          (AnnListItem
                           [])
                          (EpaComments
-                          [])) { T15323.hs:6:20-25 })
+                          [])) { T15323.hs:6:20-29 })
             (HsOuterExplicit
              (EpAnn
               (Anchor
-               { T15323.hs:6:20-25 }
+               { T15323.hs:6:20-29 }
                (UnchangedAnchor))
               ((,)
                (AddEpAnn AnnForall (EpaSpan { T15323.hs:6:20-25 }))
@@ -153,7 +153,7 @@
                (HsParTy
                 (EpAnn
                  (Anchor
-                  { T15323.hs:6:31 }
+                  { T15323.hs:6:31-36 }
                   (UnchangedAnchor))
                  (AnnParen
                   (AnnParens)
diff --git a/testsuite/tests/parser/should_compile/T20452.stderr b/testsuite/tests/parser/should_compile/T20452.stderr
index a3bb2e7781723d85afb7a261e039fb972d77ffb1..77a5dff85ebf7b27b26394b3b72657c33f9227e3 100644
--- a/testsuite/tests/parser/should_compile/T20452.stderr
+++ b/testsuite/tests/parser/should_compile/T20452.stderr
@@ -334,7 +334,7 @@
            (HsListTy
             (EpAnn
              (Anchor
-              { T20452.hs:8:57 }
+              { T20452.hs:8:57-74 }
               (UnchangedAnchor))
              (AnnParen
               (AnnParensSquare)
@@ -347,7 +347,7 @@
              (HsTupleTy
               (EpAnn
                (Anchor
-                { T20452.hs:8:58 }
+                { T20452.hs:8:58-73 }
                 (UnchangedAnchor))
                (AnnParen
                 (AnnParens)
@@ -534,7 +534,7 @@
            (HsListTy
             (EpAnn
              (Anchor
-              { T20452.hs:9:57 }
+              { T20452.hs:9:57-74 }
               (UnchangedAnchor))
              (AnnParen
               (AnnParensSquare)
@@ -547,7 +547,7 @@
              (HsTupleTy
               (EpAnn
                (Anchor
-                { T20452.hs:9:58 }
+                { T20452.hs:9:58-73 }
                 (UnchangedAnchor))
                (AnnParen
                 (AnnParens)
diff --git a/testsuite/tests/parser/should_compile/T20846.stderr b/testsuite/tests/parser/should_compile/T20846.stderr
index 4a1981b6e10a6b7308b7e8bce6c8c39200049cd1..a19f42be17a80e1d6945a3577cf25785d3862382 100644
--- a/testsuite/tests/parser/should_compile/T20846.stderr
+++ b/testsuite/tests/parser/should_compile/T20846.stderr
@@ -44,7 +44,7 @@
      (FixSig
       (EpAnn
        (Anchor
-        { T20846.hs:3:1-6 }
+        { T20846.hs:3:1-11 }
         (UnchangedAnchor))
        [(AddEpAnn AnnInfix (EpaSpan { T20846.hs:3:1-6 }))]
        (EpaComments
@@ -145,3 +145,5 @@
                    {OccName: undefined}))))))]
             (EmptyLocalBinds
              (NoExtField)))))])))))]))
+
+
diff --git a/testsuite/tests/parser/should_compile/T23315/T23315.stderr b/testsuite/tests/parser/should_compile/T23315/T23315.stderr
index 1cc94f80b84a3c926e0a7886f7e2890f8689cfae..4a4f2637d9bb8d8771c8e28eedc0dad3b025781c 100644
--- a/testsuite/tests/parser/should_compile/T23315/T23315.stderr
+++ b/testsuite/tests/parser/should_compile/T23315/T23315.stderr
@@ -12,7 +12,7 @@
     (AnnsModule
      [(AddEpAnn AnnSignature (EpaSpan { T23315.hsig:1:1-9 }))
      ,(AddEpAnn AnnWhere (EpaSpan { T23315.hsig:1:18-22 }))]
-      []
+     []
      (Nothing))
     (EpaComments
      []))
@@ -57,7 +57,7 @@
      (TypeSig
       (EpAnn
        (Anchor
-        { T23315.hsig:3:1 }
+        { T23315.hsig:3:1-7 }
         (UnchangedAnchor))
        (AnnSig
         (AddEpAnn AnnDcolon (EpaSpan { T23315.hsig:3:3-4 }))
@@ -81,7 +81,7 @@
           (HsTupleTy
            (EpAnn
             (Anchor
-             { T23315.hsig:3:6 }
+             { T23315.hsig:3:6-7 }
              (UnchangedAnchor))
             (AnnParen
              (AnnParens)
diff --git a/utils/check-exact/ExactPrint.hs b/utils/check-exact/ExactPrint.hs
index d16f17af347bcedefdaed8ff6b8739ca90969a5e..add9eaf4fbd437ee78b214f62fe2adefd995f84b 100644
--- a/utils/check-exact/ExactPrint.hs
+++ b/utils/check-exact/ExactPrint.hs
@@ -68,6 +68,8 @@ import qualified Data.Map.Strict as Map
 import Data.Maybe ( isJust, mapMaybe )
 import Data.Void
 
+import Orphans ()
+
 import Lookup
 import Utils
 import Types
@@ -108,13 +110,14 @@ runEP epReader action = do
 defaultEPState :: EPState
 defaultEPState = EPState
              { epPos      = (1,1)
-             , dLHS       = 1
+             , dLHS       = 0
              , pMarkLayout = False
-             , pLHS = 1
+             , pLHS = 0
              , dMarkLayout = False
              , dPriorEndPosition = (1,1)
              , uAnchorSpan = badRealSrcSpan
              , uExtraDP = Nothing
+             , pAcceptSpan = False
              , epComments = []
              , epCommentsApplied = []
              , epEof = Nothing
@@ -176,6 +179,13 @@ data EPState = EPState
                                           -- Annotation
              , uExtraDP :: !(Maybe Anchor) -- ^ Used to anchor a
                                              -- list
+             , pAcceptSpan :: Bool -- ^ When we have processed an
+                                   -- entry of EpaDelta, accept the
+                                   -- next `EpaSpan` start as the
+                                   -- current output position. i.e. do
+                                   -- not advance epPos. Achieved by
+                                   -- setting dPriorEndPosition to the
+                                   -- end of the span.
 
              -- Print phase
              , epPos        :: !Pos -- ^ Current output position
@@ -201,6 +211,34 @@ data EPState = EPState
 class HasEntry ast where
   fromAnn :: ast -> Entry
 
+class HasTrailing a where
+  trailing :: a -> [TrailingAnn]
+  setTrailing :: a -> [TrailingAnn] -> a
+
+setAnchorEpa :: (HasTrailing an, NoAnn an)
+             => EpAnn an -> Anchor -> [TrailingAnn] -> EpAnnComments -> EpAnn an
+setAnchorEpa EpAnnNotUsed   anc ts cs = EpAnn anc (setTrailing noAnn ts) cs
+setAnchorEpa (EpAnn _ an _) anc ts cs = EpAnn anc (setTrailing an ts)          cs
+
+setAnchorHsModule :: HsModule GhcPs -> Anchor -> EpAnnComments -> HsModule GhcPs
+setAnchorHsModule hsmod anc cs = hsmod { hsmodExt = (hsmodExt hsmod) {hsmodAnn = an'} }
+  where
+    anc' = anc
+    an' = setAnchorEpa (hsmodAnn $ hsmodExt hsmod) anc' [] cs
+
+setAnchorAn :: (HasTrailing an, NoAnn an)
+             => LocatedAn an a -> Anchor -> [TrailingAnn] -> EpAnnComments -> LocatedAn an a
+setAnchorAn (L (SrcSpanAnn EpAnnNotUsed l)    a) anc ts cs
+  = (L (SrcSpanAnn (EpAnn anc (setTrailing noAnn ts) cs) l) a)
+     -- `debug` ("setAnchorAn: anc=" ++ showAst anc)
+setAnchorAn (L (SrcSpanAnn (EpAnn _ an _) l) a) anc ts cs
+  = (L (SrcSpanAnn (EpAnn anc (setTrailing an ts) cs) l) a)
+     -- `debug` ("setAnchorAn: anc=" ++ showAst anc)
+
+setAnchorEpaL :: EpAnn AnnList -> Anchor -> [TrailingAnn] -> EpAnnComments -> EpAnn AnnList
+setAnchorEpaL EpAnnNotUsed   anc ts cs = EpAnn anc (setTrailing noAnn ts) cs
+setAnchorEpaL (EpAnn _ an _) anc ts cs = EpAnn anc (setTrailing (an {al_anchor = Nothing}) ts) cs
+
 -- ---------------------------------------------------------------------
 
 -- | Key entry point.  Switches to an independent AST element with its
@@ -220,30 +258,134 @@ data CanUpdateAnchor = CanUpdateAnchor
                      | NoCanUpdateAnchor
                    deriving (Eq, Show)
 
-data Entry = Entry Anchor EpAnnComments FlushComments CanUpdateAnchor
+data Entry = Entry Anchor [TrailingAnn] EpAnnComments FlushComments CanUpdateAnchor
            | NoEntryVal
 
 -- | For flagging whether to capture comments in an EpaDelta or not
 data CaptureComments = CaptureComments
                      | NoCaptureComments
 
-mkEntry :: Anchor -> EpAnnComments -> Entry
-mkEntry anc cs = Entry anc cs NoFlushComments CanUpdateAnchor
+mkEntry :: Anchor -> [TrailingAnn] -> EpAnnComments -> Entry
+mkEntry anc ts cs = Entry anc ts cs NoFlushComments CanUpdateAnchor
 
-instance HasEntry (SrcSpanAnn' (EpAnn an)) where
-  fromAnn (SrcSpanAnn EpAnnNotUsed ss) = mkEntry (spanAsAnchor ss) emptyComments
+instance (HasTrailing an) => HasEntry (SrcSpanAnn' (EpAnn an)) where
+  fromAnn (SrcSpanAnn EpAnnNotUsed ss) = mkEntry (spanAsAnchor ss) [] emptyComments
   fromAnn (SrcSpanAnn an _) = fromAnn an
 
-instance HasEntry (EpAnn a) where
-  fromAnn (EpAnn anchor _ cs) = mkEntry anchor cs
+instance (HasTrailing a) => HasEntry (EpAnn a) where
+  fromAnn (EpAnn anc a cs) = mkEntry anc (trailing a) cs
   fromAnn EpAnnNotUsed = NoEntryVal
 
 -- ---------------------------------------------------------------------
 
+instance HasTrailing NoEpAnns where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing EpaLocation where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AddEpAnn where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing [AddEpAnn] where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing (AddEpAnn, AddEpAnn) where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing EpAnnSumPat where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnList where
+  trailing a = al_trailing a
+  setTrailing a ts = a { al_trailing = ts }
+
+instance HasTrailing AnnListItem where
+  trailing a = lann_trailing a
+  setTrailing a ts = a { lann_trailing = ts }
+
+instance HasTrailing AnnPragma where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnContext where
+  trailing (AnnContext ma _opens _closes)
+    = case ma of
+      Just (UnicodeSyntax, r) -> [AddDarrowUAnn r]
+      Just (NormalSyntax,  r) -> [AddDarrowAnn r]
+      Nothing -> []
+
+  setTrailing a [AddDarrowUAnn r] = a {ac_darrow = Just (UnicodeSyntax, r)}
+  setTrailing a [AddDarrowAnn r] = a{ac_darrow = Just (NormalSyntax, r)}
+  setTrailing a [] = a{ac_darrow = Nothing}
+  setTrailing a ts = error $ "Cannot setTrailing " ++ showAst ts ++ " for " ++ showAst a
+
+
+instance HasTrailing AnnParen where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnsIf where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing EpAnnHsCase where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnFieldLabel where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnProjection where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnExplicitSum where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing EpAnnUnboundVar where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing GrhsAnn where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnSig where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing HsRuleAnn where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing EpAnnImportDecl where
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing AnnsModule where
+  -- Report none, as all are used internally
+  trailing _ = []
+  setTrailing a _ = a
+
+instance HasTrailing NameAnn where
+  trailing a = nann_trailing a
+  setTrailing a ts = a { nann_trailing = ts }
+
+-- ---------------------------------------------------------------------
+
 fromAnn' :: (HasEntry a) => a -> Entry
 fromAnn' an = case fromAnn an of
   NoEntryVal -> NoEntryVal
-  Entry a c _ u -> Entry a c FlushComments u
+  Entry a ts c _ u -> Entry a ts c FlushComments u
 
 -- ---------------------------------------------------------------------
 
@@ -257,6 +399,7 @@ cua NoCanUpdateAnchor _ = return []
 
 -- | "Enter" an annotation, by using the associated 'anchor' field as
 -- the new reference point for calculating all DeltaPos positions.
+-- This is the heart of the exact printing process.
 --
 -- This is combination of the ghc=exactprint Delta.withAST and
 -- Print.exactPC functions and effectively does the delta processing
@@ -268,28 +411,48 @@ enterAnn NoEntryVal a = do
   r <- exact a
   debugM $ "enterAnn:done:NO ANN:p =" ++ show (p, astId a)
   return r
-enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
+enterAnn (Entry anchor' trailing_anns cs flush canUpdateAnchor) a = do
+  acceptSpan <- getAcceptSpan
+  setAcceptSpan False
+  case anchor' of
+    Anchor _ (MovedAnchor _ _) -> setAcceptSpan True
+    _                          -> return ()
   p <- getPosP
-  debugM $ "enterAnn:starting:(p,a) =" ++ show (p, astId a)
-  -- debugM $ "enterAnn:(cs) =" ++ showGhc (cs)
-  let curAnchor = anchor anchor' -- As a base for the current AST element
+  pe0 <- getPriorEndD
+  debugM $ "enterAnn:starting:(p,pe,anchor',a) =" ++ show (p, pe0, showAst anchor', astId a)
+  debugM $ "enterAnn:anchor_op=" ++ showGhc (anchor_op anchor')
+  prevAnchor <- getAnchorU
+  let curAnchor = case anchor' of
+        Anchor r UnchangedAnchor -> r
+        _ -> prevAnchor
   debugM $ "enterAnn:(curAnchor):=" ++ show (rs2range curAnchor)
   case canUpdateAnchor of
     CanUpdateAnchor -> pushAppliedComments
     _ -> return ()
-  addCommentsA (priorComments cs)
+  case anchor' of
+    Anchor _ (MovedAnchor _ dcs) -> do
+      debugM $ "enterAnn:Printing comments:" ++ showGhc (priorComments cs)
+      mapM_ printOneComment (concatMap tokComment $ priorComments cs)
+      debugM $ "enterAnn:Printing EpaDelta comments:" ++ showGhc dcs
+      mapM_ printOneComment (concatMap tokComment dcs)
+    _ -> do
+      debugM $ "enterAnn:Adding comments:" ++ showGhc (priorComments cs)
+      addCommentsA (priorComments cs)
   debugM $ "enterAnn:Added comments"
-  printComments curAnchor
+  printCommentsBefore curAnchor
   priorCs <- cua canUpdateAnchor takeAppliedComments -- no pop
   -- -------------------------
   case anchor_op anchor' of
-    MovedAnchor dp -> do
+    MovedAnchor dp _ -> do
       debugM $ "enterAnn: MovedAnchor:" ++ show dp
       -- Set the original anchor as prior end, so the rest of this AST
       -- fragment has a reference
       setPriorEndNoLayoutD (ss2pos curAnchor)
     _ -> do
-      return ()
+      if acceptSpan
+        then setPriorEndNoLayoutD (ss2pos curAnchor)
+        else return ()
+
   -- -------------------------
   if ((fst $ fst $ rs2range curAnchor) >= 0)
     then
@@ -322,7 +485,7 @@ enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
                off (ss2delta priorEndAfterComments curAnchor)
   debugM $ "enterAnn: (edp',off,priorEndAfterComments,curAnchor):" ++ show (edp',off,priorEndAfterComments,rs2range curAnchor)
   let edp'' = case anchor_op anchor' of
-        MovedAnchor dp -> dp
+        MovedAnchor dp _ -> dp
         _ -> edp'
   -- ---------------------------------------------
   -- let edp = edp''
@@ -330,14 +493,13 @@ enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
   setExtraDP Nothing
   let edp = case med of
         Nothing -> edp''
-        Just (Anchor _ (MovedAnchor dp)) -> dp
+        Just (Anchor _ (MovedAnchor dp _)) -> dp
                    -- Replace original with desired one. Allows all
                    -- list entry values to be DP (1,0)
         Just (Anchor r _) -> dp
           where
             dp = adjustDeltaForOffset
                    off (ss2delta priorEndAfterComments r)
-  when (isJust med) $ debugM $ "enterAnn:(med,edp)=" ++ show (med,edp)
   -- ---------------------------------------------
   -- Preparation complete, perform the action
   when (priorEndAfterComments < spanStart) (do
@@ -345,7 +507,7 @@ enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
     modify (\s -> s { dPriorEndPosition    = spanStart } ))
 
   debugM $ "enterAnn: (anchor_op, curAnchor):" ++ show (anchor_op anchor', rs2range curAnchor)
-  debugM $ "enterAnn: (dLHS,spanStart,pec,edp)=" ++ show (off,spanStart,priorEndAfterComments,edp)
+  -- debugM $ "enterAnn: (dLHS,spanStart,pec,edp)=" ++ show (off,spanStart,priorEndAfterComments,edp)
   p0 <- getPosP
   d <- getPriorEndD
   debugM $ "enterAnn: (posp, posd)=" ++ show (p0,d)
@@ -354,21 +516,12 @@ enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
   -- -------------------------------------------------------------------
   -- start of print phase processing
 
-  let mflush = when (flush == FlushComments) $ do
-        debugM $ "flushing comments in enterAnn:" ++ showAst cs
-        flushComments (getFollowingComments cs)
-
   advance edp
   a' <- exact a
-  mflush
-
-  -- end of sub-Anchor processing, start of tail end processing
-  postCs <- cua canUpdateAnchor takeAppliedCommentsPop
-  when (flush == NoFlushComments) $ do
-    when ((getFollowingComments cs) /= []) $ do
-      debugM $ "starting trailing comments:" ++ showAst (getFollowingComments cs)
-      mapM_ printOneComment (concatMap tokComment $ getFollowingComments cs)
-      debugM $ "ending trailing comments"
+  when (flush == FlushComments) $ do
+    debugM $ "flushing comments in enterAnn:" ++ showAst cs
+    flushComments (getFollowingComments cs)
+    debugM $ "flushing comments in enterAnn done"
 
   eof <- getEofPos
   case eof of
@@ -377,18 +530,41 @@ enterAnn (Entry anchor' cs flush canUpdateAnchor) a = do
        let dp = if pos == prior
              then (DifferentLine 1 0)
              else origDelta pos prior
-       debugM $ "EOF:(pos,prior,dp) =" ++ showGhc (ss2pos pos, ss2pos prior, dp)
+       debugM $ "EOF:(pos,posEnd,prior,dp) =" ++ showGhc (ss2pos pos, ss2posEnd pos, ss2pos prior, dp)
        printStringAtLsDelta dp ""
        setEofPos Nothing -- Only do this once
 
-  let newAchor = anchor' { anchor_op = MovedAnchor edp }
+  -- Deal with exit from the current anchor
+  when (flush == NoFlushComments) $ do
+    printCommentsIn curAnchor -- Make sure all comments in the span are printed
+
+  p1 <- getPosP
+  pe1 <- getPriorEndD
+  debugM $ "enterAnn:done:(p,pe,anchor,a) =" ++ show (p1, pe1, showAst anchor', astId a')
+
+  case anchor' of
+    Anchor _ (MovedAnchor _ _) -> return ()
+    Anchor rss UnchangedAnchor -> do
+      setAcceptSpan False
+      setPriorEndD (snd $ rs2range rss)
+
+  -- Outside the anchor, mark any trailing
+  postCs <- cua canUpdateAnchor takeAppliedCommentsPop
+  when (flush == NoFlushComments) $ do
+    when ((getFollowingComments cs) /= []) $ do
+
+      -- debugM $ "enterAnn:in:(anchor') =" ++ show (eloc2str anchor')
+      debugM $ "starting trailing comments:" ++ showAst (getFollowingComments cs)
+      mapM_ printOneComment (concatMap tokComment $ getFollowingComments cs)
+      debugM $ "ending trailing comments"
+  trailing' <- markTrailing trailing_anns
+
+  -- Update original anchor, comments based on the printing process
+  let newAchor = anchor' { anchor_op = MovedAnchor edp [] }
   let r = case canUpdateAnchor of
-            CanUpdateAnchor -> setAnnotationAnchor a' newAchor (mkEpaComments (priorCs++ postCs) [])
-            CanUpdateAnchorOnly -> setAnnotationAnchor a' newAchor emptyComments
+            CanUpdateAnchor -> setAnnotationAnchor a' newAchor trailing' (mkEpaComments (priorCs ++ postCs) [])
+            CanUpdateAnchorOnly -> setAnnotationAnchor a' newAchor [] emptyComments
             NoCanUpdateAnchor -> a'
-  -- debugM $ "calling setAnnotationAnchor:(curAnchor, newAchor,priorCs,postCs)=" ++ showAst (show (rs2range curAnchor), newAchor, priorCs, postCs)
-  -- debugM $ "calling setAnnotationAnchor:(newAchor,postCs)=" ++ showAst (newAchor, postCs)
-  debugM $ "enterAnn:done:(p,a) =" ++ show (p0, astId a')
   return r
 
 -- ---------------------------------------------------------------------
@@ -424,11 +600,13 @@ addComments csNew = do
 -- | Just before we print out the EOF comments, flush the remaining
 -- ones in the state.
 flushComments :: (Monad m, Monoid w) => [LEpaComment] -> EP w m ()
-flushComments trailing = do
-  addCommentsA trailing
+flushComments trailing_anns = do
+  addCommentsA trailing_anns
   cs <- getUnallocatedComments
   debugM $ "flushing comments starting"
+    -- AZ:TODO: is the sort still needed?
   mapM_ printOneComment (sortComments cs)
+  putUnallocatedComments []
   debugM $ "flushing comments done"
 
 -- ---------------------------------------------------------------------
@@ -470,7 +648,7 @@ withPpr a = do
 -- 'ppr'.
 class (Typeable a) => ExactPrint a where
   getAnnotationEntry :: a -> Entry
-  setAnnotationAnchor :: a -> Anchor -> EpAnnComments -> a
+  setAnnotationAnchor :: a -> Anchor -> [TrailingAnn] -> EpAnnComments -> a
   exact :: (Monad m, Monoid w) => a -> EP w m a
 
 -- ---------------------------------------------------------------------
@@ -493,7 +671,7 @@ printStringAtRsC :: (Monad m, Monoid w)
   => CaptureComments -> RealSrcSpan -> String -> EP w m EpaLocation
 printStringAtRsC capture pa str = do
   debugM $ "printStringAtRsC: pa=" ++ showAst pa
-  printComments pa
+  printCommentsBefore pa
   pe <- getPriorEndD
   debugM $ "printStringAtRsC:pe=" ++ show pe
   let p = ss2delta pe pa
@@ -548,7 +726,7 @@ printStringAtAAC :: (Monad m, Monoid w)
   => CaptureComments -> EpaLocation -> String -> EP w m EpaLocation
 printStringAtAAC capture (EpaSpan r _) s = printStringAtRsC capture r s
 printStringAtAAC capture (EpaDelta d cs) s = do
-  mapM_  printOneComment $ concatMap tokComment cs
+  mapM_ printOneComment $ concatMap tokComment cs
   pe1 <- getPriorEndD
   p1 <- getPosP
   printStringAtLsDelta d s
@@ -815,9 +993,9 @@ lal_rest :: Lens AnnList [AddEpAnn]
 lal_rest k parent = fmap (\new -> parent { al_rest = new })
                            (k (al_rest parent))
 
-lal_trailing :: Lens AnnList [TrailingAnn]
-lal_trailing k parent = fmap (\new -> parent { al_trailing = new })
-                           (k (al_trailing parent))
+-- lal_trailing :: Lens AnnList [TrailingAnn]
+-- lal_trailing k parent = fmap (\new -> parent { al_trailing = new })
+--                            (k (al_trailing parent))
 
 -- -------------------------------------
 
@@ -1107,12 +1285,6 @@ markLensKwM (EpAnn anc a cs) l kw = do
 
 -- ---------------------------------------------------------------------
 
-markALocatedA :: (Monad m, Monoid w) => EpAnn AnnListItem -> EP w m (EpAnn AnnListItem)
-markALocatedA EpAnnNotUsed  = return EpAnnNotUsed
-markALocatedA (EpAnn anc a cs) = do
-  t <- markTrailing (lann_trailing a)
-  return (EpAnn anc (a { lann_trailing = t }) cs)
-
 markEpAnnL :: (Monad m, Monoid w)
   => EpAnn ann -> Lens ann [AddEpAnn] -> AnnKeywordId -> EP w m (EpAnn ann)
 markEpAnnL EpAnnNotUsed _ _ = return EpAnnNotUsed
@@ -1183,6 +1355,8 @@ markKwT :: (Monad m, Monoid w) => TrailingAnn -> EP w m TrailingAnn
 markKwT (AddSemiAnn ss)    = AddSemiAnn    <$> markKwA AnnSemi ss
 markKwT (AddCommaAnn ss)   = AddCommaAnn   <$> markKwA AnnComma ss
 markKwT (AddVbarAnn ss)    = AddVbarAnn    <$> markKwA AnnVbar ss
+markKwT (AddDarrowAnn ss)  = AddDarrowAnn  <$> markKwA AnnDarrow ss
+markKwT (AddDarrowUAnn ss) = AddDarrowUAnn <$> markKwA AnnDarrowU ss
 
 -- ---------------------------------------------------------------------
 
@@ -1200,23 +1374,28 @@ markAnnListA :: (Monad m, Monoid w)
 markAnnListA EpAnnNotUsed action = do
   action EpAnnNotUsed
 markAnnListA an action = do
-  debugM $ "markAnnListA: an=" ++ showAst an
   an0 <- markLensMAA an lal_open
   an1 <- markEpAnnAllL an0 lal_rest AnnSemi
   (an2, r) <- action an1
   an3 <- markLensMAA an2 lal_close
-  an4 <- markTrailingL an3 lal_trailing
-  debugM $ "markAnnListA: an4=" ++ showAst an
-  return (an4, r)
+  return (an3, r)
 
 -- ---------------------------------------------------------------------
 
-printComments :: (Monad m, Monoid w) => RealSrcSpan -> EP w m ()
-printComments ss = do
-  cs <- commentAllocation ss
-  debugM $ "printComments: (ss): " ++ showPprUnsafe (rs2range ss)
+printCommentsBefore :: (Monad m, Monoid w) => RealSrcSpan -> EP w m ()
+printCommentsBefore ss = do
+  cs <- commentAllocationBefore ss
+  debugM $ "printCommentsBefore: (ss): " ++ showPprUnsafe (rs2range ss)
+  -- debugM $ "printComments: (ss,comment locations): " ++ showPprUnsafe (rs2range ss,map commentAnchor cs)
+  mapM_ printOneComment cs
+
+printCommentsIn :: (Monad m, Monoid w) => RealSrcSpan -> EP w m ()
+printCommentsIn ss = do
+  cs <- commentAllocationIn ss
+  debugM $ "printCommentsIn: (ss): " ++ showPprUnsafe (rs2range ss)
   -- debugM $ "printComments: (ss,comment locations): " ++ showPprUnsafe (rs2range ss,map commentAnchor cs)
   mapM_ printOneComment cs
+  debugM $ "printCommentsIn:done"
 
 -- ---------------------------------------------------------------------
 
@@ -1224,74 +1403,90 @@ printOneComment :: (Monad m, Monoid w) => Comment -> EP w m ()
 printOneComment c@(Comment _str loc _r _mo) = do
   debugM $ "printOneComment:c=" ++ showGhc c
   dp <-case anchor_op loc of
-    MovedAnchor dp -> return dp
+    MovedAnchor dp _ -> return dp
     _ -> do
         pe <- getPriorEndD
-        let dp = ss2delta pe (anchor loc)
-        debugM $ "printOneComment:(dp,pe,anchor loc)=" ++ showGhc (dp,pe,ss2pos $ anchor loc)
+        debugM $ "printOneComment:pe=" ++ showGhc pe
+        -- let dp = ss2delta pe (anchor loc)
+        let dp = case loc of
+              Anchor r UnchangedAnchor -> ss2delta pe r
+              Anchor _ (MovedAnchor dp1 _) -> dp1
+        debugM $ "printOneComment:(dp,pe,loc)=" ++ showGhc (dp,pe,loc)
         adjustDeltaForOffsetM dp
   mep <- getExtraDP
   dp' <- case mep of
-    Just (Anchor _ (MovedAnchor edp)) -> do
+    Just (Anchor _ (MovedAnchor edp _)) -> do
       debugM $ "printOneComment:edp=" ++ show edp
-      ddd <- fmap unTweakDelta $ adjustDeltaForOffsetM edp
-      debugM $ "printOneComment:ddd=" ++ show ddd
-      fmap unTweakDelta $ adjustDeltaForOffsetM edp
+      adjustDeltaForOffsetM edp
     _ -> return dp
   -- Start of debug printing
-  -- LayoutStartCol dOff <- getLayoutOffsetD
-  -- debugM $ "printOneComment:(dp,dp',dOff)=" ++ showGhc (dp,dp',dOff)
+  LayoutStartCol dOff <- getLayoutOffsetD
+  debugM $ "printOneComment:(dp,dp',dOff,loc)=" ++ showGhc (dp,dp',dOff,loc)
   -- End of debug printing
-  -- setPriorEndD (ss2posEnd (anchor loc))
   updateAndApplyComment c dp'
-  printQueuedComment (anchor loc) c dp'
-
--- | For comment-related deltas starting on a new line we have an
--- off-by-one problem. Adjust
-unTweakDelta :: DeltaPos  -> DeltaPos
-unTweakDelta (SameLine d) = SameLine d
-unTweakDelta (DifferentLine l d) = DifferentLine l (d+1)
-
+  printQueuedComment c dp'
 
 updateAndApplyComment :: (Monad m, Monoid w) => Comment -> DeltaPos -> EP w m ()
 updateAndApplyComment (Comment str anc pp mo) dp = do
-  -- debugM $ "updateAndApplyComment: (dp,anc',co)=" ++ showAst (dp,anc',co)
   applyComment (Comment str anc' pp mo)
   where
     anc' = anc { anchor_op = op}
 
     (r,c) = ss2posEnd pp
-    la = anchor anc
-    dp'' = if r == 0
-           then (ss2delta (r,c+0) la)
-           else (ss2delta (r,c)   la)
-    dp' = if pp == anchor anc
-             then dp
-             else dp''
+    dp'' = case anc of
+      Anchor _ (MovedAnchor dp1 _) -> dp1
+      Anchor la _ ->
+           if r == 0
+             then (ss2delta (r,c+0) la)
+             else (ss2delta (r,c)   la)
+    dp' = case anc of
+      Anchor r1 UnchangedAnchor ->
+          if pp == r1
+                 then dp
+                 else dp''
+      _ -> dp''
     op' = case dp' of
             SameLine n -> if n >= 0
-                            then MovedAnchor dp'
-                            else MovedAnchor dp
-            _ -> MovedAnchor dp'
-    op = if str == "" && op' == MovedAnchor (SameLine 0) -- EOF comment
-           then MovedAnchor dp
-           -- else op'
-           else MovedAnchor dp
+                            then MovedAnchor dp' []
+                            else MovedAnchor dp []
+            _ -> MovedAnchor dp' []
+    op = if str == "" && op' == MovedAnchor (SameLine 0) [] -- EOF comment
+           then MovedAnchor dp []
+           else MovedAnchor dp []
 
 -- ---------------------------------------------------------------------
 
-commentAllocation :: (Monad m, Monoid w) => RealSrcSpan -> EP w m [Comment]
-commentAllocation ss = do
+commentAllocationBefore :: (Monad m, Monoid w) => RealSrcSpan -> EP w m [Comment]
+commentAllocationBefore ss = do
   cs <- getUnallocatedComments
   -- Note: The CPP comment injection may change the file name in the
   -- RealSrcSpan, which affects comparison, as the Ord instance for
   -- RealSrcSpan compares the file first. So we sort via ss2pos
   -- TODO: this is inefficient, use Pos all the way through
-  let (earlier,later) = partition (\(Comment _str loc _r _mo) -> (ss2pos $ anchor loc) <= (ss2pos ss)) cs
+  let (earlier,later) = partition (\(Comment _str loc _r _mo) ->
+                                     case loc of
+                                       Anchor r UnchangedAnchor -> (ss2pos r) <= (ss2pos ss)
+                                       _ -> True -- Choose one
+                                  ) cs
   putUnallocatedComments later
   -- debugM $ "commentAllocation:(ss,earlier,later)" ++ show (rs2range ss,earlier,later)
   return earlier
 
+commentAllocationIn :: (Monad m, Monoid w) => RealSrcSpan -> EP w m [Comment]
+commentAllocationIn ss = do
+  cs <- getUnallocatedComments
+  -- Note: The CPP comment injection may change the file name in the
+  -- RealSrcSpan, which affects comparison, as the Ord instance for
+  -- RealSrcSpan compares the file first. So we sort via ss2pos
+  -- TODO: this is inefficient, use Pos all the way through
+  let (earlier,later) = partition (\(Comment _str loc _r _mo) ->
+                                     case loc of
+                                       Anchor r UnchangedAnchor -> (ss2posEnd r) <= (ss2posEnd ss)
+                                       _ -> True -- Choose one
+                                  ) cs
+  putUnallocatedComments later
+  -- debugM $ "commentAllocation:(ss,earlier,later)" ++ show (rs2range ss,earlier,later)
+  return earlier
 -- ---------------------------------------------------------------------
 
 markAnnotatedWithLayout :: (Monad m, Monoid w) => ExactPrint ast => ast -> EP w m ast
@@ -1313,37 +1508,36 @@ markTopLevelList ls = mapM (\a -> setLayoutTopLevelP $ markAnnotated a) ls
 instance (ExactPrint a) => ExactPrint (Located a) where
   getAnnotationEntry (L l _) = case l of
     UnhelpfulSpan _ -> NoEntryVal
-    _ -> Entry (hackSrcSpanToAnchor l) emptyComments NoFlushComments CanUpdateAnchorOnly
+    _ -> Entry (hackSrcSpanToAnchor l) [] emptyComments NoFlushComments CanUpdateAnchorOnly
 
-  setAnnotationAnchor (L _ a) anc _cs = (L (hackAnchorToSrcSpan anc) a)
-                 `debug` ("setAnnotationAnchor(Located):" ++ showAst anc)
+  setAnnotationAnchor (L l a) _anc _ts _cs = L l a
 
   exact (L l a) = L l <$> markAnnotated a
 
 instance (ExactPrint a) => ExactPrint (LocatedA a) where
   getAnnotationEntry = entryFromLocatedA
-  setAnnotationAnchor la anc cs = setAnchorAn la anc cs
+  setAnnotationAnchor la anc ts cs = setAnchorAn la anc ts cs
   exact (L la a) = do
     debugM $ "LocatedA a:la loc=" ++ show (ss2range $ locA la)
     a' <- markAnnotated a
-    ann' <- markALocatedA (ann la)
+    let ann' = ann la
     return (L (la { ann = ann'}) a')
 
 instance (ExactPrint a) => ExactPrint (LocatedAn NoEpAnns a) where
   getAnnotationEntry = entryFromLocatedA
-  setAnnotationAnchor la anc cs = setAnchorAn la anc cs
+  setAnnotationAnchor la anc ts cs = setAnchorAn la anc ts cs
   exact (L la a) = do
     a' <- markAnnotated a
     return (L la a')
 
 instance (ExactPrint a) => ExactPrint [a] where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor ls _ _ = ls
+  setAnnotationAnchor ls _ _ _ = ls
   exact ls = mapM markAnnotated ls
 
 instance (ExactPrint a) => ExactPrint (Maybe a) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor ma _ _ = ma
+  setAnnotationAnchor ma _ _ _ = ma
   exact ma = mapM markAnnotated ma
 
 -- ---------------------------------------------------------------------
@@ -1352,7 +1546,7 @@ instance (ExactPrint a) => ExactPrint (Maybe a) where
 instance ExactPrint (HsModule GhcPs) where
   getAnnotationEntry hsmod = fromAnn' (hsmodAnn $ hsmodExt hsmod)
   -- A bit pointless actually changing anything here
-  setAnnotationAnchor hsmod anc cs = setAnchorHsModule hsmod anc cs
+  setAnnotationAnchor hsmod anc _ts cs = setAnchorHsModule hsmod anc cs
                    `debug` ("setAnnotationAnchor hsmod called" ++ showAst (anc,cs))
 
   exact hsmod@(HsModule {hsmodExt = XModulePs { hsmodAnn = EpAnnNotUsed }}) = withPpr hsmod >> return hsmod
@@ -1383,6 +1577,14 @@ instance ExactPrint (HsModule GhcPs) where
 
     am_decls' <- markTrailing (am_decls $ anns an0)
     imports' <- markTopLevelList imports
+
+    case lo of
+        ExplicitBraces _ _ -> return ()
+        _ -> do
+          -- Get rid of the balance of the preceding comments before starting on the decls
+          flushComments []
+          putUnallocatedComments []
+
     decls' <- markTopLevelList (filter removeDocDecl decls)
 
     lo1 <- case lo0 of
@@ -1412,7 +1614,7 @@ removeDocDecl _ = True
 
 instance ExactPrint ModuleName where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor n _anc cs = n
+  setAnnotationAnchor n _anc _ cs = n
      `debug` ("ModuleName.setAnnotationAnchor:cs=" ++ showAst cs)
   exact n = do
     debugM $ "ModuleName: " ++ showPprUnsafe n
@@ -1443,7 +1645,7 @@ instance ExactPrint (LocatedP (WarningTxt GhcPs)) where
 
 instance ExactPrint InWarningCategory where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (InWarningCategory tkIn source (L l wc)) = do
       tkIn' <- markLToken tkIn
@@ -1452,7 +1654,7 @@ instance ExactPrint InWarningCategory where
 
 instance ExactPrint (SourceText, WarningCategory) where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (st, WarningCategory wc) = do
       case st of
@@ -1464,8 +1666,8 @@ instance ExactPrint (SourceText, WarningCategory) where
 
 instance ExactPrint (ImportDecl GhcPs) where
   getAnnotationEntry idecl = fromAnn (ideclAnn $ ideclExt idecl)
-  setAnnotationAnchor idecl anc cs = idecl { ideclExt
-                    = (ideclExt idecl) { ideclAnn = setAnchorEpa (ideclAnn $ ideclExt idecl) anc cs} }
+  setAnnotationAnchor idecl anc ts cs = idecl { ideclExt
+                    = (ideclExt idecl) { ideclAnn = setAnchorEpa (ideclAnn $ ideclExt idecl) anc ts cs} }
 
   exact x@(ImportDecl{ ideclExt = XImportDeclPass{ ideclAnn = EpAnnNotUsed } }) = withPpr x
   exact (ImportDecl (XImportDeclPass ann msrc impl)
@@ -1538,7 +1740,7 @@ instance ExactPrint (ImportDecl GhcPs) where
 
 instance ExactPrint HsDocString where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (MultiLineDocString decorator (x :| xs)) = do
     printStringAdvance ("-- " ++ printDecorator decorator)
@@ -1555,7 +1757,7 @@ instance ExactPrint HsDocString where
 
 instance ExactPrint HsDocStringChunk where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact chunk = do
     printStringAdvance ("--" ++ unpackHDSC chunk)
     return chunk
@@ -1563,7 +1765,7 @@ instance ExactPrint HsDocStringChunk where
 
 instance ExactPrint a => ExactPrint (WithHsDocIdentifiers a GhcPs) where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (WithHsDocIdentifiers ds ids) = do
     ds' <- exact ds
     return (WithHsDocIdentifiers ds' ids)
@@ -1588,7 +1790,7 @@ instance ExactPrint (HsDecl GhcPs) where
 
   -- We do not recurse, the generic traversal using this feature
   -- should do that for us.
-  setAnnotationAnchor d _ _ = d
+  setAnnotationAnchor d _ _ _ = d
 
   exact (TyClD       x d) = TyClD       x <$> markAnnotated d
   exact (InstD       x d) = InstD       x <$> markAnnotated d
@@ -1612,7 +1814,7 @@ instance ExactPrint (InstDecl GhcPs) where
   getAnnotationEntry (DataFamInstD _ _) = NoEntryVal
   getAnnotationEntry (TyFamInstD   _ _) = NoEntryVal
 
-  setAnnotationAnchor d _ _ = d
+  setAnnotationAnchor d _ _ _ = d
 
 
   exact (ClsInstD     a  cid) = do
@@ -1637,8 +1839,8 @@ data DataFamInstDeclWithContext
 instance ExactPrint DataFamInstDeclWithContext where
   getAnnotationEntry (DataFamInstDeclWithContext _ _ (DataFamInstDecl (FamEqn { feqn_ext = an})))
     = fromAnn an
-  setAnnotationAnchor (DataFamInstDeclWithContext a c (DataFamInstDecl fe)) anc cs
-    = (DataFamInstDeclWithContext a c (DataFamInstDecl (fe { feqn_ext = (setAnchorEpa (feqn_ext fe) anc cs)})))
+  setAnnotationAnchor (DataFamInstDeclWithContext a c (DataFamInstDecl fe)) anc ts cs
+    = (DataFamInstDeclWithContext a c (DataFamInstDecl (fe { feqn_ext = (setAnchorEpa (feqn_ext fe) anc ts cs)})))
   exact (DataFamInstDeclWithContext an c d) = do
     debugM $ "starting DataFamInstDeclWithContext:an=" ++ showAst an
     (an', d') <- exactDataFamInstDecl an c d
@@ -1697,8 +1899,8 @@ rendering the DataDefn are contained in the FamEqn, and are called
 
 instance ExactPrint (DerivDecl GhcPs) where
   getAnnotationEntry (DerivDecl {deriv_ext = (_, an)} ) = fromAnn an
-  setAnnotationAnchor (dd@DerivDecl {deriv_ext = (w, an)}) anc cs
-    = dd { deriv_ext = (w, setAnchorEpa an anc cs) }
+  setAnnotationAnchor (dd@DerivDecl {deriv_ext = (w, an)}) anc ts cs
+    = dd { deriv_ext = (w, setAnchorEpa an anc ts cs) }
   exact (DerivDecl (mw, an) typ ms mov) = do
     an0 <- markEpAnnL an lidl AnnDeriving
     ms' <- mapM markAnnotated ms
@@ -1714,8 +1916,8 @@ instance ExactPrint (ForeignDecl GhcPs) where
   getAnnotationEntry (ForeignImport an _ _  _) = fromAnn an
   getAnnotationEntry (ForeignExport an _ _  _) = fromAnn an
 
-  setAnnotationAnchor (ForeignImport an a b c) anc cs = ForeignImport (setAnchorEpa an anc cs) a b c
-  setAnnotationAnchor (ForeignExport an a b c) anc cs = ForeignExport (setAnchorEpa an anc cs) a b c
+  setAnnotationAnchor (ForeignImport an a b c) anc ts cs = ForeignImport (setAnchorEpa an anc ts cs) a b c
+  setAnnotationAnchor (ForeignExport an a b c) anc ts cs = ForeignExport (setAnchorEpa an anc ts cs) a b c
 
   exact (ForeignImport an n ty fimport) = do
     an0 <- markEpAnnL an lidl AnnForeign
@@ -1741,7 +1943,7 @@ instance ExactPrint (ForeignDecl GhcPs) where
 
 instance ExactPrint (ForeignImport GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (CImport (L ls src) cconv safety@(L ll _) mh imp) = do
     cconv' <- markAnnotated cconv
     unless (ll == noSrcSpan) $ markAnnotated safety >> return ()
@@ -1752,7 +1954,7 @@ instance ExactPrint (ForeignImport GhcPs) where
 
 instance ExactPrint (ForeignExport GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (CExport (L ls src) spec) = do
     debugM $ "CExport starting"
     spec' <- markAnnotated spec
@@ -1763,7 +1965,7 @@ instance ExactPrint (ForeignExport GhcPs) where
 
 instance ExactPrint CExportSpec where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (CExportStatic st lbl cconv) = do
     debugM $ "CExportStatic starting"
     cconv' <- markAnnotated cconv
@@ -1773,21 +1975,21 @@ instance ExactPrint CExportSpec where
 
 instance ExactPrint Safety where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact = withPpr
 
 -- ---------------------------------------------------------------------
 
 instance ExactPrint CCallConv where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact = withPpr
 
 -- ---------------------------------------------------------------------
 
 instance ExactPrint (WarnDecls GhcPs) where
   getAnnotationEntry (Warnings (an,_) _) = fromAnn an
-  setAnnotationAnchor (Warnings (an,a) b) anc cs = Warnings ((setAnchorEpa an anc cs),a) b
+  setAnnotationAnchor (Warnings (an,a) b) anc ts cs = Warnings ((setAnchorEpa an anc ts cs),a) b
 
   exact (Warnings (an,src) warns) = do
     an0 <- markAnnOpen an src "{-# WARNING" -- Note: might be {-# DEPRECATED
@@ -1799,7 +2001,7 @@ instance ExactPrint (WarnDecls GhcPs) where
 
 instance ExactPrint (WarnDecl GhcPs) where
   getAnnotationEntry (Warning an _ _) = fromAnn an
-  setAnnotationAnchor (Warning an a b) anc cs = Warning (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (Warning an a b) anc ts cs = Warning (setAnchorEpa an anc ts cs) a b
 
   exact (Warning an lns  (WarningTxt mb_cat src ls )) = do
     mb_cat' <- markAnnotated mb_cat
@@ -1820,7 +2022,7 @@ instance ExactPrint (WarnDecl GhcPs) where
 
 instance ExactPrint StringLiteral where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact l@(StringLiteral src fs mcomma) = do
     printSourceText src (show (unpackFS fs))
@@ -1831,7 +2033,7 @@ instance ExactPrint StringLiteral where
 
 instance ExactPrint FastString where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   -- TODO: https://ghc.haskell.org/trac/ghc/ticket/10313 applies.
   -- exact fs = printStringAdvance (show (unpackFS fs))
@@ -1841,7 +2043,7 @@ instance ExactPrint FastString where
 
 instance ExactPrint (RuleDecls GhcPs) where
   getAnnotationEntry (HsRules (an,_) _) = fromAnn an
-  setAnnotationAnchor (HsRules (an,a) b) anc cs = HsRules ((setAnchorEpa an anc cs),a) b
+  setAnnotationAnchor (HsRules (an,a) b) anc ts cs = HsRules ((setAnchorEpa an anc ts cs),a) b
   exact (HsRules (an, src) rules) = do
     an0 <-
       case src of
@@ -1855,8 +2057,8 @@ instance ExactPrint (RuleDecls GhcPs) where
 
 instance ExactPrint (RuleDecl GhcPs) where
   getAnnotationEntry (HsRule {rd_ext = (an,_)}) = fromAnn an
-  setAnnotationAnchor r@(HsRule {rd_ext = (an,a)}) anc cs
-    = r { rd_ext = (setAnchorEpa an anc cs, a)}
+  setAnnotationAnchor r@(HsRule {rd_ext = (an,a)}) anc ts cs
+    = r { rd_ext = (setAnchorEpa an anc ts cs, a)}
   exact (HsRule (an,nsrc) (L ln n) act mtybndrs termbndrs lhs rhs) = do
     debugM "HsRule entered"
     (L ln' _) <- markAnnotated (L ln (nsrc, n))
@@ -1907,7 +2109,7 @@ markActivation an l act = do
 
 instance ExactPrint (SpliceDecl GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (SpliceDecl x splice flag) = do
     splice' <- markAnnotated splice
@@ -1917,7 +2119,7 @@ instance ExactPrint (SpliceDecl GhcPs) where
 
 instance ExactPrint (DocDecl GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   -- We print these as plain comments instead, do a NOP here.
   exact v = return v
@@ -1926,7 +2128,7 @@ instance ExactPrint (DocDecl GhcPs) where
 
 instance ExactPrint (RoleAnnotDecl GhcPs) where
   getAnnotationEntry (RoleAnnotDecl an _ _) = fromAnn an
-  setAnnotationAnchor (RoleAnnotDecl an a b) anc cs = RoleAnnotDecl (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (RoleAnnotDecl an a b) anc ts cs = RoleAnnotDecl (setAnchorEpa an anc ts cs) a b
   exact (RoleAnnotDecl an ltycon roles) = do
     an0 <- markEpAnnL an lidl AnnType
     an1 <- markEpAnnL an0 lidl AnnRole
@@ -1944,14 +2146,14 @@ instance ExactPrint (RoleAnnotDecl GhcPs) where
 
 instance ExactPrint Role where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact = withPpr
 
 -- ---------------------------------------------------------------------
 
 instance ExactPrint (RuleBndr GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (RuleBndr x ln) = do
     ln' <- markAnnotated ln
@@ -1968,7 +2170,7 @@ instance ExactPrint (RuleBndr GhcPs) where
 
 instance (ExactPrint body) => ExactPrint (FamEqn GhcPs body) where
   getAnnotationEntry (FamEqn { feqn_ext = an}) = fromAnn an
-  setAnnotationAnchor fe anc cs = fe {feqn_ext = setAnchorEpa (feqn_ext fe) anc cs}
+  setAnnotationAnchor fe anc ts cs = fe {feqn_ext = setAnchorEpa (feqn_ext fe) anc ts cs}
   exact (FamEqn { feqn_ext = an
                 , feqn_tycon  = tycon
                 , feqn_bndrs  = bndrs
@@ -2037,7 +2239,7 @@ exactHsFamInstLHS an thing bndrs typats fixity mb_ctxt = do
 instance (ExactPrint tm, ExactPrint ty, Outputable tm, Outputable ty)
      =>  ExactPrint (HsArg GhcPs tm ty) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact a@(HsValArg tm)    = markAnnotated tm >> return a
   exact a@(HsTypeArg at ty) = markToken at >> markAnnotated ty >> return a
@@ -2047,8 +2249,8 @@ instance (ExactPrint tm, ExactPrint ty, Outputable tm, Outputable ty)
 
 instance ExactPrint (ClsInstDecl GhcPs) where
   getAnnotationEntry (ClsInstDecl { cid_ext = (_, an, _) }) = fromAnn an
-  setAnnotationAnchor (cid@ClsInstDecl { cid_ext = (mbWarn, an, sortKey) }) anc cs
-    = cid { cid_ext = (mbWarn, setAnchorEpa an anc cs, sortKey) }
+  setAnnotationAnchor (cid@ClsInstDecl { cid_ext = (mbWarn, an, sortKey) }) anc ts cs
+    = cid { cid_ext = (mbWarn, setAnchorEpa an anc ts cs, sortKey) }
 
   exact (ClsInstDecl { cid_ext = (mbWarn, an, sortKey)
                      , cid_poly_ty = inst_ty, cid_binds = binds
@@ -2090,7 +2292,7 @@ instance ExactPrint (ClsInstDecl GhcPs) where
 
 instance ExactPrint (TyFamInstDecl GhcPs) where
   getAnnotationEntry (TyFamInstDecl an _) = fromAnn an
-  setAnnotationAnchor (TyFamInstDecl an a) anc cs = TyFamInstDecl (setAnchorEpa an anc cs) a
+  setAnnotationAnchor (TyFamInstDecl an a) anc ts cs = TyFamInstDecl (setAnchorEpa an anc ts cs) a
 
   exact d@(TyFamInstDecl { tfid_xtn = an, tfid_eqn = eqn }) = do
     an0 <- markEpAnnL an lidl AnnType
@@ -2143,8 +2345,8 @@ instance ExactPrint (HsBind GhcPs) where
   getAnnotationEntry VarBind{} = NoEntryVal
   getAnnotationEntry PatSynBind{} = NoEntryVal
 
-  setAnnotationAnchor pb@PatBind{} anc cs = pb { pat_ext = setAnchorEpa (pat_ext pb) anc cs}
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor pb@PatBind{} anc ts cs = pb { pat_ext = setAnchorEpa (pat_ext pb) anc ts cs}
+  setAnnotationAnchor a _ _ _ = a
 
   exact (FunBind x fid matches) = do
     matches' <- markAnnotated matches
@@ -2170,7 +2372,7 @@ instance ExactPrint (HsBind GhcPs) where
 
 instance ExactPrint (PatSynBind GhcPs GhcPs) where
   getAnnotationEntry (PSB { psb_ext = an}) = fromAnn an
-  setAnnotationAnchor p anc cs = p { psb_ext = setAnchorEpa (psb_ext p) anc cs}
+  setAnnotationAnchor p anc ts cs = p { psb_ext = setAnchorEpa (psb_ext p) anc ts cs}
 
   exact (PSB{ psb_ext = an
             , psb_id = psyn, psb_args = details
@@ -2223,7 +2425,7 @@ instance ExactPrint (PatSynBind GhcPs GhcPs) where
 
 instance ExactPrint (RecordPatSynField GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact r@(RecordPatSynField { recordPatSynField = v }) = markAnnotated v
         >> return r
 
@@ -2231,7 +2433,7 @@ instance ExactPrint (RecordPatSynField GhcPs) where
 
 instance ExactPrint (Match GhcPs (LocatedA (HsCmd GhcPs))) where
   getAnnotationEntry (Match ann _ _ _) = fromAnn ann
-  setAnnotationAnchor (Match an a b c) anc cs = Match (setAnchorEpa an anc cs) a b c
+  setAnnotationAnchor (Match an a b c) anc ts cs = Match (setAnchorEpa an anc ts cs) a b c
 
   exact (Match an mctxt pats grhss) =
     exactMatch (Match an mctxt pats grhss)
@@ -2240,14 +2442,15 @@ instance ExactPrint (Match GhcPs (LocatedA (HsCmd GhcPs))) where
 
 instance ExactPrint (Match GhcPs (LocatedA (HsExpr GhcPs))) where
   getAnnotationEntry (Match ann _ _ _) = fromAnn ann
-  setAnnotationAnchor (Match an a b c) anc cs = Match (setAnchorEpa an anc cs) a b c
+  setAnnotationAnchor (Match an a b c) anc ts cs = Match (setAnchorEpa an anc ts cs) a b c
 
   exact (Match an mctxt pats grhss) =
     exactMatch (Match an mctxt pats grhss)
 
 -- ---------------------------------------------------------------------
 
-exactMatch :: (Monad m, Monoid w) => (ExactPrint (GRHSs GhcPs body)) => (Match GhcPs body) -> EP w m (Match GhcPs body)
+exactMatch :: (Monad m, Monoid w, ExactPrint (GRHSs GhcPs body))
+           => (Match GhcPs body) -> EP w m (Match GhcPs body)
 exactMatch (Match an mctxt pats grhss) = do
 
   debugM $ "exact Match entered"
@@ -2308,7 +2511,7 @@ exactMatch (Match an mctxt pats grhss) = do
 
 instance ExactPrint (GRHSs GhcPs (LocatedA (HsExpr GhcPs))) where
   getAnnotationEntry (GRHSs _ _ _) = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (GRHSs cs grhss binds) = do
     addCommentsA $ priorComments cs
@@ -2321,7 +2524,7 @@ instance ExactPrint (GRHSs GhcPs (LocatedA (HsExpr GhcPs))) where
 
 instance ExactPrint (GRHSs GhcPs (LocatedA (HsCmd GhcPs))) where
   getAnnotationEntry (GRHSs _ _ _) = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (GRHSs cs grhss binds) = do
     addCommentsA $ priorComments cs
@@ -2338,8 +2541,8 @@ instance ExactPrint (HsLocalBinds GhcPs) where
   getAnnotationEntry (HsIPBinds{}) = NoEntryVal
   getAnnotationEntry (EmptyLocalBinds{}) = NoEntryVal
 
-  setAnnotationAnchor (HsValBinds an a) anc cs = HsValBinds (setAnchorEpaL an anc cs) a
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor (HsValBinds an a) anc ts cs = HsValBinds (setAnchorEpaL an anc ts cs) a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (HsValBinds an valbinds) = do
     debugM $ "exact HsValBinds: an=" ++ showAst an
@@ -2371,7 +2574,7 @@ instance ExactPrint (HsLocalBinds GhcPs) where
 -- ---------------------------------------------------------------------
 instance ExactPrint (HsValBindsLR GhcPs GhcPs) where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (ValBinds sortKey binds sigs) = do
     decls <- setLayoutBoth $ mapM markAnnotated $ hsDeclsValBinds (ValBinds sortKey binds sigs)
@@ -2388,7 +2591,7 @@ undynamic ds = mapMaybe fromDynamic ds
 
 instance ExactPrint (HsIPBinds GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact b@(IPBinds _ binds) = setLayoutBoth $ markAnnotated binds >> return b
 
@@ -2396,7 +2599,7 @@ instance ExactPrint (HsIPBinds GhcPs) where
 
 instance ExactPrint (IPBind GhcPs) where
   getAnnotationEntry (IPBind an _ _) = fromAnn an
-  setAnnotationAnchor (IPBind an a b) anc cs = IPBind (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (IPBind an a b) anc ts cs = IPBind (setAnchorEpa an anc ts cs) a b
 
   exact (IPBind an lr rhs) = do
     lr' <- markAnnotated lr
@@ -2409,7 +2612,7 @@ instance ExactPrint (IPBind GhcPs) where
 
 instance ExactPrint HsIPName where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact i@(HsIPName fs) = printStringAdvance ("?" ++ (unpackFS fs)) >> return i
 
@@ -2457,16 +2660,16 @@ instance ExactPrint (Sig GhcPs) where
   getAnnotationEntry (SCCFunSig (a, _) _ _) = fromAnn a
   getAnnotationEntry (CompleteMatchSig (a, _) _ _) = fromAnn a
 
-  setAnnotationAnchor (TypeSig a x y)  anc           cs = (TypeSig (setAnchorEpa a anc cs) x y)
-  setAnnotationAnchor (PatSynSig a x y) anc          cs = (PatSynSig (setAnchorEpa a anc cs) x y)
-  setAnnotationAnchor (ClassOpSig a x y z) anc       cs = (ClassOpSig (setAnchorEpa a anc cs) x y z)
-  setAnnotationAnchor (FixSig a x) anc               cs = (FixSig (setAnchorEpa a anc cs) x)
-  setAnnotationAnchor (InlineSig a x y) anc          cs = (InlineSig (setAnchorEpa a anc cs) x y)
-  setAnnotationAnchor (SpecSig a x y z) anc          cs = (SpecSig (setAnchorEpa a anc cs) x y z)
-  setAnnotationAnchor (SpecInstSig (a,x) y) anc      cs = (SpecInstSig ((setAnchorEpa a anc cs),x) y)
-  setAnnotationAnchor (MinimalSig (a,x) y) anc       cs = (MinimalSig ((setAnchorEpa a anc cs),x) y)
-  setAnnotationAnchor (SCCFunSig (a,x) y z) anc      cs = (SCCFunSig ((setAnchorEpa a anc cs),x) y z)
-  setAnnotationAnchor (CompleteMatchSig (a,x) y z) anc cs = (CompleteMatchSig ((setAnchorEpa a anc cs),x) y z)
+  setAnnotationAnchor (TypeSig a x y)  anc           ts cs = (TypeSig (setAnchorEpa a anc ts cs) x y)
+  setAnnotationAnchor (PatSynSig a x y) anc          ts cs = (PatSynSig (setAnchorEpa a anc ts cs) x y)
+  setAnnotationAnchor (ClassOpSig a x y z) anc       ts cs = (ClassOpSig (setAnchorEpa a anc ts cs) x y z)
+  setAnnotationAnchor (FixSig a x) anc               ts cs = (FixSig (setAnchorEpa a anc ts cs) x)
+  setAnnotationAnchor (InlineSig a x y) anc          ts cs = (InlineSig (setAnchorEpa a anc ts cs) x y)
+  setAnnotationAnchor (SpecSig a x y z) anc          ts cs = (SpecSig (setAnchorEpa a anc ts cs) x y z)
+  setAnnotationAnchor (SpecInstSig (a,x) y) anc      ts cs = (SpecInstSig ((setAnchorEpa a anc ts cs),x) y)
+  setAnnotationAnchor (MinimalSig (a,x) y) anc       ts cs = (MinimalSig ((setAnchorEpa a anc ts cs),x) y)
+  setAnnotationAnchor (SCCFunSig (a,x) y z) anc      ts cs = (SCCFunSig ((setAnchorEpa a anc ts cs),x) y z)
+  setAnnotationAnchor (CompleteMatchSig (a,x) y z) anc ts cs = (CompleteMatchSig ((setAnchorEpa a anc ts cs),x) y z)
 
   exact (TypeSig an vars ty)  = do
     (an', vars', ty') <- exactVarSig an vars ty
@@ -2565,7 +2768,7 @@ exactVarSig an vars ty = do
 
 instance ExactPrint (StandaloneKindSig GhcPs) where
   getAnnotationEntry (StandaloneKindSig an _ _) = fromAnn an
-  setAnnotationAnchor (StandaloneKindSig an a b) anc cs = StandaloneKindSig (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (StandaloneKindSig an a b) anc ts cs = StandaloneKindSig (setAnchorEpa an anc ts cs) a b
 
   exact (StandaloneKindSig an vars sig) = do
     an0 <- markEpAnnL an lidl AnnType
@@ -2578,7 +2781,7 @@ instance ExactPrint (StandaloneKindSig GhcPs) where
 
 instance ExactPrint (DefaultDecl GhcPs) where
   getAnnotationEntry (DefaultDecl an _) = fromAnn an
-  setAnnotationAnchor (DefaultDecl an a) anc cs = DefaultDecl (setAnchorEpa an anc cs) a
+  setAnnotationAnchor (DefaultDecl an a) anc ts cs = DefaultDecl (setAnchorEpa an anc ts cs) a
 
   exact (DefaultDecl an tys) = do
     an0 <- markEpAnnL an lidl AnnDefault
@@ -2591,7 +2794,7 @@ instance ExactPrint (DefaultDecl GhcPs) where
 
 instance ExactPrint (AnnDecl GhcPs) where
   getAnnotationEntry (HsAnnotation (an, _) _ _) = fromAnn an
-  setAnnotationAnchor (HsAnnotation (an,a) b c) anc cs = HsAnnotation ((setAnchorEpa an anc cs),a) b c
+  setAnnotationAnchor (HsAnnotation (an,a) b c) anc ts cs = HsAnnotation ((setAnchorEpa an anc ts cs),a) b c
 
   exact (HsAnnotation (an, src) prov e) = do
     an0 <- markAnnOpenP an src "{-# ANN"
@@ -2616,7 +2819,7 @@ instance ExactPrint (AnnDecl GhcPs) where
 
 instance ExactPrint (BF.BooleanFormula (LocatedN RdrName)) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (BF.Var x)  = do
     x' <- markAnnotated x
@@ -2635,7 +2838,7 @@ instance ExactPrint (BF.BooleanFormula (LocatedN RdrName)) where
 
 instance (ExactPrint body) => ExactPrint (HsWildCardBndrs GhcPs body) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _= a
   exact (HsWC x ty) = do
     ty' <- markAnnotated ty
     return (HsWC x ty')
@@ -2644,7 +2847,7 @@ instance (ExactPrint body) => ExactPrint (HsWildCardBndrs GhcPs body) where
 
 instance ExactPrint (GRHS GhcPs (LocatedA (HsExpr GhcPs))) where
   getAnnotationEntry (GRHS an _ _) = fromAnn an
-  setAnnotationAnchor (GRHS an a b) anc cs = GRHS (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (GRHS an a b) anc ts cs = GRHS (setAnchorEpa an anc ts cs) a b
 
   exact (GRHS an guards expr) = do
     debugM $ "GRHS comments:" ++ showGhc (comments an)
@@ -2660,7 +2863,7 @@ instance ExactPrint (GRHS GhcPs (LocatedA (HsExpr GhcPs))) where
 
 instance ExactPrint (GRHS GhcPs (LocatedA (HsCmd GhcPs))) where
   getAnnotationEntry (GRHS ann _ _) = fromAnn ann
-  setAnnotationAnchor (GRHS an a b) anc cs = GRHS (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (GRHS an a b) anc ts cs = GRHS (setAnchorEpa an anc ts cs) a b
 
   exact (GRHS an guards expr) = do
     an0 <- markLensKwM an lga_vbar AnnVbar
@@ -2710,46 +2913,51 @@ instance ExactPrint (HsExpr GhcPs) where
   getAnnotationEntry (HsPragE{})                  = NoEntryVal
   getAnnotationEntry (HsEmbTy{})                  = NoEntryVal
 
-  setAnnotationAnchor a@(HsVar{})              _ _s = a
-  setAnnotationAnchor (HsUnboundVar an a)    anc cs = (HsUnboundVar (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(HsRecSel{})           _ _s  = a
-  setAnnotationAnchor (HsOverLabel an s a)   anc cs = (HsOverLabel (setAnchorEpa an anc cs) s a)
-  setAnnotationAnchor (HsIPVar an a)         anc cs = (HsIPVar (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsOverLit an a)       anc cs = (HsOverLit (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsLit an a)           anc cs = (HsLit (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsLam an a b)         anc cs = (HsLam (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsApp an a b)         anc cs = (HsApp (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(HsAppType {})      _ _s = a
-  setAnnotationAnchor (OpApp an a b c)       anc cs = (OpApp (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (NegApp an a b)        anc cs = (NegApp (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsPar an a b c)       anc cs = (HsPar (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (SectionL an a b)      anc cs = (SectionL (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (SectionR an a b)      anc cs = (SectionR (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (ExplicitTuple an a b) anc cs = (ExplicitTuple (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (ExplicitSum an a b c) anc cs = (ExplicitSum (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (HsCase an a b)        anc cs = (HsCase (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsIf an a b c)        anc cs = (HsIf (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (HsMultiIf an a)       anc cs = (HsMultiIf (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsLet an a b c d)     anc cs = (HsLet (setAnchorEpa an anc cs) a b c d)
-  setAnnotationAnchor (HsDo an a b)          anc cs = (HsDo (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (ExplicitList an a)    anc cs = (ExplicitList (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (RecordCon an a b)     anc cs = (RecordCon (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (RecordUpd an a b)     anc cs = (RecordUpd (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsGetField an a b)    anc cs = (HsGetField (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsProjection an a)    anc cs = (HsProjection (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (ExprWithTySig an a b) anc cs = (ExprWithTySig (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (ArithSeq an a b)      anc cs = (ArithSeq (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsTypedBracket an a)   anc cs = (HsTypedBracket (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsUntypedBracket an a) anc cs = (HsUntypedBracket (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsTypedSplice (x,an) e) anc cs = (HsTypedSplice (x,(setAnchorEpa an anc cs)) e)
-  setAnnotationAnchor (HsUntypedSplice an e)  anc cs = (HsUntypedSplice (setAnchorEpa an anc cs) e)
-  setAnnotationAnchor (HsProc an a b)         anc cs = (HsProc (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsStatic an a)         anc cs = (HsStatic (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(HsPragE{})            _ _s = a
-  setAnnotationAnchor a@(HsEmbTy{})            _ _s = a
+  setAnnotationAnchor a@(HsVar{})              _ _ _s = a
+  setAnnotationAnchor (HsUnboundVar an a)    anc ts cs = (HsUnboundVar (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(HsRecSel{})           _ _ _s  = a
+  setAnnotationAnchor (HsOverLabel an s a)   anc ts cs = (HsOverLabel (setAnchorEpa an anc ts cs) s a)
+  setAnnotationAnchor (HsIPVar an a)         anc ts cs = (HsIPVar (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsOverLit an a)       anc ts cs = (HsOverLit (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsLit an a)           anc ts cs = (HsLit (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsLam an a b)         anc ts cs = (HsLam (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsApp an a b)         anc ts cs = (HsApp (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(HsAppType {})          _ _ _s = a
+  setAnnotationAnchor (OpApp an a b c)       anc ts cs = (OpApp (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (NegApp an a b)        anc ts cs = (NegApp (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsPar an a b c)       anc ts cs = (HsPar (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (SectionL an a b)      anc ts cs = (SectionL (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (SectionR an a b)      anc ts cs = (SectionR (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (ExplicitTuple an a b) anc ts cs = (ExplicitTuple (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (ExplicitSum an a b c) anc ts cs = (ExplicitSum (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (HsCase an a b)        anc ts cs = (HsCase (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsIf an a b c)        anc ts cs = (HsIf (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (HsMultiIf an a)       anc ts cs = (HsMultiIf (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsLet an a b c d)     anc ts cs = (HsLet (setAnchorEpa an anc ts cs) a b c d)
+  setAnnotationAnchor (HsDo an a b)          anc ts cs = (HsDo (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (ExplicitList an a)    anc ts cs = (ExplicitList (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (RecordCon an a b)     anc ts cs = (RecordCon (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (RecordUpd an a b)     anc ts cs = (RecordUpd (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsGetField an a b)    anc ts cs = (HsGetField (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsProjection an a)    anc ts cs = (HsProjection (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (ExprWithTySig an a b) anc ts cs = (ExprWithTySig (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (ArithSeq an a b)      anc ts cs = (ArithSeq (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsTypedBracket an a)   anc ts cs = (HsTypedBracket (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsUntypedBracket an a) anc ts cs = (HsUntypedBracket (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsTypedSplice (x,an) e) anc ts cs = (HsTypedSplice (x,(setAnchorEpa an anc ts cs)) e)
+  setAnnotationAnchor (HsUntypedSplice an e)  anc ts cs = (HsUntypedSplice (setAnchorEpa an anc ts cs) e)
+  setAnnotationAnchor (HsProc an a b)         anc ts cs = (HsProc (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsStatic an a)         anc ts cs = (HsStatic (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(HsPragE{})              _ _ _s = a
+  setAnnotationAnchor a@(HsEmbTy{})              _ _ _s = a
 
   exact (HsVar x n) = do
-    n' <- markAnnotated n
+    -- The parser inserts a placeholder value for a record pun rhs. This must be
+    -- filtered.
+    let pun_RDR = "pun-right-hand-side"
+    n' <- if (showPprUnsafe n /= pun_RDR)
+      then markAnnotated n
+      else return n
     return (HsVar x n')
   exact x@(HsUnboundVar an _) = do
     case an of
@@ -3062,7 +3270,7 @@ markMaybeDodgyStmts an stmts =
 -- ---------------------------------------------------------------------
 instance ExactPrint (HsPragE GhcPs) where
   getAnnotationEntry HsPragSCC{}  = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (HsPragSCC (an,st) sl) = do
     an0 <- markAnnOpenP an st "{-# SCC"
@@ -3079,8 +3287,8 @@ instance ExactPrint (HsUntypedSplice GhcPs) where
   getAnnotationEntry (HsUntypedSpliceExpr an _) = fromAnn an
   getAnnotationEntry (HsQuasiQuote _ _ _)       = NoEntryVal
 
-  setAnnotationAnchor (HsUntypedSpliceExpr an e) anc cs = HsUntypedSpliceExpr (setAnchorEpa an anc cs) e
-  setAnnotationAnchor a@HsQuasiQuote {}         _ _ = a
+  setAnnotationAnchor (HsUntypedSpliceExpr an e) anc ts cs = HsUntypedSpliceExpr (setAnchorEpa an anc ts cs) e
+  setAnnotationAnchor a@HsQuasiQuote {}         _ _  _= a
 
   exact (HsUntypedSpliceExpr an e) = do
     an0 <- markEpAnnL an lidl AnnDollar
@@ -3105,7 +3313,7 @@ instance ExactPrint (HsUntypedSplice GhcPs) where
 -- TODO:AZ: combine these instances
 instance ExactPrint (MatchGroup GhcPs (LocatedA (HsExpr GhcPs))) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (MG x matches) = do
     -- TODO:AZ use SortKey, in MG ann.
     matches' <- if isGoodSrcSpan (getLocA matches)
@@ -3115,7 +3323,7 @@ instance ExactPrint (MatchGroup GhcPs (LocatedA (HsExpr GhcPs))) where
 
 instance ExactPrint (MatchGroup GhcPs (LocatedA (HsCmd GhcPs))) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (MG x matches) = do
     -- TODO:AZ use SortKey, in MG ann.
     matches' <- if isGoodSrcSpan (getLocA matches)
@@ -3127,7 +3335,7 @@ instance ExactPrint (MatchGroup GhcPs (LocatedA (HsCmd GhcPs))) where
 
 instance (ExactPrint body) => ExactPrint (HsRecFields GhcPs body) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (HsRecFields fields mdot) = do
     fields' <- markAnnotated fields
     case mdot of
@@ -3140,17 +3348,17 @@ instance (ExactPrint body) => ExactPrint (HsRecFields GhcPs body) where
 -- ---------------------------------------------------------------------
 
 instance (ExactPrint body)
-    => ExactPrint (HsFieldBind (LocatedAn NoEpAnns (FieldOcc GhcPs)) body) where
+    => ExactPrint (HsFieldBind (LocatedA (FieldOcc GhcPs)) body) where
   getAnnotationEntry x = fromAnn (hfbAnn x)
-  setAnnotationAnchor (HsFieldBind an f arg isPun) anc cs = (HsFieldBind (setAnchorEpa an anc cs) f arg isPun)
+  setAnnotationAnchor (HsFieldBind an f arg isPun) anc ts cs = (HsFieldBind (setAnchorEpa an anc ts cs) f arg isPun)
   exact (HsFieldBind an f arg isPun) = do
     debugM $ "HsFieldBind"
     f' <- markAnnotated f
     (an0, arg') <- if isPun then return (an, arg)
              else do
-      an0 <- markEpAnnL an lidl AnnEqual
-      arg' <- markAnnotated arg
-      return (an0, arg')
+               an0 <- markEpAnnL an lidl AnnEqual
+               arg' <- markAnnotated arg
+               return (an0, arg')
     return (HsFieldBind an0 f' arg' isPun)
 
 -- ---------------------------------------------------------------------
@@ -3158,30 +3366,30 @@ instance (ExactPrint body)
 instance (ExactPrint body)
     => ExactPrint (HsFieldBind (LocatedAn NoEpAnns (FieldLabelStrings GhcPs)) body) where
   getAnnotationEntry x = fromAnn (hfbAnn x)
-  setAnnotationAnchor (HsFieldBind an f arg isPun) anc cs = (HsFieldBind (setAnchorEpa an anc cs) f arg isPun)
+  setAnnotationAnchor (HsFieldBind an f arg isPun) anc ts cs = (HsFieldBind (setAnchorEpa an anc ts cs) f arg isPun)
 
   exact (HsFieldBind an f arg isPun) = do
     debugM $ "HsFieldBind FieldLabelStrings"
     f' <- markAnnotated f
     (an0, arg') <- if isPun then return (an, arg)
              else do
-      an0 <- markEpAnnL an lidl AnnEqual
-      arg' <- markAnnotated arg
-      return (an0, arg')
+               an0 <- markEpAnnL an lidl AnnEqual
+               arg' <- markAnnotated arg
+               return (an0, arg')
     return (HsFieldBind an0 f' arg' isPun)
 
 -- ---------------------------------------------------------------------
 
 instance (ExactPrint (LocatedA body))
-    => ExactPrint (HsFieldBind (LocatedAn NoEpAnns (AmbiguousFieldOcc GhcPs)) (LocatedA body)) where
+    => ExactPrint (HsFieldBind (LocatedA (AmbiguousFieldOcc GhcPs)) (LocatedA body)) where
   getAnnotationEntry x = fromAnn (hfbAnn x)
-  setAnnotationAnchor (HsFieldBind an f arg isPun) anc cs = (HsFieldBind (setAnchorEpa an anc cs) f arg isPun)
+  setAnnotationAnchor (HsFieldBind an f arg isPun) anc ts cs = (HsFieldBind (setAnchorEpa an anc ts cs) f arg isPun)
   exact (HsFieldBind an f arg isPun) = do
     debugM $ "HsRecUpdField"
     f' <- markAnnotated f
     an0 <- if isPun then return an
              else markEpAnnL an lidl AnnEqual
-    arg' <- if ((locA $ getLoc arg) == noSrcSpan )
+    arg' <- if isPun
               then return arg
               else markAnnotated arg
     return (HsFieldBind an0 f' arg' isPun)
@@ -3189,7 +3397,7 @@ instance (ExactPrint (LocatedA body))
 -- ---------------------------------------------------------------------
 instance ExactPrint (LHsRecUpdFields GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact flds@(RegularRecUpdFields    { recUpdFields  = rbinds }) = do
     debugM $ "RegularRecUpdFields"
@@ -3204,7 +3412,7 @@ instance ExactPrint (LHsRecUpdFields GhcPs) where
 
 instance ExactPrint (FieldLabelStrings GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (FieldLabelStrings fs) = FieldLabelStrings <$> markAnnotated fs
 
 -- ---------------------------------------------------------------------
@@ -3212,7 +3420,7 @@ instance ExactPrint (FieldLabelStrings GhcPs) where
 instance ExactPrint (DotFieldOcc GhcPs) where
   getAnnotationEntry (DotFieldOcc an _) = fromAnn an
 
-  setAnnotationAnchor (DotFieldOcc an a) anc cs = DotFieldOcc (setAnchorEpa an anc cs) a
+  setAnnotationAnchor (DotFieldOcc an a) anc ts cs = DotFieldOcc (setAnchorEpa an anc ts cs) a
 
   exact (DotFieldOcc an (L loc (FieldLabelString fs))) = do
     an0 <- markLensKwM an lafDot  AnnDot
@@ -3227,8 +3435,8 @@ instance ExactPrint (HsTupArg GhcPs) where
   getAnnotationEntry (Present an _) = fromAnn an
   getAnnotationEntry (Missing an)   = fromAnn an
 
-  setAnnotationAnchor (Present an a) anc cs = Present (setAnchorEpa an anc cs) a
-  setAnnotationAnchor (Missing an)   anc cs = Missing (setAnchorEpa an anc cs)
+  setAnnotationAnchor (Present an a) anc ts cs = Present (setAnchorEpa an anc ts cs) a
+  setAnnotationAnchor (Missing an)   anc ts cs = Missing (setAnchorEpa an anc ts cs)
 
   exact (Present a e) = Present a <$> markAnnotated e
 
@@ -3239,7 +3447,7 @@ instance ExactPrint (HsTupArg GhcPs) where
 
 instance ExactPrint (HsCmdTop GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (HsCmdTop a cmd) = HsCmdTop a <$> markAnnotated cmd
 
 -- ---------------------------------------------------------------------
@@ -3255,19 +3463,15 @@ instance ExactPrint (HsCmd GhcPs) where
   getAnnotationEntry (HsCmdLet an _ _ _ _)      = fromAnn an
   getAnnotationEntry (HsCmdDo an _)             = fromAnn an
 
-  setAnnotationAnchor (HsCmdArrApp an a b c d)   anc cs = (HsCmdArrApp (setAnchorEpa an anc cs) a b c d)
-  setAnnotationAnchor (HsCmdArrForm an a b c d ) anc cs = (HsCmdArrForm (setAnchorEpa an anc cs) a b c d )
-  setAnnotationAnchor (HsCmdApp an a b )         anc cs = (HsCmdApp (setAnchorEpa an anc cs) a b )
-
-  -- ToDo: why is LamSingle treated differently?
-  setAnnotationAnchor a@(HsCmdLam _ LamSingle _) _   _s = a
-  setAnnotationAnchor (HsCmdLam an a b)          anc cs = (HsCmdLam (setAnchorEpa an anc cs) a b)
-
-  setAnnotationAnchor (HsCmdPar an a b c)        anc cs = (HsCmdPar (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (HsCmdCase an a b)         anc cs = (HsCmdCase (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsCmdIf an a b c d)       anc cs = (HsCmdIf (setAnchorEpa an anc cs) a b c d)
-  setAnnotationAnchor (HsCmdLet an a b c d)      anc cs = (HsCmdLet (setAnchorEpa an anc cs) a b c d)
-  setAnnotationAnchor (HsCmdDo an a)             anc cs = (HsCmdDo (setAnchorEpa an anc cs) a)
+  setAnnotationAnchor (HsCmdArrApp an a b c d)   anc ts cs = (HsCmdArrApp (setAnchorEpa an anc ts cs) a b c d)
+  setAnnotationAnchor (HsCmdArrForm an a b c d ) anc ts cs = (HsCmdArrForm (setAnchorEpa an anc ts cs) a b c d )
+  setAnnotationAnchor (HsCmdApp an a b )         anc ts cs = (HsCmdApp (setAnchorEpa an anc ts cs) a b )
+  setAnnotationAnchor (HsCmdLam an a b)          anc ts cs = (HsCmdLam (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsCmdPar an a b c)        anc ts cs = (HsCmdPar (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (HsCmdCase an a b)         anc ts cs = (HsCmdCase (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsCmdIf an a b c d)       anc ts cs = (HsCmdIf (setAnchorEpa an anc ts cs) a b c d)
+  setAnnotationAnchor (HsCmdLet an a b c d)      anc ts cs = (HsCmdLet (setAnchorEpa an anc ts cs) a b c d)
+  setAnnotationAnchor (HsCmdDo an a)             anc ts cs = (HsCmdDo (setAnchorEpa an anc ts cs) a)
 
   exact (HsCmdArrApp an arr arg o isRightToLeft) = do
     if isRightToLeft
@@ -3374,14 +3578,14 @@ instance (
 
   -----------------------------------------------------------------
 
-  setAnnotationAnchor a@(LastStmt _ _ _ _)             _ _s = a
-  setAnnotationAnchor (BindStmt an a b)              anc cs = (BindStmt (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(ApplicativeStmt _ _ _)        _ _s = a
-  setAnnotationAnchor a@(BodyStmt _ _ _ _)             _ _s = a
-  setAnnotationAnchor (LetStmt an a)                 anc cs = (LetStmt (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(ParStmt _ _ _ _)              _ _s = a
-  setAnnotationAnchor (TransStmt an a b c d e f g h) anc cs = (TransStmt (setAnchorEpa an anc cs) a b c d e f g h)
-  setAnnotationAnchor (RecStmt an a b c d e f)       anc cs = (RecStmt (setAnchorEpa an anc cs) a b c d e f)
+  setAnnotationAnchor a@(LastStmt _ _ _ _)              _ _ _s = a
+  setAnnotationAnchor (BindStmt an a b)              anc ts cs = (BindStmt (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(ApplicativeStmt _ _ _)         _ _ _s = a
+  setAnnotationAnchor a@(BodyStmt _ _ _ _)              _ _ _s = a
+  setAnnotationAnchor (LetStmt an a)                 anc ts cs = (LetStmt (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(ParStmt _ _ _ _)               _ _ _s = a
+  setAnnotationAnchor (TransStmt an a b c d e f g h) anc ts cs = (TransStmt (setAnchorEpa an anc ts cs) a b c d e f g h)
+  setAnnotationAnchor (RecStmt an a b c d e f)       anc ts cs = (RecStmt (setAnchorEpa an anc ts cs) a b c d e f)
 
   -----------------------------------------------------------------
 
@@ -3432,7 +3636,7 @@ instance (
 
 instance ExactPrint (ParStmtBlock GhcPs GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (ParStmtBlock a stmts b c) = do
     stmts' <- markAnnotated stmts
     return (ParStmtBlock a stmts' b c)
@@ -3472,10 +3676,10 @@ instance ExactPrint (TyClDecl GhcPs) where
   getAnnotationEntry (DataDecl  { tcdDExt = an })      = fromAnn an
   getAnnotationEntry (ClassDecl { tcdCExt = (an, _) }) = fromAnn an
 
-  setAnnotationAnchor a@FamDecl{}     _ _s = a
-  setAnnotationAnchor x@SynDecl{}   anc cs = x { tcdSExt = setAnchorEpa (tcdSExt x) anc cs }
-  setAnnotationAnchor x@DataDecl{}  anc cs = x { tcdDExt = setAnchorEpa (tcdDExt x) anc cs }
-  setAnnotationAnchor x@ClassDecl{} anc cs = x { tcdCExt = (setAnchorEpa an anc cs, a) }
+  setAnnotationAnchor a@FamDecl{}      _ _ _s = a
+  setAnnotationAnchor x@SynDecl{}   anc ts cs = x { tcdSExt = setAnchorEpa (tcdSExt x) anc ts cs }
+  setAnnotationAnchor x@DataDecl{}  anc ts cs = x { tcdDExt = setAnchorEpa (tcdDExt x) anc ts cs }
+  setAnnotationAnchor x@ClassDecl{} anc ts cs = x { tcdCExt = (setAnchorEpa an anc ts cs, a) }
     where
       (an,a) = tcdCExt x
 
@@ -3577,7 +3781,7 @@ instance ExactPrint (TyClDecl GhcPs) where
 
 instance ExactPrint (FunDep GhcPs) where
   getAnnotationEntry (FunDep an _ _) = fromAnn an
-  setAnnotationAnchor (FunDep an a b) anc cs = FunDep (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (FunDep an a b) anc ts cs = FunDep (setAnchorEpa an anc ts cs) a b
 
   exact (FunDep an ls rs') = do
     ls' <- markAnnotated ls
@@ -3589,7 +3793,7 @@ instance ExactPrint (FunDep GhcPs) where
 
 instance ExactPrint (FamilyDecl GhcPs) where
   getAnnotationEntry (FamilyDecl { fdExt = an }) = fromAnn an
-  setAnnotationAnchor x anc cs = x { fdExt = setAnchorEpa (fdExt x) anc cs}
+  setAnnotationAnchor x anc ts cs = x { fdExt = setAnchorEpa (fdExt x) anc ts cs}
 
   exact (FamilyDecl { fdExt = an
                     , fdInfo = info
@@ -3760,7 +3964,7 @@ exactVanillaDeclHead thing tvs@(HsQTvs { hsq_explicit = tyvars }) fixity context
 
 instance ExactPrint (InjectivityAnn GhcPs) where
   getAnnotationEntry (InjectivityAnn an _ _) = fromAnn an
-  setAnnotationAnchor (InjectivityAnn an a b) anc cs = InjectivityAnn (setAnchorEpa an anc cs) a b
+  setAnnotationAnchor (InjectivityAnn an a b) anc ts cs = InjectivityAnn (setAnchorEpa an anc ts cs) a b
   exact (InjectivityAnn an lhs rhs) = do
     an0 <- markEpAnnL an lidl AnnVbar
     lhs' <- markAnnotated lhs
@@ -3807,8 +4011,8 @@ instance ExactPrintTVFlag flag => ExactPrint (HsTyVarBndr flag GhcPs) where
   getAnnotationEntry (UserTyVar an _ _)     = fromAnn an
   getAnnotationEntry (KindedTyVar an _ _ _) = fromAnn an
 
-  setAnnotationAnchor (UserTyVar an a b)     anc cs = UserTyVar (setAnchorEpa an anc cs) a b
-  setAnnotationAnchor (KindedTyVar an a b c) anc cs = KindedTyVar (setAnchorEpa an anc cs) a b c
+  setAnnotationAnchor (UserTyVar an a b)     anc ts cs = UserTyVar (setAnchorEpa an anc ts cs) a b
+  setAnnotationAnchor (KindedTyVar an a b c) anc ts cs = KindedTyVar (setAnchorEpa an anc ts cs) a b c
 
   exact (UserTyVar an flag n) = do
     r <- exactTVDelimiters an flag $ do
@@ -3854,29 +4058,29 @@ instance ExactPrint (HsType GhcPs) where
   getAnnotationEntry (HsWildCardTy _)          = NoEntryVal
   getAnnotationEntry (XHsType _)               = NoEntryVal
 
-  setAnnotationAnchor a@(HsForAllTy _ _ _)        _ _s = a
-  setAnnotationAnchor a@(HsQualTy _ _ _)          _ _s = a
-  setAnnotationAnchor (HsTyVar an a b)          anc cs = (HsTyVar (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(HsAppTy _ _ _)           _ _s = a
-  setAnnotationAnchor a@(HsAppKindTy _ _ _ _)     _ _s = a
-  setAnnotationAnchor (HsFunTy an a b c)        anc cs = (HsFunTy (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (HsListTy an a)           anc cs = (HsListTy (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsTupleTy an a b)        anc cs = (HsTupleTy (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsSumTy an a)            anc cs = (HsSumTy (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(HsOpTy _ _ _ _ _)        _ _s = a
-  setAnnotationAnchor (HsParTy an a)            anc cs = (HsParTy (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsIParamTy an a b)       anc cs = (HsIParamTy (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(HsStarTy _ _)            _ _s = a
-  setAnnotationAnchor (HsKindSig an a b)        anc cs = (HsKindSig (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(HsSpliceTy _ _)          _ _s = a
-  setAnnotationAnchor (HsDocTy an a b)          anc cs = (HsDocTy (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsBangTy an a b)         anc cs = (HsBangTy (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsRecTy an a)            anc cs = (HsRecTy (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (HsExplicitListTy an a b) anc cs = (HsExplicitListTy (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (HsExplicitTupleTy an a)  anc cs = (HsExplicitTupleTy (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(HsTyLit _ _)             _ _s = a
-  setAnnotationAnchor a@(HsWildCardTy _)          _ _s = a
-  setAnnotationAnchor a@(XHsType _)               _ _s = a
+  setAnnotationAnchor a@(HsForAllTy _ _ _)         _ _ _s = a
+  setAnnotationAnchor a@(HsQualTy _ _ _)           _ _ _s = a
+  setAnnotationAnchor (HsTyVar an a b)          anc ts cs = (HsTyVar (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(HsAppTy _ _ _)            _ _ _s = a
+  setAnnotationAnchor a@(HsAppKindTy _ _ _ _)      _ _ _s = a
+  setAnnotationAnchor (HsFunTy an a b c)        anc ts cs = (HsFunTy (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (HsListTy an a)           anc ts cs = (HsListTy (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsTupleTy an a b)        anc ts cs = (HsTupleTy (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsSumTy an a)            anc ts cs = (HsSumTy (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(HsOpTy _ _ _ _ _)         _ _ _s = a
+  setAnnotationAnchor (HsParTy an a)            anc ts cs = (HsParTy (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsIParamTy an a b)       anc ts cs = (HsIParamTy (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(HsStarTy _ _)             _ _ _s = a
+  setAnnotationAnchor (HsKindSig an a b)        anc ts cs = (HsKindSig (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(HsSpliceTy _ _)           _ _ _s = a
+  setAnnotationAnchor (HsDocTy an a b)          anc ts cs = (HsDocTy (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsBangTy an a b)         anc ts cs = (HsBangTy (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsRecTy an a)            anc ts cs = (HsRecTy (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (HsExplicitListTy an a b) anc ts cs = (HsExplicitListTy (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (HsExplicitTupleTy an a)  anc ts cs = (HsExplicitTupleTy (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(HsTyLit _ _)              _ _ _s = a
+  setAnnotationAnchor a@(HsWildCardTy _)           _ _ _s = a
+  setAnnotationAnchor a@(XHsType _)                _ _ _s = a
 
   exact (HsForAllTy { hst_xforall = an
                     , hst_tele = tele, hst_body = ty }) = do
@@ -4004,8 +4208,8 @@ instance ExactPrint (HsForAllTelescope GhcPs) where
   getAnnotationEntry (HsForAllVis an _)   = fromAnn an
   getAnnotationEntry (HsForAllInvis an _) = fromAnn an
 
-  setAnnotationAnchor (HsForAllVis an a) anc cs = HsForAllVis (setAnchorEpa an anc cs) a
-  setAnnotationAnchor (HsForAllInvis an a) anc cs = HsForAllInvis (setAnchorEpa an anc cs) a
+  setAnnotationAnchor (HsForAllVis an a) anc ts cs = HsForAllVis (setAnchorEpa an anc ts cs) a
+  setAnnotationAnchor (HsForAllInvis an a) anc ts cs = HsForAllInvis (setAnchorEpa an anc ts cs) a
 
   exact (HsForAllVis an bndrs)   = do
     an0 <- markLensAA an lfst -- AnnForall
@@ -4023,8 +4227,8 @@ instance ExactPrint (HsForAllTelescope GhcPs) where
 
 instance ExactPrint (HsDerivingClause GhcPs) where
   getAnnotationEntry d@(HsDerivingClause{}) = fromAnn (deriv_clause_ext d)
-  setAnnotationAnchor x anc cs = (x { deriv_clause_ext = setAnchorEpa (deriv_clause_ext x) anc cs})
-                                   `debug` ("setAnnotationAnchor HsDerivingClause: (anc,cs):" ++ showAst (anc,cs))
+  setAnnotationAnchor x anc ts cs = (x { deriv_clause_ext = setAnchorEpa (deriv_clause_ext x) anc ts cs})
+                                      `debug` ("setAnnotationAnchor HsDerivingClause: (anc,cs):" ++ showAst (anc,cs))
 
   exact (HsDerivingClause { deriv_clause_ext      = an
                           , deriv_clause_strategy = dcs
@@ -4050,10 +4254,10 @@ instance ExactPrint (DerivStrategy GhcPs) where
   getAnnotationEntry (NewtypeStrategy an)  = fromAnn an
   getAnnotationEntry (ViaStrategy (XViaStrategyPs an  _)) = fromAnn an
 
-  setAnnotationAnchor (StockStrategy an)    anc cs = (StockStrategy (setAnchorEpa an anc cs))
-  setAnnotationAnchor (AnyclassStrategy an) anc cs = (AnyclassStrategy (setAnchorEpa an anc cs))
-  setAnnotationAnchor (NewtypeStrategy an)  anc cs = (NewtypeStrategy (setAnchorEpa an anc cs))
-  setAnnotationAnchor (ViaStrategy (XViaStrategyPs an  a)) anc cs = (ViaStrategy (XViaStrategyPs (setAnchorEpa an anc cs)  a))
+  setAnnotationAnchor (StockStrategy an)    anc ts cs = (StockStrategy (setAnchorEpa an anc ts cs))
+  setAnnotationAnchor (AnyclassStrategy an) anc ts cs = (AnyclassStrategy (setAnchorEpa an anc ts cs))
+  setAnnotationAnchor (NewtypeStrategy an)  anc ts cs = (NewtypeStrategy (setAnchorEpa an anc ts cs))
+  setAnnotationAnchor (ViaStrategy (XViaStrategyPs an  a)) anc ts cs = (ViaStrategy (XViaStrategyPs (setAnchorEpa an anc ts cs)  a))
 
   exact (StockStrategy an)    = do
     an0 <- markEpAnnL an lid AnnStock
@@ -4082,17 +4286,13 @@ instance (ExactPrint a) => ExactPrint (LocatedC a) where
     opens' <- mapM (markKwA AnnOpenP) opens
     a' <- markAnnotated a
     closes' <- mapM (markKwA AnnCloseP) closes
-    ma' <- case ma of
-      Just (UnicodeSyntax, r) -> Just . (UnicodeSyntax,) <$> markKwA AnnDarrowU r
-      Just (NormalSyntax,  r) -> Just . (NormalSyntax,) <$> markKwA AnnDarrow  r
-      Nothing -> pure Nothing
-    return (L (SrcSpanAnn (EpAnn anc (AnnContext ma' opens' closes') cs) l) a')
+    return (L (SrcSpanAnn (EpAnn anc (AnnContext ma opens' closes') cs) l) a')
 
 -- ---------------------------------------------------------------------
 
 instance ExactPrint (DerivClauseTys GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (DctSingle x ty) = do
     ty' <- markAnnotated ty
@@ -4105,7 +4305,7 @@ instance ExactPrint (DerivClauseTys GhcPs) where
 
 instance ExactPrint (HsSigType GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (HsSig a bndrs ty) = do
     bndrs' <- markAnnotated bndrs
@@ -4128,27 +4328,23 @@ instance ExactPrint (LocatedN RdrName) where
           mn <- markName a o (Just (l,n)) c
           case mn of
             (o', (Just (l',_n)), c') -> do
-              t' <- markTrailing t
-              return (NameAnn a o' l' c' t')
+              return (NameAnn a o' l' c' t)
             _ -> error "ExactPrint (LocatedN RdrName)"
         NameAnnCommas a o commas c t -> do
           let (kwo,kwc) = adornments a
           (AddEpAnn _ o') <- markKwC NoCaptureComments (AddEpAnn kwo o)
           commas' <- forM commas (\loc -> locFromAdd <$> markKwC NoCaptureComments (AddEpAnn AnnComma loc))
           (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn kwc c)
-          t' <- markTrailing t
-          return (NameAnnCommas a o' commas' c' t')
+          return (NameAnnCommas a o' commas' c' t)
         NameAnnBars a o bars c t -> do
           let (kwo,kwc) = adornments a
           (AddEpAnn _ o') <- markKwC NoCaptureComments (AddEpAnn kwo o)
           bars' <- forM bars (\loc -> locFromAdd <$> markKwC NoCaptureComments (AddEpAnn AnnVbar loc))
           (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn kwc c)
-          t' <- markTrailing t
-          return (NameAnnBars a o' bars' c' t')
+          return (NameAnnBars a o' bars' c' t)
         NameAnnOnly a o c t -> do
           (o',_,c') <- markName a o Nothing c
-          t' <- markTrailing t
-          return (NameAnnOnly a o' c' t')
+          return (NameAnnOnly a o' c' t)
         NameAnnRArrow unicode o nl c t -> do
           o' <- case o of
             Just o0 -> do
@@ -4164,18 +4360,15 @@ instance ExactPrint (LocatedN RdrName) where
               (AddEpAnn _ c') <- markKwC NoCaptureComments (AddEpAnn AnnCloseP c0)
               return (Just c')
             Nothing -> return Nothing
-          t' <- markTrailing t
-          return (NameAnnRArrow unicode o' nl' c' t')
+          return (NameAnnRArrow unicode o' nl' c' t)
         NameAnnQuote q name t -> do
           debugM $ "NameAnnQuote"
           (AddEpAnn _ q') <- markKwC NoCaptureComments (AddEpAnn AnnSimpleQuote q)
           (L name' _) <- markAnnotated (L name n)
-          t' <- markTrailing t
-          return (NameAnnQuote q' name' t')
+          return (NameAnnQuote q' name' t)
         NameAnnTrailing t -> do
           _anc' <- printUnicode anc n
-          t' <- markTrailing t
-          return (NameAnnTrailing t')
+          return (NameAnnTrailing t)
     return (L (SrcSpanAnn (EpAnn anc ann' cs) ll) n)
 
 locFromAdd :: AddEpAnn -> EpaLocation
@@ -4190,7 +4383,7 @@ printUnicode anc n = do
   loc <- printStringAtAAC NoCaptureComments (EpaDelta (SameLine 0) []) str
   case loc of
     EpaSpan _ _ -> return anc
-    EpaDelta dp [] -> return anc { anchor_op = MovedAnchor dp }
+    EpaDelta dp [] -> return anc { anchor_op = MovedAnchor dp [] }
     EpaDelta _ _cs -> error "printUnicode should not capture comments"
 
 
@@ -4215,13 +4408,6 @@ adornments NameParensHash = (AnnOpenPH, AnnClosePH)
 adornments NameBackquotes = (AnnBackquote, AnnBackquote)
 adornments NameSquare     = (AnnOpenS, AnnCloseS)
 
-
-markTrailingL :: (Monad m, Monoid w) => EpAnn a -> Lens a [TrailingAnn] -> EP w m (EpAnn a)
-markTrailingL EpAnnNotUsed _ = return EpAnnNotUsed
-markTrailingL (EpAnn anc an cs) l = do
-  ts <- mapM markKwT (view l an)
-  return (EpAnn anc (set l ts an) cs)
-
 markTrailing :: (Monad m, Monoid w) => [TrailingAnn] -> EP w m [TrailingAnn]
 markTrailing ts = do
   p <- getPosP
@@ -4255,8 +4441,8 @@ instance ExactPrint (ConDecl GhcPs) where
   getAnnotationEntry x@(ConDeclGADT{}) = fromAnn (con_g_ext x)
   getAnnotationEntry x@(ConDeclH98{})  = fromAnn (con_ext x)
 
-  setAnnotationAnchor x@ConDeclGADT{} anc cs = x { con_g_ext = setAnchorEpa (con_g_ext x) anc cs}
-  setAnnotationAnchor x@ConDeclH98{}  anc cs = x { con_ext   = setAnchorEpa (con_ext x) anc cs}
+  setAnnotationAnchor x@ConDeclGADT{} anc ts cs = x { con_g_ext = setAnchorEpa (con_g_ext x) anc ts cs}
+  setAnnotationAnchor x@ConDeclH98{}  anc ts cs = x { con_ext   = setAnchorEpa (con_ext x) anc ts cs}
 
 -- based on pprConDecl
   exact (ConDeclH98 { con_ext = an
@@ -4347,7 +4533,7 @@ instance ExactPrint (ConDecl GhcPs) where
 
 instance ExactPrint Void where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact x = return x
 
 -- ---------------------------------------------------------------------
@@ -4356,8 +4542,8 @@ instance ExactPrintTVFlag flag => ExactPrint (HsOuterTyVarBndrs flag GhcPs) wher
   getAnnotationEntry (HsOuterImplicit _) = NoEntryVal
   getAnnotationEntry (HsOuterExplicit an _) = fromAnn an
 
-  setAnnotationAnchor (HsOuterImplicit a) _ _ = HsOuterImplicit a
-  setAnnotationAnchor (HsOuterExplicit an a) anc cs = HsOuterExplicit (setAnchorEpa an anc cs) a
+  setAnnotationAnchor (HsOuterImplicit a) _ _ _ = HsOuterImplicit a
+  setAnnotationAnchor (HsOuterExplicit an a) anc ts cs = HsOuterExplicit (setAnchorEpa an anc ts cs) a
 
   exact b@(HsOuterImplicit _) = pure b
   exact (HsOuterExplicit an bndrs) = do
@@ -4371,7 +4557,7 @@ instance ExactPrintTVFlag flag => ExactPrint (HsOuterTyVarBndrs flag GhcPs) wher
 instance ExactPrint (ConDeclField GhcPs) where
   getAnnotationEntry f@(ConDeclField{}) = fromAnn (cd_fld_ext f)
 
-  setAnnotationAnchor x anc cs = x { cd_fld_ext = setAnchorEpa (cd_fld_ext x) anc cs}
+  setAnnotationAnchor x anc ts cs = x { cd_fld_ext = setAnchorEpa (cd_fld_ext x) anc ts cs}
 
   exact (ConDeclField an names ftype mdoc) = do
     names' <- markAnnotated names
@@ -4384,14 +4570,14 @@ instance ExactPrint (ConDeclField GhcPs) where
 
 instance ExactPrint (FieldOcc GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact f@(FieldOcc _ n) = markAnnotated n >> return f
 
 -- ---------------------------------------------------------------------
 
 instance ExactPrint (AmbiguousFieldOcc GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact f@(Unambiguous _ n) = markAnnotated n >> return f
   exact f@(Ambiguous   _ n) = markAnnotated n >> return f
 
@@ -4399,7 +4585,7 @@ instance ExactPrint (AmbiguousFieldOcc GhcPs) where
 
 instance (ExactPrint a) => ExactPrint (HsScaled GhcPs a) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (HsScaled arr t) = do
     t' <- markAnnotated t
     arr' <- markArrow arr
@@ -4429,7 +4615,7 @@ instance ExactPrint (LocatedP CType) where
 instance ExactPrint (SourceText, RuleName) where
   -- We end up at the right place from the Located wrapper
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (st, rn)
     = printStringAdvance (toSourceTextWithSuffix st (unpackFS rn) "")
@@ -4490,7 +4676,6 @@ instance ExactPrint (LocatedL [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsExpr Gh
           markAnnotated stmts
     return (L (SrcSpanAnn an'' l) stmts')
 
--- instance ExactPrint (LocatedL [CmdLStmt GhcPs]) where
 instance ExactPrint (LocatedL [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsCmd GhcPs)))]) where
   getAnnotationEntry = entryFromLocatedA
   setAnnotationAnchor = setAnchorAn
@@ -4531,14 +4716,14 @@ instance ExactPrint (IE GhcPs) where
   getAnnotationEntry (IEDoc _ _)            = NoEntryVal
   getAnnotationEntry (IEDocNamed _ _)       = NoEntryVal
 
-  setAnnotationAnchor a@(IEVar _ _)             _ _s = a
-  setAnnotationAnchor (IEThingAbs (depr, an) a)       anc cs = (IEThingAbs (depr, setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (IEThingAll (depr, an) a)       anc cs = (IEThingAll (depr, setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (IEThingWith (depr, an) a b c)  anc cs = (IEThingWith (depr, setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (IEModuleContents (depr, an) a) anc cs = (IEModuleContents (depr, setAnchorEpa an anc cs) a)
-  setAnnotationAnchor a@(IEGroup _ _ _)         _ _s = a
-  setAnnotationAnchor a@(IEDoc _ _)             _ _s = a
-  setAnnotationAnchor a@(IEDocNamed _ _)        _ _s = a
+  setAnnotationAnchor a@(IEVar _ _)                      _ _ _s = a
+  setAnnotationAnchor (IEThingAbs (depr, an) a)       anc ts cs = (IEThingAbs (depr, setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (IEThingAll (depr, an) a)       anc ts cs = (IEThingAll (depr, setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (IEThingWith (depr, an) a b c)  anc ts cs = (IEThingWith (depr, setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (IEModuleContents (depr, an) a) anc ts cs = (IEModuleContents (depr, setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor a@(IEGroup _ _ _)         _ _ _s = a
+  setAnnotationAnchor a@(IEDoc _ _)             _ _ _s = a
+  setAnnotationAnchor a@(IEDocNamed _ _)        _ _ _s = a
 
   exact (IEVar depr ln) = do
     depr' <- markAnnotated depr
@@ -4594,7 +4779,7 @@ instance ExactPrint (IE GhcPs) where
 
 instance ExactPrint (IEWrappedName GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (IEName x n) = do
     n' <- markAnnotated n
@@ -4629,23 +4814,23 @@ instance ExactPrint (Pat GhcPs) where
   getAnnotationEntry (SigPat an _ _)          = fromAnn an
   getAnnotationEntry (EmbTyPat _ _ _)         = NoEntryVal
 
-  setAnnotationAnchor a@(WildPat _)              _ _s = a
-  setAnnotationAnchor a@(VarPat _ _)             _ _s = a
-  setAnnotationAnchor (LazyPat an a)            anc cs = (LazyPat (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (AsPat an a at b)         anc cs = (AsPat (setAnchorEpa an anc cs) a at b)
-  setAnnotationAnchor (ParPat an a b c)         anc cs = (ParPat (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (BangPat an a)            anc cs = (BangPat (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (ListPat an a)            anc cs = (ListPat (setAnchorEpa an anc cs) a)
-  setAnnotationAnchor (TuplePat an a b)         anc cs = (TuplePat (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (SumPat an a b c)         anc cs = (SumPat (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (ConPat an a b)           anc cs = (ConPat (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor (ViewPat an a b)          anc cs = (ViewPat (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(SplicePat _ _)           _ _s = a
-  setAnnotationAnchor a@(LitPat _ _)              _ _s = a
-  setAnnotationAnchor (NPat an a b c)          anc cs = (NPat (setAnchorEpa an anc cs) a b c)
-  setAnnotationAnchor (NPlusKPat an a b c d e) anc cs = (NPlusKPat (setAnchorEpa an anc cs) a b c d e)
-  setAnnotationAnchor (SigPat an a b)          anc cs = (SigPat (setAnchorEpa an anc cs) a b)
-  setAnnotationAnchor a@(EmbTyPat _ _ _)          _ _s = a
+  setAnnotationAnchor a@(WildPat _)                _ _ _s = a
+  setAnnotationAnchor a@(VarPat _ _)               _ _ _s = a
+  setAnnotationAnchor (LazyPat an a)            anc ts cs = (LazyPat (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (AsPat an a at b)         anc ts cs = (AsPat (setAnchorEpa an anc ts cs) a at b)
+  setAnnotationAnchor (ParPat an a b c)         anc ts cs = (ParPat (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (BangPat an a)            anc ts cs = (BangPat (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (ListPat an a)            anc ts cs = (ListPat (setAnchorEpa an anc ts cs) a)
+  setAnnotationAnchor (TuplePat an a b)         anc ts cs = (TuplePat (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (SumPat an a b c)         anc ts cs = (SumPat (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (ConPat an a b)           anc ts cs = (ConPat (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor (ViewPat an a b)          anc ts cs = (ViewPat (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(SplicePat _ _)            _ _ _s = a
+  setAnnotationAnchor a@(LitPat _ _)               _ _ _s = a
+  setAnnotationAnchor (NPat an a b c)           anc ts cs = (NPat (setAnchorEpa an anc ts cs) a b c)
+  setAnnotationAnchor (NPlusKPat an a b c d e)  anc ts cs = (NPlusKPat (setAnchorEpa an anc ts cs) a b c d e)
+  setAnnotationAnchor (SigPat an a b)           anc ts cs = (SigPat (setAnchorEpa an anc ts cs) a b)
+  setAnnotationAnchor a@(EmbTyPat _ _ _)           _ _ _s = a
 
   exact (WildPat w) = do
     anchor <- getAnchorU
@@ -4702,7 +4887,6 @@ instance ExactPrint (Pat GhcPs) where
     an3 <- markEpAnnL an2 lsumPatParens AnnClosePH
     return (SumPat an3 pat' alt arity)
 
-  -- | ConPat an con args)
   exact (ConPat an con details) = do
     (an', con', details') <- exactUserCon an con details
     return (ConPat an' con' details')
@@ -4722,7 +4906,6 @@ instance ExactPrint (Pat GhcPs) where
     ol' <- markAnnotated ol
     return (NPat an0 ol' mn z)
 
-  -- | NPlusKPat an n lit1 lit2 _ _)
   exact (NPlusKPat an n k lit2 a b) = do
     n' <- markAnnotated n
     an' <- printStringAtAAL an lid "+"
@@ -4744,7 +4927,7 @@ instance ExactPrint (Pat GhcPs) where
 
 instance ExactPrint (HsPatSigType GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (HsPS an ty) = do
     ty' <- markAnnotated ty
@@ -4752,7 +4935,7 @@ instance ExactPrint (HsPatSigType GhcPs) where
 
 instance ExactPrint (HsTyPat GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact (HsTP an ty) = do
     ty' <- markAnnotated ty
@@ -4762,7 +4945,7 @@ instance ExactPrint (HsTyPat GhcPs) where
 
 instance ExactPrint (HsOverLit GhcPs) where
   getAnnotationEntry = const NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
 
   exact ol =
     let str = case ol_val ol of
@@ -4780,9 +4963,7 @@ hsLit2String :: HsLit GhcPs -> String
 hsLit2String lit =
   case lit of
     HsChar       src v   -> toSourceTextWithSuffix src v ""
-    -- It should be included here
-    -- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1471
-    HsCharPrim   src p   -> toSourceTextWithSuffix src p "#"
+    HsCharPrim   src p   -> toSourceTextWithSuffix src p ""
     HsString     src v   -> toSourceTextWithSuffix src v ""
     HsStringPrim src v   -> toSourceTextWithSuffix src v ""
     HsInt        _ (IL src _ v)   -> toSourceTextWithSuffix src v ""
@@ -4828,7 +5009,7 @@ exactUserCon an c details = do
 
 instance ExactPrint (HsConPatTyArg GhcPs) where
   getAnnotationEntry _ = NoEntryVal
-  setAnnotationAnchor a _ _ = a
+  setAnnotationAnchor a _ _ _ = a
   exact (HsConPatTyArg at tyarg) = do
     at' <- markToken at
     tyarg' <- markAnnotated tyarg
@@ -4850,7 +5031,7 @@ exactConArgs (RecCon rpats) = do
 
 -- ---------------------------------------------------------------------
 
-entryFromLocatedA :: LocatedAn ann a -> Entry
+entryFromLocatedA :: (HasTrailing ann) => LocatedAn ann a -> Entry
 entryFromLocatedA (L la _) = fromAnn la
 
 -- =====================================================================
@@ -4882,8 +5063,8 @@ isGoodDeltaWithOffset dp colOffset = isGoodDelta (deltaPos l c)
 
 -- | Print a comment, using the current layout offset to convert the
 -- @DeltaPos@ to an absolute position.
-printQueuedComment :: (Monad m, Monoid w) => RealSrcSpan -> Comment -> DeltaPos -> EP w m ()
-printQueuedComment _loc Comment{commentContents} dp = do
+printQueuedComment :: (Monad m, Monoid w) => Comment -> DeltaPos -> EP w m ()
+printQueuedComment Comment{commentContents} dp = do
   p <- getPosP
   d <- getPriorEndD
   colOffset <- getLayoutOffsetP
@@ -4919,7 +5100,7 @@ setLayoutTopLevelP k = do
   debugM $ "setLayoutTopLevelP entered"
   oldAnchorOffset <- getLayoutOffsetP
   modify (\a -> a { pMarkLayout = False
-                  , pLHS = 1} )
+                  , pLHS = 0} )
   r <- k
   debugM $ "setLayoutTopLevelP:resetting"
   setLayoutOffsetP oldAnchorOffset
@@ -4949,6 +5130,13 @@ getPriorEndD = gets dPriorEndPosition
 getAnchorU :: (Monad m, Monoid w) => EP w m RealSrcSpan
 getAnchorU = gets uAnchorSpan
 
+getAcceptSpan ::(Monad m, Monoid w) => EP w m Bool
+getAcceptSpan = gets pAcceptSpan
+
+setAcceptSpan ::(Monad m, Monoid w) => Bool -> EP w m ()
+setAcceptSpan f =
+  modify (\s -> s { pAcceptSpan = f })
+
 setPriorEndD :: (Monad m, Monoid w) => Pos -> EP w m ()
 setPriorEndD pe = do
   setPriorEndNoLayoutD pe
diff --git a/utils/check-exact/Main.hs b/utils/check-exact/Main.hs
index 6a44d89457c738dcafe2866e8a00c8e28c7a61cf..be550111cc5849be2674565165832975754d3c67 100644
--- a/utils/check-exact/Main.hs
+++ b/utils/check-exact/Main.hs
@@ -79,7 +79,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/master/_b
  -- "../../testsuite/tests/ghc-api/exactprint/RmTypeSig2.hs" (Just rmTypeSig2)
  -- "../../testsuite/tests/ghc-api/exactprint/AddHiding1.hs" (Just addHiding1)
  -- "../../testsuite/tests/ghc-api/exactprint/AddHiding2.hs" (Just addHiding2)
- -- "../../testsuite/tests/printer/Ppr001.hs" Nothing
+ -- "../../testsuite/tests/ghc-api/exactprint/AddClassMethod.hs" (Just addClassMethod)
  -- "../../testsuite/tests/ghc-api/annotations/CommentsTest.hs" Nothing
  -- "../../testsuite/tests/hiefile/should_compile/Constructors.hs" Nothing
  -- "../../testsuite/tests/hiefile/should_compile/Scopes.hs" Nothing
@@ -100,6 +100,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/master/_b
  -- "../../testsuite/tests/printer/Ppr008.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr009.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr011.hs" Nothing
+ -- "../../testsuite/tests/printer/Ppr011a.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr012.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr013.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr014.hs" Nothing
@@ -108,7 +109,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/master/_b
  -- "../../testsuite/tests/printer/Ppr017.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr018.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr019.hs" Nothing
- "../../testsuite/tests/printer/Ppr020.hs" Nothing
+ -- "../../testsuite/tests/printer/Ppr020.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr021.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr022.hs" Nothing
  -- "../../testsuite/tests/printer/Ppr023.hs" Nothing
@@ -148,6 +149,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/master/_b
  -- "../../testsuite/tests/printer/PprRecordDotSyntax3.hs" Nothing
  -- "../../testsuite/tests/printer/PprRecordDotSyntax4.hs" Nothing
  -- "../../testsuite/tests/printer/PprRecordDotSyntaxA.hs" Nothing
+ -- "../../testsuite/tests/printer/PprUnicodeSyntax.hs" Nothing
  -- "../../testsuite/tests/printer/StarBinderAnns.hs" Nothing
  -- "../../testsuite/tests/printer/T13050p.hs" Nothing
  -- "../../testsuite/tests/printer/T13199.hs" Nothing
@@ -203,7 +205,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/master/_b
  -- "../../testsuite/tests/ghc-api/exactprint/Test20239.hs" Nothing
  -- "../../testsuite/tests/printer/PprArrowLambdaCase.hs" Nothing
  -- "../../testsuite/tests/printer/Test16279.hs" Nothing
- -- "../../testsuite/tests/printer/HsDocTy.hs" Nothing
+ "../../testsuite/tests/printer/HsDocTy.hs" Nothing
 --  "../../testsuite/tests/printer/Test22765.hs" Nothing
  -- "../../testsuite/tests/printer/Test22771.hs" Nothing
  -- "../../testsuite/tests/printer/Test23465.hs" Nothing
@@ -292,7 +294,6 @@ writeBinFile fpath x = withBinaryFile fpath WriteMode (\h -> hSetEncoding h utf8
 testOneFile :: [(String, Changer)] -> FilePath -> String -> Maybe Changer -> IO ()
 testOneFile _ libdir fileName mchanger = do
        (p,_toks) <- parseOneFile libdir fileName
-       -- putStrLn $ "\n\ngot p" ++ showAst (take 4 $ reverse _toks)
        let
          origAst = ppAst p
          pped    = exactPrint p
@@ -381,9 +382,6 @@ type Changer = FilePath -> (ParsedSource -> IO ParsedSource)
 noChange :: Changer
 noChange _libdir parsed = return parsed
 
--- changeDeltaAst :: Changer
--- changeDeltaAst _libdir parsed = return (makeDeltaAst parsed)
-
 changeRenameCase1 :: Changer
 changeRenameCase1 _libdir parsed = return (rename "bazLonger" [((3,15),(3,18))] parsed)
 
@@ -414,7 +412,7 @@ changeRename2 _libdir parsed = return (rename "joe" [((2,1),(2,5))] parsed)
 
 rename :: (Data a, ExactPrint a) => String -> [(Pos, Pos)] -> a -> a
 rename newNameStr spans' a
-  = everywhere (mkT replaceRdr) (makeDeltaAst a)
+  = everywhere (mkT replaceRdr) a
   where
     newName = mkRdrUnqual (mkVarOcc newNameStr)
 
@@ -430,7 +428,7 @@ rename newNameStr spans' a
 
 changeWhereIn4 :: Changer
 changeWhereIn4 _libdir parsed
-  = return (everywhere (mkT replace) (makeDeltaAst parsed))
+  = return (everywhere (mkT replace) parsed)
   where
     replace :: LocatedN RdrName -> LocatedN RdrName
     replace (L ln _n)
@@ -450,7 +448,7 @@ changeLetIn1 _libdir parsed
              [l2,_l1] = map wrapDecl $ bagToList bagDecls
              bagDecls' = listToBag $ concatMap decl2Bind [l2]
              (L (SrcSpanAnn _ le) e) = expr
-             a = (SrcSpanAnn (EpAnn (Anchor (realSrcSpan le) (MovedAnchor (SameLine 1))) noAnn emptyComments) le)
+             a = (SrcSpanAnn (EpAnn (Anchor (realSrcSpan le) (MovedAnchor (SameLine 1) [])) noAnn emptyComments) le)
              expr' = L a e
              tkIn' = L (TokenLoc (EpaDelta (DifferentLine 1 0) [])) HsTok
          in (HsLet an tkLet
@@ -480,7 +478,7 @@ changeAddDecl2 libdir top = do
   let decl' = setEntryDP (makeDeltaAst decl) (DifferentLine 2 0)
 
   let (p',_,_) = runTransform doAddDecl
-      doAddDecl = everywhereM (mkM replaceTopLevelDecls) (makeDeltaAst top)
+      doAddDecl = everywhereM (mkM replaceTopLevelDecls) top
       replaceTopLevelDecls :: ParsedSource -> Transform ParsedSource
       replaceTopLevelDecls m = insertAtEnd m decl'
   return p'
@@ -524,11 +522,12 @@ changeLocalDecls libdir (L l p) = do
             os' = setEntryDP os (DifferentLine 2 0)
         let sortKey = captureOrderBinds decls
         let (EpAnn anc (AnnList (Just (Anchor anc2 _)) a b c dd) cs) = van
-        let van' = (EpAnn anc (AnnList (Just (Anchor anc2 (MovedAnchor (DifferentLine 1 4)))) a b c dd) cs)
+        let van' = (EpAnn anc (AnnList (Just (Anchor anc2 (MovedAnchor (DifferentLine 1 5) []))) a b c dd) cs)
         let binds' = (HsValBinds van'
                           (ValBinds sortKey (listToBag $ decl':oldBinds)
                                           (sig':os':oldSigs)))
         return (L lm (Match an mln pats (GRHSs emptyComments rhs binds')))
+                   `debug` ("oldDecls=" ++ showAst oldDecls)
       replaceLocalBinds x = return x
   return (L l p')
 
@@ -548,8 +547,8 @@ changeLocalDecls2 libdir (L l p) = do
                         -> Transform (LMatch GhcPs (LHsExpr GhcPs))
       replaceLocalBinds (L lm (Match ma mln pats (GRHSs _ rhs EmptyLocalBinds{}))) = do
         newSpan <- uniqueSrcSpanT
-        let anc = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 2)))
-        let anc2 = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 4)))
+        let anc = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 3) []))
+        let anc2 = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 5) []))
         let an = EpAnn anc
                         (AnnList (Just anc2) Nothing Nothing
                                  [AddEpAnn AnnWhere (EpaDelta (SameLine 0) [])] [])
@@ -596,7 +595,7 @@ addLocaLDecl1 libdir top = do
   Right (L ld (ValD _ decl)) <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")
   let decl' = setEntryDP (L ld decl) (DifferentLine 1 5)
       doAddLocal = do
-        let lp = makeDeltaAst top
+        let lp = top
         (de1:d2:d3:_) <- hsDecls lp
         (de1'',d2') <- balanceComments de1 d2
         (de1',_) <- modifyValD (getLocA de1'') de1'' $ \_m d -> do
@@ -635,7 +634,7 @@ addLocaLDecl3 libdir top = do
   Right newDecl <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")
   let
       doAddLocal = do
-         let lp = makeDeltaAst top
+         let lp = top
          (de1:d2:_) <- hsDecls lp
          (de1'',d2') <- balanceComments de1 d2
 
@@ -720,9 +719,10 @@ addLocaLDecl6 libdir lp = do
 rmDecl1 :: Changer
 rmDecl1 _libdir top = do
   let doRmDecl = do
-         let lp = makeDeltaAst top
+         let lp = top
          tlDecs0 <- hsDecls lp
-         tlDecs <- balanceCommentsList $ captureLineSpacing tlDecs0
+         tlDecs' <- balanceCommentsList tlDecs0
+         let tlDecs = captureLineSpacing tlDecs'
          let (de1:_s1:_d2:d3:ds) = tlDecs
          let d3' = setEntryDP d3 (DifferentLine 2 0)
 
@@ -823,7 +823,8 @@ rmDecl6 _libdir lp = do
          [de1] <- hsDecls lp
 
          (de1',_) <- modifyValD (getLocA de1) de1 $ \_m subDecs -> do
-           let (ss1:_sd1:sd2:sds) = subDecs
+           let subDecs' = captureLineSpacing subDecs
+           let (ss1:_sd1:sd2:sds) = subDecs'
            sd2' <- transferEntryDP' ss1 sd2
 
            return (sd2':sds,Nothing)
@@ -840,7 +841,7 @@ rmDecl7 :: Changer
 rmDecl7 _libdir top = do
   let
       doRmDecl = do
-         let lp = makeDeltaAst top
+         let lp = top
          tlDecs <- hsDecls lp
          [s1,de1,d2,d3] <- balanceCommentsList tlDecs
 
@@ -861,8 +862,8 @@ rmTypeSig1 _libdir lp = do
          let (s0:de1:d2) = tlDecs
              s1 = captureTypeSigSpacing s0
              (L l (SigD x1 (TypeSig x2 [n1,n2] typ))) = s1
-         n2' <- transferEntryDP n1 n2
-         let s1' = (L l (SigD x1 (TypeSig x2 [n2'] typ)))
+         L ln n2' <- transferEntryDP n1 n2
+         let s1' = (L l (SigD x1 (TypeSig x2 [L (noTrailingN ln) n2'] typ)))
          replaceDecls lp (s1':de1:d2)
 
   let (lp',_,_w) = runTransform doRmDecl
@@ -878,8 +879,9 @@ rmTypeSig2 _libdir lp = do
          let [de1] = tlDecs
 
          (de1',_) <- modifyValD (getLocA de1) de1 $ \_m [s,d] -> do
-           d' <- transferEntryDP s d
-           return ([d'],Nothing)
+           d' <- transferEntryDP' s d
+           return $ ([d'],Nothing)
+                  `debug` ("rmTypeSig2:(d,d')" ++ showAst (d,d'))
          replaceDecls lp [de1']
 
   let (lp',_,_w) = runTransform doRmDecl
@@ -908,7 +910,8 @@ addHiding1 _libdir (L l p) = do
                                               [])
                                        emptyComments) l0) [v1,v2]
           imp1' = imp1 { ideclImportList = Just (EverythingBut,impHiding)}
-          p' = p { hsmodImports = [L li imp1',imp2]}
+          imp2' = setEntryDP imp2 (DifferentLine 2 0)
+          p' = p { hsmodImports = [L li imp1',imp2']}
         return (L l p')
 
   let (lp',_,_w) = runTransform doTransform
@@ -920,7 +923,7 @@ addHiding1 _libdir (L l p) = do
 addHiding2 :: Changer
 addHiding2 _libdir top = do
   let doTransform = do
-        let (L l p) = makeDeltaAst top
+        let (L l p) = top
         l1 <- uniqueSrcSpanT
         l2 <- uniqueSrcSpanT
         let
@@ -953,12 +956,12 @@ addClassMethod :: Changer
 addClassMethod libdir lp = do
   Right sig  <- withDynFlags libdir (\df -> parseDecl df "sig"  "nn :: Int")
   Right decl <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")
-  let decl' = setEntryDP decl (DifferentLine 1 2)
-  let  sig' = setEntryDP sig  (DifferentLine 2 2)
+  let decl' = setEntryDP decl (DifferentLine 1 3)
+  let  sig' = setEntryDP sig  (DifferentLine 2 3)
   let doAddMethod = do
         [cd] <- hsDecls lp
         (f1:f2s:f2d:_) <- hsDecls cd
-        let  f2s' = setEntryDP f2s  (DifferentLine 2 2)
+        let  f2s' = setEntryDP f2s  (DifferentLine 2 3)
         cd' <- replaceDecls cd [f1, sig', decl', f2s', f2d]
         replaceDecls lp [cd']
 
diff --git a/utils/check-exact/Preprocess.hs b/utils/check-exact/Preprocess.hs
index 87df87b1c2caac897712eac96e2d949c1d0a18a5..6f1dd37f57cde8463f5f1f924d94f718610a701a 100644
--- a/utils/check-exact/Preprocess.hs
+++ b/utils/check-exact/Preprocess.hs
@@ -77,7 +77,6 @@ checkLine line s
            ss     = mkSrcSpan (mSrcLoc line 1) (mSrcLoc line (size+1))
        in (res, Just $ mkLEpaComment pragma (GHC.spanAsAnchor ss) (GHC.realSrcSpan ss))
   -- Deal with shebang/cpp directives too
-  -- x |  "#" `isPrefixOf` s = ("",Just $ Comment ((line, 1), (line, length s)) s)
   |  "#!" `isPrefixOf` s =
     let mSrcLoc = mkSrcLoc (mkFastString "SHEBANG")
         ss = mkSrcSpan (mSrcLoc line 1) (mSrcLoc line (length s))
@@ -129,7 +128,6 @@ goodComment c = isGoodComment (tokComment c)
     isGoodComment [Comment "" _ _ _] = False
     isGoodComment _                  = True
 
-
 toRealLocated :: GHC.Located a -> GHC.RealLocated a
 toRealLocated (GHC.L (GHC.RealSrcSpan s _) x) = GHC.L s              x
 toRealLocated (GHC.L _ x)                     = GHC.L badRealSrcSpan x
@@ -281,12 +279,7 @@ makeBufSpan ss = pspan
 -- ---------------------------------------------------------------------
 
 parseError :: (GHC.MonadIO m) => GHC.PState -> m b
-parseError pst = do
-     let
-       -- (warns,errs) = GHC.getMessages pst dflags
-     -- throw $ GHC.mkSrcErr (GHC.unitBag $ GHC.mkPlainErrMsg dflags sspan err)
-     -- GHC.throwErrors (fmap GHC.mkParserErr (GHC.getErrorMessages pst))
-     GHC.throwErrors (fmap GHC.GhcPsMessage (GHC.getPsErrorMessages pst))
+parseError pst = GHC.throwErrors (fmap GHC.GhcPsMessage (GHC.getPsErrorMessages pst))
 
 -- ---------------------------------------------------------------------
 
diff --git a/utils/check-exact/Transform.hs b/utils/check-exact/Transform.hs
index b877d1eda2e81f7aa2d55107f34718686fd0634c..045b585763fdeba3ce363ffe6e3795dc0442fbc7 100644
--- a/utils/check-exact/Transform.hs
+++ b/utils/check-exact/Transform.hs
@@ -77,7 +77,7 @@ module Transform
         , isUniqueSrcSpan
 
         -- * Pure functions
-        , setEntryDP
+        , setEntryDP, setEntryDPDecl
         , getEntryDP
         , transferEntryDP
         , transferEntryDP'
@@ -191,15 +191,23 @@ captureMatchLineSpacing (L l (ValD x (FunBind a b (MG c (L d ms )))))
       ms' = captureLineSpacing ms
 captureMatchLineSpacing d = d
 
-captureLineSpacing :: NoAnn t
-                   => [LocatedAn t e] -> [LocatedAn t e]
+captureLineSpacing :: [LocatedA e] -> [LocatedA e]
 captureLineSpacing [] = []
 captureLineSpacing [d] = [d]
-captureLineSpacing (de1:d2:ds) = de1:captureLineSpacing (d2':ds)
+captureLineSpacing ds = map (\(_,_,x) -> x) $ go (map to ds)
   where
-    (l1,_) = ss2pos $ rs $ getLocA de1
-    (l2,_) = ss2pos $ rs $ getLocA d2
-    d2' = setEntryDP d2 (deltaPos (l2-l1) 0)
+    to :: LocatedA e -> (Int, Int, LocatedA e)
+    to d = (fst $ ss2pos rss, fst $ ss2posEnd rss,d)
+      where
+        rss = rs $ getHasLoc d
+
+    go :: [(Int, Int, LocatedA e)] -> [(Int, Int, LocatedA e)]
+    go [] = []
+    go [d] = [d]
+    go ((ls1,le1,de1):(ls2,le2,d2):ds0) = (ls1,le1,de1):go ((ls2,le2,d2'):ds0)
+         `debug` ("captureLineSpacing: (le1,ls2,getLoc d2,getLoc d2')=" ++ showAst (le1,ls2,getLoc d2,getLoc d2'))
+      where
+        d2' = setEntryDP d2 (deltaPos (ls2-le1) 0)
 
 -- ---------------------------------------------------------------------
 
@@ -224,16 +232,16 @@ captureTypeSigSpacing (L l (SigD x (TypeSig (EpAnn anc (AnnSig dc rs') cs) ns (H
       (L (SrcSpanAnn EpAnnNotUsed    ll) b)
         -> let
              op = case dca of
-               EpaSpan r _ -> MovedAnchor (ss2delta (ss2posEnd r) (realSrcSpan ll))
-               EpaDelta _ _ -> MovedAnchor (SameLine 1)
+               EpaSpan r _ -> MovedAnchor (ss2delta (ss2posEnd r) (realSrcSpan ll)) []
+               EpaDelta _ cs0 -> MovedAnchor (SameLine 1) cs0
            in (L (SrcSpanAnn (EpAnn (Anchor (realSrcSpan ll) op) noAnn emptyComments) ll) b)
       (L (SrcSpanAnn (EpAnn (Anchor r op) a c) ll) b)
         -> let
               op' = case op of
-                MovedAnchor _ -> op
+                MovedAnchor _ _ -> op
                 _ -> case dca of
-                  EpaSpan dcr _ -> MovedAnchor (ss2delta (ss2posEnd dcr) r)
-                  EpaDelta _ _ -> MovedAnchor (SameLine 1)
+                  EpaSpan _ _    -> MovedAnchor (SameLine 1) []
+                  EpaDelta _ cs0 -> MovedAnchor (SameLine 1) cs0
            in (L (SrcSpanAnn (EpAnn (Anchor r op') a c) ll) b)
 
 captureTypeSigSpacing s = s
@@ -258,45 +266,59 @@ setEntryDPDecl d dp = setEntryDP d dp
 setEntryDP :: NoAnn t => LocatedAn t a -> DeltaPos -> LocatedAn t a
 setEntryDP (L (SrcSpanAnn EpAnnNotUsed l) a) dp
   = L (SrcSpanAnn
-           (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp)) noAnn emptyComments)
+           (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp [])) noAnn emptyComments)
            l) a
-setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r _) an (EpaComments [])) l) a) dp
+setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r UnchangedAnchor) an (EpaComments [])) l) a) dp
   = L (SrcSpanAnn
-           (EpAnn (Anchor r (MovedAnchor dp)) an (EpaComments []))
+           (EpAnn (Anchor r (MovedAnchor dp [])) an (EpaComments []))
            l) a
-setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r (MovedAnchor d)) an cs) l) a) dp
+setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r (MovedAnchor d csd)) an cs) l) a) dp
   = L (SrcSpanAnn
-           (EpAnn (Anchor r (MovedAnchor d')) an cs')
+           (EpAnn (Anchor r (MovedAnchor d' csd')) an cs')
            l) a
   where
-    (d',cs') = case cs of
+    (d', csd', cs') = case cs of
       EpaComments (h:t) ->
         let
           (dp0,c') = go h
         in
-          (dp0, EpaComments (c':t))
+          (dp0, c':t++csd, EpaComments [])
+      EpaComments [] ->
+          (dp, csd, cs)
       EpaCommentsBalanced (h:t) ts ->
         let
           (dp0,c') = go h
         in
-          (dp0, EpaCommentsBalanced (c':t) ts)
-      _ -> (dp, cs)
-    go (L (Anchor rr (MovedAnchor ma)) c) = (d,  L (Anchor rr (MovedAnchor ma)) c)
-    go (L (Anchor rr                _) c) = (d,  L (Anchor rr (MovedAnchor dp)) c)
-setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r _) an cs) l) a) dp
+          (dp0, c':t++csd, EpaCommentsBalanced [] ts)
+      EpaCommentsBalanced [] ts ->
+           case csd of
+             [] -> (d, csd, EpaCommentsBalanced [] ts)
+             (h:t) ->
+                let
+                  (dp0,c') = go h
+                in
+                  (dp0, c':t, EpaCommentsBalanced [] ts)
+    go (L (Anchor rr (MovedAnchor _ c0)) c) = (d,  L (Anchor rr (MovedAnchor dp c0)) c)
+    go (L (Anchor rr                  _) c) = (d,  L (Anchor rr (MovedAnchor dp [])) c)
+setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r UnchangedAnchor) an cs) l) a) dp
   = case sortEpaComments (priorComments cs) of
       [] ->
         L (SrcSpanAnn
-               (EpAnn (Anchor r (MovedAnchor dp)) an cs)
+               (EpAnn (Anchor r (MovedAnchor dp [])) an cs)
                l) a
       (L ca c:cs') ->
         L (SrcSpanAnn
-               (EpAnn (Anchor r (MovedAnchor edp)) an cs'')
+               (EpAnn (Anchor r (MovedAnchor edp csd)) an cs'')
                l) a
               where
-                cs'' = setPriorComments cs (L (Anchor (anchor ca) (MovedAnchor dp)) c:cs')
-                lc = last $ (L ca c:cs')
-                delta = tweakDelta $ ss2delta (ss2pos $ anchor $ getLoc lc) r
+                cs'' = setPriorComments cs []
+                csd = L (Anchor (anchor ca) (MovedAnchor dp [])) c:cs'
+                lc = case reverse $ (L ca c:cs') of
+                       ll:_ -> ll
+                       _ -> error "setEntryDP"
+                delta = case getLoc lc of
+                          Anchor rr UnchangedAnchor -> ss2delta (ss2pos rr) r
+                          Anchor _ (MovedAnchor _dp _) -> DifferentLine 1 0
                 line = getDeltaLine delta
                 col = deltaColumn delta
                 edp' = if line == 0 then SameLine col
@@ -307,7 +329,7 @@ setEntryDP (L (SrcSpanAnn (EpAnn (Anchor r _) an cs) l) a) dp
 -- ---------------------------------------------------------------------
 
 getEntryDP :: LocatedAn t a -> DeltaPos
-getEntryDP (L (SrcSpanAnn (EpAnn (Anchor _ (MovedAnchor dp)) _ _) _) _) = dp
+getEntryDP (L (SrcSpanAnn (EpAnn (Anchor _ (MovedAnchor dp _)) _ _) _) _) = dp
 getEntryDP _ = SameLine 1
 
 -- ---------------------------------------------------------------------
@@ -322,10 +344,10 @@ setEntryDPFromAnchor :: LayoutStartCol -> EpaLocation -> LocatedA t -> LocatedA
 setEntryDPFromAnchor _off (EpaDelta _ _) (L la a) = L la a
 setEntryDPFromAnchor  off (EpaSpan anc _) ll@(L la _) = setEntryDP ll dp'
   where
-    r = case la of
-      (SrcSpanAnn EpAnnNotUsed l) -> realSrcSpan l
-      (SrcSpanAnn (EpAnn (Anchor r' _) _ _) _) -> r'
-    dp' = adjustDeltaForOffset off (ss2deltaEnd anc r)
+    dp' = case la of
+      (SrcSpanAnn EpAnnNotUsed l) -> adjustDeltaForOffset off (ss2deltaEnd anc (realSrcSpan l))
+      (SrcSpanAnn (EpAnn (Anchor r' UnchangedAnchor) _ _) _) -> adjustDeltaForOffset off (ss2deltaEnd anc r')
+      (SrcSpanAnn (EpAnn (Anchor _  (MovedAnchor dp _)) _ _) _) -> adjustDeltaForOffset off dp
 
 -- ---------------------------------------------------------------------
 
@@ -354,7 +376,8 @@ transferEntryDP (L (SrcSpanAnn EpAnnNotUsed _l1) _) (L (SrcSpanAnn (EpAnn anc2 a
   return (L (SrcSpanAnn (EpAnn anc2' an2 cs2) l2) b)
     where
       anc2' = case anc2 of
-        Anchor _a op   -> Anchor (realSrcSpan l2) op
+        Anchor _ (MovedAnchor _ _) -> anc2
+        Anchor _a UnchangedAnchor -> Anchor (realSrcSpan l2) UnchangedAnchor
 
 
 -- |If a and b are the same type return first arg, else return second
@@ -384,14 +407,11 @@ pushDeclDP d _dp = d
 -- ---------------------------------------------------------------------
 
 balanceCommentsList :: (Monad m) => [LHsDecl GhcPs] -> TransformT m [LHsDecl GhcPs]
-balanceCommentsList ds = balanceCommentsList'' ds
-
-balanceCommentsList'' :: (Monad m) => [LHsDecl GhcPs] -> TransformT m [LHsDecl GhcPs]
-balanceCommentsList'' [] = return []
-balanceCommentsList'' [x] = return [x]
-balanceCommentsList'' (a:b:ls) = do
+balanceCommentsList [] = return []
+balanceCommentsList [x] = return [x]
+balanceCommentsList (a:b:ls) = do
   (a',b') <- balanceComments a b
-  r <- balanceCommentsList'' (b':ls)
+  r <- balanceCommentsList (b':ls)
   return (a':r)
 
 -- |The GHC parser puts all comments appearing between the end of one AST
@@ -416,22 +436,33 @@ balanceComments first second = do
 balanceCommentsFB :: (Monad m)
   => LHsBind GhcPs -> LocatedA b -> TransformT m (LHsBind GhcPs, LocatedA b)
 balanceCommentsFB (L lf (FunBind x n (MG o (L lm matches)))) second = do
-  logTr $ "balanceCommentsFB entered: " ++ showGhc (ss2range $ locA lf)
+  debugM $ "balanceCommentsFB entered: " ++ showGhc (ss2range $ locA lf)
   -- There are comments on lf.  We need to
   -- + Keep the prior ones here
   -- + move the interior ones to the first match,
   -- + move the trailing ones to the last match.
   let
-    split = splitCommentsEnd (realSrcSpan $ locA lf) (epAnnComments $ ann lf)
-    split2 = splitCommentsStart (realSrcSpan $ locA lf)  (EpaComments (sortEpaComments $ priorComments split))
-
-    before = sortEpaComments $ priorComments split2
-    middle = sortEpaComments $ getFollowingComments split2
-    after  = sortEpaComments $ getFollowingComments split
-
+    (before,middle,after) = case s_entry lf of
+        EpaSpan ss _ ->
+          let
+            split = splitCommentsEnd ss (s_comments lf)
+            split2 = splitCommentsStart ss  (EpaComments (sortEpaComments $ priorComments split))
+
+            before0 = sortEpaComments $ priorComments split2
+            middle0 = sortEpaComments $ getFollowingComments split2
+            after0  = sortEpaComments $ getFollowingComments split
+          in (before0,middle0,after0)
+        _ -> (priorComments $ s_comments lf,
+              [],
+              getFollowingComments $ s_comments lf)
+
+    -- lf' = setCommentsEpAnnS lf (EpaComments before)
     lf' = setCommentsSrcAnn lf (EpaComments before)
-  logTr $ "balanceCommentsFB (before, after): " ++ showAst (before, after)
-  let matches' = case matches of
+  debugM $ "balanceCommentsFB (before, after): " ++ showAst (before, after)
+  debugM $ "balanceCommentsFB lf': " ++ showAst lf'
+  -- let matches' = case matches of
+  let matches' :: [LocatedA (Match GhcPs (LHsExpr GhcPs))]
+      matches' = case matches of
                     (L lm' m':ms') ->
                       (L (addCommentsToSrcAnn lm' (EpaComments middle )) m':ms')
                     _ -> error "balanceCommentsFB"
@@ -439,14 +470,18 @@ balanceCommentsFB (L lf (FunBind x n (MG o (L lm matches)))) second = do
   let (m,ms) = case reverse matches'' of
                  (L lm' m':ms') ->
                    (L (addCommentsToSrcAnn lm' (EpaCommentsBalanced [] after)) m',ms')
-                 _ -> error "balanceCommentsFB"
+                 _ -> error "balanceCommentsFB4"
+  debugM $ "balanceCommentsFB: (m,ms):" ++ showAst (m,ms)
   (m',second') <- balanceComments' m second
   m'' <- balanceCommentsMatch m'
   let (m''',lf'') = case ms of
         [] -> moveLeadingComments m'' lf'
         _  -> (m'',lf')
-  logTr $ "balanceCommentsMatch done"
-  balanceComments' (L lf'' (FunBind x n (MG o (L lm (reverse (m''':ms)))))) second'
+  debugM $ "balanceCommentsFB: (lf'', m'''):" ++ showAst (lf'',m''')
+  debugM $ "balanceCommentsFB done"
+  let bind = L lf'' (FunBind x n (MG o (L lm (reverse (m''':ms)))))
+  debugM $ "balanceCommentsFB returning:" ++ showAst bind
+  balanceComments' (packFunBind bind) second'
 balanceCommentsFB f s = balanceComments' f s
 
 -- | Move comments on the same line as the end of the match into the
@@ -458,17 +493,17 @@ balanceCommentsMatch (L l (Match am mctxt pats (GRHSs xg grhss binds))) = do
   return (L l'' (Match am mctxt pats (GRHSs xg grhss' binds')))
   where
     simpleBreak (r,_) = r /= 0
-    (SrcSpanAnn an1 _loc1) = l
-    anc1 = addCommentOrigDeltas $ epAnnComments an1
+    an1 = l
+    anc1 = s_comments an1
     cs1f = getFollowingComments anc1
     (move',stay') = break simpleBreak (trailingCommentsDeltas (anchorFromLocatedA (L l ())) cs1f)
     move = map snd move'
     stay = map snd stay'
     (l'', grhss', binds', logInfo)
       = case reverse grhss of
-          [] -> (l, [], binds,                 (EpaComments [], SrcSpanAnn EpAnnNotUsed noSrcSpan))
+          [] -> (l, [], binds,                 (EpaComments [], noSrcSpanA))
           (L lg g@(GRHS EpAnnNotUsed _grs _rhs):gs)
-            -> (l, reverse (L lg g:gs), binds, (EpaComments [], SrcSpanAnn EpAnnNotUsed noSrcSpan))
+            -> (l, reverse (L lg g:gs), binds, (EpaComments [], noSrcSpanA))
           (L lg (GRHS ag grs rhs):gs) ->
             let
               anc1' = setFollowingComments anc1 stay
@@ -479,11 +514,10 @@ balanceCommentsMatch (L l (Match am mctxt pats (GRHSs xg grhss binds))) = do
               -- ---------------------------------
 
               (EpAnn anc an lgc) = ag
-              lgc' = splitCommentsEnd (realSrcSpan $ locA lg) $ addCommentOrigDeltas lgc
+              lgc' = splitCommentsEnd (realSrcSpan $ locA lg) lgc
               ag' = if moved
                       then EpAnn anc an lgc'
                       else EpAnn anc an (lgc' <> (EpaCommentsBalanced [] move))
-              -- ag' = EpAnn anc an lgc'
 
             in (an1', (reverse $ (L lg (GRHS ag' grs rhs):gs)), bindsm, (anc1',an1'))
 
@@ -519,18 +553,17 @@ balanceCommentsList' (a:b:ls) = do
 -- Many of these should in fact be following comments for the previous anchor
 balanceComments' :: (Monad m) => LocatedA a -> LocatedA b -> TransformT m (LocatedA a, LocatedA b)
 balanceComments' la1 la2 = do
-  logTr $ "balanceComments': (loc1,loc2)=" ++ showGhc (ss2range loc1,ss2range loc2)
-  logTr $ "balanceComments': (anc1)=" ++ showAst (anc1)
-  logTr $ "balanceComments': (cs1s)=" ++ showAst (cs1s)
-  logTr $ "balanceComments': (cs1stay,cs1move)=" ++ showAst (cs1stay,cs1move)
-  logTr $ "balanceComments': (an1',an2')=" ++ showAst (an1',an2')
+  debugM $ "balanceComments': (anc1)=" ++ showAst (anc1)
+  debugM $ "balanceComments': (cs1s)=" ++ showAst (cs1s)
+  debugM $ "balanceComments': (cs1stay,cs1move)=" ++ showAst (cs1stay,cs1move)
+  debugM $ "balanceComments': (an1',an2')=" ++ showAst (an1',an2')
   return (la1', la2')
   where
     simpleBreak n (r,_) = r > n
-    L (SrcSpanAnn an1 loc1) f = la1
-    L (SrcSpanAnn an2 loc2) s = la2
-    anc1 = addCommentOrigDeltas $ epAnnComments an1
-    anc2 = addCommentOrigDeltas $ epAnnComments an2
+    L an1 f = la1
+    L an2 s = la2
+    anc1 = s_comments an1
+    anc2 = s_comments an2
 
     cs1s = splitCommentsEnd (anchorFromLocatedA la1) anc1
     cs1p = priorCommentsDeltas    (anchorFromLocatedA la1) (priorComments        cs1s)
@@ -559,27 +592,30 @@ balanceComments' la1 la2 = do
 trailingCommentsDeltas :: RealSrcSpan -> [LEpaComment]
                -> [(Int, LEpaComment)]
 trailingCommentsDeltas _ [] = []
-trailingCommentsDeltas anc (la@(L l _):las)
-  = deltaComment anc la : trailingCommentsDeltas (anchor l) las
+trailingCommentsDeltas r (la@(L (Anchor _ (MovedAnchor dp _)) _):las)
+  = (getDeltaLine dp, la): trailingCommentsDeltas r las
+trailingCommentsDeltas r (la@(L l _):las)
+  = deltaComment r la : trailingCommentsDeltas (anchor l) las
   where
-    deltaComment anc' (L loc c) = (abs(ll - al), L loc c)
+    deltaComment rs' (L loc c) = (abs(ll - al), L loc c)
       where
-        (al,_) = ss2posEnd anc'
+        (al,_) = ss2posEnd rs'
         (ll,_) = ss2pos (anchor loc)
 
 -- AZ:TODO: this is identical to commentsDeltas
 priorCommentsDeltas :: RealSrcSpan -> [LEpaComment]
                     -> [(Int, LEpaComment)]
-priorCommentsDeltas anc cs = go anc (reverse $ sortEpaComments cs)
+priorCommentsDeltas r cs = go r (reverse $ sortEpaComments cs)
   where
     go :: RealSrcSpan -> [LEpaComment] -> [(Int, LEpaComment)]
     go _ [] = []
-    go anc' (la@(L l _):las) = deltaComment anc' la : go (anchor l) las
+    go _rs' (la@(L l@(Anchor _ (MovedAnchor dp _)) _):las) = (deltaLine dp, la) : go (anchor l) las
+    go rs'  (la@(L l _):las) = deltaComment rs' la : go (anchor l) las
 
     deltaComment :: RealSrcSpan -> LEpaComment -> (Int, LEpaComment)
-    deltaComment anc' (L loc c) = (abs(ll - al), L loc c)
+    deltaComment rs' (L loc c) = (abs(ll - al), L loc c)
       where
-        (al,_) = ss2pos anc'
+        (al,_) = ss2pos rs'
         (ll,_) = ss2pos (anchor loc)
 
 
@@ -590,14 +626,16 @@ priorCommentsDeltas anc cs = go anc (reverse $ sortEpaComments cs)
 splitCommentsEnd :: RealSrcSpan -> EpAnnComments -> EpAnnComments
 splitCommentsEnd p (EpaComments cs) = cs'
   where
-    cmp (L (Anchor l _) _) = ss2pos l > ss2posEnd p
+    cmp (L (Anchor l UnchangedAnchor) _) = ss2pos l > ss2posEnd p
+    cmp (L _ _) = True
     (before, after) = break cmp cs
     cs' = case after of
       [] -> EpaComments cs
       _ -> EpaCommentsBalanced before after
 splitCommentsEnd p (EpaCommentsBalanced cs ts) = EpaCommentsBalanced cs' ts'
   where
-    cmp (L (Anchor l _) _) = ss2pos l > ss2posEnd p
+    cmp (L (Anchor l UnchangedAnchor) _) = ss2pos l > ss2posEnd p
+    cmp (L _ _) = True
     (before, after) = break cmp cs
     cs' = before
     ts' = after <> ts
@@ -607,14 +645,16 @@ splitCommentsEnd p (EpaCommentsBalanced cs ts) = EpaCommentsBalanced cs' ts'
 splitCommentsStart :: RealSrcSpan -> EpAnnComments -> EpAnnComments
 splitCommentsStart p (EpaComments cs) = cs'
   where
-    cmp (L (Anchor l _) _) = ss2pos l > ss2pos p
+    cmp (L (Anchor l UnchangedAnchor) _) = ss2pos l > ss2posEnd p
+    cmp (L _ _) = True
     (before, after) = break cmp cs
     cs' = case after of
       [] -> EpaComments cs
       _ -> EpaCommentsBalanced before after
 splitCommentsStart p (EpaCommentsBalanced cs ts) = EpaCommentsBalanced cs' ts'
   where
-    cmp (L (Anchor l _) _) = ss2pos l > ss2pos p
+    cmp (L (Anchor l UnchangedAnchor) _) = ss2pos l > ss2posEnd p
+    cmp (L _ _) = True
     (before, after) = break cmp cs
     cs' = before
     ts' = after <> ts
@@ -625,14 +665,14 @@ moveLeadingComments from@(L (SrcSpanAnn EpAnnNotUsed _) _) to = (from, to)
 moveLeadingComments (L la a) lb = (L la' a, lb')
   `debug` ("moveLeadingComments: (before, after, la', lb'):" ++ showAst (before, after, la', lb'))
   where
-    split = splitCommentsEnd (realSrcSpan $ locA la) (epAnnComments $ ann la)
+    split = splitCommentsEnd (realSrcSpan $ locA la) (s_comments la)
     before = sortEpaComments $ priorComments split
     after = sortEpaComments $ getFollowingComments split
 
     -- TODO: need to set an entry delta on lb' to zero, and move the
     -- original spacing to the first comment.
 
-    la' = setCommentsSrcAnn la (EpaComments after)
+    la' = setCommentsSrcAnn la (EpaCommentsBalanced [] after)
     lb' = addCommentsToSrcAnn lb (EpaCommentsBalanced before [])
 
 -- | A GHC comment includes the span of the preceding (non-comment)
@@ -660,26 +700,6 @@ anchorFromLocatedA (L (SrcSpanAnn an loc) _)
       EpAnnNotUsed    -> realSrcSpan loc
       (EpAnn anc _ _) -> anchor anc
 
--- | A GHC comment includes the span of the preceding token.  Take an
--- original comment, and convert the 'Anchor to have a have a
--- `MovedAnchor` operation based on the original location, only if it
--- does not already have one.
-commentOrigDelta :: LEpaComment -> LEpaComment
-commentOrigDelta (L (GHC.Anchor la _) (GHC.EpaComment t pp))
-  = (L (GHC.Anchor la op) (GHC.EpaComment t pp))
-                  `debug` ("commentOrigDelta: (la, pp, r,c, op)=" ++ showAst (la, pp, r,c, op))
-  where
-        (r,c) = ss2posEnd pp
-
-        op' = if r == 0
-               then MovedAnchor (ss2delta (r,c+1) la)
-               -- then MovedAnchor (ss2delta (r,c+0) la)
-               -- else MovedAnchor (ss2delta (r,c)   la)
-               else MovedAnchor (tweakDelta $ ss2delta (r,c)   la)
-        op = if t == EpaEofComment && op' == MovedAnchor (SameLine 0)
-               then MovedAnchor (DifferentLine 1 0)
-               else op'
-
 -- ---------------------------------------------------------------------
 
 balanceSameLineComments :: (Monad m)
@@ -695,8 +715,8 @@ balanceSameLineComments (L la (Match anm mctxt pats (GRHSs x grhss lb))) = do
       (L lg g@(GRHS EpAnnNotUsed _gs _rhs):grs) -> (la,reverse $ (L lg g):grs,[])
       (L lg (GRHS ga gs rhs):grs) -> (la'',reverse $ (L lg (GRHS ga' gs rhs)):grs,[(gac,(csp,csf))])
         where
-          (SrcSpanAnn an1 _loc1) = la
-          anc1 = addCommentOrigDeltas $ epAnnComments an1
+          an1 = la
+          anc1 = s_comments an1
           (EpAnn anc an _) = ga :: EpAnn GrhsAnn
           (csp,csf) = case anc1 of
             EpaComments cs -> ([],cs)
@@ -706,13 +726,12 @@ balanceSameLineComments (L la (Match anm mctxt pats (GRHSs x grhss lb))) = do
           stay = map snd stay'
           cs1 = EpaCommentsBalanced csp stay
 
-          gac = addCommentOrigDeltas $ epAnnComments ga
+          gac = epAnnComments ga
           gfc = getFollowingComments gac
           gac' = setFollowingComments gac (sortEpaComments $ gfc ++ move)
           ga' = (EpAnn anc an gac')
 
-          an1' = setCommentsSrcAnn la cs1
-          la'' = an1'
+          la'' = setCommentsSrcAnn la cs1
 
 -- ---------------------------------------------------------------------
 
@@ -723,18 +742,11 @@ anchorEof (L l m@(HsModule (XModulePs an _lo _ _) _mn _exps _imps _decls)) = L l
 
 -- ---------------------------------------------------------------------
 
-commentsOrigDeltasDecl :: LHsDecl GhcPs -> LHsDecl GhcPs
-commentsOrigDeltasDecl (L (SrcSpanAnn an l) d) = L (SrcSpanAnn an' l) d
-  where
-    an' = addCommentOrigDeltasAnn an
-
--- ---------------------------------------------------------------------
-
 -- | Create a @SrcSpanAnn@ with a @MovedAnchor@ operation using the
 -- given @DeltaPos@.
 noAnnSrcSpanDP :: (NoAnn ann) => SrcSpan -> DeltaPos -> SrcSpanAnn' (EpAnn ann)
 noAnnSrcSpanDP l dp
-  = SrcSpanAnn (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp)) noAnn emptyComments) l
+  = SrcSpanAnn (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp [])) noAnn emptyComments) l
 
 noAnnSrcSpanDP0 :: (NoAnn ann) => SrcSpan -> SrcSpanAnn' (EpAnn ann)
 noAnnSrcSpanDP0 l = noAnnSrcSpanDP l (SameLine 0)
@@ -755,13 +767,13 @@ dn :: Int -> EpaLocation
 dn n = EpaDelta (SameLine n) []
 
 m0 :: AnchorOperation
-m0 = MovedAnchor $ SameLine 0
+m0 = MovedAnchor (SameLine 0) []
 
 m1 :: AnchorOperation
-m1 = MovedAnchor $ SameLine 1
+m1 = MovedAnchor (SameLine 1) []
 
 mn :: Int -> AnchorOperation
-mn n = MovedAnchor $ SameLine n
+mn n = MovedAnchor (SameLine n) []
 
 addComma :: SrcSpanAnnA -> SrcSpanAnnA
 addComma (SrcSpanAnn EpAnnNotUsed l)
@@ -783,7 +795,7 @@ insertAt :: (HasDecls ast)
 insertAt f t decl = do
   oldDecls <- hsDecls t
   oldDeclsb <- balanceCommentsList oldDecls
-  let oldDecls' = map commentsOrigDeltasDecl oldDeclsb
+  let oldDecls' = oldDeclsb
   replaceDecls t (f decl oldDecls')
 
 -- |Insert a declaration at the beginning or end of the subdecls of the given
@@ -793,9 +805,17 @@ insertAtStart, insertAtEnd :: (HasDecls ast)
               -> LHsDecl GhcPs
               -> Transform ast
 
-insertAtStart = insertAt (:)
 insertAtEnd   = insertAt (\x xs -> xs ++ [x])
 
+insertAtStart = insertAt insertFirst
+  where
+    insertFirst x xs =
+      case xs of
+        [] -> [x]
+        (h:t) -> x:setEntryDP h (DifferentLine 2 0):t
+                   `debug` ("insertAtStart:h=" ++ showAst h)
+
+
 -- |Insert a declaration at a specific location in the subdecls of the given
 -- AST item
 insertAfter, insertBefore :: (HasDecls (LocatedA ast))
@@ -810,8 +830,6 @@ insertAfter (getLocA -> k) = insertAt findAfter
         ([],[]) -> [x]
         (fs,[]) -> fs++[x]
         (fs, b:bs) -> fs ++ (b : x : bs)
-      -- let (fs, b:bs) = span (\(L l _) -> locA l /= k) xs
-      -- in fs ++ (b : x : bs)
 insertBefore (getLocA -> k) = insertAt findBefore
   where
     findBefore x xs =
@@ -858,6 +876,7 @@ class (Data t) => HasDecls t where
 
 instance HasDecls ParsedSource where
   hsDecls (L _ (HsModule (XModulePs _ _lo _ _) _mn _exps _imps decls)) = return decls
+
   replaceDecls (L l (HsModule (XModulePs a lo deps haddocks) mname exps imps _decls)) decls
     = do
         logTr "replaceDecls LHsModule"
@@ -926,7 +945,6 @@ instance HasDecls (LocatedA (HsExpr GhcPs)) where
                   newDecls'' = case newDecls of
                     [] -> newDecls
                     (d:ds) -> setEntryDPDecl d (SameLine 0) : ds
-                -- in ( EpAnn a (AnnsLet l (addEpaLocationDelta off lastAnc i)) cs
                 in ( L (TokenLoc l) ls
                    , L (TokenLoc (addEpaLocationDelta off lastAnc i)) is
                    , ex''
@@ -1019,6 +1037,74 @@ instance HasDecls (LocatedA (Stmt GhcPs (LocatedA (HsExpr GhcPs)))) where
 -- end of HasDecls instances
 -- =====================================================================
 
+-- ---------------------------------------------------------------------
+-- A @FunBind@ is a container for @[LMatch GhcPs]@
+--
+-- When being used as a Bind (or Decl), the surrounding context
+-- annotations must appear at the FunBind level, so it can be
+-- manipulated in the context of other Binds or Decls.
+--
+-- Surrounding context annotations are specifically prior comments,
+-- following comments and trailing annotations.
+--
+-- But when we unpack the container, by calling @hsDecls@ on a
+-- @FunBind@, we must make sure that the component parts fully
+-- represent the relationship between them and the surrounding
+-- declarations.
+--
+-- This means pushing the prior context annotations into the first
+-- match, and the following ones into the last match when returning
+-- @hsDecls@, and undoing this for @replaceDecls@.
+
+-- |Push leading and trailing top level annotations into the @[LMatch GhcPs]@
+unpackFunBind :: LHsBind GhcPs -> LHsBind GhcPs
+unpackFunBind (L loc (FunBind x1 fid (MG x2 (L lg (L lm m:matches)))))
+  = (L loc'' (FunBind x1 fid (MG x2 (L lg (reverse (L llm' lmtch:ms))))))
+     -- `debug` ("unpackFunBind: ="
+     --          ++ showAst (("loc",loc), ("loc'",loc'), ("loc''",loc''),
+     --                      ("lm'",lm'), ("llm",llm), ("llm'", llm')))
+  where
+    (loc', lm') = transferPriorCommentsA loc lm
+    matches' = reverse $ L lm' m:matches
+    (L llm lmtch, ms) = case matches' of
+                      mm:ms0 -> (mm,ms0)
+                      _ -> error "unpackFunBind"
+
+    (loc'', llm') = transferFollowingA loc' llm
+
+unpackFunBind d = d
+
+-- |Pull leading and trailing annotations from the @[LMatch GhcPs]@ to
+-- the top level.
+packFunBind :: LHsBind GhcPs -> LHsBind GhcPs
+packFunBind (L loc (FunBind x1 fid (MG x2 (L lg (L lm m:matches)))))
+  = (L loc'' (FunBind x1 fid (MG x2 (L lg (reverse (L llm' lmtch:ms))))))
+     -- `debug` ("packFunBind: ="
+     --          ++ showAst (("loc",loc), ("loc'",loc'), ("loc''",loc''),
+     --                      ("lm'",lm'), ("llm",llm), ("llm'", llm')))
+  where
+    (lm', loc') = transferPriorCommentsA lm loc
+    matches' = reverse $ L lm' m:matches
+    (L llm lmtch, ms) = case matches' of
+                      mm:ms0 -> (mm,ms0)
+                      _ -> error "packFunBind"
+    (llm', loc'') = transferFollowingA llm loc'
+packFunBind d = d
+
+packFunDecl :: LHsDecl GhcPs -> LHsDecl GhcPs
+packFunDecl (L l (ValD x b)) = L l' (ValD x b')
+  where
+    L l' b' = packFunBind (L l b)
+packFunDecl x = x
+
+unpackFunDecl :: LHsDecl GhcPs -> LHsDecl GhcPs
+unpackFunDecl (L l (ValD x b)) = L l' (ValD x b')
+  where
+    L l' b' = unpackFunBind (L l b)
+unpackFunDecl x = x
+
+-- ---------------------------------------------------------------------
+
 data WithWhere = WithWhere
                | WithoutWhere
                deriving (Eq,Show)
@@ -1061,10 +1147,10 @@ oldWhereAnnotation EpAnnNotUsed ww _oldSpan = do
   let w = case ww of
         WithWhere -> [AddEpAnn AnnWhere (EpaDelta (SameLine 0) [])]
         WithoutWhere -> []
-  let anc2' = Anchor (rs newSpan) (MovedAnchor (SameLine 1))
+  let anc2' = Anchor (rs newSpan) (MovedAnchor (SameLine 1) [])
   (anc, anc2) <- do
           newSpan' <- uniqueSrcSpanT
-          return ( Anchor (rs newSpan') (MovedAnchor (DifferentLine 1 2))
+          return ( Anchor (rs newSpan') (MovedAnchor (DifferentLine 1 2) [])
                  , anc2')
   let an = EpAnn anc
                   (AnnList (Just anc2) Nothing Nothing w [])
@@ -1088,8 +1174,8 @@ oldWhereAnnotation (EpAnn anc an cs) ww _oldSpan = do
 newWhereAnnotation :: (Monad m) => WithWhere -> TransformT m (EpAnn AnnList)
 newWhereAnnotation ww = do
   newSpan <- uniqueSrcSpanT
-  let anc  = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 2))
-  let anc2 = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 4))
+  let anc  = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 3) [])
+  let anc2 = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 5) [])
   let w = case ww of
         WithWhere -> [AddEpAnn AnnWhere (EpaDelta (SameLine 0) [])]
         WithoutWhere -> []
@@ -1120,15 +1206,16 @@ modifyValD p pb@(L ss (ValD _ (PatBind {} ))) f =
        pb' <- liftT $ replaceDeclsPatBindD pb ds'
        return (pb',r)
      else return (pb,Nothing)
-modifyValD p ast f = do
-  (ast',r) <- runStateT (everywhereM (mkM doModLocal) ast) Nothing
-  return (ast',r)
+modifyValD p decl f = do
+  (decl',r) <- runStateT (everywhereM (mkM doModLocal) (unpackFunDecl decl)) Nothing
+  return (packFunDecl decl',r)
   where
     doModLocal :: PMatch -> StateT (Maybe t) m PMatch
     doModLocal  (match@(L ss _) :: PMatch) = do
          if (locA ss) == p
            then do
              ds <- lift $ liftT $ hsDecls match
+                `debug` ("modifyValD: match=" ++ showAst match)
              (ds',r) <- lift $ f match ds
              put r
              match' <- lift $ liftT $ replaceDecls match ds'
diff --git a/utils/check-exact/Utils.hs b/utils/check-exact/Utils.hs
index 6c22a939d7e861027ebab10fb8dfe6e9951a5d86..5b868d71136a25119357c6a4c5457a32d9e24e78 100644
--- a/utils/check-exact/Utils.hs
+++ b/utils/check-exact/Utils.hs
@@ -110,6 +110,7 @@ pos2delta (refl,refc) (l,c) = deltaPos lo co
     lo = l - refl
     co = if lo == 0 then c - refc
                     else c
+                    -- else c - 1
 
 -- | Apply the delta to the current position, taking into account the
 -- current column offset if advancing to a new line
@@ -166,6 +167,12 @@ badRealSrcSpan = mkRealSrcSpan bad bad
 spanLength :: RealSrcSpan -> Int
 spanLength = (-) <$> srcSpanEndCol <*> srcSpanStartCol
 
+
+-- | Useful for debug dumps
+eloc2str :: EpaLocation -> String
+eloc2str (EpaSpan r _) = "EpaSpan " ++ show (rs2range r)
+eloc2str epaLoc = show epaLoc
+
 -- ---------------------------------------------------------------------
 -- | Checks whether a SrcSpan has zero length.
 isPointSrcSpan :: RealSrcSpan -> Bool
@@ -174,22 +181,23 @@ isPointSrcSpan ss = spanLength ss == 0
 
 -- ---------------------------------------------------------------------
 
-origDelta :: RealSrcSpan -> RealSrcSpan -> DeltaPos
-origDelta pos pp = op
+-- | A GHC comment includes the span of the preceding token.  Take an
+-- original comment, and convert the 'Anchor to have a have a
+-- `MovedAnchor` operation based on the original location, only if it
+-- does not already have one.
+commentOrigDelta :: LEpaComment -> LEpaComment
+commentOrigDelta (L (GHC.Anchor la _) (GHC.EpaComment t pp))
+  = (L (GHC.Anchor la op) (GHC.EpaComment t pp))
+                  `debug` ("commentOrigDelta: (la, pp, r,c, op)=" ++ showAst (la, pp, r,c, op))
   where
-    (r,c) = ss2posEnd pp
+        (r,c) = ss2posEnd pp
 
-    op = if r == 0
-           then (             ss2delta (r,c+1) pos)
-           else (tweakDelta $ ss2delta (r,c  ) pos)
+        op = if r == 0
+               then MovedAnchor (ss2delta (r,c+1) la) []
+               else MovedAnchor (ss2delta (r,c)   la) []
 
--- ---------------------------------------------------------------------
-
--- | For comment-related deltas starting on a new line we have an
--- off-by-one problem. Adjust
-tweakDelta :: DeltaPos  -> DeltaPos
-tweakDelta (SameLine d) = SameLine d
-tweakDelta (DifferentLine l d) = DifferentLine l (d-1)
+origDelta :: RealSrcSpan -> RealSrcSpan -> DeltaPos
+origDelta pos pp = ss2delta (ss2posEnd pp) pos
 
 -- ---------------------------------------------------------------------
 
@@ -222,9 +230,16 @@ insertCppComments ::  ParsedSource -> [LEpaComment] -> ParsedSource
 insertCppComments (L l p) cs = L l p'
   where
     an' = case GHC.hsmodAnn $ GHC.hsmodExt p of
-      (EpAnn a an ocs) -> EpAnn a an (EpaComments cs')
+      (EpAnn a an ocs) -> EpAnn a an cs'
         where
-          cs' = sortEpaComments $ priorComments ocs ++ getFollowingComments ocs ++ cs
+          pc = priorComments ocs
+          fc = getFollowingComments ocs
+          cs' = case fc of
+            [] -> EpaComments $ sortEpaComments $ pc ++ fc ++ cs
+            (L ac _:_) -> EpaCommentsBalanced (sortEpaComments $ pc ++ cs_before)
+                                              (sortEpaComments $ fc ++ cs_after)
+                   where
+                     (cs_before,cs_after) = break (\(L l0 _) ->   (ss2pos $ anchor l0) < (ss2pos $ anchor ac) ) cs
       unused -> unused
     p' = p { GHC.hsmodExt = (GHC.hsmodExt p) { GHC.hsmodAnn = an' } }
 
@@ -235,7 +250,6 @@ ghcCommentText (L _ (GHC.EpaComment (EpaDocComment s) _))      = exactPrintHsDoc
 ghcCommentText (L _ (GHC.EpaComment (EpaDocOptions s) _))      = s
 ghcCommentText (L _ (GHC.EpaComment (EpaLineComment s) _))     = s
 ghcCommentText (L _ (GHC.EpaComment (EpaBlockComment s) _))    = s
-ghcCommentText (L _ (GHC.EpaComment (EpaEofComment) _))        = ""
 
 tokComment :: LEpaComment -> [Comment]
 tokComment t@(L lt c) =
@@ -289,7 +303,6 @@ comment2LEpaComment :: Comment -> LEpaComment
 comment2LEpaComment (Comment s anc r _mk) = mkLEpaComment s anc r
 
 mkLEpaComment :: String -> Anchor -> RealSrcSpan -> LEpaComment
-mkLEpaComment "" anc r = (L anc (GHC.EpaComment (EpaEofComment) r))
 mkLEpaComment s anc r = (L anc (GHC.EpaComment (EpaLineComment s) r))
 
 mkComment :: String -> Anchor -> RealSrcSpan -> Comment
@@ -319,8 +332,8 @@ sortEpaComments cs = sortBy cmp cs
 mkKWComment :: AnnKeywordId -> EpaLocation -> Comment
 mkKWComment kw (EpaSpan ss _)
   = Comment (keywordToString kw) (Anchor ss UnchangedAnchor) ss (Just kw)
-mkKWComment kw (EpaDelta dp _)
-  = Comment (keywordToString kw) (Anchor placeholderRealSpan (MovedAnchor dp)) placeholderRealSpan (Just kw)
+mkKWComment kw (EpaDelta dp cs)
+  = Comment (keywordToString kw) (Anchor placeholderRealSpan (MovedAnchor dp cs)) placeholderRealSpan (Just kw)
 
 -- | Detects a comment which originates from a specific keyword.
 isKWComment :: Comment -> Bool
@@ -366,49 +379,12 @@ name2String = showPprUnsafe
 
 -- ---------------------------------------------------------------------
 
--- occAttributes :: OccName.OccName -> String
--- occAttributes o = "(" ++ ns ++ vo ++ tv ++ tc ++ d ++ ds ++ s ++ v ++ ")"
---   where
---     -- ns = (showSDocUnsafe $ OccName.pprNameSpaceBrief $ occNameSpace o) ++ ", "
---     ns = (showSDocUnsafe $ OccName.pprNameSpaceBrief $ occNameSpace o) ++ ", "
---     vo = if isVarOcc     o then "Var "     else ""
---     tv = if isTvOcc      o then "Tv "      else ""
---     tc = if isTcOcc      o then "Tc "      else ""
---     d  = if isDataOcc    o then "Data "    else ""
---     ds = if isDataSymOcc o then "DataSym " else ""
---     s  = if isSymOcc     o then "Sym "     else ""
---     v  = if isValOcc     o then "Val "     else ""
-
- -- ---------------------------------------------------------------------
-
 locatedAnAnchor :: LocatedAn a t -> RealSrcSpan
 locatedAnAnchor (L (SrcSpanAnn EpAnnNotUsed l) _) = realSrcSpan l
 locatedAnAnchor (L (SrcSpanAnn (EpAnn a _ _) _) _) = anchor a
 
 -- ---------------------------------------------------------------------
 
-setAnchorAn :: (NoAnn an) => LocatedAn an a -> Anchor -> EpAnnComments -> LocatedAn an a
-setAnchorAn (L (SrcSpanAnn EpAnnNotUsed l)    a) anc cs
-  = (L (SrcSpanAnn (EpAnn anc noAnn cs) l) a)
-     -- `debug` ("setAnchorAn: anc=" ++ showAst anc)
-setAnchorAn (L (SrcSpanAnn (EpAnn _ an _) l) a) anc cs
-  = (L (SrcSpanAnn (EpAnn anc an cs) l) a)
-     -- `debug` ("setAnchorAn: anc=" ++ showAst anc)
-
-setAnchorEpa :: (NoAnn an) => EpAnn an -> Anchor -> EpAnnComments -> EpAnn an
-setAnchorEpa EpAnnNotUsed   anc cs = EpAnn anc noAnn cs
-setAnchorEpa (EpAnn _ an _) anc cs = EpAnn anc an          cs
-
-setAnchorEpaL :: EpAnn AnnList -> Anchor -> EpAnnComments -> EpAnn AnnList
-setAnchorEpaL EpAnnNotUsed   anc cs = EpAnn anc noAnn cs
-setAnchorEpaL (EpAnn _ an _) anc cs = EpAnn anc (an {al_anchor = Nothing}) cs
-
-setAnchorHsModule :: HsModule GhcPs -> Anchor -> EpAnnComments -> HsModule GhcPs
-setAnchorHsModule hsmod anc cs = hsmod { hsmodExt = (hsmodExt hsmod) {hsmodAnn = an'} }
-  where
-    anc' = anc { anchor_op = UnchangedAnchor }
-    an' = setAnchorEpa (hsmodAnn $ hsmodExt hsmod) anc' cs
-
 -- |Version of l2l that preserves the anchor, immportant if it has an
 -- updated AnchorOperation
 moveAnchor :: NoAnn b => SrcAnn a -> SrcAnn b
@@ -421,11 +397,15 @@ trailingAnnLoc :: TrailingAnn -> EpaLocation
 trailingAnnLoc (AddSemiAnn ss)    = ss
 trailingAnnLoc (AddCommaAnn ss)   = ss
 trailingAnnLoc (AddVbarAnn ss)    = ss
+trailingAnnLoc (AddDarrowAnn ss)  = ss
+trailingAnnLoc (AddDarrowUAnn ss) = ss
 
 setTrailingAnnLoc :: TrailingAnn -> EpaLocation -> TrailingAnn
 setTrailingAnnLoc (AddSemiAnn _)    ss = (AddSemiAnn ss)
 setTrailingAnnLoc (AddCommaAnn _)   ss = (AddCommaAnn ss)
 setTrailingAnnLoc (AddVbarAnn _)    ss = (AddVbarAnn ss)
+setTrailingAnnLoc (AddDarrowAnn _)  ss = (AddDarrowAnn ss)
+setTrailingAnnLoc (AddDarrowUAnn _) ss = (AddDarrowUAnn ss)
 
 addEpAnnLoc :: AddEpAnn -> EpaLocation
 addEpAnnLoc (AddEpAnn _ l) = l
@@ -435,7 +415,7 @@ addEpAnnLoc (AddEpAnn _ l) = l
 -- TODO: move this to GHC
 anchorToEpaLocation :: Anchor -> EpaLocation
 anchorToEpaLocation (Anchor r UnchangedAnchor) = EpaSpan r Strict.Nothing
-anchorToEpaLocation (Anchor _ (MovedAnchor dp)) = EpaDelta dp []
+anchorToEpaLocation (Anchor _ (MovedAnchor dp cs)) = EpaDelta dp cs
 
 -- ---------------------------------------------------------------------
 -- Horrible hack for dealing with some things still having a SrcSpan,
@@ -467,13 +447,13 @@ hackSrcSpanToAnchor (UnhelpfulSpan s) = error $ "hackSrcSpanToAnchor : Unhelpful
 hackSrcSpanToAnchor (RealSrcSpan r Strict.Nothing) = Anchor r UnchangedAnchor
 hackSrcSpanToAnchor (RealSrcSpan r (Strict.Just (BufSpan (BufPos s) (BufPos e))))
   = if s <= 0 && e <= 0
-    then Anchor r (MovedAnchor (deltaPos (-s) (-e)))
+    then Anchor r (MovedAnchor (deltaPos (-s) (-e)) [])
       `debug` ("hackSrcSpanToAnchor: (r,s,e)=" ++ showAst (r,s,e) )
     else Anchor r UnchangedAnchor
 
 hackAnchorToSrcSpan :: Anchor -> SrcSpan
 hackAnchorToSrcSpan (Anchor r UnchangedAnchor) = RealSrcSpan r Strict.Nothing
-hackAnchorToSrcSpan (Anchor r (MovedAnchor dp))
+hackAnchorToSrcSpan (Anchor r (MovedAnchor dp _cs))
   = RealSrcSpan r (Strict.Just (BufSpan (BufPos s) (BufPos e)))
       `debug` ("hackAnchorToSrcSpan: (r,dp,s,e)=" ++ showAst (r,dp,s,e) )
   where
diff --git a/utils/haddock b/utils/haddock
index 7e97eb212291fca97b67466d4f603eafc5b7caa7..b75ff8a88bbdd0d60032a4e304d37ec65526c06b 160000
--- a/utils/haddock
+++ b/utils/haddock
@@ -1 +1 @@
-Subproject commit 7e97eb212291fca97b67466d4f603eafc5b7caa7
+Subproject commit b75ff8a88bbdd0d60032a4e304d37ec65526c06b