From 618b835a88ea3a341221cb405cd25dc4504e3324 Mon Sep 17 00:00:00 2001
From: Cedric Caffy <cedric.caffy@cern.ch>
Date: Tue, 2 Jun 2020 11:03:22 +0200
Subject: [PATCH] [recycle-bin] Deleted files now go to the recycle-bin instead
 of being deleted from the Catalogue

---
 catalogue/3.0/mysql_catalogue_schema.sql      |  372 ++++
 catalogue/3.0/oracle_catalogue_schema.sql     |  399 +++++
 catalogue/3.0/postgres_catalogue_schema.sql   |  386 +++++
 catalogue/3.0/sqlite_catalogue_schema.sql     |  360 ++++
 catalogue/AllCatalogueSchema.hpp              | 1524 +++++++++++++++++
 catalogue/ArchiveFileBuilder.cpp              |   88 -
 catalogue/ArchiveFileBuilder.hpp              |  103 +-
 catalogue/CMakeLists.txt                      |    4 +
 catalogue/Catalogue.hpp                       |   37 +-
 catalogue/CatalogueRetryWrapper.hpp           |   17 +-
 catalogue/CatalogueTest.cpp                   |  293 +++-
 catalogue/DeletedArchiveFileItor.cpp          |   90 +
 catalogue/DeletedArchiveFileItor.hpp          |   90 +
 catalogue/DeletedArchiveFileItorImpl.cpp      |   30 +
 catalogue/DeletedArchiveFileItorImpl.hpp      |   51 +
 catalogue/DropSchemaCmd.cpp                   |   11 +
 catalogue/DummyCatalogue.hpp                  |    7 +-
 catalogue/MysqlCatalogue.cpp                  |   58 +-
 catalogue/MysqlCatalogue.hpp                  |   16 +
 catalogue/OracleCatalogue.cpp                 |   64 +-
 catalogue/OracleCatalogue.hpp                 |   16 +
 catalogue/PostgresCatalogue.cpp               |   63 +-
 catalogue/PostgresCatalogue.hpp               |   16 +
 catalogue/RdbmsCatalogue.cpp                  |  384 ++++-
 catalogue/RdbmsCatalogue.hpp                  |   88 +-
 ...sCatalogueGetArchiveFilesForRepackItor.hpp |    3 +-
 .../RdbmsCatalogueGetArchiveFilesItor.cpp     |    2 +-
 .../RdbmsCatalogueGetArchiveFilesItor.hpp     |    3 +-
 ...bmsCatalogueGetDeletedArchiveFilesItor.cpp |  312 ++++
 ...bmsCatalogueGetDeletedArchiveFilesItor.hpp |  118 ++
 catalogue/SqliteCatalogue.cpp                 |   65 +-
 catalogue/SqliteCatalogue.hpp                 |   18 +-
 catalogue/TapeFileSearchCriteria.hpp          |    2 +-
 catalogue/common_catalogue_schema.sql         |   48 +
 cmake/CTAVersions.cmake                       |    2 +-
 common/CMakeLists.txt                         |    1 +
 common/dataStructures/ArchiveFile.hpp         |    2 +-
 .../dataStructures/DeleteArchiveRequest.cpp   |    7 +-
 .../dataStructures/DeleteArchiveRequest.hpp   |    4 +
 common/dataStructures/DeletedArchiveFile.cpp  |   27 +
 common/dataStructures/DeletedArchiveFile.hpp  |   37 +
 scheduler/Scheduler.cpp                       |   10 +-
 xroot_plugins/XrdSsiCtaRequestMessage.cpp     |   15 +-
 43 files changed, 5117 insertions(+), 126 deletions(-)
 create mode 100644 catalogue/3.0/mysql_catalogue_schema.sql
 create mode 100644 catalogue/3.0/oracle_catalogue_schema.sql
 create mode 100644 catalogue/3.0/postgres_catalogue_schema.sql
 create mode 100644 catalogue/3.0/sqlite_catalogue_schema.sql
 create mode 100644 catalogue/DeletedArchiveFileItor.cpp
 create mode 100644 catalogue/DeletedArchiveFileItor.hpp
 create mode 100644 catalogue/DeletedArchiveFileItorImpl.cpp
 create mode 100644 catalogue/DeletedArchiveFileItorImpl.hpp
 create mode 100644 catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp
 create mode 100644 catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp
 create mode 100644 common/dataStructures/DeletedArchiveFile.cpp
 create mode 100644 common/dataStructures/DeletedArchiveFile.hpp

diff --git a/catalogue/3.0/mysql_catalogue_schema.sql b/catalogue/3.0/mysql_catalogue_schema.sql
new file mode 100644
index 0000000000..2e82a5ed9f
--- /dev/null
+++ b/catalogue/3.0/mysql_catalogue_schema.sql
@@ -0,0 +1,372 @@
+CREATE TABLE ARCHIVE_FILE_ID(
+  ID BIGINT UNSIGNED,
+  CONSTRAINT ARCHIVE_FILE_ID_PK PRIMARY KEY(ID)
+);
+INSERT INTO ARCHIVE_FILE_ID(ID) VALUES(1);
+CREATE TABLE LOGICAL_LIBRARY_ID(
+  ID BIGINT UNSIGNED,
+  CONSTRAINT LOGICAL_LIBRARY_ID_PK PRIMARY KEY(ID)
+);
+INSERT INTO LOGICAL_LIBRARY_ID(ID) VALUES(1);
+CREATE TABLE STORAGE_CLASS_ID(
+  ID BIGINT UNSIGNED,
+  CONSTRAINT STORAGE_CLASS_ID_PK PRIMARY KEY(ID)
+);
+INSERT INTO STORAGE_CLASS_ID(ID) VALUES(1);
+CREATE TABLE TAPE_POOL_ID(
+  ID BIGINT UNSIGNED,
+  CONSTRAINT TAPE_POOL_ID_PK PRIMARY KEY(ID)
+);
+INSERT INTO TAPE_POOL_ID(ID) VALUES(1);
+CREATE TABLE VIRTUAL_ORGANIZATION_ID(
+  ID BIGINT UNSIGNED,
+  CONSTRAINT VIRTUAL_ORGANIZATION_ID_PK PRIMARY KEY(ID)
+);
+INSERT INTO VIRTUAL_ORGANIZATION_ID(ID) VALUES(1);
+CREATE TABLE CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR    BIGINT UNSIGNED      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,
+  SCHEMA_VERSION_MINOR    BIGINT UNSIGNED      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,
+  NEXT_SCHEMA_VERSION_MAJOR BIGINT UNSIGNED,
+  NEXT_SCHEMA_VERSION_MINOR BIGINT UNSIGNED,
+  STATUS                  VARCHAR(100)
+);
+CREATE TABLE ADMIN_USER(
+  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,
+  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)
+);
+CREATE TABLE DISK_SYSTEM(
+  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,
+  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,
+  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,
+  REFRESH_INTERVAL        BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,
+  TARGETED_FREE_SPACE     BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,
+  SLEEP_TIME              BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,
+  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)
+);
+CREATE TABLE VIRTUAL_ORGANIZATION(
+  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,
+  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),
+  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)
+);
+CREATE TABLE STORAGE_CLASS(
+  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,
+  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,
+  NB_COPIES               TINYINT UNSIGNED       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,
+  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,
+  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),
+  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),
+  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE TAPE_POOL(
+  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,
+  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,
+  NB_PARTIAL_TAPES        BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,
+  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,
+  SUPPLY                  VARCHAR(100),
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),
+  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),
+  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),
+  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE ARCHIVE_ROUTE(
+  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,
+  COPY_NB                 TINYINT UNSIGNED       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,
+  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,
+  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),
+  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)
+);
+CREATE TABLE LOGICAL_LIBRARY(
+  LOGICAL_LIBRARY_ID      BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,
+  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,
+  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,
+  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),
+  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))
+);
+CREATE TABLE TAPE(
+  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,
+  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,
+  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,
+  LOGICAL_LIBRARY_ID      BIGINT UNSIGNED      CONSTRAINT TAPE_LLI_NN  NOT NULL,
+  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT TAPE_TPI_NN  NOT NULL,
+  ENCRYPTION_KEY_NAME     VARCHAR(100),
+  CAPACITY_IN_BYTES       BIGINT UNSIGNED      CONSTRAINT TAPE_CIB_NN  NOT NULL,
+  DATA_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT TAPE_DIB_NN  NOT NULL,
+  LAST_FSEQ               BIGINT UNSIGNED      CONSTRAINT TAPE_LF_NN   NOT NULL,
+  NB_MASTER_FILES         BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,
+  MASTER_DATA_IN_BYTES    BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,
+  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,
+  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,
+  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,
+  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,
+  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,
+  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,
+  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,
+  NB_COPY_NB_1            BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,
+  COPY_NB_1_IN_BYTES      BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,
+  NB_COPY_NB_GT_1         BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,
+  COPY_NB_GT_1_IN_BYTES   BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,
+  LABEL_DRIVE             VARCHAR(100),
+  LABEL_TIME              BIGINT UNSIGNED    ,
+  LAST_READ_DRIVE         VARCHAR(100),
+  LAST_READ_TIME          BIGINT UNSIGNED    ,
+  LAST_WRITE_DRIVE        VARCHAR(100),
+  LAST_WRITE_TIME         BIGINT UNSIGNED    ,
+  READ_MOUNT_COUNT        BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,
+  WRITE_MOUNT_COUNT       BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT TAPE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT TAPE_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_PK PRIMARY KEY(VID),
+  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),
+  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),
+  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),
+  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))
+);
+CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);
+CREATE TABLE MOUNT_POLICY(
+  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,
+  ARCHIVE_PRIORITY         BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,
+  ARCHIVE_MIN_REQUEST_AGE  BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,
+  RETRIEVE_PRIORITY        BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,
+  RETRIEVE_MIN_REQUEST_AGE BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,
+  MAX_DRIVES_ALLOWED       BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,
+  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,
+  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      BIGINT UNSIGNED      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       BIGINT UNSIGNED      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),
+  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,
+  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      BIGINT UNSIGNED      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       BIGINT UNSIGNED      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),
+  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE ARCHIVE_FILE(
+  ARCHIVE_FILE_ID         BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,
+  DISK_FILE_UID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           VARBINARY(200),
+  CHECKSUM_ADLER32        INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,
+  CREATION_TIME           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,
+  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))
+);
+CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);
+CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);
+CREATE TABLE TAPE_FILE(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,
+  FSEQ                     BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,
+  BLOCK_ID                 BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,
+  COPY_NB                  TINYINT UNSIGNED      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,
+  CREATION_TIME            BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       BIGINT UNSIGNED    ,
+  WRITE_START_WRAP         SMALLINT UNSIGNED,
+  WRITE_START_LPOS         INT UNSIGNED,
+  WRITE_END_WRAP           SMALLINT UNSIGNED,
+  WRITE_END_LPOS           INT UNSIGNED,
+  READ_START_WRAP          SMALLINT UNSIGNED,
+  READ_START_LPOS          INT UNSIGNED,
+  READ_END_WRAP            SMALLINT UNSIGNED,
+  READ_END_LPOS            INT UNSIGNED,
+  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE(VID, FSEQ)
+);
+CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);
+CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);
+CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);
+CREATE TABLE ACTIVITIES_WEIGHTS (
+  DISK_INSTANCE_NAME       VARCHAR(100),
+  ACTIVITY                 VARCHAR(100),
+  WEIGHT                   VARCHAR(100),
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        BIGINT UNSIGNED      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         BIGINT UNSIGNED      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL
+);
+CREATE TABLE USAGESTATS (
+  GID                     INT UNSIGNED   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,
+  TIMESTAMP               BIGINT UNSIGNED  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,
+  MAXFILEID               BIGINT UNSIGNED,
+  FILECOUNT               BIGINT UNSIGNED,
+  FILESIZE                BIGINT UNSIGNED,
+  SEGCOUNT                BIGINT UNSIGNED,
+  SEGSIZE                 BIGINT UNSIGNED,
+  SEG2COUNT               BIGINT UNSIGNED,
+  SEG2SIZE                BIGINT UNSIGNED,
+  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)
+);
+CREATE TABLE EXPERIMENTS (
+ NAME                     VARCHAR(20),
+ GID                      INT UNSIGNED CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY
+);
+CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(
+  ARCHIVE_FILE_ID         BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,
+  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,
+  DISK_FILE_UID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           VARBINARY(200),
+  CHECKSUM_ADLER32        INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,
+  CREATION_TIME           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,
+  DELETION_TIME           BIGINT UNSIGNED    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,
+  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)
+);
+CREATE TABLE TAPE_FILE_RECYCLE_BIN(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,
+  FSEQ                     BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,
+  BLOCK_ID                 BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,
+  COPY_NB                  TINYINT UNSIGNED      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,
+  CREATION_TIME            BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       BIGINT UNSIGNED,
+  WRITE_START_WRAP         SMALLINT UNSIGNED,
+  WRITE_START_LPOS         INT UNSIGNED,
+  WRITE_END_WRAP           SMALLINT UNSIGNED,
+  WRITE_END_LPOS           INT UNSIGNED,
+  READ_START_WRAP          SMALLINT UNSIGNED,
+  READ_START_LPOS          INT UNSIGNED,
+  READ_END_WRAP            SMALLINT UNSIGNED,
+  READ_END_LPOS            INT UNSIGNED,
+  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)
+);INSERT INTO CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR,
+  SCHEMA_VERSION_MINOR,
+  STATUS)
+VALUES(
+  3,
+  0,
+  'PRODUCTION');
+ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT 
+  CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));
\ No newline at end of file
diff --git a/catalogue/3.0/oracle_catalogue_schema.sql b/catalogue/3.0/oracle_catalogue_schema.sql
new file mode 100644
index 0000000000..b92c1d26b9
--- /dev/null
+++ b/catalogue/3.0/oracle_catalogue_schema.sql
@@ -0,0 +1,399 @@
+CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ
+  INCREMENT BY 1
+  START WITH 4294967296
+  NOMAXVALUE
+  MINVALUE 1
+  NOCYCLE
+  CACHE 20
+  NOORDER;
+CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ
+  INCREMENT BY 1
+  START WITH 4294967296
+  NOMAXVALUE
+  MINVALUE 1
+  NOCYCLE
+  CACHE 20
+  NOORDER;
+CREATE SEQUENCE STORAGE_CLASS_ID_SEQ
+  INCREMENT BY 1
+  START WITH 4294967296
+  NOMAXVALUE
+  MINVALUE 1
+  NOCYCLE
+  CACHE 20
+  NOORDER;
+CREATE SEQUENCE TAPE_POOL_ID_SEQ
+  INCREMENT BY 1
+  START WITH 4294967296
+  NOMAXVALUE
+  MINVALUE 1
+  NOCYCLE
+  CACHE 20
+  NOORDER;
+CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ
+  INCREMENT BY 1
+  START WITH 4294967296
+  NOMAXVALUE
+  MINVALUE 1
+  NOCYCLE
+  CACHE 20
+  NOORDER;
+CREATE GLOBAL TEMPORARY TABLE TEMP_TAPE_FILE_INSERTION_BATCH(
+  VID                   VARCHAR2(100),
+  FSEQ                  NUMERIC(20, 0)  ,
+  BLOCK_ID              NUMERIC(20, 0)  ,
+  LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0)  ,
+  COPY_NB               NUMERIC(3, 0)   ,
+  CREATION_TIME         NUMERIC(20, 0)  ,
+  ARCHIVE_FILE_ID       NUMERIC(20, 0)    
+)
+ON COMMIT DELETE ROWS;
+CREATE INDEX TEMP_T_F_I_B_AFI_IDX ON TEMP_TAPE_FILE_INSERTION_BATCH(ARCHIVE_FILE_ID);
+CREATE TABLE CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,
+  SCHEMA_VERSION_MINOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,
+  NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0),
+  NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0),
+  STATUS                  VARCHAR2(100)
+);
+CREATE TABLE ADMIN_USER(
+  ADMIN_USER_NAME         VARCHAR2(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,
+  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)
+);
+CREATE TABLE DISK_SYSTEM(
+  DISK_SYSTEM_NAME        VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,
+  FILE_REGEXP             VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,
+  FREE_SPACE_QUERY_URL    VARCHAR2(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,
+  REFRESH_INTERVAL        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,
+  TARGETED_FREE_SPACE     NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,
+  SLEEP_TIME              NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,
+  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)
+);
+CREATE TABLE VIRTUAL_ORGANIZATION(
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_NAME VARCHAR2(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,
+  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),
+  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)
+);
+CREATE TABLE STORAGE_CLASS(
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,
+  STORAGE_CLASS_NAME      VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,
+  NB_COPIES               NUMERIC(3, 0)       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,
+  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),
+  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),
+  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE TAPE_POOL(
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,
+  TAPE_POOL_NAME          VARCHAR2(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,
+  NB_PARTIAL_TAPES        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,
+  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,
+  SUPPLY                  VARCHAR2(100),
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),
+  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),
+  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),
+  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE ARCHIVE_ROUTE(
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,
+  COPY_NB                 NUMERIC(3, 0)       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,
+  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),
+  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)
+);
+CREATE TABLE LOGICAL_LIBRARY(
+  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,
+  LOGICAL_LIBRARY_NAME    VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,
+  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,
+  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),
+  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))
+);
+CREATE TABLE TAPE(
+  VID                     VARCHAR2(100)    CONSTRAINT TAPE_V_NN    NOT NULL,
+  MEDIA_TYPE              VARCHAR2(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,
+  VENDOR                  VARCHAR2(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,
+  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT TAPE_LLI_NN  NOT NULL,
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_TPI_NN  NOT NULL,
+  ENCRYPTION_KEY_NAME     VARCHAR2(100),
+  CAPACITY_IN_BYTES       NUMERIC(20, 0)      CONSTRAINT TAPE_CIB_NN  NOT NULL,
+  DATA_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT TAPE_DIB_NN  NOT NULL,
+  LAST_FSEQ               NUMERIC(20, 0)      CONSTRAINT TAPE_LF_NN   NOT NULL,
+  NB_MASTER_FILES         NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,
+  MASTER_DATA_IN_BYTES    NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,
+  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,
+  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,
+  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,
+  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,
+  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,
+  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,
+  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,
+  NB_COPY_NB_1            NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,
+  COPY_NB_1_IN_BYTES      NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,
+  NB_COPY_NB_GT_1         NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,
+  COPY_NB_GT_1_IN_BYTES   NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,
+  LABEL_DRIVE             VARCHAR2(100),
+  LABEL_TIME              NUMERIC(20, 0)    ,
+  LAST_READ_DRIVE         VARCHAR2(100),
+  LAST_READ_TIME          NUMERIC(20, 0)    ,
+  LAST_WRITE_DRIVE        VARCHAR2(100),
+  LAST_WRITE_TIME         NUMERIC(20, 0)    ,
+  READ_MOUNT_COUNT        NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,
+  WRITE_MOUNT_COUNT       NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,
+  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_PK PRIMARY KEY(VID),
+  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),
+  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),
+  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),
+  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))
+);
+CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);
+CREATE TABLE MOUNT_POLICY(
+  MOUNT_POLICY_NAME        VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,
+  ARCHIVE_PRIORITY         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,
+  ARCHIVE_MIN_REQUEST_AGE  NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,
+  RETRIEVE_PRIORITY        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,
+  RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,
+  MAX_DRIVES_ALLOWED       NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,
+  USER_COMMENT             VARCHAR2(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,
+  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR2(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,
+  REQUESTER_NAME         VARCHAR2(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR2(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR2(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR2(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR2(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),
+  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,
+  REQUESTER_GROUP_NAME   VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR2(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),
+  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE ARCHIVE_FILE(
+  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,
+  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           RAW(200),
+  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,
+  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,
+  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,
+  COLLOCATION_HINT        VARCHAR2(100),
+  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))
+);
+CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);
+CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);
+CREATE TABLE TAPE_FILE(
+  VID                      VARCHAR2(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,
+  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,
+  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,
+  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,
+  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR2(100),
+  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0)    ,
+  WRITE_START_WRAP         NUMERIC(5, 0),
+  WRITE_START_LPOS         NUMERIC(10, 0),
+  WRITE_END_WRAP           NUMERIC(5, 0),
+  WRITE_END_LPOS           NUMERIC(10, 0),
+  READ_START_WRAP          NUMERIC(5, 0),
+  READ_START_LPOS          NUMERIC(10, 0),
+  READ_END_WRAP            NUMERIC(5, 0),
+  READ_END_LPOS            NUMERIC(10, 0),
+  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE(VID, FSEQ)
+);
+CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);
+CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);
+CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);
+CREATE TABLE ACTIVITIES_WEIGHTS (
+  DISK_INSTANCE_NAME       VARCHAR2(100),
+  ACTIVITY                 VARCHAR2(100),
+  WEIGHT                   VARCHAR2(100),
+  USER_COMMENT             VARCHAR2(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL
+);
+CREATE TABLE USAGESTATS (
+  GID                     NUMERIC(10, 0)   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,
+  TIMESTAMP               NUMERIC(20, 0)  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,
+  MAXFILEID               NUMERIC(20, 0),
+  FILECOUNT               NUMERIC(20, 0),
+  FILESIZE                NUMERIC(20, 0),
+  SEGCOUNT                NUMERIC(20, 0),
+  SEGSIZE                 NUMERIC(20, 0),
+  SEG2COUNT               NUMERIC(20, 0),
+  SEG2SIZE                NUMERIC(20, 0),
+  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)
+);
+CREATE TABLE EXPERIMENTS (
+ NAME                     VARCHAR2(20),
+ GID                      NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY
+);
+CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(
+  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,
+  DISK_FILE_ID_WHEN_DELETED VARCHAR2(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,
+  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           RAW(200),
+  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,
+  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,
+  COLLOCATION_HINT        VARCHAR2(100),
+  DISK_FILE_PATH          VARCHAR2(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,
+  DELETION_TIME           NUMERIC(20, 0)    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,
+  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)
+);
+CREATE TABLE TAPE_FILE_RECYCLE_BIN(
+  VID                      VARCHAR2(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,
+  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,
+  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,
+  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,
+  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR2(100),
+  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0),
+  WRITE_START_WRAP         NUMERIC(5, 0),
+  WRITE_START_LPOS         NUMERIC(10, 0),
+  WRITE_END_WRAP           NUMERIC(5, 0),
+  WRITE_END_LPOS           NUMERIC(10, 0),
+  READ_START_WRAP          NUMERIC(5, 0),
+  READ_START_LPOS          NUMERIC(10, 0),
+  READ_END_WRAP            NUMERIC(5, 0),
+  READ_END_LPOS            NUMERIC(10, 0),
+  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)
+);INSERT INTO CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR,
+  SCHEMA_VERSION_MINOR,
+  STATUS)
+VALUES(
+  3,
+  0,
+  'PRODUCTION');
+ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (NEXT_SCHEMA_VERSION_MAJOR IS NOT NULL AND NEXT_SCHEMA_VERSION_MINOR IS NOT NULL AND STATUS='UPGRADING')) INITIALLY DEFERRED;
+
+COMMIT;
diff --git a/catalogue/3.0/postgres_catalogue_schema.sql b/catalogue/3.0/postgres_catalogue_schema.sql
new file mode 100644
index 0000000000..4d2039e84d
--- /dev/null
+++ b/catalogue/3.0/postgres_catalogue_schema.sql
@@ -0,0 +1,386 @@
+CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ
+  INCREMENT BY 1
+  START WITH 1
+  NO MAXVALUE
+  MINVALUE 1
+  NO CYCLE
+  CACHE 20;
+CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ
+  INCREMENT BY 1
+  START WITH 1
+  NO MAXVALUE
+  MINVALUE 1
+  NO CYCLE
+  CACHE 20;
+CREATE SEQUENCE STORAGE_CLASS_ID_SEQ
+  INCREMENT BY 1
+  START WITH 1
+  NO MAXVALUE
+  MINVALUE 1
+  NO CYCLE
+  CACHE 20;
+CREATE SEQUENCE TAPE_POOL_ID_SEQ
+  INCREMENT BY 1
+  START WITH 1
+  NO MAXVALUE
+  MINVALUE 1
+  NO CYCLE
+  CACHE 20;
+CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ
+  INCREMENT BY 1
+  START WITH 1
+  NO MAXVALUE
+  MINVALUE 1
+  NO CYCLE
+  CACHE 20;
+CREATE TABLE CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,
+  SCHEMA_VERSION_MINOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,
+  NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0),
+  NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0),
+  STATUS                  VARCHAR(100)
+);
+CREATE TABLE ADMIN_USER(
+  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,
+  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)
+);
+CREATE TABLE DISK_SYSTEM(
+  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,
+  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,
+  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,
+  REFRESH_INTERVAL        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,
+  TARGETED_FREE_SPACE     NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,
+  SLEEP_TIME              NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,
+  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)
+);
+CREATE TABLE VIRTUAL_ORGANIZATION(
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,
+  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),
+  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)
+);
+CREATE TABLE STORAGE_CLASS(
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,
+  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,
+  NB_COPIES               NUMERIC(3, 0)       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,
+  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),
+  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),
+  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE TAPE_POOL(
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,
+  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,
+  NB_PARTIAL_TAPES        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,
+  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,
+  SUPPLY                  VARCHAR(100),
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),
+  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),
+  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),
+  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE ARCHIVE_ROUTE(
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,
+  COPY_NB                 NUMERIC(3, 0)       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,
+  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),
+  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)
+);
+CREATE TABLE LOGICAL_LIBRARY(
+  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,
+  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,
+  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,
+  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),
+  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))
+);
+CREATE TABLE TAPE(
+  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,
+  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,
+  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,
+  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT TAPE_LLI_NN  NOT NULL,
+  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_TPI_NN  NOT NULL,
+  ENCRYPTION_KEY_NAME     VARCHAR(100),
+  CAPACITY_IN_BYTES       NUMERIC(20, 0)      CONSTRAINT TAPE_CIB_NN  NOT NULL,
+  DATA_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT TAPE_DIB_NN  NOT NULL,
+  LAST_FSEQ               NUMERIC(20, 0)      CONSTRAINT TAPE_LF_NN   NOT NULL,
+  NB_MASTER_FILES         NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,
+  MASTER_DATA_IN_BYTES    NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,
+  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,
+  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,
+  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,
+  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,
+  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,
+  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,
+  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,
+  NB_COPY_NB_1            NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,
+  COPY_NB_1_IN_BYTES      NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,
+  NB_COPY_NB_GT_1         NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,
+  COPY_NB_GT_1_IN_BYTES   NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,
+  LABEL_DRIVE             VARCHAR(100),
+  LABEL_TIME              NUMERIC(20, 0)    ,
+  LAST_READ_DRIVE         VARCHAR(100),
+  LAST_READ_TIME          NUMERIC(20, 0)    ,
+  LAST_WRITE_DRIVE        VARCHAR(100),
+  LAST_WRITE_TIME         NUMERIC(20, 0)    ,
+  READ_MOUNT_COUNT        NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,
+  WRITE_MOUNT_COUNT       NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_PK PRIMARY KEY(VID),
+  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),
+  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),
+  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),
+  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))
+);
+CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);
+CREATE TABLE MOUNT_POLICY(
+  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,
+  ARCHIVE_PRIORITY         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,
+  ARCHIVE_MIN_REQUEST_AGE  NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,
+  RETRIEVE_PRIORITY        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,
+  RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,
+  MAX_DRIVES_ALLOWED       NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,
+  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,
+  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),
+  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,
+  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),
+  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE ARCHIVE_FILE(
+  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,
+  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           BYTEA,
+  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,
+  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,
+  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))
+);
+CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);
+CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);
+CREATE TABLE TAPE_FILE(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,
+  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,
+  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,
+  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,
+  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0)    ,
+  WRITE_START_WRAP         NUMERIC(5, 0),
+  WRITE_START_LPOS         NUMERIC(10, 0),
+  WRITE_END_WRAP           NUMERIC(5, 0),
+  WRITE_END_LPOS           NUMERIC(10, 0),
+  READ_START_WRAP          NUMERIC(5, 0),
+  READ_START_LPOS          NUMERIC(10, 0),
+  READ_END_WRAP            NUMERIC(5, 0),
+  READ_END_LPOS            NUMERIC(10, 0),
+  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE(VID, FSEQ)
+);
+CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);
+CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);
+CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);
+CREATE TABLE ACTIVITIES_WEIGHTS (
+  DISK_INSTANCE_NAME       VARCHAR(100),
+  ACTIVITY                 VARCHAR(100),
+  WEIGHT                   VARCHAR(100),
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL
+);
+CREATE TABLE USAGESTATS (
+  GID                     NUMERIC(10, 0)   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,
+  TIMESTAMP               NUMERIC(20, 0)  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,
+  MAXFILEID               NUMERIC(20, 0),
+  FILECOUNT               NUMERIC(20, 0),
+  FILESIZE                NUMERIC(20, 0),
+  SEGCOUNT                NUMERIC(20, 0),
+  SEGSIZE                 NUMERIC(20, 0),
+  SEG2COUNT               NUMERIC(20, 0),
+  SEG2SIZE                NUMERIC(20, 0),
+  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)
+);
+CREATE TABLE EXPERIMENTS (
+ NAME                     VARCHAR(20),
+ GID                      NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY
+);
+CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(
+  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,
+  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,
+  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           BYTEA,
+  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,
+  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,
+  DELETION_TIME           NUMERIC(20, 0)    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,
+  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)
+);
+CREATE TABLE TAPE_FILE_RECYCLE_BIN(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,
+  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,
+  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,
+  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,
+  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0),
+  WRITE_START_WRAP         NUMERIC(5, 0),
+  WRITE_START_LPOS         NUMERIC(10, 0),
+  WRITE_END_WRAP           NUMERIC(5, 0),
+  WRITE_END_LPOS           NUMERIC(10, 0),
+  READ_START_WRAP          NUMERIC(5, 0),
+  READ_START_LPOS          NUMERIC(10, 0),
+  READ_END_WRAP            NUMERIC(5, 0),
+  READ_END_LPOS            NUMERIC(10, 0),
+  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)
+);INSERT INTO CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR,
+  SCHEMA_VERSION_MINOR,
+  STATUS)
+VALUES(
+  3,
+  0,
+  'PRODUCTION');
+ALTER TABLE ARCHIVE_FILE DROP CONSTRAINT
+  ARCHIVE_FILE_DIN_DFI_UN;
+ALTER TABLE ARCHIVE_FILE ADD CONSTRAINT
+  ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) DEFERRABLE INITIALLY IMMEDIATE;
+ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT 
+  CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));
diff --git a/catalogue/3.0/sqlite_catalogue_schema.sql b/catalogue/3.0/sqlite_catalogue_schema.sql
new file mode 100644
index 0000000000..818c6b83db
--- /dev/null
+++ b/catalogue/3.0/sqlite_catalogue_schema.sql
@@ -0,0 +1,360 @@
+CREATE TABLE ARCHIVE_FILE_ID(
+  ID INTEGER PRIMARY KEY AUTOINCREMENT
+);
+CREATE TABLE LOGICAL_LIBRARY_ID(
+  ID INTEGER PRIMARY KEY AUTOINCREMENT
+);
+CREATE TABLE STORAGE_CLASS_ID(
+  ID INTEGER PRIMARY KEY AUTOINCREMENT
+);
+CREATE TABLE TAPE_POOL_ID(
+  ID INTEGER PRIMARY KEY AUTOINCREMENT
+);
+CREATE TABLE VIRTUAL_ORGANIZATION_ID(
+  ID INTEGER PRIMARY KEY AUTOINCREMENT
+);
+CREATE TABLE CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR    INTEGER      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,
+  SCHEMA_VERSION_MINOR    INTEGER      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,
+  NEXT_SCHEMA_VERSION_MAJOR INTEGER,
+  NEXT_SCHEMA_VERSION_MINOR INTEGER,
+  STATUS                  VARCHAR(100)
+);
+CREATE TABLE ADMIN_USER(
+  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,
+  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)
+);
+CREATE TABLE DISK_SYSTEM(
+  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,
+  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,
+  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,
+  REFRESH_INTERVAL        INTEGER      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,
+  TARGETED_FREE_SPACE     INTEGER      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,
+  SLEEP_TIME              INTEGER      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,
+  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)
+);
+CREATE TABLE VIRTUAL_ORGANIZATION(
+  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,
+  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),
+  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)
+);
+CREATE TABLE STORAGE_CLASS(
+  STORAGE_CLASS_ID        INTEGER      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,
+  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,
+  NB_COPIES               INTEGER       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,
+  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,
+  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),
+  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),
+  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE TAPE_POOL(
+  TAPE_POOL_ID            INTEGER      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,
+  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,
+  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,
+  NB_PARTIAL_TAPES        INTEGER      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,
+  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,
+  SUPPLY                  VARCHAR(100),
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),
+  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),
+  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),
+  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)
+);
+CREATE TABLE ARCHIVE_ROUTE(
+  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,
+  COPY_NB                 INTEGER       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,
+  TAPE_POOL_ID            INTEGER      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,
+  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),
+  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)
+);
+CREATE TABLE LOGICAL_LIBRARY(
+  LOGICAL_LIBRARY_ID      INTEGER      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,
+  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,
+  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,
+  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),
+  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))
+);
+CREATE TABLE TAPE(
+  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,
+  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,
+  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,
+  LOGICAL_LIBRARY_ID      INTEGER      CONSTRAINT TAPE_LLI_NN  NOT NULL,
+  TAPE_POOL_ID            INTEGER      CONSTRAINT TAPE_TPI_NN  NOT NULL,
+  ENCRYPTION_KEY_NAME     VARCHAR(100),
+  CAPACITY_IN_BYTES       INTEGER      CONSTRAINT TAPE_CIB_NN  NOT NULL,
+  DATA_IN_BYTES           INTEGER      CONSTRAINT TAPE_DIB_NN  NOT NULL,
+  LAST_FSEQ               INTEGER      CONSTRAINT TAPE_LF_NN   NOT NULL,
+  NB_MASTER_FILES         INTEGER      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,
+  MASTER_DATA_IN_BYTES    INTEGER      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,
+  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,
+  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,
+  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,
+  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,
+  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,
+  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,
+  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,
+  NB_COPY_NB_1            INTEGER     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,
+  COPY_NB_1_IN_BYTES      INTEGER     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,
+  NB_COPY_NB_GT_1         INTEGER     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,
+  COPY_NB_GT_1_IN_BYTES   INTEGER     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,
+  LABEL_DRIVE             VARCHAR(100),
+  LABEL_TIME              INTEGER    ,
+  LAST_READ_DRIVE         VARCHAR(100),
+  LAST_READ_TIME          INTEGER    ,
+  LAST_WRITE_DRIVE        VARCHAR(100),
+  LAST_WRITE_TIME         INTEGER    ,
+  READ_MOUNT_COUNT        INTEGER      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,
+  WRITE_MOUNT_COUNT       INTEGER      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,
+  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME       INTEGER      CONSTRAINT TAPE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME        INTEGER      CONSTRAINT TAPE_LUT_NN  NOT NULL,
+  CONSTRAINT TAPE_PK PRIMARY KEY(VID),
+  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),
+  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),
+  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),
+  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),
+  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),
+  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),
+  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),
+  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))
+);
+CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);
+CREATE TABLE MOUNT_POLICY(
+  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,
+  ARCHIVE_PRIORITY         INTEGER      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,
+  ARCHIVE_MIN_REQUEST_AGE  INTEGER      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,
+  RETRIEVE_PRIORITY        INTEGER      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,
+  RETRIEVE_MIN_REQUEST_AGE INTEGER      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,
+  MAX_DRIVES_ALLOWED       INTEGER      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        INTEGER      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         INTEGER      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,
+  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,
+  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      INTEGER      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       INTEGER      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),
+  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(
+  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,
+  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,
+  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,
+  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME      INTEGER      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME       INTEGER      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,
+  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),
+  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)
+    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)
+);
+CREATE TABLE ARCHIVE_FILE(
+  ARCHIVE_FILE_ID         INTEGER      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,
+  DISK_FILE_UID           INTEGER      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           INTEGER      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           INTEGER      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           BLOB(200),
+  CHECKSUM_ADLER32        INTEGER      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,
+  CREATION_TIME           INTEGER      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     INTEGER      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,
+  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))
+);
+CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);
+CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);
+CREATE TABLE TAPE_FILE(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,
+  FSEQ                     INTEGER     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,
+  BLOCK_ID                 INTEGER     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    INTEGER     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,
+  COPY_NB                  INTEGER      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,
+  CREATION_TIME            INTEGER     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          INTEGER     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       INTEGER    ,
+  WRITE_START_WRAP         INTEGER,
+  WRITE_START_LPOS         INTEGER,
+  WRITE_END_WRAP           INTEGER,
+  WRITE_END_LPOS           INTEGER,
+  READ_START_WRAP          INTEGER,
+  READ_START_LPOS          INTEGER,
+  READ_END_WRAP            INTEGER,
+  READ_END_LPOS            INTEGER,
+  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE(VID, FSEQ)
+);
+CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);
+CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);
+CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);
+CREATE TABLE ACTIVITIES_WEIGHTS (
+  DISK_INSTANCE_NAME       VARCHAR(100),
+  ACTIVITY                 VARCHAR(100),
+  WEIGHT                   VARCHAR(100),
+  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,
+  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,
+  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,
+  CREATION_LOG_TIME        INTEGER      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,
+  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,
+  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,
+  LAST_UPDATE_TIME         INTEGER      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL
+);
+CREATE TABLE USAGESTATS (
+  GID                     INTEGER   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,
+  TIMESTAMP               INTEGER  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,
+  MAXFILEID               INTEGER,
+  FILECOUNT               INTEGER,
+  FILESIZE                INTEGER,
+  SEGCOUNT                INTEGER,
+  SEGSIZE                 INTEGER,
+  SEG2COUNT               INTEGER,
+  SEG2SIZE                INTEGER,
+  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)
+);
+CREATE TABLE EXPERIMENTS (
+ NAME                     VARCHAR(20),
+ GID                      INTEGER CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY
+);
+CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(
+  ARCHIVE_FILE_ID         INTEGER      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,
+  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,
+  DISK_FILE_UID           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           BLOB(200),
+  CHECKSUM_ADLER32        INTEGER      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,
+  CREATION_TIME           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     INTEGER      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,
+  DELETION_TIME           INTEGER    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,
+  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)
+);
+CREATE TABLE TAPE_FILE_RECYCLE_BIN(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,
+  FSEQ                     INTEGER     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,
+  BLOCK_ID                 INTEGER     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    INTEGER     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,
+  COPY_NB                  INTEGER      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,
+  CREATION_TIME            INTEGER     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          INTEGER     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       INTEGER,
+  WRITE_START_WRAP         INTEGER,
+  WRITE_START_LPOS         INTEGER,
+  WRITE_END_WRAP           INTEGER,
+  WRITE_END_LPOS           INTEGER,
+  READ_START_WRAP          INTEGER,
+  READ_START_LPOS          INTEGER,
+  READ_END_WRAP            INTEGER,
+  READ_END_LPOS            INTEGER,
+  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)
+);INSERT INTO CTA_CATALOGUE(
+  SCHEMA_VERSION_MAJOR,
+  SCHEMA_VERSION_MINOR,
+  STATUS)
+VALUES(
+  3,
+  0,
+  'PRODUCTION');
diff --git a/catalogue/AllCatalogueSchema.hpp b/catalogue/AllCatalogueSchema.hpp
index 0fe09a5a7c..a51a7ceec3 100644
--- a/catalogue/AllCatalogueSchema.hpp
+++ b/catalogue/AllCatalogueSchema.hpp
@@ -3800,6 +3800,1530 @@ namespace catalogue{
   "  CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));"
       },
     }  },
