diff --git a/Doxyfile b/Doxyfile
index 6988ed4a69b50c2474618eb69a07a1f91f9fd64d..d6e5c14d4cbc57335e0dbd3f7383c2f2abe813f8 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -568,7 +568,7 @@ WARN_LOGFILE           =
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  = cmdline common nameserver objectstore remotens scheduler tapeserver xroot_plugins
+INPUT                  = catalogue cmdline common nameserver objectstore remotens scheduler tapeserver xroot_plugins
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt
index 6549f1b1865dad0f7865d8e3a32fe1e3af3fcd47..f8c321d6b64ec3bf4d844c84e03f177145e57b3e 100644
--- a/catalogue/CMakeLists.txt
+++ b/catalogue/CMakeLists.txt
@@ -17,7 +17,8 @@ cmake_minimum_required (VERSION 2.6)
 
 set (CATALOGUE_LIB_SRC_FILES
   Catalogue.cpp
-  MockCatalogue.cpp)
+  MockCatalogue.cpp
+  SQLiteDatabase.cpp)
 
 add_library (ctacatalogue
   ${CATALOGUE_LIB_SRC_FILES})
diff --git a/catalogue/Catalogue.cpp b/catalogue/Catalogue.cpp
index 673a4f73d961f8b6a7dfb2ec338d39e4f8e2214a..6f88379318c7faa1ac6a73428a8c3aef7eb791f5 100644
--- a/catalogue/Catalogue.cpp
+++ b/catalogue/Catalogue.cpp
@@ -21,5 +21,5 @@
 //------------------------------------------------------------------------------
 // destructor
 //------------------------------------------------------------------------------
