diff --git a/objectstore/Agent.cpp b/objectstore/Agent.cpp
index 062ad8d90264b74c22c3209b5f458aca9fb4cdbb..97db75e4b64f18d20d73e416c94bc9aa6e99ab59 100644
--- a/objectstore/Agent.cpp
+++ b/objectstore/Agent.cpp
@@ -29,7 +29,7 @@
 #include <ctime>
 #include <cxxabi.h>
 #include <unistd.h>
-#include <json/json.h>
+#include <json-c/json.h>
 
 cta::objectstore::Agent::Agent(Backend & os): 
   ObjectOps<serializers::Agent>(os), m_nextId(0) {}
diff --git a/objectstore/AgentRegister.cpp b/objectstore/AgentRegister.cpp
index 32cccde3d1cebb410605722ccf0b6aff4b1c405f..13d22ce59f4cbe7db5021dca900eb6bce2da43c0 100644
--- a/objectstore/AgentRegister.cpp
+++ b/objectstore/AgentRegister.cpp
@@ -19,7 +19,7 @@
 #include "AgentRegister.hpp"
 #include "ProtocolBuffersAlgorithms.hpp"
 #include "GenericObject.hpp"
-#include <json/json_object.h>
+#include <json-c/json_object.h>
 
 cta::objectstore::AgentRegister::AgentRegister(Backend & os):
 ObjectOps<serializers::AgentRegister>(os) {}
@@ -130,4 +130,4 @@ std::string cta::objectstore::AgentRegister::dump() {
   ret << json_object_to_json_string_ext(jo, JSON_C_TO_STRING_PRETTY) << std::endl;
   json_object_put(jo);
   return ret.str();
-}
\ No newline at end of file
+}
diff --git a/objectstore/ArchiveToFileRequest.cpp b/objectstore/ArchiveToFileRequest.cpp
index e00cc87b8662b8814a4f456c6a24c39bca1a2218..994c8e9181d0f7f58e21e5853e1039e39e6e4865 100644
--- a/objectstore/ArchiveToFileRequest.cpp
+++ b/objectstore/ArchiveToFileRequest.cpp
@@ -21,7 +21,7 @@
 #include "CreationLog.hpp"
 #include "TapePool.hpp"
 #include "UserIdentity.hpp"
-#include <json/json.h>
+#include <json-c/json.h>
 
 cta::objectstore::ArchiveToFileRequest::ArchiveToFileRequest(
   const std::string& address, Backend& os): 
diff --git a/objectstore/CMakeLists.txt b/objectstore/CMakeLists.txt
index 6818b9ae8f41fa5e41768478f1c657ac382b45c6..641b6cf52723171267aba2d9ae67075d454a85ef 100644
--- a/objectstore/CMakeLists.txt
+++ b/objectstore/CMakeLists.txt
@@ -50,7 +50,7 @@ add_library (ctaobjectstore SHARED
   GenericObject.cpp
   GarbageCollector.cpp
   SchedulerGlobalLock.cpp)
-target_link_libraries(ctaobjectstore Utils rados json ctautils)
+target_link_libraries(ctaobjectstore Utils rados json-c ctautils)
 set_source_files_properties(BackendRados.cpp PROPERTIES COMPILE_FLAGS -Wno-deprecated-declarations)
 install (TARGETS ctaobjectstore DESTINATION usr/${CMAKE_INSTALL_LIBDIR})
 
diff --git a/objectstore/DriveRegister.cpp b/objectstore/DriveRegister.cpp
index 081885c2396535a6ac46a607225b90a96e6cc396..7f7dc7441602dff2aa6a8497dbd177efbeee3fe8 100644
--- a/objectstore/DriveRegister.cpp
+++ b/objectstore/DriveRegister.cpp
@@ -22,7 +22,7 @@
 #include "RootEntry.hpp"
 #include "common/DriveState.hpp"
 #include <set>
-#include <json/json.h>
+#include <json-c/json.h>
 #include <iostream>
 
 cta::objectstore::DriveRegister::DriveRegister(const std::string & address, Backend & os):
diff --git a/objectstore/RetrieveToFileRequest.cpp b/objectstore/RetrieveToFileRequest.cpp
index 38ef4f2a92a98462dab7e21c7495032dd828e17c..8290dc952ed4c332bd436c6985cde0822deec6c7 100644
--- a/objectstore/RetrieveToFileRequest.cpp
+++ b/objectstore/RetrieveToFileRequest.cpp
@@ -20,7 +20,7 @@
 #include "GenericObject.hpp"
 #include "CreationLog.hpp"
 #include "objectstore/cta.pb.h"
-#include <json/json.h>
+#include <json-c/json.h>
 
 cta::objectstore::RetrieveToFileRequest::RetrieveToFileRequest(
   const std::string& address, Backend& os): 
diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp
index 4a4700609584909eb8e141928ff2b6d35832597c..85666aafa4ea1ce7f0fba019deb62119c6a11733 100644
--- a/objectstore/RootEntry.cpp
+++ b/objectstore/RootEntry.cpp
@@ -25,7 +25,7 @@
 #include "SchedulerGlobalLock.hpp"
 #include <cxxabi.h>
 #include "ProtocolBuffersAlgorithms.hpp"
