diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp
index 03fc56be4657cf4d29addf014653ea2a3b036ecc..c8dc39a4d3e24337286052ef1a02e1a4b4b2fe5a 100644
--- a/catalogue/RdbmsCatalogue.cpp
+++ b/catalogue/RdbmsCatalogue.cpp
@@ -9286,11 +9286,11 @@ void RdbmsCatalogue::settingSqlTapeDriveValues(cta::rdbms::Stmt *stmt,
   setOptionalString(":NEXT_VO", tapeDrive.nextVo);
   setOptionalString(":USER_COMMENT", tapeDrive.userComment);
 
-  auto setEntryLog = [stmt](const std::string &field, const std::string &username,
+  auto setEntryLog = [stmt, setOptionalString, setOptionalUint64](const std::string &field, const std::string &username,
     const std::string &host, const time_t &time) {
-      stmt->bindString(field + "_USER_NAME", username);
-      stmt->bindString(field + "_HOST_NAME", host);
-      stmt->bindUint64(field + "_TIME", time);
+      setOptionalString(field + "_USER_NAME", username);
+      setOptionalString(field + "_HOST_NAME", host);
+      setOptionalUint64(field + "_TIME", time);
   };
 
   if (tapeDrive.creationLog) {
@@ -9621,7 +9621,11 @@ void RdbmsCatalogue::createDriveConfig(const std::string &tapeDriveName, const s
     stmt.bindString(":DRIVE_NAME", tapeDriveName);
     stmt.bindString(":CATEGORY", category);
     stmt.bindString(":KEY_NAME", keyName);
-    stmt.bindString(":VALUE", value);
+    if (value.empty()) {
+      stmt.bindString(":VALUE", std::string("NULL"));
+    } else {
+      stmt.bindString(":VALUE", value);
+    }
     stmt.bindString(":SOURCE", source);
 
     stmt.executeNonQuery();
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index ca4161ecd3bda47321eb3de35a1dbacd83fe4a7a..95d9c04db27fc2d65bcb08d09dfeab190ea0e1cb 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -3296,7 +3296,9 @@ void OStoreDB::updateDriveStatus(const common::dataStructures::DriveInfo& driveI
   }
   ds.commit();
   // DataBase NEW
-  auto tapeDriveStatus = m_catalogue.getTapeDrive(driveInfo.driveName).value();
+  auto tapeDriveToUpdate = m_catalogue.getTapeDrive(driveInfo.driveName);
+  if (!tapeDriveToUpdate) return;
+  auto tapeDriveStatus = tapeDriveToUpdate.value();
   tapeDriveStatus.driveName = driveInfo.driveName;
   tapeDriveStatus.host = driveInfo.host;
   tapeDriveStatus.logicalLibrary = driveInfo.logicalLibrary;
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index 891a1beaf5c47b28d18efc39d738e38dcbdb5049..44b2cbb9708bf714ea941ac1c6330238eb646be9 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -882,6 +882,11 @@ void Scheduler::createTapeDriveStatus(const common::dataStructures::DriveInfo& d
   const common::dataStructures::DriveStatus& status, const tape::daemon::TpconfigLine& tpConfigLine,
   const common::dataStructures::SecurityIdentity& identity, log::LogContext & lc) {
   const auto tapeDriveStatus = setTapeDriveStatus(driveInfo, desiredState, type, status, tpConfigLine, identity);
+  auto driveNames = m_catalogue.getTapeDriveNames();
+  auto it = std::find(driveNames.begin(), driveNames.end(), tapeDriveStatus.driveName);
+  if (it != driveNames.end()) {
+    m_catalogue.deleteTapeDrive(tapeDriveStatus.driveName);
+  }
   m_catalogue.createTapeDrive(tapeDriveStatus);
   log::ScopedParamContainer spc(lc);
   spc.add("drive", driveInfo.driveName);
diff --git a/tapeserver/daemon/DriveConfig.cpp b/tapeserver/daemon/DriveConfig.cpp
index 904bd1f4aeb7a1256c2c3294740074e319171869..0109c5837f64f705291e639cff0f4741c0fa0589 100644
--- a/tapeserver/daemon/DriveConfig.cpp
+++ b/tapeserver/daemon/DriveConfig.cpp
@@ -15,7 +15,9 @@
  *                 along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <algorithm>
 #include <string>
+#include <utility>
 
 #include "DriveConfig.hpp"
 #include "tapeserver/daemon/FetchReportOrFlushLimits.hpp"
@@ -29,75 +31,86 @@ void DriveConfig::setTapedConfiguration(const cta::tape::daemon::TapedConfigurat
   const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
   cta::tape::daemon::TapedConfiguration * config = const_cast<cta::tape::daemon::TapedConfiguration*>(&tapedConfiguration);
 
-  setConfigToDB(config->daemonUserName, catalogue, tapeDriveName);
-  setConfigToDB(config->daemonGroupName, catalogue, tapeDriveName);
-  setConfigToDB(config->logMask, catalogue, tapeDriveName);
-  setConfigToDB(config->tpConfigPath, catalogue, tapeDriveName);
-  setConfigToDB(config->bufferSizeBytes, catalogue, tapeDriveName);
-  setConfigToDB(config->bufferCount, catalogue, tapeDriveName);
-  setConfigToDB(config->archiveFetchBytesFiles, catalogue, tapeDriveName);
-  setConfigToDB(config->archiveFlushBytesFiles, catalogue, tapeDriveName);
-  setConfigToDB(config->retrieveFetchBytesFiles, catalogue, tapeDriveName);
-  setConfigToDB(config->mountCriteria, catalogue, tapeDriveName);
-  setConfigToDB(config->nbDiskThreads, catalogue, tapeDriveName);
-  setConfigToDB(config->useRAO, catalogue, tapeDriveName);
-  setConfigToDB(config->raoLtoAlgorithm, catalogue, tapeDriveName);
-  setConfigToDB(config->raoLtoOptions, catalogue, tapeDriveName);
-  setConfigToDB(config->wdScheduleMaxSecs, catalogue, tapeDriveName);
-  setConfigToDB(config->wdMountMaxSecs, catalogue, tapeDriveName);
-  setConfigToDB(config->wdNoBlockMoveMaxSecs, catalogue, tapeDriveName);
-  setConfigToDB(config->wdIdleSessionTimer, catalogue, tapeDriveName);
-  setConfigToDB(config->backendPath, catalogue, tapeDriveName);
-  setConfigToDB(config->fileCatalogConfigFile, catalogue, tapeDriveName);
-  setConfigToDB(config->authenticationProtocol, catalogue, tapeDriveName);
-  setConfigToDB(config->authenticationSSSKeytab, catalogue, tapeDriveName);
-  setConfigToDB(config->disableRepackManagement, catalogue, tapeDriveName);
-  setConfigToDB(config->disableMaintenanceProcess, catalogue, tapeDriveName);
-  setConfigToDB(config->fetchEosFreeSpaceScript, catalogue, tapeDriveName);
-  setConfigToDB(config->tapeLoadTimeout, catalogue, tapeDriveName);
+  setConfigToDB(&config->daemonUserName, catalogue, tapeDriveName);
+  setConfigToDB(&config->daemonGroupName, catalogue, tapeDriveName);
+  setConfigToDB(&config->logMask, catalogue, tapeDriveName);
+  setConfigToDB(&config->tpConfigPath, catalogue, tapeDriveName);
+  setConfigToDB(&config->bufferSizeBytes, catalogue, tapeDriveName);
+  setConfigToDB(&config->bufferCount, catalogue, tapeDriveName);
+  setConfigToDB(&config->archiveFetchBytesFiles, catalogue, tapeDriveName);
+  setConfigToDB(&config->archiveFlushBytesFiles, catalogue, tapeDriveName);
+  setConfigToDB(&config->retrieveFetchBytesFiles, catalogue, tapeDriveName);
+  setConfigToDB(&config->mountCriteria, catalogue, tapeDriveName);
+  setConfigToDB(&config->nbDiskThreads, catalogue, tapeDriveName);
+  setConfigToDB(&config->useRAO, catalogue, tapeDriveName);
+  setConfigToDB(&config->raoLtoAlgorithm, catalogue, tapeDriveName);
+  setConfigToDB(&config->raoLtoOptions, catalogue, tapeDriveName);
+  setConfigToDB(&config->wdScheduleMaxSecs, catalogue, tapeDriveName);
+  setConfigToDB(&config->wdMountMaxSecs, catalogue, tapeDriveName);
+  setConfigToDB(&config->wdNoBlockMoveMaxSecs, catalogue, tapeDriveName);
+  setConfigToDB(&config->wdIdleSessionTimer, catalogue, tapeDriveName);
+  setConfigToDB(&config->backendPath, catalogue, tapeDriveName);
+  setConfigToDB(&config->fileCatalogConfigFile, catalogue, tapeDriveName);
+  setConfigToDB(&config->authenticationProtocol, catalogue, tapeDriveName);
+  setConfigToDB(&config->authenticationSSSKeytab, catalogue, tapeDriveName);
+  setConfigToDB(&config->disableRepackManagement, catalogue, tapeDriveName);
+  setConfigToDB(&config->disableMaintenanceProcess, catalogue, tapeDriveName);
+  setConfigToDB(&config->fetchEosFreeSpaceScript, catalogue, tapeDriveName);
+  setConfigToDB(&config->tapeLoadTimeout, catalogue, tapeDriveName);
 }
 
-void DriveConfig::setConfigToDB(cta::SourcedParameter<std::string>& sourcedParameter,
-  const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
-  cta::SourcedParameter<std::string> * param = const_cast<cta::SourcedParameter<std::string>*>(&sourcedParameter);
-  catalogue->createDriveConfig(tapeDriveName, param->category(), param->key(),
-    param->value(), param->source());
+void DriveConfig::checkConfigInDB(const std::unique_ptr<catalogue::Catalogue>& catalogue,
+  const std::string& tapeDriveName, const std::string& key) {
+  auto namesAndKeys = catalogue->getDriveConfigNamesAndKeys();
+  auto it = std::find_if(namesAndKeys.begin(), namesAndKeys.end(),
+    [&tapeDriveName, &key](const std::pair<std::string, std::string>& element) {
+      return element.first == tapeDriveName && element.second == key;
+    });
+  if (it != namesAndKeys.end()) {
+    catalogue->deleteDriveConfig(tapeDriveName, key);
+  }
 }
 
-void DriveConfig::setConfigToDB(cta::SourcedParameter<cta::tape::daemon::FetchReportOrFlushLimits>& sourcedParameter,
+void DriveConfig::setConfigToDB(cta::SourcedParameter<std::string>* sourcedParameter,
   const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
-  cta::SourcedParameter<cta::tape::daemon::FetchReportOrFlushLimits> * param = const_cast<cta::SourcedParameter<
-    cta::tape::daemon::FetchReportOrFlushLimits>*>(&sourcedParameter);
+  checkConfigInDB(catalogue, tapeDriveName, sourcedParameter->key());
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), sourcedParameter->key(),
+    sourcedParameter->value(), sourcedParameter->source());
+}
 
-  std::string key = param->key();
-  cta::utils::searchAndReplace(key,"Bytes","");
-  cta::utils::searchAndReplace(key,"Files","");
-  catalogue->createDriveConfig(tapeDriveName, param->category(), key.append("Files"),
-    std::to_string(param->value().maxFiles), param->source());
-  cta::utils::searchAndReplace(key,"Files","");
-  catalogue->createDriveConfig(tapeDriveName, param->category(), key.append("Bytes"),
-    std::to_string(param->value().maxBytes), param->source());
+void DriveConfig::setConfigToDB(cta::SourcedParameter<cta::tape::daemon::FetchReportOrFlushLimits>* sourcedParameter,
+  const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
+  std::string key = sourcedParameter->key();
+  cta::utils::searchAndReplace(key, "Bytes", "");
+  cta::utils::searchAndReplace(key, "Files", "");
+  checkConfigInDB(catalogue, tapeDriveName, key.append("Files"));
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), key,
+    std::to_string(sourcedParameter->value().maxFiles), sourcedParameter->source());
+  cta::utils::searchAndReplace(key, "Files", "");
+  checkConfigInDB(catalogue, tapeDriveName, key.append("Bytes"));
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), key,
+    std::to_string(sourcedParameter->value().maxBytes), sourcedParameter->source());
 }
 
-void DriveConfig::setConfigToDB(cta::SourcedParameter<uint32_t>& sourcedParameter,
+void DriveConfig::setConfigToDB(cta::SourcedParameter<uint32_t>* sourcedParameter,
   const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
-  cta::SourcedParameter<uint32_t> * param = const_cast<cta::SourcedParameter<uint32_t>*>(&sourcedParameter);
-  catalogue->createDriveConfig(tapeDriveName, param->category(), param->key(),
-    std::to_string(param->value()), param->source());
+  checkConfigInDB(catalogue, tapeDriveName, sourcedParameter->key());
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), sourcedParameter->key(),
+    std::to_string(sourcedParameter->value()), sourcedParameter->source());
 }
 
