diff --git a/ReleaseNotes.md b/ReleaseNotes.md
index 78f8bd48afee90bce6f34534c32f52b9d81b3b92..2feebd2f40abcae34188592c832ec1fdb84cf327 100644
--- a/ReleaseNotes.md
+++ b/ReleaseNotes.md
@@ -13,7 +13,25 @@ renamed to "UseRepackManagement" and "UseMaintenanceProcess" with default change
 Options for which default values have changed: LogMask, MountCriteria, BufferCount, TapeLoadTimeout,
 UseRAO, RAOLTOAlgorithm, RAOLTOAlgorithmOptions.
 
-### Features
+The following manual pages have been updated:
+
+  cta-admin(1cta)
+  cta-catalogue-admin-user-create(1cta)
+  cta-catalogue-schema-create(1cta)
+  cta-catalogue-schema-drop(1cta)
+  cta-catalogue-schema-set-production(1cta)
+  cta-catalogue-schema-verify(1cta)
+  cta-database-poll(1cta)
+  cta-fst-gcd(1cta)
+  cta-readtp(1cta)
+  cta-restore-deleted-files(1cta)
+  cta-rmcd(1cta)
+  cta-smc(1cta)
+  cta-taped(1cta)
+  cta-tape-label(1cta)
+
+### Features
+- cta/CTA#979  - Document configuration options of daemons and command-line tools
 ### Bug fixes
 - cta/CTA#947  - cta-taped should log the FST being used for a data transfer
 - cta/CTA#1106 - "cta-admin schedulinginfo ls" returns records larger than SSI buffer size limit
diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt
index 6f3fdcacb85f3b1349a15be040f3a0b3e406d39f..b56ecdb1ef8406ad97003d22818011a5848d86e4 100644
--- a/catalogue/CMakeLists.txt
+++ b/catalogue/CMakeLists.txt
@@ -222,18 +222,18 @@ set_property(TARGET cta-catalogue-schema-drop APPEND PROPERTY INSTALL_RPATH ${OR
 install (TARGETS cta-catalogue-schema-drop DESTINATION /usr/bin)
 install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/cta-catalogue-schema-drop.1cta DESTINATION /usr/share/man/man1)
 
-add_executable(cta-catalogue-set-production
+add_executable(cta-catalogue-schema-set-production
   SetProductionCmd.cpp
   SetProductionCmdMain.cpp
   SetProductionCmdLineArgs.cpp
 )
 
-target_link_libraries (cta-catalogue-set-production ctacatalogue ctaschemachecker)
-set_property(TARGET cta-catalogue-set-production APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH})
-set_property(TARGET cta-catalogue-set-production APPEND PROPERTY INSTALL_RPATH ${ORACLE-INSTANTCLIENT_RPATH})
+target_link_libraries (cta-catalogue-schema-set-production ctacatalogue ctaschemachecker)
+set_property(TARGET cta-catalogue-schema-set-production APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH})
+set_property(TARGET cta-catalogue-schema-set-production APPEND PROPERTY INSTALL_RPATH ${ORACLE-INSTANTCLIENT_RPATH})
 