-#include <json/json.h>
+#include <json-c/json.h>
 
 // construtor, when the backend store exists.
 // Checks the existence and correctness of the root entry
diff --git a/objectstore/SchedulerGlobalLock.cpp b/objectstore/SchedulerGlobalLock.cpp
index a5393314ad435bfdd325881d14ec4bac050ef11d..ea1b501adea99b8e9f12347a69e532a1c87e5786 100644
--- a/objectstore/SchedulerGlobalLock.cpp
+++ b/objectstore/SchedulerGlobalLock.cpp
@@ -19,7 +19,7 @@
 #include "SchedulerGlobalLock.hpp"
 #include "GenericObject.hpp"
 #include "RootEntry.hpp"
-#include <json/json.h>
+#include <json-c/json.h>
 
 namespace cta { namespace objectstore { 
 
@@ -103,4 +103,4 @@ std::string SchedulerGlobalLock::dump() {
   return ret.str();
 }
   
-}}
\ No newline at end of file
+}}
diff --git a/objectstore/Tape.cpp b/objectstore/Tape.cpp
index f61e286166ef339c5a845059c0eba3bc3fc4c6dc..f62ee74fa04784deddc073abe31c634622e55193 100644
--- a/objectstore/Tape.cpp
+++ b/objectstore/Tape.cpp
@@ -19,7 +19,7 @@
 #include "Tape.hpp"
 #include "GenericObject.hpp"
 #include "CreationLog.hpp"
-#include <json/json.h>
+#include <json-c/json.h>
 
 cta::objectstore::Tape::Tape(const std::string& address, Backend& os):
   ObjectOps<serializers::Tape>(os, address) { }
diff --git a/objectstore/TapePool.cpp b/objectstore/TapePool.cpp
index 6fd1e61a4a2c598fb2cd8e928138de89d88e3256..e8529ca32f63510ad4de4eacbbcec48cd2c3887a 100644
--- a/objectstore/TapePool.cpp
+++ b/objectstore/TapePool.cpp
@@ -22,7 +22,7 @@
 #include "CreationLog.hpp"
 #include "Tape.hpp"
 #include "RootEntry.hpp"
-#include <json/json.h>
+#include <json-c/json.h>
 
 cta::objectstore::TapePool::TapePool(const std::string& address, Backend& os):
   ObjectOps<serializers::TapePool>(os, address) { }
diff --git a/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp b/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
index 371c9463b0270aebdb41864e57c1500d8f9efdd1..7921a113f2277e714ed8695287d0c47822131a71 100644
--- a/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
+++ b/tapeserver/castor/legacymsg/RmcProxyTcpIp.hpp
@@ -265,7 +265,7 @@ protected:
           ex.getMessage() <<
             "Reply from rmcd contains too many ERR_MSG messages"
             ": maxERR_MSG=" << maxERR_MSG << " rmcErrorStream=" <<
-            rmcErrorStream;
+            rmcErrorStream.str();
           throw ex;
         }
 
diff --git a/tapeserver/castor/mediachanger/LibrarySlotParser.cpp b/tapeserver/castor/mediachanger/LibrarySlotParser.cpp
index 0a3970b3e2b7c23ad53068c9d9340961ac7fde78..a17e87f0c0a209fca0d6037fc7123a8b01d1d178 100644
--- a/tapeserver/castor/mediachanger/LibrarySlotParser.cpp
+++ b/tapeserver/castor/mediachanger/LibrarySlotParser.cpp
@@ -45,7 +45,7 @@ castor::mediachanger::LibrarySlot *castor::mediachanger::LibrarySlotParser::
   } catch(castor::exception::Exception &ne) {
     castor::exception::Exception ex;
     ex.getMessage() << "Failed to parse library slot from string"
-      " representation: " << ne.getMessage();
+      " representation: " << ne.getMessage().str();
     throw ex;
   }
 }
diff --git a/tapeserver/castor/tape/reactor/ZMQReactor.cpp b/tapeserver/castor/tape/reactor/ZMQReactor.cpp
index 6a933a8e05a56708f71ad81771fe5c97d242f1de..831fd70dbd438c47056176e323d2787b3bfa6519 100644
--- a/tapeserver/castor/tape/reactor/ZMQReactor.cpp
+++ b/tapeserver/castor/tape/reactor/ZMQReactor.cpp
@@ -70,7 +70,7 @@ void castor::tape::reactor::ZMQReactor::registerHandler(
   std::ostringstream socketInHex;
   socketInHex << std::hex << item.socket;
   log::Param params[] = {log::Param("fd", item.fd),
-    log::Param("socket", socketInHex)};
+    log::Param("socket", socketInHex.str())};
   m_log(LOG_DEBUG, "ZMQReactor registering a new handler", params);
 
   checkDoubleRegistration(item);