-void DriveConfig::setConfigToDB(cta::SourcedParameter<uint64_t>& sourcedParameter,
+void DriveConfig::setConfigToDB(cta::SourcedParameter<uint64_t>* sourcedParameter,
   const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
-  cta::SourcedParameter<uint64_t> * param = const_cast<cta::SourcedParameter<uint64_t>*>(&sourcedParameter);
-  catalogue->createDriveConfig(tapeDriveName, param->category(), param->key(),
-    std::to_string(param->value()), param->source());
+  checkConfigInDB(catalogue, tapeDriveName, sourcedParameter->key());
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), sourcedParameter->key(),
+    std::to_string(sourcedParameter->value()), sourcedParameter->source());
 }
 
-void DriveConfig::setConfigToDB(cta::SourcedParameter<time_t>& sourcedParameter,
+void DriveConfig::setConfigToDB(cta::SourcedParameter<time_t>* sourcedParameter,
   const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName) {
-  cta::SourcedParameter<time_t> * param = const_cast<cta::SourcedParameter<time_t>*>(&sourcedParameter);
-  catalogue->createDriveConfig(tapeDriveName, param->category(), param->key(),
-    std::to_string(param->value()), param->source());
+  checkConfigInDB(catalogue, tapeDriveName, sourcedParameter->key());
+  catalogue->createDriveConfig(tapeDriveName, sourcedParameter->category(), sourcedParameter->key(),
+    std::to_string(sourcedParameter->value()), sourcedParameter->source());
 }
 
 }  // namespace daemon
