diff --git a/language-docker.cabal b/language-docker.cabal
--- a/language-docker.cabal
+++ b/language-docker.cabal
@@ -1,13 +1,7 @@
-cabal-version: 1.12
-
--- This file has been generated from package.yaml by hpack version 0.35.0.
---
--- see: https://github.com/sol/hpack
---
--- hash: 37c989b46891ef750c66b64a1dcbdfc30c1ee22a0ed4821aeb27c7c63c02d2a9
+cabal-version: 2.0
 
 name:           language-docker
-version:        12.1.0
+version:        13.0.0
 synopsis:       Dockerfile parser, pretty-printer and embedded DSL
 description:    All functions for parsing and pretty-printing Dockerfiles are exported through @Language.Docker@. For more fine-grained operations look for specific modules that implement a certain functionality.
                 See the <https://github.com/hadolint/language-docker GitHub project> for the source-code and examples.
@@ -64,7 +58,6 @@
       Language.Docker.Syntax.Port
       Language.Docker.Syntax.PortRange
       Language.Docker.Syntax.Protocol
-      Paths_language_docker
   hs-source-dirs:
       src
   default-extensions:
@@ -83,7 +76,7 @@
     , split >=0.2
     , text
     , time
-  default-language: Haskell2010
+  default-language: GHC2021
 
 test-suite hspec
   type: exitcode-stdio-1.0
@@ -100,7 +93,6 @@
       Language.Docker.ParseRunSpec
       Language.Docker.PrettyPrintSpec
       TestHelper
-      Paths_language_docker
   hs-source-dirs:
       test
   default-extensions:
@@ -125,4 +117,5 @@
     , split >=0.2
     , text
     , time
-  default-language: Haskell2010
+  default-language: GHC2021
+  build-tool-depends: hspec-discover:hspec-discover == 2.*
diff --git a/src/Language/Docker.hs b/src/Language/Docker.hs
--- a/src/Language/Docker.hs
+++ b/src/Language/Docker.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
 module Language.Docker
   ( Language.Docker.Syntax.Dockerfile,
 
diff --git a/src/Language/Docker/Parser/Copy.hs b/src/Language/Docker/Parser/Copy.hs
--- a/src/Language/Docker/Parser/Copy.hs
+++ b/src/Language/Docker/Parser/Copy.hs
@@ -10,7 +10,8 @@
 import Language.Docker.Syntax
 
 data Flag
-  = FlagChown Chown
+  = FlagChecksum Checksum
+  | FlagChown Chown
   | FlagChmod Chmod
   | FlagLink Link
   | FlagSource CopySource
@@ -56,18 +57,23 @@
 parseAdd = do
   reserved "ADD"
   flags <- addFlag `sepEndBy` requiredWhitespace
+  let checksumFlags = [c | FlagChecksum c <- flags]
   let chownFlags = [c | FlagChown c <- flags]
   let chmodFlags = [c | FlagChmod c <- flags]
   let linkFlags = [l | FlagLink l <- flags]
   let invalidFlags = [i | FlagInvalid i <- flags]
   notFollowedBy (string "--") <?>
-    "only the --chown flag, the --chmod flag or the src and dest paths"
-  case (invalidFlags, chownFlags, linkFlags, chmodFlags) of
-    ((k, v) : _, _, _, _) -> unexpectedFlag k v
-    (_, _ : _ : _, _, _) -> customError $ DuplicateFlagError "--chown"
-    (_, _, _ : _ : _, _) -> customError $ DuplicateFlagError "--chmod"
-    (_, _, _, _ : _ : _) -> customError $ DuplicateFlagError "--link"
+    "only the --checksum, --chown, --chmod, --link flags or the src and dest paths"
+  case (invalidFlags, checksumFlags, chownFlags, linkFlags, chmodFlags) of
+    ((k, v) : _, _, _, _, _) -> unexpectedFlag k v
+    (_, _ : _ : _, _, _, _) -> customError $ DuplicateFlagError "--checksum"
+    (_, _, _ : _ : _, _, _) -> customError $ DuplicateFlagError "--chown"
+    (_, _, _, _ : _ : _, _) -> customError $ DuplicateFlagError "--chmod"
+    (_, _, _, _, _ : _ : _) -> customError $ DuplicateFlagError "--link"
     _ -> do
+      let chk = case checksumFlags of
+                  [] -> NoChecksum
+                  c : _ -> c
       let cho = case chownFlags of
                   [] -> NoChown
                   c : _ -> c
@@ -78,7 +84,7 @@
             case linkFlags of
               [] -> NoLink
               l : _ -> l
-      fileList "ADD" (\src dest -> Add (AddArgs src dest) (AddFlags cho chm lnk))
+      fileList "ADD" (\src dest -> Add (AddArgs src dest) (AddFlags chk cho chm lnk))
 
 heredocList :: (?esc :: Char) =>
                (NonEmpty SourcePath -> TargetPath -> Instruction Text) ->
@@ -114,10 +120,17 @@
 copyFlag = (FlagSource <$> try copySource <?> "only one --from") <|> addFlag
 
 addFlag :: (?esc :: Char) => Parser Flag
-addFlag = (FlagChown <$> try chown <?> "--chown")
+addFlag = (FlagChecksum <$> try checksum <?> "--checksum")
+  <|> (FlagChown <$> try chown <?> "--chown")
   <|> (FlagChmod <$> try chmod <?> "--chmod")
   <|> (FlagLink <$> try link <?> "--link")
   <|> (FlagInvalid <$> try anyFlag <?> "other flag")
+
+checksum :: (?esc :: Char) => Parser Checksum
+checksum = do
+  void $ string "--checksum="
+  chk <- someUnless "the remote file checksum" (== ' ')
+  return $ Checksum chk
 
 chown :: (?esc :: Char) => Parser Chown
 chown = do
diff --git a/src/Language/Docker/PrettyPrint.hs b/src/Language/Docker/PrettyPrint.hs
--- a/src/Language/Docker/PrettyPrint.hs
+++ b/src/Language/Docker/PrettyPrint.hs
@@ -136,6 +136,12 @@
           _ -> ""
    in hsep $ [pretty s | SourcePath s <- toList sources] ++ [pretty dest <> ending]
 
+prettyPrintChecksum :: Checksum -> Doc ann
+prettyPrintChecksum checksum =
+  case checksum of
+    Checksum c -> "--checksum=" <> pretty c
+    NoChecksum -> mempty
+
 prettyPrintChown :: Chown -> Doc ann
 prettyPrintChown chown =
   case chown of
@@ -315,8 +321,9 @@
       prettyPrintBaseImage b
     Add
       AddArgs {sourcePaths, targetPath}
-      AddFlags {chownFlag, chmodFlag, linkFlag} -> do
+      AddFlags {checksumFlag, chownFlag, chmodFlag, linkFlag} -> do
         "ADD"
+        prettyPrintChecksum checksumFlag
         prettyPrintChown chownFlag
         prettyPrintChmod chmodFlag
         prettyPrintLink linkFlag
diff --git a/src/Language/Docker/Syntax.hs b/src/Language/Docker/Syntax.hs
--- a/src/Language/Docker/Syntax.hs
+++ b/src/Language/Docker/Syntax.hs
@@ -119,6 +119,17 @@
       }
   deriving (Show, Eq, Ord, IsString)
 
