diff --git a/src/bin/aphid/main.rs b/src/bin/aphid/main.rs
index 5603aefa5a392d97d79076156f3245ba80c358dc..aca3e73453e3426cd8d19dda28934232ddbb7d9a 100644
--- a/src/bin/aphid/main.rs
+++ b/src/bin/aphid/main.rs
@@ -29,7 +29,6 @@ use crate::display_tree_analysis::display_geometrical_tree_analysis;
 #[command(author, version, about, long_about = None)]
 struct Args {
     /// Path to the config file.
-    #[arg(short, long)]
     config: PathBuf,
 }
 
diff --git a/src/config.rs b/src/config.rs
index 5caa52d96ba6d849947bd67b86c2fe7f93efc439..88f1932fda1c781909af7c9cccd3a159ac0c7652 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -22,6 +22,7 @@ mod deserialize;
 // The final value handed out to user.
 pub struct Config {
     // Path to the gene trees data file.
+    // If relative: relative to the config file.
     pub trees: PathBuf,
 
     // Names of the species of interest.
diff --git a/src/config/check.rs b/src/config/check.rs
index 14e1abcb7b93ad03e7bd21c1665ef250b58d6a26..d97ae99ac1f570b2240c0788d7834aeaeb8e0382 100644
--- a/src/config/check.rs
+++ b/src/config/check.rs
@@ -60,11 +60,32 @@ impl Config {
             );
         }
 
+        let search = (&raw).try_into()?;
+        let taxa = raw.taxa._try_into(interner)?;
+
+        // Resolve relative paths relatively to the config file.
+        let mut trees = raw.taxa.trees;
+        if !trees.is_absolute() {
+            let mut path = path
+                .parent()
+                .unwrap_or_else(|| {
+                    panic!(
+                        "Config file has been read but its path has no parent: {}",
+                        path.to_string_lossy()
+                    )
+                })
+                .to_owned();
+            path.push(trees);
+            trees = path
+                .canonicalize()
+                .with_context(|_| CanonicalizeErr { path })?;
+        }
+
         // Most checks implemented within `TryFrom` trait.
         Ok(Config {
-            search: (&raw).try_into()?,
-            taxa: raw.taxa._try_into(interner)?,
-            trees: raw.taxa.trees,
+            search,
+            taxa,
+            trees,
             unresolved_length: raw.unresolved_length,
             filters: if let Some(ref raw) = raw.filters {
                 raw.try_into()?
@@ -640,7 +661,7 @@ pub enum Error {
     Config { mess: String },
     #[snafu(transparent)]
     Optim { source: optim::Error },
-    #[snafu(display("Could not canonicalize path: {:?}.", path.to_string_lossy()))]
+    #[snafu(display("Could not canonicalize path: {:?}:\n{source}", path.to_string_lossy()))]
     Canonicalize {
         source: std::io::Error,
         path: PathBuf,