diff --git a/middletier/CMakeLists.txt b/middletier/CMakeLists.txt
index 9457cb2780f94392def31fa0809f23a04285cdb2..8b75b44e5cac3734346f1041392556666e65c525 100644
--- a/middletier/CMakeLists.txt
+++ b/middletier/CMakeLists.txt
@@ -10,8 +10,11 @@ set (MIDDLE_TIER_LIB_SRC_FILES
   cta/ArchivalJobQueues.cpp
   cta/ArchivalJobState.cpp
   cta/ArchivalMount.cpp
+  cta/ArchivalRequest.cpp
   cta/ArchiveRoute.cpp
   cta/ArchiveRouteId.cpp
+  cta/ArchiveToDirRequest.cpp
+  cta/ArchiveToFileRequest.cpp
   cta/DirectoryEntry.cpp
   cta/DirectoryIterator.cpp
   cta/DiskException.cpp
@@ -29,6 +32,9 @@ set (MIDDLE_TIER_LIB_SRC_FILES
   cta/RetrievalJobQueues.cpp
   cta/RetrievalJobState.cpp
   cta/RetrievalMount.cpp
+  cta/RetrievalRequest.cpp
+  cta/RetrieveToDirRequest.cpp
+  cta/RetrieveToFileRequest.cpp
   cta/SecurityIdentity.cpp
   cta/SqliteDatabase.cpp
   cta/SqliteMiddleTierAdmin.cpp
@@ -38,6 +44,7 @@ set (MIDDLE_TIER_LIB_SRC_FILES
   cta/TapeException.cpp
   cta/TapePool.cpp
   cta/UserIdentity.cpp
+  cta/UserRequest.cpp
   cta/Utils.cpp
   cta/Vfs.cpp)
 
diff --git a/middletier/cta/ArchivalRequest.cpp b/middletier/cta/ArchivalRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0f45ae566496898907379fc16d390c33e97e7fb9
--- /dev/null
+++ b/middletier/cta/ArchivalRequest.cpp
@@ -0,0 +1,36 @@
+#include "cta/ArchivalRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchivalRequest::ArchivalRequest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::ArchivalRequest::~ArchivalRequest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchivalRequest::ArchivalRequest(const std::string &tapePoolName,
+  const uint64_t priority):
+  m_tapePoolName(tapePoolName),
+  m_priority(priority) {
+}
+
+//------------------------------------------------------------------------------
+// getTapePoolName
+//------------------------------------------------------------------------------
+const std::string &cta::ArchivalRequest::getTapePoolName() const throw() {
+  return m_tapePoolName;
+}
+
+//------------------------------------------------------------------------------
+// getTapePoolName
+//------------------------------------------------------------------------------
+uint64_t cta::ArchivalRequest::getPriority() const throw() {
+  return m_priority;
+}
diff --git a/middletier/cta/ArchivalRequest.hpp b/middletier/cta/ArchivalRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ab2f903ca29506bdf013f8b33f2f15af3db117ff
--- /dev/null
+++ b/middletier/cta/ArchivalRequest.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "cta/UserRequest.hpp"
+
+#include <stdint.h>
+
+namespace cta {
+
+/**
+ * Abstract class representing a user request to archive some data.
+ */
+class ArchivalRequest: public UserRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  ArchivalRequest();
+
+  /**
+   * Destructor.
+   */
+  virtual ~ArchivalRequest() throw() = 0;
+
+  /**
+   * Constructor.
+   *
+   * @param tapePoolName The name of the destination tape pool.
+   * @param priority The priority of the request.
+   */
+  ArchivalRequest(const std::string &tapePoolName, const uint64_t priority);
+
+  /**
+   * Returns the name of the destination tape pool.
+   *
+   * @return The name of the destination tape pool.
+   */
+  const std::string &getTapePoolName() const throw();
+
+  /**
+   * Returns the priority of the request.
+   *
+   * @return The priority of the request.
+   */
+  uint64_t getPriority() const throw();
+
+private:
+
+  /**
+   * The name of the destination tape pool.
+   */
+  std::string m_tapePoolName;
+
+  /**
+   * The priority of the request.
+   */
+  uint64_t m_priority;
+
+}; // class ArchivalRequest
+
+} // namespace cta
diff --git a/middletier/cta/ArchivalRequestHandler.hpp b/middletier/cta/ArchivalRequestHandler.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3c49289f647fa96ffd07755186e2f597e20907ce
--- /dev/null
+++ b/middletier/cta/ArchivalRequestHandler.hpp
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace cta {
+
+class ArchivalRequestHandler {
+public:
+  void createArchivalRequest();
+}; // class ArchivalRequestHandler
+
+} // namespace cta
diff --git a/middletier/cta/ArchiveToDirRequest.cpp b/middletier/cta/ArchiveToDirRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..19928afbf06dc4b11600cdb2d2d92cf56bc73f01
--- /dev/null
+++ b/middletier/cta/ArchiveToDirRequest.cpp
@@ -0,0 +1,36 @@
+#include "cta/ArchiveToDirRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchiveToDirRquest::ArchiveToDirRquest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::ArchiveToDirRquest::~ArchiveToDirRquest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchiveToDirRquest::ArchiveToDirRquest(const std::string &archiveDir):
+  m_archiveDir(archiveDir) {
+}
+
+//------------------------------------------------------------------------------
+// getArchiveToFileRequests
+//------------------------------------------------------------------------------
+const std::list<cta::ArchiveToFileRequest> &cta::ArchiveToDirRquest::
+  getArchiveToFileRequests() const throw() {
+  return m_archiveToFileRequests;
+}
+
+//------------------------------------------------------------------------------
+// getArchiveToFileRequests
+//------------------------------------------------------------------------------
+std::list<cta::ArchiveToFileRequest> &cta::ArchiveToDirRquest::
+  getArchiveToFileRequests() throw() {
+  return m_archiveToFileRequests;
+}
diff --git a/middletier/cta/ArchiveToDirRequest.hpp b/middletier/cta/ArchiveToDirRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..327c60df02c85afe48e20f078b95af6ee5eb0aa9
--- /dev/null
+++ b/middletier/cta/ArchiveToDirRequest.hpp
@@ -0,0 +1,76 @@
+#pragma once
+
+#include "cta/ArchivalRequest.hpp"
+#include "cta/ArchiveToFileRequest.hpp"
+
+#include <list>
+#include <string>
+
+namespace cta {
+
+/**
+ * Class representing a user request to archive one or more remote files to an
+ * archive directory.
+ */
+class ArchiveToDirRquest: public ArchivalRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  ArchiveToDirRquest();
+
+  /**
+   * Destructor.
+   */
+  ~ArchiveToDirRquest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param archiveDir The full path of the destination archive directory.
+   */
+  ArchiveToDirRquest(const std::string &archiveDir);
+
+  /**
+   * Returns the full path of the destination archive directory.
+   *
+   * @return The full path of the destination archive directory.
+   */
+  const std::string &getArchiveDir() const throw();
+
+  /**
+   * Returns the list of the individual archive to individual file requests
+   * that make up this archive to directory request.
+   *
+   * @return The list of the individual archive to file requests that make up
+   * this archive to directory request.
+   */
+  const std::list<ArchiveToFileRequest> &getArchiveToFileRequests() const
+    throw();
+
+  /**
+   * Returns the list of the individual archive to file requests that make up
+   * this archive to directory request.
+   *
+   * @return The list of the individual archive to file requests that make up
+   * this archive to directory request.
+   */
+  std::list<ArchiveToFileRequest> &getArchiveToFileRequests() throw();
+
+private:
+
+  /**
+   * The full path of the destination archive directory.
+   */
+  std::string m_archiveDir;
+
+  /**
+   * The list of the individual archive to file requests that make up this
+   * archive to directory request.
+   */
+  std::list<ArchiveToFileRequest> m_archiveToFileRequests;
+
+}; // class ArchiveToDirRquest
+
+} // namespace cta
diff --git a/middletier/cta/ArchiveToFileRequest.cpp b/middletier/cta/ArchiveToFileRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8ebfe28df175f4d815458205e4f56c1ab0b78b10
--- /dev/null
+++ b/middletier/cta/ArchiveToFileRequest.cpp
@@ -0,0 +1,44 @@
+#include "cta/ArchiveToFileRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchiveToFileRequest::ArchiveToFileRequest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::ArchiveToFileRequest::~ArchiveToFileRequest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::ArchiveToFileRequest::ArchiveToFileRequest(const std::string &remoteFile,
+  const std::string &archiveFile, const uint32_t nbCopies):
+  m_remoteFile(remoteFile),
+  m_archiveFile(archiveFile),
+  m_nbCopies(nbCopies) {
+}
+
+//------------------------------------------------------------------------------
+// getRemoteFile
+//------------------------------------------------------------------------------
+const std::string &cta::ArchiveToFileRequest::getRemoteFile() const throw() {
+  return m_remoteFile;
+}
+
+//------------------------------------------------------------------------------
+// getArchiveFile
+//------------------------------------------------------------------------------
+const std::string &cta::ArchiveToFileRequest::getArchiveFile() const throw() {
+ return m_archiveFile;
+}
+
+//------------------------------------------------------------------------------
+// getNbCopies
+//------------------------------------------------------------------------------
+uint32_t cta::ArchiveToFileRequest::getNbCopies() const throw() {
+  return m_nbCopies;
+}
diff --git a/middletier/cta/ArchiveToFileRequest.hpp b/middletier/cta/ArchiveToFileRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..6c1d333cd1d3f61e138f4047aba794baa09f3168
--- /dev/null
+++ b/middletier/cta/ArchiveToFileRequest.hpp
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "cta/ArchivalRequest.hpp"
+
+#include <stdint.h>
+#include <string>
+
+namespace cta {
+
+/**
+ * Class representing a user request to archive to a single remote file to a
+ * single destination archive file.
+ */
+class ArchiveToFileRequest: public ArchivalRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  ArchiveToFileRequest();
+
+  /**
+   * Destructor.
+   */
+  ~ArchiveToFileRequest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param remoteFile The URL of the source remote file to be archived.
+   * @param archiveFile The full path of the destination archive file.
+   * @param nbCopies The number of archive copies to be created.
+   */
+  ArchiveToFileRequest(const std::string &remoteFile,
+    const std::string &archiveFile, const uint32_t nbCopies);
+
+  /**
+   * Returns the URL of the source remote file to be archived.
+   *
+   * @return The URL of the source remote file to be archived.
+   */
+  const std::string &getRemoteFile() const throw();
+
+  /**
+   * Returns the full path of the destination archive file.
+   *
+   * @return The full path of the destination archive file.
+   */
+  const std::string &getArchiveFile() const throw();
+
+  /**
+   * Returns the number of archive copies to be created.
+   *
+   * @return The number of archive copies to be created.
+   */
+  uint32_t getNbCopies() const throw();
+
+private:
+
+  /**
+   * The URL of the destination remote file to be archived.
+   */
+  std::string m_remoteFile;
+
+  /**
+   * The full path of the source archive file.
+   */
+  std::string m_archiveFile;
+
+  /**
+   * The number of archive copies to be created.
+   */
+  uint32_t m_nbCopies;
+
+}; // class ArchiveToFileRequest
+
+} // namespace cta
diff --git a/middletier/cta/RetrievalJobQueues.hpp b/middletier/cta/RetrievalJobQueues.hpp
index 2b4a6ff3b205df07e73e7b537d5505c1b384ce6b..31d6b347c43148be5d2eb459895b1f3d2042d99f 100644
--- a/middletier/cta/RetrievalJobQueues.hpp
+++ b/middletier/cta/RetrievalJobQueues.hpp
@@ -80,8 +80,8 @@ public:
    *
    * @param mountId The identifier of the mount.
    */