-install (TARGETS cta-catalogue-set-production DESTINATION /usr/bin)
-install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/cta-catalogue-set-production.1cta DESTINATION /usr/share/man/man1)
+install (TARGETS cta-catalogue-schema-set-production DESTINATION /usr/bin)
+install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/cta-catalogue-schema-set-production.1cta DESTINATION /usr/share/man/man1)
 
 add_executable(cta-database-poll
   PollDatabaseCmd.cpp
diff --git a/catalogue/cta-catalogue-admin-user-create.1cta b/catalogue/cta-catalogue-admin-user-create.1cta
index ba6f2de00cefa4d5be73ad632bfef53eea23c9c0..8bda3f8333b27ac062cb99699d2c4dd124fe3a28 100644
--- a/catalogue/cta-catalogue-admin-user-create.1cta
+++ b/catalogue/cta-catalogue-admin-user-create.1cta
@@ -13,39 +13,50 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-
-.TH CTA-CATALOGUE-ADMIN-USER-CREATE 1CTA "December 2016" CTA CTA
+.TH CTA-CATALOGUE-ADMIN-USER-CREATE "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
 cta-catalogue-admin-user-create \- Create a CTA admin user
+
 .SH SYNOPSIS
-.BI "cta-catalogue-admin-user-create databaseConnectionFile -u <username> -m <comment> [-h]"
+\fBcta-catalogue-admin-user-create\fP \fIdatabaseConnectionFile\fR --username \fIusername\fR --comment \fIcomment\fR [--help]
 
 .SH DESCRIPTION
-\fBcta-catalogue-admin-user-create\fP is a command-line tool that creates an
-admin user in the catalogue database.  \fBcta-catalogue-admin-user-create\fP
-connects directly to the catalogue database as opposed to the cta command-line
-tool that connects to the CTA front end.  \fBcta-catalogue-admin-user-create\fP
-can therefore be used to bootstrap the creation of CTA admin users.
+\fBcta-catalogue-admin-user-create\fP creates an admin user in the CTA Catalogue database. It connects
+directly to the database (unlike \fBcta-admin\fP, which connects to the CTA Frontend).
+\fBcta-catalogue-admin-user-create\fP can therefore be used to bootstrap the creation of admin users
+on a new installation of CTA.
 .P
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
+
 .SH OPTIONS
 .TP
-\fB\-u, \-\-username <username>
+\-u, \-\-username \fIusername\fR
 The name of the admin user to be created.
 .TP
-\fB\-m, \-\-comment <comment>
+\-m, \-\-comment \fIcomment\fR
 Comment describing the creation of the admin user.
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
-cta-catalogue-admin-user-create /etc/cta/cta-catalogue.conf -u ctaadmin -c "The CTA admin account"
-
-.SH AUTHOR
-\fBCTA\fP Team
+\-h, \-\-help
+Display command options and exit.
+
+.SH EXIT STATUS
+.P
+\fBcta-catalogue-admin-user-create\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
+cta-catalogue-admin-user-create /etc/cta/cta-catalogue.conf --username ctaadmin --comment "The CTA admin account"
+
+.SH SEE ALSO
+\fBcta-admin\fP(1cta)
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/catalogue/cta-catalogue-schema-create.1cta b/catalogue/cta-catalogue-schema-create.1cta
index d4f6b4fba44b1b6e19fcba5ee718a280b22069f3..07f92ac859cd26d57c0a35db02c8de883e9aef64 100644
--- a/catalogue/cta-catalogue-schema-create.1cta
+++ b/catalogue/cta-catalogue-schema-create.1cta
@@ -13,31 +13,46 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-CATALOGUE-SCHEMA-CREATE 1CTA "August 2016" CTA CTA
+.TH CTA-CATALOGUE-SCHEMA-CREATE "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-catalogue-schema-create \- Creates the CTA catalogue schema
+cta-catalogue-schema-create \- Create the CTA Catalogue schema
+
 .SH SYNOPSIS
-.BI "cta-catalogue-schema-create databaseConnectionFile [options]"
+\fBcta-catalogue-schema-create\fP \fIdatabaseConnectionFile\fR [--help] [--version \fIschema_version\fR]
 
 .SH DESCRIPTION
-\fBcta-catalogue-schema-create\fP is a command-line tool that creates the CTA
-catalogue database schema.
+\fBcta-catalogue-schema-create\fP is a command-line tool that creates the CTA catalogue database schema.
+It will abort if the \fBCTA_CATALOGUE\fP table is already present in the database.
 .P
-This command-line tool will abort if it sees a CTA_CATALOGUE database table
-already present in the database schema.
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
+
 .SH OPTIONS
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
+\-h, \-\-help
+Display command options and exit.
+.TP
+-v, --version \fIschema_version\fR
+Version of the CTA Catalogue schema to be created. By default, \fBcta-catalogue-schema-create\fP creates
+the latest version of the schema. This option allows the creation of an earlier version. This is useful
+for testing the upgrade from an older schema version to a newer version.
+
+.SH EXIT STATUS
+.P
+\fBcta-catalogue-schema-create\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
 cta-catalogue-schema-create /etc/cta/cta-catalogue.conf
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/catalogue/cta-catalogue-schema-drop.1cta b/catalogue/cta-catalogue-schema-drop.1cta
index 398749da115fab3beb0db8b237a687fe15cc0a67..576cab75e3a0ddec049b9bc83dbcbb3dc11a3aae 100644
--- a/catalogue/cta-catalogue-schema-drop.1cta
+++ b/catalogue/cta-catalogue-schema-drop.1cta
@@ -13,31 +13,43 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-CATALOGUE-SCHEMA-DROP 1CTA "December 2016" CTA CTA
+.TH CTA-CATALOGUE-SCHEMA-DROP "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-catalogue-schema-drop \- Drop the schema of the CTA catalogue database
+cta-catalogue-schema-drop \- Drop the CTA Catalogue schema
+
 .SH SYNOPSIS
-.BI "cta-catalogue-schema-drop databaseConnectionFile [options]"
+\fBcta-catalogue-schema-drop\fP \fIdatabaseConnectionFile\fR [--help]
 
 .SH DESCRIPTION
-\fBcta-catalogue-schema-drop\fP is a command-line tool that will drop \fBALL\fP
-of the tables and sequences in the specified database.
+\fBcta-catalogue-schema-drop\fP is a command-line tool that will drop \fBall\fP of the tables and
+sequences in the specified database. It will abort if the CTA Catalogue database has been marked
+as a production database with \fBcta-catalogue-schema-set-production\fP.
+.P
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
 
-This command-line tool will abort if the CTA_CATALOGUE database has been marked
-as a production database using the \fBcta-catalogue-set-production\fP command.
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
 .SH OPTIONS
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
+\-h, \-\-help
+Display command options and exit.
+
+.SH EXIT STATUS
+.P
+\fBcta-catalogue-schema-drop\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
 cta-catalogue-schema-drop /etc/cta/cta-catalogue.conf
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+\fBcta-catalogue-schema-set-production\fP(1cta)
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/catalogue/cta-catalogue-schema-set-production.1cta b/catalogue/cta-catalogue-schema-set-production.1cta
new file mode 100644
index 0000000000000000000000000000000000000000..a552b41a1e11558fe8b5ece099daf799cf776f9f
--- /dev/null
+++ b/catalogue/cta-catalogue-schema-set-production.1cta
@@ -0,0 +1,59 @@
+.\" @project      The CERN Tape Archive (CTA)
+.\" @copyright    Copyright © 2016-2022 CERN
+.\" @license      This program is free software, distributed under the terms of the GNU General Public
+.\"               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
+.\"               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
+.\"               option) any later version.
+.\"
+.\"               This program is distributed in the hope that it will be useful, but WITHOUT ANY
+.\"               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+.\"               PARTICULAR PURPOSE. See the GNU General Public License for more details.
+.\"
+.\"               In applying this licence, CERN does not waive the privileges and immunities
+.\"               granted to it by virtue of its status as an Intergovernmental Organization or
+.\"               submit itself to any jurisdiction.
+
+.TH CTA-CATALOGUE-SCHEMA-SET-PRODUCTION "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
+.SH NAME
+cta-catalogue-schema-set-production \- Mark the CTA Catalogue as "in production", to prevent accidentally dropping the schema
+
+.SH SYNOPSIS
+\fBcta-catalogue-schema-set-production\fP \fIdatabaseConnectionFile\fR [--help]
+
+.SH DESCRIPTION
+\fBcta-catalogue-schema-set-production\fP sets the \fBIS_PRODUCTION\fP flag on the \fBCTA_CATALOGUE\fP
+table in the CTA Catalogue database. This prevents \fBcta-catalogue-schema-drop\fP from dropping the
+schema, protecting the schema from accidental deletion due to misconfiguation or human error.
+.P
+By design, there is no tool to unset the \fBIS_PRODUCTION\fP flag. It can only be unset by running an
+SQL UPDATE statement directly on the \fBCTA_CATALOGUE\fP table.
+.P
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
+
+.SH OPTIONS
+.TP
+\-h, \-\-help
+Display command options and exit.
+
+.SH EXIT STATUS
+.P
+\fBcta-catalogue-schema-set-production\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
+cta-catalogue-set-production /etc/cta/cta-catalogue.conf
+
+.SH SEE ALSO
+.P
+\fBcta-catalogue-schema-drop\fP(1cta)
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/catalogue/cta-catalogue-schema-verify.1cta b/catalogue/cta-catalogue-schema-verify.1cta
index e84f301e57794280d9ca196138f351a613b14603..4165846bcdd79948137428a396fd105949aca6c4 100644
--- a/catalogue/cta-catalogue-schema-verify.1cta
+++ b/catalogue/cta-catalogue-schema-verify.1cta
@@ -13,31 +13,57 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-CATALOGUE-SCHEMA-VERIFY 1CTA "June 2019" CTA CTA
+.TH CTA-CATALOGUE-SCHEMA-VERIFY "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-catalogue-schema-verify \- Verifies the CTA catalogue schema
+cta-catalogue-schema-verify \- Verify the CTA Catalogue schema
+
 .SH SYNOPSIS
-.BI "cta-catalogue-schema-verify databaseConnectionFile [options]"
+\fBcta-catalogue-schema-verify\fP \fIdatabaseConnectionFile\fR [--help]
 
 .SH DESCRIPTION
-\fBcta-catalogue-schema-verify\fP is a command-line tool that verifies the CTA
-catalogue database schema.
+\fBcta-catalogue-schema-verify\fP verifies that the schema of the CTA Catalogue deployed in the
+database conforms to the schema definition defined by the CTA software.
 .P
-This command-line tool will abort if it sees a CTA_CATALOGUE database table
-does not present in the database schema.
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
+.P
+The tool checks the following items:
+.IP \(bu 4
+Check the schema is the expected version
+.IP \(bu 4
+Compare table names, column names and types
+.IP \(bu 4
+Compare constraint names (except NOT NULL constraints in PostgreSQL)
+.IP \(bu 4
+Compare index names
+.IP \(bu 4
+Display warnings if any constraints do not have an index for the keys on both sides
+.IP \(bu 4
+Display warnings if any tables have been set as PARALLEL (Oracle)
+.IP \(bu 4
+Display warnings if Oracle types, synonyms, stored procedures or error checking tables are detected in the catalogue database
+
 .SH OPTIONS
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
+\-h, \-\-help
+Display command options and exit.
+
+.SH EXIT STATUS
+.P
+\fBcta-catalogue-schema-verify\fP returns 0 on success and non-zero if any errors are detected.
+
+.SH EXAMPLE
+.P
 cta-catalogue-schema-verify /etc/cta/cta-catalogue.conf
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/catalogue/cta-catalogue-set-production.1cta b/catalogue/cta-catalogue-set-production.1cta
deleted file mode 100644
index 4a01c4acfacf98eb426282dc6b12d856bab7bc94..0000000000000000000000000000000000000000
--- a/catalogue/cta-catalogue-set-production.1cta
+++ /dev/null
@@ -1,43 +0,0 @@
-.\" @project      The CERN Tape Archive (CTA)
-.\" @copyright    Copyright © 2016-2022 CERN
-.\" @license      This program is free software, distributed under the terms of the GNU General Public
-.\"               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
-.\"               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
-.\"               option) any later version.
-.\"
-.\"               This program is distributed in the hope that it will be useful, but WITHOUT ANY
-.\"               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-.\"               PARTICULAR PURPOSE. See the GNU General Public License for more details.
-.\"
-.\"               In applying this licence, CERN does not waive the privileges and immunities
-.\"               granted to it by virtue of its status as an Intergovernmental Organization or
-.\"               submit itself to any jurisdiction.
-
-.TH CTA-CATALOGUE-SCHEMA-DROP 1CTA "December 2016" CTA CTA
-.SH NAME
-cta-catalogue-set-production \- Set the IS_PRODUCTION flag on the CTA catalogue database. This will
-prevent any dropping of the schema by the cta-catalogue-schema-drop tool.
-.SH SYNOPSIS
-.BI "cta-catalogue-set-production databaseConnectionFile [options]"
-
-.SH DESCRIPTION
-\fBcta-catalogue-set-production\fP is a command-line tool that sets the IS_PRODUCTION flag
-on the CTA_CATALOGUE table.
-.P
-This command-line tool will abort if the IS_PRODUCTION column is not in the CTA_CATALOGUE table.
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
-.SH OPTIONS
-.TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
-cta-catalogue-set-production /etc/cta/cta-catalogue.conf
-
-.SH AUTHOR
-\fBCTA\fP Team
diff --git a/catalogue/cta-database-poll.1cta b/catalogue/cta-database-poll.1cta
index 5e7a07ad5fe24a6b511e16dc8059100c0b997624..e68d58ec6d05af0d585568cdedb1f9b1ebeef6cb 100644
--- a/catalogue/cta-database-poll.1cta
+++ b/catalogue/cta-database-poll.1cta
@@ -13,30 +13,48 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-DATABASE-POLL 1CTA "December 2016" CTA CTA
+.TH CTA-DATABASE-POLL "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
+
 .SH NAME
-cta-database-poll \- Polls the specified database every second
+cta-database-poll \- Poll the CTA Catalogue database once per second
+
 .SH SYNOPSIS
-.BI "cta-database-poll databaseConnectionFile numberOfSecondsToKeepPolling [options]"
+\fBcta-database-poll\fP \fIdatabaseConnectionFile\fR \fInumberOfSecondsToKeepPolling\fR [--help]
+
 .SH DESCRIPTION
-\fBcta-database-poll\fP is a command-line tool that polls the specified database
-every second for the specified total number of seconds.
-.SH ARGUMENTS
-.TP
-\fBdatabaseConnectionFile
-The path to the configuration file containing the connection details of the
-CTA catalogue database.
-.TP
-\fBnumberOfSecondsToKeepPolling
-The total number of seconds cta-database-poll should run before exiting.
+\fBcta-database-poll\fP is a tool for testing and monitoring of the database connection to the CTA
+Catalogue. The advantage over other lower-level tools is that it abstracts away the details of the
+specific database technology, using the CTA Catalogue configuration file to determine where to connect.
+.P
+\fBcta-database-poll\fP pings the configured database once a second for the number of seconds specified.
+.P
+\fIdatabaseConnectionFile\fR is the path to the configuration file containing the connection details
+of the CTA Catalogue database.
+.P
+\fInumberOfSecondsToKeepPolling\fR is the total number of seconds that \fBcta-database-poll\fR should
+run before exiting.
+
 .SH OPTIONS
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
-cta-database-poll 5 /etc/cta/cta-catalogue.conf
-
-.SH AUTHOR
-\fBCTA\fP Team
+\-h, \-\-help
+Display command options and exit.
+
+.SH EXIT STATUS
+.P
+\fBcta-database-poll\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
+cta-database-poll /etc/cta/cta-catalogue.conf 5
+
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/cmdline/cta-admin.1cta b/cmdline/cta-admin.1cta
index 5400679e1feb41547b6bacb4c1836e38e5017c87..1ee9b8dc30e2c33bc1bb37f16b28174fac330a79 100644
--- a/cmdline/cta-admin.1cta
+++ b/cmdline/cta-admin.1cta
@@ -13,24 +13,19 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-ADMIN 1cta "2022-06-30" "CTA" "The CERN Tape Archive (CTA)"
-
+.TH CTA-ADMIN "1cta" "2022-06-30" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-admin \- administrative command interface for CTA tape system operators
+cta-admin \- Administrative command interface for CTA tape system operators
 
 .SH SYNOPSIS
-.P
 \fBcta-admin\fP [--json] \fIcommand\fR [\fIsubcommand\fR] [\fIoptions\fR]
-.P
-\fBcta-admin\fP sends the specified command to the CTA Frontend (see \fBCONFIGURATION\fR below).
-.P
-Commands which return a list of results from the server display on stdout.
 
 .SH DESCRIPTION
 .P
-Invoking \fBcta-admin\fP with no command line parameters shows a list of valid commands.
+\fBcta-admin\fP sends the specified command to the CTA Frontend (see \fBCONFIGURATION\fR below).
 .P
-To show the subcommands and options for a specific command, type:
+Invoking \fBcta-admin\fP with no command line parameters shows a list of valid commands. To show the
+subcommands and options for a specific command, type:
 .P
 .RS
 \fBcta-admin\fP \fIcommand\fR help
@@ -50,12 +45,12 @@ exist in the administrator list and must authenticate themselves with a valid Ke
 .TP
 archiveroute (ar)
 Add, change, remove or list the archive routes, which are the policies linking namespace entries to
-tapepools.
+tape pools.
 .TP
 diskinstance (di)
-Add, change, remove or list the disk instances. A disk instance is a separate namespace. A CTA
-installation has at least one disk instance and can have multiple disk instances, for example it
-may be desirable to set up a separate namespace for each Virtual Organization (VO).
+Add, change, remove or list the disk instances. A CTA installation has one or more disk instances. A
+disk instance is a separate namespace. Multiple disk instances should be configured if it is desired
+to have a separate namespace for each Virtual Organization (VO).
 .TP
 diskinstancespace (dis)
 Add, change, remove or list the disk instance spaces. A disk instance can contain zero or more disk
@@ -71,9 +66,14 @@ requests; how long to sleep when the disk is full).
 .TP
 drive (dr)
 Bring tape drives up or down, list tape drives or remove tape drives from the CTA system.
+.P
+.RS
+\fBcta-admin drive ls\fP displays an exclamation mark (\fB!\fP) in front of the drive name, for drives
+in DISABLED logical libraries.
+.RE
 .TP
 failedrequest (fr)
-List and manage requests which failed and for which all retry attempts failed.
+List and remove requests which failed and for which all retry attempts failed.
 .TP
 groupmountrule (gmr)
 Add, change, remove or list the group mount rules.
@@ -85,8 +85,10 @@ physical library and if the drive is capable of reading or writing the tape. In
 that drive should normally also be in the same logical library.
 .TP
 mediatype (mt)
-Add, change, remove or list the tape cartridge media types, to specify nominal capacity and parameters
-for software Recommended Access Order (LTO cartridges only).
+Add, change, remove or list the tape cartridge media types. This command is used to specify the nominal
+capacity of each media type, which is used to estimate the total capacity of tape pools. Optionally,
+specify the parameters for software Recommended Access Order (LTO-8 or older tape technology). See
+\fBcta-taped(1cta)\fP for details.
 .TP
 mountpolicy (mp)
 Add, change, remove or list the mount policies.
@@ -95,7 +97,8 @@ recycletf (rtf)
 List tape files in the recycle log.
 .TP
 repack (re)
-Manage tape repacking.
+Add or remove a request to repack one or more tapes. This command can also list repack requests in
+progress and display any errors.
 .TP
 requestermountrule (rmr)
 Add, change, remove or list the requester mount rules.
@@ -108,20 +111,23 @@ Show the status of all active queues.
 .TP
 storageclass (sc)
 Add, change, remove or list the storage classes. Storage classes are associated with directories, to
-specify the number of tape copies the files in the directory should have. Storage classes should be
-changed only rarely.
+specify the number of tape copies for each file, and the corresponding tape pool that each copy
+should be archived to. In EOS, the storage class is added as an extended attribute of the
+directory, which is inherited by the file at creation time.
 .TP
 tape (ta)
 Add, change, remove, reclaim, list or label tapes. This command is used to manage the physical tape
 cartridges in each library.
 .TP
 tapefile (tf)
-List files on a specified tape.
+List files on a specified tape. \fBcta-admin tapefile ls -l\fP allows listing the disk metadata
+as well as tape metadata. Use of this option requires that gRPC is correctly configured on the disk
+system. See \fBFILES\fP, below.
 .TP
 tapepool (tp)
-Add, change, remove or list the tapepools, which are logical sets of tapes. Tapepools are used to manage
-the life cycle of tapes (label → supply → user pool → erase → label). Listing the tapepools shows
-statistics such as the total number of tapes in the pool, number of free tapes, etc.
+Add, change, remove or list tape pools. Tape pools are logical sets of tapes which are used to manage
+the tape lifecycle: label -> supply -> user pool -> erase -> label. \fBcta-admin tapepool ls\fP shows
+statistics such as the total number of tapes in the pool and number of free tapes.
 .TP
 version (v)
 Display the version of \fBcta-admin\fP, the CTA Frontend, the protocol buffer used for client/server
@@ -131,6 +137,14 @@ virtualorganization (vo)
 Add, change, remove or list the Virtual Organizations (VOs). Each VO corresponds to an entity whose data
 transfers should be managed independently of the others, for example an experimental collaboration.
 
+.SH OPTIONS
+.TP
+--json
+Some commands, such as \fBcta-admin tapefile ls\fR, can return an arbitrarily long list of results,
+which are normally returned in plain text format, with one record per line. If the --json option is
+supplied, the results are returned as an array of records in JSON format. This option is intended for
+use by scripts to ease automated processing of results.
+
 .SH CONFIGURATION
 The \fBcta-admin\fP configuration is specified in \fI/etc/cta/cta-cli.conf\fR. The following configuration
 options are available:
@@ -148,22 +162,18 @@ Sets the client log level (see \fBXrdSsiPbLogLevel\fR below).
 cta.log.hiRes (default: \fIfalse\fR)
 Specify whether log timestamps should have second (\fIfalse\fR) or microsecond (\fItrue\fR) resolution.
 .SS Example configuration file
-    cta.endpoint cta-frontend.cern.ch:10955
-    cta.resource.options Reusable
-
-.SH OPTIONS
-.TP
---json
-Some commands, such as \fBcta-admin tapefile ls\fR, can return an arbitrarily long list of results,
-which are normally returned in plain text format, with one record per line. If the --json option is
-supplied, the results are returned as an array of records in JSON format. This option is intended for
-use by scripts to ease automated processing of results.
+.P
+.RS
+cta.endpoint cta-frontend.cern.ch:10955
+.br
+cta.resource.options Reusable
+.RE
 
 .SH EXIT STATUS
 \fBcta-admin\fP returns 0 on success.
 
 If there is an error, a message will be printed on \fIstderr\fR. XRootD errors, protocol buffer
-errors and CTA Frontend errors return exit code 1. User errors (e.g. invalid tapepool or vid) return
+errors and CTA Frontend errors return exit code 1. User errors (e.g. invalid tape pool or VID) return
 with exit code 2.
 
 In the case of user errors, when the --json option is specified, \fBcta-admin\fP will return an empty JSON array
@@ -220,7 +230,18 @@ number of retries.
 .SH FILES
 .TP
 .BI /etc/cta/cta-cli.conf
-\fBcta-admin\fP configuration file, specifying the endpoint to use for the CTA Frontend and other options.
+Configuration file. See \fBCONFIGURATION\fP, above.
+.TP
+.BI /etc/cta/eos.grpc.keytab
+gRPC keys for each instance, used by \fBcta-admin tapefile ls\fP to display disk metadata associated with
+files on tape. The format is one line per disk instance, as follows:
+.P
+.RS
+.nf
+# disk instance  endpoint (host:port)         gRPC token
+eosctaphysics    eosctaphysics.cern.ch:50051  bf8d9c49-2eda-40bd-82aa-630a556caf31
+.fi
+.RE
 
 .SH BUGS
 .P
diff --git a/cmdline/restore_files/cta-restore-deleted-files.1cta b/cmdline/restore_files/cta-restore-deleted-files.1cta
index f5b2bc0db204ed99334ab4ae1f6f7b6212b7a71f..2cd8188d8ebcc4c1bcce6ec87e82c7f7341d7814 100644
--- a/cmdline/restore_files/cta-restore-deleted-files.1cta
+++ b/cmdline/restore_files/cta-restore-deleted-files.1cta
@@ -13,68 +13,79 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-RESTORE-DELETED-FILES 1CTA "NOVEMBER 2021" CTA CTA
+.TH CTA-RESTORE-DELETED-FILES "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-restore-deleted-files \- Restore files deleted from cta
+cta-restore-deleted-files \- Restore deleted files from the CTA Recycle Bin
+
 .SH SYNOPSIS
-.BI "cta-restore-deleted-file [OPTIONS]"
+.HP
+\fBcta-restore-deleted-files\fP [--id \fIarchive_file_id\fR] [--instance \fIdisk_instance\fR] [--fxid \fIeos_fxid\fR] [--fxidfile \fIfilename\fR] [--vid \fIvid\fR] [--copynb \fIcopy_number\fR] [--help] [--debug]
 
 .SH DESCRIPTION
-\fBcta-restore-deleted-files\fP is a command-line tool for restoring files deleted from cta that match some criteria.
-
-The tool recovers files that have been deleted by a user, by EOS or by an operator using cta-admin tf rm.
-
-There are tree scenarios for disk file recovery:
-
-1. The file has been deleted in the EOS namespace and in the CTA catalogue
-   This happens in the case of a normal file removal from the user (eos rm).
-   The strategy is to reinject the file metadata in EOS and restore the file
-   entry in the cta catalogue (with a new diskFileId)
-
-2. The file has been deleted in the CTA catalogue but the EOS diskFileId remains the same
-   This can happen during a disk draining. The file is kept in the EOS namespace
-   but the entry is removed from the Catalogue. The strategy is to just
-   restore the CTA Catalogue entry.
-
-3. The file has been deleted in the CTA catalogue but the EOS diskFileId changed
-   This happens during the conversion of a file from a space to another. The strategy is to recover the
-   CTA Catalogue entry and update the diskFileId to the one that corresponds to its EOS entry.
-
-
-.SH OPTIONS
+\fBcta-restore-deleted-files\fP restores files deleted from CTA that match some criteria. Recovered
+files may have been deleted by a user (with \fBeos rm\fP) or by an operator (with
+\fBcta-admin tapefile rm\fP).
+.P
+There are three scenarios for disk file recovery:
+.TP
+1.
+The file has been deleted in the EOS namespace and in the CTA catalogue.
+This happens in the case of a normal file removal by the user (\fBeos rm\fP). The strategy is to
+reinject the file metadata into EOS and restore the file entry in the CTA catalogue (with a new
+disk file id).
 .TP
+2.
+The file has been deleted in the CTA catalogue, but the metadata is unchanged in EOS.
+This can happen during disk draining. The file is kept in the EOS namespace but the entry is removed
+from the CTA Catalogue. The strategy is to restore the CTA Catalogue entry.
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
+3.
+The file has been deleted in the CTA catalogue and the EOS diskFileId changed. This can happen during
+the conversion of a file from a space to another. The strategy is to recover the CTA Catalogue entry
+and update the disk file id to the one that corresponds to the metadata in EOS.
+
+.SH OPTIONS
 .TP
-\fB\-d, \-\-debug
-Enable debug log messages
+\-I, \-\-id \fIarchive_file_id\fR
+Archive file id of the files to restore.
 .TP
-\fB\-I, \-\-id
-Archive file id of the files to restore
+\-i, \-\-instance \fIdisk_instance\fR
+Disk instance of the files to restore.
 .TP
-\fB\-i, \-\-instance
-Disk instance of the files to restore
+\-f, \-\-fxid \fIeos_fxid\fR
+Disk file id of the files to restore, expressed as a hexadecimal string.
 .TP
-\fB\-f, \-\-fxid
-Disk file id of the files to restore
+\-F, \-\-fxidfile \fIfilename\fR
+Path to file containing a list of disk file ids to restore.
 .TP
-\fB\-F, \-\-fxidfile
-Path to file containing a list of disk file ids to restore
+\-v, \-\-vid \fIvid\fR
+Volume identifier (VID) of the files to restore.
 .TP
-\fB\-v, \-\-vid
-tape vid of the files to restore
+\-c, \-\-copynb \fIcopy_number\fR
+Copy number of the files to restore.
 .TP
-\fB\-c, \-\-copynb
-copy number of the files to restore
+\-h, \-\-help
+Display command options and exit.
 .TP
+\-d, \-\-debug
+Enable debug log messages.
+
+.SH EXIT STATUS
+.P
+\fBcta-restore-deleted-files\fP returns 0 on success.
 
+.SH EXAMPLE
+.P
+cta-restore-deleted-files --vid V01007
 
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
-.br
-cta-restore-deleted-file --vid V01007
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/cta.spec.in b/cta.spec.in
index 2ee960fd089ac48485f0d65b952982bed61be85a..83c981f51e19e97141ae267b9616638f73794931 100644
--- a/cta.spec.in
+++ b/cta.spec.in
@@ -377,7 +377,7 @@ Scripts and utilities to faciliate working with the CTA catalogue
 %attr(0755,root,root) %{_bindir}/cta-catalogue-admin-user-create
 %attr(0755,root,root) %{_bindir}/cta-catalogue-schema-create
 %attr(0755,root,root) %{_bindir}/cta-catalogue-schema-drop
-%attr(0755,root,root) %{_bindir}/cta-catalogue-set-production
+%attr(0755,root,root) %{_bindir}/cta-catalogue-schema-set-production
 %attr(0755,root,root) %{_bindir}/cta-catalogue-schema-verify
 %attr(0755,root,root) %{_bindir}/cta-database-poll
 %attr(0755,root,root) %{_bindir}/cta-statistics-save
@@ -385,7 +385,7 @@ Scripts and utilities to faciliate working with the CTA catalogue
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-admin-user-create.1cta.gz
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-schema-create.1cta.gz
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-schema-drop.1cta.gz
-%attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-set-production.1cta.gz
+%attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-schema-set-production.1cta.gz
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-catalogue-schema-verify.1cta.gz
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-database-poll.1cta.gz
 
@@ -402,7 +402,7 @@ The Remote Media Changer daemon (rmcd)
 %attr(0644,root,root) %config(noreplace) /etc/logrotate.d/cta-rmcd
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-rmcd.1cta.gz
 %attr(0755,root,root) %{_bindir}/cta-rmcd
-%attr(0644,root,root) %config(noreplace) %{_sysconfdir}/cta/cta-rmcd.conf
+%attr(0644,root,root) %config(noreplace) %{_sysconfdir}/cta/cta-rmcd.conf.example
 %attr(0644,root,root) %config(noreplace) /etc/sysconfig/cta-rmcd
 %attr(0644,root,root) /etc/systemd/system/cta-rmcd.service
 
@@ -427,7 +427,6 @@ The client of the Remote Media Changer Daemon (rmcd)
 %files -n cta-smc
 %defattr(-,root,root)
 %attr(0755,root,root) %{_bindir}/cta-smc
-%attr(0644,root,root) %config(noreplace) %{_sysconfdir}/cta/cta-smc.conf
 %attr(0644,root,root) %doc /usr/share/man/man1/cta-smc.1cta.gz
 
 %package -n cta-tape-label
diff --git a/frontend-grpc/cta-frontend-grpc.1cta b/frontend-grpc/cta-frontend-grpc.1cta
index a8230695650334b0082d9546502d13109bc89032..957f6ff46f4c233f7f9f5e5cb8189665b98f81b1 100644
--- a/frontend-grpc/cta-frontend-grpc.1cta
+++ b/frontend-grpc/cta-frontend-grpc.1cta
@@ -13,39 +13,37 @@
 .\"                 You should have received a copy of the GNU General Public License
 .\"                 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-.TH CTA-FRONTEND-GRPC "1cta" "$Date: 2021/10/29 14:09:00 $" CTA "CTA"
+.TH CTA-FRONTEND-GRPC "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-frontend-grpc \- gRPC based frontend for CTA
+cta-frontend-grpc \- gRPC-based Frontend for CTA
+
 .SH SYNOPSIS
-.BI "cta-frontend-grpc [OPTIONS]"
+\fBcta-frontend-grpc\fP [--port \fIport\fR] [--log-header|--no-log-header] [--tls] [--version] [--help]
 
 .SH DESCRIPTION
-\fBcta-frontend-grpc\fP is the daemon process providing gRPC endpoint for integration with
-storage systems.
-.P
+\fBcta-frontend-grpc\fP is the daemon process providing gRPC endpoint for integration with storage systems.
 
 .SH OPTIONS
 .TP
-\fB\-p, \-\-port  <port>
-TCP port used to accept connections from dCache
-.TP
-\fB\-h, \-\-help
-Prints the usage message.
+\-p, \-\-port \fIport\fR
+TCP port used to accept connections from dCache.
 .TP
-\fB\-n, \-\-log\-header
+\-n, \-\-log\-header
 Include timestamp and host name into the log messages.
 .TP
-\fB\-s, \-\-no\-log\-header
+\-s, \-\-no\-log\-header
 Don't include timestamp and host name into the log messages, default behaviour.
 .TP
-\fB\-t, \-\-tls
+\-t, \-\-tls
 Enable TLS for communication. The paths to the TLS certificate, key and root-ca chan files in PEM
 format should be specified by '\fBgRPC TlsCert\fP', '\fBgRPC TlsKey\fP' and '\fBgRPC TlsChain\fP'
 in the cta.conf configuration file.
 .TP
-\fB\-v, \-\-version
+\-v, \-\-version
 Print the version number and exit.
-
+.TP
+\-h, \-\-help
+Display command options and exit.
 
 .SH FILES
 .TP
@@ -55,5 +53,16 @@ The CTA configuration file.
 .B /etc/cta/cta-catalogue.conf
 The CTA catalog configuration file.
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+.P
+gRPC (\fIhttps://grpc.io/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/mediachanger/CMakeLists.txt b/mediachanger/CMakeLists.txt
index 9ae68dc40409225073cfe5684a31237c8546cf81..11fbbfc228bd98358bb8ba65568518abcfd24727 100644
--- a/mediachanger/CMakeLists.txt
+++ b/mediachanger/CMakeLists.txt
@@ -52,12 +52,8 @@ target_link_libraries (ctamediachanger
 install (TARGETS ctamediachanger DESTINATION usr/${CMAKE_INSTALL_LIBDIR})
 
 set (MEDIACHANGER_UNIT_TESTS_LIB_SRC_FILES
-  DismountCmdLine.cpp
-  DismountCmdLineTest.cpp
   IoTest.cpp
   LibrarySlotParserTest.cpp
-  MountCmdLine.cpp
-  MountCmdLineTest.cpp
   ScsiLibrarySlotTest.cpp)
 
 add_library (ctamediachangerunittests SHARED
@@ -70,29 +66,3 @@ target_link_libraries (ctamediachangerunittests
 
 install (TARGETS ctamediachangerunittests DESTINATION usr/${CMAKE_INSTALL_LIBDIR})
 
-set (MEDIA_CHANGER_MOUNT_SRC_FILES
-  MountCmd.cpp
-  MountCmdLine.cpp
-  MountCmdMain.cpp)
-add_executable (cta-mediachanger-mount ${MEDIA_CHANGER_MOUNT_SRC_FILES})
-set_target_properties (cta-mediachanger-mount PROPERTIES
-  COMPILE_FLAGS -I/usr/include/CDK
-  COMPILE_DEFINITIONS LINUX)
-set_property (TARGET cta-mediachanger-mount APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH})
-target_link_libraries (cta-mediachanger-mount
-  ctacommon
-  ctamediachanger)
-
-set (MEDIA_CHANGER_DISMOUNT_SRC_FILES
-  DismountCmd.cpp
-  DismountCmdLine.cpp
-  DismountCmdMain.cpp)
-add_executable (cta-mediachanger-dismount
-  ${MEDIA_CHANGER_DISMOUNT_SRC_FILES})
-set_target_properties (cta-mediachanger-dismount PROPERTIES
-  COMPILE_FLAGS -I/usr/include/CDK
-  COMPILE_DEFINITIONS LINUX)
-set_property (TARGET cta-mediachanger-dismount APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH})
-target_link_libraries (cta-mediachanger-dismount
-  ctacommon
-  ctamediachanger)
diff --git a/mediachanger/DismountCmd.cpp b/mediachanger/DismountCmd.cpp
deleted file mode 100644
index 7103d3c39b8a0264fefe1d412b7e4ed5af8674e8..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmd.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "mediachanger/DismountCmd.hpp"
-
-#include <getopt.h>
-#include <iostream>
-#include <memory>
- 
-//------------------------------------------------------------------------------
-// constructor
-//------------------------------------------------------------------------------
-cta::mediachanger::DismountCmd::DismountCmd(
-  std::istream &inStream, std::ostream &outStream, std::ostream &errStream,
-  MediaChangerFacade &mc):
-  CmdLineTool(inStream, outStream, errStream, mc) {
-}
-
-//------------------------------------------------------------------------------
-// destructor
-//------------------------------------------------------------------------------
-cta::mediachanger::DismountCmd::~DismountCmd() {
-  // Do nothing
-}
-
-//------------------------------------------------------------------------------
-// exceptionThrowingMain
-//------------------------------------------------------------------------------
-int cta::mediachanger::DismountCmd::exceptionThrowingMain(const int argc,
-  char *const *const argv) {
-  try {
-    m_cmdLine = DismountCmdLine(argc, argv);
-  } catch(cta::exception::Exception &ex) {
-    m_err << ex.getMessage().str() << std::endl;
-    m_err << std::endl;
-    m_err << m_cmdLine.getUsage() << std::endl;
-    return 1;
-  }
-
-  // Display the usage message to standard out and exit with success if the
-  // user requested help
-  if(m_cmdLine.getHelp()) {
-    m_out << m_cmdLine.getUsage();
-    return 0;
-  }
-
-  // Setup debug mode to be on or off depending on the command-line arguments
-  m_debugBuf.setDebug(m_cmdLine.getDebug());
-
-  m_dbg << "VID        = " << m_cmdLine.getVid() << std::endl;
-  m_dbg << "DRIVE_SLOT = " << m_cmdLine.getDriveLibrarySlot().str() <<
-    std::endl;
-
-  m_mc.dismountTape(m_cmdLine.getVid(), m_cmdLine.getDriveLibrarySlot());
-  return 0;
-}
diff --git a/mediachanger/DismountCmd.hpp b/mediachanger/DismountCmd.hpp
deleted file mode 100644
index 26cbd2a88a7c2009dd060c151b62d5d9223a6630..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmd.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#pragma once
-
-#include "mediachanger/CmdLineTool.hpp"
-#include "mediachanger/DismountCmdLine.hpp"
-
-#include <stdint.h>
-
-namespace cta {
-namespace mediachanger {
-
-/**
- * The class implementing the command-line tool for dismounting tapes on both
- * ACS and SCSI tape libraries.
- */
-class DismountCmd: public CmdLineTool {
-public:
-
-  /**
-   * Constructor.
-   *
-   * @param inStream Standard input stream.
-   * @param outStream Standard output stream.
-   * @param errStream Standard error stream.
-   * @param mc Interface to the media changer.
-   */
-  DismountCmd(std::istream &inStream, std::ostream &outStream,
-    std::ostream &errStream, MediaChangerFacade &mc);
-
-  /**
-   * Destructor.
-   */
-  virtual ~DismountCmd();
-
-  /**
-   * The entry function of the command.
-   *
-   * @param argc The number of command-line arguments.
-   * @param argv The command-line arguments.
-   * @return The exit value of the program.
-   */
-  int exceptionThrowingMain(const int argc, char *const *const argv);
-
-private:
-
-  /**
-   * The parsed command-line.
-   *
-   * The value of this member variable is set within the main() method of this
-   * class.
-   */
-  DismountCmdLine m_cmdLine;
-
-}; // class DismountCmd
-
-} // namespace mediachanger
-} // namespace cta
diff --git a/mediachanger/DismountCmdLine.cpp b/mediachanger/DismountCmdLine.cpp
deleted file mode 100644
index 746d7876fd2a73f61e89c1fd79f61433e03296ba..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmdLine.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/MissingOperand.hpp"
-#include "mediachanger/DismountCmdLine.hpp"
-#include "mediachanger/LibrarySlotParser.hpp"
-#include "common/exception/Exception.hpp"
-
-#include <getopt.h>
-
-//-----------------------------------------------------------------------------
-// constructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::DismountCmdLine::DismountCmdLine():
-  m_debug(false),
-  m_help(false),
-  m_driveLibrarySlot(0) {
-}
-
-//------------------------------------------------------------------------------
-// constructor
-//------------------------------------------------------------------------------
-cta::mediachanger::DismountCmdLine::DismountCmdLine(const int argc,
-  char *const *const argv):
-  m_debug(false),
-  m_help(false),
-  m_driveLibrarySlot(0) {
-
-  static struct option longopts[] = {
-    {"debug", 0, nullptr, 'd'},
-    {"help" , 0, nullptr, 'h'},
-    {nullptr   , 0, nullptr, 0}
-  };
-
-  // Prevent getopt() from printing an error message if it does not recognize
-  // an option character
-  opterr = 0;
-
-  int opt = 0;
-  while((opt = getopt_long(argc, argv, ":dh", longopts, nullptr)) != -1) {
-    processOption(opt);
-  }
-
-  // There is no need to continue parsing when the help option is set
-  if(m_help) {
-    return;
-  }
-
-  // Calculate the number of non-option ARGV-elements
-  const int nbArgs = argc - optind;
-
-  // Check that both VID and DRIVE_SLOT has been specified
-  if(nbArgs < 2) {
-    cta::exception::MissingOperand ex;
-    ex.getMessage() << "Both VID and DRIVE_SLOT must be specified";
-    throw ex;
-  }
-
-  // Parse the VID command-line argument
-  m_vid = argv[optind];
-
-  // Move on to the next command-line argument
-  optind++;
-
-  // Parse the DRIVE_SLOT command-line argument
-  const std::string driveLibrarySlot = argv[optind];
-  m_driveLibrarySlot = LibrarySlotParser::parse(driveLibrarySlot);
-}
-
-//-----------------------------------------------------------------------------
-// copy constructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::DismountCmdLine::DismountCmdLine(
-  const DismountCmdLine &obj):
-  m_debug(obj.m_debug),
-  m_help(obj.m_help),
-  m_vid(obj.m_vid),
-  m_driveLibrarySlot(0 == obj.m_driveLibrarySlot ? 0 :
-    obj.m_driveLibrarySlot->clone()) {
-}
-
-//-----------------------------------------------------------------------------
-// destructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::DismountCmdLine::~DismountCmdLine() {
-  delete m_driveLibrarySlot;
-}
-
-//------------------------------------------------------------------------------
-// assignment operator
-//------------------------------------------------------------------------------
-cta::mediachanger::DismountCmdLine &cta::mediachanger::DismountCmdLine::
-  operator=(const DismountCmdLine &rhs) {
-  // If this is not a self assigment
-  if(this != &rhs) {
-    // Avoid a memory leak
-    delete(m_driveLibrarySlot);
-
-    m_debug = rhs.m_debug;
-    m_help  = rhs.m_help;
-    m_vid   = rhs.m_vid;
-    m_driveLibrarySlot = 0 == rhs.m_driveLibrarySlot ? 0 :
-      rhs.m_driveLibrarySlot->clone();
-  }
-
-  return *this;
-}
-
-//------------------------------------------------------------------------------
-// getProgramName
-//------------------------------------------------------------------------------
-std::string cta::mediachanger::DismountCmdLine::getProgramName() {
-  return "cta-mediachanger-dismount";
-}
-
-//------------------------------------------------------------------------------
-// processOption
-//------------------------------------------------------------------------------
-void cta::mediachanger::DismountCmdLine::processOption(const int opt) {
-  switch(opt) {
-  case 'd':
-    m_debug = true;
-    break;
-  case 'h':
-    m_help = true;
-    break;
-  case ':':
-    return handleMissingParameter(optopt);
-  case '?':
-    return handleUnknownOption(optopt);
-  default:
-    {
-      cta::exception::Exception ex;
-      ex.getMessage() <<
-        "getopt_long returned the following unknown value: 0x" <<
-        std::hex << (int)opt;
-      throw ex;
-    }
-  } // switch(opt)
-}
-
-//------------------------------------------------------------------------------
-// getUsage
-//------------------------------------------------------------------------------
-std::string cta::mediachanger::DismountCmdLine::getUsage() {
-  return std::string() +
-  "Usage:\n"
-  "\n"
-  "  " + getProgramName() + " [options] VID smcDRIVE_ORDINAL\n"
-  "\n"
-  "Where:\n"
-  "\n"
-  "  VID              The VID of the volume to be dismounted.\n"
-  "  smcDRIVE_ORDINAL The drive ordinal.\n"
-  "\n"
-  "Options:\n"
-  "\n"
-  "  -d|--debug Turn on the printing of debug information.\n"
-  "\n"
-  "  -h|--help  Print this help message and exit.\n"
-  "\n"
-  "Comments to: cta-support@cern.ch\n";
-}
-
-//------------------------------------------------------------------------------
-// getDebug
-//------------------------------------------------------------------------------
-bool cta::mediachanger::DismountCmdLine::getDebug() const {
-  return m_debug;
-}
-
-//------------------------------------------------------------------------------
-// getHelp
-//------------------------------------------------------------------------------
-bool cta::mediachanger::DismountCmdLine::getHelp() const {
-  return m_help;
-}
-
-//------------------------------------------------------------------------------
-// getVid
-//------------------------------------------------------------------------------
-const std::string &cta::mediachanger::DismountCmdLine::getVid()
-  const {
-  return m_vid;
-}
-
-//------------------------------------------------------------------------------
-// getDriveLibrarySlot
-//------------------------------------------------------------------------------
-const cta::mediachanger::LibrarySlot &cta::mediachanger::
-  DismountCmdLine::getDriveLibrarySlot() const {
-  if(0 == m_driveLibrarySlot) {
-    cta::exception::Exception ex;
-    ex.getMessage() << "Failed to get drive library-slot: Value not set";
-    throw ex;
-  }
-
-  return *m_driveLibrarySlot;
-}
diff --git a/mediachanger/DismountCmdLine.hpp b/mediachanger/DismountCmdLine.hpp
deleted file mode 100644
index 0790812e606e613473e0a1384faf0f55a47c2e62..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmdLine.hpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#pragma once
-
-#include "mediachanger/CmdLine.hpp"
-#include "mediachanger/LibrarySlot.hpp"
-
-#include <string>
-
-namespace cta {
-namespace mediachanger {
-
-/**
- * Data type used to store the results of parsing the command-line.
- */
-class DismountCmdLine: public CmdLine {
-public:
-
-  /**
-   * Constructor.
-   */
-  DismountCmdLine();
-
-  /**
-   * Constructor.
-   *
-   * Parses the specified command-line arguments.
-   *
-   * @param argc Argument count from the executable's entry function: main().
-   * @param argv Argument vector from the executable's entry function: main().
-   */
-  DismountCmdLine(const int argc, char *const *const argv);
-
-  /**
-   * Copy constructor.
-   *
-   * @param obj The object to be copied.
-   */
-  DismountCmdLine(const DismountCmdLine &obj);
-
-  /**
-   * Destructor.
-   */
-  ~DismountCmdLine();
-
-  /**
-   * Assignment oprator.
-   *
-   * @param rhs The right-hand side of the operator.
-   */
-  DismountCmdLine &operator=(const DismountCmdLine &rhs);
-
-  /**
-   * Gets the usage message that describes the command line.
-   *
-   * @return The usage message.
-   */ 
-  static std::string getUsage();
-
-  /**
-   * Gets the value of the debug option.
-   *
-   * @return True if the debug option has been set.
-   */
-  bool getDebug() const;
-
-  /**
-   * Gets the value of the help option.
-   *
-   * @return True if the help option has been set.
-   */
-  bool getHelp() const;
-
-  /**
-   * Gets the volume identifier of the tape to be mounted.
-   *
-   * @return The volume identifier of the tape to be mounted.
-   */
-  const std::string &getVid() const;
-
-  /**
-   * Gets the slot in the tape library where the drive is located.
-   *
-   * @return The slot in the tape library where the drive is located.
-   */
-  const LibrarySlot &getDriveLibrarySlot() const;
-
-  /**
-   * Return sthe program name.
-   *
-   * @return sthe program name.
-   */
-  static std::string getProgramName();
-
-private:
-
-  /**
-   * True if the debug option has been set.
-   */
-  bool m_debug;
-
-  /**
-   * True if the help option has been set.
-   */
-  bool m_help;
-
-  /**
-   * The volume identifier of the tape to be mounted.
-   */
-  std::string m_vid;
-
-  /**
-   * The slot in the tape library where the drive is located.
-   */
-  LibrarySlot *m_driveLibrarySlot;
-
-  /**
-   * Processes the specified option that was returned by getopt_long().
-   *
-   * @param opt The option that was returned by getopt_long().
-   */
-  void processOption(const int opt);
-
-}; // class DismountCmdLine
-
-} // namespace mediachanger
-} // namespace cta
diff --git a/mediachanger/DismountCmdLineTest.cpp b/mediachanger/DismountCmdLineTest.cpp
deleted file mode 100644
index 63291ff947ba18c3957b693e957532baaa29655c..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmdLineTest.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/Exception.hpp"
-#include "mediachanger/DismountCmdLine.hpp"
-
-#include <gtest/gtest.h>
-#include <list>
-#include <memory>
-
-namespace unitTests {
-
-class cta_mediachanger_DismountCmdLineTest : public ::testing::Test {
-protected:
-
-  struct Argcv {
-    int argc;
-    char **argv;
-    Argcv(): argc(0), argv(nullptr) {
-    }
-  };
-  typedef std::list<Argcv*> ArgcvList;
-  ArgcvList m_argsList;
-
-  /**
-   * Creates a duplicate string using the new operator.
-   */
-  char *dupString(const std::string &str) {
-    const int len = str.size();
-    char *copy = new char[len + 1];
-    std::copy(str.begin(), str.end(), copy);
-    copy[len] = '\0';
-    return copy;
-  }
-
-  virtual void SetUp() {
-  }
-
-  virtual void TearDown() {
-    // Allow getopt_long to be called again
-    optind = 0;
-
-    for(ArgcvList::const_iterator itor = m_argsList.begin();
-      itor != m_argsList.end(); itor++) {
-      for(int i=0; i < (*itor)->argc; i++) {
-        delete[] (*itor)->argv[i];
-      }
-      delete[] (*itor)->argv;
-      delete *itor;
-    }
-  }
-};
-
-TEST_F(cta_mediachanger_DismountCmdLineTest, copy_constructor) {
-  using namespace cta::mediachanger;
-
-  Argcv *args= new Argcv();
-  m_argsList.push_back(args);
-  args->argc = 3;
-  args->argv = new char *[4];
-  args->argv[0] = dupString("cta-mediachanger-dismount");
-  args->argv[1] = dupString("vid");
-  args->argv[2] = dupString("smc1");
-  args->argv[3] = nullptr;
-
-  DismountCmdLine cmdLine1(args->argc, args->argv);
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"),
-    cmdLine1.getDriveLibrarySlot().str());
-
-  DismountCmdLine cmdLine2(cmdLine1);
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI,
-    cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"), cmdLine2.getDriveLibrarySlot().str());
-}
-
-TEST_F(cta_mediachanger_DismountCmdLineTest, assignment) {
-  using namespace cta::mediachanger;
-
-  Argcv *args1= new Argcv();
-  m_argsList.push_back(args1);
-  args1->argc = 3;
-  args1->argv = new char *[4];
-  args1->argv[0] = dupString("cta-mediachanger-dismount");
-  args1->argv[1] = dupString("vid");
-  args1->argv[2] = dupString("smc1");
-  args1->argv[3] = nullptr;
-
-  DismountCmdLine cmdLine1(args1->argc, args1->argv);
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"), cmdLine1.getDriveLibrarySlot().str());
-
-  Argcv *args2= new Argcv();
-  m_argsList.push_back(args2);
-  args2->argc = 3;
-  args2->argv = new char *[4];
-  args2->argv[0] = dupString("cta-mediachanger-dismount");
-  args2->argv[1] = dupString("vid");
-  args2->argv[2] = dupString("smc2");
-  args2->argv[3] = nullptr;
-
-  DismountCmdLine cmdLine2(args2->argc, args2->argv);
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine2.getDriveLibrarySlot().str());
-
-  cmdLine1 = cmdLine2;
-
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine1.getDriveLibrarySlot().str());
-
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine2.getDriveLibrarySlot().str());
-}
-
-TEST_F(cta_mediachanger_DismountCmdLineTest, scsi) {
-  using namespace cta::mediachanger;
-
-  Argcv *args = new Argcv();
-  m_argsList.push_back(args);
-  args->argc = 3;
-  args->argv = new char *[4];
-  args->argv[0] = dupString("cta-mediachanger-dismount");
-  args->argv[1] = dupString("vid");
-  args->argv[2] = dupString("smc1");
-  args->argv[3] = nullptr;
-
-  std::unique_ptr<DismountCmdLine> cmdLine;
-  ASSERT_NO_THROW(cmdLine.reset(new DismountCmdLine(args->argc, args->argv)));
-
-  ASSERT_FALSE(cmdLine->getHelp());
-  ASSERT_FALSE(cmdLine->getDebug());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI,
-    cmdLine->getDriveLibrarySlot().getLibraryType());
-}
-
-} // namespace unitTests
diff --git a/mediachanger/DismountCmdMain.cpp b/mediachanger/DismountCmdMain.cpp
deleted file mode 100644
index 0a282ef5feffb67fc3cc3e77f1c002ae20206853..0000000000000000000000000000000000000000
--- a/mediachanger/DismountCmdMain.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/Exception.hpp"
-#include "common/log/StdoutLogger.hpp"
-#include "common/utils/utils.hpp"
-#include "mediachanger/DismountCmd.hpp"
-#include "mediachanger/DismountCmdLine.hpp"
-
-#include <exception>
-#include <iostream>
-
-/**
- * An exception throwing version of main().
- *
- * @param argc The number of command-line arguments including the program name.
- * @param argv The command-line arguments.
- * @return The exit value of the program.
- */
-static int exceptionThrowingMain(const int argc, char *const *const argv);
-
-//------------------------------------------------------------------------------
-// main
-//------------------------------------------------------------------------------
-int main(const int argc, char *const *const argv) {
-  using namespace cta;
-
-  std::string errorMessage;
-
-  try {
-    const int rc = exceptionThrowingMain(argc, argv);
-    return rc;
-  } catch(cta::exception::Exception &ex) {
-    errorMessage = ex.getMessage().str();
-  } catch(std::exception &se) {
-    errorMessage = se.what();
-  } catch(...) {
-    errorMessage = "An unknown exception was thrown";
-  }
-
-  // Reaching this point means the command has failed, ane exception was throw
-  // and errorMessage has been set accordingly
-
-  std::cerr << "Aborting: " << errorMessage << std::endl;
-  return 1;
-}
-
-//------------------------------------------------------------------------------
-// exceptionThrowingMain
-//------------------------------------------------------------------------------
-static int exceptionThrowingMain(const int argc, char *const *const argv) {
-  using namespace cta;
-
-  const std::string hostName = utils::getShortHostname();
-  const std::string programName = mediachanger::DismountCmdLine::getProgramName();
-  log::StdoutLogger log(hostName, programName);
-  mediachanger::MediaChangerFacade mc(log);
-  
-  mediachanger::DismountCmd cmd(std::cin, std::cout, std::cerr, mc);
-
-  return cmd.exceptionThrowingMain(argc, argv);
-}
diff --git a/mediachanger/MountCmd.cpp b/mediachanger/MountCmd.cpp
deleted file mode 100644
index 988aabba603c26d0147fd86776b1fa2e2d0fdc9f..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmd.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "mediachanger/MountCmd.hpp"
-
-#include <getopt.h>
-#include <iostream>
-#include <memory>
- 
-//------------------------------------------------------------------------------
-// constructor
-//------------------------------------------------------------------------------
-cta::mediachanger::MountCmd::MountCmd(
-  std::istream &inStream, std::ostream &outStream, std::ostream &errStream,
-  MediaChangerFacade &mc):
-  CmdLineTool(inStream, outStream, errStream, mc) {
-}
-
-//------------------------------------------------------------------------------
-// destructor
-//------------------------------------------------------------------------------
-cta::mediachanger::MountCmd::~MountCmd() {
-  // Do nothing
-}
-
-//------------------------------------------------------------------------------
-// exceptionThrowingMain
-//------------------------------------------------------------------------------
-int cta::mediachanger::MountCmd::exceptionThrowingMain(const int argc,
-  char *const *const argv) {
-  try {
-    m_cmdLine = MountCmdLine(argc, argv);
-  } catch(cta::exception::Exception &ex) {
-    m_err << ex.getMessage().str() << std::endl;
-    m_err << std::endl;
-    m_err << m_cmdLine.getUsage() << std::endl;
-    return 1;
-  }
-
-  // Display the usage message to standard out and exit with success if the
-  // user requested help
-  if(m_cmdLine.getHelp()) {
-    m_out << MountCmdLine::getUsage();
-    return 0;
-  }
-
-  // Setup debug mode to be on or off depending on the command-line arguments
-  m_debugBuf.setDebug(m_cmdLine.getDebug());
-
-  m_dbg << "readonly   = " << bool2Str(m_cmdLine.getReadOnly()) << std::endl;
-  m_dbg << "VID        = " << m_cmdLine.getVid() << std::endl;
-  m_dbg << "DRIVE_SLOT = " << m_cmdLine.getDriveLibrarySlot().str() <<
-    std::endl;
-
-  mountTape();
-  return 0;
-}
-
-//------------------------------------------------------------------------------
-// mountTape
-//------------------------------------------------------------------------------
-void cta::mediachanger::MountCmd::mountTape() {
-  if(m_cmdLine.getReadOnly()) {
-    m_mc.mountTapeReadOnly(m_cmdLine.getVid(), m_cmdLine.getDriveLibrarySlot());
-  } else {
-    m_mc.mountTapeReadWrite(m_cmdLine.getVid(),
-      m_cmdLine.getDriveLibrarySlot());
-  }
-}
diff --git a/mediachanger/MountCmd.hpp b/mediachanger/MountCmd.hpp
deleted file mode 100644
index 79181a98cc67b522cc36481a0797327b087d1602..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmd.hpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#pragma once
-
-#include "mediachanger/CmdLineTool.hpp"
-#include "mediachanger/MountCmdLine.hpp"
-
-#include <stdint.h>
-
-namespace cta {
-namespace mediachanger {
-
-/**
- * The class implementing the command-line tool for mounting tapes on both ACS
- * and SCSI tape libraries.
- */
-class MountCmd: public CmdLineTool {
-public:
-
-  /**
-   * Constructor.
-   *
-   * @param inStream Standard input stream.
-   * @param outStream Standard output stream.
-   * @param errStream Standard error stream.
-   * @param mc Interface to the media changer.
-   */
-  MountCmd(std::istream &inStream, std::ostream &outStream,
-    std::ostream &errStream, MediaChangerFacade &mc);
-
-  /**
-   * Destructor.
-   */
-  virtual ~MountCmd();
-
-  /**
-   * The entry function of the command.
-   *
-   * @param argc The number of command-line arguments.
-   * @param argv The command-line arguments.
-   * @return The exit value of the program.
-   */
-  int exceptionThrowingMain(const int argc, char *const *const argv);
-
-private:
-
-  /**
-   * The parsed command-line.
-   *
-   * The value of this member variable is set within the main() method of this
-   * class.
-   */
-  MountCmdLine m_cmdLine;
-
-  /**
-   * Requests the media changer to mount the tape and returns only when the
-   * operation has terminated.
-   */
-  void mountTape();
-
-}; // class MountCmd
-
-} // namespace mediachanger
-} // namespace cta
diff --git a/mediachanger/MountCmdLine.cpp b/mediachanger/MountCmdLine.cpp
deleted file mode 100644
index c30fcfac3feb74abf89987db3d61bba9c0444d77..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmdLine.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/MissingOperand.hpp"
-#include "mediachanger/MountCmdLine.hpp"
-#include "common/exception/Exception.hpp"
-
-#include <getopt.h>
-
-//-----------------------------------------------------------------------------
-// constructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::MountCmdLine::MountCmdLine():
-  m_debug(false),
-  m_help(false),
-  m_readOnly(false),
-  m_driveLibrarySlot(0) {
-}
-
-//------------------------------------------------------------------------------
-// constructor
-//------------------------------------------------------------------------------
-cta::mediachanger::MountCmdLine::MountCmdLine(const int argc,
-  char *const *const argv):
-  m_debug(false),
-  m_help(false),
-  m_readOnly(false),
-  m_driveLibrarySlot(0) {
-
-  static struct option longopts[] = {
-    {"debug"    , 0, nullptr, 'd'},
-    {"help"     , 0, nullptr, 'h'},
-    {"readonly" , 0, nullptr, 'r'},
-    {nullptr       , 0, nullptr, 0}
-  };
-
-  // Prevent getopt() from printing an error message if it does not recognize
-  // an option character
-  opterr = 0;
-
-  int opt = 0;
-  while((opt = getopt_long(argc, argv, ":dhr", longopts, nullptr)) != -1) {
-    processOption(opt);
-  }
-
-  // There is no need to continue parsing when the help option is set
-  if(m_help) {
-    return;
-  }
-
-  // Calculate the number of non-option ARGV-elements
-  const int nbArgs = argc - optind;
-
-  // Check that both VID and DRIVE_SLOT has been specified
-  if(nbArgs < 2) {
-    cta::exception::MissingOperand ex;
-    ex.getMessage() << "Both VID and smcDRIVE_ORDINAL must be specified";
-    throw ex;
-  }
-
-  // Parse the VID command-line argument
-  m_vid = argv[optind];
-
-  // Move on to the next command-line argument
-  optind++;
-
-  // Parse the DRIVE_SLOT command-line argument
-  const std::string driveLibrarySlot = argv[optind];
-  m_driveLibrarySlot = LibrarySlotParser::parse(driveLibrarySlot);
-}
-
-//-----------------------------------------------------------------------------
-// copy constructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::MountCmdLine::MountCmdLine(const MountCmdLine &obj):
-  m_debug(obj.m_debug),
-  m_help(obj.m_help),
-  m_readOnly(obj.m_readOnly),
-  m_vid(obj.m_vid),
-  m_driveLibrarySlot(0 == obj.m_driveLibrarySlot ? 0 :
-    obj.m_driveLibrarySlot->clone()) {
-}
-
-//-----------------------------------------------------------------------------
-// destructor
-//-----------------------------------------------------------------------------
-cta::mediachanger::MountCmdLine::~MountCmdLine() {
-  delete m_driveLibrarySlot;
-}
-
-//------------------------------------------------------------------------------
-// assignment operator
-//------------------------------------------------------------------------------
-cta::mediachanger::MountCmdLine &cta::mediachanger::MountCmdLine::
-  operator=(const MountCmdLine &rhs) {
-  // If this is not a self assigment
-  if(this != &rhs) {
-    // Avoid a memory leak
-    delete(m_driveLibrarySlot);
-
-    m_debug    = rhs.m_debug;
-    m_help     = rhs.m_help;
-    m_readOnly = rhs.m_readOnly;
-    m_vid      = rhs.m_vid;
-    m_driveLibrarySlot = 0 == rhs.m_driveLibrarySlot ? 0 :
-      rhs.m_driveLibrarySlot->clone();
-  }
-
-  return *this;
-}
-
-//------------------------------------------------------------------------------
-// processOption
-//------------------------------------------------------------------------------
-void cta::mediachanger::MountCmdLine::processOption(const int opt) {
-  switch(opt) {
-  case 'd':
-    m_debug = true;
-    break;
-  case 'h':
-    m_help = true;
-    break;
-  case 'r':
-    m_readOnly = true;
-    break;
-  case ':':
-    return handleMissingParameter(optopt);
-  case '?':
-    return handleUnknownOption(optopt);
-  default:
-    {
-      cta::exception::Exception ex;
-      ex.getMessage() <<
-        "getopt_long returned the following unknown value: 0x" <<
-        std::hex << (int)opt;
-      throw ex;
-    }
-  } // switch(opt)
-}
-
-//------------------------------------------------------------------------------
-// getUsage
-//------------------------------------------------------------------------------
-std::string cta::mediachanger::MountCmdLine::getUsage() {
-  return std::string() +
-  "Usage:\n"
-  "\n"
-  "  " + getProgramName() + " [options] VID smcDRIVE_ORDINAL\n"
-  "\n"
-  "Where:\n"
-  "\n"
-  "  VID              The VID of the volume to be mounted.\n"
-  "  smcDRIVE_ORDINAL The drive ordinal.\n"
-  "\n"
-  "Options:\n"
-  "\n"
-  "  -d|--debug    Turn on the printing of debug information.\n"
-  "\n"
-  "  -h|--help     Print this help message and exit.\n"
-  "\n"
-  "  -r|--readOnly Request the volume is mounted for read-only access\n"
-  "\n"
-  "Comments to: Castor.Support@cern.ch\n";
-}
-
-//------------------------------------------------------------------------------
-// getDebug
-//------------------------------------------------------------------------------
-bool cta::mediachanger::MountCmdLine::getDebug() const {
-  return m_debug;
-}
-
-//------------------------------------------------------------------------------
-// getHelp
-//------------------------------------------------------------------------------
-bool cta::mediachanger::MountCmdLine::getHelp() const {
-  return m_help;
-}
-
-//------------------------------------------------------------------------------
-// getReadOnly
-//------------------------------------------------------------------------------
-bool cta::mediachanger::MountCmdLine::getReadOnly() const {
-  return m_readOnly;
-}
-
-//------------------------------------------------------------------------------
-// getVid
-//------------------------------------------------------------------------------
-std::string cta::mediachanger::MountCmdLine::getVid() const {
-  return m_vid;
-}
-
-//------------------------------------------------------------------------------
-// getDriveLibrarySlot
-//------------------------------------------------------------------------------
-const cta::mediachanger::LibrarySlot &cta::mediachanger::MountCmdLine::
-  getDriveLibrarySlot() const {
-  if(0 == m_driveLibrarySlot) {
-    cta::exception::Exception ex;
-    ex.getMessage() << "Failed to get drive library-slot: Value not set";
-    throw ex;
-  }
-  return *m_driveLibrarySlot;
-}
-
-//------------------------------------------------------------------------------
-// getProgramName
-//------------------------------------------------------------------------------
-std::string cta::mediachanger::MountCmdLine::getProgramName() {
-  return "cta-mediachanger-mount";
-}
diff --git a/mediachanger/MountCmdLine.hpp b/mediachanger/MountCmdLine.hpp
deleted file mode 100644
index 696219200acab02c07029dd0c30a5896d3eae49d..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmdLine.hpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#pragma once
-
-#include "mediachanger/CmdLine.hpp"
-#include "mediachanger/LibrarySlot.hpp"
-#include "mediachanger/LibrarySlotParser.hpp"
-
-#include <string>
-
-namespace cta {
-namespace mediachanger {
-
-/**
- * Data type used to store the results of parsing the command-line.
- */
-class MountCmdLine: public CmdLine {
-public:
-
-  /**
-   * Constructor.
-   *
-   * Initialises all BOOLEAN member-variables to FALSE, all integer
-   * member-variables to 0 and the volume identifier to an empty string.
-   */
-  MountCmdLine();
-
-  /**
-   * Constructor.
-   *
-   * Parses the specified command-line arguments.
-   *
-   * @param argc Argument count from the executable's entry function: main().
-   * @param argv Argument vector from the executable's entry function: main().
-   */
-  MountCmdLine(const int argc, char *const *const argv);
-
-  /**
-   * Copy constructor.
-   *
-   * @param obj The object to be copied.
-   */
-  MountCmdLine(const MountCmdLine &obj);
-
-  /**
-   * Destructor.
-   */
-  ~MountCmdLine();
-
-  /**
-   * Assignment oprator.
-   *
-   * @param rhs The right-hand side of the operator.
-   */
-  MountCmdLine &operator=(const MountCmdLine &rhs);
-
-  /**
-   * Gets the usage message that describes the command line.
-   *
-   * @return The usage message.
-   */
-  static std::string getUsage();
-
-  /**
-   * Gets the value of the debug option.
-   *
-   * @return True if the debug option has been set.
-   */
-  bool getDebug() const;
-
-  /**
-   * Gets the value of th ehelp option.
-   *
-   * True if the help option has been set.
-   */
-  bool getHelp() const;
-
-  /**
-   * Gets the value of the read-only option.
-   *
-   * @return True if the tape is to be mount for read-only access.
-   */
-  bool getReadOnly() const;
-
-  /**
-   * Gets the volume identifier of the tape to be mounted.
-   *
-   * @return The volume identifier of the tape to be mounted.
-   */
-  std::string getVid() const;
-
-  /**
-   * Gets the slot in the tape library where the drive is located.
-   *
-   * @return The slot in the tape library where the drive is located.
-   */
-  const LibrarySlot &getDriveLibrarySlot() const;
-
-  /**
-   * Return sthe program name.
-   *
-   * @return sthe program name.
-   */
-  static std::string getProgramName();
-
-private:
-
-  /**
-   * True if the debug option has been set.
-   */
-  bool m_debug;
-
-  /**
-   * True if the help option has been set.
-   */
-  bool m_help;
-
-  /**
-   * True if the tape is to be mount for read-only access.
-   */
-  bool m_readOnly;
-
-  /**
-   * The volume identifier of the tape to be mounted.
-   */
-  std::string m_vid;
-
-  /**
-   * The slot in the tape library where the drive is located.
-   */
-  LibrarySlot *m_driveLibrarySlot;
-
-  /**
-   * Processes the specified option that was returned by getopt_long().
-   *
-   * @param opt The option that was returned by getopt_long().
-   */
-  void processOption(const int opt);
-
-}; // class MountCmdLine
-
-} // namespace mediachanger
-} // namespace cta
diff --git a/mediachanger/MountCmdLineTest.cpp b/mediachanger/MountCmdLineTest.cpp
deleted file mode 100644
index 4626660be9c1a2a871f22ea248a2836b71c76adc..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmdLineTest.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/Exception.hpp"
-#include "mediachanger/MountCmdLine.hpp"
-
-#include <gtest/gtest.h>
-#include <list>
-#include <memory>
-
-namespace unitTests {
-
-class cta_mediachanger_MountCmdLineTest : public ::testing::Test {
-protected:
-
-  struct Argcv {
-    int argc;
-    char **argv;
-    Argcv(): argc(0), argv(nullptr) {
-    }
-  };
-  typedef std::list<Argcv*> ArgcvList;
-  ArgcvList m_argsList;
-
-  /**
-   * Creates a duplicate string using the new operator.
-   */
-  char *dupString(const std::string &str) {
-    const int len = str.size();
-    char *copy = new char[len + 1];
-    std::copy(str.begin(), str.end(), copy);
-    copy[len] = '\0';
-    return copy;
-  }
-
-  virtual void SetUp() {
-  }
-
-  virtual void TearDown() {
-    // Allow getopt_long to be called again
-    optind = 0;
-
-    for(ArgcvList::const_iterator itor = m_argsList.begin();
-      itor != m_argsList.end(); itor++) {
-      for(int i=0; i < (*itor)->argc; i++) {
-        delete[] (*itor)->argv[i];
-      }
-      delete[] (*itor)->argv;
-      delete *itor;
-    }
-  }
-};
-
-TEST_F(cta_mediachanger_MountCmdLineTest, copy_constructor) {
-  using namespace cta::mediachanger;
-
-  Argcv *args = new Argcv();
-  m_argsList.push_back(args);
-  args->argc = 3;
-  args->argv = new char *[4];
-  args->argv[0] = dupString("cta-mediachanger-mount");
-  args->argv[1] = dupString("vid");
-  args->argv[2] = dupString("smc1");
-  args->argv[3] = nullptr;
-
-  MountCmdLine cmdLine1(args->argc, args->argv);
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_FALSE(cmdLine1.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"), cmdLine1.getDriveLibrarySlot().str());
-
-  MountCmdLine cmdLine2(cmdLine1);
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_FALSE(cmdLine2.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"), cmdLine2.getDriveLibrarySlot().str());
-}
-
-TEST_F(cta_mediachanger_MountCmdLineTest, assignment) {
-  using namespace cta::mediachanger;
-
-  Argcv *args1 = new Argcv();
-  m_argsList.push_back(args1);
-  args1->argc = 3;
-  args1->argv = new char *[4];
-  args1->argv[0] = dupString("cta-mediachanger-mount");
-  args1->argv[1] = dupString("vid");
-  args1->argv[2] = dupString("smc1");
-  args1->argv[3] = nullptr;
-
-  MountCmdLine cmdLine1(args1->argc, args1->argv);
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_FALSE(cmdLine1.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc1"), cmdLine1.getDriveLibrarySlot().str());
-
-  Argcv *args2 = new Argcv();
-  m_argsList.push_back(args2);
-  args2->argc = 3;
-  args2->argv = new char *[4];
-  args2->argv[0] = dupString("cta-mediachanger-mount");
-  args2->argv[1] = dupString("vid");
-  args2->argv[2] = dupString("smc2");
-  args2->argv[3] = nullptr;
-
-  MountCmdLine cmdLine2(args2->argc, args2->argv);
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_FALSE(cmdLine2.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine2.getDriveLibrarySlot().str());
-
-  cmdLine1 = cmdLine2;
-
-  ASSERT_FALSE(cmdLine1.getHelp());
-  ASSERT_FALSE(cmdLine1.getDebug());
-  ASSERT_FALSE(cmdLine1.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine1.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine1.getDriveLibrarySlot().str());
-
-  ASSERT_FALSE(cmdLine2.getHelp());
-  ASSERT_FALSE(cmdLine2.getDebug());
-  ASSERT_FALSE(cmdLine2.getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine2.getDriveLibrarySlot().getLibraryType());
-  ASSERT_EQ(std::string("smc2"), cmdLine2.getDriveLibrarySlot().str());
-}
-
-TEST_F(cta_mediachanger_MountCmdLineTest, scsi) {
-  using namespace cta::mediachanger;
-
-  Argcv *args = new Argcv();
-  m_argsList.push_back(args);
-  args->argc = 3;
-  args->argv = new char *[4];
-  args->argv[0] = dupString("cta-mediachanger-mount");
-  args->argv[1] = dupString("vid");
-  args->argv[2] = dupString("smc1");
-  args->argv[3] = nullptr;
-
-  std::unique_ptr<MountCmdLine> cmdLine;
-  ASSERT_NO_THROW(cmdLine.reset(new MountCmdLine(args->argc, args->argv)));
-
-  ASSERT_FALSE(cmdLine->getHelp());
-  ASSERT_FALSE(cmdLine->getDebug());
-  ASSERT_FALSE(cmdLine->getReadOnly());
-  ASSERT_EQ(TAPE_LIBRARY_TYPE_SCSI, cmdLine->getDriveLibrarySlot().getLibraryType());
-}
-
-} // namespace unitTests
diff --git a/mediachanger/MountCmdMain.cpp b/mediachanger/MountCmdMain.cpp
deleted file mode 100644
index 3417b7db41d78af3cc764119f84a2992d8f7d3c7..0000000000000000000000000000000000000000
--- a/mediachanger/MountCmdMain.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * @project      The CERN Tape Archive (CTA)
- * @copyright    Copyright © 2021-2022 CERN
- * @license      This program is free software, distributed under the terms of the GNU General Public
- *               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
- *               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
- *               option) any later version.
- *
- *               This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *               PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- *               In applying this licence, CERN does not waive the privileges and immunities
- *               granted to it by virtue of its status as an Intergovernmental Organization or
- *               submit itself to any jurisdiction.
- */
-
-#include "common/exception/Exception.hpp"
-#include "common/log/StdoutLogger.hpp"
-#include "common/utils/utils.hpp"
-#include "mediachanger/MountCmd.hpp"
-#include "mediachanger/MountCmdLine.hpp"
-
-#include <exception>
-#include <iostream>
-
-/**
- * An exception throwing version of main().
- *
- * @param argc The number of command-line arguments including the program name.
- * @param argv The command-line arguments.
- * @return The exit value of the program.
- */
-static int exceptionThrowingMain(const int argc, char *const *const argv);
-
-//------------------------------------------------------------------------------
-// main
-//------------------------------------------------------------------------------
-int main(const int argc, char *const *const argv) {
-  using namespace cta;
-  std::string errorMessage;
-
-  try {
-    const int rc = exceptionThrowingMain(argc, argv);
-    return rc;
-  } catch(cta::exception::Exception &ex) {
-    errorMessage = ex.getMessage().str();
-  } catch(std::exception &se) {
-    errorMessage = se.what();
-  } catch(...) {
-    errorMessage = "An unknown exception was thrown";
-  }
-
-  // Reaching this point means the command has failed, ane exception was throw
-  // and errorMessage has been set accordingly
-
-  std::cerr << "Aborting: " << errorMessage << std::endl;
-  return 1;
-}
-
-//------------------------------------------------------------------------------
-// exceptionThrowingMain
-//------------------------------------------------------------------------------
-static int exceptionThrowingMain(const int argc, char *const *const argv) {
-  using namespace cta;
-
-  const std::string hostName = utils::getShortHostname();
-  const std::string programName = mediachanger::MountCmdLine::getProgramName();
-  log::StdoutLogger log(hostName, programName);
-  mediachanger::MediaChangerFacade mc(log);
-  mediachanger::MountCmd cmd(std::cin, std::cout, std::cerr, mc);
-
-  return cmd.exceptionThrowingMain(argc, argv);
-}
diff --git a/mediachanger/castorrmc/rmc/CMakeLists.txt b/mediachanger/castorrmc/rmc/CMakeLists.txt
index 0c7079c98c1140e5d39fd05276593fe0122addb0..3317a1b84154153cb1aa286a6b8de4bc1e07b1e4 100644
--- a/mediachanger/castorrmc/rmc/CMakeLists.txt
+++ b/mediachanger/castorrmc/rmc/CMakeLists.txt
@@ -33,8 +33,7 @@ set_property(SOURCE rmc_send_scsi_cmd.c APPEND_STRING PROPERTY COMPILE_FLAGS " -
 
 add_executable(cta-rmcd ${RMCD_SRC_FILES})
 target_link_libraries(cta-rmcd ctarmccommon)
-install (FILES cta-rmcd.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/cta)
-install (FILES cta-smc.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/cta)
+install (FILES cta-rmcd.conf.example DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/cta)
 
 install (TARGETS cta-rmcd DESTINATION /usr/bin)
 install (FILES cta-rmcd.1cta DESTINATION /usr/share/man/man1)
diff --git a/mediachanger/castorrmc/rmc/cta-rmcd.1cta b/mediachanger/castorrmc/rmc/cta-rmcd.1cta
index ea5870d5357209321c2993118051d233ec243c97..9a987aa58390b4adf0b612f66ef473ff2e0d7386 100644
--- a/mediachanger/castorrmc/rmc/cta-rmcd.1cta
+++ b/mediachanger/castorrmc/rmc/cta-rmcd.1cta
@@ -13,89 +13,95 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-RMCD "1cta" "$Date: 2021/03/11 14:44:00 $" CTA "CTA"
+.TH CTA-RMCD "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-rmcd \- Media changer daemon
+cta-rmcd \- CTA Remote Media Changer Daemon
+
 .SH SYNOPSIS
-.BI "cta-rmcd [OPTIONS]"
+systemctl start \fBcta-rmcd\fP \fIdevice_file\fR
+.br
+systemctl stop \fBcta-rmcd\fP
+.br
+systemctl status \fBcta-rmcd\fP
 
 .SH DESCRIPTION
-CTA supports SCSI-compatible tape libraries. The cta-taped daemon requires a tape
-library daemon to be installed and run on the same tape server as itself.
+\fBcta-rmcd\fP is the Remote Media Changer daemon, used to control SCSI-compatible tape libraries.
 .P
-A SCSI compatible tape library requires the following daemon:
-
-\fBcta-rmcd\fP
-
-The installation RPM for the \fBrmcd\fP daemon and its manual page is:
-
-\fBcta-rmcd-MAJORVERSION-MINORVERSION.el7.cern.x86_64.rpm\fP
-
-The \fBcta-rmcd\fP daemon can be started, stopped and its status queried using
-the usual service commands:
-.LP
-\fBservice cta-rmcd start /device/file/of/the/tape/library\fP
-.br
-\fBservice cta-rmcd status\fP
-.br
-\fBservice cta-rmcd stop\fP
-.LP
 The
-.B cta-rmcd
-command starts the Remote Media Changer daemon.
-This command is usually executed at system startup time
-.RB ( /etc/rc.local ).
-.LP
-If the Remote Media Changer daemon is not active,
-the requests are automatically retried by the client API.
-.LP
-All error messages and statistical information are kept in a log.
-.LP
-The Remote Media Changer daemon listen port number can be defined on client
-hosts and on the Remote Media Changer host itself in either of the following
-ways:
-.RS
-.LP
-setting an environment variable RMC_PORT
+\fBcta-taped\fP daemon requires that \fBcta-rmcd\fP is installed and running on the same tape server
+as itself. \fBcta-rmcd\fP is usually started at system startup time by \fBsystemd\fP or other system
+service management software.
+
+.SH CONFIGURATION
+The port number that \fBcta-rmcd\fP will listen on should be defined on client hosts and on the
+tapeserver host. The default port number is 5014. It is possible to configure a different port
+number in \fI/etc/services\fR:
+.P
 .RS
-.HP
-setenv RMC_PORT 5014
+rmc	657/tcp		# CTA Remote Media Changer (cta-rmcd)
+.br
+rmc	657/udp		# CTA Remote Media Changer (cta-rmcd)
 .RE
-.LP
-an entry in
-.B /etc/cta/cta-rmcd.conf
-like:
+.P
+This value can be overridden in \fI/etc/cta/cta-rmcd.conf\fR:
+.P
 .RS
-.HP
 RMC	PORT	5014
 .RE
-.LP
-an entry in
-.B /etc/services
-like:
+.P
+It can also be set in the \fBRMC_PORT\fP environment variable.
+
+.SH ENVIRONMENT
+.TP
+.B RMC_PORT
+Sets the port number on which \fBcta-rmcd\fP will listen.
+
+.SH FILES
+.TP
+.B /etc/cta/cta-rmcd.conf
+Configuration file. See \fBCONFIGURATION\fP above, and \fI/etc/cta/cta-rmcd.conf.example\fR.
+
+.TP
+.B /var/log/cta/cta-rmcd.log
+Log of error messages and statistical information. Log lines with code \fBRMC92\fP give information
+about the requestor: (uid,gid) and hostname. Log lines with code \fBRMC98\fP contain the command that
+was sent to the library. The exit status of each command is also logged.
+
+.SH EXAMPLE
+.P
+Example configuration of \fI/etc/systemd/system/cta-rmcd.service\fR:
+.P
 .RS
-.HP
-rmc           5014/tcp                        # CTA Remote Media Changer
-.RE
-.RE
-.LP
-If none of these methods is used, the default port number is taken from the
-definition of RMC_PORT in rmc_constants.h.
-.LP
+.nf
+[Unit]
+Description=CERN Tape Archive (CTA) rmcd daemon
+After=syslog.target network-online.target
+
+[Service]
+User=cta
+EnvironmentFile=-/etc/sysconfig/cta-rmcd
+ExecStart=/usr/bin/cta-rmcd ${CTA_RMCD_OPTIONS}
+LimitCORE=infinity
+Type=forking
+Restart=no
+
+[Install]
+WantedBy=default.target
+.fi
 .RE
+.P
+Example configuration of \fI/etc/sysconfig/cta-rmcd\fR:
+.P
+.RS
+.nf
+DAEMON_COREFILE_LIMIT=unlimited
+CTA_RMCD_OPTIONS=/dev/smc
+.fi
 .RE
-.LP
-In the log each entry has a timestamp.
-For each user command there is one message RMC92 giving information about
-the requestor (hostname, uid, gid) and one message RMC98 giving the command
-itself.
-The completion code of the command is also logged.
-.SH FILES
-.TP 1.5i
-.B /var/log/cta/cta-rmcd.log
-.SH EXAMPLES
-.TP
-Here is a small log:
+.P
+Example excerpt from the \fBcta-rmcd\fP logfile:
+.P
+.RS
 .nf
 12/06 11:40:58  7971 rmc_srv_mount: RMC92 - mount request by 0,0 from tpsrv015.cern.ch
 12/06 11:40:58  7971 rmc_srv_mount: RMC98 - mount 000029/0 on drive 2
@@ -104,5 +110,19 @@ Here is a small log:
 12/06 11:42:43  7971 rmc_srv_unmount: RMC98 - unmount 000029 2 0
 12/06 11:42:48  7971 rmc_srv_unmount: returns 0
 .fi
-.SH AUTHOR
-\fBCTA\fP Team
+.RE
+
+.SH SEE ALSO
+\fBsystemctl\fP(1)
+.br
+\fBcta-taped\fP(1cta)
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/mediachanger/castorrmc/rmc/cta-rmcd.conf b/mediachanger/castorrmc/rmc/cta-rmcd.conf
deleted file mode 100644
index aff4c9afed2258dbfd6dc996351910a09a795a2c..0000000000000000000000000000000000000000
--- a/mediachanger/castorrmc/rmc/cta-rmcd.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-# @project      The CERN Tape Archive (CTA)
-# @copyright    Copyright © 2015-2022 CERN
-# @license      This program is free software, distributed under the terms of the GNU General Public
-#               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
-#               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
-#               option) any later version.
-#
-#               This program is distributed in the hope that it will be useful, but WITHOUT ANY
-#               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-#               PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-#               In applying this licence, CERN does not waive the privileges and immunities
-#               granted to it by virtue of its status as an Intergovernmental Organization or
-#               submit itself to any jurisdiction.
-
-################################################################################
-#
-# CTA Sample Configuration File
-#
-################################################################################
-
-# The log mask.  Logs with a level lower than this value will be masked.
-# Possible values are:
-#   EMERG
-#   ALERT
-#   CRIT
-#   ERR
-#   WARNING
-#   NOTICE
-#   INFO
-#   DEBUG
-#   USERERR
-#
-# Please note that the USERERR log level is equivalent to NOTICE because it is
-# a convention of CTA to use log level NOTICE to label user errors.
-#
-# taped LogMask INFO
diff --git a/mediachanger/castorrmc/rmc/cta-smc.conf b/mediachanger/castorrmc/rmc/cta-rmcd.conf.example
similarity index 74%
rename from mediachanger/castorrmc/rmc/cta-smc.conf
rename to mediachanger/castorrmc/rmc/cta-rmcd.conf.example
index aff4c9afed2258dbfd6dc996351910a09a795a2c..f99a9482d5afa96f7991ff34d7e95d39abb25900 100644
--- a/mediachanger/castorrmc/rmc/cta-smc.conf
+++ b/mediachanger/castorrmc/rmc/cta-rmcd.conf.example
@@ -15,23 +15,9 @@
 
 ################################################################################
 #
-# CTA Sample Configuration File
+# CTA Remote Media Changer Daemon Example Configuration File
 #
 ################################################################################
 
-# The log mask.  Logs with a level lower than this value will be masked.
-# Possible values are:
-#   EMERG
-#   ALERT
-#   CRIT
-#   ERR
-#   WARNING
-#   NOTICE
-#   INFO
-#   DEBUG
-#   USERERR
-#
-# Please note that the USERERR log level is equivalent to NOTICE because it is
-# a convention of CTA to use log level NOTICE to label user errors.
-#
-# taped LogMask INFO
+# Listener port
+# RMC PORT 5014
diff --git a/mediachanger/castorrmc/rmc/cta-smc.1cta b/mediachanger/castorrmc/rmc/cta-smc.1cta
index b191aee5aee1e0efbf6b01409fa84c7e12abce06..d92aae3d8a07b451af01d3b8b119496bd2ae92a3 100644
--- a/mediachanger/castorrmc/rmc/cta-smc.1cta
+++ b/mediachanger/castorrmc/rmc/cta-smc.1cta
@@ -13,175 +13,142 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH SMC "1cta" "$Date: 2017/12/30 09:43:12 $" CTA "Ctape User Commands"
+.TH CTA-SMC "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-smc \- command line interface to drive robotic devices through SCSI
+cta-smc \- CTA SCSI Media Changer client
+
 .SH SYNOPSIS
-.B cta-smc
-.BI -d
-.BI -D " drive_ordinal"
-[
-.BI -V " vid"
-]
+\fBcta-smc\fP -d -D \fIdrive_ordinal\fR [ -V \fIvid\fR ]
 .br
-.B cta-smc
-.BI -e
-.BI -V " vid"
+\fBcta-smc\fP -e -V \fIvid\fR
 .br
-.B cta-smc
-.BI -i
-[
-.BI -V " vid"
-]
+\fBcta-smc\fP -i [ -V \fIvid\fR ]
 .br
-.B cta-smc
-.BI -m
-.BI -D " drive_ordinal"
-.BI -V " vid"
+\fBcta-smc\fP -m -D \fIdrive_ordinal\fR -V \fIvid\fR
 .br
-.B cta-smc
-.B -q D
-[
-.BI -D " drive_ordinal"
-]
-[
-.BI -j
-]
+\fBcta-smc\fP -q D [ -D \fIdrive_ordinal\fR ] [ --json ]
 .br
-.B cta-smc
-.B -q L
-[
-.BI -j
-]
+\fBcta-smc\fP -q L [ --json ]
 .br
-.B cta-smc
-.B -q P
-[
-.BI -j
-]
+\fBcta-smc\fP -q P [ --json ]
 .br
-.B cta-smc
-.B -q S
-[
-.BI -N " nbelem"
-] [
-.BI -S " starting_slot"
-] [
-.BI -j
-]
+\fBcta-smc\fP -q S [ -N nb_elements ] [ -S starting_slot ] [ --json ]
 .br
-.B cta-smc
-.B -q V
-[
-.BI -N " nbelem"
-] [
-.BI -V " vid"
-] [
-.BI -j
-]
+\fBcta-smc\fP -q V [ -N nb_elements ] [ -V \fIvid\fR ] [ --json ]
+
 .SH DESCRIPTION
-.B cta-smc
-is a program allowing to mount, dismount, export volumes in a robotic
-library through SCSI. It allows also to query various elements of the library.
+\fBcta-smc\fP is the SCSI Media Changer client. It controls the mounting, dismounting and exporting of tapes
+in a robotic tape library and can be used to query the state of the library.
+
 .SH OPTIONS
 .TP
-.BI \-d
-triggers a dismount operation. The drive must be already unloaded.
-The drive must be specified while the vid of the cartridge is optional.
-If
-.B -V
-is specified, the vid must match the vid on the cartridge to be dismounted.
+\-d
+Triggers a dismount operation. The drive must be already unloaded. The drive must be specified, but
+the Volume ID (VID) of the cartridge is optional. If -V \fIvid\fR is specified, \fIvid\fR must match
+the VID on the cartridge to be dismounted.
 .TP
-.BI \-e
-exports a volume. The cartridge must be in a storage slot (not a drive).
-The vid must be specified.
+-D \fIdrive_ordinal\fP
+Specify which drive to control or query. \fIdrive_ordinal\fP is the SCSI bus number of the drive, starting from 0.
 .TP
-.BI \-i
-imports either a specific volume indicated by
-.B -V
-option or all volumes in state "import" in the import/export cells.
+\-e
+Moves a tape from a storage slot to the export slot (which can be virtual). The VID must be specified.
 .TP
-.BI \-m
-triggers a mount operation. The drive must be free.
-The drive and the vid must be specified.
+\-i
+Imports either a specific VID (indicated by -V) or all tapes in state "import" in the import/export slots.
 .TP
-.BI \-N " nbelem"
-allows to specify the maximum number of entries to be reported.
+\-m
+Triggers a mount operation. The drive must be free. The drive and the VID must be specified.
 .TP
-.BI \-q " query_type"
-queries the library and produce a report about the status of various elements
-in the library.
-.I query_type
-may be one of the following:
+\-N \fInb_elements\fR
+Specifies the maximum number of entries to be reported.
+.TP
+\-q \fIquery_type\fR
+Queries the library and produces a report about the state of the library. \fIquery_type\fR may be one
+of the following:
 .RS
 .TP
 .B D
-produce a list of drives with their status and the vid of the mounted tape
-if any. Unless a specific drive is also given with the option
-.BR -D ,
-the status of all drives is reported.
+Produce a list of drives with their status and the VID of the mounted tape (if any). The status of
+all drives is reported, unless a specific drive is selected with the -D option.
 .TP
 .B L
-prints the result of the INQUIRY command (Vendor/Product/Revision).
-It gives also the starting address and the number of slots, drives, ports
-and transports (hands) in the library.
+Prints the result of the SCSI \fBINQUIRY\fP command (Vendor/Product/Revision). It also gives the starting
+address and the number of slots, drives, ports and transports (robotic arms) in the library.
 .TP
 .B P
-prints the status of import/export slots.
+Prints the status of import/export slots.
 .TP
 .B S
-prints the status of slots. By default all slots are reported, but the
-starting address may be specified with the option
-.B -S
-and the number of elements to be reported may be given by the option
-.BR -N .
+Prints the status of slots. By default all slots are reported, but the starting address may be specified
+with the -S option, and the number of elements to be reported may be specified with the -N option.
 .TP
 .B V
-prints the status of volumes. A single vid or a pattern may also be specified
-with the option
-.BR -V .
+Prints the status of volumes (tapes). A single VID or a pattern may also be specified with the -V option.
 .RE
 .TP
-.B \-S " starting_slot"
-specifies the starting slot address for the query operation.
+\-S \fIstarting_slot\fR
+Specifies the starting slot address for the query operation.
 .TP
-.B \-V " vid"
-A full vid or a pattern may be specified. In the latter case wild card
-characters '*' and '?' may be used but must be escaped because of the shell.
+\-V \fIvid\fR
+A full VID or a pattern may be specified using shell wildcard characters '?' and '*'.
 .TP
-.B \-j
-script mode. On query requests it prints json.
+--json
+Return query responses in JSON format (for use in scripts).
 
-.SH EXAMPLES
-.LP
-To mount the volume JK2005 on drive 1:
+.SH EXIT STATUS
+.P
+0	Ok.
+.br
+1	Parameter error or unrecoverable error (just log it).
+.br
+2	Should release drive and retry in 600 seconds.
+.br
+3	Should retry in 60 seconds.
+.br
+4	Should first do a demount force.
 .br
+5	Should configure the drive down.
+.br
+6	Should send a message to the operator and exit.
+.br
+7	Ops msg (nowait) + release drive + slow retry.
+.br
+8	Should send a message to the operator and wait.
+.br
+9	Should unload the tape and retry demount.
+.br
+16	Robot busy.
+
+.SH EXAMPLE
+.P
+To mount the tape with VID JK2005 on drive 1:
+.P
 .RS
 .B "cta-smc -m -D 1 -V JK2005"
 .RE
-.LP
-To dismount the volume present on drive 1 after checking the vid:
-.br
+.P
+To dismount the tape present on drive 1 after checking the VID:
+.P
 .RS
 .B "cta-smc -d -D 1 -V JK2005"
 .RE
-.LP
+.P
 To query the main charateristics of the library:
-.br
+.P
 .RS
 .B "cta-smc -q L"
 .sp
 .nf
-Vendor/Product/Revision = <STK     9714            1500>
+Vendor/Product/Revision = <IBM     03584L32        1802>
 Transport Count = 1, Start = 1000
 Slot Count = 99, Start = 0
 Port Count = 1, Start = 1010
 Device Count = 2, Start = 1030
 .fi
 .RE
-.LP
+.P
 To query the status of all the drives:
-.br
+.P
 .RS
 .B "cta-smc -q D"
 .sp
@@ -193,9 +160,9 @@ Drive Ordinal   Element Addr.   Status          Vid
 .cs R
 .fi
 .RE
-.LP
+.P
 To get the list of a few slots in the library:
-.br
+.P
 .RS
 .B "cta-smc -q S -S 20 -N 10"
 .sp
@@ -215,9 +182,9 @@ Element Addr.   Vid
 .cs R
 .fi
 .RE
-.LP
-To get the status of volumes for which the vid starts with JK200
-.br
+.P
+To get the status of tapes for which the VID starts with JK200
+.P
 .RS
 .B "cta-smc -q V -V 'JK200*'"
 .sp
@@ -236,27 +203,15 @@ JK2005      1031        drive
 .cs R
 .fi
 .RE
-.SH RETURN CODES
-0	Ok.
-.br
-1	Parameter error or unrecoverable error (just log it).
-.br
-2	Should release drive & retry in 600 seconds.
-.br
-3	Should retry in 60 seconds.
-.br
-4	Should do first a demount force.
-.br
-5	Should configure the drive down.
-.br
-6	Should send a msg to operator and exit.
-.br
-7	Ops msg (nowait) + release drive + slow retry.
-.br
-8	Should send a msg to operator and wait.
-.br
-9	Should unload the tape and retry demount.
-.br
-16	Robot busy.
-.SH AUTHOR
-\fBCTA\fP Team
+
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/mediachanger/cta-mediachanger-dismount.1cta b/mediachanger/cta-mediachanger-dismount.1cta
deleted file mode 100644
index 16dc7c90ef406399d9bf7c6d540bad342e582426..0000000000000000000000000000000000000000
--- a/mediachanger/cta-mediachanger-dismount.1cta
+++ /dev/null
@@ -1,49 +0,0 @@
-.\" @project      The CERN Tape Archive (CTA)
-.\" @copyright    Copyright © 2016-2022 CERN
-.\" @license      This program is free software, distributed under the terms of the GNU General Public
-.\"               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
-.\"               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
-.\"               option) any later version.
-.\"
-.\"               This program is distributed in the hope that it will be useful, but WITHOUT ANY
-.\"               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-.\"               PARTICULAR PURPOSE. See the GNU General Public License for more details.
-.\"
-.\"               In applying this licence, CERN does not waive the privileges and immunities
-.\"               granted to it by virtue of its status as an Intergovernmental Organization or
-.\"               submit itself to any jurisdiction.
-
-.TH CTA-MEDIACHANGER-DISMOUNT 1CTA "August 2016" CTA CTA
-.SH NAME
-cta-mediachanger-dismount \- dismount a volume
-.SH SYNOPSIS
-.BI "cta-mediachanger-dismount [options] VID smcDRIVE_ORDINAL"
-
-.SH DESCRIPTION
-\fBWarning\fP, \fBcta-mediachanger-dismount\fP is a developer tool and
-is therefore subject to change in and even removal from a future release of
-CASTOR.
-End users should not rely on this tool to operate their CASTOR installation.
-
-\fBcta-mediachanger-dismount\fP dismounts the volume with the specified
-\fBVID\fP from the drive located in the specified \fBDRIVE_ORDINAL\fP within the
-tape library.
-
-.SH OPTIONS
-.TP
-\fB\-d, \-\-debug
-Turns on the printing of debug information.
-.TP
-\fB\-h, \-\-help
-Prints the usage message.
-
-.SH "RETURN CODES"
-.TP
-\fB 0
-Ok.
-.TP
-\fB 1
-Command failed.
-
-.SH AUTHOR
-\fBCTA\fP Team
diff --git a/mediachanger/cta-mediachanger-mount.1cta b/mediachanger/cta-mediachanger-mount.1cta
deleted file mode 100644
index 5edda14863fe28b13a9dd713987fe222c786e420..0000000000000000000000000000000000000000
--- a/mediachanger/cta-mediachanger-mount.1cta
+++ /dev/null
@@ -1,51 +0,0 @@
-.\" @project      The CERN Tape Archive (CTA)
-.\" @copyright    Copyright © 2016-2022 CERN
-.\" @license      This program is free software, distributed under the terms of the GNU General Public
-.\"               Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can
-.\"               redistribute it and/or modify it under the terms of the GPL Version 3, or (at your
-.\"               option) any later version.
-.\"
-.\"               This program is distributed in the hope that it will be useful, but WITHOUT ANY
-.\"               WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-.\"               PARTICULAR PURPOSE. See the GNU General Public License for more details.
-.\"
-.\"               In applying this licence, CERN does not waive the privileges and immunities
-.\"               granted to it by virtue of its status as an Intergovernmental Organization or
-.\"               submit itself to any jurisdiction.
-
-.TH CTA-MEDIACHANGER-MOUNT 1CTA "August 2016" CTA CTA
-.SH NAME
-cta-mediachanger-mount \- mount a volume
-.SH SYNOPSIS
-.BI "cta-mediachanger-mount [options] VID smcDRIVE_ORDINAL"
-
-.SH DESCRIPTION
-\fBWarning\fP, \fBcta-mediachanger-mount\fP is a developer tool and is
-therefore subject to change in and even removal from a future release of CASTOR.
-End users should not rely on this tool to operate their CASTOR installation.
-
-\fBcta-mediachanger-mount\fP mounts the volume with the specified
-\fBVID\fP into the drive located in the specified \fBDRIVE_ORDINAL\fP within the
-tape library.
-
-.SH OPTIONS
-.TP
-\fB\-d, \-\-debug
-Turns on the printing of debug information.
-.TP
-\fB\-h, \-\-help
-Prints the usage message.
-.TP
-\fB\-r, \-\-readonly
-Request the volume is mounted for read-only access.
-
-.SH "RETURN CODES"
-.TP
-\fB 0
-Ok.
-.TP
-\fB 1
-Command failed.
-
-.SH AUTHOR
-\fBCTA\fP Team
diff --git a/python/eosfstgcd/cta-fst-gcd.1cta b/python/eosfstgcd/cta-fst-gcd.1cta
index 1acc10fd02ab2dfdc4a67c1d339330a7ebb17de7..a67f248baa6c26b3ae957036d1db467af20e0795 100644
--- a/python/eosfstgcd/cta-fst-gcd.1cta
+++ b/python/eosfstgcd/cta-fst-gcd.1cta
@@ -13,54 +13,88 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-CATALOGUE-SCHEMA-CREATE 1CTA "August 2016" CTA CTA
+.TH CTA-FST-GCD "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-fst-gcd \- Tape aware garbage collector daemon to run on an EOS FST
+cta-fst-gcd \- Garbage Collector Daemon for EOS FSTs with CTA tape back-end enabled
+
 .SH SYNOPSIS
-.BI "cta-fst-gcd [options]"
+\fBcta-fst-gcd\fR [--help] [--config \fIconfig_file\fR] [--stdout]
 
 .SH DESCRIPTION
-\fBcta-fst-gcd\fP is a daemon that runs on an EOS FST and garbage
-collects EOS disk copies that have been safely stored to tape.
+\fBcta-fst-gcd\fP is a daemon that runs on an EOS disk server (FST), to garbage collect (evict) disk
+replicas which have been safely archived to tape.
 .P
-The \fBcta-fst-gcd\fP daemon scans across every single EOS disk file on
-an FST.  A file is garbage collected if:
-.IP \[bu] 2
-The amount of free space on the corresponding file system is considered
-too low.
-.IP \[bu]
+The \fBcta-fst-gcd\fP daemon scans every single EOS disk file on the FST. A file is garbage collected if:
+.IP \(bu 4
+The amount of free space on the corresponding file system is considered too low.
+.IP \(bu 4
 The file is considered old enough to be garbage collected.
 .P
-The \fBcta-fst-gcd\fP daemon garbage collects an EOS disk file by
-extracting the hexadecimal EOS file identifier from the local disk
-filename and then running \fBeos stagerm fxid:<fid-hex>\fP.
-.P
+The \fBcta-fst-gcd\fP daemon garbage collects an EOS disk file by extracting the hexadecimal EOS file
+identifier (\fIfxid\fR) from the local disk filename and then running \fBeos stagerm fxid:\fP\fIfxid\fR.
+
 .SH OPTIONS
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
+\-h, \-\-help
+Display command options and exit.
 .TP
-\fB\-c CONFIG, \-\-config CONFIG
-Sets the path of the configuration file.  If not set then the default value of
-\fB/etc/cta/cta-fst-gcd.conf\fP is used.
+\-c, \-\-config \fIconfig_file\fR
+Set the path of the configuration file. Defaults to \fI/etc/cta/cta-fst-gcd.conf\fR.
 .TP
-\fB\-s, \-\-stdout
+\-s, \-\-stdout
 Sets log output to stdout. This disables use of a log file.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
+
+.SH CONFIGURATION
+The \fBcta-fst-gcd\fP daemon reads its parameters from its configuration file, by default \fI/etc/cta/cta-fst-gcd.conf\fR.
+.TP
+.B log_file = \fI/var/log/eos/fst/cta-fst-gcd.log\fR
+Path of the garbage collector log file.
+.TP
+.B mgm_host = \fIHOSTNAME.2NDLEVEL.TOPLEVEL\fR
+Fully qualified host name of EOS MGM.
+.TP
+.B eos_spaces = \fIEOS_SPACE_1 EOS_SPACE_2\fR
+Space-separated list of names of the EOS spaces to be garbage collected.
+.TP
+.B eos_space_to_min_free_bytes = \fIEOS_SPACE_1:10000000000 EOS_SPACE_2:10000000000\fR
+Minimum number of free bytes each filesystem should have.
+.TP
+.B gc_age_secs = \fI7200\fR
+Minimum age of a file before it can be considered for garbage collection.
+.TP
+.B absolute_max_age_secs = \fI604800\fR
+Age at which a file will be considered for garbage collection, regardless of the amount of free space.
+.TP
+.B query_period_secs = \fI310\fR
+Delay in seconds between free space queries to the local file systems.
+.TP
+.B main_loop_period_secs = \fI300\fR
+Period in seconds of the main loop of the \fBcta-fst-gcd\fP daemon.
+.TP
+.B xrdsecssskt = \fI/etc/eos.keytab\fR
+Path to Simple Shared Secrets keytab to authenticate with EOS MGM.
+
+.SH EXIT STATUS
+\fBcta-fst-gcd\fR returns 0 on success.
+
 .SH FILES
 .TP
 .B /etc/cta/cta-fst-gcd.conf
-The default configuration file of the \fBcta-fst-gcd\fP daemon.  This can be
-overriden using the \fB\-c\fP/\fB\-\-config\fP option.
-.TP
-.B /etc/cta/cta-fst-gcd.conf.example\fB
-The example configuration file that documents the available configuration
-parameters.
+Default location for the configuration file of the \fBcta-fst-gcd\fP daemon. This can be overriden
+using the --config option. See \fBCONFIGURATION\fP above, and \fI/etc/cta/cta-fst-gcd.conf.example\fR.
 .TP
 .B /var/log/eos/fst/cta-fst-gcd.log
-The default log file of the \fBcta-fst-gcd\fP daemon.  This can be overriden by
-modifying \fBcta-fst-gcd.conf\fP accordingly or disabled using the
-\fB\-s\fP/\fB\-\-stdout\fP option.
-.SH AUTHOR
-\fBCTA\fP Team
+The default log file of the \fBcta-fst-gcd\fP daemon.  This can be changed in \fBcta-fst-gcd.conf\fP
+or disabled with the --stdout option.
+
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/tapeserver/cta-taped.1cta b/tapeserver/cta-taped.1cta
index 8e1504ce2ff7eea376e08baa7e9a204e673a4780..db1fb637b2cd059cd1bc8324662b2b90ad02ebae 100644
--- a/tapeserver/cta-taped.1cta
+++ b/tapeserver/cta-taped.1cta
@@ -19,8 +19,8 @@
 cta-taped \- CTA Tape Server daemon
 
 .SH SYNOPSIS
-\fBcta-taped\fP [\-\-config \fIconfig_file\fR][\-\-foreground [\-\-stdout]][\-\-log\-to\-file \fIlog_file\fR]
-
+\fBcta-taped\fP [\-\-config \fIconfig_file\fR] [\-\-foreground [\-\-stdout]] [\-\-log\-to\-file \fIlog_file\fR]
+.br
 \fBcta-taped\fP --help
 
 .SH DESCRIPTION
@@ -54,7 +54,7 @@ Log to standard output instead of using syslog. Requires \-\-foreground.
 
 .SH CONFIGURATION
 The \fBcta-taped\fP daemon reads its configuration parameters from the CTA configuration file (by default,
-\fI/etc/cta/cta-taped.conf\fR). Each option is listed with its \fIdefault\fR value.
+\fI/etc/cta/cta-taped.conf\fR). Each option is listed here with its \fIdefault\fR value.
 
 .SS Tape Server Configuration Options
 .TP
@@ -203,7 +203,7 @@ The CTA Tape Server configuration file, containing the options described above u
 See \fI/etc/cta/cta-taped.conf.example\fR.
 .TP
 .B /etc/cta/TPCONFIG
-The tape drive configuration file. A single tape server daemon can control one or two tape drives.
+The tape drive configuration file. A single tape server daemon can control one or more tape drives.
 TPCONFIG should contain one line per tape drive. Each line should consist of the following four
 elements, delimited by spaces:
 
@@ -217,6 +217,7 @@ See \fI/etc/cta/TPCONFIG.example\fR.
 Usual location for the tape server log file.
 
 .SH SEE ALSO
+\fBcta-rmcd\fP(1cta)
 .P
 CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
 
diff --git a/tapeserver/readtp/cta-readtp.1cta b/tapeserver/readtp/cta-readtp.1cta
index 9fd6d4afb8d197d1022f3bc4683a666be5f173f9..420da2d9895c7ee8fbf665ec89db739b660c2748 100644
--- a/tapeserver/readtp/cta-readtp.1cta
+++ b/tapeserver/readtp/cta-readtp.1cta
@@ -13,41 +13,54 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-READTP 1CTA "August 2021" CTA CTA
+.TH CTA-READTP "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
-cta-readtp \- Read files from a tape
+cta-readtp \- Low-level utility to read files from a tape
+
 .SH SYNOPSIS
-.BI "cta-readtp VID SEQUENCE [OPTIONS]"
+\fBcta-readtp\fP \fIvid\fR \fIsequence\fR [--xroot_private_key \fIkey_path\fR] [--destination_files \fIfile_url\fR] [--help]
 
 .SH DESCRIPTION
 \fBcta-readtp\fP is a command-line tool for reading files from tape and validating their checksums.
-
-The  tape  to  be read is specified by the \fBVID\fP argument.  The tape files to be read are specified as a \fBSEQUENCE\fP of tape file sequence numbers.  The
-syntax used to specify the sequence is as follows:
-
-    f1-f2          Files f1 to f2 inclusive.
-    f1-            Files f1 to the last file on the tape.
-    f1-f2,f4,f6-   A series of non-consecutive ranges of files.
+.P
+The tape to be read is specified by the \fIvid\fR argument. The tape files to be read are specified as
+a \fIsequence\fR of tape file sequence numbers. The syntax used to specify the sequence is as follows:
+.RS
+f1-f2          Files f1 to f2 inclusive.
+.br
+f1-            Files f1 to the last file on the tape.
+.br
+f1-f2,f4,f6-   A series of non-consecutive ranges of files.
+.RE
 
 .SH OPTIONS
 .TP
+-p, --xroot_private_key \fIkey_path\fR
+Path to the XRootD private key file. Necessary if any destination file is to be written using XRootD.
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
+-f, --destination_files \fIfile_url\fR
+Path to a file containing a list of destination URLs that the files will be written to (one URL per
+line). If not specified, all data read will be written to /dev/null. If there are less destination
+files than read files, the remaining files read will be written to /dev/null.
 .TP
-\fB\-f, \-\-destination_files
-Path to a file containing a list of URLs the read files will be written to. If not specified, read files will be written to file:///dev/null.
-If there are more read files than destination files, the remaining read files will be written to file:///dev/null
-.TP
-\fB\-p, \-\-xroot_private_key
-Path to the xroot private key file. Necessary if any destination file URL is for xroot.
-.
+\-h, \-\-help
+Display command options and exit.
 
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
-.br
+.SH EXIT STATUS
+\fBcta-readtp\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
 cta-readtp V01007 10002,10004-10006,10008-
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.
diff --git a/tapeserver/tapelabel/cta-tape-label.1cta b/tapeserver/tapelabel/cta-tape-label.1cta
index 79dc5f0c6da351e8f9ab4179f77cffbce6c619ac..8676571d5b1fb7285553384d1e112b0a9dc27804 100644
--- a/tapeserver/tapelabel/cta-tape-label.1cta
+++ b/tapeserver/tapelabel/cta-tape-label.1cta
@@ -13,35 +13,70 @@
 .\"               granted to it by virtue of its status as an Intergovernmental Organization or
 .\"               submit itself to any jurisdiction.
 
-.TH CTA-TAPE-LABEL 1CTA "July 2019" CTA CTA
+.TH CTA-TAPE-LABEL "1cta" "2022-07-12" "CTA" "The CERN Tape Archive (CTA)"
 .SH NAME
 cta-tape-label \- Pre-label a CTA tape
+
 .SH SYNOPSIS
-.BI "cta-tape-label [options] --vid/-v VID"
+.HP
+\fBcta-tape-label\fP [--oldlabel \fIold_vid\fR] [--loadtimeout \fItimeout\fR] [--drive \fIdrive_name\fR] [--force] [--help] [--debug] --vid \fIvid\fR
 
 .SH DESCRIPTION
-\fBcta-tape-label\fP is a command-line tool for pre-labelling a CTA tape.
+\fBcta-tape-label\fP writes the CTA label file \fBVOL1\fP at the beginning of a tape, to prepare the
+tape to store data files. The label contains the Volume ID specified by \fIvid\fR.
+.P
+If the tape to be labelled already contains files, running \fBcta-tape-label\fP is a destructive
+operation, which writes the label file to the beginning of tape and renders all data beyond the
+label file inaccessible. 
+.P
+For non-blank tapes, \fBcta-tape-label\fP checks that the \fIvid\fR supplied matches the existing
+label of the tape in the drive. This behaviour can be changed with the --oldlabel and --force options
+(see \fBOPTIONS\fP, below).
 
-\fBcta-tape-label\fP writes CTA label to the tape with specified \fBVID\fP.
 .SH OPTIONS
 .TP
-\fB\-o, \-\-oldlabel
-Volume ID from the tape label if the tape non-blank. Needs to be set if the tape has any vid in the label differ from VID.
+-o, --oldlabel \fIold_vid\fR
+The Volume ID (VID) of the current label on the tape, if it is not the same as \fIvid\fR and the tape is not blank.
+.TP
+-t, --loadtimeout \fItimeout\fR
+The timeout to load the tape in the drive slot, in seconds. Defaults to 7200 (two hours), to allow time
+for media initialisation.
+.TP
+-u, --drive \fIdrive_name\fR
+The unit name of the drive used. Defaults to the first drive listed in TPCONFIG.
 .TP
-\fB\-h, \-\-help
-Prints the usage message.
+-f, --force
+\fBWarning: this option destroys any data on the tape without first performing the label check.\fP
+.P
+.RS
+Force labelling for non-blank tapes. This is intended for testing or use in rare situations by expert
+operators. This option should not be used when calling \fBcta-tape-label\fP from a script.
+.RE
 .TP
-\fB\-d, \-\-debug
-Prints more logs for label operations.
+-h, --help
+Display command options and exit.
 .TP
-\fB\-f, \-\-force
-Force labeling for not-blank tapes for testing purpose and without label checks. Must only be used manually.
-.SH RETURN VALUE
-Zero on success and non-zero on failure.
-.SH EXAMPLES
+-d, --debug
+Verbose log messages.
+
+.SH EXIT STATUS
+.P
+\fBcta-readtp\fP returns 0 on success.
+
+.SH EXAMPLE
+.P
 cta-tape-label --vid I54321 --oldvid T12345 --debug
 .br
 cta-tape-label --vid L54321 --force
 
-.SH AUTHOR
-\fBCTA\fP Team
+.SH SEE ALSO
+.P
+CERN Tape Archive documentation (\fIhttps://eoscta.docs.cern.ch/\fR)
+
+.SH COPYRIGHT
+.P
+Copyright © 2022 CERN. License GPLv3+: GNU GPL version 3 or later (\fIhttp://gnu.org/licenses/gpl.html\fR).
+This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law. In applying this licence, CERN does not waive the privileges and immunities
+granted to it by virtue of its status as an Intergovernmental Organization or submit itself to any
+jurisdiction.