-cta::Catalogue::~Catalogue() {
+cta::catalogue::Catalogue::~Catalogue() {
 }
diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp
index 5b8f169576f1d8120869f1a5b46f26a388f77563..e839783b2d1c093e35fb2f2ca643b6390899fafa 100644
--- a/catalogue/Catalogue.hpp
+++ b/catalogue/Catalogue.hpp
@@ -20,11 +20,27 @@
 
 #include "common/ArchiveRequest.hpp"
 
+#include <list>
 #include <stdint.h>
 #include <string>
 
 namespace cta {
 
+class AdminHost {};
+class AdminUser {};
+class ArchiveRoute {};
+class Dedication {};
+class LogicalLibrary {};
+class RetrieveGroup {};
+class RetrieveUser {};
+class SecurityIdentity {};
+class StorageClass {};
+class Tape {};
+class TapePool {};
+class UserIdentity {};
+
+namespace catalogue {
+
 /**
  * Abstract class defining the interface to the CTA catalogue responsible for
  * storing crticial information about archive files, tapes and tape files.
@@ -37,6 +53,89 @@ public:
    */
   virtual ~Catalogue() = 0;
 
+  virtual void createBootstrapAdminAndHostNoAuth(const SecurityIdentity &requester, const UserIdentity &user, const std::string &hostName, const std::string &comment) = 0;
+
+  virtual void createAdminUser(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment) = 0;
+  virtual void deleteAdminUser(const SecurityIdentity &requester, const UserIdentity &user) = 0;
+  virtual std::list<AdminUser> getAdminUsers(const SecurityIdentity &requester) const = 0;
+  virtual void modifyAdminUserComment(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment) = 0;
+
+  virtual void createAdminHost(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment) = 0;
+  virtual void deleteAdminHost(const SecurityIdentity &requester, const std::string &hostName) = 0;
+  virtual std::list<AdminHost> getAdminHosts(const SecurityIdentity &requester) const = 0;
+  virtual void modifyAdminHostComment(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment) = 0;
+
+  virtual void createStorageClass(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, const std::string &comment) = 0;
+  virtual void deleteStorageClass(const SecurityIdentity &requester, const std::string &name) = 0;
+  virtual std::list<StorageClass> getStorageClasses(const SecurityIdentity &requester) const = 0;
+  virtual void modifyStorageClassNbCopies(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies) = 0;
+  virtual void modifyStorageClassComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0;
+
+  virtual void createTapePool(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment) = 0;
+  virtual void deleteTapePool(const SecurityIdentity &requester, const std::string &name) = 0;
+  virtual std::list<TapePool> getTapePools(const SecurityIdentity &requester) const = 0;
+  virtual void modifyTapePoolNbPartialTapes(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes) = 0;
+  virtual void modifyTapePoolMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued) = 0;
+  virtual void modifyTapePoolMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued) = 0;
+  virtual void modifyTapePoolMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge) = 0;
+  virtual void modifyTapePoolMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed) = 0;
+  virtual void modifyTapePoolComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0;
+
+  virtual void createArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName,
+                                                                                                             const std::string &comment) = 0;
+  virtual void deleteArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb) = 0;
+  virtual std::list<ArchiveRoute> getArchiveRoutes(const SecurityIdentity &requester) const = 0;
+  virtual void modifyArchiveRouteTapePoolName(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName) = 0;
+  virtual void modifyArchiveRouteComment(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &comment) = 0;
+
+  virtual void createLogicalLibrary(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0;
+  virtual void deleteLogicalLibrary(const SecurityIdentity &requester, const std::string &name) = 0;
+  virtual std::list<LogicalLibrary> getLogicalLibraries(const SecurityIdentity &requester) const = 0;
+  virtual void modifyLogicalLibraryComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0;
+
+  virtual void createTape(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName, const std::string &tapePoolName,
+                                                                                                             const uint64_t capacityInBytes, const std::string &comment) = 0;
+  virtual void deleteTape(const SecurityIdentity &requester, const std::string &vid) = 0;
+  virtual Tape getTape(const SecurityIdentity &requester, const std::string &vid) const = 0;
+  virtual std::list<Tape> getTapesByLogicalLibrary(const SecurityIdentity &requester, const std::string &logicalLibraryName) const = 0;
+  virtual std::list<Tape> getTapesByPool(const SecurityIdentity &requester, const std::string &tapePoolName) const = 0;
+  virtual std::list<Tape> getTapesByCapacity(const SecurityIdentity &requester, const uint64_t capacityInBytes) const = 0;
+  virtual std::list<Tape> getAllTapes(const SecurityIdentity &requester) const = 0;
+  virtual void reclaimTape(const SecurityIdentity &requester, const std::string &vid) = 0;
+  virtual void modifyTapeLogicalLibraryName(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName) = 0;
+  virtual void modifyTapeTapePoolName(const SecurityIdentity &requester, const std::string &vid, const std::string &tapePoolName) = 0;
+  virtual void modifyTapeCapacityInBytes(const SecurityIdentity &requester, const std::string &vid, const uint64_t capacityInBytes) = 0;
+  virtual void modifyTapeComment(const SecurityIdentity &requester, const std::string &vid, const std::string &comment) = 0;
+
+  virtual void createRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup,
+                                                                                                             const std::string &comment) = 0;
+  virtual void deleteRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup) = 0;
+  virtual std::list<RetrieveUser> getRetrieveUsers(const SecurityIdentity &requester) const = 0;
+  virtual void modifyRetrieveUserRetrieveGroup(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup) = 0;
+  virtual void modifyRetrieveUserComment(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &comment) = 0;
+
+  virtual void createRetrieveGroup(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment) = 0;
+  virtual void deleteRetrieveGroup(const SecurityIdentity &requester, const std::string &name) = 0;
+  virtual std::list<RetrieveGroup> getRetrieveGroups(const SecurityIdentity &requester) const = 0;
+  virtual void modifyRetrieveGroupMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued) = 0;
+  virtual void modifyRetrieveGroupMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued) = 0;
+  virtual void modifyRetrieveGroupMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge) = 0;
+  virtual void modifyRetrieveGroupMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed) = 0;
+  virtual void modifyRetrieveGroupComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0;
+
+  virtual void createDedication(const SecurityIdentity &requester, const std::string &drivename, const bool self, const bool readonly, const bool writeonly, const std::string &VO, const std::string &instanceName, const std::string &vid, const uint64_t fromTimestamp, const uint64_t untilTimestamp,const std::string &comment) = 0;
+  virtual void deleteDedication(const SecurityIdentity &requester, const std::string &drivename) = 0;
+  virtual std::list<Dedication> getDedications(const SecurityIdentity &requester) const = 0;
+  virtual void modifyDedicationSelf(const SecurityIdentity &requester, const std::string &drivename, const bool self) = 0;
+  virtual void modifyDedicationReadonly(const SecurityIdentity &requester, const std::string &drivename, const bool readonly) = 0;
+  virtual void modifyDedicationWriteonly(const SecurityIdentity &requester, const std::string &drivename, const bool writeonly) = 0;
+  virtual void modifyDedicationVO(const SecurityIdentity &requester, const std::string &drivename, const std::string &VO) = 0;
+  virtual void modifyDedicationInstance(const SecurityIdentity &requester, const std::string &drivename, const std::string &instanceName) = 0;
+  virtual void modifyDedicationVid(const SecurityIdentity &requester, const std::string &drivename, const std::string &vid) = 0;
+  virtual void modifyDedicationFrom(const SecurityIdentity &requester, const std::string &drivename, const uint64_t fromTimestamp) = 0;
+  virtual void modifyDedicationUntil(const SecurityIdentity &requester, const std::string &drivename, const uint64_t untilTimestamp) = 0;
+  virtual void modifyDedicationComment(const SecurityIdentity &requester, const std::string &drivename, const std::string &comment) = 0;
+
   /**
    * Returns the next identifier to be used for a new archive file.
    *
@@ -58,4 +157,5 @@ public:
 
 }; // class Catalogue
 
+} // namespace catalogue
 } // namespace cta
diff --git a/catalogue/MockCatalogue.cpp b/catalogue/MockCatalogue.cpp
index 0f928f26284e8ca59390569fc60a582db6049d71..99f8cf876e54ea22f78fa87e0f001e9f70de4fb0 100644
--- a/catalogue/MockCatalogue.cpp
+++ b/catalogue/MockCatalogue.cpp
@@ -17,30 +17,688 @@
  */
 
 #include "catalogue/MockCatalogue.hpp"