+  {"3.0",
+    {
+      {"oracle",  "CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 4294967296"
+  "  NOMAXVALUE"
+  "  MINVALUE 1"
+  "  NOCYCLE"
+  "  CACHE 20"
+  "  NOORDER;"
+  "CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 4294967296"
+  "  NOMAXVALUE"
+  "  MINVALUE 1"
+  "  NOCYCLE"
+  "  CACHE 20"
+  "  NOORDER;"
+  "CREATE SEQUENCE STORAGE_CLASS_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 4294967296"
+  "  NOMAXVALUE"
+  "  MINVALUE 1"
+  "  NOCYCLE"
+  "  CACHE 20"
+  "  NOORDER;"
+  "CREATE SEQUENCE TAPE_POOL_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 4294967296"
+  "  NOMAXVALUE"
+  "  MINVALUE 1"
+  "  NOCYCLE"
+  "  CACHE 20"
+  "  NOORDER;"
+  "CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 4294967296"
+  "  NOMAXVALUE"
+  "  MINVALUE 1"
+  "  NOCYCLE"
+  "  CACHE 20"
+  "  NOORDER;"
+  "CREATE GLOBAL TEMPORARY TABLE TEMP_TAPE_FILE_INSERTION_BATCH("
+  "  VID                   VARCHAR2(100),"
+  "  FSEQ                  NUMERIC(20, 0)  ,"
+  "  BLOCK_ID              NUMERIC(20, 0)  ,"
+  "  LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0)  ,"
+  "  COPY_NB               NUMERIC(3, 0)   ,"
+  "  CREATION_TIME         NUMERIC(20, 0)  ,"
+  "  ARCHIVE_FILE_ID       NUMERIC(20, 0)    "
+  ")"
+  "ON COMMIT DELETE ROWS;"
+  "CREATE INDEX TEMP_T_F_I_B_AFI_IDX ON TEMP_TAPE_FILE_INSERTION_BATCH(ARCHIVE_FILE_ID);"
+  "CREATE TABLE CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,"
+  "  SCHEMA_VERSION_MINOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,"
+  "  NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0),"
+  "  NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0),"
+  "  STATUS                  VARCHAR2(100)"
+  ");"
+  "CREATE TABLE ADMIN_USER("
+  "  ADMIN_USER_NAME         VARCHAR2(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)"
+  ");"
+  "CREATE TABLE DISK_SYSTEM("
+  "  DISK_SYSTEM_NAME        VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,"
+  "  FILE_REGEXP             VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,"
+  "  FREE_SPACE_QUERY_URL    VARCHAR2(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,"
+  "  REFRESH_INTERVAL        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,"
+  "  TARGETED_FREE_SPACE     NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,"
+  "  SLEEP_TIME              NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,"
+  "  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)"
+  ");"
+  "CREATE TABLE VIRTUAL_ORGANIZATION("
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_NAME VARCHAR2(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)"
+  ");"
+  "CREATE TABLE STORAGE_CLASS("
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,"
+  "  STORAGE_CLASS_NAME      VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,"
+  "  NB_COPIES               NUMERIC(3, 0)       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  "
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,"
+  "  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),"
+  "  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),"
+  "  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE TAPE_POOL("
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,"
+  "  TAPE_POOL_NAME          VARCHAR2(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,"
+  "  NB_PARTIAL_TAPES        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,"
+  "  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,"
+  "  SUPPLY                  VARCHAR2(100),"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),"
+  "  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE ARCHIVE_ROUTE("
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,"
+  "  COPY_NB                 NUMERIC(3, 0)       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,"
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),"
+  "  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)"
+  ");"
+  "CREATE TABLE LOGICAL_LIBRARY("
+  "  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,"
+  "  LOGICAL_LIBRARY_NAME    VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),"
+  "  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))"
+  ");"
+  "CREATE TABLE TAPE("
+  "  VID                     VARCHAR2(100)    CONSTRAINT TAPE_V_NN    NOT NULL,"
+  "  MEDIA_TYPE              VARCHAR2(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,"
+  "  VENDOR                  VARCHAR2(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,"
+  "  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT TAPE_LLI_NN  NOT NULL,"
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_TPI_NN  NOT NULL,"
+  "  ENCRYPTION_KEY_NAME     VARCHAR2(100),"
+  "  CAPACITY_IN_BYTES       NUMERIC(20, 0)      CONSTRAINT TAPE_CIB_NN  NOT NULL,"
+  "  DATA_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT TAPE_DIB_NN  NOT NULL,"
+  "  LAST_FSEQ               NUMERIC(20, 0)      CONSTRAINT TAPE_LF_NN   NOT NULL,"
+  "  NB_MASTER_FILES         NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,"
+  "  MASTER_DATA_IN_BYTES    NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,"
+  "  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,"
+  "  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,"
+  "  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,"
+  "  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,"
+  "  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,"
+  "  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,"
+  "  NB_COPY_NB_1            NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,"
+  "  COPY_NB_1_IN_BYTES      NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,"
+  "  NB_COPY_NB_GT_1         NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,"
+  "  COPY_NB_GT_1_IN_BYTES   NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,"
+  "  LABEL_DRIVE             VARCHAR2(100),"
+  "  LABEL_TIME              NUMERIC(20, 0)    ,"
+  "  LAST_READ_DRIVE         VARCHAR2(100),"
+  "  LAST_READ_TIME          NUMERIC(20, 0)    ,"
+  "  LAST_WRITE_DRIVE        VARCHAR2(100),"
+  "  LAST_WRITE_TIME         NUMERIC(20, 0)    ,"
+  "  READ_MOUNT_COUNT        NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,"
+  "  WRITE_MOUNT_COUNT       NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR2(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR2(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR2(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR2(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR2(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_PK PRIMARY KEY(VID),"
+  "  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))"
+  ");"
+  "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);"
+  "CREATE TABLE MOUNT_POLICY("
+  "  MOUNT_POLICY_NAME        VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,"
+  "  ARCHIVE_PRIORITY         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,"
+  "  ARCHIVE_MIN_REQUEST_AGE  NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,"
+  "  RETRIEVE_PRIORITY        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,"
+  "  RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,"
+  "  MAX_DRIVES_ALLOWED       NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,"
+  "  USER_COMMENT             VARCHAR2(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR2(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR2(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_NAME         VARCHAR2(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR2(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR2(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR2(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR2(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),"
+  "  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_GROUP_NAME   VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR2(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR2(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),"
+  "  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE("
+  "  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,"
+  "  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           RAW(200),"
+  "  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,"
+  "  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR2(100),"
+  "  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))"
+  ");"
+  "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);"
+  "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);"
+  "CREATE TABLE TAPE_FILE("
+  "  VID                      VARCHAR2(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,"
+  "  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,"
+  "  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,"
+  "  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,"
+  "  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR2(100),"
+  "  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0)    ,"
+  "  WRITE_START_WRAP         NUMERIC(5, 0),"
+  "  WRITE_START_LPOS         NUMERIC(10, 0),"
+  "  WRITE_END_WRAP           NUMERIC(5, 0),"
+  "  WRITE_END_LPOS           NUMERIC(10, 0),"
+  "  READ_START_WRAP          NUMERIC(5, 0),"
+  "  READ_START_LPOS          NUMERIC(10, 0),"
+  "  READ_END_WRAP            NUMERIC(5, 0),"
+  "  READ_END_LPOS            NUMERIC(10, 0),"
+  "  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE(VID, FSEQ)"
+  ");"
+  "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);"
+  "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);"
+  "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);"
+  "CREATE TABLE ACTIVITIES_WEIGHTS ("
+  "  DISK_INSTANCE_NAME       VARCHAR2(100),"
+  "  ACTIVITY                 VARCHAR2(100),"
+  "  WEIGHT                   VARCHAR2(100),"
+  "  USER_COMMENT             VARCHAR2(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR2(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL"
+  ");"
+  "CREATE TABLE USAGESTATS ("
+  "  GID                     NUMERIC(10, 0)   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,"
+  "  TIMESTAMP               NUMERIC(20, 0)  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,"
+  "  MAXFILEID               NUMERIC(20, 0),"
+  "  FILECOUNT               NUMERIC(20, 0),"
+  "  FILESIZE                NUMERIC(20, 0),"
+  "  SEGCOUNT                NUMERIC(20, 0),"
+  "  SEGSIZE                 NUMERIC(20, 0),"
+  "  SEG2COUNT               NUMERIC(20, 0),"
+  "  SEG2SIZE                NUMERIC(20, 0),"
+  "  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)"
+  ");"
+  "CREATE TABLE EXPERIMENTS ("
+  " NAME                     VARCHAR2(20),"
+  " GID                      NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN("
+  "  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR2(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,"
+  "  DISK_FILE_ID_WHEN_DELETED VARCHAR2(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,"
+  "  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           RAW(200),"
+  "  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR2(100),"
+  "  DISK_FILE_PATH          VARCHAR2(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,"
+  "  DELETION_TIME           NUMERIC(20, 0)    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,"
+  "  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)"
+  ");"
+  "CREATE TABLE TAPE_FILE_RECYCLE_BIN("
+  "  VID                      VARCHAR2(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,"
+  "  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,"
+  "  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,"
+  "  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,"
+  "  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR2(100),"
+  "  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0),"
+  "  WRITE_START_WRAP         NUMERIC(5, 0),"
+  "  WRITE_START_LPOS         NUMERIC(10, 0),"
+  "  WRITE_END_WRAP           NUMERIC(5, 0),"
+  "  WRITE_END_LPOS           NUMERIC(10, 0),"
+  "  READ_START_WRAP          NUMERIC(5, 0),"
+  "  READ_START_LPOS          NUMERIC(10, 0),"
+  "  READ_END_WRAP            NUMERIC(5, 0),"
+  "  READ_END_LPOS            NUMERIC(10, 0),"
+  "  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)"
+  ");INSERT INTO CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR,"
+  "  SCHEMA_VERSION_MINOR,"
+  "  STATUS)"
+  "VALUES("
+  "  3,"
+  "  0,"
+  "  'PRODUCTION');"
+  "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (NEXT_SCHEMA_VERSION_MAJOR IS NOT NULL AND NEXT_SCHEMA_VERSION_MINOR IS NOT NULL AND STATUS='UPGRADING')) INITIALLY DEFERRED;"
+  ""
+  "COMMIT;"
+      },
+  {"mysql",  "CREATE TABLE ARCHIVE_FILE_ID("
+  "  ID BIGINT UNSIGNED,"
+  "  CONSTRAINT ARCHIVE_FILE_ID_PK PRIMARY KEY(ID)"
+  ");"
+  "INSERT INTO ARCHIVE_FILE_ID(ID) VALUES(1);"
+  "CREATE TABLE LOGICAL_LIBRARY_ID("
+  "  ID BIGINT UNSIGNED,"
+  "  CONSTRAINT LOGICAL_LIBRARY_ID_PK PRIMARY KEY(ID)"
+  ");"
+  "INSERT INTO LOGICAL_LIBRARY_ID(ID) VALUES(1);"
+  "CREATE TABLE STORAGE_CLASS_ID("
+  "  ID BIGINT UNSIGNED,"
+  "  CONSTRAINT STORAGE_CLASS_ID_PK PRIMARY KEY(ID)"
+  ");"
+  "INSERT INTO STORAGE_CLASS_ID(ID) VALUES(1);"
+  "CREATE TABLE TAPE_POOL_ID("
+  "  ID BIGINT UNSIGNED,"
+  "  CONSTRAINT TAPE_POOL_ID_PK PRIMARY KEY(ID)"
+  ");"
+  "INSERT INTO TAPE_POOL_ID(ID) VALUES(1);"
+  "CREATE TABLE VIRTUAL_ORGANIZATION_ID("
+  "  ID BIGINT UNSIGNED,"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_ID_PK PRIMARY KEY(ID)"
+  ");"
+  "INSERT INTO VIRTUAL_ORGANIZATION_ID(ID) VALUES(1);"
+  "CREATE TABLE CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR    BIGINT UNSIGNED      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,"
+  "  SCHEMA_VERSION_MINOR    BIGINT UNSIGNED      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,"
+  "  NEXT_SCHEMA_VERSION_MAJOR BIGINT UNSIGNED,"
+  "  NEXT_SCHEMA_VERSION_MINOR BIGINT UNSIGNED,"
+  "  STATUS                  VARCHAR(100)"
+  ");"
+  "CREATE TABLE ADMIN_USER("
+  "  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)"
+  ");"
+  "CREATE TABLE DISK_SYSTEM("
+  "  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,"
+  "  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,"
+  "  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,"
+  "  REFRESH_INTERVAL        BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,"
+  "  TARGETED_FREE_SPACE     BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,"
+  "  SLEEP_TIME              BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,"
+  "  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)"
+  ");"
+  "CREATE TABLE VIRTUAL_ORGANIZATION("
+  "  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)"
+  ");"
+  "CREATE TABLE STORAGE_CLASS("
+  "  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,"
+  "  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,"
+  "  NB_COPIES               TINYINT UNSIGNED       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  "
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,"
+  "  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),"
+  "  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),"
+  "  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE TAPE_POOL("
+  "  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,"
+  "  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,"
+  "  NB_PARTIAL_TAPES        BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,"
+  "  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,"
+  "  SUPPLY                  VARCHAR(100),"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),"
+  "  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE ARCHIVE_ROUTE("
+  "  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,"
+  "  COPY_NB                 TINYINT UNSIGNED       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,"
+  "  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),"
+  "  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)"
+  ");"
+  "CREATE TABLE LOGICAL_LIBRARY("
+  "  LOGICAL_LIBRARY_ID      BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,"
+  "  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),"
+  "  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))"
+  ");"
+  "CREATE TABLE TAPE("
+  "  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,"
+  "  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,"
+  "  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,"
+  "  LOGICAL_LIBRARY_ID      BIGINT UNSIGNED      CONSTRAINT TAPE_LLI_NN  NOT NULL,"
+  "  TAPE_POOL_ID            BIGINT UNSIGNED      CONSTRAINT TAPE_TPI_NN  NOT NULL,"
+  "  ENCRYPTION_KEY_NAME     VARCHAR(100),"
+  "  CAPACITY_IN_BYTES       BIGINT UNSIGNED      CONSTRAINT TAPE_CIB_NN  NOT NULL,"
+  "  DATA_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT TAPE_DIB_NN  NOT NULL,"
+  "  LAST_FSEQ               BIGINT UNSIGNED      CONSTRAINT TAPE_LF_NN   NOT NULL,"
+  "  NB_MASTER_FILES         BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,"
+  "  MASTER_DATA_IN_BYTES    BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,"
+  "  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,"
+  "  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,"
+  "  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,"
+  "  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,"
+  "  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,"
+  "  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,"
+  "  NB_COPY_NB_1            BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,"
+  "  COPY_NB_1_IN_BYTES      BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,"
+  "  NB_COPY_NB_GT_1         BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,"
+  "  COPY_NB_GT_1_IN_BYTES   BIGINT UNSIGNED     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,"
+  "  LABEL_DRIVE             VARCHAR(100),"
+  "  LABEL_TIME              BIGINT UNSIGNED    ,"
+  "  LAST_READ_DRIVE         VARCHAR(100),"
+  "  LAST_READ_TIME          BIGINT UNSIGNED    ,"
+  "  LAST_WRITE_DRIVE        VARCHAR(100),"
+  "  LAST_WRITE_TIME         BIGINT UNSIGNED    ,"
+  "  READ_MOUNT_COUNT        BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,"
+  "  WRITE_MOUNT_COUNT       BIGINT UNSIGNED      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       BIGINT UNSIGNED      CONSTRAINT TAPE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        BIGINT UNSIGNED      CONSTRAINT TAPE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_PK PRIMARY KEY(VID),"
+  "  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))"
+  ");"
+  "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);"
+  "CREATE TABLE MOUNT_POLICY("
+  "  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,"
+  "  ARCHIVE_PRIORITY         BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,"
+  "  ARCHIVE_MIN_REQUEST_AGE  BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,"
+  "  RETRIEVE_PRIORITY        BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,"
+  "  RETRIEVE_MIN_REQUEST_AGE BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,"
+  "  MAX_DRIVES_ALLOWED       BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         BIGINT UNSIGNED      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      BIGINT UNSIGNED      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       BIGINT UNSIGNED      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),"
+  "  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      BIGINT UNSIGNED      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       BIGINT UNSIGNED      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),"
+  "  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE("
+  "  ARCHIVE_FILE_ID         BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,"
+  "  DISK_FILE_UID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           VARBINARY(200),"
+  "  CHECKSUM_ADLER32        INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,"
+  "  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))"
+  ");"
+  "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);"
+  "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);"
+  "CREATE TABLE TAPE_FILE("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,"
+  "  FSEQ                     BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,"
+  "  BLOCK_ID                 BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,"
+  "  COPY_NB                  TINYINT UNSIGNED      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,"
+  "  CREATION_TIME            BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       BIGINT UNSIGNED    ,"
+  "  WRITE_START_WRAP         SMALLINT UNSIGNED,"
+  "  WRITE_START_LPOS         INT UNSIGNED,"
+  "  WRITE_END_WRAP           SMALLINT UNSIGNED,"
+  "  WRITE_END_LPOS           INT UNSIGNED,"
+  "  READ_START_WRAP          SMALLINT UNSIGNED,"
+  "  READ_START_LPOS          INT UNSIGNED,"
+  "  READ_END_WRAP            SMALLINT UNSIGNED,"
+  "  READ_END_LPOS            INT UNSIGNED,"
+  "  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE(VID, FSEQ)"
+  ");"
+  "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);"
+  "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);"
+  "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);"
+  "CREATE TABLE ACTIVITIES_WEIGHTS ("
+  "  DISK_INSTANCE_NAME       VARCHAR(100),"
+  "  ACTIVITY                 VARCHAR(100),"
+  "  WEIGHT                   VARCHAR(100),"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        BIGINT UNSIGNED      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         BIGINT UNSIGNED      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL"
+  ");"
+  "CREATE TABLE USAGESTATS ("
+  "  GID                     INT UNSIGNED   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,"
+  "  TIMESTAMP               BIGINT UNSIGNED  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,"
+  "  MAXFILEID               BIGINT UNSIGNED,"
+  "  FILECOUNT               BIGINT UNSIGNED,"
+  "  FILESIZE                BIGINT UNSIGNED,"
+  "  SEGCOUNT                BIGINT UNSIGNED,"
+  "  SEGSIZE                 BIGINT UNSIGNED,"
+  "  SEG2COUNT               BIGINT UNSIGNED,"
+  "  SEG2SIZE                BIGINT UNSIGNED,"
+  "  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)"
+  ");"
+  "CREATE TABLE EXPERIMENTS ("
+  " NAME                     VARCHAR(20),"
+  " GID                      INT UNSIGNED CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN("
+  "  ARCHIVE_FILE_ID         BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,"
+  "  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,"
+  "  DISK_FILE_UID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           VARBINARY(200),"
+  "  CHECKSUM_ADLER32        INT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     BIGINT UNSIGNED      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,"
+  "  DELETION_TIME           BIGINT UNSIGNED    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,"
+  "  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)"
+  ");"
+  "CREATE TABLE TAPE_FILE_RECYCLE_BIN("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,"
+  "  FSEQ                     BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,"
+  "  BLOCK_ID                 BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,"
+  "  COPY_NB                  TINYINT UNSIGNED      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,"
+  "  CREATION_TIME            BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          BIGINT UNSIGNED     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       BIGINT UNSIGNED,"
+  "  WRITE_START_WRAP         SMALLINT UNSIGNED,"
+  "  WRITE_START_LPOS         INT UNSIGNED,"
+  "  WRITE_END_WRAP           SMALLINT UNSIGNED,"
+  "  WRITE_END_LPOS           INT UNSIGNED,"
+  "  READ_START_WRAP          SMALLINT UNSIGNED,"
+  "  READ_START_LPOS          INT UNSIGNED,"
+  "  READ_END_WRAP            SMALLINT UNSIGNED,"
+  "  READ_END_LPOS            INT UNSIGNED,"
+  "  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)"
+  ");INSERT INTO CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR,"
+  "  SCHEMA_VERSION_MINOR,"
+  "  STATUS)"
+  "VALUES("
+  "  3,"
+  "  0,"
+  "  'PRODUCTION');"
+  "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT "
+  "  CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));"
+      },
+  {"sqlite",  "CREATE TABLE ARCHIVE_FILE_ID("
+  "  ID INTEGER PRIMARY KEY AUTOINCREMENT"
+  ");"
+  "CREATE TABLE LOGICAL_LIBRARY_ID("
+  "  ID INTEGER PRIMARY KEY AUTOINCREMENT"
+  ");"
+  "CREATE TABLE STORAGE_CLASS_ID("
+  "  ID INTEGER PRIMARY KEY AUTOINCREMENT"
+  ");"
+  "CREATE TABLE TAPE_POOL_ID("
+  "  ID INTEGER PRIMARY KEY AUTOINCREMENT"
+  ");"
+  "CREATE TABLE VIRTUAL_ORGANIZATION_ID("
+  "  ID INTEGER PRIMARY KEY AUTOINCREMENT"
+  ");"
+  "CREATE TABLE CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR    INTEGER      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,"
+  "  SCHEMA_VERSION_MINOR    INTEGER      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,"
+  "  NEXT_SCHEMA_VERSION_MAJOR INTEGER,"
+  "  NEXT_SCHEMA_VERSION_MINOR INTEGER,"
+  "  STATUS                  VARCHAR(100)"
+  ");"
+  "CREATE TABLE ADMIN_USER("
+  "  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)"
+  ");"
+  "CREATE TABLE DISK_SYSTEM("
+  "  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,"
+  "  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,"
+  "  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,"
+  "  REFRESH_INTERVAL        INTEGER      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,"
+  "  TARGETED_FREE_SPACE     INTEGER      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,"
+  "  SLEEP_TIME              INTEGER      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,"
+  "  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)"
+  ");"
+  "CREATE TABLE VIRTUAL_ORGANIZATION("
+  "  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)"
+  ");"
+  "CREATE TABLE STORAGE_CLASS("
+  "  STORAGE_CLASS_ID        INTEGER      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,"
+  "  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,"
+  "  NB_COPIES               INTEGER       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  "
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,"
+  "  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),"
+  "  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),"
+  "  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE TAPE_POOL("
+  "  TAPE_POOL_ID            INTEGER      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,"
+  "  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID INTEGER      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,"
+  "  NB_PARTIAL_TAPES        INTEGER      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,"
+  "  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,"
+  "  SUPPLY                  VARCHAR(100),"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),"
+  "  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE ARCHIVE_ROUTE("
+  "  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,"
+  "  COPY_NB                 INTEGER       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,"
+  "  TAPE_POOL_ID            INTEGER      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),"
+  "  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)"
+  ");"
+  "CREATE TABLE LOGICAL_LIBRARY("
+  "  LOGICAL_LIBRARY_ID      INTEGER      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,"
+  "  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),"
+  "  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))"
+  ");"
+  "CREATE TABLE TAPE("
+  "  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,"
+  "  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,"
+  "  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,"
+  "  LOGICAL_LIBRARY_ID      INTEGER      CONSTRAINT TAPE_LLI_NN  NOT NULL,"
+  "  TAPE_POOL_ID            INTEGER      CONSTRAINT TAPE_TPI_NN  NOT NULL,"
+  "  ENCRYPTION_KEY_NAME     VARCHAR(100),"
+  "  CAPACITY_IN_BYTES       INTEGER      CONSTRAINT TAPE_CIB_NN  NOT NULL,"
+  "  DATA_IN_BYTES           INTEGER      CONSTRAINT TAPE_DIB_NN  NOT NULL,"
+  "  LAST_FSEQ               INTEGER      CONSTRAINT TAPE_LF_NN   NOT NULL,"
+  "  NB_MASTER_FILES         INTEGER      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,"
+  "  MASTER_DATA_IN_BYTES    INTEGER      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,"
+  "  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,"
+  "  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,"
+  "  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,"
+  "  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,"
+  "  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,"
+  "  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,"
+  "  NB_COPY_NB_1            INTEGER     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,"
+  "  COPY_NB_1_IN_BYTES      INTEGER     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,"
+  "  NB_COPY_NB_GT_1         INTEGER     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,"
+  "  COPY_NB_GT_1_IN_BYTES   INTEGER     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,"
+  "  LABEL_DRIVE             VARCHAR(100),"
+  "  LABEL_TIME              INTEGER    ,"
+  "  LAST_READ_DRIVE         VARCHAR(100),"
+  "  LAST_READ_TIME          INTEGER    ,"
+  "  LAST_WRITE_DRIVE        VARCHAR(100),"
+  "  LAST_WRITE_TIME         INTEGER    ,"
+  "  READ_MOUNT_COUNT        INTEGER      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,"
+  "  WRITE_MOUNT_COUNT       INTEGER      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       INTEGER      CONSTRAINT TAPE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        INTEGER      CONSTRAINT TAPE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_PK PRIMARY KEY(VID),"
+  "  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))"
+  ");"
+  "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);"
+  "CREATE TABLE MOUNT_POLICY("
+  "  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,"
+  "  ARCHIVE_PRIORITY         INTEGER      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,"
+  "  ARCHIVE_MIN_REQUEST_AGE  INTEGER      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,"
+  "  RETRIEVE_PRIORITY        INTEGER      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,"
+  "  RETRIEVE_MIN_REQUEST_AGE INTEGER      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,"
+  "  MAX_DRIVES_ALLOWED       INTEGER      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        INTEGER      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         INTEGER      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      INTEGER      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       INTEGER      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),"
+  "  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      INTEGER      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       INTEGER      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),"
+  "  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE("
+  "  ARCHIVE_FILE_ID         INTEGER      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,"
+  "  DISK_FILE_UID           INTEGER      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           INTEGER      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           INTEGER      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           BLOB(200),"
+  "  CHECKSUM_ADLER32        INTEGER      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           INTEGER      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     INTEGER      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,"
+  "  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))"
+  ");"
+  "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);"
+  "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);"
+  "CREATE TABLE TAPE_FILE("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,"
+  "  FSEQ                     INTEGER     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,"
+  "  BLOCK_ID                 INTEGER     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    INTEGER     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,"
+  "  COPY_NB                  INTEGER      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,"
+  "  CREATION_TIME            INTEGER     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          INTEGER     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       INTEGER    ,"
+  "  WRITE_START_WRAP         INTEGER,"
+  "  WRITE_START_LPOS         INTEGER,"
+  "  WRITE_END_WRAP           INTEGER,"
+  "  WRITE_END_LPOS           INTEGER,"
+  "  READ_START_WRAP          INTEGER,"
+  "  READ_START_LPOS          INTEGER,"
+  "  READ_END_WRAP            INTEGER,"
+  "  READ_END_LPOS            INTEGER,"
+  "  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE(VID, FSEQ)"
+  ");"
+  "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);"
+  "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);"
+  "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);"
+  "CREATE TABLE ACTIVITIES_WEIGHTS ("
+  "  DISK_INSTANCE_NAME       VARCHAR(100),"
+  "  ACTIVITY                 VARCHAR(100),"
+  "  WEIGHT                   VARCHAR(100),"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        INTEGER      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         INTEGER      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL"
+  ");"
+  "CREATE TABLE USAGESTATS ("
+  "  GID                     INTEGER   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,"
+  "  TIMESTAMP               INTEGER  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,"
+  "  MAXFILEID               INTEGER,"
+  "  FILECOUNT               INTEGER,"
+  "  FILESIZE                INTEGER,"
+  "  SEGCOUNT                INTEGER,"
+  "  SEGSIZE                 INTEGER,"
+  "  SEG2COUNT               INTEGER,"
+  "  SEG2SIZE                INTEGER,"
+  "  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)"
+  ");"
+  "CREATE TABLE EXPERIMENTS ("
+  " NAME                     VARCHAR(20),"
+  " GID                      INTEGER CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN("
+  "  ARCHIVE_FILE_ID         INTEGER      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,"
+  "  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,"
+  "  DISK_FILE_UID           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           BLOB(200),"
+  "  CHECKSUM_ADLER32        INTEGER      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        INTEGER      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           INTEGER      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     INTEGER      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,"
+  "  DELETION_TIME           INTEGER    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,"
+  "  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)"
+  ");"
+  "CREATE TABLE TAPE_FILE_RECYCLE_BIN("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,"
+  "  FSEQ                     INTEGER     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,"
+  "  BLOCK_ID                 INTEGER     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    INTEGER     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,"
+  "  COPY_NB                  INTEGER      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,"
+  "  CREATION_TIME            INTEGER     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          INTEGER     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       INTEGER,"
+  "  WRITE_START_WRAP         INTEGER,"
+  "  WRITE_START_LPOS         INTEGER,"
+  "  WRITE_END_WRAP           INTEGER,"
+  "  WRITE_END_LPOS           INTEGER,"
+  "  READ_START_WRAP          INTEGER,"
+  "  READ_START_LPOS          INTEGER,"
+  "  READ_END_WRAP            INTEGER,"
+  "  READ_END_LPOS            INTEGER,"
+  "  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)"
+  ");INSERT INTO CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR,"
+  "  SCHEMA_VERSION_MINOR,"
+  "  STATUS)"
+  "VALUES("
+  "  3,"
+  "  0,"
+  "  'PRODUCTION');"
+      },
+  {"postgres",  "CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 1"
+  "  NO MAXVALUE"
+  "  MINVALUE 1"
+  "  NO CYCLE"
+  "  CACHE 20;"
+  "CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 1"
+  "  NO MAXVALUE"
+  "  MINVALUE 1"
+  "  NO CYCLE"
+  "  CACHE 20;"
+  "CREATE SEQUENCE STORAGE_CLASS_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 1"
+  "  NO MAXVALUE"
+  "  MINVALUE 1"
+  "  NO CYCLE"
+  "  CACHE 20;"
+  "CREATE SEQUENCE TAPE_POOL_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 1"
+  "  NO MAXVALUE"
+  "  MINVALUE 1"
+  "  NO CYCLE"
+  "  CACHE 20;"
+  "CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ"
+  "  INCREMENT BY 1"
+  "  START WITH 1"
+  "  NO MAXVALUE"
+  "  MINVALUE 1"
+  "  NO CYCLE"
+  "  CACHE 20;"
+  "CREATE TABLE CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL,"
+  "  SCHEMA_VERSION_MINOR    NUMERIC(20, 0)      CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL,"
+  "  NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0),"
+  "  NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0),"
+  "  STATUS                  VARCHAR(100)"
+  ");"
+  "CREATE TABLE ADMIN_USER("
+  "  ADMIN_USER_NAME         VARCHAR(100)    CONSTRAINT ADMIN_USER_AUN_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ADMIN_USER_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ADMIN_USER_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)"
+  ");"
+  "CREATE TABLE DISK_SYSTEM("
+  "  DISK_SYSTEM_NAME        VARCHAR(100)    CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL,"
+  "  FILE_REGEXP             VARCHAR(100)    CONSTRAINT DISK_SYSTEM_FR_NN   NOT NULL,"
+  "  FREE_SPACE_QUERY_URL    VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL,"
+  "  REFRESH_INTERVAL        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_RI_NN   NOT NULL,"
+  "  TARGETED_FREE_SPACE     NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_TFS_NN  NOT NULL,"
+  "  SLEEP_TIME              NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_ST_NN   NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT DISK_SYSTEM_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT DISK_SYSTEM_LUT_NN  NOT NULL,"
+  "  CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)"
+  ");"
+  "CREATE TABLE VIRTUAL_ORGANIZATION("
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_NAME VARCHAR(100)  CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN  NOT NULL,"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID),"
+  "  CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)"
+  ");"
+  "CREATE TABLE STORAGE_CLASS("
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_SCI_NN  NOT NULL,"
+  "  STORAGE_CLASS_NAME      VARCHAR(100)    CONSTRAINT STORAGE_CLASS_SCN_NN  NOT NULL,"
+  "  NB_COPIES               NUMERIC(3, 0)       CONSTRAINT STORAGE_CLASS_NC_NN   NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_VOI_NN  NOT NULL,  "
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT STORAGE_CLASS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT STORAGE_CLASS_LUT_NN  NOT NULL,"
+  "  CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID),"
+  "  CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME),"
+  "  CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE TAPE_POOL("
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_TPI_NN  NOT NULL,"
+  "  TAPE_POOL_NAME          VARCHAR(100)    CONSTRAINT TAPE_POOL_TPN_NN  NOT NULL,"
+  "  VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_VOI_NN  NOT NULL,"
+  "  NB_PARTIAL_TAPES        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_NPT_NN  NOT NULL,"
+  "  IS_ENCRYPTED            CHAR(1)         CONSTRAINT TAPE_POOL_IE_NN   NOT NULL,"
+  "  SUPPLY                  VARCHAR(100),"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_POOL_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_POOL_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME),"
+  "  CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)"
+  ");"
+  "CREATE TABLE ARCHIVE_ROUTE("
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_SCI_NN  NOT NULL,"
+  "  COPY_NB                 NUMERIC(3, 0)       CONSTRAINT ARCHIVE_ROUTE_CN_NN   NOT NULL,"
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_TPI_NN  NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT ARCHIVE_ROUTE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_ROUTE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB),"
+  "  CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)"
+  ");"
+  "CREATE TABLE LOGICAL_LIBRARY("
+  "  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LLI_NN  NOT NULL,"
+  "  LOGICAL_LIBRARY_NAME    VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LLN_NN  NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT LOGICAL_LIBRARY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT LOGICAL_LIBRARY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME),"
+  "  CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))"
+  ");"
+  "CREATE TABLE TAPE("
+  "  VID                     VARCHAR(100)    CONSTRAINT TAPE_V_NN    NOT NULL,"
+  "  MEDIA_TYPE              VARCHAR(100)    CONSTRAINT TAPE_MT_NN   NOT NULL,"
+  "  VENDOR                  VARCHAR(100)    CONSTRAINT TAPE_V2_NN   NOT NULL,"
+  "  LOGICAL_LIBRARY_ID      NUMERIC(20, 0)      CONSTRAINT TAPE_LLI_NN  NOT NULL,"
+  "  TAPE_POOL_ID            NUMERIC(20, 0)      CONSTRAINT TAPE_TPI_NN  NOT NULL,"
+  "  ENCRYPTION_KEY_NAME     VARCHAR(100),"
+  "  CAPACITY_IN_BYTES       NUMERIC(20, 0)      CONSTRAINT TAPE_CIB_NN  NOT NULL,"
+  "  DATA_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT TAPE_DIB_NN  NOT NULL,"
+  "  LAST_FSEQ               NUMERIC(20, 0)      CONSTRAINT TAPE_LF_NN   NOT NULL,"
+  "  NB_MASTER_FILES         NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL,"
+  "  MASTER_DATA_IN_BYTES    NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL,"
+  "  IS_DISABLED             CHAR(1)         CONSTRAINT TAPE_ID_NN   NOT NULL,"
+  "  IS_FULL                 CHAR(1)         CONSTRAINT TAPE_IF_NN   NOT NULL,"
+  "  IS_READ_ONLY            CHAR(1)         CONSTRAINT TAPE_IRO_NN  NOT NULL,"
+  "  IS_FROM_CASTOR          CHAR(1)         CONSTRAINT TAPE_IFC_NN  NOT NULL,"
+  "  IS_ARCHIVED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IA_NN   NOT NULL,"
+  "  IS_EXPORTED             CHAR(1)         DEFAULT '0' CONSTRAINT TAPE_IE_NN   NOT NULL,"
+  "  DIRTY                   CHAR(1)         DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL,"
+  "  NB_COPY_NB_1            NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL,"
+  "  COPY_NB_1_IN_BYTES      NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL,"
+  "  NB_COPY_NB_GT_1         NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL,"
+  "  COPY_NB_GT_1_IN_BYTES   NUMERIC(20, 0)     DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL,"
+  "  LABEL_DRIVE             VARCHAR(100),"
+  "  LABEL_TIME              NUMERIC(20, 0)    ,"
+  "  LAST_READ_DRIVE         VARCHAR(100),"
+  "  LAST_READ_TIME          NUMERIC(20, 0)    ,"
+  "  LAST_WRITE_DRIVE        VARCHAR(100),"
+  "  LAST_WRITE_TIME         NUMERIC(20, 0)    ,"
+  "  READ_MOUNT_COUNT        NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL,"
+  "  WRITE_MOUNT_COUNT       NUMERIC(20, 0)      DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL,"
+  "  USER_COMMENT            VARCHAR(1000)   CONSTRAINT TAPE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME  VARCHAR(100)    CONSTRAINT TAPE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME       NUMERIC(20, 0)      CONSTRAINT TAPE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME   VARCHAR(100)    CONSTRAINT TAPE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME        NUMERIC(20, 0)      CONSTRAINT TAPE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT TAPE_PK PRIMARY KEY(VID),"
+  "  CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID),"
+  "  CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID),"
+  "  CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')),"
+  "  CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))"
+  ");"
+  "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);"
+  "CREATE TABLE MOUNT_POLICY("
+  "  MOUNT_POLICY_NAME        VARCHAR(100)    CONSTRAINT MOUNT_POLICY_MPN_NN  NOT NULL,"
+  "  ARCHIVE_PRIORITY         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AP_NN   NOT NULL,"
+  "  ARCHIVE_MIN_REQUEST_AGE  NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL,"
+  "  RETRIEVE_PRIORITY        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RP_NN   NOT NULL,"
+  "  RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL,"
+  "  MAX_DRIVES_ALLOWED       NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_MDA_NN  NOT NULL,"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT MOUNT_POLICY_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT MOUNT_POLICY_LUT_NN  NOT NULL,"
+  "  CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_NAME         VARCHAR(100)    CONSTRAINT RQSTER_RULE_RN_NN   NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME),"
+  "  CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE("
+  "  DISK_INSTANCE_NAME     VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_DIN_NN  NOT NULL,"
+  "  REQUESTER_GROUP_NAME   VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_RGN_NN  NOT NULL,"
+  "  MOUNT_POLICY_NAME      VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_MPN_NN  NOT NULL,"
+  "  USER_COMMENT           VARCHAR(1000)   CONSTRAINT RQSTER_GRP_RULE_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME      NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME  VARCHAR(100)    CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME       NUMERIC(20, 0)      CONSTRAINT RQSTER_GRP_RULE_LUT_NN  NOT NULL,"
+  "  CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME),"
+  "  CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)"
+  "    REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE("
+  "  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_DFI_NN  NOT NULL,"
+  "  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           BYTEA,"
+  "  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RT_NN   NOT NULL,"
+  "  IS_DELETED              CHAR(1)         DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))"
+  ");"
+  "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);"
+  "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);"
+  "CREATE TABLE TAPE_FILE("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_V_NN    NOT NULL,"
+  "  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_F_NN    NOT NULL,"
+  "  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL,"
+  "  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_CN_NN   NOT NULL,"
+  "  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0)    ,"
+  "  WRITE_START_WRAP         NUMERIC(5, 0),"
+  "  WRITE_START_LPOS         NUMERIC(10, 0),"
+  "  WRITE_END_WRAP           NUMERIC(5, 0),"
+  "  WRITE_END_LPOS           NUMERIC(10, 0),"
+  "  READ_START_WRAP          NUMERIC(5, 0),"
+  "  READ_START_LPOS          NUMERIC(10, 0),"
+  "  READ_END_WRAP            NUMERIC(5, 0),"
+  "  READ_END_LPOS            NUMERIC(10, 0),"
+  "  CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE(VID, FSEQ)"
+  ");"
+  "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);"
+  "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);"
+  "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);"
+  "CREATE TABLE ACTIVITIES_WEIGHTS ("
+  "  DISK_INSTANCE_NAME       VARCHAR(100),"
+  "  ACTIVITY                 VARCHAR(100),"
+  "  WEIGHT                   VARCHAR(100),"
+  "  USER_COMMENT             VARCHAR(1000)   CONSTRAINT ACTIV_WEIGHTS_UC_NN   NOT NULL,"
+  "  CREATION_LOG_USER_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL,"
+  "  CREATION_LOG_HOST_NAME   VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL,"
+  "  CREATION_LOG_TIME        NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_CLT_NN  NOT NULL,"
+  "  LAST_UPDATE_USER_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL,"
+  "  LAST_UPDATE_HOST_NAME    VARCHAR(100)    CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL,"
+  "  LAST_UPDATE_TIME         NUMERIC(20, 0)      CONSTRAINT ACTIV_WEIGHTS_LUT_NN  NOT NULL"
+  ");"
+  "CREATE TABLE USAGESTATS ("
+  "  GID                     NUMERIC(10, 0)   DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL,"
+  "  TIMESTAMP               NUMERIC(20, 0)  DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL,"
+  "  MAXFILEID               NUMERIC(20, 0),"
+  "  FILECOUNT               NUMERIC(20, 0),"
+  "  FILESIZE                NUMERIC(20, 0),"
+  "  SEGCOUNT                NUMERIC(20, 0),"
+  "  SEGSIZE                 NUMERIC(20, 0),"
+  "  SEG2COUNT               NUMERIC(20, 0),"
+  "  SEG2SIZE                NUMERIC(20, 0),"
+  "  CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)"
+  ");"
+  "CREATE TABLE EXPERIMENTS ("
+  " NAME                     VARCHAR(20),"
+  " GID                      NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY"
+  ");"
+  "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN("
+  "  ARCHIVE_FILE_ID         NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,"
+  "  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,"
+  "  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,"
+  "  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,"
+  "  DISK_FILE_UID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,"
+  "  DISK_FILE_GID           NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,"
+  "  SIZE_IN_BYTES           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,"
+  "  CHECKSUM_BLOB           BYTEA,"
+  "  CHECKSUM_ADLER32        NUMERIC(10, 0)      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,"
+  "  STORAGE_CLASS_ID        NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,"
+  "  CREATION_TIME           NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,"
+  "  RECONCILIATION_TIME     NUMERIC(20, 0)      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,"
+  "  COLLOCATION_HINT        VARCHAR(100),"
+  "  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,"
+  "  DELETION_TIME           NUMERIC(20, 0)    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,"
+  "  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),"
+  "  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)"
+  ");"
+  "CREATE TABLE TAPE_FILE_RECYCLE_BIN("
+  "  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,"
+  "  FSEQ                     NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,"
+  "  BLOCK_ID                 NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,"
+  "  LOGICAL_SIZE_IN_BYTES    NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,"
+  "  COPY_NB                  NUMERIC(3, 0)      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,"
+  "  CREATION_TIME            NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,"
+  "  ARCHIVE_FILE_ID          NUMERIC(20, 0)     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,"
+  "  SUPERSEDED_BY_VID        VARCHAR(100),"
+  "  SUPERSEDED_BY_FSEQ       NUMERIC(20, 0),"
+  "  WRITE_START_WRAP         NUMERIC(5, 0),"
+  "  WRITE_START_LPOS         NUMERIC(10, 0),"
+  "  WRITE_END_WRAP           NUMERIC(5, 0),"
+  "  WRITE_END_LPOS           NUMERIC(10, 0),"
+  "  READ_START_WRAP          NUMERIC(5, 0),"
+  "  READ_START_LPOS          NUMERIC(10, 0),"
+  "  READ_END_WRAP            NUMERIC(5, 0),"
+  "  READ_END_LPOS            NUMERIC(10, 0),"
+  "  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),"
+  "  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)"
+  "    REFERENCES TAPE(VID),"
+  "  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)"
+  "    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),"
+  "  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),"
+  "  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)"
+  "    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)"
+  ");INSERT INTO CTA_CATALOGUE("
+  "  SCHEMA_VERSION_MAJOR,"
+  "  SCHEMA_VERSION_MINOR,"
+  "  STATUS)"
+  "VALUES("
+  "  3,"
+  "  0,"
+  "  'PRODUCTION');"
+  "ALTER TABLE ARCHIVE_FILE DROP CONSTRAINT"
+  "  ARCHIVE_FILE_DIN_DFI_UN;"
+  "ALTER TABLE ARCHIVE_FILE ADD CONSTRAINT"
+  "  ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) DEFERRABLE INITIALLY IMMEDIATE;"
+  "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT "
+  "  CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));"
+      },
+    }  },
 };
 	  
 }}
