diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Changelog
 
+## 0.7.5 (2020-09-13)
+- always print download url and already downloaded filename
+- --replace deletes previous symlinked image after downloading new one
+- improved checksum file handling
+
 ## 0.7.4 (2020-03-15)
 - add 'koji' release target: downloads latest branched compose from kojipkgs
 
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -1,10 +1,8 @@
 {-# LANGUAGE CPP #-}
 
-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,13,0))
-#else
+#if !MIN_VERSION_base(4,13,0)
 import Control.Applicative ((<|>)
-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
-#else
+#if !MIN_VERSION_base(4,8,0)
   , (<$>), (<*>)
 #endif
   )
@@ -74,6 +72,8 @@
       Nothing -> error' "unknown edition" >> RP.pfail
       Just ed -> RP.lift (R.string e) >> return ed
 
+type URL = String
+
 fedoraSpins :: [FedoraEdition]
 fedoraSpins = [Cinnamon ..]
 
@@ -101,6 +101,7 @@
     <*> checkSumOpts
     <*> switchWith 'n' "dry-run" "Don't actually download anything"
     <*> switchWith 'r' "run" "Boot image in Qemu"
+    <*> switchWith 'R' "replace" "Delete old image after downloading new one"
     <*> optional mirrorOpt
     <*> strOptionalWith 'a' "arch" "ARCH" "Architecture [default: x86_64]" "x86_64"
     <*> optionalWith auto 'e' "edition" "EDITION" "Fedora edition [default: workstation]" Workstation
@@ -116,8 +117,8 @@
       flagWith' NoCheckSum 'C' "no-checksum" "Do not check checksum" <|>
       flagWith AutoCheckSum CheckSum 'c' "checksum" "Do checksum even if already downloaded"
 
-program :: Bool -> CheckSum -> Bool -> Bool -> Maybe String -> String -> FedoraEdition -> String -> IO ()
-program gpg checksum dryrun run mmirror arch edition tgtrel = do
+program :: Bool -> CheckSum -> Bool -> Bool -> Bool -> Maybe String -> String -> FedoraEdition -> String -> IO ()
+program gpg checksum dryrun run removeold mmirror arch edition tgtrel = do
   let mirror =
         case mmirror of
           Nothing | tgtrel == "koji" -> kojiPkgs
@@ -129,7 +130,7 @@
   setDownloadDir dlDir home
   mgr <- httpManager
   (fileurl, filenamePrefix, (masterUrl,masterSize), mchecksum, done) <- findURL mgr mirror
-  downloadFile done mgr fileurl (masterUrl,masterSize) >>= fileChecksum mchecksum
+  downloadFile done mgr fileurl (masterUrl,masterSize) >>= fileChecksum mgr mchecksum
   unless dryrun $ do
     let localfile = takeFileName fileurl
         symlink = filenamePrefix <> "-latest" <.> takeExtension fileurl
@@ -150,7 +151,7 @@
       when dirExists' $ setCurrentDirectory dlDir
 
     -- urlpath, fileprefix, (master,size), checksum, downloaded
-    findURL :: Manager -> String -> IO (String, String, (String,Maybe Integer), Maybe String, Bool)
+    findURL :: Manager -> String -> IO (URL, String, (URL,Maybe Integer), Maybe String, Bool)
     findURL mgr mirror = do
       (path,mrelease) <- urlPathMRel mgr
       -- use http-directory trailingSlash (0.1.7)
@@ -187,8 +188,6 @@
           unless (run && already) $
             maybe (return ()) putStrLn $ showMSize masterSize <> showMDate mlocaltime
           let finalDir = dropFileName finalurl
-          unless run $
-            putStrLn finalurl
           return (finalurl, prefix, (masterUrl,masterSize), (finalDir </>) . T.unpack <$> mchecksum, already)
         where
           httpTimestamp url = do
@@ -220,8 +219,8 @@
       localsize <- toInteger . fileSize <$> getFileStatus localfile
       if Just localsize == masterSize
         then do
-        unless run $
-          putStrLn "File already fully downloaded"
+        when (not run && takeExtension localfile == ".iso") $
+          putStrLn $ localfile <> " already fully downloaded"
         return True
         else do
         let showsize =
@@ -231,7 +230,7 @@
         putStrLn $ "File " <> showsize <> " downloaded"
         return False
 