-  virtual std::list<RetrievalJob> getNextJobsForMount(const std::string &mountId)
-    = 0;
+  virtual std::list<RetrievalJob> getNextJobsForMount(
+    const std::string &mountId) = 0;
 
   /**
    * Requests this object to execute any time dependent and asynchronous logic.
diff --git a/middletier/cta/RetrievalRequest.cpp b/middletier/cta/RetrievalRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d5d6e1f4bdfc05bcfb66ebd260a0876044c9774d
--- /dev/null
+++ b/middletier/cta/RetrievalRequest.cpp
@@ -0,0 +1,27 @@
+#include "cta/RetrievalRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrievalRequest::RetrievalRequest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::RetrievalRequest::~RetrievalRequest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrievalRequest::RetrievalRequest(const uint64_t priority):
+  m_priority(priority) {
+}
+
+//------------------------------------------------------------------------------
+// getPriority
+//------------------------------------------------------------------------------
+uint64_t cta::RetrievalRequest::getPriority() const throw() {
+  return m_priority;
+}
diff --git a/middletier/cta/RetrievalRequest.hpp b/middletier/cta/RetrievalRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..89e5313c144a5f8d33039de2fb7f473a2bfe7ba8
--- /dev/null
+++ b/middletier/cta/RetrievalRequest.hpp
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "cta/UserRequest.hpp"
+
+#include <stdint.h>
+
+namespace cta {
+
+/**
+ * Abstract class representing a user request to retrieve some data.
+ */
+class RetrievalRequest: public UserRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  RetrievalRequest();
+
+  /**
+   * Destructor.
+   */
+  virtual ~RetrievalRequest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param priority The priority of the request.
+   */
+  RetrievalRequest(const uint64_t priority);
+
+  /**
+   * Returns the priority of the request.
+   *
+   * @return The priority of the request.
+   */
+  uint64_t getPriority() const throw();
+
+private:
+
+  /**
+   * The priority of the request.
+   */
+  uint64_t m_priority;
+
+}; // class RetrievalRequest
+
+} // namespace cta
diff --git a/middletier/cta/RetrieveToDirRequest.cpp b/middletier/cta/RetrieveToDirRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..38eefc7e0721613997718067a915f88aef5c5dce
--- /dev/null
+++ b/middletier/cta/RetrieveToDirRequest.cpp
@@ -0,0 +1,43 @@
+#include "cta/RetrieveToDirRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrieveToDirRquest::RetrieveToDirRquest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::RetrieveToDirRquest::~RetrieveToDirRquest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrieveToDirRquest::RetrieveToDirRquest(const std::string &remoteDir):
+  m_remoteDir(remoteDir) {
+}
+
+//------------------------------------------------------------------------------
+// getRemoteDir
+//------------------------------------------------------------------------------
+const std::string &cta::RetrieveToDirRquest::getRemoteDir() const throw() {
+  return m_remoteDir;
+}
+
+//------------------------------------------------------------------------------
+// getRetrieveToFileRequests
+//------------------------------------------------------------------------------
+const std::list<cta::RetrieveToFileRequest> &cta::RetrieveToDirRquest::
+  getRetrieveToFileRequests() const throw() {
+  return m_retrieveToFileRequests;
+}
+
+//------------------------------------------------------------------------------
+// getRetrieveToFileRequests
+//------------------------------------------------------------------------------
+std::list<cta::RetrieveToFileRequest> &cta::RetrieveToDirRquest::
+  getRetrieveToFileRequests() throw() {
+  return m_retrieveToFileRequests;
+}
diff --git a/middletier/cta/RetrieveToDirRequest.hpp b/middletier/cta/RetrieveToDirRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..d8254ff771578d5dad347636511d404e73f00934
--- /dev/null
+++ b/middletier/cta/RetrieveToDirRequest.hpp
@@ -0,0 +1,76 @@
+#pragma once
+
+#include "cta/RetrievalRequest.hpp"
+#include "cta/RetrieveToFileRequest.hpp"
+
+#include <list>
+#include <string>
+
+namespace cta {
+
+/**
+ * Class representing a user request to retrieve one or more archived files to a
+ * remote directory.
+ */
+class RetrieveToDirRquest: public RetrievalRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  RetrieveToDirRquest();
+
+  /**
+   * Destructor.
+   */
+  ~RetrieveToDirRquest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param remoteDir The URL of the destination remote directory.
+   */
+  RetrieveToDirRquest(const std::string &remoteDir);
+
+  /**
+   * Returns the URL of the destination remote directory.
+   *
+   * @return The URL of the destination remote directory.
+   */
+  const std::string &getRemoteDir() const throw();
+
+  /**
+   * Returns the list of the individual retrieve to file requests that make up
+   * this retrieve to directory request.
+   *
+   * @return the list of the individual retrieve to file requests that make up
+   * this retrieve to directory request.
+   */
+  const std::list<RetrieveToFileRequest> &getRetrieveToFileRequests() const
+    throw();
+
+  /**
+   * Returns the list of the individual retrieve to file requests that make up
+   * this retrieve to directory request.
+   *
+   * @return the list of the individual retrieve to file requests that make up
+   * this retrieve to directory request.
+   */
+  std::list<RetrieveToFileRequest> &getRetrieveToFileRequests() throw();
+
+private:
+
+  /**
+   * The URL of the destination remote directory.
+   */
+  std::string m_remoteDir;
+
+  /**
+   * The list of the individual retrieve to file requests that make up this
+   * retrieve to directory request.
+   */
+  std::list<RetrieveToFileRequest> m_retrieveToFileRequests;
+
+}; // class RetrieveToDirRquest
+
+} // namespace cta
diff --git a/middletier/cta/RetrieveToFileRequest.cpp b/middletier/cta/RetrieveToFileRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..082c06e73d0dc84dd96de409fb528151923810e7
--- /dev/null
+++ b/middletier/cta/RetrieveToFileRequest.cpp
@@ -0,0 +1,36 @@
+#include "cta/RetrieveToFileRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrieveToFileRequest::RetrieveToFileRequest() {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::RetrieveToFileRequest::~RetrieveToFileRequest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RetrieveToFileRequest::RetrieveToFileRequest(const std::string &archiveFile,
+  const std::string &remoteFile):
+  m_archiveFile(archiveFile),
+  m_remoteFile(remoteFile) {
+}
+
+//------------------------------------------------------------------------------
+// getArchiveFile
+//------------------------------------------------------------------------------
+const std::string &cta::RetrieveToFileRequest::getArchiveFile() const throw() {
+  return m_archiveFile;
+}
+
+//------------------------------------------------------------------------------
+// getRemoteFile
+//------------------------------------------------------------------------------
+const std::string &cta::RetrieveToFileRequest::getRemoteFile() const throw() {
+  return m_remoteFile;
+}
diff --git a/middletier/cta/RetrieveToFileRequest.hpp b/middletier/cta/RetrieveToFileRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..429d50d9108a11264f3cf48a581a3e5bfa9244ab
--- /dev/null
+++ b/middletier/cta/RetrieveToFileRequest.hpp
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "cta/RetrievalRequest.hpp"
+
+#include <string>
+
+namespace cta {
+
+/**
+ * Class representing a user request to retrieve a single archived file to a
+ * single remote file.
+ */
+class RetrieveToFileRequest: public RetrievalRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  RetrieveToFileRequest();
+
+  /**
+   * Destructor.
+   */
+  ~RetrieveToFileRequest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param archiveFile The full path of the source archive file.
+   * @param remoteFile The URL of the destination remote file.
+   */
+  RetrieveToFileRequest(const std::string &archiveFile,
+    const std::string &remoteFile);
+
+  /**
+   * Returns the full path of the source archive file.
+   *
+   * @return The full path of the source archive file.
+   */
+  const std::string &getArchiveFile() const throw();
+
+  /**
+   * Returns the URL of the destination remote file.
+   *
+   * @return The URL of the destination remote file.
+   */
+  const std::string &getRemoteFile() const throw();
+
+private:
+
+  /**
+   * The full path of the source archive file.
+   */
+  std::string m_archiveFile;
+
+  /**
+   * The URL of the destination remote file.
+   */
+  std::string m_remoteFile;
+
+}; // class RetrieveToFileRequest
+
+} // namespace cta
diff --git a/middletier/cta/UserRequest.cpp b/middletier/cta/UserRequest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..231973a12ea6da376ec26f3e8c78fa9e62b3d058
--- /dev/null
+++ b/middletier/cta/UserRequest.cpp
@@ -0,0 +1,36 @@
+#include "cta/UserRequest.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::UserRequest::UserRequest() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::UserRequest::UserRequest(const std::string &id,
+  const SecurityIdentity &user):
+  m_id(id),
+  m_user(user) {
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::UserRequest::~UserRequest() throw() {
+}
+
+//------------------------------------------------------------------------------
+// getId
+//------------------------------------------------------------------------------
+const std::string &cta::UserRequest::getId() const throw() {
+  return m_id;
+}
+
+//------------------------------------------------------------------------------
+// getUser
+//------------------------------------------------------------------------------
+const cta::SecurityIdentity &cta::UserRequest::getUser() const throw() {
+  return m_user;
+}
diff --git a/middletier/cta/UserRequest.hpp b/middletier/cta/UserRequest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..bcc2db82892e6bc52ec453ae3eec47f70adcb94f
--- /dev/null
+++ b/middletier/cta/UserRequest.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "cta/SecurityIdentity.hpp"
+
+#include <string>
+
+namespace cta {
+
+/**
+ * Abstract class representing a user request.
+ */
+class UserRequest {
+public:
+
+  /**
+   * Constructor.
+   */
+  UserRequest();
+
+  /**
+   * Destructor.
+   */
+  virtual ~UserRequest() throw();
+
+  /**
+   * Constructor.
+   *
+   * @param id The identifier of the request.
+   * @param user The identity of the user who made the request.
+   */
+  UserRequest(const std::string &id, const SecurityIdentity &user);
+
+  /**
+   * Returns the identifier of the request.
+   *
+   * @return The identifier of the request.
+   */
+  const std::string &getId() const throw();
+
+  /**
+   * Returns the identity of the user who made the request.
+   *
+   * @return The identity of the user who made the request.
+   */
+  const SecurityIdentity &getUser() const throw();
+
+private:
+
+  /**
+   * The identifier of the request.
+   */
+  std::string m_id;
+
+  /**
+   * The identity of the user who made the request.
+   */
+  SecurityIdentity m_user;
+
+}; // class UserRequest
+
+} // namespace cta