diff --git a/catalogue/ArchiveFileBuilder.cpp b/catalogue/ArchiveFileBuilder.cpp
index f82727e340..b81ea83ff3 100644
--- a/catalogue/ArchiveFileBuilder.cpp
+++ b/catalogue/ArchiveFileBuilder.cpp
@@ -24,95 +24,7 @@
 namespace cta {
 namespace catalogue {
 
-//------------------------------------------------------------------------------
-// constructor
-//------------------------------------------------------------------------------
-ArchiveFileBuilder::ArchiveFileBuilder(log::Logger &log):
-  m_log(log) {
-}
 
-//------------------------------------------------------------------------------
-// append
-//------------------------------------------------------------------------------
-std::unique_ptr<common::dataStructures::ArchiveFile> ArchiveFileBuilder::append(
-  const common::dataStructures::ArchiveFile &tapeFile) {
-
-  // If there is currently no ArchiveFile object under construction
-  if(nullptr == m_archiveFile.get()) {
-    // If the tape file represents an ArchiveFile object with no tape files
-    if(tapeFile.tapeFiles.empty()) {
-      // Archive file is already complete
-      return std::unique_ptr<common::dataStructures::ArchiveFile>(new common::dataStructures::ArchiveFile(tapeFile));
-    }
-
-    // If the tape file exists then it must be alone
-    if(tapeFile.tapeFiles.size() != 1) {
-      exception::Exception ex;
-      ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" <<
-        tapeFile.tapeFiles.size();
-      throw ex;
-    }
-
-    // Start constructing one
-    m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile));
-
-    // There could be more tape files so return incomplete
-    return std::unique_ptr<common::dataStructures::ArchiveFile>();
-  }
-
-  // If the tape file represents an ArchiveFile object with no tape files
-  if(tapeFile.tapeFiles.empty()) {
-    // The ArchiveFile object under construction is complete,
-    // therefore return it and start the construction of the next
-    std::unique_ptr<common::dataStructures::ArchiveFile> tmp;
-    tmp = std::move(m_archiveFile);
-    m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile));
-    return tmp;
-  }
-
-  // If the tape file to be appended belongs to the ArchiveFile object
-  // currently under construction
-  if(tapeFile.archiveFileID == m_archiveFile->archiveFileID) {
-
-    // The tape file must exist and must be alone
-    if(tapeFile.tapeFiles.size() != 1) {
-      exception::Exception ex;
-      ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" <<
-        tapeFile.tapeFiles.size() << " archiveFileID=" << tapeFile.archiveFileID;
-      throw ex;
-    }
-
-    // Append the tape file
-    m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front());
-
-    // There could be more tape files so return incomplete
-    return std::unique_ptr<common::dataStructures::ArchiveFile>();
-  }
-
-  // Reaching this point means the tape file to be appended belongs to the next
-  // ArchiveFile to be constructed.
-
-  // ArchiveFile object under construction is complete,
-  // therefore return it and start the construction of the next
-  std::unique_ptr<common::dataStructures::ArchiveFile> tmp;
-  tmp = std::move(m_archiveFile);
-  m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile));
-  return tmp;
-}
-
-//------------------------------------------------------------------------------
-// getArchiveFile
-//------------------------------------------------------------------------------
-common::dataStructures::ArchiveFile *ArchiveFileBuilder::getArchiveFile() {
-  return m_archiveFile.get();
-}
-
-//------------------------------------------------------------------------------
-// clear
-//------------------------------------------------------------------------------
-void ArchiveFileBuilder::clear() {
-  m_archiveFile.reset();
-}
 
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/ArchiveFileBuilder.hpp b/catalogue/ArchiveFileBuilder.hpp
index f05f1b191f..7824171922 100644
--- a/catalogue/ArchiveFileBuilder.hpp
+++ b/catalogue/ArchiveFileBuilder.hpp
@@ -29,7 +29,9 @@ namespace catalogue {
 /**
  * Builds ArchiveFile objects from a stream of tape files ordered by archive ID
  * and then copy number.
+ * The template T is an ArchiveFile or a DeletedArchiveFile
  */
+template<typename T>
 class ArchiveFileBuilder {
 public:
 
@@ -65,7 +67,7 @@ public:
    * @param tapeFile The tape file to be appended or an archive file with no
    * tape files at all.
    */
-  std::unique_ptr<common::dataStructures::ArchiveFile> append(const common::dataStructures::ArchiveFile &tapeFile);
+  std::unique_ptr<T> append(const T &tapeFile);
 
   /**
    * Returns a pointer to the ArchiveFile object currently under construction.
@@ -75,7 +77,7 @@ public:
    * @return The ArchiveFile object currently under construction or nullptr
    * if there isn't one.
    */
-  common::dataStructures::ArchiveFile *getArchiveFile();
+  T *getArchiveFile();
 
   /**
    * If there is an ArchiveFile under construction then it is forgotten.
@@ -92,9 +94,104 @@ private:
   /**
    * The Archivefile object currently under construction.
    */
-  std::unique_ptr<common::dataStructures::ArchiveFile> m_archiveFile;
+  std::unique_ptr<T> m_archiveFile;
 
 }; // class ArchiveFileBuilder
 
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+template<typename T>
+ArchiveFileBuilder<T>::ArchiveFileBuilder(log::Logger &log):
+  m_log(log) {
+}
+
+//------------------------------------------------------------------------------
+// append
+//------------------------------------------------------------------------------
+template<typename T>
+std::unique_ptr<T> ArchiveFileBuilder<T>::append(
+  const T &tapeFile) {
+
+  // If there is currently no ArchiveFile object under construction
+  if(nullptr == m_archiveFile.get()) {
+    // If the tape file represents an ArchiveFile object with no tape files
+    if(tapeFile.tapeFiles.empty()) {
+      // Archive file is already complete
+      return std::unique_ptr<T>(new T(tapeFile));
+    }
+
+    // If the tape file exists then it must be alone
+    if(tapeFile.tapeFiles.size() != 1) {
+      exception::Exception ex;
+      ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" <<
+        tapeFile.tapeFiles.size();
+      throw ex;
+    }
+
+    // Start constructing one
+    m_archiveFile.reset(new T(tapeFile));
+
+    // There could be more tape files so return incomplete
+    return std::unique_ptr<T>();
+  }
+
+  // If the tape file represents an ArchiveFile object with no tape files
+  if(tapeFile.tapeFiles.empty()) {
+    // The ArchiveFile object under construction is complete,
+    // therefore return it and start the construction of the next
+    std::unique_ptr<T> tmp;
+    tmp = std::move(m_archiveFile);
+    m_archiveFile.reset(new T(tapeFile));
+    return tmp;
+  }
+
+  // If the tape file to be appended belongs to the ArchiveFile object
+  // currently under construction
+  if(tapeFile.archiveFileID == m_archiveFile->archiveFileID) {
+
+    // The tape file must exist and must be alone
+    if(tapeFile.tapeFiles.size() != 1) {
+      exception::Exception ex;
+      ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" <<
+        tapeFile.tapeFiles.size() << " archiveFileID=" << tapeFile.archiveFileID;
+      throw ex;
+    }
+
+    // Append the tape file
+    m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front());
+
+    // There could be more tape files so return incomplete
+    return std::unique_ptr<T>();
+  }
+
+  // Reaching this point means the tape file to be appended belongs to the next
+  // ArchiveFile to be constructed.
+
+  // ArchiveFile object under construction is complete,
+  // therefore return it and start the construction of the next
+  std::unique_ptr<T> tmp;
+  tmp = std::move(m_archiveFile);
+  m_archiveFile.reset(new T(tapeFile));
+  return tmp;
+}
+
+//------------------------------------------------------------------------------
+// getArchiveFile
+//------------------------------------------------------------------------------
+template<typename T>
+T *ArchiveFileBuilder<T>::getArchiveFile() {
+  return m_archiveFile.get();
+}
+
+//------------------------------------------------------------------------------
+// clear
+//------------------------------------------------------------------------------
+template<typename T>
+void ArchiveFileBuilder<T>::clear() {
+  m_archiveFile.reset();
+}
+
+
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt
index 1b22008d88..8272cd4be5 100644
--- a/catalogue/CMakeLists.txt
+++ b/catalogue/CMakeLists.txt
@@ -36,6 +36,8 @@ set (CATALOGUE_LIB_SRC_FILES
   CatalogueFactoryFactory.cpp
   CatalogueSchema.cpp
   CmdLineTool.cpp
+  DeletedArchiveFileItor.cpp
+  DeletedArchiveFileItorImpl.cpp
   InMemoryCatalogue.cpp
   InMemoryCatalogueFactory.cpp
   MysqlCatalogue.cpp
@@ -52,6 +54,7 @@ set (CATALOGUE_LIB_SRC_FILES
   RdbmsCatalogue.cpp
   RdbmsCatalogueGetArchiveFilesForRepackItor.cpp
   RdbmsCatalogueGetArchiveFilesItor.cpp
+  RdbmsCatalogueGetDeletedArchiveFilesItor.cpp
   SchemaCreatingSqliteCatalogue.cpp
   SqliteCatalogue.cpp
   SqliteCatalogueFactory.cpp
@@ -172,6 +175,7 @@ add_custom_command (OUTPUT sqlite_catalogue_schema.sql mysql_catalogue_schema.sq
     ${CMAKE_CURRENT_SOURCE_DIR}/CreateAllSchemasCppFile.sh
     ${CMAKE_CURRENT_SOURCE_DIR}/AllCatalogueSchema.hpp.in
     ${CMAKE_CURRENT_SOURCE_DIR}/insert_cta_catalogue_version.sql.in
+    create_catalogue_schema_directory
 )
 
 add_custom_command(OUTPUT sqlite_catalogue_schema.cpp
diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp
index bd17b9e813..16a0837b03 100644
--- a/catalogue/Catalogue.hpp
+++ b/catalogue/Catalogue.hpp
@@ -33,6 +33,7 @@
 #include "common/dataStructures/ArchiveJob.hpp"
 #include "common/dataStructures/ArchiveRoute.hpp"
 #include "common/dataStructures/CancelRetrieveRequest.hpp"
+#include "common/dataStructures/DeleteArchiveRequest.hpp"
 #include "common/dataStructures/DiskFileInfo.hpp"
 #include "common/dataStructures/DriveState.hpp"
 #include "common/dataStructures/EntryLog.hpp"
@@ -64,6 +65,7 @@
 #include "common/log/Logger.hpp"
 #include "common/optional.hpp"
 #include "SchemaVersion.hpp"
+#include "DeletedArchiveFileItor.hpp"
 
 #include <list>
 #include <map>
@@ -420,8 +422,9 @@ public:
    *
    * @param admin The administrator.
    * @param vid The volume identifier of the tape to be reclaimed.
+   * @param lc the logContext
    */
-  virtual void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) = 0;
+  virtual void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) = 0;
   
   /**
    * Checks the specified tape for the tape label command.
@@ -684,6 +687,16 @@ public:
   virtual ArchiveFileItor getArchiveFilesItor(
     const TapeFileSearchCriteria &searchCriteria = TapeFileSearchCriteria()) const = 0;
 
+  /**
+   * Returns the specified deleted archive files.  Please note that the list of files
+   * is ordered by archive file ID.
+   *
+   * @param searchCriteria The search criteria.
+   * @return The deleted archive files.
+   */
+  virtual DeletedArchiveFileItor getDeletedArchiveFilesItor(
+    const TapeFileSearchCriteria &searchCriteria = TapeFileSearchCriteria()) const = 0;
+  
   /**
    * Returns the specified files in tape file sequence order.
    *
@@ -822,6 +835,28 @@ public:
    */
   virtual void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance,
     const std::string &diskFileId) = 0;