+#include "common/exception/Exception.hpp"
 
 //------------------------------------------------------------------------------
 // constructor
 //------------------------------------------------------------------------------
-cta::MockCatalogue::MockCatalogue(): m_nextArchiveFileId(0) {
+cta::catalogue::MockCatalogue::MockCatalogue():
+  m_db(":memory:"),
+  m_nextArchiveFileId(0) {
+
+  char *zErrMsg = 0;
+  if(SQLITE_OK != sqlite3_exec(m_db.getHandle(), "PRAGMA foreign_keys = ON;",
+    0, 0, &zErrMsg)) {
+    exception::Exception ex;
+    ex.getMessage() << "Failed to turn on foreign key support in SQLite: " <<
+      zErrMsg;
+    sqlite3_free(zErrMsg);
+    throw(ex);
+  }
 }
 
 //------------------------------------------------------------------------------
 // destructor
 //------------------------------------------------------------------------------
-cta::MockCatalogue::~MockCatalogue() {
+cta::catalogue::MockCatalogue::~MockCatalogue() {
+}
+
+//------------------------------------------------------------------------------
+// createBootstrapAdminAndHostNoAuth
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createBootstrapAdminAndHostNoAuth(
+  const SecurityIdentity &requester,
+  const UserIdentity &user,
+  const std::string &hostName,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createAdminUser
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createAdminUser(
+  const SecurityIdentity &requester,
+  const UserIdentity &user,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteAdminUser
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteAdminUser(
+  const SecurityIdentity &requester,
+  const UserIdentity &user) {
+}
+
+//------------------------------------------------------------------------------
+// getAdminUsers
+//------------------------------------------------------------------------------
+std::list<cta::AdminUser>
+  cta::catalogue::MockCatalogue::getAdminUsers(
+  const SecurityIdentity &requester) const {
+
+  return std::list<cta::AdminUser>();
+}
+
+//------------------------------------------------------------------------------
+// modifyAdminUserComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyAdminUserComment(
+  const SecurityIdentity &requester,
+  const UserIdentity &user,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createAdminHost
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createAdminHost(
+  const SecurityIdentity &requester,
+  const std::string &hostName,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteAdminHost
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteAdminHost(
+  const SecurityIdentity &requester,
+  const std::string &hostName) {
+}
+
+//------------------------------------------------------------------------------
+// getAdminHosts
+//------------------------------------------------------------------------------
+std::list<cta::AdminHost>
+  cta::catalogue::MockCatalogue::getAdminHosts(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::AdminHost>();
+}
+
+//------------------------------------------------------------------------------
+// modifyAdminHostComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyAdminHostComment(
+  const SecurityIdentity &requester,
+  const std::string &hostName,
+  const std::string &comment) {
+}
+
+
+//------------------------------------------------------------------------------
+// createStorageClass
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createStorageClass(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint16_t nbCopies,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteStorageClass
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteStorageClass(
+  const SecurityIdentity &requester,
+  const std::string &name) {
+}
+
+//------------------------------------------------------------------------------
+// getStorageClasses
+//------------------------------------------------------------------------------
+std::list<cta::StorageClass>
+  cta::catalogue::MockCatalogue::getStorageClasses(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::StorageClass>();
+}
+
+//------------------------------------------------------------------------------
+// modifyStorageClassNbCopies
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyStorageClassNbCopies(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint16_t nbCopies) {
+}
+
+//------------------------------------------------------------------------------
+// modifyStorageClassComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyStorageClassComment(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const std::string &comment) {
+}
+
+
+//------------------------------------------------------------------------------
+// createTapePool
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createTapePool(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint32_t nbPartialTapes,
+  const uint64_t minFilesQueued,
+  const uint64_t minBytesQueued,
+  const uint64_t minRequestAge,
+  const uint16_t maxDrivesAllowed,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteTapePool
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteTapePool(
+  const SecurityIdentity &requester,
+  const std::string &name) {
+}
+
+//------------------------------------------------------------------------------
+// getTapePools
+//------------------------------------------------------------------------------
+std::list<cta::TapePool> cta::catalogue::MockCatalogue::getTapePools(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::TapePool>();
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolNbPartialTapes
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolNbPartialTapes(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint32_t nbPartialTapes) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolMinFilesQueued
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolMinFilesQueued(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minFilesQueued) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolMinBytesQueued
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolMinBytesQueued(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minBytesQueued) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolMinRequestAge
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolMinRequestAge(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minRequestAge) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolMaxDrivesAllowed
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolMaxDrivesAllowed(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint16_t maxDrivesAllowed) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapePoolComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapePoolComment(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const std::string &comment) {
+}
+
+
+//------------------------------------------------------------------------------
+// createArchiveRoute
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createArchiveRoute(
+  const SecurityIdentity &requester,
+  const std::string &storageClassName,
+  const uint16_t copyNb,
+  const std::string &tapePoolName,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteArchiveRoute
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteArchiveRoute(
+  const SecurityIdentity &requester,
+  const std::string &storageClassName,
+  const uint16_t copyNb) {
+}
+
+//------------------------------------------------------------------------------
+// getArchiveRoutes
+//------------------------------------------------------------------------------
+std::list<cta::ArchiveRoute> cta::catalogue::MockCatalogue::
+  getArchiveRoutes(const SecurityIdentity &requester) const {
+  return std::list<cta::ArchiveRoute>();
+}
+
+//------------------------------------------------------------------------------
+// modifyArchiveRouteTapePoolName
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyArchiveRouteTapePoolName(
+  const SecurityIdentity &requester,
+  const std::string &storageClassName,
+  const uint16_t copyNb,
+  const std::string &tapePoolName) {
+}
+
+//------------------------------------------------------------------------------
+// modifyArchiveRouteComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyArchiveRouteComment(
+  const SecurityIdentity &requester,
+  const std::string &storageClassName,
+  const uint16_t copyNb,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createLogicalLibrary
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createLogicalLibrary(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteLogicalLibrary
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteLogicalLibrary(
+  const SecurityIdentity &requester,
+  const std::string &name) {
+}
+
+//------------------------------------------------------------------------------
+// getLogicalLibraries
+//------------------------------------------------------------------------------
+std::list<cta::LogicalLibrary>
+  cta::catalogue::MockCatalogue::getLogicalLibraries(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::LogicalLibrary>();
+}
+
+//------------------------------------------------------------------------------
+// modifyLogicalLibraryComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyLogicalLibraryComment(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createTape
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createTape(
+  const SecurityIdentity &requester,
+  const std::string &vid,
+  const std::string &logicalLibraryName,
+  const std::string &tapePoolName,
+  const uint64_t capacityInBytes,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteTape
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteTape(
+  const SecurityIdentity &requester,
+  const std::string &vid) {
+}
+
+//------------------------------------------------------------------------------
+// getTape
+//------------------------------------------------------------------------------
+cta::Tape cta::catalogue::MockCatalogue::getTape(
+  const SecurityIdentity &requester,
+  const std::string &vid) const {
+  return cta::Tape();
+}
+
+//------------------------------------------------------------------------------
+// getTapesByLogicalLibrary
+//------------------------------------------------------------------------------
+std::list<cta::Tape>
+  cta::catalogue::MockCatalogue::getTapesByLogicalLibrary(
+  const SecurityIdentity &requester,
+  const std::string &logicalLibraryName) const {
+  return std::list<cta::Tape>();
+}
+
+//------------------------------------------------------------------------------
+// getTapesByPool
+//------------------------------------------------------------------------------
+std::list<cta::Tape> cta::catalogue::MockCatalogue::getTapesByPool(
+  const SecurityIdentity &requester,
+  const std::string &tapePoolName) const {
+  return std::list<cta::Tape>();
+}
+
+//------------------------------------------------------------------------------
+// getTapesByCapacity
+//------------------------------------------------------------------------------
+std::list<cta::Tape>
+  cta::catalogue::MockCatalogue::getTapesByCapacity(
+  const SecurityIdentity &requester,
+  const uint64_t capacityInBytes) const {
+  return std::list<cta::Tape>();
+}
+
+//------------------------------------------------------------------------------
+// getAllTapes
+//------------------------------------------------------------------------------
+std::list<cta::Tape> cta::catalogue::MockCatalogue::getAllTapes(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::Tape>();
+}
+
+//------------------------------------------------------------------------------
+// reclaimTape
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::reclaimTape(
+  const SecurityIdentity &requester,
+  const std::string &vid) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapeLogicalLibraryName
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapeLogicalLibraryName(
+  const SecurityIdentity &requester,
+  const std::string &vid,
+  const std::string &logicalLibraryName) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapeTapePoolName
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapeTapePoolName(
+  const SecurityIdentity &requester,
+  const std::string &vid,
+  const std::string &tapePoolName) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapeCapacityInBytes
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapeCapacityInBytes(
+  const SecurityIdentity &requester,
+  const std::string &vid,
+  const uint64_t capacityInBytes) {
+}
+
+//------------------------------------------------------------------------------
+// modifyTapeComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyTapeComment(
+  const SecurityIdentity &requester,
+  const std::string &vid,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createRetrieveUser
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createRetrieveUser(
+  const SecurityIdentity &requester,
+  const std::string &username,
+  const std::string &usergroup,
+  const std::string &retrieveGroup,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteRetrieveUser
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteRetrieveUser(
+  const SecurityIdentity &requester,
+  const std::string &username,
+  const std::string &usergroup) {
+}
+
+//------------------------------------------------------------------------------
+// getRetrieveUsers
+//------------------------------------------------------------------------------
+std::list<cta::RetrieveUser>
+  cta::catalogue::MockCatalogue::getRetrieveUsers(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::RetrieveUser>();
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveUserRetrieveGroup
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveUserRetrieveGroup(
+  const SecurityIdentity &requester,
+  const std::string &username,
+  const std::string &usergroup,
+  const std::string &retrieveGroup) {
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveUserComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveUserComment(
+  const SecurityIdentity &requester,
+  const std::string &username,
+  const std::string &usergroup,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createRetrieveGroup
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createRetrieveGroup(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minFilesQueued,
+  const uint64_t minBytesQueued,
+  const uint64_t minRequestAge,
+  const uint16_t maxDrivesAllowed,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteRetrieveGroup
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteRetrieveGroup(
+  const SecurityIdentity &requester,
+  const std::string &name) {
+}
+
+//------------------------------------------------------------------------------
+// getRetrieveGroups
+//------------------------------------------------------------------------------
+std::list<cta::RetrieveGroup>
+  cta::catalogue::MockCatalogue::getRetrieveGroups(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::RetrieveGroup>();
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveGroupMinFilesQueued
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinFilesQueued(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minFilesQueued) {
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveGroupMinBytesQueued
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinBytesQueued(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minBytesQueued) {
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveGroupMinRequestAge
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinRequestAge(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint64_t minRequestAge) {
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveGroupMaxDrivesAllowed
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveGroupMaxDrivesAllowed(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const uint16_t maxDrivesAllowed) {
+}
+
+//------------------------------------------------------------------------------
+// modifyRetrieveGroupComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyRetrieveGroupComment(
+  const SecurityIdentity &requester,
+  const std::string &name,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// createDedication
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::createDedication(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const bool self,
+  const bool readonly,
+  const bool writeonly,
+  const std::string &VO,
+  const std::string &instanceName,
+  const std::string &vid,
+  const uint64_t fromTimestamp,
+  const uint64_t untilTimestamp,
+  const std::string &comment) {
+}
+
+//------------------------------------------------------------------------------
+// deleteDedication
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::deleteDedication(
+  const SecurityIdentity &requester,
+  const std::string &drivename) {
+}
+
+//------------------------------------------------------------------------------
+// getDedications
+//------------------------------------------------------------------------------
+std::list<cta::Dedication>
+  cta::catalogue::MockCatalogue::getDedications(
+  const SecurityIdentity &requester) const {
+  return std::list<cta::Dedication>();
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationSelf
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationSelf(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const bool self) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationReadonly
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationReadonly(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const bool readonly) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationWriteonly
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationWriteonly(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const bool writeonly) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationVO
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationVO(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const std::string &VO) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationInstance
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationInstance(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const std::string &instanceName) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationVid
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationVid(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const std::string &vid) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationFrom
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationFrom(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const uint64_t fromTimestamp) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationUntil
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationUntil(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const uint64_t untilTimestamp) {
+}
+
+//------------------------------------------------------------------------------
+// modifyDedicationComment
+//------------------------------------------------------------------------------
+void cta::catalogue::MockCatalogue::modifyDedicationComment(
+  const SecurityIdentity &requester,
+  const std::string &drivename,
+  const std::string &comment) {
 }
 
 //------------------------------------------------------------------------------
 // getNextArchiveFileId
 //------------------------------------------------------------------------------
-uint64_t cta::MockCatalogue::getNextArchiveFileId() {
+uint64_t cta::catalogue::MockCatalogue::getNextArchiveFileId() {
   return m_nextArchiveFileId++;
 }
 
 //------------------------------------------------------------------------------
 // fileWrittenToTape
 //------------------------------------------------------------------------------
-void cta::MockCatalogue::fileWrittenToTape(
+void cta::catalogue::MockCatalogue::fileWrittenToTape(
   const ArchiveRequest &archiveRequest,
   const std::string vid,
   const uint64_t fSeq,
diff --git a/catalogue/MockCatalogue.hpp b/catalogue/MockCatalogue.hpp
index e5744012cbe4a262304a2b4db0e5bf0bedfb6e90..e27246579c84e9b70757acc9cbad01ce683d67fa 100644
--- a/catalogue/MockCatalogue.hpp
+++ b/catalogue/MockCatalogue.hpp
@@ -19,6 +19,7 @@
 #pragma once
 
 #include "catalogue/Catalogue.hpp"
+#include "catalogue/SQLiteDatabase.hpp"
 
 // The header file for atomic was is actually called cstdatomic in gcc 4.4
 #if __GNUC__ == 4 && (__GNUC_MINOR__ == 4)
@@ -30,6 +31,7 @@
 #include <string>
 
 namespace cta {
+namespace catalogue {
 
 /**
  * Mock CTA catalogue to facilitate unit testing.
@@ -47,6 +49,89 @@ public:
    */
   virtual ~MockCatalogue();
 
+  virtual void createBootstrapAdminAndHostNoAuth(const SecurityIdentity &requester, const UserIdentity &user, const std::string &hostName, const std::string &comment);
+
+  virtual void createAdminUser(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment);
+  virtual void deleteAdminUser(const SecurityIdentity &requester, const UserIdentity &user);
+  virtual std::list<AdminUser> getAdminUsers(const SecurityIdentity &requester) const;
+  virtual void modifyAdminUserComment(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment);
+
+  virtual void createAdminHost(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment);
+  virtual void deleteAdminHost(const SecurityIdentity &requester, const std::string &hostName);
+  virtual std::list<AdminHost> getAdminHosts(const SecurityIdentity &requester) const;
+  virtual void modifyAdminHostComment(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment);
+
+  virtual void createStorageClass(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, const std::string &comment);
+  virtual void deleteStorageClass(const SecurityIdentity &requester, const std::string &name);
+  virtual std::list<StorageClass> getStorageClasses(const SecurityIdentity &requester) const;
+  virtual void modifyStorageClassNbCopies(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies);
+  virtual void modifyStorageClassComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment);
+
+  virtual void createTapePool(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment);
+  virtual void deleteTapePool(const SecurityIdentity &requester, const std::string &name);
+  virtual std::list<TapePool> getTapePools(const SecurityIdentity &requester) const;
+  virtual void modifyTapePoolNbPartialTapes(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes);
+  virtual void modifyTapePoolMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued);
+  virtual void modifyTapePoolMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued);
+  virtual void modifyTapePoolMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge);
+  virtual void modifyTapePoolMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed);
+  virtual void modifyTapePoolComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment);
+
+  virtual void createArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName,
+                                                                                                             const std::string &comment);
+  virtual void deleteArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb);
+  virtual std::list<ArchiveRoute> getArchiveRoutes(const SecurityIdentity &requester) const;
+  virtual void modifyArchiveRouteTapePoolName(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName);
+  virtual void modifyArchiveRouteComment(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &comment);
+
+  virtual void createLogicalLibrary(const SecurityIdentity &requester, const std::string &name, const std::string &comment);
+  virtual void deleteLogicalLibrary(const SecurityIdentity &requester, const std::string &name);
+  virtual std::list<LogicalLibrary> getLogicalLibraries(const SecurityIdentity &requester) const;
+  virtual void modifyLogicalLibraryComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment);
+
+  virtual void createTape(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName, const std::string &tapePoolName,
+                                                                                                             const uint64_t capacityInBytes, const std::string &comment);
+  virtual void deleteTape(const SecurityIdentity &requester, const std::string &vid);
+  virtual Tape getTape(const SecurityIdentity &requester, const std::string &vid) const;
+  virtual std::list<Tape> getTapesByLogicalLibrary(const SecurityIdentity &requester, const std::string &logicalLibraryName) const;
+  virtual std::list<Tape> getTapesByPool(const SecurityIdentity &requester, const std::string &tapePoolName) const;
+  virtual std::list<Tape> getTapesByCapacity(const SecurityIdentity &requester, const uint64_t capacityInBytes) const;
+  virtual std::list<Tape> getAllTapes(const SecurityIdentity &requester) const;
+  virtual void reclaimTape(const SecurityIdentity &requester, const std::string &vid);
+  virtual void modifyTapeLogicalLibraryName(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName);
+  virtual void modifyTapeTapePoolName(const SecurityIdentity &requester, const std::string &vid, const std::string &tapePoolName);
+  virtual void modifyTapeCapacityInBytes(const SecurityIdentity &requester, const std::string &vid, const uint64_t capacityInBytes);
+  virtual void modifyTapeComment(const SecurityIdentity &requester, const std::string &vid, const std::string &comment);
+
+  virtual void createRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup,
+                                                                                                             const std::string &comment);
+  virtual void deleteRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup);
+  virtual std::list<RetrieveUser> getRetrieveUsers(const SecurityIdentity &requester) const;
+  virtual void modifyRetrieveUserRetrieveGroup(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup);
+  virtual void modifyRetrieveUserComment(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &comment);
+
+  virtual void createRetrieveGroup(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment);
+  virtual void deleteRetrieveGroup(const SecurityIdentity &requester, const std::string &name);
+  virtual std::list<RetrieveGroup> getRetrieveGroups(const SecurityIdentity &requester) const;
+  virtual void modifyRetrieveGroupMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued);
+  virtual void modifyRetrieveGroupMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued);
+  virtual void modifyRetrieveGroupMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge);
+  virtual void modifyRetrieveGroupMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed);
+  virtual void modifyRetrieveGroupComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment);
+
+  virtual void createDedication(const SecurityIdentity &requester, const std::string &drivename, const bool self, const bool readonly, const bool writeonly, const std::string &VO, const std::string &instanceName, const std::string &vid, const uint64_t fromTimestamp, const uint64_t untilTimestamp,const std::string &comment);
+  virtual void deleteDedication(const SecurityIdentity &requester, const std::string &drivename);
+  virtual std::list<Dedication> getDedications(const SecurityIdentity &requester) const;
+  virtual void modifyDedicationSelf(const SecurityIdentity &requester, const std::string &drivename, const bool self);
+  virtual void modifyDedicationReadonly(const SecurityIdentity &requester, const std::string &drivename, const bool readonly);
+  virtual void modifyDedicationWriteonly(const SecurityIdentity &requester, const std::string &drivename, const bool writeonly);
+  virtual void modifyDedicationVO(const SecurityIdentity &requester, const std::string &drivename, const std::string &VO);
+  virtual void modifyDedicationInstance(const SecurityIdentity &requester, const std::string &drivename, const std::string &instanceName);
+  virtual void modifyDedicationVid(const SecurityIdentity &requester, const std::string &drivename, const std::string &vid);
+  virtual void modifyDedicationFrom(const SecurityIdentity &requester, const std::string &drivename, const uint64_t fromTimestamp);
+  virtual void modifyDedicationUntil(const SecurityIdentity &requester, const std::string &drivename, const uint64_t untilTimestamp);
+  virtual void modifyDedicationComment(const SecurityIdentity &requester, const std::string &drivename, const std::string &comment);
+
   /**
    * Returns the next identifier to be used for a new archive file.
    *
@@ -68,6 +153,11 @@ public:
 
 private:
 
+  /**
+   * SQLite database handle.
+   */
+  SQLiteDatabase m_db;
+
   /**
    * The next identifier to be used for a new archive file.
    */
@@ -75,4 +165,5 @@ private:
 
 }; // class MockCatalogue
 
+} // namespace catalogue
 } // namespace cta
diff --git a/catalogue/MockCatalogueTest.cpp b/catalogue/MockCatalogueTest.cpp
index 6e827692d3e3ea0b8953e2d7c75f792ba42d0ef7..6890f7e04d14deb3756c41efc981e15911026458 100644
--- a/catalogue/MockCatalogueTest.cpp
+++ b/catalogue/MockCatalogueTest.cpp
@@ -35,10 +35,10 @@ protected:
 TEST_F(cta_MockCatalogueTest, getNextArchiveFileId) {
   using namespace cta;
 
-  MockCatalogue catalogue;
+  catalogue::MockCatalogue c;
 
-  const uint64_t archiveFileId1 = catalogue.getNextArchiveFileId();
-  const uint64_t archiveFileId2 = catalogue.getNextArchiveFileId();
+  const uint64_t archiveFileId1 = c.getNextArchiveFileId();
+  const uint64_t archiveFileId2 = c.getNextArchiveFileId();
 
   ASSERT_GT(archiveFileId2, archiveFileId1);
 }
diff --git a/catalogue/SQLiteDatabase.cpp b/catalogue/SQLiteDatabase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ad85c60202829f759ab00dd6167bc8e277bddc41
--- /dev/null
+++ b/catalogue/SQLiteDatabase.cpp
@@ -0,0 +1,48 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "catalogue/SQLiteDatabase.hpp"
+#include "common/exception/Exception.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::catalogue::SQLiteDatabase::SQLiteDatabase(const std::string &filename) {
+  m_dbHandle = NULL;
+  if(sqlite3_open(filename.c_str(), &m_dbHandle)) {
+    sqlite3_close(m_dbHandle);
+    exception::Exception ex;
+    ex.getMessage() << "Failed to construct SQLiteDatabase: sqlite3_open failed"
+      ": " << sqlite3_errmsg(m_dbHandle);
+    throw(ex);
+  }
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+cta::catalogue::SQLiteDatabase::~SQLiteDatabase() {
+  sqlite3_close(m_dbHandle);
+}
+
+//------------------------------------------------------------------------------
+// getHandle
+//------------------------------------------------------------------------------
+sqlite3 *cta::catalogue::SQLiteDatabase::getHandle() {
+  return m_dbHandle;
+}
diff --git a/catalogue/SQLiteDatabase.hpp b/catalogue/SQLiteDatabase.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a72676626febfa8c16af293ca20668e6ac094bcd
--- /dev/null
+++ b/catalogue/SQLiteDatabase.hpp
@@ -0,0 +1,62 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <sqlite3.h>
+#include <string>
+
+namespace cta {
+namespace catalogue {
+
+/**
+ * A C++ wrapper around an SQLite database handle.
+ */
+class SQLiteDatabase {
+public:
+
+  /**
+   * Constructor.
+   *
+   * @param filename The filename to be passed to the sqlit3_open() function.
+   */
+  SQLiteDatabase(const std::string &filename);
+
+  /**
+   * Destructor.
+   */
+  ~SQLiteDatabase();
+
+  /**
+   * Returns the underlying database handle.
+   *
+   * @return the underlying database handle.
+   */
+  sqlite3 *getHandle();
+
+private:
+
+  /**
+   * SQLite database handle.
+   */
+  sqlite3 *m_dbHandle;
+
+}; // class SqlLiteDatabase
+
+} // namespace catalogue
+} // namespace cta