diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -5,6 +5,13 @@
 ## Unreleased changes
 
 
+## Version 0.6.1.0
+
+-   Split `ELynx.Tools` into separate modules because the package will be reduced.
+-   Remove the following modules from `ELynx.Tools`: `Concurrent`,
+    `LinearAlgebra`, `List`, `Misc`, and `Numeric`.
+
+
 ## Version 0.6.0.0
 
 -   **elynx-tree:** remove parallel folds with layers (`parBranchFoldMapWithLayer`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -69,13 +69,13 @@
 
 # Get help
 
-For example:
-
-    slynx --help
+    cabal exec slynx -- --help
+    # OR: stack exec slynx -- --help
+    # OR: slynx --help
 
     ELynx Suite version 0.6.0.0.
     Developed by Dominik Schrempf.
-    Compiled on September 3, 2021, at 20:56 pm, UTC.
+    Compiled on September 4, 2021, at 12:58 pm, UTC.
     
     Usage: slynx [-v|--verbosity VALUE] [-o|--output-file-basename NAME] 
                  [-f|--force] [--no-elynx-file] COMMAND
@@ -113,6 +113,7 @@
       - ProteinX (amino acids; including gaps)
       - ProteinS (amino acids; including gaps, and translation stops)
       - ProteinI (amino acids; including gaps, translation stops, and IUPAC codes)
+    
     ELynx
     -----
     A Haskell library and tool set for computational biology. The goal of ELynx is
@@ -126,6 +127,9 @@
     tlynx     Analyze, modify, and simulate phylogenetic trees.
     elynx     Validate and redo past analyses.
     
+    Get help for commands:
+      slynx --help
+    
     Get help for sub commands:
       slynx examine --help
 
@@ -134,11 +138,13 @@
 
 The documentation of sub commands can be accessed separately:
 
-    slynx simulate --help
+    cabal exec slynx -- simulate --help
+    # OR: stack exec slynx -- simulate --help
+    # OR: slynx simulate --help
 
     ELynx Suite version 0.6.0.0.
     Developed by Dominik Schrempf.
-    Compiled on September 3, 2021, at 20:56 pm, UTC.
+    Compiled on September 4, 2021, at 12:58 pm, UTC.
     
     Usage: slynx simulate (-t|--tree-file Name) [-s|--substitution-model MODEL] 
                           [-m|--mixture-model MODEL] [-e|--edm-file NAME] 
diff --git a/elynx-tools.cabal b/elynx-tools.cabal
--- a/elynx-tools.cabal
+++ b/elynx-tools.cabal
@@ -1,6 +1,6 @@
 cabal-version:  2.2
 name:           elynx-tools
-version:        0.6.0.0
+version:        0.6.1.0
 synopsis:       Tools for ELynx
 description:    Please see the README on GitHub at <https://github.com/dschrempf/elynx>.
 category:       Bioinformatics
@@ -23,22 +23,16 @@
 
 library
   exposed-modules:
-      ELynx.Tools
-  other-modules:
       ELynx.Tools.ByteString
-      ELynx.Tools.Concurrent
       ELynx.Tools.Definitions
       ELynx.Tools.ELynx
       ELynx.Tools.Environment
       ELynx.Tools.Equality
       ELynx.Tools.InputOutput
-      ELynx.Tools.LinearAlgebra
-      ELynx.Tools.List
       ELynx.Tools.Logger
-      ELynx.Tools.Misc
-      ELynx.Tools.Numeric
       ELynx.Tools.Options
       ELynx.Tools.Reproduction
+  other-modules:
       Paths_elynx_tools
   autogen-modules:
       Paths_elynx_tools
@@ -55,7 +49,6 @@
     , hmatrix
     , mwc-random
     , optparse-applicative
-    , primitive
     , template-haskell
     , text
     , time
diff --git a/src/ELynx/Tools.hs b/src/ELynx/Tools.hs
deleted file mode 100644
--- a/src/ELynx/Tools.hs
+++ /dev/null
@@ -1,45 +0,0 @@
--- |
--- Module      :  ELynx.Tools
--- Description :  Tools and other niceties
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Sat Mar 21 13:56:03 2020.
---
--- A large collection of tools.
-module ELynx.Tools
-  ( module ELynx.Tools.ByteString,
-    module ELynx.Tools.Concurrent,
-    module ELynx.Tools.Definitions,
-    module ELynx.Tools.ELynx,
-    module ELynx.Tools.Environment,
-    module ELynx.Tools.Equality,
-    module ELynx.Tools.InputOutput,
-    module ELynx.Tools.LinearAlgebra,
-    module ELynx.Tools.List,
-    module ELynx.Tools.Logger,
-    module ELynx.Tools.Misc,
-    module ELynx.Tools.Numeric,
-    module ELynx.Tools.Options,
-    module ELynx.Tools.Reproduction,
-  )
-where
-
-import ELynx.Tools.ByteString
-import ELynx.Tools.Concurrent
-import ELynx.Tools.Definitions
-import ELynx.Tools.ELynx
-import ELynx.Tools.Environment
-import ELynx.Tools.Equality
-import ELynx.Tools.InputOutput
-import ELynx.Tools.LinearAlgebra
-import ELynx.Tools.List
-import ELynx.Tools.Logger
-import ELynx.Tools.Misc
-import ELynx.Tools.Numeric
-import ELynx.Tools.Options
-import ELynx.Tools.Reproduction
diff --git a/src/ELynx/Tools/Concurrent.hs b/src/ELynx/Tools/Concurrent.hs
deleted file mode 100644
--- a/src/ELynx/Tools/Concurrent.hs
+++ /dev/null
@@ -1,45 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
--- |
--- Module      :  ELynx.Tools.Concurrent
--- Description :  Tools for concurrent random calculations
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Tue May  7 10:33:24 2019.
-module ELynx.Tools.Concurrent
-  ( -- * MWC
-    splitGen,
-
-    -- * Concurrent calculations
-    getChunks,
-  )
-where
-
-import Control.Monad
-import Control.Monad.Primitive
-import qualified Data.Vector as V
-import Data.Word
-import System.Random.MWC
-
--- | Split a generator.
-splitGen :: PrimMonad m => Int -> Gen (PrimState m) -> m [Gen (PrimState m)]
-splitGen n gen
-  | n <= 0 = return []
-  | otherwise = do
-    seeds :: [V.Vector Word32] <- replicateM (n -1) $ uniformVector gen 256
-    fmap (gen :) (mapM initialize seeds)
-
--- | For a given number of capabilities and number of calculations, get chunk
--- sizes. The chunk sizes will be as evenly distributed as possible and sum up
--- to the number of calculations.
-getChunks :: Int -> Int -> [Int]
-getChunks c n = ns
-  where
-    n' = n `div` c
-    r = n `mod` c
-    ns = replicate r (n' + 1) ++ replicate (c - r) n'
diff --git a/src/ELynx/Tools/ELynx.hs b/src/ELynx/Tools/ELynx.hs
--- a/src/ELynx/Tools/ELynx.hs
+++ b/src/ELynx/Tools/ELynx.hs
@@ -75,9 +75,9 @@
   -- Footer.
   logInfoFooter
 
--- | The 'ReaderT' and 'LoggingT' wrapper for ELynx. Prints a header and a
--- footer, logs to 'stderr' if no file is provided. Initializes the seed if none
--- is provided. If a log file is provided, log to the file and to 'stderr'.
+-- | The 'ReaderT' wrapper for ELynx. Prints a header and a footer, logs to
+-- 'stdout' and possibly a log file, if provided. Initializes the seed if none
+-- is provided.
 eLynxWrapper ::
   (Eq a, Show a, Reproducible a, Reproducible b, ToJSON a) =>
   GlobalArguments ->
diff --git a/src/ELynx/Tools/Environment.hs b/src/ELynx/Tools/Environment.hs
--- a/src/ELynx/Tools/Environment.hs
+++ b/src/ELynx/Tools/Environment.hs
@@ -30,9 +30,9 @@
     globalArguments :: GlobalArguments,
     -- | Local arguments of command.
     localArguments :: a,
-    -- | List will be empty if using 'Quiet'. If 'LogStdOutAndFile' is used
-    -- 'logHandles' contains two handles to the standard output and the log
-    -- file.
+    -- | List will be empty if using 'Quiet'. If an output base name is
+    -- available, 'logHandles' will contain two handles: (1) the standard output
+    -- and (2) the log file.
     logHandles :: [Handle],
     -- | MVar blocking output.
     outLock :: MVar (),
diff --git a/src/ELynx/Tools/InputOutput.hs b/src/ELynx/Tools/InputOutput.hs
--- a/src/ELynx/Tools/InputOutput.hs
+++ b/src/ELynx/Tools/InputOutput.hs
@@ -37,7 +37,7 @@
 where
 
 import Codec.Compression.GZip
-import Data.Aeson
+import Data.Aeson hiding (String)
 import Data.Attoparsec.ByteString.Lazy hiding (Fail)
 import qualified Data.ByteString.Lazy.Char8 as BL
 import Data.List (isSuffixOf)
@@ -66,7 +66,7 @@
           <> "Please use --force to overwrite results of a previous analysis."
     False -> return ()
 
--- | Open existing files only if 'Force' is true.
+-- | Open existing files only if 'ExecutionMode' is 'Overwrite'.
 openFileWithExecutionMode :: ExecutionMode -> FilePath -> IO Handle
 openFileWithExecutionMode em fp = checkFile em fp >> openFile fp WriteMode
 
diff --git a/src/ELynx/Tools/LinearAlgebra.hs b/src/ELynx/Tools/LinearAlgebra.hs
deleted file mode 100644
--- a/src/ELynx/Tools/LinearAlgebra.hs
+++ /dev/null
@@ -1,50 +0,0 @@
--- |
--- Module      :  ELynx.Tools.LinearAlgebra
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Thu Feb 14 13:33:13 2019.
---
--- Tools for matrices from 'Numeric.LinearAlgebra'.
-module ELynx.Tools.LinearAlgebra
-  ( -- * Linear Algebra
-    matrixSeparateSymSkew,
-    matrixSetDiagToZero,
-    dispv,
-    dispm,
-    dispmi,
-  )
-where
-
-import Data.List
-import Numeric.LinearAlgebra
-
--- | Separate a square matrix into a symmetric and a skew-symmetric matrix.
-matrixSeparateSymSkew :: Matrix R -> (Matrix R, Matrix R)
-matrixSeparateSymSkew m = (mSym, mSkew)
-  where
-    trM = tr m
-    mSym = scale 0.5 $ m + trM
-    mSkew = scale 0.5 $ m - trM
-
--- | Set the diagonal entries of a matrix to zero.
-matrixSetDiagToZero :: Matrix R -> Matrix R
-matrixSetDiagToZero m = m - diag (takeDiag m)
-{-# INLINE matrixSetDiagToZero #-}
-
--- | Display a vector with given precision.
-dispv :: Int -> Vector R -> String
-dispv p v = head $ tail $ lines $ dispf p (asRow v)
-
--- | Display a matrix with given precision.
-dispm :: Int -> Matrix R -> String
-dispm p m = intercalate "\n" $ init $ lines $ dispf p m
-
--- | Display a matrix with given precision and indent.
-dispmi :: Int -> Int -> Matrix R -> String
-dispmi p i m =
-  intercalate "\n" $ map (replicate i ' ' ++) $ tail $ lines $ dispf p m
diff --git a/src/ELynx/Tools/List.hs b/src/ELynx/Tools/List.hs
deleted file mode 100644
--- a/src/ELynx/Tools/List.hs
+++ /dev/null
@@ -1,67 +0,0 @@
--- |
--- Module      :  ELynx.Tools.List
--- Description :  Additional tools for lists
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Thu May  2 18:57:39 2019.
-module ELynx.Tools.List
-  ( -- * Lists
-    sortListWithIndices,
-    randomInsertList,
-    shuffle,
-    shuffleN,
-    grabble,
-  )
-where
-
-import Control.Monad
-import Control.Monad.Primitive
-import Control.Monad.ST
-import Data.Function
-import Data.List
-import Data.Vector (Vector)
-import qualified Data.Vector as V
-import qualified Data.Vector.Mutable as M
-import System.Random.MWC
-
--- | Sort a list and also return original indices.
-sortListWithIndices :: Ord a => [a] -> [(a, Int)]
-sortListWithIndices xs = sortBy (compare `on` fst) $ zip xs ([0 ..] :: [Int])
-
--- | Insert element into random position of list.
-randomInsertList :: PrimMonad m => a -> [a] -> Gen (PrimState m) -> m [a]
-randomInsertList e v g = do
-  let l = length v
-  i <- uniformR (0, l) g
-  return $ take i v ++ [e] ++ drop i v
-
--- | Shuffle a list.
-shuffle :: PrimMonad m => [a] -> Gen (PrimState m) -> m [a]
-shuffle xs g = head <$> grabble xs 1 (length xs) g
-
--- | Shuffle a list @n@ times.
-shuffleN :: [a] -> Int -> GenIO -> IO [[a]]
-shuffleN xs n = grabble xs n (length xs)
-
--- | @grabble xs m n@ is /O(m*n')/, where @n' = min n (length xs)@. Choose @n'@
--- elements from @xs@, without replacement, and that @m@ times.
-grabble :: PrimMonad m => [a] -> Int -> Int -> Gen (PrimState m) -> m [[a]]
-grabble xs m n gen = do
-  swapss <- replicateM m $
-    forM [0 .. min (l - 1) n] $ \i -> do
-      j <- uniformR (i, l) gen
-      return (i, j)
-  return $ map (V.toList . V.take n . swapElems (V.fromList xs)) swapss
-  where
-    l = length xs - 1
-
-swapElems :: Vector a -> [(Int, Int)] -> Vector a
-swapElems xs swaps = runST $ do
-  mxs <- V.unsafeThaw xs
-  mapM_ (uncurry $ M.unsafeSwap mxs) swaps
-  V.unsafeFreeze mxs
diff --git a/src/ELynx/Tools/Logger.hs b/src/ELynx/Tools/Logger.hs
--- a/src/ELynx/Tools/Logger.hs
+++ b/src/ELynx/Tools/Logger.hs
@@ -154,8 +154,8 @@
               )
         )
 
--- A short header to be used in executables. 'unlines' doesn't work here because
--- it adds an additional newline at the end.
+-- | A short header to be used in executables. 'unlines' doesn't work here
+-- because it adds an additional newline at the end.
 logHeader :: [String]
 logHeader = [versionString, copyrightString, compilationString]
 
diff --git a/src/ELynx/Tools/Misc.hs b/src/ELynx/Tools/Misc.hs
deleted file mode 100644
--- a/src/ELynx/Tools/Misc.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- |
--- Module      :  ELynx.Tools.Misc
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Thu Feb 14 13:32:19 2019.
---
--- Miscellaneous tools that do not have their own category (yet).
-module ELynx.Tools.Misc
-  ( -- * Weird stuff
-    compose,
-    allValues,
-  )
-where
-
--- | Chain a list of functions together. See https://wiki.haskell.org/Compose.
-compose :: [a -> a] -> a -> a
-compose = foldl (flip (.)) id
-
--- | Get all values of a bounded enumerated type.
-allValues :: (Bounded a, Enum a) => [a]
-allValues = [minBound ..]
diff --git a/src/ELynx/Tools/Numeric.hs b/src/ELynx/Tools/Numeric.hs
deleted file mode 100644
--- a/src/ELynx/Tools/Numeric.hs
+++ /dev/null
@@ -1,27 +0,0 @@
--- |
--- Module      :  ELynx.Tools.Numeric
--- Copyright   :  (c) Dominik Schrempf 2021
--- License     :  GPL-3.0-or-later
---
--- Maintainer  :  dominik.schrempf@gmail.com
--- Stability   :  unstable
--- Portability :  portable
---
--- Creation date: Thu Feb 14 13:28:37 2019.
---
--- Numerical functions.
-module ELynx.Tools.Numeric
-  ( -- * Numeric
-    harmonic,
-    roundN,
-  )
-where
-
--- | Calculate the nth harmonic number.
-harmonic :: Int -> Double
-harmonic 1 = 1.0
-harmonic n = 1.0 / fromIntegral n + harmonic (n - 1)
-
--- | Round double to a given precision.
-roundN :: Int -> Double -> Double
-roundN n v = fromInteger (round $ v * (10 ^ n)) / (10.0 ^^ n)
diff --git a/src/ELynx/Tools/Options.hs b/src/ELynx/Tools/Options.hs
--- a/src/ELynx/Tools/Options.hs
+++ b/src/ELynx/Tools/Options.hs
@@ -15,7 +15,6 @@
 -- Creation date: Thu Sep  2 19:17:07 2021.
 module ELynx.Tools.Options
   ( -- * Command options
-    SeedOpt (..),
     seedOpt,
     executionModeOpt,
 
@@ -38,8 +37,8 @@
 import Data.Word
 import ELynx.Tools.InputOutput
 import ELynx.Tools.Logger
-import ELynx.Tools.Misc
 import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative hiding (empty)
 import Options.Applicative.Help.Pretty
 
@@ -63,7 +62,7 @@
 toSeedOpt Nothing = RandomUnset
 toSeedOpt (Just w) = Fixed w
 
--- Execution mode option parser.
+-- | Execution mode option parser.
 executionModeOpt :: Parser ExecutionMode
 executionModeOpt =
   flag
@@ -108,7 +107,7 @@
         <> help ("Be verbose; one of: " ++ unwords (map show vs))
     )
   where
-    vs = allValues :: [Verbosity]
+    vs = [minBound ..] :: [Verbosity]
 
 -- Output filename.
 outFileBaseNameOpt :: Parser FilePath
@@ -225,9 +224,11 @@
 fillParagraph :: String -> Doc
 fillParagraph = fillSep . map text . words
 
+-- | Global ELynx footer.
 elynxFooter :: [Doc]
 elynxFooter =
-  [ text "ELynx",
+  [ empty,
+    text "ELynx",
     text "-----",
     fillParagraph
       "A Haskell library and tool set for computational biology. The goal of ELynx is reproducible research. Evolutionary sequences and phylogenetic trees can be read, viewed, modified and simulated. The command line with all arguments is logged consistently, and automatically. Data integrity is verified using SHA256 sums so that validation of past analyses is possible without the need to recompute the result.",
@@ -237,6 +238,9 @@
     fill 9 (text "tlynx")
       <+> text "Analyze, modify, and simulate phylogenetic trees.",
     fill 9 (text "elynx") <+> text "Validate and redo past analyses.",
+    empty,
+    text "Get help for commands:",
+    text "  slynx --help",
     empty,
     text "Get help for sub commands:",
     text "  slynx examine --help"
diff --git a/src/ELynx/Tools/Reproduction.hs b/src/ELynx/Tools/Reproduction.hs
--- a/src/ELynx/Tools/Reproduction.hs
+++ b/src/ELynx/Tools/Reproduction.hs
@@ -26,11 +26,6 @@
     Reproduction (..),
     writeReproduction,
     hashFile,
-
-    -- * Re-exports
-    Generic,
-    FromJSON,
-    ToJSON,
   )
 where
 
