diff --git a/README.md b/README.md
index ebc9031..d274168 100644
--- a/README.md
+++ b/README.md
@@ -46,26 +46,38 @@ from `target/{debug,release}/mqrs` depending on which
 one you built.
 
 ## Using `mqrs`
-`mqrs` supports five commands: `create`, `info`, `unlink`, `send` and
-`recv`. All commands do not have to be specified fully. If the
-command is clearly distinguishable from all the others, it does not
-have to be completed further.
+Depending on which backend you want to use there are different subsets
+of subcommands. Following backends are supported:
+- `posix`: Uses POSIX message queues
+- `sysv`: Uses SysV IPC message queues
 
-### Create a message queue
+If a command is clearly distinguishable from all the others,
+it does not have to be completed further.
+
+### POSIX message queues
+The POSIX backend supports six commands: `create`, `info`, `list`,
+`unlink`, `send` and `recv`.
+
+#### Create a message queue
 Use the `create` command to create a new POSIX message queue. Following
 optional arguments are supported:
 - `-c`, `--capacity`: Maximum number of messages in the queue
 - `-p`, `--permissions`: Permissions (octal) to create the queue with
 - `-s`, `--msgsize`: Message size in bytes
 
-### Print information about a message queue
+#### Print information about a message queue
 Use the `info` command to print further information about a message
 queue.
 
-### Delete a message queue
+#### List all message queues
+Use the `list` command to print a list of all message
+queues. Following option argument is supported:
+- `-a`, `--all`: Print all available information
+
+#### Delete a message queue
 Use the `unlink` command to delete a message queue.
 
-### Send a message to a queue
+#### Send a message to a queue
 Use the `send` command to send a message to a message queue. Following
 optional arguments are supported:
 - `-n`, `--non-blocking`: Do not block
@@ -75,7 +87,7 @@ optional arguments are supported:
   default, priority >= 0 [default: 0]
 - `-o`, `--timeout <timeout>`: As for example in "5h 23min 42ms"
 
-### Receive a message from a queue
+#### Receive a message from a queue
 Use the `recv` command to receive one or more messages from a message
 queue. Following optional arguments are supported:
 - `-f`, `--follow`: Print messages as they are received
@@ -84,3 +96,6 @@ queue. Following optional arguments are supported:
 - `-d`, `--deadline <deadline>`: Deadline until messages are received
   (format: `%Y-%m-%d %H:%M:%S`)
 - `-o,` `--timeout <timeout>`: As for example in "5h 23min 42ms"
+
+### SysV IPC message queues
+The SysV IPC backend supports no commands yet.
diff --git a/mqrs.1 b/mqrs.1
index 50fa2d0..9934081 100644
--- a/mqrs.1
+++ b/mqrs.1
@@ -1,25 +1,21 @@
 .\" Manpage for mqrs
-.TH man 1 "27 June 2021" "0.1.1" "mqrs man page"
+.TH man 1 "7 July 2021" "0.1.1" "mqrs man page"
 .SH NAME
 mqrs \- Handle POSIX message queues
 .SH SYNOPSIS
 .B mqrs [\-h] [\-\-help] [\-v] [\-\-verbose] [\-V] [\-\-version] [SUBCOMMAND]
 .SH DESCRIPTION
 .B mqrs
-is a small cli program to handle POSIX message queues. Supported commands are
-.B create\
-,
-.B info\
-,
-.B unlink\
-,
-.B send
+is a small cli program to handle message queues. Depending on which
+backend you want to use there are different subsets of
+subcommands. Following backends are supported:
+.B posix\
 and
-.B recv
+.B sysv\
 .
-All commands do not have to be specified fully. If the command is
-clearly distinguishable from all the others, it does not have to be
-completed further.
+
+If a command is clearly distinguishable from all the others, it does
+not have to be completed further.
 .SH OPTIONS
 .TP 8
 .B \-h, \-\-help
@@ -31,7 +27,20 @@ Produce verbose output, multiple -v options increase the verbosity
 .TP 8
 .B \-V, \-\-version
 Prints version information
-.SH SUBCOMMANDS
+.SH POSIX MESSAGE QUEUE SUBCOMMANDS
+The POSIX backend supports six commands:
+.B create\
+,
+.B info\
+,
+.B list\
+,
+.B unlink\
+,
+.B send
+and
+.B recv
+.
 .SS create [FLAGS] [OPTIONS] \fI<QUEUE>\fP
 Create a new POSIX message queue.
 .TP 8
@@ -90,6 +99,21 @@ Prints help information
 .B \-v, \-\-verbose
 Produce verbose output
 .RE
+.SS list [FLAGS]
+Print a list of all existing POSIX message queues.
+.TP 8
+.SS FLAGS
+.RS
+.TP 8
+.B \-h, \-\-help
+Prints help information
+.TP 8
+.B \-v, \-\-verbose
+Produce verbose output
+.TP 8
+.B \-a, \-\-all
+Print all available information
+.RE
 .SS recv [FLAGS] [OPTIONS] \fI<QUEUE>\fP
 Receive and print one or more messages message from a message queue.
 .TP 8