+  
+  /**
+   * Insert the tape files and ArchiveFiles entries in the recycle-bin and delete
+   * them from the TAPE_FILE and ARCHIVE_FILE  tables
+   * @param request the DeleteRequest object that holds information about the file to delete.
+   * @param lc the logContext
+   */
+  virtual void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, 
+  log::LogContext & lc) = 0;
+  
+   /**
+   *
+   * Deletes the specified archive file and its associated tape copies from the
+   * recycle-bin
+   *
+   * Please note that this method is idempotent.  If the file to be deleted does
+   * not exist in the CTA catalogue then this method returns without error.
+   *
+   * @param archiveFileId The unique identifier of the archive file.
+   * @param lc The log context.
+   */
+  virtual void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) = 0;
 
 }; // class Catalogue
 
diff --git a/catalogue/CatalogueRetryWrapper.hpp b/catalogue/CatalogueRetryWrapper.hpp
index c142c37696..03e4f18763 100644
--- a/catalogue/CatalogueRetryWrapper.hpp
+++ b/catalogue/CatalogueRetryWrapper.hpp
@@ -268,8 +268,8 @@ public:
     return retryOnLostConnection(m_log, [&]{return m_catalogue->getAllTapes();}, m_maxTriesToConnect);
   }
 
-  void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) override {
-    return retryOnLostConnection(m_log, [&]{return m_catalogue->reclaimTape(admin, vid);}, m_maxTriesToConnect);
+  void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) override {
+    return retryOnLostConnection(m_log, [&]{return m_catalogue->reclaimTape(admin, vid,lc);}, m_maxTriesToConnect);
   }
 
   void checkTapeForLabel(const std::string &vid) override {
@@ -463,6 +463,14 @@ public:
   ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override {
     return retryOnLostConnection(m_log, [&]{return m_catalogue->getArchiveFilesItor(searchCriteria);}, m_maxTriesToConnect);
   }
+  
+  DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override {
+    return retryOnLostConnection(m_log, [&]{return m_catalogue->getDeletedArchiveFilesItor(searchCriteria);}, m_maxTriesToConnect);
+  }
+  
+  void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc){
+    return retryOnLostConnection(m_log,[&]{return m_catalogue->deleteFileFromRecycleBin(archiveFileId,lc);},m_maxTriesToConnect);
+  }
 
   std::list<common::dataStructures::ArchiveFile> getFilesForRepack(const std::string &vid, const uint64_t startFSeq, const uint64_t maxNbFiles) const override {
     return retryOnLostConnection(m_log, [&]{return m_catalogue->getFilesForRepack(vid, startFSeq, maxNbFiles);}, m_maxTriesToConnect);
@@ -515,6 +523,11 @@ public:
   void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) override {
     return retryOnLostConnection(m_log, [&]{return m_catalogue->updateDiskFileId(archiveFileId, diskInstance, diskFileId);}, m_maxTriesToConnect);
   }
