diff --git a/gbs-downloader.cabal b/gbs-downloader.cabal
index 56b04e183a35076172e4937be5c25ac9b1e5d7d2..e2bc507dd190d1dc5ba3b751e03d9c413fd1a21c 100644
--- a/gbs-downloader.cabal
+++ b/gbs-downloader.cabal
@@ -95,6 +95,7 @@ library
   -- Other library packages from which modules are imported.
   build-depends:
     , aeson
+    , async
     , base
     , base32
     , base64-bytestring
@@ -218,6 +219,7 @@ test-suite gbs-downloader-test
 
   -- The entrypoint to the test suite.
   main-is:          Spec.hs
+  ghc-options:      -threaded
 
   -- Test dependencies.
   build-depends:
diff --git a/src/Tahoe/Download.hs b/src/Tahoe/Download.hs
index c5a64c489b48c40d25d91389e5b2c3666159e471..dc7eafda4a430de20db7296121cb3e896e4c50f6 100644
--- a/src/Tahoe/Download.hs
+++ b/src/Tahoe/Download.hs
@@ -16,6 +16,7 @@ module Tahoe.Download (
     getShareNumbers,
 ) where
 
+import Control.Concurrent.Async
 import Control.Exception (Exception (displayException), SomeException, try)
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Data.Bifunctor (Bifunctor (first, second))
@@ -121,7 +122,7 @@ executeDownloadTasks ::
     -- | The results of all successful downloads.
     m [DownloadedShare]
 executeDownloadTasks storageIndex tasks = do
-    downloadResults <- mapM (downloadShare storageIndex) tasks
+    downloadResults <- liftIO $ mapConcurrently (downloadShare storageIndex) tasks
     pure . rights $ inject <$> downloadResults
   where
     inject (a, b) = (a,) <$> b