diff --git a/mediachanger/messages.cpp b/mediachanger/messages.cpp
index 42db8a5ad1e9bb018d9b635ccfc0ad34d4a7c91e..e2fd5a7ffc31c4c87e0916afef8bd50559d0ee0c 100644
--- a/mediachanger/messages.cpp
+++ b/mediachanger/messages.cpp
@@ -132,6 +132,10 @@ std::string computeSHA1Base64(
   const google::protobuf::Message& msg) {
   std::string buffer;
   msg.SerializeToString(&buffer);
+  if (!msg.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In mediachanger::computeSHA1Base64(): could not serialize: ")+
+        msg.InitializationErrorString());
+  }
   return computeSHA1Base64(buffer.c_str(),buffer.size());
 }
 
diff --git a/objectstore/ArchiveRequest.cpp b/objectstore/ArchiveRequest.cpp
index 65d83cc72910b2891b9c977a8797e07f561087aa..e7ac5d16956f362a86e7991dc398b04e02c1b465 100644
--- a/objectstore/ArchiveRequest.cpp
+++ b/objectstore/ArchiveRequest.cpp
@@ -407,14 +407,24 @@ ArchiveRequest::AsyncJobOwnerUpdater* ArchiveRequest::asyncUpdateJobOwner(uint16
       [this, copyNumber, owner, previousOwner, &retRef](const std::string &in)->std::string {
         // We have a locked and fetched object, so we just need to work on its representation.
         serializers::ObjectHeader oh;
-        oh.ParseFromString(in);
+        if (!oh.ParseFromString(in)) {
+          // Use a the tolerant parser to assess the situation.
+          oh.ParsePartialFromString(in);
+          throw cta::exception::Exception(std::string("In ArchiveRequest::asyncUpdateJobOwner(): could not parse header: ")+
+            oh.InitializationErrorString());
+        }
         if (oh.type() != serializers::ObjectType::ArchiveRequest_t) {
           std::stringstream err;
           err << "In ArchiveRequest::asyncUpdateJobOwner()::lambda(): wrong object type: " << oh.type();
           throw cta::exception::Exception(err.str());
         }
         serializers::ArchiveRequest payload;
-        payload.ParseFromString(oh.payload());
+        if (!payload.ParseFromString(oh.payload())) {
+          // Use a the tolerant parser to assess the situation.
+          payload.ParsePartialFromString(oh.payload());
+          throw cta::exception::Exception(std::string("In ArchiveRequest::asyncUpdateJobOwner(): could not parse payload: ")+
+            payload.InitializationErrorString());
+        }
         // Find the copy number and change the owner.
         auto *jl=payload.mutable_jobs();
         for (auto j=jl->begin(); j!=jl->end(); j++) {
diff --git a/objectstore/GenericObject.cpp b/objectstore/GenericObject.cpp
index 00763ee794577b6cb2e534898bf27478df4c8598..2c2f5332d805535479d6f85d894c122f7bad4a71 100644
--- a/objectstore/GenericObject.cpp
+++ b/objectstore/GenericObject.cpp
@@ -37,7 +37,13 @@ void GenericObject::fetch() {
     throw NotLocked("In ObjectOps::fetch(): object not locked");
   m_existingObject = true;
   // Get the header from the object store. We don't care for the type
-  m_header.ParseFromString(m_objectStore.read(getAddressIfSet()));
+  auto objData=m_objectStore.read(getAddressIfSet());
+  if (!m_header.ParseFromString(objData)) {
+    // Use a the tolerant parser to assess the situation.
+    m_header.ParsePartialFromString(objData);
+    throw cta::exception::Exception(std::string("In GenericObject::fetch: could not parse header: ") + 
+      m_header.InitializationErrorString());
+  }
   m_headerInterpreted = true;
 }
 
diff --git a/objectstore/ObjectOps.hpp b/objectstore/ObjectOps.hpp
index bbb50d82ff55c84dde4cc2d7501dd7cfd7ca5c02..b43e4f9423115bd4d5a043cddde39f56b3a4f463 100644
--- a/objectstore/ObjectOps.hpp
+++ b/objectstore/ObjectOps.hpp
@@ -296,12 +296,23 @@ public:
 protected:
   
   void getPayloadFromHeader () {
-    m_payload.ParseFromString(m_header.payload());
+    if (!m_payload.ParseFromString(m_header.payload())) {
+      // Use a the tolerant parser to assess the situation.
+      m_header.ParsePartialFromString(m_header.payload());
+      throw cta::exception::Exception(std::string("In <ObjectOps") + typeid(PayloadType).name() + 
+              ">::getPayloadFromHeader(): could not parse payload: " + m_header.InitializationErrorString());
+    }
     m_payloadInterpreted = true;
   }
 
   void getHeaderFromObjectStore () {
-    m_header.ParseFromString(m_objectStore.read(getAddressIfSet()));
+    auto objData=m_objectStore.read(getAddressIfSet());
+    if (!m_header.ParseFromString(objData)) {
+      // Use a the tolerant parser to assess the situation.
+      m_header.ParsePartialFromString(objData);
+      throw cta::exception::Exception(std::string("In <ObjectOps") + typeid(PayloadType).name() + 
+              ">::getHeaderFromObjectStore(): could not parse header: " + m_header.InitializationErrorString());
+    }
     if (m_header.type() != payloadTypeId) {
       std::stringstream err;
       err << "In ObjectOps::getHeaderFromObjectStore wrong object type: "
diff --git a/tapeserver/castor/messages/messages.cpp b/tapeserver/castor/messages/messages.cpp
index f8dc1e3d40f579a4e33b8868c03b1d37ef3a8193..e15871702b1e4bc04a0d057b472991f747158bbb 100644
--- a/tapeserver/castor/messages/messages.cpp
+++ b/tapeserver/castor/messages/messages.cpp
@@ -49,7 +49,10 @@ std::string castor::messages::computeSHA1Base64(const std::string &data) {
 std::string castor::messages::computeSHA1Base64(
   const google::protobuf::Message& msg) {
   std::string buffer;
-  msg.SerializeToString(&buffer);
+  if (!msg.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In castor::messages::computeSHA1Base64(): could not serialize: ")+
+        msg.InitializationErrorString());
+  }
   return computeSHA1Base64(buffer.c_str(),buffer.size());
 }
 
diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
index fc19a2aa011b926ab80125735cd5d3b63a7f4422..a2d9799bdbdd7c99a582c62186122a6ddb4c2496 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
@@ -286,12 +286,14 @@ void RecallReportPacker::WorkerThread::run(){
   // Cross check that the queue is indeed empty.
   while (m_parent.m_fifo.size()) {
     // There is at least one extra report we missed.
+    // The drive status reports are not a problem though.
     cta::log::ScopedParamContainer spc(m_parent.m_lc);
     std::unique_ptr<Report> missedReport(m_parent.m_fifo.pop());
     spc.add("ReportType", typeid(*missedReport).name());
     if (missedReport->goingToEnd())
       spc.add("goingToEnd", "true");
-    m_parent.m_lc.log(cta::log::ERR, "Popping missed report (memory leak)");
+    if (typeid(*missedReport) != typeid(RecallReportPacker::ReportDriveStatus))
+      m_parent.m_lc.log(cta::log::ERR, "Popping missed report (memory leak)");
   }
   m_parent.m_lc.log(cta::log::DEBUG, "Finishing RecallReportPacker thread");
 }
diff --git a/tapeserver/daemon/DriveHandler.cpp b/tapeserver/daemon/DriveHandler.cpp
index 21c6891fb7fb162d20b5606e8d5bdaf8ec7d54f5..1aaff7138c3ad427d0e4a6a3a4b8742f19c59df9 100644
--- a/tapeserver/daemon/DriveHandler.cpp
+++ b/tapeserver/daemon/DriveHandler.cpp
@@ -274,7 +274,13 @@ SubprocessHandler::ProcessingStatus DriveHandler::processEvent() {
   // Read from the socket pair 
   try {
     serializers::WatchdogMessage message;
-    message.ParseFromString(m_socketPair->receive());
+    auto datagram=m_socketPair->receive();
+    if (!message.ParseFromString(datagram)) {
+      // Use a the tolerant parser to assess the situation.
+      message.ParsePartialFromString(datagram);
+      throw cta::exception::Exception(std::string("In SubprocessHandler::ProcessingStatus(): could not parse message: ")+
+        message.InitializationErrorString());
+    }
     // Logs are processed in all cases
     processLogs(message);
     // If we report bytes, process the report (this is a heartbeat)
diff --git a/tapeserver/daemon/DriveHandlerProxy.cpp b/tapeserver/daemon/DriveHandlerProxy.cpp
index c98906495f21d4ea1d29ddaa2a05aae4fd6147eb..b461ea58adc58f3df9e890276eb9469e5231136f 100644
--- a/tapeserver/daemon/DriveHandlerProxy.cpp
+++ b/tapeserver/daemon/DriveHandlerProxy.cpp
@@ -37,7 +37,10 @@ void DriveHandlerProxy::addLogParams(const std::string& unitName, const std::lis
     lp->set_value(p.getValue());
   }
   std::string buffer;
-  watchdogMessage.SerializeToString(&buffer);
+  if (!watchdogMessage.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In DriveHandlerProxy::addLogParams(): could not serialize: ")+
+        watchdogMessage.InitializationErrorString());
+  }
   m_socketPair.send(buffer);
 }
 
@@ -50,7 +53,10 @@ void DriveHandlerProxy::deleteLogParams(const std::string& unitName, const std::
     *lpn = pn;
   }
   std::string buffer;
-  watchdogMessage.SerializeToString(&buffer);
+  if (!watchdogMessage.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In DriveHandlerProxy::deleteLogParams(): could not serialize: ")+
+        watchdogMessage.InitializationErrorString());
+  }
   m_socketPair.send(buffer);
 }
 
@@ -66,7 +72,10 @@ void DriveHandlerProxy::reportHeartbeat(uint64_t totalTapeBytesMoved, uint64_t t
   watchdogMessage.set_totaltapebytesmoved(totalTapeBytesMoved);
   watchdogMessage.set_totaldiskbytesmoved(totalDiskBytesMoved);
   std::string buffer;
-  watchdogMessage.SerializeToString(&buffer);
+  if (!watchdogMessage.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In DriveHandlerProxy::reportHeartbeat(): could not serialize: ")+
+        watchdogMessage.InitializationErrorString());
+  }
   m_socketPair.send(buffer);
 }
 
@@ -80,7 +89,10 @@ void DriveHandlerProxy::reportState(const cta::tape::session::SessionState state
   watchdogMessage.set_sessiontype((uint32_t)type);
   watchdogMessage.set_vid(vid);
   std::string buffer;
-  watchdogMessage.SerializeToString(&buffer);
+  if (!watchdogMessage.SerializeToString(&buffer)) {
+    throw cta::exception::Exception(std::string("In DriveHandlerProxy::reportState(): could not serialize: ")+
+        watchdogMessage.InitializationErrorString());
+  }
   m_socketPair.send(buffer);
 }