+  
+  void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, 
+  log::LogContext & lc) override {
+    return retryOnLostConnection(m_log,[&]{return m_catalogue->moveArchiveFileToRecycleBin(request,lc);},m_maxTriesToConnect);
+  }
 
 protected:
 
diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp
index 8ea3eeb159..d97cd24366 100644
--- a/catalogue/CatalogueTest.cpp
+++ b/catalogue/CatalogueTest.cpp
@@ -53,6 +53,7 @@
 #include "common/threading/Thread.hpp"
 #include "common/threading/Mutex.hpp"
 #include "common/threading/MutexLocker.hpp"
+#include "DeletedArchiveFileItor.hpp"
 
 #include <algorithm>
 #include <gtest/gtest.h>
@@ -144,6 +145,19 @@ void cta_catalogue_CatalogueTest::SetUp() {
         m_catalogue->deleteArchiveFile(archiveFile.diskInstance, archiveFile.archiveFileID, dummyLc);
       }
     }
+    {
+      //Delete all the entries from the recycle bin
+      auto itor = m_catalogue->getDeletedArchiveFilesItor();
+      std::list<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles;
+      while(itor.hasMore()){
+        deletedArchiveFiles.push_back(itor.next());
+      }
+      
+      for(const auto &deletedArchiveFile: deletedArchiveFiles){
+        log::LogContext dummyLc(m_dummyLog);
+        m_catalogue->deleteFileFromRecycleBin(deletedArchiveFile.archiveFileID,dummyLc);
+      }
+    }
     {
       const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes();
       for(auto &tape: tapes) {
@@ -14490,7 +14504,7 @@ TEST_P(cta_catalogue_CatalogueTest, checkTapeForLabel_one_tape_file_reclaimed_ta
   m_catalogue->deleteArchiveFile(diskInstanceName1, archiveFileId, dummyLc);
   
   m_catalogue->setTapeFull(m_admin, vid1, true);
-  m_catalogue->reclaimTape(m_admin, vid1);
+  m_catalogue->reclaimTape(m_admin, vid1,dummyLc);
   
   ASSERT_NO_THROW(m_catalogue->checkTapeForLabel(vid1));
 }
@@ -14720,6 +14734,7 @@ TEST_P(cta_catalogue_CatalogueTest, checkTapeForLabel_empty_vid) {
 TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) {
   using namespace cta;
 
+  log::LogContext dummyLc(m_dummyLog);
   ASSERT_TRUE(m_catalogue->getTapes().empty());
 
   const std::string mediaType = "media_type";
@@ -14776,7 +14791,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) {
   }
 
   m_catalogue->setTapeFull(m_admin, vid, true);
-  m_catalogue->reclaimTape(m_admin, vid);
+  m_catalogue->reclaimTape(m_admin, vid, dummyLc);
 
   {
     const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes();
@@ -14811,6 +14826,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) {
 TEST_P(cta_catalogue_CatalogueTest, reclaimTape_not_full_lastFSeq_0_no_tape_files) {
   using namespace cta;
 
+  log::LogContext dummyLc(m_dummyLog);
   ASSERT_TRUE(m_catalogue->getTapes().empty());
 
   const std::string mediaType = "media_type";
@@ -14866,15 +14882,15 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_not_full_lastFSeq_0_no_tape_file
     const common::dataStructures::EntryLog lastModificationLog = tape.lastModificationLog;
     ASSERT_EQ(creationLog, lastModificationLog);
   }
-
-  ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid), exception::UserError);
+  ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid, dummyLc), exception::UserError);
 }
 
 TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) {
   using namespace cta;
 
+  log::LogContext dummyLc(m_dummyLog);
+  
   const std::string diskInstanceName1 = "disk_instance_1";
-
   ASSERT_TRUE(m_catalogue->getTapes().empty());
 
   const std::string vid1 = "VID123";
@@ -15028,7 +15044,6 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) {
   }
 
   {
-    log::LogContext dummyLc(m_dummyLog);
     m_catalogue->deleteArchiveFile(diskInstanceName1, file1Written.archiveFileId, dummyLc);
   }
 
@@ -15067,7 +15082,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) {
   }
 
   m_catalogue->setTapeFull(m_admin, vid1, true);
-  m_catalogue->reclaimTape(m_admin, vid1);
+  m_catalogue->reclaimTape(m_admin, vid1, dummyLc);
 
   {
     const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes();
@@ -15102,6 +15117,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) {
 
 TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) {
   using namespace cta;
+  log::LogContext dummyLc(m_dummyLog);
 
   const std::string diskInstanceName1 = "disk_instance_1";
 
@@ -15259,12 +15275,13 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) {
   }
 
   m_catalogue->setTapeFull(m_admin, vid1, true);
-  ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid1), exception::UserError);
+  ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid1, dummyLc), exception::UserError);
 }
 
 TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_superseded) {
   using namespace cta;
 
+  log::LogContext dummyLc(m_dummyLog);
   const std::string diskInstanceName1 = "disk_instance_1";
 
   ASSERT_TRUE(m_catalogue->getTapes().empty());
@@ -15460,7 +15477,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su
       ASSERT_EQ("", tf.supersededByVid);
   }
   
-  ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1));
+  ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1, dummyLc));
  
   {
     //Test that the tape with vid1 is reclaimed
@@ -15928,4 +15945,262 @@ TEST_P(cta_catalogue_CatalogueTest, updateDiskFileId) {
   }
 }
 
+TEST_P(cta_catalogue_CatalogueTest, moveFilesToRecycleBin) {
+  using namespace cta;
+
+  const std::string vid1 = "VID123";
+  const std::string vid2 = "VID456";
+  const std::string mediaType = "media_type";
+  const std::string vendor = "vendor";
+  const std::string logicalLibraryName = "logical_library_name";
+  const bool logicalLibraryIsDisabled= false;
+  const std::string tapePoolName1 = "tape_pool_name_1";
+  const std::string tapePoolName2 = "tape_pool_name_2";
+  const std::string vo = "vo";
+  const uint64_t nbPartialTapes = 1;
+  const bool isEncrypted = true;
+  const cta::optional<std::string> supply("value for the supply pool mechanism");
+  const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000;
+  const bool disabledValue = true;
+  const bool fullValue = false;
+  const bool readOnlyValue = true;
+  const std::string comment = "Create tape";
+  const std::string diskInstance = "disk_instance";
+
+  m_catalogue->createLogicalLibrary(m_admin, logicalLibraryName, logicalLibraryIsDisabled, "Create logical library");
+
+  createVo(vo);
+  m_catalogue->createTapePool(m_admin, tapePoolName1, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool");
+  
+  common::dataStructures::StorageClass storageClass;
+  
+  storageClass.name = "storage_class";
+  storageClass.nbCopies = 2;
+  storageClass.comment = "Create storage class";
+  storageClass.vo.name = vo;
+  m_catalogue->createStorageClass(m_admin, storageClass);
+
+  const std::string tapeDrive = "tape_drive";
+  m_catalogue->createTapePool(m_admin, tapePoolName2, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool");
+    
+  m_catalogue->createTape(m_admin, vid1, mediaType, vendor, logicalLibraryName, tapePoolName1, capacityInBytes,
+    disabledValue, fullValue, readOnlyValue, comment);
+  
+  m_catalogue->createTape(m_admin, vid2, mediaType, vendor, logicalLibraryName, tapePoolName2, capacityInBytes,
+    disabledValue, fullValue, readOnlyValue, comment);
+
+  ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore());
+  const uint64_t nbArchiveFiles = 10; // Must be a multiple of 2 for this test
+  const uint64_t archiveFileSize = 2 * 1000 * 1000 * 1000;
+
+  std::set<catalogue::TapeItemWrittenPointer> tapeFilesWrittenCopy1;
+  for(uint64_t i = 1; i <= nbArchiveFiles; i++) {
+    std::ostringstream diskFileId;
+    diskFileId << (12345677 + i);
+    
+    std::ostringstream diskFilePath;
+    diskFilePath << "/test/file"<<i;
+
+    // Tape copy 1 written to tape
+    auto fileWrittenUP=cta::make_unique<cta::catalogue::TapeFileWritten>();
+    auto & fileWritten = *fileWrittenUP;
+    fileWritten.archiveFileId = i;
+    fileWritten.diskInstance = diskInstance;
+    fileWritten.diskFileId = diskFileId.str();
+    fileWritten.diskFilePath = diskFilePath.str();
+    fileWritten.diskFileOwnerUid = PUBLIC_DISK_USER;
+    fileWritten.diskFileGid = PUBLIC_DISK_GROUP;
+    fileWritten.size = archiveFileSize;
+    fileWritten.checksumBlob.insert(checksum::ADLER32, "1357");
+    fileWritten.storageClassName = storageClass.name;
+    fileWritten.vid = vid1;
+    fileWritten.fSeq = i;
+    fileWritten.blockId = i * 100;
+    fileWritten.copyNb = 1;
+    fileWritten.tapeDrive = tapeDrive;
+    tapeFilesWrittenCopy1.emplace(fileWrittenUP.release());
+  }
+  m_catalogue->filesWrittenToTape(tapeFilesWrittenCopy1);
+  {
+    ASSERT_TRUE(m_catalogue->getArchiveFilesItor().hasMore());
+  }
+  log::LogContext dummyLc(m_dummyLog);  
+  for(auto & tapeItemWritten: tapeFilesWrittenCopy1){
+    cta::catalogue::TapeFileWritten * tapeItem = static_cast<cta::catalogue::TapeFileWritten *>(tapeItemWritten.get());
+    cta::common::dataStructures::DeleteArchiveRequest req;
+    req.archiveFileID = tapeItem->archiveFileId;
+    req.diskFileId = tapeItem->diskFileId;
+    req.diskFilePath = tapeItem->diskFilePath;
+    req.diskInstance = tapeItem->diskInstance;
+    ASSERT_NO_THROW(m_catalogue->moveArchiveFileToRecycleBin(req,dummyLc));
+  }
+  ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore());
+  
+  std::vector<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles;
+  {
+    cta::catalogue::DeletedArchiveFileItor itor = m_catalogue->getDeletedArchiveFilesItor();
+    while(itor.hasMore()){
+      deletedArchiveFiles.push_back(itor.next());
+    }
+  }
+  //And test that these files are there.
+  //Run the unit test for all the databases
+  ASSERT_EQ(nbArchiveFiles,deletedArchiveFiles.size());
+  
+  for(uint64_t i = 1; i <= nbArchiveFiles; i++) {
+    
+    auto deletedArchiveFile = deletedArchiveFiles[i-1];
+    
+    std::ostringstream diskFileId;
+    diskFileId << (12345677 + i);
+    
+    std::ostringstream diskFilePath;
+    diskFilePath << "/test/file"<<i;
+    
+    ASSERT_EQ(i,deletedArchiveFile.archiveFileID);
+    ASSERT_EQ(diskInstance,deletedArchiveFile.diskInstance);
+    ASSERT_EQ(diskFileId.str(),deletedArchiveFile.diskFileId);
+    ASSERT_EQ(diskFilePath.str(),deletedArchiveFile.diskFilePath);
+    ASSERT_EQ(PUBLIC_DISK_USER,deletedArchiveFile.diskFileInfo.owner_uid);
+    ASSERT_EQ(PUBLIC_DISK_GROUP,deletedArchiveFile.diskFileInfo.gid);
+    ASSERT_EQ(archiveFileSize,deletedArchiveFile.fileSize);
+    ASSERT_EQ(cta::checksum::ChecksumBlob(checksum::ADLER32, "1357"),deletedArchiveFile.checksumBlob);
+    ASSERT_EQ(storageClass.name,deletedArchiveFile.storageClass);
+    ASSERT_EQ(diskFileId.str(),deletedArchiveFile.diskFileIdWhenDeleted);
+    
+    auto tapeFile = deletedArchiveFile.tapeFiles.at(1);
+    ASSERT_EQ(vid1,tapeFile.vid);
+    ASSERT_EQ(i,tapeFile.fSeq);
+    ASSERT_EQ(i * 100,tapeFile.blockId);
+    ASSERT_EQ(1, tapeFile.copyNb);
+    ASSERT_EQ(archiveFileSize,tapeFile.fileSize);
+    ASSERT_TRUE(tapeFile.supersededByVid.empty());
+    ASSERT_EQ(0,tapeFile.supersededByFSeq);
+  }
+  
+  //Let's try the deletion of the files from the recycle-bin.
+  for(uint64_t i = 1; i <= nbArchiveFiles; i++) {
+    m_catalogue->deleteFileFromRecycleBin(i,dummyLc);
+  }
+  
+  {
+    auto itor = m_catalogue->getDeletedArchiveFilesItor();
+    ASSERT_FALSE(itor.hasMore());
+  }
+  //Delete an archive file from the recycle-bin should be idempotent
+  ASSERT_NO_THROW(m_catalogue->deleteFileFromRecycleBin(12532,dummyLc));
+  
+}
+
+TEST_P(cta_catalogue_CatalogueTest, reclaimTapeRemovesFilesFromRecycleBin) {
+  using namespace cta;
+
+  const std::string vid1 = "VID123";
+  const std::string vid2 = "VID456";
+  const std::string mediaType = "media_type";
+  const std::string vendor = "vendor";
+  const std::string logicalLibraryName = "logical_library_name";
+  const bool logicalLibraryIsDisabled= false;
+  const std::string tapePoolName1 = "tape_pool_name_1";
+  const std::string tapePoolName2 = "tape_pool_name_2";
+  const std::string vo = "vo";
+  const uint64_t nbPartialTapes = 1;
+  const bool isEncrypted = true;
+  const cta::optional<std::string> supply("value for the supply pool mechanism");
+  const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000;
+  const bool disabledValue = true;
+  const bool fullValue = false;
+  const bool readOnlyValue = true;
+  const std::string comment = "Create tape";
+  const std::string diskInstance = "disk_instance";
+
+  m_catalogue->createLogicalLibrary(m_admin, logicalLibraryName, logicalLibraryIsDisabled, "Create logical library");
+
+  createVo(vo);
+  m_catalogue->createTapePool(m_admin, tapePoolName1, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool");
+  
+  common::dataStructures::StorageClass storageClass;
+  
+  storageClass.name = "storage_class";
+  storageClass.nbCopies = 2;
+  storageClass.comment = "Create storage class";
+  storageClass.vo.name = vo;
+  m_catalogue->createStorageClass(m_admin, storageClass);
+
+  const std::string tapeDrive = "tape_drive";
+  m_catalogue->createTapePool(m_admin, tapePoolName2, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool");
+    
+  m_catalogue->createTape(m_admin, vid1, mediaType, vendor, logicalLibraryName, tapePoolName1, capacityInBytes,
+    disabledValue, fullValue, readOnlyValue, comment);
+  
+  m_catalogue->createTape(m_admin, vid2, mediaType, vendor, logicalLibraryName, tapePoolName2, capacityInBytes,
+    disabledValue, fullValue, readOnlyValue, comment);
+
+  ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore());
+  const uint64_t nbArchiveFiles = 10; // Must be a multiple of 2 for this test
+  const uint64_t archiveFileSize = 2 * 1000 * 1000 * 1000;
+
+  std::set<catalogue::TapeItemWrittenPointer> tapeFilesWrittenCopy1;
+  for(uint64_t i = 1; i <= nbArchiveFiles; i++) {
+    std::ostringstream diskFileId;
+    diskFileId << (12345677 + i);
+    
+    std::ostringstream diskFilePath;
+    diskFilePath << "/test/file"<<i;
+
+    // Tape copy 1 written to tape
+    auto fileWrittenUP=cta::make_unique<cta::catalogue::TapeFileWritten>();
+    auto & fileWritten = *fileWrittenUP;
+    fileWritten.archiveFileId = i;
+    fileWritten.diskInstance = diskInstance;
+    fileWritten.diskFileId = diskFileId.str();
+    fileWritten.diskFilePath = diskFilePath.str();
+    fileWritten.diskFileOwnerUid = PUBLIC_DISK_USER;
+    fileWritten.diskFileGid = PUBLIC_DISK_GROUP;
+    fileWritten.size = archiveFileSize;
+    fileWritten.checksumBlob.insert(checksum::ADLER32, "1357");
+    fileWritten.storageClassName = storageClass.name;
+    fileWritten.vid = vid1;
+    fileWritten.fSeq = i;
+    fileWritten.blockId = i * 100;
+    fileWritten.copyNb = 1;
+    fileWritten.tapeDrive = tapeDrive;
+    tapeFilesWrittenCopy1.emplace(fileWrittenUP.release());
+  }
+  m_catalogue->filesWrittenToTape(tapeFilesWrittenCopy1);
+  {
+    ASSERT_TRUE(m_catalogue->getArchiveFilesItor().hasMore());
+  }
+  log::LogContext dummyLc(m_dummyLog);  
+  for(auto & tapeItemWritten: tapeFilesWrittenCopy1){
+    cta::catalogue::TapeFileWritten * tapeItem = static_cast<cta::catalogue::TapeFileWritten *>(tapeItemWritten.get());
+    cta::common::dataStructures::DeleteArchiveRequest req;
+    req.archiveFileID = tapeItem->archiveFileId;
+    req.diskFileId = tapeItem->diskFileId;
+    req.diskFilePath = tapeItem->diskFilePath;
+    req.diskInstance = tapeItem->diskInstance;
+    ASSERT_NO_THROW(m_catalogue->moveArchiveFileToRecycleBin(req,dummyLc));
+  }
+  ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore());
+  
+  std::vector<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles;
+  {
+    cta::catalogue::DeletedArchiveFileItor itor = m_catalogue->getDeletedArchiveFilesItor();
+    while(itor.hasMore()){
+      deletedArchiveFiles.push_back(itor.next());
+    }
+  }
+  //And test that these files are there.
+  //Run the unit test for all the databases
+  ASSERT_EQ(nbArchiveFiles,deletedArchiveFiles.size());
+  
+  //Reclaim the tape
+  m_catalogue->setTapeFull(m_admin,vid1,true);
+  m_catalogue->reclaimTape(m_admin,vid1, dummyLc);
+  {
+    auto itor = m_catalogue->getDeletedArchiveFilesItor();
+    ASSERT_FALSE(itor.hasMore());
+  }
+}
+
 } // namespace unitTests
