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/slynx.cabal b/slynx.cabal
--- a/slynx.cabal
+++ b/slynx.cabal
@@ -1,6 +1,6 @@
 cabal-version:  2.2
 name:           slynx
-version:        0.6.0.0
+version:        0.6.1.0
 synopsis:       Handle molecular sequences
 description:    Examine, modify, and simulate molecular sequences in a reproducible way. Please see the README on GitHub at <https://github.com/dschrempf/elynx>.
 category:       Bioinformatics
@@ -46,7 +46,8 @@
   hs-source-dirs: src
   ghc-options: -Wall -Wunused-packages
   build-depends:
-      attoparsec
+      aeson
+    , attoparsec
     , base >=4.7 && <5
     , bytestring
     , containers
diff --git a/src/SLynx/Concatenate/Concatenate.hs b/src/SLynx/Concatenate/Concatenate.hs
--- a/src/SLynx/Concatenate/Concatenate.hs
+++ b/src/SLynx/Concatenate/Concatenate.hs
@@ -20,7 +20,8 @@
 import Control.Monad.Trans.Reader
 import qualified ELynx.Data.Sequence.Sequence as S
 import ELynx.Export.Sequence.Fasta
-import ELynx.Tools
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
 import SLynx.Concatenate.Options
 import SLynx.Tools
 
diff --git a/src/SLynx/Concatenate/Options.hs b/src/SLynx/Concatenate/Options.hs
--- a/src/SLynx/Concatenate/Options.hs
+++ b/src/SLynx/Concatenate/Options.hs
@@ -18,8 +18,10 @@
 where
 
 import Control.Applicative
+import Data.Aeson
 import ELynx.Data.Alphabet.Alphabet
-import ELynx.Tools
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Tools
 
diff --git a/src/SLynx/Examine/Examine.hs b/src/SLynx/Examine/Examine.hs
--- a/src/SLynx/Examine/Examine.hs
+++ b/src/SLynx/Examine/Examine.hs
@@ -27,7 +27,9 @@
 import qualified ELynx.Data.Sequence.Alignment as M
 import qualified ELynx.Data.Sequence.Distance as D
 import qualified ELynx.Data.Sequence.Sequence as Seq
-import ELynx.Tools
+import ELynx.Tools.ByteString
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
 import SLynx.Examine.Options
 import SLynx.Tools
 import qualified Statistics.Sample as Sm
diff --git a/src/SLynx/Examine/Options.hs b/src/SLynx/Examine/Options.hs
--- a/src/SLynx/Examine/Options.hs
+++ b/src/SLynx/Examine/Options.hs
@@ -17,8 +17,10 @@
   )
 where
 
+import Data.Aeson
 import ELynx.Data.Alphabet.Alphabet
-import ELynx.Tools
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Tools
 
diff --git a/src/SLynx/Filter/Filter.hs b/src/SLynx/Filter/Filter.hs
--- a/src/SLynx/Filter/Filter.hs
+++ b/src/SLynx/Filter/Filter.hs
@@ -25,9 +25,15 @@
 import qualified ELynx.Data.Sequence.Alignment as M
 import qualified ELynx.Data.Sequence.Sequence as S
 import ELynx.Export.Sequence.Fasta
-import ELynx.Tools
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
+import ELynx.Tools.Logger
 import SLynx.Filter.Options
 import SLynx.Tools
+
+-- Chain a list of functions together. See https://wiki.haskell.org/Compose.
+compose :: [a -> a] -> a -> a
+compose = foldl (flip (.)) id
 
 filterRows :: Maybe Int -> Maybe Int -> Bool -> [S.Sequence] -> BL.ByteString
 filterRows ml ms std ss = sequencesToFasta $ compose filters ss
diff --git a/src/SLynx/Filter/Options.hs b/src/SLynx/Filter/Options.hs
--- a/src/SLynx/Filter/Options.hs
+++ b/src/SLynx/Filter/Options.hs
@@ -20,8 +20,10 @@
 where
 
 import Control.Applicative
+import Data.Aeson
 import ELynx.Data.Alphabet.Alphabet