diff --git a/tapeserver/castor/tape/tapeserver/SCSI/Exception.hpp b/tapeserver/castor/tape/tapeserver/SCSI/Exception.hpp
index c346b69f0477b29df30f88fa364331307cc87bff..7d70794dbd83ecf258f1385f7f05f7e8f2b5fb84 100644
--- a/tapeserver/castor/tape/tapeserver/SCSI/Exception.hpp
+++ b/tapeserver/castor/tape/tapeserver/SCSI/Exception.hpp
@@ -48,13 +48,13 @@ namespace SCSI {
           w << ": " << sense->getSenseKeyString();
         } catch (Exception &ex) {
           w << ": In addition, failed to get Sense Key string: "
-                  << ex.getMessage();
+                  << ex.getMessage().str();
         }
         try {
           w << ": " << sense->getACSString();
         } catch (Exception &ex) {
           w << ": In addition, failed to get ACS string: "
-                  << ex.getMessage();
+                  << ex.getMessage().str();
         }
       }
       setWhat(w.str());
diff --git a/tapeserver/castor/tape/tapeserver/daemon/Catalogue.cpp b/tapeserver/castor/tape/tapeserver/daemon/Catalogue.cpp
index 54a1ffdb1565e84fd1c02f99c2e9ff9d2da9b61f..68471ca20607322fc3e7b5634857882a65aeb08c 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/Catalogue.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/Catalogue.cpp
@@ -215,7 +215,7 @@ const castor::tape::tapeserver::daemon::CatalogueDrive
   if(NULL == itor->second) {
     // Should never get here
     castor::exception::Exception ex;
-    ex.getMessage() << "Failed to " << task <<
+    ex.getMessage() << "Failed to " << task.str() <<
       ": Pointer to drive entry is unexpectedly NULL";
     throw ex;
   }
@@ -227,7 +227,7 @@ const castor::tape::tapeserver::daemon::CatalogueDrive
   if(unitName != driveConfig.getUnitName()) {
     // Should never get here
     castor::exception::Exception ex;
-    ex.getMessage() << "Failed to " << task <<
+    ex.getMessage() << "Failed to " << task.str() <<
       ": Found inconsistent entry in tape-drive catalogue"
       ": Unit name mismatch: actual=" << driveConfig.getUnitName();
     throw ex;
@@ -255,7 +255,7 @@ castor::tape::tapeserver::daemon::CatalogueDrive
   if(NULL == itor->second) {
     // Should never get here
     castor::exception::Exception ex;
-    ex.getMessage() << "Failed to " << task <<
+    ex.getMessage() << "Failed to " << task.str() <<
       ": Pointer to drive entry is unexpectedly NULL";
     throw ex;
   }
@@ -267,7 +267,7 @@ castor::tape::tapeserver::daemon::CatalogueDrive
   if(unitName != driveConfig.getUnitName()) {
     // This should never happen
     castor::exception::Exception ex;
-    ex.getMessage() << "Failed to " << task <<
+    ex.getMessage() << "Failed to " << task.str() <<
       ": Found inconsistent entry in tape-drive catalogue"
       ": Unit name mismatch: expected=" << unitName <<
       " actual=" << driveConfig.getUnitName();
diff --git a/tapeserver/castor/tape/tapeserver/daemon/CatalogueTransferSession.cpp b/tapeserver/castor/tape/tapeserver/daemon/CatalogueTransferSession.cpp
index 85bbef640b42f5e99d61e8e67ecdf3dc03b760d9..06fdb577f496818a63dc18d999cfb560bcdc60f1 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/CatalogueTransferSession.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/CatalogueTransferSession.cpp
@@ -121,7 +121,7 @@ bool castor::tape::tapeserver::daemon::CatalogueTransferSession::
       idempotentKill(m_pid, SIGKILL);
       m_state = WAIT_TIMEOUT_KILL;
     } catch(castor::exception::Exception &ex) {
-      params.push_back(log::Param("message", ex.getMessage()));
+      params.push_back(log::Param("message", ex.getMessage().str()));
       m_log(LOG_ERR, "Failed to kill data-transfer session", params);
     }
   }
@@ -173,7 +173,7 @@ bool castor::tape::tapeserver::daemon::CatalogueTransferSession::
       idempotentKill(m_pid, SIGKILL);
       m_state = WAIT_TIMEOUT_KILL;
     } catch(castor::exception::Exception &ex) {
-      params.push_back(log::Param("message", ex.getMessage()));
+      params.push_back(log::Param("message", ex.getMessage().str()));
       m_log(LOG_ERR, "Failed to kill data-transfer session", params);
     }
   }
@@ -206,7 +206,7 @@ bool castor::tape::tapeserver::daemon::CatalogueTransferSession::
       idempotentKill(m_pid, SIGKILL);
       m_state = WAIT_TIMEOUT_KILL;
     } catch(castor::exception::Exception &ex) {
-      params.push_back(log::Param("message", ex.getMessage()));
+      params.push_back(log::Param("message", ex.getMessage().str()));
       m_log(LOG_ERR, "Failed to kill data-transfer session", params);
     }
   }