diff --git a/catalogue/DeletedArchiveFileItor.cpp b/catalogue/DeletedArchiveFileItor.cpp
new file mode 100644
index 0000000000..083e48e7f7
--- /dev/null
+++ b/catalogue/DeletedArchiveFileItor.cpp
@@ -0,0 +1,90 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "DeletedArchiveFileItor.hpp"
+#include "DeletedArchiveFileItorImpl.hpp"
+
+
+namespace cta {
+namespace catalogue {
+
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor::DeletedArchiveFileItor():
+  m_impl(nullptr) {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor::DeletedArchiveFileItor(DeletedArchiveFileItorImpl *const impl):
+  m_impl(impl) {
+  if(nullptr == impl) {
+    throw exception::Exception(std::string(__FUNCTION__) + " failed: Pointer to implementation object is null");
+  }
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor::DeletedArchiveFileItor(DeletedArchiveFileItor &&other):
+  m_impl(other.m_impl) {
+  other.m_impl = nullptr;
+}
+
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor::~DeletedArchiveFileItor() {
+  delete m_impl;
+}
+
+//------------------------------------------------------------------------------
+// operator=
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor &DeletedArchiveFileItor::operator=(DeletedArchiveFileItor &&rhs) {
+  m_impl = rhs.m_impl;
+  rhs.m_impl = nullptr;
+  return *this;
+}
+
+//------------------------------------------------------------------------------
+// hasMore
+//------------------------------------------------------------------------------
+bool DeletedArchiveFileItor::hasMore() const {
+  if(nullptr == m_impl) {
+    throw exception::Exception(std::string(__FUNCTION__) + " failed: "
+      "This iterator is invalid");
+  }
+  return m_impl->hasMore();
+}
+
+//------------------------------------------------------------------------------
+// next
+//------------------------------------------------------------------------------
+common::dataStructures::DeletedArchiveFile DeletedArchiveFileItor::next() {
+  if(nullptr == m_impl) {
+    throw exception::Exception(std::string(__FUNCTION__) + " failed: "
+      "This iterator is invalid");
+  }
+  return m_impl->next();
+}
+
+}}
\ No newline at end of file
diff --git a/catalogue/DeletedArchiveFileItor.hpp b/catalogue/DeletedArchiveFileItor.hpp
new file mode 100644
index 0000000000..5401e6e143
--- /dev/null
+++ b/catalogue/DeletedArchiveFileItor.hpp
@@ -0,0 +1,90 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "common/dataStructures/DeletedArchiveFile.hpp"
+
+namespace cta {
+namespace catalogue {
+
+class DeletedArchiveFileItorImpl;
+
+class Catalogue;
+  
+class DeletedArchiveFileItor {
+public:
+
+  /**
+   * Constructor.
+   */
+  DeletedArchiveFileItor();
+
+  /**
+   * Constructor.
+   *
+   * @param impl The object actually implementing this iterator.
+   */
+  DeletedArchiveFileItor(DeletedArchiveFileItorImpl *const impl);
+
+  /**
+   * Deletion of copy constructor.
+   */
+  DeletedArchiveFileItor(const DeletedArchiveFileItor &) = delete;
+
+  /**
+   * Move constructor.
+   *
+   * @param other The other object to be moved.
+   */
+  DeletedArchiveFileItor(DeletedArchiveFileItor &&other);
+
+  /**
+   * Destructor.
+   */
+  ~DeletedArchiveFileItor();
+
+  /**
+   * Deletion of copy assignment.
+   */
+  DeletedArchiveFileItor &operator=(const DeletedArchiveFileItor &) = delete;
+
+  /**
+   * Move assignment.
+   */
+  DeletedArchiveFileItor &operator=(DeletedArchiveFileItor &&rhs);
+
+  /**
+   * Returns true if a call to next would return another archive file.
+   */
+  bool hasMore() const;
+
+  /**
+   * Returns the next archive or throws an exception if there isn't one.
+   */
+  common::dataStructures::DeletedArchiveFile next();
+
+private:
+
+  /**
+   * The object actually implementing this iterator.
+   */
+  DeletedArchiveFileItorImpl *m_impl;
+};
+
+}}
diff --git a/catalogue/DeletedArchiveFileItorImpl.cpp b/catalogue/DeletedArchiveFileItorImpl.cpp
new file mode 100644
index 0000000000..58a1da2c69
--- /dev/null
+++ b/catalogue/DeletedArchiveFileItorImpl.cpp
@@ -0,0 +1,30 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "DeletedArchiveFileItorImpl.hpp"
+
+namespace cta {
+namespace catalogue {
+ 
+//------------------------------------------------------------------------------
+// destructor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItorImpl::~DeletedArchiveFileItorImpl() {
+}
+
+}}
\ No newline at end of file
diff --git a/catalogue/DeletedArchiveFileItorImpl.hpp b/catalogue/DeletedArchiveFileItorImpl.hpp
new file mode 100644
index 0000000000..c4673e5edb
--- /dev/null
+++ b/catalogue/DeletedArchiveFileItorImpl.hpp
@@ -0,0 +1,51 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "common/dataStructures/DeletedArchiveFile.hpp"
+
+namespace cta {
+namespace catalogue {
+  
+/**
+ * Abstract class defining the interface to an iterator over a list of archive
+ * files.
+ */
+class DeletedArchiveFileItorImpl {
+public:
+
+  /**
+   * Destructor.
+   */
+  virtual ~DeletedArchiveFileItorImpl() = 0;
+
+  /**
+   * Returns true if a call to next would return another archive file.
+   */
+  virtual bool hasMore() = 0;
+
+  /**
+   * Returns the next archive or throws an exception if there isn't one.
+   */
+  virtual common::dataStructures::DeletedArchiveFile next() = 0;
+
+}; // class DeletedArchiveFileItorImpl
+
+
+}}
diff --git a/catalogue/DropSchemaCmd.cpp b/catalogue/DropSchemaCmd.cpp
index e4201b6415..1de1022bd8 100644
--- a/catalogue/DropSchemaCmd.cpp
+++ b/catalogue/DropSchemaCmd.cpp
@@ -139,6 +139,8 @@ void DropSchemaCmd::dropSqliteCatalogueSchema(rdbms::Conn &conn) {
       "TEMP_TAPE_FILE",
       "DATABASECHANGELOGLOCK", /* Liquibase specific table */
       "DATABASECHANGELOG", /* Liquibase specific table */
+      "TAPE_FILE_RECYCLE_BIN",
+      "ARCHIVE_FILE_RECYCLE_BIN",
       "ARCHIVE_FILE",
       "ARCHIVE_FILE_ID",
       "TAPE",
@@ -178,6 +180,9 @@ void DropSchemaCmd::dropMysqlCatalogueSchema(rdbms::Conn &conn) {
       "TEMP_TAPE_FILE",
       "DATABASECHANGELOGLOCK", /* Liquibase specific table */
       "DATABASECHANGELOG", /* Liquibase specific table */
+      "FILE_RECYCLE_BIN",
+      "TAPE_FILE_RECYCLE_BIN",
+      "ARCHIVE_FILE_RECYCLE_BIN",
       "ARCHIVE_FILE",
       "ARCHIVE_FILE_ID",
       "TAPE",
@@ -233,7 +238,10 @@ void DropSchemaCmd::dropOracleCatalogueSchema(rdbms::Conn &conn) {
       "CTA_CATALOGUE",
       "ARCHIVE_ROUTE",
       "TAPE_FILE",
+      "FILE_RECYCLE_BIN",
       "ARCHIVE_FILE",
+      "TAPE_FILE_RECYCLE_BIN",
+      "ARCHIVE_FILE_RECYCLE_BIN",
       "TAPE",
       "TEMP_TAPE_FILE_BATCH",
       "TEMP_TAPE_FILE_INSERTION_BATCH",
@@ -284,7 +292,10 @@ void DropSchemaCmd::dropPostgresCatalogueSchema(rdbms::Conn &conn) {
       "TEMP_TAPE_FILE",
       "DATABASECHANGELOGLOCK", /* Liquibase specific table */
       "DATABASECHANGELOG", /* Liquibase specific table */
+      "FILE_RECYCLE_BIN",
       "ARCHIVE_FILE",
+      "TAPE_FILE_RECYCLE_BIN",
+      "ARCHIVE_FILE_RECYCLE_BIN",
       "TAPE",
       "REQUESTER_MOUNT_RULE",
       "REQUESTER_GROUP_MOUNT_RULE",
diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp
index 0f44eb6ea6..32ac4ed189 100644
--- a/catalogue/DummyCatalogue.hpp
+++ b/catalogue/DummyCatalogue.hpp
@@ -69,6 +69,8 @@ public:
   std::list<common::dataStructures::AdminUser> getAdminUsers() const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   common::dataStructures::ArchiveFile getArchiveFileById(const uint64_t id) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
+  DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
+  void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) {throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented");}
   std::list<common::dataStructures::ArchiveFile> getFilesForRepack(const std::string &vid, const uint64_t startFSeq, const uint64_t maxNbFiles) const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   ArchiveFileItor getArchiveFilesForRepackItor(const std::string &vid, const uint64_t startFSeq) const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   std::list<common::dataStructures::ArchiveRoute> getArchiveRoutes() const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
@@ -132,7 +134,7 @@ public:
   common::dataStructures::ArchiveFileQueueCriteria getArchiveFileQueueCriteria(const std::string &diskInstanceName,
     const std::string &storageClassName, const common::dataStructures::RequesterIdentity &user) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   common::dataStructures::RetrieveFileQueueCriteria prepareToRetrieveFile(const std::string& diskInstanceName, const uint64_t archiveFileId, const common::dataStructures::RequesterIdentity& user, const optional<std::string>& activity, log::LogContext& lc) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
-  void reclaimTape(const common::dataStructures::SecurityIdentity& admin, const std::string& vid) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
+  void reclaimTape(const common::dataStructures::SecurityIdentity& admin, const std::string& vid, cta::log::LogContext & lc) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void checkTapeForLabel(const std::string& vid) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   uint64_t getNbFilesOnTape(const std::string& vid) const  override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void setTapeDisabled(const common::dataStructures::SecurityIdentity& admin, const std::string& vid, const bool disabledValue) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
@@ -149,7 +151,8 @@ public:
   void tapeMountedForRetrieve(const std::string& vid, const std::string& drive) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   bool tapePoolExists(const std::string& tapePoolName) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
-
+  void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, 
+  log::LogContext & lc) override {throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented");}
   // Special functions for unit tests.
   void addEnabledTape(const std::string & vid) {
     threading::MutexLocker lm(m_tapeEnablingMutex);
diff --git a/catalogue/MysqlCatalogue.cpp b/catalogue/MysqlCatalogue.cpp
index 831accb15c..6d0c15f728 100644
--- a/catalogue/MysqlCatalogue.cpp
+++ b/catalogue/MysqlCatalogue.cpp
@@ -28,6 +28,7 @@
 #include "rdbms/AutoRollback.hpp"
 #include "rdbms/ConstraintError.hpp"
 #include "rdbms/PrimaryKeyError.hpp"
+#include "common/log/TimingList.hpp"
 
 namespace cta {
 namespace catalogue {
@@ -562,13 +563,15 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
       stmt.bindUint64(":ARCHIVE_FILE_ID", archiveFileId);
       stmt.executeNonQuery();
     }
+    
+    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
 
     for(auto &vidToSetDirty: vidsToSetDirty){
       //We deleted the TAPE_FILE so the tapes containing them should be set as dirty
       setTapeDirty(conn,vidToSetDirty);
     }
     
-    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter);
 
     {
       const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
@@ -596,6 +599,7 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
        .add("selectFromArchiveFileTime", selectFromArchiveFileTime)
        .add("deleteFromTapeFileTime", deleteFromTapeFileTime)
        .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime)
+       .add("setTapeDirtyTime",setTapeDirtyTime)
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
@@ -620,5 +624,57 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
   }
 }
 
+void MysqlCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc){
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do an INSERT INTO and a DELETE FROM
+    //in a single transaction
+    conn.executeNonQuery("START TRANSACTION");
+    copyArchiveFileToRecycleBin(conn,request);
+    tl.insertAndReset("insertToRecycleBinTime",t);
+    deleteArchiveFileAndTapeFiles(conn,request);
+    tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",request.archiveFileID);
+    spc.add("diskFileId",request.diskFileId);
+    spc.add("diskFilePath",request.diskFilePath);
+    spc.add("diskInstance",request.diskInstance);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+void MysqlCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext &lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do two delete in one transaction
+    conn.executeNonQuery("START TRANSACTION");
+    deleteTapeFilesFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteTapeFilesTime",t);
+    deleteArchiveFileFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteArchiveFileTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",archiveFileId);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In MysqlCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/MysqlCatalogue.hpp b/catalogue/MysqlCatalogue.hpp
index 211cb387d0..12054e3c1d 100644
--- a/catalogue/MysqlCatalogue.hpp
+++ b/catalogue/MysqlCatalogue.hpp
@@ -155,6 +155,22 @@ protected:
   void deleteArchiveFile(const std::string &instanceName, const uint64_t archiveFileId,
     log::LogContext &lc) override;
 
+  /**
+   * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables
+   * and deletes the ARCHIVE_FILE and TAPE_FILE entries.
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   * @param lc the log context
+   */
+  void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn,const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override;
+  
+  /**
+   * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin
+   */
+  void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc) override;
+  
 private:
 
   /**
diff --git a/catalogue/OracleCatalogue.cpp b/catalogue/OracleCatalogue.cpp
index 0658274f76..b653fad570 100644
--- a/catalogue/OracleCatalogue.cpp
+++ b/catalogue/OracleCatalogue.cpp
@@ -31,6 +31,7 @@
 #include "rdbms/rdbms.hpp"
 #include "rdbms/wrapper/OcciColumn.hpp"
 #include "rdbms/wrapper/OcciStmt.hpp"
+#include "common/log/TimingList.hpp"
 #include <algorithm>
 
 namespace cta {
@@ -885,12 +886,14 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
       stmt.executeNonQuery();
     }
     
+    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    
     //Set the tapes where the files have been deleted to dirty
     for(auto &vidToSetDirty: vidsToSetDirty){
       setTapeDirty(conn,vidToSetDirty);
     }
     
-    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter);
 
     {
       const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
@@ -918,6 +921,7 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
        .add("createStmtTime", createStmtTime)
        .add("selectFromArchiveFileTime", selectFromArchiveFileTime)
        .add("deleteFromTapeFileTime", deleteFromTapeFileTime)
+       .add("setTapeDirtyTime",setTapeDirtyTime)
        .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime)
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
@@ -946,5 +950,63 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
   }
 }
 
+//------------------------------------------------------------------------------
+// copyArchiveFileToRecycleBinAndDelete
+//------------------------------------------------------------------------------
+void OracleCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc){
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do an INSERT INTO and a DELETE FROM
+    //in a single transaction
+    conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_OFF);
+    copyArchiveFileToRecycleBin(conn,request);
+    tl.insertAndReset("insertToRecycleBinTime",t);
+    conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_ON);
+    deleteArchiveFileAndTapeFiles(conn,request);
+    tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",request.archiveFileID);
+    spc.add("diskFileId",request.diskFileId);
+    spc.add("diskFilePath",request.diskFilePath);
+    spc.add("diskInstance",request.diskInstance);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In OracleCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteTapeFilesAndArchiveFileFromRecycleBin
+//------------------------------------------------------------------------------
+void OracleCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do two delete in one transaction
+    conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_OFF);
+    deleteTapeFilesFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteTapeFilesTime",t);
+    conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_ON);
+    deleteArchiveFileFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteArchiveFileTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",archiveFileId);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In OracleCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+
+
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/OracleCatalogue.hpp b/catalogue/OracleCatalogue.hpp
index 3d4efbdf8f..cf3e63f6d5 100644
--- a/catalogue/OracleCatalogue.hpp
+++ b/catalogue/OracleCatalogue.hpp
@@ -184,6 +184,22 @@ private:
    */
   void idempotentBatchInsertArchiveFiles(rdbms::Conn &conn, const std::set<TapeFileWritten> &events);
 
+   /**
+   * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables
+   * and deletes the ARCHIVE_FILE and TAPE_FILE entries.
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   * @param lc the log context
+   */
+  void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override;
+  
+   /**
+   * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin
+   */
+  void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) override;
+  
   /**
    * The size and checksum of a file.
    */
diff --git a/catalogue/PostgresCatalogue.cpp b/catalogue/PostgresCatalogue.cpp
index 0b692bb996..4b43f137a8 100644
--- a/catalogue/PostgresCatalogue.cpp
+++ b/catalogue/PostgresCatalogue.cpp
@@ -29,6 +29,7 @@
 #include "rdbms/rdbms.hpp"
 #include "rdbms/wrapper/PostgresColumn.hpp"
 #include "rdbms/wrapper/PostgresStmt.hpp"
+#include "common/log/TimingList.hpp"
 #include <algorithm>
 
 namespace cta {
@@ -818,12 +819,14 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
       stmt.executeNonQuery();
     }
     
+    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    
     for(auto &vidToSetDirty: vidsToSetDirty){
       //We deleted the TAPE_FILE so the tapes containing them should be set as dirty
       setTapeDirty(conn,vidToSetDirty);
     }
     
-    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter);
 
     {
       const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
@@ -853,6 +856,7 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
        .add("selectFromArchiveFileTime", selectFromArchiveFileTime)
        .add("deleteFromTapeFileTime", deleteFromTapeFileTime)
        .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime)
+       .add("setTapeDirtyTime",setTapeDirtyTime)
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
@@ -893,6 +897,63 @@ void PostgresCatalogue::beginCreateTemporarySetDeferred(rdbms::Conn &conn) const
   conn.executeNonQuery("SET CONSTRAINTS ARCHIVE_FILE_DIN_DFI_UN DEFERRED");
 }
 
+//------------------------------------------------------------------------------
+// copyArchiveFileToRecycleBinAndDelete
+//------------------------------------------------------------------------------
+void PostgresCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do an INSERT INTO and a DELETE FROM
+    //in a single transaction
+    conn.executeNonQuery("BEGIN");
+    copyArchiveFileToRecycleBin(conn,request);
+    tl.insertAndReset("insertToRecycleBinTime",t);
+    deleteArchiveFileAndTapeFiles(conn,request);
+    tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",request.archiveFileID);
+    spc.add("diskFileId",request.diskFileId);
+    spc.add("diskFilePath",request.diskFilePath);
+    spc.add("diskInstance",request.diskInstance);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteTapeFilesAndArchiveFileFromRecycleBin
+//------------------------------------------------------------------------------
+void PostgresCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do two delete in one transaction
+    conn.executeNonQuery("BEGIN");
+    deleteTapeFilesFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteTapeFilesTime",t);
+    deleteArchiveFileFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteArchiveFileTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",archiveFileId);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In PostgresCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
 
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/PostgresCatalogue.hpp b/catalogue/PostgresCatalogue.hpp
index 6db30ef340..79038231eb 100644
--- a/catalogue/PostgresCatalogue.hpp
+++ b/catalogue/PostgresCatalogue.hpp
@@ -218,6 +218,22 @@ private:
    * @param events The tape file written events.
    */
   void insertTapeFileBatchIntoTempTable(rdbms::Conn &conn, const std::set<TapeFileWritten> &events) const;
+  
+  /**
+   * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables
+   * and deletes the ARCHIVE_FILE and TAPE_FILE entries.
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   * @param lc the log context
+   */
+  void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override;
+  
+  /**
+   * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin
+   */
+  virtual void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc);
 
 }; // class PostgresCatalogue
 
diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp
index aaa3f63c40..489044b125 100644
--- a/catalogue/RdbmsCatalogue.cpp
+++ b/catalogue/RdbmsCatalogue.cpp
@@ -60,6 +60,9 @@
 #include "rdbms/AutoRollback.hpp"
 #include "version.h"
 #include "SchemaVersion.hpp"
+#include "RdbmsCatalogueGetDeletedArchiveFilesItor.hpp"
+#include "common/log/DummyLogger.hpp"
+#include "common/log/TimingList.hpp"
 
 #include <ctype.h>
 #include <memory>
