diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.cpp b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
index ccadf037bb09fc0407639945e21cef1995e74d4f..e3914d4ec32a2bc30308f65948544e210ffa324e 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.cpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
@@ -436,8 +436,8 @@ void RequestMessage::processAdmin_Add(const cta::admin::AdminCmd &admincmd, cta:
 {
    using namespace cta::admin;
 
-   auto &username = m_option_str.at(OptionString::USERNAME);
-   auto &comment  = m_option_str.at(OptionString::COMMENT);
+   auto &username = getRequired(OptionString::USERNAME);
+   auto &comment  = getRequired(OptionString::COMMENT);
 
    m_catalogue.createAdminUser(m_cliIdentity, username, comment);
 
@@ -450,8 +450,8 @@ void RequestMessage::processAdmin_Ch(const cta::admin::AdminCmd &admincmd, cta::
 {
    using namespace cta::admin;
 
-   auto &username = m_option_str.at(OptionString::USERNAME);
-   auto &comment  = m_option_str.at(OptionString::COMMENT);
+   auto &username = getRequired(OptionString::USERNAME);
+   auto &comment  = getRequired(OptionString::COMMENT);
 
    m_catalogue.modifyAdminUserComment(m_cliIdentity, username, comment);
 
@@ -464,7 +464,7 @@ void RequestMessage::processAdmin_Rm(const cta::admin::AdminCmd &admincmd, cta::
 {
    using namespace cta::admin;
 
-   auto &username = m_option_str.at(OptionString::USERNAME);
+   auto &username = getRequired(OptionString::USERNAME);
 
    m_catalogue.deleteAdminUser(username);
 
@@ -508,8 +508,8 @@ void RequestMessage::processAdminHost_Add(const cta::admin::AdminCmd &admincmd,
 {
    using namespace cta::admin;
 
-   auto &hostname = m_option_str.at(OptionString::HOSTNAME);
-   auto &comment  = m_option_str.at(OptionString::COMMENT);
+   auto &hostname = getRequired(OptionString::HOSTNAME);
+   auto &comment  = getRequired(OptionString::COMMENT);
 
    m_catalogue.createAdminHost(m_cliIdentity, hostname, comment);
 
@@ -522,8 +522,8 @@ void RequestMessage::processAdminHost_Ch(const cta::admin::AdminCmd &admincmd, c
 {
    using namespace cta::admin;
 
-   auto &hostname = m_option_str.at(OptionString::HOSTNAME);
-   auto &comment  = m_option_str.at(OptionString::COMMENT);
+   auto &hostname = getRequired(OptionString::HOSTNAME);
+   auto &comment  = getRequired(OptionString::COMMENT);
 
    m_catalogue.modifyAdminHostComment(m_cliIdentity, hostname, comment);
 
@@ -536,7 +536,7 @@ void RequestMessage::processAdminHost_Rm(const cta::admin::AdminCmd &admincmd, c
 {
    using namespace cta::admin;
 
-   auto &hostname = m_option_str.at(OptionString::HOSTNAME);
+   auto &hostname = getRequired(OptionString::HOSTNAME);
 
    m_catalogue.deleteAdminHost(hostname);
 
@@ -589,16 +589,16 @@ void RequestMessage::processArchiveFile_Ls(const cta::admin::AdminCmd &admincmd,
 
       // Get the search criteria from the optional options
 
-      searchCriteria.archiveFileId  = getOptional(OptionUInt64::ARCHIVE_FILE_ID, m_option_uint64, &has_any);
-      searchCriteria.tapeFileCopyNb = getOptional(OptionUInt64::COPY_NUMBER,     m_option_uint64, &has_any);
-      searchCriteria.diskFileId     = getOptional(OptionString::DISKID,          m_option_str,    &has_any);
-      searchCriteria.vid            = getOptional(OptionString::VID,             m_option_str,    &has_any);
-      searchCriteria.tapePool       = getOptional(OptionString::TAPE_POOL,       m_option_str,    &has_any);
-      searchCriteria.diskFileUser   = getOptional(OptionString::OWNER,           m_option_str,    &has_any);
-      searchCriteria.diskFileGroup  = getOptional(OptionString::GROUP,           m_option_str,    &has_any);
-      searchCriteria.storageClass   = getOptional(OptionString::STORAGE_CLASS,   m_option_str,    &has_any);
-      searchCriteria.diskFilePath   = getOptional(OptionString::PATH,            m_option_str,    &has_any);
-      searchCriteria.diskInstance   = getOptional(OptionString::INSTANCE,        m_option_str,    &has_any);
+      searchCriteria.archiveFileId  = getOptional(OptionUInt64::ARCHIVE_FILE_ID, &has_any);
+      searchCriteria.tapeFileCopyNb = getOptional(OptionUInt64::COPY_NUMBER,     &has_any);
+      searchCriteria.diskFileId     = getOptional(OptionString::DISKID,          &has_any);
+      searchCriteria.vid            = getOptional(OptionString::VID,             &has_any);
+      searchCriteria.tapePool       = getOptional(OptionString::TAPE_POOL,       &has_any);
+      searchCriteria.diskFileUser   = getOptional(OptionString::OWNER,           &has_any);
+      searchCriteria.diskFileGroup  = getOptional(OptionString::GROUP,           &has_any);
+      searchCriteria.storageClass   = getOptional(OptionString::STORAGE_CLASS,   &has_any);
+      searchCriteria.diskFilePath   = getOptional(OptionString::PATH,            &has_any);
+      searchCriteria.diskInstance   = getOptional(OptionString::INSTANCE,        &has_any);
 
       if(!has_any) {
          throw cta::exception::UserError("Must specify at least one search option, or --all");
@@ -632,11 +632,11 @@ void RequestMessage::processArchiveRoute_Add(const cta::admin::AdminCmd &admincm
 {
    using namespace cta::admin;
 
-   auto &in       = m_option_str.at(OptionString::INSTANCE);
-   auto &scn      = m_option_str.at(OptionString::STORAGE_CLASS);
-   auto &cn       = m_option_uint64.at(OptionUInt64::COPY_NUMBER);
-   auto &tapepool = m_option_str.at(OptionString::TAPE_POOL);
-   auto &comment  = m_option_str.at(OptionString::COMMENT);
+   auto &in       = getRequired(OptionString::INSTANCE);
+   auto &scn      = getRequired(OptionString::STORAGE_CLASS);
+   auto &cn       = getRequired(OptionUInt64::COPY_NUMBER);
+   auto &tapepool = getRequired(OptionString::TAPE_POOL);
+   auto &comment  = getRequired(OptionString::COMMENT);
 
    m_catalogue.createArchiveRoute(m_cliIdentity, in, scn, cn, tapepool, comment);
 
@@ -649,12 +649,12 @@ void RequestMessage::processArchiveRoute_Ch(const cta::admin::AdminCmd &admincmd
 {
    using namespace cta::admin;
 
-   auto &in  = m_option_str.at(OptionString::INSTANCE);
-   auto &scn = m_option_str.at(OptionString::STORAGE_CLASS);
-   auto &cn  = m_option_uint64.at(OptionUInt64::COPY_NUMBER);
+   auto &in  = getRequired(OptionString::INSTANCE);
+   auto &scn = getRequired(OptionString::STORAGE_CLASS);
+   auto &cn  = getRequired(OptionUInt64::COPY_NUMBER);
 
-   auto tapepool = getOptional(OptionString::TAPE_POOL, m_option_str);
-   auto comment  = getOptional(OptionString::COMMENT, m_option_str);
+   auto tapepool = getOptional(OptionString::TAPE_POOL);
+   auto comment  = getOptional(OptionString::COMMENT);
 
    if(comment) {
       m_catalogue.modifyArchiveRouteComment(m_cliIdentity, in, scn, cn, comment.value());
@@ -673,9 +673,9 @@ void RequestMessage::processArchiveRoute_Rm(const cta::admin::AdminCmd &admincmd
 {
    using namespace cta::admin;
 
-   auto &in  = m_option_str.at(OptionString::INSTANCE);
-   auto &scn = m_option_str.at(OptionString::STORAGE_CLASS);
-   auto &cn  = m_option_uint64.at(OptionUInt64::COPY_NUMBER);
+   auto &in  = getRequired(OptionString::INSTANCE);
+   auto &scn = getRequired(OptionString::STORAGE_CLASS);
+   auto &cn  = getRequired(OptionUInt64::COPY_NUMBER);
 
    m_catalogue.deleteArchiveRoute(in, scn, cn);
 
@@ -724,7 +724,7 @@ void RequestMessage::processDrive_Up(const cta::admin::AdminCmd &admincmd, cta::
    std::stringstream cmdlineOutput;
 
 #if 0
-   auto &drive = m_option_str.at(OptionString::DRIVE);
+   auto &drive = getRequired(OptionString::DRIVE);
 
    changeStateForDrivesByRegex(drive, m_lc, cmdlineOutput, true, false);
 #endif
@@ -742,7 +742,7 @@ void RequestMessage::processDrive_Down(const cta::admin::AdminCmd &admincmd, cta
    std::stringstream cmdlineOutput;
 
 #if 0
-   auto &drive = m_option_str.at(OptionString::DRIVE);
+   auto &drive = getRequired(OptionString::DRIVE);
 
    changeStateForDrivesByRegex(drive, m_lc, cmdlineOutput, false, has_flag(OptionBoolean::FORCE));
 #endif
@@ -763,7 +763,7 @@ void RequestMessage::processDrive_Ls(const cta::admin::AdminCmd &admincmd, cta::
    bool singleDrive = false;
    bool driveFound = false;
 
-   auto drive = getOptional(OptionString::DRIVE, m_option_str, &singleDrive);
+   auto drive = getOptional(OptionString::DRIVE, &singleDrive);
    auto driveStates = m_scheduler.getDriveStates(m_cliIdentity, m_lc);
 
    if (!driveStates.empty())
@@ -872,10 +872,10 @@ void RequestMessage::processGroupMountRule_Add(const cta::admin::AdminCmd &admin
 {
    using namespace cta::admin;
 
-   auto &mountpolicy = m_option_str.at(OptionString::MOUNT_POLICY);
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
-   auto &comment     = m_option_str.at(OptionString::COMMENT);
+   auto &mountpolicy = getRequired(OptionString::MOUNT_POLICY);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
+   auto &comment     = getRequired(OptionString::COMMENT);
 
    m_catalogue.createRequesterGroupMountRule(m_cliIdentity, mountpolicy, in, name, comment);
 
@@ -888,10 +888,10 @@ void RequestMessage::processGroupMountRule_Ch(const cta::admin::AdminCmd &adminc
 {
    using namespace cta::admin;
 
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
-   auto  mountpolicy = getOptional(OptionString::MOUNT_POLICY, m_option_str);
-   auto  comment     = getOptional(OptionString::COMMENT, m_option_str);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
+   auto  mountpolicy = getOptional(OptionString::MOUNT_POLICY);
+   auto  comment     = getOptional(OptionString::COMMENT);
 
    if(comment) {
       m_catalogue.modifyRequesterGroupMountRuleComment(m_cliIdentity, in, name, comment.value());
@@ -909,8 +909,8 @@ void RequestMessage::processGroupMountRule_Rm(const cta::admin::AdminCmd &adminc
 {
    using namespace cta::admin;
 
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
 
    m_catalogue.deleteRequesterGroupMountRule(in, name);
 
@@ -960,7 +960,7 @@ void RequestMessage::processListPendingArchives(const cta::admin::AdminCmd &admi
    std::stringstream cmdlineOutput;
    std::map<std::string, std::list<cta::common::dataStructures::ArchiveJob> > result;
 
-   auto tapepool = getOptional(OptionString::TAPE_POOL, m_option_str);
+   auto tapepool = getOptional(OptionString::TAPE_POOL);
 
    if(tapepool) {
       std::list<cta::common::dataStructures::ArchiveJob> list = m_scheduler.getPendingArchiveJobs(tapepool.value(), m_lc);
@@ -1032,7 +1032,7 @@ void RequestMessage::processListPendingRetrieves(const cta::admin::AdminCmd &adm
 
    std::map<std::string, std::list<cta::common::dataStructures::RetrieveJob> > result;
 
-   auto vid = getOptional(OptionString::VID, m_option_str);
+   auto vid = getOptional(OptionString::VID);
 
    if(vid) {
       std::list<cta::common::dataStructures::RetrieveJob> list = m_scheduler.getPendingRetrieveJobs(vid.value(), m_lc);
@@ -1097,8 +1097,8 @@ void RequestMessage::processLogicalLibrary_Add(const cta::admin::AdminCmd &admin
 {
    using namespace cta::admin;
 
-   auto &name    = m_option_str.at(OptionString::LOGICAL_LIBRARY);
-   auto &comment = m_option_str.at(OptionString::COMMENT);
+   auto &name    = getRequired(OptionString::LOGICAL_LIBRARY);
+   auto &comment = getRequired(OptionString::COMMENT);
 
    m_catalogue.createLogicalLibrary(m_cliIdentity, name, comment);
 
@@ -1111,8 +1111,8 @@ void RequestMessage::processLogicalLibrary_Ch(const cta::admin::AdminCmd &adminc
 {
    using namespace cta::admin;
 
-   auto &name    = m_option_str.at(OptionString::LOGICAL_LIBRARY);
-   auto &comment = m_option_str.at(OptionString::COMMENT);
+   auto &name    = getRequired(OptionString::LOGICAL_LIBRARY);
+   auto &comment = getRequired(OptionString::COMMENT);
 
    m_catalogue.modifyLogicalLibraryComment(m_cliIdentity, name, comment);
 
@@ -1125,7 +1125,7 @@ void RequestMessage::processLogicalLibrary_Rm(const cta::admin::AdminCmd &adminc
 {
    using namespace cta::admin;
 
-   auto &name = m_option_str.at(OptionString::LOGICAL_LIBRARY);
+   auto &name = getRequired(OptionString::LOGICAL_LIBRARY);
 
    m_catalogue.deleteLogicalLibrary(name);
 
@@ -1169,13 +1169,13 @@ void RequestMessage::processMountPolicy_Add(const cta::admin::AdminCmd &admincmd
 {
    using namespace cta::admin;
 
-   auto &group                 = m_option_str.at   (OptionString::MOUNT_POLICY);
-   auto &archivepriority       = m_option_uint64.at(OptionUInt64::ARCHIVE_PRIORITY);
-   auto &minarchiverequestage  = m_option_uint64.at(OptionUInt64::MIN_ARCHIVE_REQUEST_AGE);
-   auto &retrievepriority      = m_option_uint64.at(OptionUInt64::RETRIEVE_PRIORITY);
-   auto &minretrieverequestage = m_option_uint64.at(OptionUInt64::MIN_RETRIEVE_REQUEST_AGE);
-   auto &maxdrivesallowed      = m_option_uint64.at(OptionUInt64::MAX_DRIVES_ALLOWED);
-   auto &comment               = m_option_str.at   (OptionString::COMMENT);
+   auto &group                 = getRequired(OptionString::MOUNT_POLICY);
+   auto &archivepriority       = getRequired(OptionUInt64::ARCHIVE_PRIORITY);
+   auto &minarchiverequestage  = getRequired(OptionUInt64::MIN_ARCHIVE_REQUEST_AGE);
+   auto &retrievepriority      = getRequired(OptionUInt64::RETRIEVE_PRIORITY);
+   auto &minretrieverequestage = getRequired(OptionUInt64::MIN_RETRIEVE_REQUEST_AGE);
+   auto &maxdrivesallowed      = getRequired(OptionUInt64::MAX_DRIVES_ALLOWED);
+   auto &comment               = getRequired(OptionString::COMMENT);
 
    m_catalogue.createMountPolicy(m_cliIdentity, group, archivepriority, minarchiverequestage, retrievepriority,
                                  minretrieverequestage, maxdrivesallowed, comment);
@@ -1189,14 +1189,14 @@ void RequestMessage::processMountPolicy_Ch(const cta::admin::AdminCmd &admincmd,
 {
    using namespace cta::admin;
 
-   auto &group = m_option_str.at(OptionString::MOUNT_POLICY);
+   auto &group = getRequired(OptionString::MOUNT_POLICY);
 
-   auto archivepriority       = getOptional(OptionUInt64::ARCHIVE_PRIORITY, m_option_uint64);
-   auto minarchiverequestage  = getOptional(OptionUInt64::MIN_ARCHIVE_REQUEST_AGE, m_option_uint64);
-   auto retrievepriority      = getOptional(OptionUInt64::RETRIEVE_PRIORITY, m_option_uint64);
-   auto minretrieverequestage = getOptional(OptionUInt64::MIN_RETRIEVE_REQUEST_AGE, m_option_uint64);
-   auto maxdrivesallowed      = getOptional(OptionUInt64::MAX_DRIVES_ALLOWED, m_option_uint64);
-   auto comment               = getOptional(OptionString::COMMENT, m_option_str);
+   auto archivepriority       = getOptional(OptionUInt64::ARCHIVE_PRIORITY);
+   auto minarchiverequestage  = getOptional(OptionUInt64::MIN_ARCHIVE_REQUEST_AGE);
+   auto retrievepriority      = getOptional(OptionUInt64::RETRIEVE_PRIORITY);
+   auto minretrieverequestage = getOptional(OptionUInt64::MIN_RETRIEVE_REQUEST_AGE);
+   auto maxdrivesallowed      = getOptional(OptionUInt64::MAX_DRIVES_ALLOWED);
+   auto comment               = getOptional(OptionString::COMMENT);
 
    if(archivepriority) {
       m_catalogue.modifyMountPolicyArchivePriority(m_cliIdentity, group, archivepriority.value());
@@ -1226,7 +1226,7 @@ void RequestMessage::processMountPolicy_Rm(const cta::admin::AdminCmd &admincmd,
 {
    using namespace cta::admin;
 
-   auto &group = m_option_str.at(OptionString::MOUNT_POLICY);
+   auto &group = getRequired(OptionString::MOUNT_POLICY);
 
    m_catalogue.deleteMountPolicy(group);
 
@@ -1276,10 +1276,8 @@ void RequestMessage::processRepack_Add(const cta::admin::AdminCmd &admincmd, cta
 {
    using namespace cta::admin;
 
-   std::stringstream cmdlineOutput;
-
-   auto &vid = m_option_str.at(OptionString::VID);
-   auto  tag = getOptional(OptionString::TAG, m_option_str);
+   auto &vid = getRequired(OptionString::VID);
+   auto  tag = getOptional(OptionString::TAG);
 
    cta::common::dataStructures::RepackType type;
 
@@ -1295,7 +1293,6 @@ void RequestMessage::processRepack_Add(const cta::admin::AdminCmd &admincmd, cta
 
    m_scheduler.queueRepack(m_cliIdentity, vid, tag, type);
 
-   response.set_message_txt(cmdlineOutput.str());
    response.set_type(cta::xrd::Response::RSP_SUCCESS);
 }
 
@@ -1305,7 +1302,7 @@ void RequestMessage::processRepack_Rm(const cta::admin::AdminCmd &admincmd, cta:
 {
    using namespace cta::admin;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    m_scheduler.cancelRepack(m_cliIdentity, vid);
 
@@ -1322,7 +1319,7 @@ void RequestMessage::processRepack_Ls(const cta::admin::AdminCmd &admincmd, cta:
 
    std::list<cta::common::dataStructures::RepackInfo> list;
 
-   auto vid = getOptional(OptionString::VID, m_option_str);
+   auto vid = getOptional(OptionString::VID);
 
    if(!vid) {      
       list = m_scheduler.getRepacks(m_cliIdentity);
@@ -1376,7 +1373,7 @@ void RequestMessage::processRepack_Err(const cta::admin::AdminCmd &admincmd, cta
 
    std::stringstream cmdlineOutput;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    cta::common::dataStructures::RepackInfo info = m_scheduler.getRepack(m_cliIdentity, vid);
 
@@ -1404,10 +1401,10 @@ void RequestMessage::processRequesterMountRule_Add(const cta::admin::AdminCmd &a
 {
    using namespace cta::admin;
 
-   auto &mountpolicy = m_option_str.at(OptionString::MOUNT_POLICY);
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
-   auto &comment     = m_option_str.at(OptionString::COMMENT);
+   auto &mountpolicy = getRequired(OptionString::MOUNT_POLICY);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
+   auto &comment     = getRequired(OptionString::COMMENT);
 
    m_catalogue.createRequesterMountRule(m_cliIdentity, mountpolicy, in, name, comment);
 
@@ -1420,10 +1417,10 @@ void RequestMessage::processRequesterMountRule_Ch(const cta::admin::AdminCmd &ad
 {
    using namespace cta::admin;
 
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
-   auto  comment     = getOptional(OptionString::COMMENT, m_option_str);
-   auto  mountpolicy = getOptional(OptionString::MOUNT_POLICY, m_option_str);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
+   auto  comment     = getOptional(OptionString::COMMENT);
+   auto  mountpolicy = getOptional(OptionString::MOUNT_POLICY);
 
    if(comment) {
       m_catalogue.modifyRequesteMountRuleComment(m_cliIdentity, in, name, comment.value());
@@ -1441,8 +1438,8 @@ void RequestMessage::processRequesterMountRule_Rm(const cta::admin::AdminCmd &ad
 {
    using namespace cta::admin;
 
-   auto &in          = m_option_str.at(OptionString::INSTANCE);
-   auto &name        = m_option_str.at(OptionString::USERNAME);
+   auto &in          = getRequired(OptionString::INSTANCE);
+   auto &name        = getRequired(OptionString::USERNAME);
 
    m_catalogue.deleteRequesterMountRule(in, name);
 
@@ -1488,7 +1485,7 @@ void RequestMessage::processShrink(const cta::admin::AdminCmd &admincmd, cta::xr
 {
    using namespace cta::admin;
 
-   auto &tapepool = m_option_str.at(OptionString::TAPE_POOL);
+   auto &tapepool = getRequired(OptionString::TAPE_POOL);
 
    m_scheduler.shrink(m_cliIdentity, tapepool);
 
@@ -1568,10 +1565,10 @@ void RequestMessage::processStorageClass_Add(const cta::admin::AdminCmd &admincm
 
    common::dataStructures::StorageClass storageClass;
 
-   storageClass.diskInstance = m_option_str.at   (OptionString::INSTANCE);
-   storageClass.name         = m_option_str.at   (OptionString::STORAGE_CLASS);
-   storageClass.nbCopies     = m_option_uint64.at(OptionUInt64::COPY_NUMBER);
-   storageClass.comment      = m_option_str.at   (OptionString::COMMENT);
+   storageClass.diskInstance = getRequired(OptionString::INSTANCE);
+   storageClass.name         = getRequired(OptionString::STORAGE_CLASS);
+   storageClass.nbCopies     = getRequired(OptionUInt64::COPY_NUMBER);
+   storageClass.comment      = getRequired(OptionString::COMMENT);
 
    m_catalogue.createStorageClass(m_cliIdentity, storageClass);
 
@@ -1584,11 +1581,11 @@ void RequestMessage::processStorageClass_Ch(const cta::admin::AdminCmd &admincmd
 {
    using namespace cta::admin;
 
-   auto &in  = m_option_str.at(OptionString::INSTANCE);
-   auto &scn = m_option_str.at(OptionString::STORAGE_CLASS);
+   auto &in  = getRequired(OptionString::INSTANCE);
+   auto &scn = getRequired(OptionString::STORAGE_CLASS);
 
-   auto comment = getOptional(OptionString::COMMENT, m_option_str);
-   auto cn      = getOptional(OptionUInt64::COPY_NUMBER, m_option_uint64);
+   auto comment = getOptional(OptionString::COMMENT);
+   auto cn      = getOptional(OptionUInt64::COPY_NUMBER);
 
    if(comment) {
       m_catalogue.modifyStorageClassComment(m_cliIdentity, in, scn, comment.value());
@@ -1606,8 +1603,8 @@ void RequestMessage::processStorageClass_Rm(const cta::admin::AdminCmd &admincmd
 {
    using namespace cta::admin;
 
-   auto &in  = m_option_str.at(OptionString::INSTANCE);
-   auto &scn = m_option_str.at(OptionString::STORAGE_CLASS);
+   auto &in  = getRequired(OptionString::INSTANCE);
+   auto &scn = getRequired(OptionString::STORAGE_CLASS);
 
    m_catalogue.deleteStorageClass(in, scn);
 
@@ -1653,13 +1650,13 @@ void RequestMessage::processTape_Add(const cta::admin::AdminCmd &admincmd, cta::
 {
    using namespace cta::admin;
 
-   auto &vid            = m_option_str.at(OptionString::VID);
-   auto &logicallibrary = m_option_str.at(OptionString::LOGICAL_LIBRARY);
-   auto &tapepool       = m_option_str.at(OptionString::TAPE_POOL);
-   auto &capacity       = m_option_uint64.at(OptionUInt64::CAPACITY);
-   auto &disabled       = m_option_bool.at(OptionBoolean::DISABLED);
-   auto &full           = m_option_bool.at(OptionBoolean::FULL);
-   auto  comment        = getOptional(OptionString::COMMENT, m_option_str);
+   auto &vid            = getRequired(OptionString::VID);
+   auto &logicallibrary = getRequired(OptionString::LOGICAL_LIBRARY);
+   auto &tapepool       = getRequired(OptionString::TAPE_POOL);
+   auto &capacity       = getRequired(OptionUInt64::CAPACITY);
+   auto &disabled       = getRequired(OptionBoolean::DISABLED);
+   auto &full           = getRequired(OptionBoolean::FULL);
+   auto  comment        = getOptional(OptionString::COMMENT);
 
    m_catalogue.createTape(m_cliIdentity, vid, logicallibrary, tapepool, capacity, disabled, full, comment ? comment.value() : "-");
 
@@ -1672,15 +1669,15 @@ void RequestMessage::processTape_Ch(const cta::admin::AdminCmd &admincmd, cta::x
 {
    using namespace cta::admin;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
-   auto logicallibrary = getOptional(OptionString::LOGICAL_LIBRARY, m_option_str);
-   auto tapepool       = getOptional(OptionString::TAPE_POOL, m_option_str);
-   auto capacity       = getOptional(OptionUInt64::CAPACITY, m_option_uint64);
-   auto comment        = getOptional(OptionString::COMMENT, m_option_str);
-   auto encryptionkey  = getOptional(OptionString::ENCRYPTION_KEY, m_option_str);
-   auto disabled       = getOptional(OptionBoolean::DISABLED, m_option_bool);
-   auto full           = getOptional(OptionBoolean::FULL, m_option_bool);
+   auto logicallibrary = getOptional(OptionString::LOGICAL_LIBRARY);
+   auto tapepool       = getOptional(OptionString::TAPE_POOL);
+   auto capacity       = getOptional(OptionUInt64::CAPACITY);
+   auto comment        = getOptional(OptionString::COMMENT);
+   auto encryptionkey  = getOptional(OptionString::ENCRYPTION_KEY);
+   auto disabled       = getOptional(OptionBoolean::DISABLED);
+   auto full           = getOptional(OptionBoolean::FULL);
 
    if(logicallibrary) {
       m_catalogue.modifyTapeLogicalLibraryName(m_cliIdentity, vid, logicallibrary.value());
@@ -1713,7 +1710,7 @@ void RequestMessage::processTape_Rm(const cta::admin::AdminCmd &admincmd, cta::x
 {
    using namespace cta::admin;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    m_catalogue.deleteTape(vid);
 
@@ -1726,7 +1723,7 @@ void RequestMessage::processTape_Reclaim(const cta::admin::AdminCmd &admincmd, c
 {
    using namespace cta::admin;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    m_catalogue.reclaimTape(m_cliIdentity, vid);
 
@@ -1749,13 +1746,13 @@ void RequestMessage::processTape_Ls(const cta::admin::AdminCmd &admincmd, cta::x
 
       // Get the search criteria from the optional options
 
-      searchCriteria.disabled        = getOptional(OptionBoolean::DISABLED,       m_option_bool,   &has_any);
-      searchCriteria.full            = getOptional(OptionBoolean::FULL,           m_option_bool,   &has_any);
-      searchCriteria.lbp             = getOptional(OptionBoolean::LBP,            m_option_bool,   &has_any);
-      searchCriteria.capacityInBytes = getOptional(OptionUInt64::CAPACITY,        m_option_uint64, &has_any);
-      searchCriteria.logicalLibrary  = getOptional(OptionString::LOGICAL_LIBRARY, m_option_str,    &has_any);
-      searchCriteria.tapePool        = getOptional(OptionString::TAPE_POOL,       m_option_str,    &has_any);
-      searchCriteria.vid             = getOptional(OptionString::VID,             m_option_str,    &has_any);
+      searchCriteria.disabled        = getOptional(OptionBoolean::DISABLED,       &has_any);
+      searchCriteria.full            = getOptional(OptionBoolean::FULL,           &has_any);
+      searchCriteria.lbp             = getOptional(OptionBoolean::LBP,            &has_any);
+      searchCriteria.capacityInBytes = getOptional(OptionUInt64::CAPACITY,        &has_any);
+      searchCriteria.logicalLibrary  = getOptional(OptionString::LOGICAL_LIBRARY, &has_any);
+      searchCriteria.tapePool        = getOptional(OptionString::TAPE_POOL,       &has_any);
+      searchCriteria.vid             = getOptional(OptionString::VID,             &has_any);
 
       if(!has_any) {
          throw cta::exception::UserError("Must specify at least one search option, or --all");
@@ -1827,11 +1824,11 @@ void RequestMessage::processTape_Label(const cta::admin::AdminCmd &admincmd, cta
 {
    using namespace cta::admin;
 
-   auto &vid   = m_option_str.at(OptionString::VID);
-   auto  force = getOptional(OptionBoolean::FORCE, m_option_bool);
-   auto  lbp   = getOptional(OptionBoolean::LBP, m_option_bool);
+   auto &vid   = getRequired(OptionString::VID);
+   auto  force = getOptional(OptionBoolean::FORCE);
+   auto  lbp   = getOptional(OptionBoolean::LBP);
    // If the tag option is not specified, the tag will be set to "-", which means no tagging
-   auto  tag   = getOptional(OptionString::TAG, m_option_str);
+   auto  tag   = getOptional(OptionString::TAG);
 
    m_scheduler.queueLabel(m_cliIdentity, vid,
                           force ? force.value() : false,
@@ -1847,10 +1844,10 @@ void RequestMessage::processTapePool_Add(const cta::admin::AdminCmd &admincmd, c
 {
    using namespace cta::admin;
 
-   auto &name      = m_option_str.at(OptionString::TAPE_POOL);
-   auto &ptn       = m_option_uint64.at(OptionUInt64::PARTIAL_TAPES_NUMBER);
-   auto &comment   = m_option_str.at(OptionString::COMMENT);
-   auto &encrypted = m_option_bool.at(OptionBoolean::ENCRYPTED);
+   auto &name      = getRequired(OptionString::TAPE_POOL);
+   auto &ptn       = getRequired(OptionUInt64::PARTIAL_TAPES_NUMBER);
+   auto &comment   = getRequired(OptionString::COMMENT);
+   auto &encrypted = getRequired(OptionBoolean::ENCRYPTED);
 
    m_catalogue.createTapePool(m_cliIdentity, name, ptn, encrypted, comment);
 
@@ -1863,10 +1860,10 @@ void RequestMessage::processTapePool_Ch(const cta::admin::AdminCmd &admincmd, ct
 {
    using namespace cta::admin;
 
-   auto &name      = m_option_str.at(OptionString::TAPE_POOL);
-   auto  ptn       = getOptional(OptionUInt64::PARTIAL_TAPES_NUMBER, m_option_uint64);
-   auto  comment   = getOptional(OptionString::COMMENT, m_option_str);
-   auto  encrypted = getOptional(OptionBoolean::ENCRYPTED, m_option_bool);
+   auto &name      = getRequired(OptionString::TAPE_POOL);
+   auto  ptn       = getOptional(OptionUInt64::PARTIAL_TAPES_NUMBER);
+   auto  comment   = getOptional(OptionString::COMMENT);
+   auto  encrypted = getOptional(OptionBoolean::ENCRYPTED);
 
    if(comment) {
       m_catalogue.modifyTapePoolComment(m_cliIdentity, name, comment.value());
@@ -1887,7 +1884,7 @@ void RequestMessage::processTapePool_Rm(const cta::admin::AdminCmd &admincmd, ct
 {
    using namespace cta::admin;
 
-   auto &name = m_option_str.at(OptionString::TAPE_POOL);
+   auto &name = getRequired(OptionString::TAPE_POOL);
 
    m_catalogue.deleteTapePool(name);
 
@@ -1935,15 +1932,15 @@ void RequestMessage::processTest_Read(const cta::admin::AdminCmd &admincmd, cta:
 
    std::stringstream cmdlineOutput;
 
-   auto &drive  = m_option_str.at(OptionString::DRIVE);
-   auto &vid    = m_option_str.at(OptionString::VID);
-   auto &output = m_option_str.at(OptionString::OUTPUT);
+   auto &drive  = getRequired(OptionString::DRIVE);
+   auto &vid    = getRequired(OptionString::VID);
+   auto &output = getRequired(OptionString::OUTPUT);
 
-   auto &firstfseq = m_option_uint64.at(OptionUInt64::FIRST_FSEQ);
-   auto &lastfseq  = m_option_uint64.at(OptionUInt64::LAST_FSEQ);
+   auto &firstfseq = getRequired(OptionUInt64::FIRST_FSEQ);
+   auto &lastfseq  = getRequired(OptionUInt64::LAST_FSEQ);
 
    bool checkchecksum = has_flag(OptionBoolean::CHECK_CHECKSUM);
-   auto tag = getOptional(OptionString::TAG, m_option_str);
+   auto tag = getOptional(OptionString::TAG);
 
    cta::common::dataStructures::ReadTestResult res = m_scheduler.readTest(
       m_cliIdentity, drive, vid, firstfseq, lastfseq, checkchecksum, output, tag ? tag.value() : "-"
@@ -1990,11 +1987,11 @@ void RequestMessage::processTest_Write(const cta::admin::AdminCmd &admincmd, cta
 
    std::stringstream cmdlineOutput;
 
-   auto &drive = m_option_str.at(OptionString::DRIVE);
-   auto &vid   = m_option_str.at(OptionString::VID);
-   auto &file  = m_option_str.at(OptionString::FILENAME);
+   auto &drive = getRequired(OptionString::DRIVE);
+   auto &vid   = getRequired(OptionString::VID);
+   auto &file  = getRequired(OptionString::FILENAME);
 
-   auto tag = getOptional(OptionString::TAG, m_option_str);
+   auto tag = getOptional(OptionString::TAG);
 
    cta::common::dataStructures::WriteTestResult res = m_scheduler.writeTest(
       m_cliIdentity, drive, vid, file, tag ? tag.value() : "-"
@@ -2043,12 +2040,12 @@ void RequestMessage::processTest_WriteAuto(const cta::admin::AdminCmd &admincmd,
 
    std::stringstream cmdlineOutput;
 
-   auto &drive  = m_option_str.at(OptionString::DRIVE);
-   auto &vid    = m_option_str.at(OptionString::VID);
-   auto &number = m_option_uint64.at(OptionUInt64::NUMBER_OF_FILES);
-   auto &size   = m_option_uint64.at(OptionUInt64::FILE_SIZE);
-   auto &input  = m_option_str.at(OptionString::INPUT);
-   auto  tag    = getOptional(OptionString::TAG, m_option_str);
+   auto &drive  = getRequired(OptionString::DRIVE);
+   auto &vid    = getRequired(OptionString::VID);
+   auto &number = getRequired(OptionUInt64::NUMBER_OF_FILES);
+   auto &size   = getRequired(OptionUInt64::FILE_SIZE);
+   auto &input  = getRequired(OptionString::INPUT);
+   auto  tag    = getOptional(OptionString::TAG);
 
    cta::common::dataStructures::TestSourceType type;
 
@@ -2102,9 +2099,9 @@ void RequestMessage::processVerify_Add(const cta::admin::AdminCmd &admincmd, cta
 {
    using namespace cta::admin;
 
-   auto &vid    = m_option_str.at(OptionString::VID);
-   auto  number = getOptional(OptionUInt64::NUMBER_OF_FILES, m_option_uint64);
-   auto  tag    = getOptional(OptionString::TAG, m_option_str);
+   auto &vid    = getRequired(OptionString::VID);
+   auto  number = getOptional(OptionUInt64::NUMBER_OF_FILES);
+   auto  tag    = getOptional(OptionString::TAG);
 
    m_scheduler.queueVerify(m_cliIdentity, vid, tag, number);
 
@@ -2117,7 +2114,7 @@ void RequestMessage::processVerify_Rm(const cta::admin::AdminCmd &admincmd, cta:
 {
    using namespace cta::admin;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    m_scheduler.cancelVerify(m_cliIdentity, vid);
 
@@ -2132,7 +2129,7 @@ void RequestMessage::processVerify_Ls(const cta::admin::AdminCmd &admincmd, cta:
 
    std::stringstream cmdlineOutput;
 
-   auto vid = getOptional(OptionString::VID, m_option_str);
+   auto vid = getOptional(OptionString::VID);
 
    std::list<cta::common::dataStructures::VerifyInfo> list;
 
@@ -2179,7 +2176,7 @@ void RequestMessage::processVerify_Err(const cta::admin::AdminCmd &admincmd, cta
 
    std::stringstream cmdlineOutput;
 
-   auto &vid = m_option_str.at(OptionString::VID);
+   auto &vid = getRequired(OptionString::VID);
 
    cta::common::dataStructures::VerifyInfo info = m_scheduler.getVerify(m_cliIdentity, vid);
 
@@ -2226,7 +2223,7 @@ void RequestMessage::importOptions(const cta::admin::AdminCmd &admincmd)
 
 
 
-std::string RequestMessage::formatResponse(const std::vector<std::vector<std::string>> &responseTable)
+std::string RequestMessage::formatResponse(const std::vector<std::vector<std::string>> &responseTable) const
 {
    bool has_header = has_flag(cta::admin::OptionBoolean::SHOW_HEADER);
 
@@ -2259,7 +2256,7 @@ std::string RequestMessage::formatResponse(const std::vector<std::vector<std::st
 
 void RequestMessage::addLogInfoToResponseRow(std::vector<std::string> &responseRow,
                                              const cta::common::dataStructures::EntryLog &creationLog,
-                                             const cta::common::dataStructures::EntryLog &lastModificationLog)
+                                             const cta::common::dataStructures::EntryLog &lastModificationLog) const
 {
    responseRow.push_back(creationLog.username);
    responseRow.push_back(creationLog.host);
diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.hpp b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
index 38c404c531fed804045dc88bd2aa7fb0eeb663aa..23772e35b4f3810c8ea89d380b9acf434819b89c 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.hpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
@@ -139,6 +139,18 @@ private:
     */
    void importOptions(const cta::admin::AdminCmd &admincmd);
 
+   /*!
+    * Get a required option
+    */
+   const std::string &getRequired(cta::admin::OptionString::Key key) const {
+      return m_option_str.at(key);
+   }
+   const uint64_t &getRequired(cta::admin::OptionUInt64::Key key) const {
+      return m_option_uint64.at(key);
+   }
+   const bool &getRequired(cta::admin::OptionBoolean::Key key) const {
+      return m_option_bool.at(key);
+   }
 
    /*!
     * Get an optional option
@@ -153,7 +165,7 @@ private:
     * @returns       value of the option if it exists, an object of type nullopt_t if it does not
     */
    template<typename K, typename V>
-   optional<V> getOptional(K key, const std::map<K,V> &options, bool *has_option = nullptr)
+   optional<V> getOptional(K key, const std::map<K,V> &options, bool *has_option) const
    {
       auto it = options.find(key);
 
@@ -165,10 +177,34 @@ private:
       }
    }
 
+   /*!
+    * Overloaded versions of getOptional
+    *
+    * These map the key type to the template specialization of <key,value> pairs
+    */
+   optional<std::string> getOptional(cta::admin::OptionString::Key key, bool *has_option = nullptr) const {
+      return getOptional(key, m_option_str, has_option);
+   }
+   optional<uint64_t> getOptional(cta::admin::OptionUInt64::Key key, bool *has_option = nullptr) const {
+      return getOptional(key, m_option_uint64, has_option);
+   }
+   optional<bool> getOptional(cta::admin::OptionBoolean::Key key, bool *has_option = nullptr) const {
+      return getOptional(key, m_option_bool, has_option);
+   }
+
    /*!
     * Check if an optional flag has been set
+    *
+    * This is a simpler version of getOptional for checking flags which are either present
+    * or not. In the case of flags, they should always have the value true if the flag is
+    * present, but we do a redundant check anyway.
+    *
+    * @param[in] option    Optional command line option
+    *
+    * @retval    true      The flag is present in the options map, and its value is true
+    * @retval    false     The flag is either not present or is present and set to false
     */
-   bool has_flag(cta::admin::OptionBoolean::Key option) {
+   bool has_flag(cta::admin::OptionBoolean::Key option) const {
       auto opt_it = m_option_bool.find(option);
       return opt_it != m_option_bool.end() && opt_it->second;
    }
@@ -180,7 +216,7 @@ private:
     *
     * @returns       the response string properly formatted in a table
     */
-   std::string formatResponse(const std::vector<std::vector<std::string>> &responseTable);
+   std::string formatResponse(const std::vector<std::vector<std::string>> &responseTable) const;
 
    /*!
     * Adds the creation log and the last modification log to the current response row
@@ -191,7 +227,7 @@ private:
     */
    void addLogInfoToResponseRow(std::vector<std::string> &responseRow,
                                 const cta::common::dataStructures::EntryLog &creationLog,
-                                const cta::common::dataStructures::EntryLog &lastModificationLog);
+                                const cta::common::dataStructures::EntryLog &lastModificationLog) const;
 
    // Member variables