+data Checksum
+  = Checksum !Text
+  | NoChecksum
+  deriving (Show, Eq, Ord)
+
+instance IsString Checksum where
+  fromString ch =
+    case ch of
+      "" -> NoChecksum
+      _ -> Checksum (Text.pack ch)
+
 data Chown
   = Chown !Text
   | NoChown
@@ -197,14 +208,15 @@
 
 data AddFlags
   = AddFlags
-      { chownFlag :: !Chown,
+      { checksumFlag :: !Checksum,
+        chownFlag :: !Chown,
         chmodFlag :: !Chmod,
         linkFlag :: !Link
       }
   deriving (Show, Eq, Ord)
 
 instance Default AddFlags where
-  def = AddFlags NoChown NoChmod NoLink
+  def = AddFlags NoChecksum NoChown NoChmod NoLink
 
 data Check args
   = Check !(CheckArgs args)
diff --git a/src/Language/Docker/Syntax/PortRange.hs b/src/Language/Docker/Syntax/PortRange.hs
--- a/src/Language/Docker/Syntax/PortRange.hs
+++ b/src/Language/Docker/Syntax/PortRange.hs
@@ -15,6 +15,6 @@
 
 
 instance Pretty PortRange where
+  pretty (PortRange (Port start UDP) (Port end UDP)) = pretty start <> "-" <> pretty end <> "/udp"
   pretty (PortRange (Port start UDP) end) = pretty start <> "-" <> pretty end <> "/udp"
-  pretty (PortRange (PortStr start) (Port end UDP)) = pretty start <> "-" <> pretty end <> "/udp"
   pretty (PortRange start end) = pretty start <> "-" <> pretty end
diff --git a/test/Language/Docker/ParseAddSpec.hs b/test/Language/Docker/ParseAddSpec.hs
--- a/test/Language/Docker/ParseAddSpec.hs
+++ b/test/Language/Docker/ParseAddSpec.hs
@@ -41,13 +41,21 @@
                 )
                 def
             ]