@@ -3238,13 +3241,16 @@ void RdbmsCatalogue::resetTapeCounters(rdbms::Conn& conn, const common::dataStru
 //------------------------------------------------------------------------------
 // reclaimTape
 //------------------------------------------------------------------------------
-void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) {
+void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) {
   try{
+    log::TimingList tl;
+    utils::Timer t;
     auto conn = m_connPool.getConn();
     
     TapeSearchCriteria searchCriteria;
     searchCriteria.vid = vid;
     const auto tapes = getTapes(conn, searchCriteria);
+    tl.insertAndReset("getTapesTime",t);
 
     if(tapes.empty()) {
       throw exception::UserError(std::string("Cannot reclaim tape ") + vid + " because it does not exist");
@@ -3255,9 +3261,20 @@ void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity
     }
     //The tape exists and is full, we can try to reclaim it
     if(getNbNonSupersededFilesOnTape(conn,vid) == 0){
+      tl.insertAndReset("getNbNonSupersededFilesOnTapeTime",t);
       //There is no non-superseded files on the tape, we can reclaim it : delete the files and reset the counters
       deleteTapeFiles(conn,vid);
+      tl.insertAndReset("deleteTapeFilesTime",t);
+      deleteFilesFromRecycleBin(conn,vid,lc);
+      tl.insertAndReset("deleteFileFromRecycleBinTime",t);
       resetTapeCounters(conn,admin,vid);
+      tl.insertAndReset("resetTapeCountersTime",t);
+      log::ScopedParamContainer spc(lc);
+      spc.add("vid",vid);
+      spc.add("host",admin.host);
+      spc.add("username",admin.username);
+      tl.addToLog(spc);
+      lc.log(log::INFO,"In RdbmsCatalogue::reclaimTape(), tape reclaimed.");
     } else {
       throw exception::UserError(std::string("Cannot reclaim tape ") + vid + " because there is at least one tape"
             " file in the catalogue that is on the tape");
@@ -5935,6 +5952,24 @@ ArchiveFileItor RdbmsCatalogue::getArchiveFilesItor(const TapeFileSearchCriteria
   }
 }
 
+//------------------------------------------------------------------------------
+// getDeletedArchiveFilesItor
+//------------------------------------------------------------------------------
+DeletedArchiveFileItor RdbmsCatalogue::getDeletedArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const {
+
+  checkTapeFileSearchCriteria(searchCriteria);
+
+  try {
+    auto impl = new RdbmsCatalogueGetDeletedArchiveFilesItor(m_log, m_archiveFileListingConnPool, searchCriteria);
+    return DeletedArchiveFileItor(impl);
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
 //------------------------------------------------------------------------------
 // getFilesForRepack
 //------------------------------------------------------------------------------
@@ -7408,6 +7443,24 @@ void RdbmsCatalogue::checkTapeFileWrittenFieldsAreSet(const std::string &calling
   }
 }
 
+//------------------------------------------------------------------------------
+// checkDeleteRequestConsistency
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::checkDeleteRequestConsistency(const cta::common::dataStructures::DeleteArchiveRequest deleteRequest, const cta::common::dataStructures::ArchiveFile& archiveFile) const {
+  if(deleteRequest.diskInstance != archiveFile.diskInstance){
+    std::ostringstream msg;
+    msg << "Failed to move archive file with ID " << deleteRequest.archiveFileID << " to the recycle-bin because the disk instance of "
+      "the request does not match that of the archived file: archiveFileId=" << archiveFile.archiveFileID << " requestDiskInstance=" << deleteRequest.diskInstance << " archiveFileDiskInstance=" <<
+      archiveFile.diskInstance;
+    throw cta::exception::Exception(msg.str());
+  }
+  if(deleteRequest.diskFilePath.empty()){
+    std::ostringstream msg;
+    msg << "Failed to move archive file with ID " << deleteRequest.archiveFileID << " to the recycle-bin because the disk file path has not been provided.";
+    throw cta::exception::Exception(msg.str());
+  }
+}
+
 //------------------------------------------------------------------------------
 // checkTapeItemWrittenFieldsAreSet
 //------------------------------------------------------------------------------
@@ -7551,5 +7604,334 @@ void RdbmsCatalogue::updateDiskFileId(const uint64_t archiveFileId, const std::s
   }
 }
 
+//------------------------------------------------------------------------------
+// moveArchiveFileToRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, 
+  log::LogContext & lc) {
+  cta::common::dataStructures::ArchiveFile archiveFile;
+  utils::Timer t, totalTime;
+  log::TimingList tl;
+  try{
+    archiveFile = getArchiveFileById(request.archiveFileID);
+    tl.insertAndReset("getArchiveFileByIdTime",t);
+  } catch (cta::exception::Exception &ex){
+    log::ScopedParamContainer spc(lc);
+    spc.add("fileId", request.archiveFileID);
+    lc.log(log::WARNING, "Ignoring request to delete archive file because it does not exist in the catalogue");
+    return;
+  }
+  try {
+    checkDeleteRequestConsistency(request,archiveFile);
+    tl.insertAndReset("checkDeleteRequestConsistency",t);
+  } catch(const cta::exception::Exception & ex){
+    log::ScopedParamContainer spc(lc);
+    spc.add("fileId", std::to_string(request.archiveFileID))
+     .add("diskInstance", archiveFile.diskInstance)
+     .add("requestDiskInstance", request.diskInstance)
+     .add("diskFileId", archiveFile.diskFileId)
+     .add("diskFileInfo.owner_uid", archiveFile.diskFileInfo.owner_uid)
+     .add("diskFileInfo.gid", archiveFile.diskFileInfo.gid)
+     .add("fileSize", std::to_string(archiveFile.fileSize))
+     .add("checksumBlob", archiveFile.checksumBlob)
+     .add("creationTime", std::to_string(archiveFile.creationTime))
+     .add("reconciliationTime", std::to_string(archiveFile.reconciliationTime))
+     .add("diskFilePath",request.diskFilePath)
+     .add("errorMessage",ex.getMessageValue())
+     .add("storageClass", archiveFile.storageClass);
+    for(auto it=archiveFile.tapeFiles.begin(); it!=archiveFile.tapeFiles.end(); it++) {
+      std::stringstream tapeCopyLogStream;
+      tapeCopyLogStream << "copy number: " << static_cast<int>(it->copyNb)
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " fileSize: " << it->fileSize
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
+      spc.add("TAPE FILE", tapeCopyLogStream.str());
+    }
+    lc.log(log::WARNING, "Failed to move archive file to recycle-bin.");
+
+    exception::UserError ue;
+    ue.getMessage() << "Failed to move archive file with ID " << request.archiveFileID << " to the recycle-bin. errorMessage=" << ex.getMessageValue();
+    throw ue;
+  }
+  
+  try {
+    //All checks are good, we can move the file to the recycle-bin
+    auto conn = m_connPool.getConn();
+    rdbms::AutoRollback autoRollback(conn);
+    copyArchiveFileToRecycleBinAndDelete(conn,request,lc);
+    tl.insertAndReset("copyArchiveFileToRecycleBinAndDeleteTime",t);
+    tl.insertAndReset("totalTime",totalTime);
+    log::ScopedParamContainer spc(lc);
+    spc.add("fileId", std::to_string(request.archiveFileID))
+     .add("diskInstance", archiveFile.diskInstance)
+     .add("requestDiskInstance", request.diskInstance)
+     .add("diskFileId", archiveFile.diskFileId)
+     .add("diskFileInfo.owner_uid", archiveFile.diskFileInfo.owner_uid)
+     .add("diskFileInfo.gid", archiveFile.diskFileInfo.gid)
+     .add("fileSize", std::to_string(archiveFile.fileSize))
+     .add("checksumBlob", archiveFile.checksumBlob)
+     .add("creationTime", std::to_string(archiveFile.creationTime))
+     .add("reconciliationTime", std::to_string(archiveFile.reconciliationTime))
+     .add("storageClass", archiveFile.storageClass);
+    for(auto it=archiveFile.tapeFiles.begin(); it!=archiveFile.tapeFiles.end(); it++) {
+      std::stringstream tapeCopyLogStream;
+      tapeCopyLogStream << "copy number: " << static_cast<int>(it->copyNb)
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " fileSize: " << it->fileSize
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
+      spc.add("TAPE FILE", tapeCopyLogStream.str());
+    }
+    tl.addToLog(spc);
+    lc.log(log::INFO, "In RdbmsCatalogue::moveArchiveFileToRecycleBin(): ArchiveFile moved to the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// insertArchiveFileToRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::copyArchiveFileToRecycleBin(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request) {
+  
+  try{
+    const char *const afRecycleBinInsertSql =
+      "INSERT INTO ARCHIVE_FILE_RECYCLE_BIN "
+      "("
+        "ARCHIVE_FILE_ID,"
+        "DISK_INSTANCE_NAME,"
+        "DISK_FILE_ID,"
+        "DISK_FILE_ID_WHEN_DELETED,"
+        "DISK_FILE_UID,"
+        "DISK_FILE_GID,"
+        "SIZE_IN_BYTES,"
+        "CHECKSUM_BLOB,"
+        "CHECKSUM_ADLER32,"
+        "STORAGE_CLASS_ID,"
+        "CREATION_TIME,"
+        "RECONCILIATION_TIME,"
+        "COLLOCATION_HINT,"
+        "DISK_FILE_PATH,"
+        "DELETION_TIME"
+      ") SELECT "
+        "ARCHIVE_FILE.ARCHIVE_FILE_ID,"
+        "ARCHIVE_FILE.DISK_INSTANCE_NAME,"
+        "ARCHIVE_FILE.DISK_FILE_ID,"
+        ":DISK_FILE_ID_WHEN_DELETED,"
+        "ARCHIVE_FILE.DISK_FILE_UID,"
+        "ARCHIVE_FILE.DISK_FILE_GID,"
+        "ARCHIVE_FILE.SIZE_IN_BYTES,"
+        "ARCHIVE_FILE.CHECKSUM_BLOB,"
+        "ARCHIVE_FILE.CHECKSUM_ADLER32,"
+        "ARCHIVE_FILE.STORAGE_CLASS_ID,"
+        "ARCHIVE_FILE.CREATION_TIME,"
+        "ARCHIVE_FILE.RECONCILIATION_TIME,"
+        "ARCHIVE_FILE.COLLOCATION_HINT,"
+        ":DISK_FILE_PATH,"
+        ":DELETION_TIME "
+      "FROM "
+        "ARCHIVE_FILE "
+      "JOIN "
+        "STORAGE_CLASS ON ARCHIVE_FILE.STORAGE_CLASS_ID = STORAGE_CLASS.STORAGE_CLASS_ID "
+      "WHERE "
+        "ARCHIVE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+
+    //const auto getConnTime = t.secs(utils::Timer::resetCounter);
+    auto insertArchiveFileStmt = conn.createStmt(afRecycleBinInsertSql);
+    insertArchiveFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID);
+    insertArchiveFileStmt.bindString(":DISK_FILE_PATH",request.diskFilePath);
+    insertArchiveFileStmt.bindString(":DISK_FILE_ID_WHEN_DELETED",request.diskFileId);
+    const time_t now = time(nullptr);
+    insertArchiveFileStmt.bindUint64(":DELETION_TIME",now);
+    
+    insertArchiveFileStmt.executeNonQuery();
+    
+    const char *const tfRecycleBinInsertSql = 
+    "INSERT INTO TAPE_FILE_RECYCLE_BIN"
+    "("
+      "VID,"
+      "FSEQ,"
+      "BLOCK_ID,"
+      "LOGICAL_SIZE_IN_BYTES,"
+      "COPY_NB,"
+      "CREATION_TIME,"
+      "ARCHIVE_FILE_ID,"
+      "SUPERSEDED_BY_VID,"
+      "SUPERSEDED_BY_FSEQ,"
+      "WRITE_START_WRAP,"
+      "WRITE_START_LPOS,"
+      "WRITE_END_WRAP,"
+      "WRITE_END_LPOS,"
+      "READ_START_WRAP,"
+      "READ_START_LPOS,"
+      "READ_END_WRAP,"
+      "READ_END_LPOS"
+    ") SELECT "
+      "TAPE_FILE.VID,"
+      "TAPE_FILE.FSEQ,"
+      "TAPE_FILE.BLOCK_ID,"
+      "TAPE_FILE.LOGICAL_SIZE_IN_BYTES,"
+      "TAPE_FILE.COPY_NB,"
+      "TAPE_FILE.CREATION_TIME,"
+      "TAPE_FILE.ARCHIVE_FILE_ID,"
+      "TAPE_FILE.SUPERSEDED_BY_VID,"
+      "TAPE_FILE.SUPERSEDED_BY_FSEQ,"
+      "TAPE_FILE.WRITE_START_WRAP,"
+      "TAPE_FILE.WRITE_START_LPOS,"
+      "TAPE_FILE.WRITE_END_WRAP,"
+      "TAPE_FILE.WRITE_END_LPOS,"
+      "TAPE_FILE.READ_START_WRAP,"
+      "TAPE_FILE.READ_START_LPOS,"
+      "TAPE_FILE.READ_END_WRAP,"
+      "TAPE_FILE.READ_END_LPOS "
+    "FROM "
+      "TAPE_FILE "
+    "WHERE TAPE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+    
+    auto insertTapeFileStmt = conn.createStmt(tfRecycleBinInsertSql);
+    insertTapeFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID);
+    
+    insertTapeFileStmt.executeNonQuery();
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteArchiveFileAndTapeFiles
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::deleteArchiveFileAndTapeFiles(rdbms::Conn& conn, const common::dataStructures::DeleteArchiveRequest& request) {
+  try {
+    const char *const deleteTapeFilesSql = 
+    "DELETE FROM "
+      "TAPE_FILE "
+    "WHERE TAPE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+    
+    auto deleteTapeFilesStmt = conn.createStmt(deleteTapeFilesSql);
+    deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID);
+    deleteTapeFilesStmt.executeNonQuery();
+    
+    const char *const deleteArchiveFileSql = 
+    "DELETE FROM "
+      "ARCHIVE_FILE "
+    "WHERE ARCHIVE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+    
+    auto deleteArchiveFileStmt = conn.createStmt(deleteArchiveFileSql);
+    deleteArchiveFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID);
+    deleteArchiveFileStmt.executeNonQuery();
+    
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteFileFromRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) {
+  try {
+    auto conn = m_connPool.getConn();
+    rdbms::AutoRollback autoRollback(conn);
+    deleteTapeFilesAndArchiveFileFromRecycleBin(conn,archiveFileId,lc);
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }  
+}
+
+//------------------------------------------------------------------------------
+// deleteTapeFilesFromRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::deleteTapeFilesFromRecycleBin(cta::rdbms::Conn & conn, const uint64_t archiveFileId) {
+  try {
+    const char *const deleteTapeFilesSql = 
+    "DELETE FROM "
+      "TAPE_FILE_RECYCLE_BIN "
+    "WHERE TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+    
+    auto deleteTapeFilesStmt = conn.createStmt(deleteTapeFilesSql);
+    deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId);
+    deleteTapeFilesStmt.executeNonQuery();
+    
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteTapeFilesFromRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::deleteArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId) {
+  try {
+    const char *const deleteArchiveFileSql = 
+    "DELETE FROM "
+      "ARCHIVE_FILE_RECYCLE_BIN "
+    "WHERE ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+    
+    auto deleteTapeFilesStmt = conn.createStmt(deleteArchiveFileSql);
+    deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId);
+    deleteTapeFilesStmt.executeNonQuery();
+    
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteFilesFromRecycleBin
+//------------------------------------------------------------------------------
+void RdbmsCatalogue::deleteFilesFromRecycleBin(rdbms::Conn & conn, const std::string& vid, cta::log::LogContext & lc) {
+  try {
+    const char *const selectArchiveFileIdSql = 
+    "SELECT "
+      "TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID AS ARCHIVE_FILE_ID "
+    "FROM "
+      "TAPE_FILE_RECYCLE_BIN "
+    "WHERE "
+      "TAPE_FILE_RECYCLE_BIN.VID = :VID";
+    
+    auto selectFileStmt = conn.createStmt(selectArchiveFileIdSql);
+    selectFileStmt.bindString(":VID",vid);
+    auto rset = selectFileStmt.executeQuery();
+    std::set<uint64_t> archiveFileIds;
+    while(rset.next()){
+      archiveFileIds.insert(rset.columnUint64("ARCHIVE_FILE_ID"));
+    }
+    rdbms::AutoRollback rollback(conn);
+    for(auto archiveFileId: archiveFileIds){
+      deleteTapeFilesAndArchiveFileFromRecycleBin(conn,archiveFileId,lc);
+    }
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/RdbmsCatalogue.hpp b/catalogue/RdbmsCatalogue.hpp
index fb1c7d0ee0..e854587272 100644
--- a/catalogue/RdbmsCatalogue.hpp
+++ b/catalogue/RdbmsCatalogue.hpp
@@ -405,8 +405,9 @@ public:
    *
    * @param admin The administrator.
    * @param vid The volume identifier of the tape to be reclaimed.
+   * @param lc the logContext
    */
-  void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) override;
+  void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) override;
   
   /**
    * Checks the specified tape for the tape label command.
@@ -712,6 +713,15 @@ public:
    */
   ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override;
 
+  /**
+   * Returns the specified deleted archive files.  Please note that the list of files
+   * is ordered by archive file ID.
+   *
+   * @param searchCriteria The search criteria.
+   * @return The deleted archive files.
+   */
+  DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const override;
+  
   /**
    * Returns the specified files in tape file sequence order.
    *
@@ -1503,6 +1513,14 @@ protected:
    * @param event The evnt to be checked.
    */
   void checkTapeFileWrittenFieldsAreSet(const std::string &callingFunc, const TapeFileWritten &event) const;
+  
+  /**
+   * Throws an exception if the delete request passed in parameter is not consistent
+   * to allow a deletion of the ArchiveFile from the Catalogue.
+   * @param deleteRequest, the deleteRequest to check the consistency.
+   * @param archiveFile the ArchiveFile to delete to check the deleteRequest consistency against.
+   */
+  void checkDeleteRequestConsistency(const cta::common::dataStructures::DeleteArchiveRequest deleteRequest, const cta::common::dataStructures::ArchiveFile & archiveFile) const;
 
   /**
    * Returns a cached version of the result of calling isAdmin().
@@ -1618,6 +1636,74 @@ protected:
   void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance,
     const std::string &diskFileId) override;
 
+   /**
+   * Insert the tape files and ArchiveFiles entries in the recycle-bin and delete
+   * them from the TAPE_FILE and ARCHIVE_FILE  tables
+   * @param request the DeleteRequest object that holds information about the file to delete.
+   * @param lc the logContext
+   */
+  void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, 
+  log::LogContext & lc) override;
+  
+  /**
+   * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables
+   * and deletes the ARCHIVE_FILE and TAPE_FILE entries.
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   * @param lc the log context
+   */
+  virtual void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn,const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) = 0;
+  
+  /**
+   * Copies the ARCHIVE_FILE and TAPE_FILE entries to the recycle-bin tables 
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   */
+  void copyArchiveFileToRecycleBin(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request);
+  
+  
+  /**
+   * Delete the TAPE_FILE and ARCHIVE_FILE entries from the Catalogue
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   */
+  void deleteArchiveFileAndTapeFiles(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request);
+  
+  /**
+   * Delete the archiveFile and the associated tape files from the recycle-bin
+   * @param archiveFileId the archiveFileId of the archive file to delete
+   * @param lc the logContext
+   */
+  void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc);
+  
+  /**
+   * Delete the archiveFile and the associated tape files that are on the specified tape from the recycle-bin
+   * @param vid the vid of the tape where the files to be deleted are located
+   * @param lc the logContext
+   */
+  void deleteFilesFromRecycleBin(rdbms::Conn & conn,const std::string & vid, log::LogContext & lc);
+  
+  /**
+   * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin
+   */
+  virtual void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc) = 0;
+  
+  /**
+   * Delete the tape files from the TAPE_FILE recycle-bin
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the tape files to delete
+   */
+  void deleteTapeFilesFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId);
+  
+  /**
+   * Delete the archive file from the ARCHIVE_FILE recycle-bin
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the archive file to delete
+   */
+  void deleteArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId);
+  
   /**
    * Cached versions of tape copy to tape tape pool mappings for specific
    * storage classes.
diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp
index 94ca4177f8..ffcca772d3 100644
--- a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp
+++ b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp
@@ -25,6 +25,7 @@
 #include "rdbms/ConnPool.hpp"
 #include "rdbms/Stmt.hpp"
 #include "rdbms/Rset.hpp"
+#include "common/dataStructures/ArchiveFile.hpp"
 
 namespace cta {
 namespace catalogue {
@@ -112,7 +113,7 @@ private:
    * Builds ArchiveFile objects from a stream of tape files ordered by archive
    * ID and then copy number.
    */
-  ArchiveFileBuilder m_archiveFileBuilder;
+  ArchiveFileBuilder<cta::common::dataStructures::ArchiveFile> m_archiveFileBuilder;
 
 }; // class RdbmsCatalogueGetArchiveFilesForRepackItor
 
diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
index 052deabb6d..b1258fb43b 100644
--- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
+++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
@@ -132,7 +132,7 @@ RdbmsCatalogueGetArchiveFilesItor::RdbmsCatalogueGetArchiveFilesItor(
       searchCriteria.tapePool;
 
     if(thereIsAtLeastOneSearchCriteria) {
-      sql += " WHERE ";
+    sql += " WHERE ";
     }
 
     bool addedAWhereConstraint = false;
diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp
index dacdaf62ac..3d48a82e26 100644
--- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp
+++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp
@@ -21,6 +21,7 @@
 #include "catalogue/ArchiveFileBuilder.hpp"
 #include "catalogue/ArchiveFileItorImpl.hpp"
 #include "catalogue/TapeFileSearchCriteria.hpp"
+#include "common/dataStructures/ArchiveFile.hpp"
 #include "common/log/Logger.hpp"
 #include "rdbms/ConnPool.hpp"
 #include "rdbms/Stmt.hpp"
@@ -113,7 +114,7 @@ private:
    * Builds ArchiveFile objects from a stream of tape files ordered by archive
    * ID and then copy number.
    */
-  ArchiveFileBuilder m_archiveFileBuilder;
+  ArchiveFileBuilder<cta::common::dataStructures::ArchiveFile> m_archiveFileBuilder;
 
 }; // class RdbmsCatalogueGetArchiveFilesItor
 
diff --git a/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp
new file mode 100644
index 0000000000..b5f1a6b173
--- /dev/null
+++ b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp
@@ -0,0 +1,312 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "RdbmsCatalogueGetDeletedArchiveFilesItor.hpp"
+#include "common/log/LogContext.hpp"
+#include "common/exception/UserError.hpp"
+
+namespace cta {
+namespace catalogue {
+  
+  namespace {
+  /**
+   * Populates an ArchiveFile object with the current column values of the
+   * specified result set.
+   *
+   * @param rset The result set to be used to populate the ArchiveFile object.
+   * @return The populated ArchiveFile object.
+   */
+  static common::dataStructures::DeletedArchiveFile populateDeletedArchiveFile(const rdbms::Rset &rset) {
+      rset.columnUint64("ARCHIVE_FILE_ID");
+    if(!rset.columnIsNull("VID")) {
+        rset.columnUint64("COPY_NB");
+    }
+    common::dataStructures::DeletedArchiveFile deletedArchiveFile;
+
+    deletedArchiveFile.archiveFileID = rset.columnUint64("ARCHIVE_FILE_ID");
+    deletedArchiveFile.diskInstance = rset.columnString("DISK_INSTANCE_NAME");
+    deletedArchiveFile.diskFileId = rset.columnString("DISK_FILE_ID");
+    deletedArchiveFile.diskFileInfo.owner_uid = rset.columnUint64("DISK_FILE_UID");
+    deletedArchiveFile.diskFileInfo.gid = rset.columnUint64("DISK_FILE_GID");
+    deletedArchiveFile.fileSize = rset.columnUint64("SIZE_IN_BYTES");
+    deletedArchiveFile.checksumBlob.deserializeOrSetAdler32(rset.columnBlob("CHECKSUM_BLOB"), rset.columnUint64("CHECKSUM_ADLER32"));
+    deletedArchiveFile.storageClass = rset.columnString("STORAGE_CLASS_NAME");
+    deletedArchiveFile.creationTime = rset.columnUint64("ARCHIVE_FILE_CREATION_TIME");
+    deletedArchiveFile.reconciliationTime = rset.columnUint64("RECONCILIATION_TIME");
+    deletedArchiveFile.diskFileIdWhenDeleted = rset.columnString("DISK_FILE_ID_WHEN_DELETED");
+    deletedArchiveFile.diskFilePath = rset.columnString("DISK_FILE_PATH");
+    deletedArchiveFile.deletionTime = rset.columnUint64("DELETION_TIME");
+    // If there is a tape file
+    if (!rset.columnIsNull("VID")) {
+      common::dataStructures::TapeFile tapeFile;
+      tapeFile.vid = rset.columnString("VID");
+      tapeFile.fSeq = rset.columnUint64("FSEQ");
+      tapeFile.blockId = rset.columnUint64("BLOCK_ID");
+      tapeFile.fileSize = rset.columnUint64("LOGICAL_SIZE_IN_BYTES");
+      tapeFile.copyNb = rset.columnUint64("COPY_NB");
+      tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
+      tapeFile.checksumBlob = deletedArchiveFile.checksumBlob; // Duplicated for convenience
+      if(!rset.columnIsNull("SUPERSEDED_BY_VID") && !rset.columnIsNull("SUPERSEDED_BY_FSEQ")){
+        tapeFile.supersededByVid = rset.columnString("SUPERSEDED_BY_VID");
+        tapeFile.supersededByFSeq = rset.columnUint64("SUPERSEDED_BY_FSEQ");
+      }
+      deletedArchiveFile.tapeFiles.push_back(tapeFile);
+    }
+
+    return deletedArchiveFile;
+  }
+} // anonymous namespace
+
+RdbmsCatalogueGetDeletedArchiveFilesItor::RdbmsCatalogueGetDeletedArchiveFilesItor(
+  log::Logger &log,
+  rdbms::ConnPool &connPool,
+  const TapeFileSearchCriteria &searchCriteria):
+  m_log(log),
+  m_connPool(connPool),
+  m_searchCriteria(searchCriteria),
+  m_rsetIsEmpty(true),
+  m_hasMoreHasBeenCalled(false),
+  m_archiveFileBuilder(log) {
+  try {
+    std::string sql =
+      "SELECT "
+        "ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID AS ARCHIVE_FILE_ID,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_INSTANCE_NAME AS DISK_INSTANCE_NAME,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID AS DISK_FILE_ID,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_UID AS DISK_FILE_UID,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_GID AS DISK_FILE_GID,"
+        "ARCHIVE_FILE_RECYCLE_BIN.SIZE_IN_BYTES AS SIZE_IN_BYTES,"
+        "ARCHIVE_FILE_RECYCLE_BIN.CHECKSUM_BLOB AS CHECKSUM_BLOB,"
+        "ARCHIVE_FILE_RECYCLE_BIN.CHECKSUM_ADLER32 AS CHECKSUM_ADLER32,"
+        "STORAGE_CLASS.STORAGE_CLASS_NAME AS STORAGE_CLASS_NAME,"
+        "ARCHIVE_FILE_RECYCLE_BIN.CREATION_TIME AS ARCHIVE_FILE_CREATION_TIME,"
+        "ARCHIVE_FILE_RECYCLE_BIN.RECONCILIATION_TIME AS RECONCILIATION_TIME,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID_WHEN_DELETED AS DISK_FILE_ID_WHEN_DELETED,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_PATH AS DISK_FILE_PATH,"
+        "ARCHIVE_FILE_RECYCLE_BIN.DELETION_TIME AS DELETION_TIME,"
+        "TAPE_FILE_RECYCLE_BIN.VID AS VID,"
+        "TAPE_FILE_RECYCLE_BIN.FSEQ AS FSEQ,"
+        "TAPE_FILE_RECYCLE_BIN.BLOCK_ID AS BLOCK_ID,"
+        "TAPE_FILE_RECYCLE_BIN.LOGICAL_SIZE_IN_BYTES AS LOGICAL_SIZE_IN_BYTES,"
+        "TAPE_FILE_RECYCLE_BIN.COPY_NB AS COPY_NB,"
+        "TAPE_FILE_RECYCLE_BIN.CREATION_TIME AS TAPE_FILE_CREATION_TIME, "
+        "TAPE_FILE_RECYCLE_BIN.SUPERSEDED_BY_VID AS SUPERSEDED_BY_VID, "
+        "TAPE_FILE_RECYCLE_BIN.SUPERSEDED_BY_FSEQ AS SUPERSEDED_BY_FSEQ, "
+        "TAPE_POOL.TAPE_POOL_NAME AS TAPE_POOL_NAME "
+      "FROM "
+        "ARCHIVE_FILE_RECYCLE_BIN "
+      "INNER JOIN STORAGE_CLASS ON "
+        "ARCHIVE_FILE_RECYCLE_BIN.STORAGE_CLASS_ID = STORAGE_CLASS.STORAGE_CLASS_ID "
+      "LEFT OUTER JOIN TAPE_FILE_RECYCLE_BIN ON "
+        "ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID "
+      "LEFT OUTER JOIN TAPE ON "
+        "TAPE_FILE_RECYCLE_BIN.VID = TAPE.VID "
+      "INNER JOIN TAPE_POOL ON "
+        "TAPE.TAPE_POOL_ID = TAPE_POOL.TAPE_POOL_ID";
+
+    const bool thereIsAtLeastOneSearchCriteria =
+      searchCriteria.archiveFileId  ||
+      searchCriteria.diskInstance   ||
+      searchCriteria.diskFileId     ||
+      searchCriteria.diskFileOwnerUid   ||
+      searchCriteria.diskFileGid  ||
+      searchCriteria.storageClass   ||
+      searchCriteria.vid            ||
+      searchCriteria.tapeFileCopyNb ||
+      searchCriteria.tapePool;
+
+    if(thereIsAtLeastOneSearchCriteria) {
+    sql += " WHERE ";
+    }
+
+    bool addedAWhereConstraint = false;
+
+    if(searchCriteria.archiveFileId) {
+      sql += " ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.diskInstance) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_INSTANCE_NAME = :DISK_INSTANCE_NAME";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.diskFileId) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID = :DISK_FILE_ID";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.diskFileOwnerUid) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_UID = :DISK_FILE_UID";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.diskFileGid) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_GID = :DISK_FILE_GID";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.storageClass) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "STORAGE_CLASS.STORAGE_CLASS_NAME = :STORAGE_CLASS_NAME";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.vid) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "TAPE_FILE_RECYCLE_BIN.VID = :VID";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.tapeFileCopyNb) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "TAPE_FILE_RECYCLE_BIN.COPY_NB = :TAPE_FILE_COPY_NB";
+      addedAWhereConstraint = true;
+    }
+    if(searchCriteria.tapePool) {
+      if(addedAWhereConstraint) sql += " AND ";
+      sql += "TAPE_POOL.TAPE_POOL_NAME = :TAPE_POOL_NAME";
+    }
+
+    // Order by FSEQ if we are listing the contents of a tape, else order by
+    // archive file ID
+    if(searchCriteria.vid) {
+      sql += " ORDER BY FSEQ";
+    } else {
+      sql += " ORDER BY ARCHIVE_FILE_ID, COPY_NB";
+    }
+
+    m_conn = connPool.getConn();
+    m_stmt = m_conn.createStmt(sql);
+    if(searchCriteria.archiveFileId) {
+      m_stmt.bindUint64(":ARCHIVE_FILE_ID", searchCriteria.archiveFileId.value());
+    }
+    if(searchCriteria.diskInstance) {
+      m_stmt.bindString(":DISK_INSTANCE_NAME", searchCriteria.diskInstance.value());
+    }
+    if(searchCriteria.diskFileId) {
+      m_stmt.bindString(":DISK_FILE_ID", searchCriteria.diskFileId.value());
+    }
+    if(searchCriteria.diskFileOwnerUid) {
+      m_stmt.bindUint64(":DISK_FILE_UID", searchCriteria.diskFileOwnerUid.value());
+    }
+    if(searchCriteria.diskFileGid) {
+      m_stmt.bindUint64(":DISK_FILE_GID", searchCriteria.diskFileGid.value());
+    }
+    if(searchCriteria.storageClass) {
+      m_stmt.bindString(":STORAGE_CLASS_NAME", searchCriteria.storageClass.value());
+    }
+    if(searchCriteria.vid) {
+      m_stmt.bindString(":VID", searchCriteria.vid.value());
+    }
+    if(searchCriteria.tapeFileCopyNb) {
+      m_stmt.bindUint64(":TAPE_FILE_COPY_NB", searchCriteria.tapeFileCopyNb.value());
+    }
+    if(searchCriteria.tapePool) {
+      m_stmt.bindString(":TAPE_POOL_NAME", searchCriteria.tapePool.value());
+    }
+    m_rset = m_stmt.executeQuery();
+
+    {
+      log::LogContext lc(m_log);
+      lc.log(log::INFO, "RdbmsCatalogueGetDeletedArchiveFilesItor - immediately after m_stmt.executeQuery()");
+    }
+
+    m_rsetIsEmpty = !m_rset.next();
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+RdbmsCatalogueGetDeletedArchiveFilesItor::~RdbmsCatalogueGetDeletedArchiveFilesItor() {
+}
+
+bool RdbmsCatalogueGetDeletedArchiveFilesItor::hasMore() {
+  m_hasMoreHasBeenCalled = true;
+
+  if(m_rsetIsEmpty) {
+    // If there is an ArchiveFile object under construction
+    if(nullptr != m_archiveFileBuilder.getArchiveFile()) {
+      return true;
+    } else {
+      return false;
+    }
+  } else {
+    return true;
+  }
+}
+
+
+common::dataStructures::DeletedArchiveFile RdbmsCatalogueGetDeletedArchiveFilesItor::next() {
+  try {
+    if(!m_hasMoreHasBeenCalled) {
+      throw exception::Exception("hasMore() must be called before next()");
+    }
+    m_hasMoreHasBeenCalled = false;
+
+    // If there are no more rows in the result set
+    if(m_rsetIsEmpty) {
+      // There must be an ArchiveFile object currently under construction
+      if(nullptr == m_archiveFileBuilder.getArchiveFile()) {
+        throw exception::Exception("next() was called with no more rows in the result set and no ArchiveFile object"
+          " under construction");
+      }
+
+      // Return the ArchiveFile object that must now be complete and clear the
+      // ArchiveFile builder
+      common::dataStructures::DeletedArchiveFile tmp = *m_archiveFileBuilder.getArchiveFile();
+      m_archiveFileBuilder.clear();
+      return tmp;
+    }
+
+    while(true) {
+      auto archiveFile = populateDeletedArchiveFile(m_rset);
+
+      auto completeArchiveFile = m_archiveFileBuilder.append(archiveFile);
+
+      m_rsetIsEmpty = !m_rset.next();
+
+      // If the ArchiveFile object under construction is complete
+      if (nullptr != completeArchiveFile.get()) {
+       return *completeArchiveFile;
+      // The ArchiveFile object under construction is not complete
+      } else {
+        if(m_rsetIsEmpty) {
+          // There must be an ArchiveFile object currently under construction
+          if (nullptr == m_archiveFileBuilder.getArchiveFile()) {
+            throw exception::Exception("next() was called with no more rows in the result set and no ArchiveFile object"
+              " under construction");
+          }
+
+          // Return the ArchiveFile object that must now be complete and clear the
+          // ArchiveFile builder
+          common::dataStructures::DeletedArchiveFile * tmp = m_archiveFileBuilder.getArchiveFile();
+          m_archiveFileBuilder.clear();
+          return *tmp;
+        }
+      }
+    }
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+}}
\ No newline at end of file
diff --git a/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp
new file mode 100644
index 0000000000..73f0d9e722
--- /dev/null
+++ b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp
@@ -0,0 +1,118 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "DeletedArchiveFileItorImpl.hpp"
+#include "common/log/Logger.hpp"
+#include "rdbms/ConnPool.hpp"
+#include "rdbms/Stmt.hpp"
+#include "rdbms/Rset.hpp"
+#include "TapeFileSearchCriteria.hpp"
+#include "ArchiveFileBuilder.hpp"
+#include "common/dataStructures/DeletedArchiveFile.hpp"
+
+
+namespace cta {
+namespace catalogue {
+
+class RdbmsCatalogueGetDeletedArchiveFilesItor: public DeletedArchiveFileItorImpl {
+public:
+
+  /**
+   * Constructor.
+   *
+   * @param log Object representing the API to the CTA logging system.
+   * @param connPool The database connection pool.
+   * @param searchCriteria The search criteria to be used when listing archive
+   * files.
+   */
+  RdbmsCatalogueGetDeletedArchiveFilesItor(
+    log::Logger &log,
+    rdbms::ConnPool &connPool,
+    const TapeFileSearchCriteria &searchCriteria);
+
+  /**
+   * Destructor.
+   */
+  ~RdbmsCatalogueGetDeletedArchiveFilesItor() override;
+
+  /**
+   * Returns true if a call to next would return another archive file.
+   */
+  bool hasMore() override;
+
+  /**
+   * Returns the next archive or throws an exception if there isn't one.
+   */
+  common::dataStructures::DeletedArchiveFile next() override;
+  
+private:
+
+  /**
+   * Object representing the API to the CTA logging system.
+   */
+  log::Logger &m_log;
+
+  /**
+   * The database connection pool.
+   */
+  rdbms::ConnPool &m_connPool;
+
+  /**
+   * The search criteria to be used when listing archive files.
+   */
+  TapeFileSearchCriteria m_searchCriteria;
+
+  /**
+   * True if the result set is empty.
+   */
+  bool m_rsetIsEmpty;
+
+  /**
+   * True if hasMore() has been called and the corresponding call to next() has
+   * not.
+   *
+   * This member-variable is used to prevent next() being called before
+   * hasMore().
+   */
+  bool m_hasMoreHasBeenCalled;
+
+  /**
+   * The database connection.
+   */
+  rdbms::Conn m_conn;
+
+  /**
+   * The database statement.
+   */
+  rdbms::Stmt m_stmt;
+
+  /**
+   * The result set of archive files that is to be iterated over.
+   */
+  rdbms::Rset m_rset;
+
+  /**
+   * Builds ArchiveFile objects from a stream of tape files ordered by archive
+   * ID and then copy number.
+   */
+  ArchiveFileBuilder<cta::common::dataStructures::DeletedArchiveFile> m_archiveFileBuilder;
+};
+
+}}
diff --git a/catalogue/SqliteCatalogue.cpp b/catalogue/SqliteCatalogue.cpp
index 0b77f36b3c..aa421d8606 100644
--- a/catalogue/SqliteCatalogue.cpp
+++ b/catalogue/SqliteCatalogue.cpp
@@ -28,6 +28,7 @@
 #include "rdbms/AutoRollback.hpp"
 #include "rdbms/ConstraintError.hpp"
 #include "rdbms/PrimaryKeyError.hpp"
+#include "common/log/TimingList.hpp"
 
 namespace cta {
 namespace catalogue {
@@ -126,6 +127,8 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
       stmt.executeNonQuery();
     }
     
+    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    
     std::set<std::string> vidsToSetDirty;
     //We will insert the vids to set dirty in a set so that
     //we limit the calls to setTapeDirty to the number of tapes that contained the deleted tape files 
@@ -137,7 +140,7 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
        setTapeDirty(conn,vidToSetDirty);
     }
     
-    const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter);
+    const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter);
 
     {
       const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID;";
@@ -165,6 +168,7 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
        .add("getArchiveFileTime", getArchiveFileTime)
        .add("deleteFromTapeFileTime", deleteFromTapeFileTime)
        .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime)