-import ELynx.Tools
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Tools
 
diff --git a/src/SLynx/Options.hs b/src/SLynx/Options.hs
--- a/src/SLynx/Options.hs
+++ b/src/SLynx/Options.hs
@@ -11,15 +11,13 @@
 -- Portability :  portable
 --
 -- Creation date: Sat Sep  7 18:55:03 2019.
-module SLynx.Options
-  ( Arguments (..),
-    CommandArguments (..),
-    parseArguments,
-  )
-where
+module SLynx.Options (CommandArguments (..)) where
 
+import Data.Aeson
 import ELynx.Data.Alphabet.Alphabet
-import ELynx.Tools
+import ELynx.Tools.Options
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Concatenate.Options
 import SLynx.Examine.Options
@@ -88,7 +86,7 @@
     where
       toListItem = ("  - " ++)
       fs = map toListItem ["FASTA"]
-      as = map (toListItem . alphabetDescription) (allValues :: [Alphabet])
+      as = map (toListItem . alphabetDescription) ([minBound ..] :: [Alphabet])
 
 instance FromJSON CommandArguments
 
diff --git a/src/SLynx/SLynx.hs b/src/SLynx/SLynx.hs
--- a/src/SLynx/SLynx.hs
+++ b/src/SLynx/SLynx.hs
@@ -15,7 +15,8 @@
   )
 where
 
-import ELynx.Tools
+import ELynx.Tools.ELynx
+import ELynx.Tools.Options
 import SLynx.Concatenate.Concatenate
 import SLynx.Examine.Examine
 import SLynx.Filter.Filter
diff --git a/src/SLynx/Simulate/Options.hs b/src/SLynx/Simulate/Options.hs
--- a/src/SLynx/Simulate/Options.hs
+++ b/src/SLynx/Simulate/Options.hs
@@ -40,11 +40,14 @@
   )
 where
 
+import Data.Aeson
 import Data.Maybe
   ( fromMaybe,
     maybeToList,
   )
-import ELynx.Tools
+import ELynx.Tools.Options
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 
 -- | Number of gamma rate categories and alpha parameter.
diff --git a/src/SLynx/Simulate/PhyloModel.hs b/src/SLynx/Simulate/PhyloModel.hs
--- a/src/SLynx/Simulate/PhyloModel.hs
+++ b/src/SLynx/Simulate/PhyloModel.hs
@@ -33,7 +33,8 @@
 import ELynx.Import.MarkovProcess.EDMModelPhylobayes
   ( EDMComponent,
   )
-import ELynx.Tools
+import ELynx.Tools.Equality
+import ELynx.Tools.InputOutput
 import Numeric.LinearAlgebra
   ( norm_1,
     size,
diff --git a/src/SLynx/Simulate/Simulate.hs b/src/SLynx/Simulate/Simulate.hs
--- a/src/SLynx/Simulate/Simulate.hs
+++ b/src/SLynx/Simulate/Simulate.hs
@@ -44,13 +44,30 @@
 import ELynx.Import.MarkovProcess.EDMModelPhylobayes
 import ELynx.Import.MarkovProcess.SiteprofilesPhylobayes
 import ELynx.Simulate.MarkovProcessAlongTree
-import ELynx.Tools
+import ELynx.Tools.ByteString
+import ELynx.Tools.Definitions
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
+import ELynx.Tools.InputOutput
+import ELynx.Tools.Logger
+import ELynx.Tools.Options
+import ELynx.Tools.Reproduction
 import ELynx.Tree
+import qualified Numeric.LinearAlgebra as L
 import SLynx.Simulate.Options
 import SLynx.Simulate.PhyloModel
 import System.Random.MWC
 import Text.Printf
 
+-- Display a vector with given precision.
+dispv :: Int -> VS.Vector L.R -> String
+dispv p v = head $ tail $ lines $ L.dispf p (L.asRow v)
+
+-- Display a matrix with given precision and indent.
+dispmi :: Int -> Int -> L.Matrix L.R -> String
+dispmi p i m =
+  intercalate "\n" $ map (replicate i ' ' ++) $ tail $ lines $ L.dispf p m
+
 getDistLine :: Int -> MR.StationaryDistribution -> BB.Builder
 getDistLine i d =
   BB.intDec i
@@ -156,6 +173,10 @@
     h = height t
     h' = sum (distancesOriginLeaves t) / fromIntegral n
     b = totalBranchLength t
+
+-- Round double to a given precision.
+roundN :: Int -> Double -> Double
+roundN n v = fromInteger (round $ v * (10 ^ n)) / (10.0 ^^ n)
 
 -- Summarize a substitution model; lines to be printed to screen or log.
 summarizeSM :: MS.SubstitutionModel -> [BL.ByteString]
diff --git a/src/SLynx/SubSample/Options.hs b/src/SLynx/SubSample/Options.hs
--- a/src/SLynx/SubSample/Options.hs
+++ b/src/SLynx/SubSample/Options.hs
@@ -18,12 +18,15 @@
   )
 where
 