diff --git a/tapeserver/daemon/DriveConfig.hpp b/tapeserver/daemon/DriveConfig.hpp
index 982ad151c0542c6443c44830072accb5122eddb4..5e4cc4157942b5d8dd22d84c1e3aaf8f67e0d364 100644
--- a/tapeserver/daemon/DriveConfig.hpp
+++ b/tapeserver/daemon/DriveConfig.hpp
@@ -37,15 +37,17 @@ class DriveConfig {
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
 
  private:
-  static void setConfigToDB(cta::SourcedParameter<std::string>& sourcedParameter,
+  static void checkConfigInDB(const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName,
+    const std::string& key);
+  static void setConfigToDB(cta::SourcedParameter<std::string>* sourcedParameter,
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
-  static void setConfigToDB(cta::SourcedParameter<cta::tape::daemon::FetchReportOrFlushLimits>& sourcedParameter,
+  static void setConfigToDB(cta::SourcedParameter<cta::tape::daemon::FetchReportOrFlushLimits>* sourcedParameter,
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
-  static void setConfigToDB(cta::SourcedParameter<std::uint32_t>& sourcedParameter,
+  static void setConfigToDB(cta::SourcedParameter<std::uint32_t>* sourcedParameter,
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
-  static void setConfigToDB(cta::SourcedParameter<std::uint64_t>& sourcedParameter,
+  static void setConfigToDB(cta::SourcedParameter<std::uint64_t>* sourcedParameter,
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
-  static void setConfigToDB(cta::SourcedParameter<std::time_t>& sourcedParameter,
+  static void setConfigToDB(cta::SourcedParameter<std::time_t>* sourcedParameter,
     const std::unique_ptr<catalogue::Catalogue>& catalogue, const std::string& tapeDriveName);
 };  // class DriveConfig
 
diff --git a/tapeserver/daemon/TapeDaemon.cpp b/tapeserver/daemon/TapeDaemon.cpp
index 4b31c39fb07c79ce9199c20ab595fa67d6676dc8..bc4dbd0b7a8e6c5a0c087e231d00cbf672544b04 100644
--- a/tapeserver/daemon/TapeDaemon.cpp
+++ b/tapeserver/daemon/TapeDaemon.cpp
@@ -29,13 +29,13 @@
 
 namespace cta { namespace tape { namespace daemon {
 
-TapeDaemon::TapeDaemon(const cta::daemon::CommandLineParams & commandLine, 
-    log::Logger& log, 
-    const TapedConfiguration& globalConfig, 
-    cta::server::ProcessCap& capUtils): 
+TapeDaemon::TapeDaemon(const cta::daemon::CommandLineParams & commandLine,
+    log::Logger& log,
+    const TapedConfiguration& globalConfig,
+    cta::server::ProcessCap& capUtils):
     cta::server::Daemon(log),
     m_globalConfiguration(globalConfig), m_capUtils(capUtils),
-    m_programName("cta-taped"), m_hostName(getHostName()) { 
+    m_programName("cta-taped"), m_hostName(getHostName()) {
   setCommandLineHasBeenParsed(commandLine.foreground);
 }
 
@@ -89,7 +89,7 @@ void  cta::tape::daemon::TapeDaemon::exceptionThrowingMain()  {
   // however the process should still be permitted to perform raw IO in the
   // future
   setProcessCapabilities("cap_sys_rawio+p");
-  
+
   // Set the name of the (unique) thread for easy process identification.
   prctl(PR_SET_NAME, "cta-tpd-master");
   mainEventLoop();
@@ -150,7 +150,7 @@ void cta::tape::daemon::TapeDaemon::setProcessCapabilities(
   const std::string &text) {
   try {
     m_capUtils.setProcText(text);
-    m_log(log::INFO, "Set process capabilities", 
+    m_log(log::INFO, "Set process capabilities",
       {{"capabilities", m_capUtils.getProcText()}});
   } catch(cta::exception::Exception &ne) {
     cta::exception::Exception ex;