-    urlPathMRel :: Manager -> IO (String, Maybe String)
+    urlPathMRel :: Manager -> IO (FilePath, Maybe String)
     urlPathMRel mgr = do
       let subdir =
             if edition `elem` fedoraSpins
@@ -300,7 +299,7 @@
         in
           intercalate "-" (["Fedora", show edition, editionType edition] ++ middle)
 
-    downloadFile :: Bool -> Manager -> String -> (String, Maybe Integer) -> IO Bool
+    downloadFile :: Bool -> Manager -> URL -> (URL, Maybe Integer) -> IO Bool
     downloadFile done mgr url (masterUrl,masterSize) =
       if done
         then return False
@@ -309,70 +308,91 @@
           mirrorSize <- httpFileSize mgr url
           unless (mirrorSize == masterSize) $
             putStrLn "Warning!  Mirror filesize differs from master file"
+        putStrLn url
         if dryrun then return False
           else do
           cmd_ "curl" ["-C", "-", "-O", url]
           return True
 
-    fileChecksum :: Maybe FilePath -> Bool -> IO ()
-    fileChecksum Nothing _ = return ()
-    fileChecksum (Just url) needChecksum =
+    fileChecksum :: Manager -> Maybe URL -> Bool -> IO ()
+    fileChecksum _ Nothing _ = return ()
+    fileChecksum mgr (Just url) needChecksum =
       when ((needChecksum && checksum /= NoCheckSum) || checksum == CheckSum) $ do
         let checksumdir = ".dl-fedora-checksums"
             checksumfile = checksumdir </> takeFileName url
         exists <- do
           dirExists <- doesDirectoryExist checksumdir
-          if dirExists then doesFileExist checksumfile
+          if dirExists then checkChecksumfile mgr url checksumfile
             else createDirectory checksumdir >> return False
         putStrLn ""
-        unless exists $
-          withCurrentDirectory checksumdir $
-          cmd_ "curl" ["-C", "-", "-s", "-S", "-O", url]
-        pgp <- grep_ "PGP" checksumfile
-        when (gpg && pgp) $ do
-          havekey <- checkForFedoraKeys
-          unless havekey $ do
-            putStrLn "Importing Fedora GPG keys:\n"
-            -- https://fedoramagazine.org/verify-fedora-iso-file/
-            pipe_ ("curl",["-s", "-S", "https://getfedora.org/static/fedora.gpg"]) ("gpg",["--import"])
-            putStrLn ""
-        chkgpg <- if pgp
-          then checkForFedoraKeys
-          else return False
-        let shasum = if "CHECKSUM512" `isPrefixOf` takeFileName checksumfile
-                     then "sha512sum" else "sha256sum"
-        if chkgpg then do
-          putStrLn $ "Running gpg verify and " <> shasum <> ":"
-          pipeFile_ checksumfile ("gpg",["-q"]) (shasum, ["-c", "--ignore-missing"])
+        unless exists $ do
+          remoteExists <- httpExists mgr url
+          when remoteExists $
+            withCurrentDirectory checksumdir $
+            cmd_ "curl" ["-C", "-", "-s", "-S", "-O", url]
+        haveChksum <- doesFileExist checksumfile
+        if not haveChksum
+          then putStrLn "No checksum file found"
           else do
-          putStrLn $ "Running " <> shasum <> ":"
-          cmd_ shasum ["-c", "--ignore-missing", checksumfile]
+          pgp <- grep_ "PGP" checksumfile
+          when (gpg && pgp) $ do
+            havekey <- checkForFedoraKeys
+            unless havekey $ do
+              putStrLn "Importing Fedora GPG keys:\n"
+              -- https://fedoramagazine.org/verify-fedora-iso-file/
+              pipe_ ("curl",["-s", "-S", "https://getfedora.org/static/fedora.gpg"]) ("gpg",["--import"])
+              putStrLn ""
+          chkgpg <- if pgp
+            then checkForFedoraKeys
+            else return False
+          let shasum = if "CHECKSUM512" `isPrefixOf` takeFileName checksumfile
+                       then "sha512sum" else "sha256sum"
+          if chkgpg then do
+            putStrLn $ "Running gpg verify and " <> shasum <> ":"
+            pipeFile_ checksumfile ("gpg",["-q"]) (shasum, ["-c", "--ignore-missing"])
+            else do
+            putStrLn $ "Running " <> shasum <> ":"
+            cmd_ shasum ["-c", "--ignore-missing", checksumfile]
 