+    it "with checksum flag" $
+       let file = Text.unlines ["ADD --checksum=sha256:24454f830cdd http://www.example.com/foo bar"]
+       in assertAst
+            file
+            [ Add
+                ( AddArgs (fmap SourcePath ["http://www.example.com/foo"]) (TargetPath "bar") )
+                ( AddFlags (Checksum "sha256:24454f830cdd") NoChown NoChmod NoLink )
+            ]
     it "with chown flag" $
       let file = Text.unlines ["ADD --chown=root:root foo bar"]
        in assertAst
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags (Chown "root:root") NoChmod NoLink )
+                ( AddFlags NoChecksum (Chown "root:root") NoChmod NoLink )
             ]
     it "with chmod flag" $
       let file = Text.unlines ["ADD --chmod=640 foo bar"]
@@ -55,7 +63,7 @@
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags NoChown (Chmod "640") NoLink )
+                ( AddFlags NoChecksum NoChown (Chmod "640") NoLink )
             ]
     it "with link flag" $
       let file = Text.unlines ["ADD --link foo bar"]
@@ -63,7 +71,7 @@
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags NoChown NoChmod Link )
+                ( AddFlags NoChecksum NoChown NoChmod Link )
             ]
     it "with chown and chmod flag" $
       let file = Text.unlines ["ADD --chown=root:root --chmod=640 foo bar"]
@@ -71,7 +79,7 @@
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags (Chown "root:root") (Chmod "640") NoLink )
+                ( AddFlags NoChecksum (Chown "root:root") (Chmod "640") NoLink )
             ]
     it "with chown and chmod flag other order" $
       let file = Text.unlines ["ADD --chmod=640 --chown=root:root foo bar"]
@@ -79,16 +87,16 @@
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags (Chown "root:root") (Chmod "640") NoLink )
+                ( AddFlags NoChecksum (Chown "root:root") (Chmod "640") NoLink )
             ]
     it "with all flags" $
       let file =
-            Text.unlines ["ADD --chmod=640 --chown=root:root --link foo bar"]
+            Text.unlines ["ADD --chmod=640 --chown=root:root --checksum=sha256:24454f830cdd --link foo bar"]
        in assertAst
             file
             [ Add
                 ( AddArgs (fmap SourcePath ["foo"]) (TargetPath "bar") )
-                ( AddFlags (Chown "root:root") (Chmod "640") Link )
+                ( AddFlags (Checksum "sha256:24454f830cdd") (Chown "root:root") (Chmod "640") Link )
             ]
     it "list of quoted files and chown" $
       let file =
@@ -101,5 +109,5 @@
                     (fmap SourcePath ["foo", "bar", "baz"])
                     (TargetPath "/app")
                 )
-                ( AddFlags (Chown "user:group") NoChmod NoLink )
+                ( AddFlags NoChecksum (Chown "user:group") NoChmod NoLink )
             ]
diff --git a/test/Language/Docker/PrettyPrintSpec.hs b/test/Language/Docker/PrettyPrintSpec.hs
--- a/test/Language/Docker/PrettyPrintSpec.hs
+++ b/test/Language/Docker/PrettyPrintSpec.hs
@@ -21,25 +21,30 @@
                   ( AddArgs [SourcePath "foo"] (TargetPath "bar") )
                   ( def :: AddFlags )
        in assertPretty "ADD foo bar" add
+    it "with just checksum" $ do
+      let add = Add
+                  ( AddArgs [SourcePath "http://www.example.com/foo"] (TargetPath "bar") )
+                  ( AddFlags ( Checksum "sha256:24454f830cdd" ) NoChown NoChmod NoLink )
+       in assertPretty "ADD --checksum=sha256:24454f830cdd http://www.example.com/foo bar" add
     it "with just chown" $ do
       let add = Add
                   ( AddArgs [SourcePath "foo"] (TargetPath "bar") )
-                  ( AddFlags ( Chown "root:root" ) NoChmod NoLink )
+                  ( AddFlags NoChecksum ( Chown "root:root" ) NoChmod NoLink )
        in assertPretty "ADD --chown=root:root foo bar" add
     it "with just chmod" $ do
       let add = Add
                   ( AddArgs [SourcePath "foo"] (TargetPath "bar") )
-                  ( AddFlags NoChown ( Chmod "751" ) NoLink )
+                  ( AddFlags NoChecksum NoChown ( Chmod "751" ) NoLink )
        in assertPretty "ADD --chmod=751 foo bar" add
     it "with just link" $ do
       let add = Add
                   ( AddArgs [SourcePath "foo"] (TargetPath "bar") )
-                  ( AddFlags NoChown NoChmod Link )
+                  ( AddFlags NoChecksum NoChown NoChmod Link )
        in assertPretty "ADD --link foo bar" add
     it "with chown, chmod and link" $ do
       let add = Add
                   ( AddArgs [SourcePath "foo"] (TargetPath "bar") )
-                  ( AddFlags ( Chown "root:root" ) ( Chmod "751" ) Link )
+                  ( AddFlags NoChecksum ( Chown "root:root" ) ( Chmod "751" ) Link )
        in assertPretty "ADD --chown=root:root --chmod=751 --link foo bar" add
 
   describe "pretty print COPY" $ do