@@ -185,6 +209,8 @@ Prints help information
 .B \-v, \-\-verbose
 Produce verbose output
 .RE
+.SH SYSV IPC MESSAGE QUEUE SUBCOMMANDS
+The SysV IPC backend supports no commands yet.
 .SH SEE ALSO
 mq_overview(7)
 .SH BUGS
diff --git a/src/main.rs b/src/main.rs
index 40296fb..cc1d185 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,14 +4,27 @@ use clap::{crate_authors, crate_version, AppSettings, Clap};
 mod posix;
 
 #[derive(Clap, Debug)]
-enum Command {
+enum Backend {
+    /// Handle POSIX message queues
+    Posix(PosixCommand),
+    /// Handle SysV message queues
+    Sysv(SysvCommand),
+}
+
+#[derive(Clap, Debug)]
+enum PosixCommand {
     Create(posix::Create),
     Info(posix::Info),
+    List(posix::List),
     Unlink(posix::Unlink),
     Send(posix::Send),
     Recv(posix::Recv),
 }
 
+#[derive(Clap, Debug)]
+enum SysvCommand {
+}
+
 #[derive(Clap, Debug)]
 #[clap(
     version = crate_version!(),
@@ -24,8 +37,9 @@ struct Opts {
     /// Produce verbose output, multiple -v options increase the verbosity (max. 3)
     #[clap(short, long, global = true, parse(from_occurrences))]
     verbose: u32,
+    /// Backend to be used
     #[clap(subcommand)]
-    command: Command,
+    backend: Backend,
 }
 
 fn main() -> Result<()> {
@@ -41,12 +55,17 @@ fn main() -> Result<()> {
     ))
     .init();
 
-    match opts.command {
-        Command::Create(c) => c.run()?,
-        Command::Info(i) => i.run()?,
-        Command::Unlink(u) => u.run()?,
-        Command::Send(s) => s.run()?,
-        Command::Recv(r) => r.run()?,
+    match opts.backend {
+        Backend::Posix(p) => match p {
+            PosixCommand::Create(c) => c.run()?,
+            PosixCommand::Info(i) => i.run()?,
+            PosixCommand::List(l) => l.run()?,
+            PosixCommand::Unlink(u) => u.run()?,
+            PosixCommand::Send(s) => s.run()?,
+            PosixCommand::Recv(r) => r.run()?,
+        },
+        Backend::Sysv(s) => match s {
+        },
     }
 
     Ok(())
diff --git a/src/posix.rs b/src/posix.rs
index d9e6266..c5855c8 100644
--- a/src/posix.rs
+++ b/src/posix.rs
@@ -1,11 +1,13 @@
 mod create;
 mod info;
+mod list;
 mod recv;
 mod send;
 mod unlink;
 
 pub use create::Create;
 pub use info::Info;
+pub use list::List;
 pub use recv::Recv;
 pub use send::Send;
 pub use unlink::Unlink;
diff --git a/src/posix/list.rs b/src/posix/list.rs
new file mode 100644
index 0000000..54c031a
--- /dev/null
+++ b/src/posix/list.rs
@@ -0,0 +1,58 @@
+use anyhow::{anyhow, Result};
+use chrono::{DateTime, Local};
+use clap::Clap;
+use log::warn;
+use std::{fs, os::unix::fs::PermissionsExt};
+
+/// Print information about an existing message queue
+#[derive(Clap, Debug)]
+pub struct List {
+    /// Show all parameters
+    #[clap(short, long)]
+    all: bool,
+}
+
+impl List {
+    pub fn run(&self) -> Result<()> {
+        match self.all {
+            false => println!("Name"),
+            true => println!(
+                "{0: <10} {1: <10} {2: <12} {3: <26}  {4: <26}",
+                "Name", "Size", "Permissions", "Modified", "Accessed",
+            ),
+        }
+
+        for mq in fs::read_dir("/dev/mqueue")? {
+            match mq {
+                Ok(mq) => {
+                    print!(
+                        "/{0: <10}",
+                        mq.file_name().into_string().map_err(|e| anyhow!(
+                            "Could not convert queue name to string: {:?}",
+                            e
+                        ))?
+                    );
+
+                    if self.all {
+                        let metadata = mq.metadata()?;
+                        let modified: DateTime<Local> = metadata.modified()?.into();
+                        let accessed: DateTime<Local> = metadata.accessed()?.into();
+
+                        print!(
+                            "{0: <10} {1: <12o} {2: <26}  {3: <26}",
+                            metadata.len(),
+                            metadata.permissions().mode(),
+                            modified,
+                            accessed,
+                        );
+                    }
+
+                    println!();
+                }
+                Err(e) => warn!("Could not read file: {:?}", e),
+            }
+        }
+
+        Ok(())
+    }
+}