+    checkChecksumfile :: Manager -> URL -> FilePath -> IO Bool
+    checkChecksumfile mgr url  checksumfile = do
+      exists <- doesFileExist checksumfile
+      if not exists then return False
+        else do
+        masterSize <- httpFileSize mgr url
+        ok <- checkLocalFileSize checksumfile masterSize
+        unless ok $ error' "Checksum file filesize mismatch"
+        return ok
+
     checkForFedoraKeys :: IO Bool
     checkForFedoraKeys =
       pipeBool ("gpg",["--list-keys"]) ("grep", ["-q", " Fedora .*(" <> tgtrel <> ").*@fedoraproject.org>"])
 
-updateSymlink :: FilePath -> FilePath -> String -> IO ()
-updateSymlink target symlink showdestdir = do
-  symExists <- do
-    havefile <- doesFileExist symlink
-    if havefile then return True
-      else do
-      -- check for broken symlink
-      dirfiles <- listDirectory "."
-      return $ symlink `elem` dirfiles
-  if symExists
-    then do
-    linktarget <- readSymbolicLink symlink
-    when (linktarget /= target) $ do
-        removeFile symlink
-        makeSymlink
-    else makeSymlink
-  where
-    makeSymlink = do
-      putStrLn ""
-      createSymbolicLink target symlink
-      putStrLn $ unwords [showdestdir </> symlink, "->", target]
+    updateSymlink :: FilePath -> FilePath -> FilePath -> IO ()
+    updateSymlink target symlink showdestdir = do
+      mmsymlinkTarget <- do
+        havefile <- doesFileExist symlink
+        if havefile
+          then Just . Just <$> readSymbolicLink symlink
+          else do
+          -- check for broken symlink
+          dirfiles <- listDirectory "."
+          return $ if symlink `elem` dirfiles then Just Nothing else Nothing
+      case mmsymlinkTarget of
+        Nothing -> makeSymlink
+        Just Nothing -> do
+          removeFile symlink
+          makeSymlink
+        Just (Just symlinktarget) -> do
+          when (symlinktarget /= target) $ do
+            when removeold $ removeFile symlinktarget
+            removeFile symlink
+            makeSymlink
+      where
+        makeSymlink = do
+          putStrLn ""
+          createSymbolicLink target symlink
+          putStrLn $ unwords [showdestdir </> symlink, "->", target]
 
 editionType :: FedoraEdition -> String
 editionType Server = "dvd"
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -12,13 +12,13 @@
 
 `dl-fedora rawhide` : downloads the latest Fedora Rawhide Workstation Live iso
 
-`dl-fedora -e silverblue 31` : downloads Fedora 31 Silverblue iso
+`dl-fedora -e silverblue 32` : downloads Fedora 32 Silverblue iso
 
 `dl-fedora -e kde respin` : downloads the latest KDE Live respin
 
-`dl-fedora --edition server --arch aarch64 30` : will bring down the F30 Server iso
+`dl-fedora --edition server --arch aarch64 31` : will bring down the F31 Server iso
 
-`dl-fedora --run 32` : will download Fedora 32 Workstation and boot the Live image with qemu-kvm.
+`dl-fedora --run 33` : will download Fedora 33 Workstation and boot the Live image with qemu-kvm.
 
 A symlink to the latest iso is also created:
 eg for rawhide it might be `"Fedora-Workstation-Live-x86_64-Rawhide-latest.iso"`.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/dl-fedora.cabal b/dl-fedora.cabal
--- a/dl-fedora.cabal
+++ b/dl-fedora.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.18
 name:                dl-fedora
-version:             0.7.4
+version:             0.7.5
 synopsis:            Fedora image download tool
 description:         Tool to download Fedora iso and image files
 -- can change to GPL-3.0-or-later with Cabal-2.2
@@ -15,7 +15,7 @@
 build-type:          Simple
 extra-doc-files:     README.md
                    , CHANGELOG.md
-tested-with:         GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2,
+tested-with:         GHC == 8.8.4, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2,
                      GHC == 8.0.2, GHC == 7.10.3, GHC == 7.8.4, GHC == 7.6.3,
                      GHC == 7.4.2
 