+import Data.Aeson
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as LT
 import qualified Data.Text.Lazy.Builder as LT
 import qualified Data.Text.Lazy.Builder.Int as LT
 import ELynx.Data.Alphabet.Alphabet
-import ELynx.Tools
+import ELynx.Tools.Options
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Tools
 
diff --git a/src/SLynx/SubSample/SubSample.hs b/src/SLynx/SubSample/SubSample.hs
--- a/src/SLynx/SubSample/SubSample.hs
+++ b/src/SLynx/SubSample/SubSample.hs
@@ -22,7 +22,10 @@
 import Control.Monad.Trans.Reader (ask)
 import qualified ELynx.Data.Sequence.Alignment as M
 import ELynx.Export.Sequence.Fasta
-import ELynx.Tools
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
+import ELynx.Tools.Logger
+import ELynx.Tools.Reproduction
 import SLynx.SubSample.Options
 import SLynx.Tools
 import System.Random.MWC
diff --git a/src/SLynx/Tools.hs b/src/SLynx/Tools.hs
--- a/src/SLynx/Tools.hs
+++ b/src/SLynx/Tools.hs
@@ -25,7 +25,8 @@
 import ELynx.Data.Alphabet.Alphabet
 import ELynx.Data.Sequence.Sequence
 import ELynx.Import.Sequence.Fasta
-import ELynx.Tools
+import ELynx.Tools.InputOutput
+import ELynx.Tools.Logger
 import Options.Applicative
 
 -- | Read sequences of given alphabet from file or standard input.
diff --git a/src/SLynx/Translate/Options.hs b/src/SLynx/Translate/Options.hs
--- a/src/SLynx/Translate/Options.hs
+++ b/src/SLynx/Translate/Options.hs
@@ -17,10 +17,12 @@
   )
 where
 
+import Data.Aeson
 import Data.List
 import ELynx.Data.Alphabet.Alphabet
 import ELynx.Data.Character.Codon
-import ELynx.Tools
+import ELynx.Tools.Reproduction
+import GHC.Generics
 import Options.Applicative
 import SLynx.Tools
 
@@ -69,7 +71,7 @@
       <> help
         ("universal code; one of: " ++ codeStr ++ ".")
   where
-    codes = allValues :: [UniversalCode]
+    codes = [minBound ..] :: [UniversalCode]
     codeWords = map show codes
     codeStr = intercalate ", " codeWords
 
diff --git a/src/SLynx/Translate/Translate.hs b/src/SLynx/Translate/Translate.hs
--- a/src/SLynx/Translate/Translate.hs
+++ b/src/SLynx/Translate/Translate.hs
@@ -22,7 +22,9 @@
 import ELynx.Data.Sequence.Sequence
 import ELynx.Data.Sequence.Translate
 import ELynx.Export.Sequence.Fasta
-import ELynx.Tools
+import ELynx.Tools.ELynx
+import ELynx.Tools.Environment
+import ELynx.Tools.Logger
 import SLynx.Tools
 import SLynx.Translate.Options
 
