diff --git a/src/bin/dmox.rs b/src/bin/dmox.rs
index afb8a1a79657de3c0513a75b84b88286fba0206a..e1315f91d206fea4fbcc40091403a8d411df96f2 100644
--- a/src/bin/dmox.rs
+++ b/src/bin/dmox.rs
@@ -12,6 +12,7 @@ use snafu::{ensure, ResultExt, Snafu};
 
 #[derive(Parser)]
 #[command(version, about)]
+#[allow(clippy::struct_excessive_bools)]
 struct Cli {
     /// Forward indexes .fastq.gz file.
     #[arg(long)]
@@ -63,6 +64,42 @@ struct Cli {
     #[arg(long)]
     samples: PathBuf,
 
+    /// Raise to output BX codes as part of demultiplexed fastq identifiers.
+    #[arg(
+        long,
+        num_args(0..=1),
+        default_value_t = true,
+        default_missing_value("true"),
+    )]
+    bx: std::primitive::bool,
+
+    /// Raise to output RX codes as part of demultiplexed fastq identifiers.
+    #[arg(
+        long,
+        num_args(0..=1),
+        default_value_t = false,
+        default_missing_value("true"),
+    )]
+    rx: std::primitive::bool,
+
+    /// Raise to output QX codes as part of demultiplexed fastq identifiers.
+    #[arg(
+        long,
+        num_args(0..=1),
+        default_value_t = false,
+        default_missing_value("true"),
+    )]
+    qx: std::primitive::bool,
+
+    /// Raise to output the last part of original fastq identifiers.
+    #[arg(
+        long,
+        num_args(0..=1),
+        default_value_t = false,
+        default_missing_value("true"),
+    )]
+    id_tail: std::primitive::bool,
+
     /// Desired output compression level (defaults to gzip's default).
     #[arg(long, default_value_t = 6)]
     zlevel: u32,
@@ -139,14 +176,18 @@ fn run() -> Result<(), Error> {
         max_distance,
         schema,
         samples,
+        bx,
+        rx,
+        qx,
+        id_tail,
         zlevel,
         clear,
         unclear,
         n_modules,
         module_size,
         n_writers,
-        max_queued_blocks,
         writers_capacity,
+        max_queued_blocks,
         readers_channel_capacity,
     } = Cli::parse();
 
@@ -198,6 +239,10 @@ fn run() -> Result<(), Error> {
             path.push(format!("{id}.{infix}.fq.gz"));
             path
         }),
+        output_bx: bx,
+        output_rx: rx,
+        output_qx: qx,
+        output_id_tail: id_tail,
         readers_channel_capacity,
         n_writers,
         max_queued_blocks,
diff --git a/src/config.rs b/src/config.rs
index 6e5ddc44d3bf616c6c475525283710896a81ba97..b46b476af08aff7ea74070c34f331d2ea2ab2603 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -5,6 +5,7 @@ use std::{
     path::PathBuf,
 };
 
+#[allow(clippy::struct_excessive_bools)]
 pub struct Config {
     pub module_size: usize,
     pub n_modules: u64,
@@ -17,6 +18,10 @@ pub struct Config {
     pub clear: PathBuf,
     pub unclear: PathBuf,
     pub sample: Box<SamplePath>,
+    pub output_bx: bool,
+    pub output_rx: bool,
+    pub output_qx: bool,
+    pub output_id_tail: bool,
     pub readers_channel_capacity: usize,
     pub n_writers: usize,
     pub max_queued_blocks: usize,
diff --git a/src/lib.rs b/src/lib.rs
index f62fc2de2e83a4e967d30d686154ed0150c27fe9..544c67009c7d6e11bdf61859de5739399e194a5a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -406,21 +406,27 @@ pub fn demultiplex(cf: &Config) -> Result<(), Error> {
                 }
                 // Identifier head.
                 w!(r.id_head());
-                // BX code:
-                w!(b"BX:Z:");
-                write_code(buffer, &bx).unwrap();
-                // RX code:
-                w!(b"\tRX:Z:");
-                w!(i1.read());
-                w!(b"+");
-                w!(i2.read());
-                // QX code:
-                w!(b"\tQX:Z:");
-                w!(i1.quality());
-                w!(b"+");
-                w!(i2.quality());
-
-                // Drop identifier tail.
+                if cf.output_bx {
+                    w!(b" BX:Z:");
+                    write_code(buffer, &bx).unwrap();
+                }
+                if cf.output_rx {
+                    w!(b" RX:Z:");
+                    w!(i1.read());
+                    w!(b"+");
+                    w!(i2.read());
+                }
+                if cf.output_qx {
+                    w!(b" QX:Z:");
+                    w!(i1.quality());
+                    w!(b"+");
+                    w!(i2.quality());
+                }
+                if cf.output_id_tail {
+                    w!(b" ");
+                    w!(r.id_tail());
+                }
+
                 w!(b"\n");
 
                 // Actual Sequence.
diff --git a/src/parse/fastq.rs b/src/parse/fastq.rs
index da494f3013024682cc991badeeee9faa9d0ab0f9..e59a5a678f3652edf21129054010244c8f48bae0 100644
--- a/src/parse/fastq.rs
+++ b/src/parse/fastq.rs
@@ -215,8 +215,8 @@ macro_rules! get {
 }
 
 impl Block {
-    get! { id_head separator }
-    get! { trimmed: read quality }
+    get! { separator }
+    get! { trimmed: id_head id_tail read quality }
 }
 
 //==================================================================================================