diff --git a/common/cpp/include/asapo/common/networking.h b/common/cpp/include/asapo/common/networking.h
index d814a88df4db17d0f9181f46ae5cb0ec6f133da3..4e85cd93f761b3e3279840ca00dbc651c852931e 100644
--- a/common/cpp/include/asapo/common/networking.h
+++ b/common/cpp/include/asapo/common/networking.h
@@ -93,18 +93,20 @@ struct GenericRequestHeader {
       op_code = header.op_code, data_id = header.data_id, data_size = header.data_size, meta_size = header.meta_size,
           memcpy(custom_data, header.custom_data, kNCustomParams * sizeof(uint64_t)),
           memcpy(message, header.message, kMaxMessageSize);
-      strncpy(stream, header.stream, kMaxMessageSize);
-      strncpy(api_version, header.api_version, kMaxVersionSize);
+      memcpy(stream, header.stream, sizeof(stream));
+      memcpy(api_version, header.api_version, sizeof(api_version));
       return *this;
   };
   /* Keep in mind that the message here is just strncpy'ed, you can change the message later */
   GenericRequestHeader(Opcode i_op_code = kOpcodeUnknownOp, uint64_t i_data_id = 0,
                        uint64_t i_data_size = 0, uint64_t i_meta_size = 0, const std::string &i_message = "",
                        const std::string &i_stream = "") :
-      op_code{i_op_code}, data_id{i_data_id}, data_size{i_data_size}, meta_size{i_meta_size} {
-      strncpy(message, i_message.c_str(), kMaxMessageSize);
-      strncpy(stream, i_stream.c_str(), kMaxMessageSize);
-      strncpy(api_version, "v0.0", kMaxVersionSize);
+      op_code{i_op_code}, data_id{i_data_id}, data_size{i_data_size}, meta_size{i_meta_size}, custom_data{kDefaultIngestMode, 0, 0} {
+      strncpy(message, i_message.c_str(), kMaxMessageSize - 1);
+      message[kMaxMessageSize - 1] = '\0';
+      strncpy(stream, i_stream.c_str(), kMaxMessageSize - 1);
+      stream[kMaxMessageSize - 1] = '\0';
+      strcpy(api_version, "v0.0");
   }
 
   Opcode op_code;
diff --git a/consumer/api/cpp/src/fabric_consumer_client.cpp b/consumer/api/cpp/src/fabric_consumer_client.cpp
index 58e2776cb6d6d05722252e6742dfa6c4b067f7d3..eddd8579cdf551271e2cffa9d00dc3895981ed85 100644
--- a/consumer/api/cpp/src/fabric_consumer_client.cpp
+++ b/consumer/api/cpp/src/fabric_consumer_client.cpp
@@ -34,7 +34,8 @@ Error FabricConsumerClient::GetData(const MessageMeta* info, MessageData* data)
     }
 
     GenericRequestHeader request_header{kOpcodeGetBufferData, info->buf_id, info->size};
-    strncpy(request_header.api_version, kConsumerProtocol.GetRdsVersion().c_str(), kMaxVersionSize);
+    strncpy(request_header.api_version, kConsumerProtocol.GetRdsVersion().c_str(), kMaxVersionSize - 1);
+    request_header.api_version[kMaxVersionSize - 1] = '\0';
     memcpy(request_header.message, mr->GetDetails(), sizeof(fabric::MemoryRegionDetails));
     GenericNetworkResponse response{};
 