+       .add("setTapeDirtyTime",setTapeDirtyTime)
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
@@ -501,5 +505,64 @@ void SqliteCatalogue::fileWrittenToTape(rdbms::Conn &conn, const TapeFileWritten
   }
 }
 
+//------------------------------------------------------------------------------
+// copyArchiveFileToRecycleBinAndDelete
+//------------------------------------------------------------------------------
+void SqliteCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do an INSERT INTO and a DELETE FROM
+    //in a single transaction
+    conn.executeNonQuery("BEGIN TRANSACTION");
+    copyArchiveFileToRecycleBin(conn,request);
+    tl.insertAndReset("insertToRecycleBinTime",t);
+    deleteArchiveFileAndTapeFiles(conn,request);
+    tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",request.archiveFileID);
+    spc.add("diskFileId",request.diskFileId);
+    spc.add("diskFilePath",request.diskFilePath);
+    spc.add("diskInstance",request.diskInstance);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+//------------------------------------------------------------------------------
+// deleteTapeFilesAndArchiveFileFromRecycleBin
+//------------------------------------------------------------------------------
+void SqliteCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) {
+  try {
+    utils::Timer t;
+    log::TimingList tl;
+    //We currently do two delete in one transaction
+    conn.executeNonQuery("BEGIN TRANSACTION");
+    deleteTapeFilesFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteTapeFilesTime",t);
+    deleteArchiveFileFromRecycleBin(conn,archiveFileId);
+    tl.insertAndReset("deleteArchiveFileTime",t);
+    conn.commit();
+    tl.insertAndReset("commitTime",t);
+    log::ScopedParamContainer spc(lc);
+    spc.add("archiveFileId",archiveFileId);
+    tl.addToLog(spc);
+    lc.log(log::INFO,"In SqliteCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin.");
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+
 } // namespace catalogue
 } // namespace cta
diff --git a/catalogue/SqliteCatalogue.hpp b/catalogue/SqliteCatalogue.hpp
index 205d82769b..a0a01144b8 100644
--- a/catalogue/SqliteCatalogue.hpp
+++ b/catalogue/SqliteCatalogue.hpp
@@ -162,7 +162,23 @@ protected:
    * @param events The tape file written events.
    */
   void filesWrittenToTape(const std::set<TapeItemWrittenPointer> &events) override;
-
+  
+  /**
+   * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables
+   * and deletes the ARCHIVE_FILE and TAPE_FILE entries.
+   * @param conn the database connection
+   * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin
+   * @param lc the log context
+   */
+  void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override;
+  
+  /**
+   * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction
+   * @param conn the database connection
+   * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin
+   */
+  void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) override;
+  
 private:
 
   /**
diff --git a/catalogue/TapeFileSearchCriteria.hpp b/catalogue/TapeFileSearchCriteria.hpp
index 8ce77fa56a..3ce165e163 100644
--- a/catalogue/TapeFileSearchCriteria.hpp
+++ b/catalogue/TapeFileSearchCriteria.hpp
@@ -83,7 +83,7 @@ struct TapeFileSearchCriteria {
    * The name of a tape pool.
    */
   optional<std::string> tapePool;
-
+  
 }; // struct TapeFileSearchCriteria
 
 } // namespace catalogue
diff --git a/catalogue/common_catalogue_schema.sql b/catalogue/common_catalogue_schema.sql
index b03bab6dd2..cccdc10470 100644
--- a/catalogue/common_catalogue_schema.sql
+++ b/catalogue/common_catalogue_schema.sql
@@ -288,3 +288,51 @@ CREATE TABLE EXPERIMENTS (
  NAME                     VARCHAR(20),
  GID                      UINT32TYPE CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY
 );
+CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(
+  ARCHIVE_FILE_ID         UINT64TYPE      CONSTRAINT ARCHIVE_FILE_RB_AFI_NN  NOT NULL,
+  DISK_INSTANCE_NAME      VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DIN_NN  NOT NULL,
+  DISK_FILE_ID            VARCHAR(100)    CONSTRAINT ARCHIVE_FILE_RB_DFI_NN  NOT NULL,
+  DISK_FILE_ID_WHEN_DELETED VARCHAR(100)  CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL,
+  DISK_FILE_UID           UINT32TYPE      CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN  NOT NULL,
+  DISK_FILE_GID           UINT32TYPE      CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN  NOT NULL,
+  SIZE_IN_BYTES           UINT64TYPE      CONSTRAINT ARCHIVE_FILE_RB_SIB_NN  NOT NULL,
+  CHECKSUM_BLOB           CHECKSUM_BLOB_TYPE,
+  CHECKSUM_ADLER32        UINT32TYPE      CONSTRAINT ARCHIVE_FILE_RB_CB2_NN  NOT NULL,
+  STORAGE_CLASS_ID        UINT64TYPE      CONSTRAINT ARCHIVE_FILE_RB_SCI_NN  NOT NULL,
+  CREATION_TIME           UINT64TYPE      CONSTRAINT ARCHIVE_FILE_RB_CT2_NN  NOT NULL,
+  RECONCILIATION_TIME     UINT64TYPE      CONSTRAINT ARCHIVE_FILE_RB_RT_NN   NOT NULL,
+  COLLOCATION_HINT        VARCHAR(100),
+  DISK_FILE_PATH          VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL,
+  DELETION_TIME           UINT64TYPE    CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL,
+  CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID),
+  CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)
+);
+CREATE TABLE TAPE_FILE_RECYCLE_BIN(
+  VID                      VARCHAR(100)   CONSTRAINT TAPE_FILE_RB_V_NN    NOT NULL,
+  FSEQ                     UINT64TYPE     CONSTRAINT TAPE_FILE_RB_F_NN    NOT NULL,
+  BLOCK_ID                 UINT64TYPE     CONSTRAINT TAPE_FILE_RB_BI_NN   NOT NULL,
+  LOGICAL_SIZE_IN_BYTES    UINT64TYPE     CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL,
+  COPY_NB                  UINT8TYPE      CONSTRAINT TAPE_FILE_RB_CN_NN   NOT NULL,
+  CREATION_TIME            UINT64TYPE     CONSTRAINT TAPE_FILE_RB_CT_NN   NOT NULL,
+  ARCHIVE_FILE_ID          UINT64TYPE     CONSTRAINT TAPE_FILE_RB_AFI_NN  NOT NULL,
+  SUPERSEDED_BY_VID        VARCHAR(100),
+  SUPERSEDED_BY_FSEQ       UINT64TYPE,
+  WRITE_START_WRAP         UINT16TYPE,
+  WRITE_START_LPOS         UINT32TYPE,
+  WRITE_END_WRAP           UINT16TYPE,
+  WRITE_END_LPOS           UINT32TYPE,
+  READ_START_WRAP          UINT16TYPE,
+  READ_START_LPOS          UINT32TYPE,
+  READ_END_WRAP            UINT16TYPE,
+  READ_END_LPOS            UINT32TYPE,
+  CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ),
+  CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)
+    REFERENCES TAPE(VID),
+  CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)
+    REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID),
+  CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID),
+  CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0),
+  CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)
+    REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)
+);
\ No newline at end of file
diff --git a/cmake/CTAVersions.cmake b/cmake/CTAVersions.cmake
index dc13954698..e26723e644 100644
--- a/cmake/CTAVersions.cmake
+++ b/cmake/CTAVersions.cmake
@@ -4,7 +4,7 @@ set(CTA_RELEASE 1)
 set(XROOTD_SSI_PROTOBUF_INTERFACE_VERSION "v0.0")
 
 # Catalogue Schema Version
-set(CTA_CATALOGUE_SCHEMA_VERSION_MAJOR 2)
+set(CTA_CATALOGUE_SCHEMA_VERSION_MAJOR 3)
 set(CTA_CATALOGUE_SCHEMA_VERSION_MINOR 0)
 
 # Shared object internal version (used in SONAME)
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index ba0230ae4a..b2996524de 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -43,6 +43,7 @@ set (COMMON_LIB_SRC_FILES
   dataStructures/ArchiveRequest.cpp
   dataStructures/ArchiveRoute.cpp
   dataStructures/CancelRetrieveRequest.cpp
+  dataStructures/DeletedArchiveFile.cpp
   dataStructures/DeleteArchiveRequest.cpp
   dataStructures/DesiredDriveState.cpp
   dataStructures/DiskFileInfo.cpp
diff --git a/common/dataStructures/ArchiveFile.hpp b/common/dataStructures/ArchiveFile.hpp
index f5e7f97445..f1ef39e95f 100644
--- a/common/dataStructures/ArchiveFile.hpp
+++ b/common/dataStructures/ArchiveFile.hpp
@@ -36,7 +36,7 @@ namespace dataStructures {
 struct ArchiveFile {
 
   ArchiveFile();
-
+  
   /**
    * Equality operator that does NOT compare the creationTime and
    * reconciliationTime member-variables.
diff --git a/common/dataStructures/DeleteArchiveRequest.cpp b/common/dataStructures/DeleteArchiveRequest.cpp
index c477234cd1..ccfae394f7 100644
--- a/common/dataStructures/DeleteArchiveRequest.cpp
+++ b/common/dataStructures/DeleteArchiveRequest.cpp
@@ -35,7 +35,8 @@ DeleteArchiveRequest::DeleteArchiveRequest():
 //------------------------------------------------------------------------------
 bool DeleteArchiveRequest::operator==(const DeleteArchiveRequest &rhs) const {
   return requester==rhs.requester
-      && archiveFileID==rhs.archiveFileID && address==rhs.address;
+      && archiveFileID==rhs.archiveFileID && address==rhs.address && diskFileId == rhs.diskFileId
+      && diskFilePath == rhs.diskFilePath && recycleTime == rhs.recycleTime && diskInstance == rhs.diskInstance;
 }
 
 //------------------------------------------------------------------------------
@@ -51,6 +52,10 @@ bool DeleteArchiveRequest::operator!=(const DeleteArchiveRequest &rhs) const {
 std::ostream &operator<<(std::ostream &os, const DeleteArchiveRequest &obj) {
   os << "(requester=" << obj.requester
      << " archiveFileID=" << obj.archiveFileID 
+     << " diskFileId=" << obj.diskFileId
+     << " diskFilePath=" << obj.diskFilePath
+     << " recycleTime=" << obj.recycleTime
+     << " instanceName=" << obj.diskInstance
      << " address=" << (obj.address ? obj.address.value() : "null") <<")";
   return os;
 }
diff --git a/common/dataStructures/DeleteArchiveRequest.hpp b/common/dataStructures/DeleteArchiveRequest.hpp
index d7060d252e..ec7c75bab2 100644
--- a/common/dataStructures/DeleteArchiveRequest.hpp
+++ b/common/dataStructures/DeleteArchiveRequest.hpp
@@ -45,6 +45,10 @@ struct DeleteArchiveRequest {
   RequesterIdentity requester;
   uint64_t archiveFileID;
   cta::optional<std::string> address;
+  std::string diskFilePath;
+  std::string diskFileId;
+  std::string diskInstance;
+  time_t recycleTime;
 
 }; // struct DeleteArchiveRequest
 
diff --git a/common/dataStructures/DeletedArchiveFile.cpp b/common/dataStructures/DeletedArchiveFile.cpp
new file mode 100644
index 0000000000..c10aaa3167
--- /dev/null
+++ b/common/dataStructures/DeletedArchiveFile.cpp
@@ -0,0 +1,27 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "DeletedArchiveFile.hpp"
+
+namespace cta {
+namespace common {
+namespace dataStructures {
+
+  DeletedArchiveFile::DeletedArchiveFile():ArchiveFile(){}
+
+}}}
\ No newline at end of file
diff --git a/common/dataStructures/DeletedArchiveFile.hpp b/common/dataStructures/DeletedArchiveFile.hpp
new file mode 100644
index 0000000000..47270b25bc
--- /dev/null
+++ b/common/dataStructures/DeletedArchiveFile.hpp
@@ -0,0 +1,37 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2019  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 "ArchiveFile.hpp"
+
+
+namespace cta {
+namespace common {
+namespace dataStructures {
+
+struct DeletedArchiveFile: public ArchiveFile {
+  
+  DeletedArchiveFile();
+  
+  std::string diskFilePath;
+  std::string diskFileIdWhenDeleted;
+  time_t deletionTime;
+};
+
+}}}
\ No newline at end of file
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index 085986a314..d642652bcc 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -250,15 +250,17 @@ void Scheduler::deleteArchive(const std::string &instanceName, const common::dat
   // fully queued, or partially queued.
   // First, make sure the file is not queued anymore.
   utils::Timer t;
-
+  log::TimingList tl;
   if(request.address) {
     //Check if address is provided, we can remove the request from the objectstore
     m_db.cancelArchive(request,lc);
   }
-  m_catalogue.deleteArchiveFile(instanceName, request.archiveFileID, lc);
-  auto catalogueTime = t.secs(cta::utils::Timer::resetCounter);
+  tl.insertAndReset("schedulerDbTime",t);
+  //m_catalogue.deleteArchiveFile(instanceName, request.archiveFileID, lc);
+  m_catalogue.moveArchiveFileToRecycleBin(request,lc);
+  tl.insertAndReset("catalogueTime",t);
   log::ScopedParamContainer spc(lc);
-  spc.add("catalogueTime", catalogueTime);
+  tl.addToLog(spc);
   lc.log(log::INFO, "In Scheduler::deleteArchive(): success.");
 }
 
diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.cpp b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
index a78cbafda0..1e79a1f612 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.cpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
@@ -614,15 +614,20 @@ void RequestMessage::processDELETE(const cta::eos::Notification &notification, c
    // Validate received protobuf
    checkIsNotEmptyString(notification.cli().user().username(),    "notification.cli.user.username");
    checkIsNotEmptyString(notification.cli().user().groupname(),   "notification.cli.user.groupname");
+   checkIsNotEmptyString(notification.file().lpath(),             "notification.file.lpath");
 
    // Unpack message
    cta::common::dataStructures::DeleteArchiveRequest request;
    request.requester.name    = notification.cli().user().username();
    request.requester.group   = notification.cli().user().groupname();
    
+   std::string lpath         = notification.file().lpath();
+   uint64_t diskFileId       = notification.file().fid();
+   request.diskFilePath          = lpath;
+   request.diskFileId = std::to_string(diskFileId);
+   request.diskInstance = m_cliIdentity.username;
    // CTA Archive ID is an EOS extended attribute, i.e. it is stored as a string, which
    // must be converted to a valid uint64_t
-
    auto archiveFileIdItor = notification.file().xattr().find("sys.archive.file_id");
    if(notification.file().xattr().end() == archiveFileIdItor) {
      // Fall back to the old xattr format
@@ -640,7 +645,10 @@ void RequestMessage::processDELETE(const cta::eos::Notification &notification, c
    auto archiveRequestAddrItor = notification.file().xattr().find("sys.cta.archive.objectstore.id");
    if(archiveRequestAddrItor != notification.file().xattr().end()){
      //We have the ArchiveRequest's objectstore address.
-     request.address = archiveRequestAddrItor->second;
+     std::string objectstoreAddress = archiveRequestAddrItor->second;
+     if(!objectstoreAddress.empty()){
+      request.address = archiveRequestAddrItor->second;
+     }
    }
 
    // Delete the file from the catalogue or from the objectstore if archive request is created
@@ -651,6 +659,7 @@ void RequestMessage::processDELETE(const cta::eos::Notification &notification, c
    cta::log::ScopedParamContainer params(m_lc);
    params.add("fileId", request.archiveFileID)
          .add("address", (request.address ? request.address.value() : "null"))
+         .add("filePath",request.diskFilePath)
          .add("schedulerTime", t.secs());
    m_lc.log(cta::log::INFO, "In RequestMessage::processDELETE(): archive file deleted.");
 
@@ -1591,7 +1600,7 @@ void RequestMessage::processTape_Reclaim(cta::xrd::Response &response)
 
    auto &vid = getRequired(OptionString::VID);
 
-   m_catalogue.reclaimTape(m_cliIdentity, vid);
+   m_catalogue.reclaimTape(m_cliIdentity, vid,m_lc);
 
    response.set_type(cta::xrd::Response::RSP_SUCCESS);
 }
-- 
GitLab