diff --git a/consumer/api/cpp/src/tcp_consumer_client.cpp b/consumer/api/cpp/src/tcp_consumer_client.cpp
index 2f5ea5396e01772d61c097d869d31228659a57ef..6847f92589da26fa2123d6a3290cc24b976b8f7d 100644
--- a/consumer/api/cpp/src/tcp_consumer_client.cpp
+++ b/consumer/api/cpp/src/tcp_consumer_client.cpp
@@ -14,7 +14,8 @@ TcpConsumerClient::TcpConsumerClient() : io__{GenerateDefaultIO()}, connection_p
 Error TcpConsumerClient::SendGetDataRequest(SocketDescriptor sd, const MessageMeta* info) const noexcept {
     Error err;
     GenericRequestHeader request_header{kOpcodeGetBufferData, info->buf_id, info->size};
-    strncpy(request_header.api_version, kConsumerProtocol.GetRdsVersion().c_str(), kMaxVersionSize);
+    strncpy(request_header.api_version, kConsumerProtocol.GetRdsVersion().c_str(), kMaxVersionSize - 1);
+    request_header.api_version[kMaxVersionSize - 1] = '\0';
     io__->Send(sd, &request_header, sizeof(request_header), &err);
     if (err) {
         connection_pool__->ReleaseConnection(sd);
diff --git a/deploy/build_env/services-linux/Dockerfile b/deploy/build_env/services-linux/Dockerfile
index 4408f0b8478ff8c9e36416daa0eb5d828ec9d3c6..28a824f57814e0fd8112de006547613a1cc55752 100644
--- a/deploy/build_env/services-linux/Dockerfile
+++ b/deploy/build_env/services-linux/Dockerfile
@@ -29,6 +29,8 @@ RUN set -eux; \
 		iproute2 \
 		nginx-light \
 		mongodb-org-server \
+		graphviz \
+		doxygen \
 	; \
 	apt-get install -y --no-install-recommends cmake/bullseye-backports; \
 	DEBIAN_FRONTEND=noninteractive apt-get install -y slapd; \
diff --git a/producer/api/cpp/src/producer_impl.cpp b/producer/api/cpp/src/producer_impl.cpp
index a0b68f07018a2281f5df907387107f5164b3e3f2..2b461a31a233dd120965b8e220ebf92b3951c459 100644
--- a/producer/api/cpp/src/producer_impl.cpp
+++ b/producer/api/cpp/src/producer_impl.cpp
@@ -491,7 +491,7 @@ Error ProducerImpl::GetServerVersionInfo(std::string* server_info,
 }
 
 Error ProducerImpl::DeleteStream(std::string stream, uint64_t timeout_ms, DeleteStreamOptions options) const {
-    auto header = GenericRequestHeader{kOpcodeDeleteStream, 0, 0, 0, "", stream};
+    GenericRequestHeader header{kOpcodeDeleteStream, 0, 0, 0, "", stream};
     header.custom_data[0] = options.Encode();
 
     Error err;
@@ -542,7 +542,7 @@ std::string ProducerImpl::GetBeamtimeMeta(uint64_t timeout_ms, Error* err) const
 }
 
 std::string ProducerImpl::GetMeta(const std::string& stream, uint64_t timeout_ms, Error* err) const {
-    auto header =  GenericRequestHeader{kOpcodeGetMeta, 0, 0, 0, "", stream};
+    GenericRequestHeader header{kOpcodeGetMeta, 0, 0, 0, "", stream};
     auto response = BlockingRequest(std::move(header), timeout_ms, err);
     if (*err) {
         return "";
diff --git a/receiver/src/request_handler/requests_dispatcher.cpp b/receiver/src/request_handler/requests_dispatcher.cpp
index e416ede4b3c670a41674f27e0eaa137a0e93395c..bd06ba328faca1a9b2a6eab7f4fa0bd0da6d3dcc 100644
--- a/receiver/src/request_handler/requests_dispatcher.cpp
+++ b/receiver/src/request_handler/requests_dispatcher.cpp
@@ -41,13 +41,15 @@ GenericNetworkResponse RequestsDispatcher::CreateResponseToRequest(const std::un
     generic_response.error_code = GetNetworkCodeFromError(handle_error);
     strcpy(generic_response.message, "");
     if (handle_error) {
-        strncpy(generic_response.message, handle_error->Explain().c_str(), kMaxMessageSize);
+        strncpy(generic_response.message, handle_error->Explain().c_str(), kMaxMessageSize - 1);
+        generic_response.message[kMaxMessageSize - 1] = '\0';
     }
     if (request->GetResponseMessage().size() > 0) {
         if (request->GetResponseMessageType() == ResponseMessageType::kWarning) {
             generic_response.error_code = kNetErrorWarning;
         }
-        strncpy(generic_response.message, request->GetResponseMessage().c_str(), kMaxMessageSize);
+        strncpy(generic_response.message, request->GetResponseMessage().c_str(), kMaxMessageSize - 1);
+        generic_response.message[kMaxMessageSize - 1] = '\0';
     }
     return generic_response;
 }