diff --git a/controller/Controller.h b/controller/Controller.h
index 6b93173..a029109 100644
--- a/controller/Controller.h
+++ b/controller/Controller.h
@@ -22,6 +22,7 @@
 #include "core/ConfigurationFactory.h"
 #include "io/ClientSocket.h"
 #include "c2/ControllerSocketProtocol.h"
+#include "utils/gsl.h"
 
 /**
  * Sends a single argument comment
@@ -35,7 +36,7 @@
   minifi::io::BufferStream stream;
   stream.write(&op, 1);
   stream.write(value);
-  return socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) == stream.size();
+  return socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) == stream.size();
 }
 
 /**
@@ -76,7 +77,7 @@
   stream.write(&op, 1);
   stream.write("flow");
   stream.write(file);
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   // read the response
@@ -106,7 +107,7 @@
   minifi::io::BufferStream stream;
   stream.write(&op, 1);
   stream.write("getfull");
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   // read the response
@@ -132,7 +133,7 @@
   minifi::io::BufferStream stream;
   stream.write(&op, 1);
   stream.write("jstack");
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   // read the response
@@ -172,7 +173,7 @@
   stream.write(&op, 1);
   stream.write("queue");
   stream.write(connection);
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   // read the response
@@ -192,7 +193,7 @@
   uint8_t op = minifi::c2::Operation::DESCRIBE;
   stream.write(&op, 1);
   stream.write("components");
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   uint16_t responses = 0;
@@ -216,7 +217,7 @@
   uint8_t op = minifi::c2::Operation::DESCRIBE;
   stream.write(&op, 1);
   stream.write("connections");
-  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), stream.size()) < 0) {
+  if (socket->write(const_cast<uint8_t*>(stream.getBuffer()), gsl::narrow<int>(stream.size())) < 0) {
     return -1;
   }
   uint16_t responses = 0;
diff --git a/extensions/civetweb/processors/ListenHTTP.cpp b/extensions/civetweb/processors/ListenHTTP.cpp
index 86dc62d..7a2b072 100644
--- a/extensions/civetweb/processors/ListenHTTP.cpp
+++ b/extensions/civetweb/processors/ListenHTTP.cpp
@@ -20,6 +20,8 @@
  */
 #include "ListenHTTP.h"
 
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -504,7 +506,7 @@
 }
 
 int64_t ListenHTTP::WriteCallback::process(const std::shared_ptr<io::BaseStream>& stream) {
-  return stream->write(const_cast<uint8_t*>(request_content_->getBuffer()), request_content_->size());
+  return stream->write(const_cast<uint8_t*>(request_content_->getBuffer()), gsl::narrow<int>(request_content_->size()));
 }
 
 bool ListenHTTP::isSecure() const {
diff --git a/extensions/http-curl/client/HTTPClient.cpp b/extensions/http-curl/client/HTTPClient.cpp
index 2c4384b..f628b4f 100644
--- a/extensions/http-curl/client/HTTPClient.cpp
+++ b/extensions/http-curl/client/HTTPClient.cpp
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 #include "HTTPClient.h"
-#include "Exception.h"
+
 #include <memory>
 #include <climits>
 #include <cinttypes>
@@ -24,6 +24,9 @@
 #include <vector>
 #include <string>
 #include <algorithm>
+
+#include "Exception.h"
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 #include "utils/RegexUtils.h"
 
@@ -213,7 +216,7 @@
 }
 
 std::string HTTPClient::escape(std::string string_to_escape) {
-  return curl_easy_escape(http_session_, string_to_escape.c_str(), string_to_escape.length());
+  return curl_easy_escape(http_session_, string_to_escape.c_str(), gsl::narrow<int>(string_to_escape.length()));
 }
 
 void HTTPClient::setPostFields(const std::string& input) {
diff --git a/extensions/http-curl/client/HTTPStream.cpp b/extensions/http-curl/client/HTTPStream.cpp
index eb3b633..5ba7f3f 100644
--- a/extensions/http-curl/client/HTTPStream.cpp
+++ b/extensions/http-curl/client/HTTPStream.cpp
@@ -27,6 +27,8 @@
 
 #include "HTTPCallback.h"
 #include "io/validation.h"
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -95,7 +97,7 @@
         started_ = true;
       }
     }
-    return http_read_callback_.readFully((char*) buf, buflen);
+    return gsl::narrow<int>(http_read_callback_.readFully((char*) buf, buflen));
 
   } else {
     return -1;
diff --git a/extensions/http-curl/processors/InvokeHTTP.cpp b/extensions/http-curl/processors/InvokeHTTP.cpp
index 8b173fb..c0b2b87 100644
--- a/extensions/http-curl/processors/InvokeHTTP.cpp
+++ b/extensions/http-curl/processors/InvokeHTTP.cpp
@@ -45,6 +45,7 @@
 #include "io/BufferStream.h"
 #include "io/StreamFactory.h"
 #include "ResourceClaim.h"
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 
 namespace org {
@@ -382,7 +383,7 @@
         response_flow->addAttribute(STATUS_MESSAGE, response_headers.at(0));
       response_flow->addAttribute(REQUEST_URL, url);
       response_flow->addAttribute(TRANSACTION_ID, tx_id);
-      io::BufferStream stream((const uint8_t*) response_body.data(), response_body.size());
+      io::BufferStream stream((const uint8_t*) response_body.data(), gsl::narrow<unsigned int>(response_body.size()));
       // need an import from the data stream.
       session->importFrom(stream, response_flow);
     }
diff --git a/extensions/http-curl/protocols/AgentPrinter.cpp b/extensions/http-curl/protocols/AgentPrinter.cpp
index 672652a..58b567f 100644
--- a/extensions/http-curl/protocols/AgentPrinter.cpp
+++ b/extensions/http-curl/protocols/AgentPrinter.cpp
@@ -17,6 +17,7 @@
  */
 
 #include "AgentPrinter.h"
+
 #include <algorithm>
 #include <memory>
 #include <utility>
@@ -25,6 +26,8 @@
 #include <string>
 #include <vector>
 
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -51,7 +54,7 @@
 
   rapidjson::Value opReqStrVal;
   std::string operation_request_str = getOperation(payload);
-  opReqStrVal.SetString(operation_request_str.c_str(), operation_request_str.length(), alloc);
+  opReqStrVal.SetString(operation_request_str.c_str(), gsl::narrow<rapidjson::SizeType>(operation_request_str.length()), alloc);
   json_payload.AddMember("operation", opReqStrVal, alloc);
 
   std::string operationid = payload.getIdentifier();
diff --git a/extensions/http-curl/sitetosite/HTTPProtocol.cpp b/extensions/http-curl/sitetosite/HTTPProtocol.cpp
index 50cdca8..827c640 100644
--- a/extensions/http-curl/sitetosite/HTTPProtocol.cpp
+++ b/extensions/http-curl/sitetosite/HTTPProtocol.cpp
@@ -41,12 +41,12 @@
 std::shared_ptr<utils::IdGenerator> HttpSiteToSiteClient::id_generator_ = utils::IdGenerator::getIdGenerator();
 
 utils::optional<utils::Identifier> HttpSiteToSiteClient::parseTransactionId(const std::string &uri) {
-  int i = 0;
-  for (i = uri.length() - 1; i >= 0; i--) {
-    if (uri.at(i) == '/')
-      break;
+  const size_t last_slash_pos = uri.find_last_of('/');
+  size_t id_start_pos = 0;
+  if (last_slash_pos != std::string::npos) {
+    id_start_pos = last_slash_pos + 1;
   }
-  return utils::Identifier::parse(uri.substr(i + 1, uri.length() - (i + 1)));
+  return utils::Identifier::parse(uri.substr(id_start_pos));
 }
 
 std::shared_ptr<Transaction> HttpSiteToSiteClient::createTransaction(TransferDirection direction) {
diff --git a/extensions/http-curl/tests/C2UpdateAgentTest.cpp b/extensions/http-curl/tests/C2UpdateAgentTest.cpp
index 3ab4409..5e61f7e 100644
--- a/extensions/http-curl/tests/C2UpdateAgentTest.cpp
+++ b/extensions/http-curl/tests/C2UpdateAgentTest.cpp
@@ -19,6 +19,7 @@
 #undef NDEBUG
 #include "HTTPIntegrationBase.h"
 #include "HTTPHandlers.h"
+#include "utils/gsl.h"
 
 int main(int argc, char **argv) {
   const cmd_args args = parse_cmdline_args(argc, argv, "update");
@@ -34,6 +35,6 @@
 
   const auto then = std::chrono::system_clock::now();
   const auto seconds = std::chrono::duration_cast<std::chrono::seconds>(then - start).count();
-  assert(handler.calls_ <= (seconds) + 2);
+  assert(handler.calls_ <= gsl::narrow<size_t>(seconds + 2));
   return 0;
 }
diff --git a/extensions/http-curl/tests/C2UpdateTest.cpp b/extensions/http-curl/tests/C2UpdateTest.cpp
index 2c85a79..24d4693 100644
--- a/extensions/http-curl/tests/C2UpdateTest.cpp
+++ b/extensions/http-curl/tests/C2UpdateTest.cpp
@@ -19,6 +19,7 @@
 #undef NDEBUG
 #include "HTTPIntegrationBase.h"
 #include "HTTPHandlers.h"
+#include "utils/gsl.h"
 #include "utils/IntegrationTestUtils.h"
 
 int main(int argc, char **argv) {
@@ -35,6 +36,6 @@
 
   const auto then = std::chrono::system_clock::now();
   const auto seconds = std::chrono::duration_cast<std::chrono::seconds>(then - start).count();
-  assert(handler.calls_ <= seconds + 1);
+  assert(handler.calls_ <= gsl::narrow<size_t>(seconds + 1));
   return 0;
 }
diff --git a/extensions/http-curl/tests/HTTPHandlers.h b/extensions/http-curl/tests/HTTPHandlers.h
index 1063665..4e7d62b 100644
--- a/extensions/http-curl/tests/HTTPHandlers.h
+++ b/extensions/http-curl/tests/HTTPHandlers.h
@@ -29,6 +29,7 @@
 #include "rapidjson/document.h"
 #include "HTTPUtils.h"
 #include "ServerAwareHandler.h"
+#include "utils/gsl.h"
 
 static std::atomic<int> transaction_id;
 static std::atomic<int> transaction_id_output;
@@ -280,7 +281,7 @@
       minifi::io::BufferStream serializer;
       minifi::io::CRCStream < minifi::io::BaseStream > stream(gsl::make_not_null(&serializer));
       for (const auto& flow : flows) {
-        uint32_t num_attributes = flow->attributes.size();
+        uint32_t num_attributes = gsl::narrow<uint32_t>(flow->attributes.size());
         stream.write(num_attributes);
         for (const auto& entry : flow->attributes) {
           stream.write(entry.first);
diff --git a/extensions/http-curl/tests/HTTPIntegrationBase.h b/extensions/http-curl/tests/HTTPIntegrationBase.h
index 48724bb..29e5672 100644
--- a/extensions/http-curl/tests/HTTPIntegrationBase.h
+++ b/extensions/http-curl/tests/HTTPIntegrationBase.h
@@ -207,7 +207,7 @@
 
   void runAssertions() override {
     using org::apache::nifi::minifi::utils::verifyLogLinePresenceInPollTime;
-    assert(verifyLogLinePresenceInPollTime(std::chrono::seconds(10), "removing file", "May not have command processor"));
+    assert(verifyLogLinePresenceInPollTime(std::chrono::seconds(10), "removing file", "Executed update command"));
   }
 };
 
diff --git a/extensions/http-curl/tests/unit/InvokeHTTPTests.cpp b/extensions/http-curl/tests/unit/InvokeHTTPTests.cpp
index 2a4220f..06a7bf0 100644
--- a/extensions/http-curl/tests/unit/InvokeHTTPTests.cpp
+++ b/extensions/http-curl/tests/unit/InvokeHTTPTests.cpp
@@ -39,6 +39,7 @@
 #include "processors/InvokeHTTP.h"
 #include "processors/ListenHTTP.h"
 #include "processors/LogAttribute.h"
+#include "utils/gsl.h"
 
 TEST_CASE("HTTPTestsWithNoResourceClaimPOST", "[httptest1]") {
   TestController testController;
@@ -153,7 +154,7 @@
   virtual int64_t process(const std::shared_ptr<minifi::io::BaseStream>& stream) {
     // leaving the typo for posterity sake
     std::string st = "we're gnna write some test stuff";
-    return stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(st.c_str())), st.length());
+    return stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(st.c_str())), gsl::narrow<int>(st.length()));
   }
 };
 
diff --git a/extensions/libarchive/ArchiveMetadata.cpp b/extensions/libarchive/ArchiveMetadata.cpp
index eea31a8..69af90a 100644
--- a/extensions/libarchive/ArchiveMetadata.cpp
+++ b/extensions/libarchive/ArchiveMetadata.cpp
@@ -29,6 +29,7 @@
 #include <iostream>
 
 #include "utils/file/FileManager.h"
+#include "utils/gsl.h"
 #include "Exception.h"
 
 using org::apache::nifi::minifi::Exception;
@@ -38,7 +39,7 @@
     rapidjson::Value entryVal(rapidjson::kObjectType);
 
     rapidjson::Value entryNameVal;
-    entryNameVal.SetString(entryName.c_str(), entryName.length());
+    entryNameVal.SetString(entryName.c_str(), gsl::narrow<rapidjson::SizeType>(entryName.length()));
     entryVal.AddMember("entry_name", entryNameVal, alloc);
 
     entryVal.AddMember("entry_type", entryType, alloc);
@@ -51,7 +52,7 @@
 
     if (entryType == AE_IFREG) {
         rapidjson::Value stashKeyVal;
-        stashKeyVal.SetString(stashKey.c_str(), stashKey.length());
+        stashKeyVal.SetString(stashKey.c_str(), gsl::narrow<rapidjson::SizeType>(stashKey.length()));
         entryVal.AddMember("stash_key", stashKeyVal, alloc);
     }
 
@@ -107,7 +108,7 @@
     rapidjson::Value lensVal(rapidjson::kObjectType);
 
     rapidjson::Value archiveFormatNameVal;
-    archiveFormatNameVal.SetString(archiveFormatName.c_str(), archiveFormatName.length());
+    archiveFormatNameVal.SetString(archiveFormatName.c_str(), gsl::narrow<rapidjson::SizeType>(archiveFormatName.length()));
     lensVal.AddMember("archive_format_name", archiveFormatNameVal, alloc);
 
     lensVal.AddMember("archive_format", archiveFormat, alloc);
@@ -115,12 +116,12 @@
 
     if (!archiveName.empty()) {
         rapidjson::Value archiveNameVal;
-        archiveNameVal.SetString(archiveName.c_str(), archiveName.length());
+        archiveNameVal.SetString(archiveName.c_str(), gsl::narrow<rapidjson::SizeType>(archiveName.length()));
         lensVal.AddMember("archive_name", archiveNameVal, alloc);
     }
 
    rapidjson::Value focusedEntryVal;
-    focusedEntryVal.SetString(focusedEntry.c_str(), focusedEntry.length());
+    focusedEntryVal.SetString(focusedEntry.c_str(), gsl::narrow<rapidjson::SizeType>(focusedEntry.length()));
     lensVal.AddMember("focused_entry", focusedEntryVal, alloc);
 
     return lensVal;
diff --git a/extensions/libarchive/BinFiles.h b/extensions/libarchive/BinFiles.h
index 604474e..6914618 100644
--- a/extensions/libarchive/BinFiles.h
+++ b/extensions/libarchive/BinFiles.h
@@ -30,6 +30,7 @@
 #include "core/Core.h"
 #include "core/Resource.h"
 #include "core/logging/LoggerConfiguration.h"
+#include "utils/gsl.h"
 #include "utils/Id.h"
 
 namespace org {
@@ -113,7 +114,7 @@
     return creation_dated_;
   }
   int getSize() {
-    return queue_.size();
+    return gsl::narrow<int>(queue_.size());
   }
 
   utils::SmallString<36> getUUIDStr() {
diff --git a/extensions/libarchive/CompressContent.h b/extensions/libarchive/CompressContent.h
index 5c3a775..1a43217 100644
--- a/extensions/libarchive/CompressContent.h
+++ b/extensions/libarchive/CompressContent.h
@@ -34,6 +34,7 @@
 #include "core/logging/LoggerConfiguration.h"
 #include "io/ZlibStream.h"
 #include "utils/Enum.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -183,7 +184,7 @@
 
     static la_ssize_t archive_write(struct archive* /*arch*/, void *context, const void *buff, size_t size) {
       WriteCallback *callback = (WriteCallback *) context;
-      la_ssize_t ret = callback->stream_->write(reinterpret_cast<uint8_t*>(const_cast<void*>(buff)), size);
+      la_ssize_t ret = callback->stream_->write(reinterpret_cast<uint8_t*>(const_cast<void*>(buff)), gsl::narrow<int>(size));
       if (ret > 0)
         callback->size_ += (int64_t) ret;
       return ret;
@@ -332,16 +333,16 @@
         size_ = 0;
         while (size_ < entry_size) {
           char buffer[8192];
-          int ret = archive_read_data(arch, buffer, sizeof(buffer));
-          if (ret < 0) {
+          const auto read_result = archive_read_data(arch, buffer, sizeof(buffer));
+          if (read_result < 0) {
             archive_read_log_error_cleanup(arch);
             return -1;
           }
-          if (ret == 0)
+          if (read_result == 0)
             break;
-          size_ += ret;
-          ret = stream_->write(reinterpret_cast<uint8_t*>(buffer), ret);
-          if (ret < 0) {
+          size_ += read_result;
+          const auto write_result = stream_->write(reinterpret_cast<uint8_t*>(buffer), gsl::narrow<int>(read_result));
+          if (write_result < 0) {
             archive_read_log_error_cleanup(arch);
             return -1;
           }
@@ -382,7 +383,7 @@
           std::vector<uint8_t> buffer(16 * 1024U);
           int64_t read_size = 0;
           while (read_size < gsl::narrow<int64_t>(writer_.flow_->getSize())) {
-            int ret = inputStream->read(buffer.data(), buffer.size());
+            int ret = inputStream->read(buffer.data(), gsl::narrow<int>(buffer.size()));
             if (ret < 0) {
               return -1;
             } else if (ret == 0) {
diff --git a/extensions/libarchive/MergeContent.h b/extensions/libarchive/MergeContent.h
index 341ddca..092b37f 100644
--- a/extensions/libarchive/MergeContent.h
+++ b/extensions/libarchive/MergeContent.h
@@ -26,6 +26,7 @@
 #include "archive.h"
 #include "core/logging/LoggerConfiguration.h"
 #include "serialization/FlowFileSerializer.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -79,7 +80,7 @@
     int64_t process(const std::shared_ptr<io::BaseStream>& stream) {
       int64_t ret = 0;
       if (!header_.empty()) {
-        int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(header_.data())), header_.size());
+        int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(header_.data())), gsl::narrow<int>(header_.size()));
         if (len < 0)
           return len;
         ret += len;
@@ -87,7 +88,7 @@
       bool isFirst = true;
       for (auto flow : flows_) {
         if (!isFirst && !demarcator_.empty()) {
-          int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(demarcator_.data())), demarcator_.size());
+          int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(demarcator_.data())), gsl::narrow<int>(demarcator_.size()));
           if (len < 0)
             return len;
           ret += len;
@@ -99,7 +100,7 @@
         isFirst = false;
       }
       if (!footer_.empty()) {
-        int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(footer_.data())), footer_.size());
+        int64_t len = stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(footer_.data())), gsl::narrow<int>(footer_.size()));
         if (len < 0)
           return len;
         ret += len;
@@ -131,7 +132,7 @@
       int totalWrote = 0;
       int remaining = size;
       while (remaining > 0) {
-        int ret = archive_write_data(arch_, data + totalWrote, remaining);
+        const auto ret = archive_write_data(arch_, data + totalWrote, remaining);
         if (ret < 0) {
           return ret;
         }
@@ -171,7 +172,7 @@
       WriteCallback *callback = (WriteCallback *) context;
       uint8_t* data = reinterpret_cast<uint8_t*>(const_cast<void*>(buff));
       la_ssize_t totalWrote = 0;
-      size_t remaining = size;
+      int remaining = gsl::narrow<int>(size);
       while (remaining > 0) {
         la_ssize_t ret = callback->stream_->write(data + totalWrote, remaining);
         if (ret < 0) {
diff --git a/extensions/libarchive/UnfocusArchiveEntry.cpp b/extensions/libarchive/UnfocusArchiveEntry.cpp
index 1569c34..af1b428 100644
--- a/extensions/libarchive/UnfocusArchiveEntry.cpp
+++ b/extensions/libarchive/UnfocusArchiveEntry.cpp
@@ -31,6 +31,7 @@
 
 #include "core/ProcessContext.h"
 #include "core/ProcessSession.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -155,7 +156,7 @@
 la_ssize_t UnfocusArchiveEntry::WriteCallback::write_cb(struct archive *, void *d, const void *buffer, size_t length) {
   auto data = static_cast<UnfocusArchiveEntryWriteData *>(d);
   const uint8_t *ui_buffer = static_cast<const uint8_t*>(buffer);
-  return data->stream->write(const_cast<uint8_t*>(ui_buffer), length);
+  return data->stream->write(const_cast<uint8_t*>(ui_buffer), gsl::narrow<int>(length));
 }
 
 int64_t UnfocusArchiveEntry::WriteCallback::process(const std::shared_ptr<io::BaseStream>& stream) {
diff --git a/extensions/librdkafka/PublishKafka.cpp b/extensions/librdkafka/PublishKafka.cpp
index 7437f75..d58c8e5 100644
--- a/extensions/librdkafka/PublishKafka.cpp
+++ b/extensions/librdkafka/PublishKafka.cpp
@@ -27,6 +27,7 @@
 #include <set>
 #include <vector>
 
+#include "utils/gsl.h"
 #include "utils/TimeUtil.h"
 #include "utils/StringUtils.h"
 #include "utils/GeneralUtils.h"
@@ -407,7 +408,7 @@
     }
 
     for (size_t segment_num = 0; read_size_ < flow_size_; ++segment_num) {
-      const int readRet = stream->read(buffer.data(), buffer.size());
+      const int readRet = stream->read(buffer.data(), gsl::narrow<int>(buffer.size()));
       if (readRet < 0) {
         status_ = -1;
         error_ = "Failed to read from stream";
diff --git a/extensions/rocksdb-repos/DatabaseContentRepository.cpp b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
index b2a78b0..54e42d4 100644
--- a/extensions/rocksdb-repos/DatabaseContentRepository.cpp
+++ b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
@@ -17,11 +17,14 @@
  */
 
 #include "DatabaseContentRepository.h"
+
 #include <memory>
 #include <string>
+
 #include "RocksDbStream.h"
 #include "rocksdb/merge_operator.h"
 #include "utils/GeneralUtils.h"
+#include "utils/gsl.h"
 #include "Exception.h"
 
 namespace org {
@@ -84,7 +87,7 @@
     if (outStream == nullptr) {
       throw Exception(REPOSITORY_EXCEPTION, "Couldn't open the underlying resource for write: " + resource.first->getContentFullPath());
     }
-    const auto size = resource.second->size();
+    const int size = gsl::narrow<int>(resource.second->size());
     if (outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size) != size) {
       throw Exception(REPOSITORY_EXCEPTION, "Failed to write new resource: " + resource.first->getContentFullPath());
     }
@@ -94,7 +97,7 @@
     if (outStream == nullptr) {
       throw Exception(REPOSITORY_EXCEPTION, "Couldn't open the underlying resource for append: " + resource.first->getContentFullPath());
     }
-    const auto size = resource.second->size();
+    const int size = gsl::narrow<int>(resource.second->size());
     if (outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size) != size) {
       throw Exception(REPOSITORY_EXCEPTION, "Failed to append to resource: " + resource.first->getContentFullPath());
     }
diff --git a/extensions/rocksdb-repos/FlowFileRepository.cpp b/extensions/rocksdb-repos/FlowFileRepository.cpp
index a7dc5e6..0360143 100644
--- a/extensions/rocksdb-repos/FlowFileRepository.cpp
+++ b/extensions/rocksdb-repos/FlowFileRepository.cpp
@@ -15,13 +15,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include "FlowFileRecord.h"
 #include "FlowFileRepository.h"
 
-#include "rocksdb/options.h"
-#include "rocksdb/write_batch.h"
-#include "rocksdb/slice.h"
-
 #include <chrono>
 #include <memory>
 #include <string>
@@ -29,6 +24,12 @@
 #include <vector>
 #include <list>
 
+#include "rocksdb/options.h"
+#include "rocksdb/write_batch.h"
+#include "rocksdb/slice.h"
+#include "FlowFileRecord.h"
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -68,7 +69,7 @@
     }
 
     utils::Identifier containerId;
-    auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(values[i].data()), values[i].size(), content_repo_, containerId);
+    auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(values[i].data()), gsl::narrow<int>(values[i].size()), content_repo_, containerId);
     if (eventRead) {
       purgeList.push_back(eventRead);
     }
@@ -152,7 +153,7 @@
   auto it = opendb->NewIterator(rocksdb::ReadOptions());
   for (it->SeekToFirst(); it->Valid(); it->Next()) {
     utils::Identifier containerId;
-    auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(it->value().data()), it->value().size(), content_repo_, containerId);
+    auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(it->value().data()), gsl::narrow<int>(it->value().size()), content_repo_, containerId);
     std::string key = it->key().ToString();
     if (eventRead) {
       // on behalf of the just resurrected persisted instance
diff --git a/extensions/standard-processors/processors/GenerateFlowFile.cpp b/extensions/standard-processors/processors/GenerateFlowFile.cpp
index a2dc1b3..bf38689 100644
--- a/extensions/standard-processors/processors/GenerateFlowFile.cpp
+++ b/extensions/standard-processors/processors/GenerateFlowFile.cpp
@@ -34,6 +34,7 @@
 #include <utility>
 #include <vector>
 
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 #include "core/ProcessContext.h"
 #include "core/ProcessSession.h"
@@ -62,7 +63,7 @@
 
 core::Relationship GenerateFlowFile::Success("success", "success operational on the flow record");
 
-static const char * TEXT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-_=+/?.,';:\"?<>\n\t ";
+constexpr const char * TEXT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-_=+/?.,';:\"?<>\n\t ";
 
 void GenerateFlowFile::initialize() {
   // Set the supported properties
@@ -82,7 +83,8 @@
   std::random_device rd;
   std::mt19937 eng(rd());
   if (textData) {
-    std::uniform_int_distribution<> distr(0, strlen(TEXT_CHARS) - 1);
+    const int index_of_last_char = gsl::narrow<int>(strlen(TEXT_CHARS)) - 1;
+    std::uniform_int_distribution<> distr(0, index_of_last_char);
     auto rand = std::bind(distr, eng);
     std::generate_n(data.begin(), data.size(), rand);
     std::for_each(data.begin(), data.end(), [](char & c) { c = TEXT_CHARS[c];});
diff --git a/extensions/standard-processors/processors/GenerateFlowFile.h b/extensions/standard-processors/processors/GenerateFlowFile.h
index b5d7dfd..608f7c0 100644
--- a/extensions/standard-processors/processors/GenerateFlowFile.h
+++ b/extensions/standard-processors/processors/GenerateFlowFile.h
@@ -30,6 +30,7 @@
 #include "core/ProcessSession.h"
 #include "core/Core.h"
 #include "core/Resource.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -73,7 +74,7 @@
     int64_t process(const std::shared_ptr<io::BaseStream>& stream) {
       int64_t ret = 0;
       if (data_.size() > 0)
-        ret = stream->write(reinterpret_cast<uint8_t*>(&data_[0]), data_.size());
+        ret = stream->write(reinterpret_cast<uint8_t*>(&data_[0]), gsl::narrow<int>(data_.size()));
       return ret;
     }
   };
diff --git a/extensions/standard-processors/processors/GetTCP.h b/extensions/standard-processors/processors/GetTCP.h
index 58cfb82..48883ed 100644
--- a/extensions/standard-processors/processors/GetTCP.h
+++ b/extensions/standard-processors/processors/GetTCP.h
@@ -35,6 +35,7 @@
 #include "utils/ThreadPool.h"
 #include "core/logging/LoggerConfiguration.h"
 #include "controllers/SSLContextService.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -94,7 +95,7 @@
   ~DataHandlerCallback() override = default;
 
   int64_t process(const std::shared_ptr<io::BaseStream>& stream) override {
-    return stream->write(message_, size_);
+    return stream->write(message_, gsl::narrow<int>(size_));
   }
 
  private:
diff --git a/extensions/standard-processors/processors/LogAttribute.h b/extensions/standard-processors/processors/LogAttribute.h
index d1df602..7694230 100644
--- a/extensions/standard-processors/processors/LogAttribute.h
+++ b/extensions/standard-processors/processors/LogAttribute.h
@@ -31,6 +31,7 @@
 #include "core/Core.h"
 #include "core/Resource.h"
 #include "core/logging/LoggerConfiguration.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -106,7 +107,7 @@
       if (buffer_.size() == 0U) {
         return 0U;
       }
-      int ret = stream->read(buffer_.data(), buffer_.size());
+      int ret = stream->read(buffer_.data(), gsl::narrow<int>(buffer_.size()));
       if (ret != buffer_.size()) {
         logger_->log_error("%zu bytes were requested from the stream but %d bytes were read. Rolling back.", buffer_.size(), ret);
         throw Exception(PROCESSOR_EXCEPTION, "Failed to read the entire FlowFile.");
diff --git a/extensions/standard-processors/tests/unit/GetTCPTests.cpp b/extensions/standard-processors/tests/unit/GetTCPTests.cpp
index e1470a7..27e223b 100644
--- a/extensions/standard-processors/tests/unit/GetTCPTests.cpp
+++ b/extensions/standard-processors/tests/unit/GetTCPTests.cpp
@@ -34,6 +34,7 @@
 #include "core/ProcessSession.h"
 #include "core/ProcessorNode.h"
 #include "core/reporting/SiteToSiteProvenanceReportingTask.h"
+#include "utils/gsl.h"
 
 TEST_CASE("GetTCPWithoutEOM", "[GetTCP1]") {
   utils::Identifier ident = utils::Identifier();
@@ -111,7 +112,7 @@
   std::shared_ptr<core::ProcessSessionFactory> factory = std::make_shared<core::ProcessSessionFactory>(context);
   processor->onSchedule(context, factory);
   processor->onTrigger(context, session);
-  server.write(buffer, buffer.size());
+  server.write(buffer, gsl::narrow<int>(buffer.size()));
   std::this_thread::sleep_for(std::chrono::seconds(2));
 
   logAttribute->initialize();
@@ -226,7 +227,7 @@
   std::shared_ptr<core::ProcessSessionFactory> factory = std::make_shared<core::ProcessSessionFactory>(context);
   processor->onSchedule(context, factory);
   processor->onTrigger(context, session);
-  server.write(buffer, buffer.size());
+  server.write(buffer, gsl::narrow<int>(buffer.size()));
   std::this_thread::sleep_for(std::chrono::seconds(2));
 
   logAttribute->initialize();
@@ -350,7 +351,7 @@
   std::shared_ptr<core::ProcessSessionFactory> factory = std::make_shared<core::ProcessSessionFactory>(context);
   processor->onSchedule(context, factory);
   processor->onTrigger(context, session);
-  server.write(buffer, buffer.size());
+  server.write(buffer, gsl::narrow<int>(buffer.size()));
   std::this_thread::sleep_for(std::chrono::seconds(2));
 
   logAttribute->initialize();
diff --git a/extensions/windows-event-log/CollectorInitiatedSubscription.cpp b/extensions/windows-event-log/CollectorInitiatedSubscription.cpp
index 54f6933..9215884 100644
--- a/extensions/windows-event-log/CollectorInitiatedSubscription.cpp
+++ b/extensions/windows-event-log/CollectorInitiatedSubscription.cpp
@@ -634,7 +634,7 @@
     }
 
     int64_t process(const std::shared_ptr<io::BaseStream>& stream) {
-      return stream->write((uint8_t*)&str_[0], str_.size());
+      return stream->write((uint8_t*)&str_[0], gsl::narrow<int>(str_.size()));
     }
 
     std::string str_;
diff --git a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
index e3b6ae9..22442f9 100644
--- a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
+++ b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
@@ -652,7 +652,7 @@
     }
 
     int64_t process(const std::shared_ptr<io::BaseStream>& stream) {
-      return stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(str_.c_str())), str_.size());
+      return stream->write(reinterpret_cast<uint8_t*>(const_cast<char*>(str_.c_str())), gsl::narrow<int>(str_.size()));
     }
 
     const std::string& str_;
diff --git a/extensions/windows-event-log/tests/BookmarkTests.cpp b/extensions/windows-event-log/tests/BookmarkTests.cpp
index d42ebad..ffe3026 100644
--- a/extensions/windows-event-log/tests/BookmarkTests.cpp
+++ b/extensions/windows-event-log/tests/BookmarkTests.cpp
@@ -56,7 +56,7 @@
   std::array<wchar_t, BUFFER_SIZE> buffer = {};
   DWORD buffer_used;
   DWORD property_count;
-  if (!EvtRender(nullptr, event, EvtRenderBookmark, buffer.size(), buffer.data(), &buffer_used, &property_count)) {
+  if (!EvtRender(nullptr, event, EvtRenderBookmark, gsl::narrow<DWORD>(buffer.size()), buffer.data(), &buffer_used, &property_count)) {
     FAIL("EvtRender() failed; error code: " << GetLastError());
   }
   return std::wstring{buffer.data()};
diff --git a/libminifi/include/FlowControlProtocol.h b/libminifi/include/FlowControlProtocol.h
index ac3b060..3238cc2 100644
--- a/libminifi/include/FlowControlProtocol.h
+++ b/libminifi/include/FlowControlProtocol.h
@@ -36,6 +36,7 @@
 #include "core/Property.h"
 #include "properties/Configure.h"
 #include "utils/file/FileUtils.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -244,8 +245,8 @@
   // encode std::string
   uint8_t *encode(uint8_t *buf, const std::string& value) {
     // add the \0 for size
-    buf = encode(buf, value.size() + 1);
-    buf = encode(buf, const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(value.c_str())), value.size() + 1);
+    buf = encode(buf, gsl::narrow<uint32_t>(value.size() + 1));
+    buf = encode(buf, const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(value.c_str())), gsl::narrow<int>(value.size() + 1));
     return buf;
   }
 
diff --git a/libminifi/include/agent/build_description.h b/libminifi/include/agent/build_description.h
index aeb9bed..de92612 100644
--- a/libminifi/include/agent/build_description.h
+++ b/libminifi/include/agent/build_description.h
@@ -127,7 +127,7 @@
         auto lastOfIdx = clazz.find_last_of("::");
         if (lastOfIdx != std::string::npos) {
           lastOfIdx++;  // if a value is found, increment to move beyond the .
-          int nameLength = clazz.length() - lastOfIdx;
+          size_t nameLength = clazz.length() - lastOfIdx;
           class_name = clazz.substr(lastOfIdx, nameLength);
         }
         auto obj = core::ClassLoader::getDefaultClassLoader().instantiate(class_name, class_name);
diff --git a/libminifi/include/c2/PayloadSerializer.h b/libminifi/include/c2/PayloadSerializer.h
index b03da5e..89042c9 100644
--- a/libminifi/include/c2/PayloadSerializer.h
+++ b/libminifi/include/c2/PayloadSerializer.h
@@ -27,6 +27,8 @@
 #include "core/state/Value.h"
 #include "c2/C2Protocol.h"
 #include "io/BaseStream.h"
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -74,7 +76,7 @@
   }
   static void serialize(uint16_t op, const C2Payload &payload, std::shared_ptr<io::BaseStream> stream) {
     uint8_t st;
-    uint32_t size = payload.getNestedPayloads().size();
+    uint32_t size = gsl::narrow<uint32_t>(payload.getNestedPayloads().size());
     stream->write(size);
     for (auto nested_payload : payload.getNestedPayloads()) {
       op = opToInt(nested_payload.getOperation());
@@ -83,11 +85,11 @@
       stream->write(nested_payload.getLabel());
       stream->write(nested_payload.getIdentifier());
       const std::vector<C2ContentResponse> &content = nested_payload.getContent();
-      size = content.size();
+      size = gsl::narrow<uint32_t>(content.size());
       stream->write(size);
       for (const auto &payload_content : content) {
         stream->write(payload_content.name);
-        size = payload_content.operation_arguments.size();
+        size = gsl::narrow<uint32_t>(payload_content.operation_arguments.size());
         stream->write(size);
         for (auto content : payload_content.operation_arguments) {
           stream->write(content.first);
@@ -152,11 +154,11 @@
 
     stream->write(payload.getIdentifier());
     const std::vector<C2ContentResponse> &content = payload.getContent();
-    uint32_t size = content.size();
+    uint32_t size = gsl::narrow<uint32_t>(content.size());
     stream->write(size);
     for (const auto &payload_content : content) {
       stream->write(payload_content.name);
-      size = payload_content.operation_arguments.size();
+      size = gsl::narrow<uint32_t>(payload_content.operation_arguments.size());
       stream->write(size);
       for (auto content : payload_content.operation_arguments) {
         stream->write(content.first);
@@ -247,7 +249,7 @@
     return true;
   }
   static bool deserialize(std::vector<uint8_t> data, C2Payload &payload) {
-    io::BufferStream stream(data.data(), data.size());
+    io::BufferStream stream(data.data(), gsl::narrow<unsigned int>(data.size()));
 
     uint8_t op, st = 0;
     uint16_t version = 0;
diff --git a/libminifi/include/core/repository/VolatileFlowFileRepository.h b/libminifi/include/core/repository/VolatileFlowFileRepository.h
index 88a2d80..73df967 100644
--- a/libminifi/include/core/repository/VolatileFlowFileRepository.h
+++ b/libminifi/include/core/repository/VolatileFlowFileRepository.h
@@ -23,6 +23,7 @@
 
 #include "VolatileRepository.h"
 #include "FlowFileRecord.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -62,7 +63,8 @@
       std::lock_guard<std::mutex> lock(purge_mutex_);
       for (auto purgeItem : purge_list_) {
         utils::Identifier containerId;
-        auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(purgeItem.data()), purgeItem.size(), content_repo_, containerId);
+        auto eventRead = FlowFileRecord::DeSerialize(reinterpret_cast<const uint8_t *>(purgeItem.data()), gsl::narrow<int>(purgeItem.size()),
+                                                     content_repo_, containerId);
         if (eventRead) {
           auto claim = eventRead->getResourceClaim();
           if (claim) claim->decreaseFlowFileRecordOwnedCount();
diff --git a/libminifi/include/core/state/nodes/AgentInformation.h b/libminifi/include/core/state/nodes/AgentInformation.h
index 63b1e36..4e70686 100644
--- a/libminifi/include/core/state/nodes/AgentInformation.h
+++ b/libminifi/include/core/state/nodes/AgentInformation.h
@@ -276,7 +276,7 @@
         std::string processorName = group.class_name_;
         if (lastOfIdx != std::string::npos) {
           lastOfIdx++;  // if a value is found, increment to move beyond the .
-          int nameLength = group.class_name_.length() - lastOfIdx;
+          size_t nameLength = group.class_name_.length() - lastOfIdx;
           processorName = group.class_name_.substr(lastOfIdx, nameLength);
         }
         std::string description;
diff --git a/libminifi/include/io/AtomicEntryStream.h b/libminifi/include/io/AtomicEntryStream.h
index 4be2847..13679ce 100644
--- a/libminifi/include/io/AtomicEntryStream.h
+++ b/libminifi/include/io/AtomicEntryStream.h
@@ -23,10 +23,13 @@
 #include <mutex>
 #include <cstring>
 #include <algorithm>
+
 #include "BaseStream.h"
 #include "core/repository/AtomicRepoEntries.h"
 #include "Exception.h"
 #include "core/logging/LoggerConfiguration.h"
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -137,7 +140,7 @@
     core::repository::RepoValue<T> *value;
     if (entry_->getValue(key_, &value)) {
       if (offset_ + len > value->getBufferSize()) {
-        len = value->getBufferSize() - offset_;
+        len = gsl::narrow<int>(value->getBufferSize()) - gsl::narrow<int>(offset_);
         if (len <= 0) {
           entry_->decrementOwnership();
           return 0;
diff --git a/libminifi/include/io/BufferStream.h b/libminifi/include/io/BufferStream.h
index c393abb..3f0bfdc 100644
--- a/libminifi/include/io/BufferStream.h
+++ b/libminifi/include/io/BufferStream.h
@@ -23,6 +23,7 @@
 #include <vector>
 #include <string>
 #include "BaseStream.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -39,7 +40,7 @@
   }
 
   explicit BufferStream(const std::string& data) {
-    write(reinterpret_cast<const uint8_t*>(data.c_str()), data.length());
+    write(reinterpret_cast<const uint8_t*>(data.c_str()), gsl::narrow<int>(data.length()));
   }
 
   using BaseStream::read;
diff --git a/libminifi/include/provenance/Provenance.h b/libminifi/include/provenance/Provenance.h
index 285a33f..3b7b4f7 100644
--- a/libminifi/include/provenance/Provenance.h
+++ b/libminifi/include/provenance/Provenance.h
@@ -18,12 +18,13 @@
 #ifndef LIBMINIFI_INCLUDE_PROVENANCE_PROVENANCE_H_
 #define LIBMINIFI_INCLUDE_PROVENANCE_PROVENANCE_H_
 
-#include <memory>
+#include <algorithm>
 #include <atomic>
 #include <cstdint>
 #include <cstring>
 #include <iostream>
 #include <map>
+#include <memory>
 #include <set>
 #include <string>
 #include <thread>
@@ -37,6 +38,7 @@
 #include "FlowFileRecord.h"
 #include "core/logging/LoggerConfiguration.h"
 #include "ResourceClaim.h"
+#include "utils/gsl.h"
 #include "utils/Id.h"
 #include "utils/TimeUtil.h"
 
@@ -360,8 +362,8 @@
   bool DeSerialize(const std::shared_ptr<core::SerializableComponent> &repo);
 
   uint64_t getEventTime(const uint8_t *buffer, const size_t bufferSize) {
-    int size = bufferSize > 72 ? 72 : bufferSize;
-    org::apache::nifi::minifi::io::BufferStream outStream(buffer, size);
+    const auto size = std::min<size_t>(72, bufferSize);
+    org::apache::nifi::minifi::io::BufferStream outStream(buffer, gsl::narrow<int>(size));
 
     std::string uuid;
     int ret = outStream.read(uuid);
diff --git a/libminifi/include/utils/HTTPClient.h b/libminifi/include/utils/HTTPClient.h
index a03d248..82aa55b 100644
--- a/libminifi/include/utils/HTTPClient.h
+++ b/libminifi/include/utils/HTTPClient.h
@@ -35,6 +35,7 @@
 #include "ByteArrayCallback.h"
 #include "controllers/SSLContextService.h"
 #include "core/Deprecated.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -278,7 +279,7 @@
       size_to_read = data.size();
     }
     memcpy(buf, data.data(), size_to_read);
-    return size_to_read;
+    return gsl::narrow<int>(size_to_read);
   }
 
   size_t write_content(char* ptr, size_t size, size_t nmemb) {
diff --git a/libminifi/include/utils/StringUtils.h b/libminifi/include/utils/StringUtils.h
index 04201cb..7dcfc49 100644
--- a/libminifi/include/utils/StringUtils.h
+++ b/libminifi/include/utils/StringUtils.h
@@ -33,6 +33,7 @@
 #include <type_traits>
 #include "utils/FailurePolicy.h"
 #include "utils/GeneralUtils.h"
+#include "utils/gsl.h"
 #include "utils/OptionalUtils.h"
 
 #if defined(WIN32) || (__cplusplus >= 201103L && (!defined(__GLIBCXX__) || (__cplusplus >= 201402L) ||  (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE > 4)))
@@ -134,7 +135,7 @@
    */
   static bool StringToFloat(std::string input, float &output, FailurePolicy cp = RETURN);
 
-  static std::string replaceEnvironmentVariables(std::string& original_string);
+  static std::string replaceEnvironmentVariables(std::string source_string);
 
   static std::string replaceOne(const std::string &input, const std::string &from, const std::string &to);
 
@@ -159,9 +160,9 @@
   }
 
   inline static std::string hex_ascii(const std::string& in) {
-    int len = in.length();
     std::string newString;
-    for (int i = 0; i < len; i += 2) {
+    newString.reserve(in.length() / 2);
+    for (size_t i = 0; i < in.length(); i += 2) {
       std::string sstr = in.substr(i, 2);
       char chr = (char) (int) strtol(sstr.c_str(), 0x00, 16); // NOLINT
       newString.push_back(chr);
@@ -498,7 +499,7 @@
 
   static std::pair<size_t, int> countOccurrences(const std::string &str, const std::string &pattern) {
     if (pattern.empty()) {
-      return {str.size(), str.size() + 1};
+      return {str.size(), gsl::narrow<int>(str.size() + 1)};
     }
 
     size_t last_pos = 0;
diff --git a/libminifi/include/utils/file/FileUtils.h b/libminifi/include/utils/file/FileUtils.h
index 603d171..721b455 100644
--- a/libminifi/include/utils/file/FileUtils.h
+++ b/libminifi/include/utils/file/FileUtils.h
@@ -85,6 +85,7 @@
 #include "core/logging/LoggerConfiguration.h"
 #include "utils/StringUtils.h"
 #include "utils/file/PathUtils.h"
+#include "utils/gsl.h"
 
 #ifndef S_ISDIR
 #define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
@@ -729,7 +730,7 @@
     }
     std::vector<char> buf(1024U);
     while (true) {
-      size_t ret = GetModuleFileNameA(hModule, buf.data(), buf.size());
+      size_t ret = GetModuleFileNameA(hModule, buf.data(), gsl::narrow<DWORD>(buf.size()));
       if (ret == 0U) {
         return "";
       }
diff --git a/libminifi/src/FlowControlProtocol.cpp b/libminifi/src/FlowControlProtocol.cpp
index 5a2b0e2..8d8ad4a 100644
--- a/libminifi/src/FlowControlProtocol.cpp
+++ b/libminifi/src/FlowControlProtocol.cpp
@@ -193,7 +193,7 @@
   data = this->encode(data, this->_controller->getName());
 
   // send it
-  int status = sendData(buffer.data(), size);
+  int status = sendData(buffer.data(), gsl::narrow<int>(size));
   buffer.clear();
   if (status <= 0) {
     utils::file::FileUtils::close(_socket);
@@ -287,7 +287,7 @@
   data = this->encode(data, this->_controller->getName());
 
   // send it
-  int status = sendData(buffer.data(), size);
+  int status = sendData(buffer.data(), gsl::narrow<int>(size));
   buffer.clear();
   if (status <= 0) {
     utils::file::FileUtils::close(_socket);
diff --git a/libminifi/src/FlowFileRecord.cpp b/libminifi/src/FlowFileRecord.cpp
index eec81bf..813137b 100644
--- a/libminifi/src/FlowFileRecord.cpp
+++ b/libminifi/src/FlowFileRecord.cpp
@@ -31,6 +31,7 @@
 #include "core/logging/LoggerConfiguration.h"
 #include "core/Relationship.h"
 #include "core/Repository.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -55,7 +56,7 @@
     logger_->log_error("NiFi FlowFile Store event %s can not found", key);
     return nullptr;
   }
-  io::BufferStream stream((const uint8_t*) value.data(), value.length());
+  io::BufferStream stream((const uint8_t*) value.data(), gsl::narrow<int>(value.length()));
 
   auto record = DeSerialize(stream, content_repo, container);
 
@@ -100,7 +101,7 @@
     return false;
   }
   // write flow attributes
-  uint32_t numAttributes = attributes_.size();
+  uint32_t numAttributes = gsl::narrow<uint32_t>(attributes_.size());
   ret = outStream.write(numAttributes);
   if (ret != 4) {
     return false;
diff --git a/libminifi/src/c2/C2Agent.cpp b/libminifi/src/c2/C2Agent.cpp
index 36ff43c..eb49f3f 100644
--- a/libminifi/src/c2/C2Agent.cpp
+++ b/libminifi/src/c2/C2Agent.cpp
@@ -660,12 +660,16 @@
   }
 
   std::string command = cwd + "/bin/minifi.sh restart";
-  system(command.c_str());
+  if (system(command.c_str()) != 0) {
+    logger_->log_warn("System command '%s' failed", command);
+  }
 }
 
 void C2Agent::update_agent() {
-  if (!system(update_command_.c_str())) {
-    logger_->log_warn("May not have command processor");
+  if (system(update_command_.c_str()) == 0) {
+    logger_->log_info("Executed update command '%s'", update_command_);
+  } else {
+    logger_->log_warn("Update command %s failed; may not have command processor", update_command_);
   }
 }
 
diff --git a/libminifi/src/c2/ControllerSocketProtocol.cpp b/libminifi/src/c2/ControllerSocketProtocol.cpp
index dd6464d..8322302 100644
--- a/libminifi/src/c2/ControllerSocketProtocol.cpp
+++ b/libminifi/src/c2/ControllerSocketProtocol.cpp
@@ -24,6 +24,7 @@
 #include <utility>
 #include <vector>
 
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 
 namespace org {
@@ -179,7 +180,7 @@
             io::BufferStream resp;
             resp.write(&head, 1);
             resp.write(response.str());
-            stream->write(const_cast<uint8_t*>(resp.getBuffer()), resp.size());
+            stream->write(const_cast<uint8_t*>(resp.getBuffer()), gsl::narrow<int>(resp.size()));
           } else if (what == "components") {
             io::BufferStream resp;
             resp.write(&head, 1);
@@ -189,7 +190,7 @@
               resp.write(component->getComponentName());
               resp.write(component->isRunning() ? "true" : "false");
             }
-            stream->write(const_cast<uint8_t*>(resp.getBuffer()), resp.size());
+            stream->write(const_cast<uint8_t*>(resp.getBuffer()), gsl::narrow<int>(resp.size()));
           } else if (what == "jstack") {
             io::BufferStream resp;
             resp.write(&head, 1);
@@ -205,7 +206,7 @@
                 resp.write(line);
               }
             }
-            stream->write(const_cast<uint8_t*>(resp.getBuffer()), resp.size());
+            stream->write(const_cast<uint8_t*>(resp.getBuffer()), gsl::narrow<int>(resp.size()));
           } else if (what == "connections") {
             io::BufferStream resp;
             resp.write(&head, 1);
@@ -214,7 +215,7 @@
             for (const auto &connection : queue_full_) {
               resp.write(connection.first, false);
             }
-            stream->write(const_cast<uint8_t*>(resp.getBuffer()), resp.size());
+            stream->write(const_cast<uint8_t*>(resp.getBuffer()), gsl::narrow<int>(resp.size()));
           } else if (what == "getfull") {
             std::vector<std::string> full_connections;
             {
@@ -232,7 +233,7 @@
             for (auto conn : full_connections) {
               resp.write(conn);
             }
-            stream->write(const_cast<uint8_t*>(resp.getBuffer()), resp.size());
+            stream->write(const_cast<uint8_t*>(resp.getBuffer()), gsl::narrow<int>(resp.size()));
           }
         }
         break;
diff --git a/libminifi/src/c2/protocols/RESTProtocol.cpp b/libminifi/src/c2/protocols/RESTProtocol.cpp
index 23a9e8d..8903c71 100644
--- a/libminifi/src/c2/protocols/RESTProtocol.cpp
+++ b/libminifi/src/c2/protocols/RESTProtocol.cpp
@@ -27,6 +27,7 @@
 #include <vector>
 
 #include "core/TypedValues.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -147,13 +148,13 @@
   rapidjson::Value valueVal;
   const char* c_key = key.c_str();
   auto base_type = value.getValue();
-  keyVal.SetString(c_key, key.length(), alloc);
+  keyVal.SetString(c_key, gsl::narrow<rapidjson::SizeType>(key.length()), alloc);
 
   auto type_index = base_type->getTypeIndex();
   if (auto sub_type = std::dynamic_pointer_cast<core::TransformableValue>(base_type)) {
     auto str = base_type->getStringValue();
     const char* c_val = str.c_str();
-    valueVal.SetString(c_val, str.length(), alloc);
+    valueVal.SetString(c_val, gsl::narrow<rapidjson::SizeType>(str.length()), alloc);
   } else {
     if (type_index == state::response::Value::BOOL_TYPE) {
       bool value = false;
@@ -178,7 +179,7 @@
     } else {
       auto str = base_type->getStringValue();
       const char* c_val = str.c_str();
-      valueVal.SetString(c_val, str.length(), alloc);
+      valueVal.SetString(c_val, gsl::narrow<rapidjson::SizeType>(str.length()), alloc);
     }
   }
   parent.AddMember(keyVal, valueVal, alloc);
@@ -186,7 +187,7 @@
 
 rapidjson::Value RESTProtocol::getStringValue(const std::string& value, rapidjson::Document::AllocatorType& alloc) {  // NOLINT
   rapidjson::Value Val;
-  Val.SetString(value.c_str(), value.length(), alloc);
+  Val.SetString(value.c_str(), gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
   return Val;
 }
 
@@ -215,7 +216,7 @@
     for (const auto &payload_content : content) {
       for (const auto& op_arg : payload_content.operation_arguments) {
         rapidjson::Value keyVal;
-        keyVal.SetString(op_arg.first.c_str(), op_arg.first.length(), alloc);
+        keyVal.SetString(op_arg.first.c_str(), gsl::narrow<rapidjson::SizeType>(op_arg.first.length()), alloc);
         if (is_parent_array) {
           target.PushBack(keyVal, alloc);
         } else {
@@ -253,7 +254,7 @@
 
   rapidjson::Value opReqStrVal;
   std::string operation_request_str = getOperation(payload);
-  opReqStrVal.SetString(operation_request_str.c_str(), operation_request_str.length(), alloc);
+  opReqStrVal.SetString(operation_request_str.c_str(), gsl::narrow<rapidjson::SizeType>(operation_request_str.length()), alloc);
   json_payload.AddMember("operation", opReqStrVal, alloc);
 
   std::string operationid = payload.getIdentifier();
diff --git a/libminifi/src/controllers/LinuxPowerManagementService.cpp b/libminifi/src/controllers/LinuxPowerManagementService.cpp
index 5707b1b..4fcdc59 100644
--- a/libminifi/src/controllers/LinuxPowerManagementService.cpp
+++ b/libminifi/src/controllers/LinuxPowerManagementService.cpp
@@ -24,6 +24,7 @@
 #include <utility>
 #include <vector>
 
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 
 namespace org {
@@ -135,7 +136,7 @@
   }
 
   // average
-  battery_level_ = battery_sum / paths_.size();
+  battery_level_ = battery_sum / gsl::narrow<int>(paths_.size());
 
   // only reduce if we're still going down OR we've triggered the low battery threshold
   if (battery_level_ < trigger_ && (battery_level_ < prev_level || battery_level_ < low_battery_trigger_)) {
diff --git a/libminifi/src/core/ContentSession.cpp b/libminifi/src/core/ContentSession.cpp
index 8d761d3..14221ca 100644
--- a/libminifi/src/core/ContentSession.cpp
+++ b/libminifi/src/core/ContentSession.cpp
@@ -22,6 +22,7 @@
 #include "ResourceClaim.h"
 #include "io/BaseStream.h"
 #include "Exception.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -71,8 +72,9 @@
     if (outStream == nullptr) {
       throw Exception(REPOSITORY_EXCEPTION, "Couldn't open the underlying resource for write: " + resource.first->getContentFullPath());
     }
-    const auto size = resource.second->size();
-    if (outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size) != size) {
+    const int size = gsl::narrow<int>(resource.second->size());
+    const int bytes_written = outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size);
+    if (bytes_written != size) {
       throw Exception(REPOSITORY_EXCEPTION, "Failed to write new resource: " + resource.first->getContentFullPath());
     }
   }
@@ -81,8 +83,9 @@
     if (outStream == nullptr) {
       throw Exception(REPOSITORY_EXCEPTION, "Couldn't open the underlying resource for append: " + resource.first->getContentFullPath());
     }
-    const auto size = resource.second->size();
-    if (outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size) != size) {
+    const int size = gsl::narrow<int>(resource.second->size());
+    const int bytes_written = outStream->write(const_cast<uint8_t*>(resource.second->getBuffer()), size);
+    if (bytes_written != size) {
       throw Exception(REPOSITORY_EXCEPTION, "Failed to append to resource: " + resource.first->getContentFullPath());
     }
   }
diff --git a/libminifi/src/core/ProcessSession.cpp b/libminifi/src/core/ProcessSession.cpp
index edb2a00..f8f885e 100644
--- a/libminifi/src/core/ProcessSession.cpp
+++ b/libminifi/src/core/ProcessSession.cpp
@@ -301,11 +301,11 @@
 
     stream->seek(flow->getOffset());
 
-    int ret = callback->process(stream);
+    auto ret = callback->process(stream);
     if (ret < 0) {
       throw Exception(FILE_OPERATION_EXCEPTION, "Failed to process flowfile content");
     }
-    return ret;
+    return gsl::narrow<int>(ret);
   } catch (std::exception &exception) {
     logger_->log_debug("Caught Exception %s", exception.what());
     throw;
@@ -326,7 +326,7 @@
  */
 void ProcessSession::importFrom(io::InputStream &stream, const std::shared_ptr<core::FlowFile> &flow) {
   std::shared_ptr<ResourceClaim> claim = content_session_->create();
-  size_t max_read = getpagesize();
+  int max_read = getpagesize();
   std::vector<uint8_t> charBuffer(max_read);
 
   try {
@@ -336,10 +336,10 @@
     if (nullptr == content_stream) {
       throw Exception(FILE_OPERATION_EXCEPTION, "Could not obtain claim for " + claim->getContentFullPath());
     }
-    size_t position = 0;
-    const size_t max_size = stream.size();
+    int position = 0;
+    const int max_size = gsl::narrow<int>(stream.size());
     while (position < max_size) {
-      const size_t read_size = std::min(max_read, max_size - position);
+      const int read_size = std::min(max_read, max_size - position);
       stream.read(charBuffer, read_size);
 
       content_stream->write(charBuffer.data(), read_size);
@@ -395,7 +395,7 @@
       while (input.good()) {
         input.read(reinterpret_cast<char*>(charBuffer.data()), size);
         if (input) {
-          if (stream->write(charBuffer.data(), size) < 0) {
+          if (stream->write(charBuffer.data(), gsl::narrow<int>(size)) < 0) {
             invalidWrite = true;
             break;
           }
diff --git a/libminifi/src/core/reporting/SiteToSiteProvenanceReportingTask.cpp b/libminifi/src/core/reporting/SiteToSiteProvenanceReportingTask.cpp
index 621370e..7dc203e 100644
--- a/libminifi/src/core/reporting/SiteToSiteProvenanceReportingTask.cpp
+++ b/libminifi/src/core/reporting/SiteToSiteProvenanceReportingTask.cpp
@@ -17,6 +17,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include <rapidjson/document.h>
+#include <rapidjson/writer.h>
+#include <rapidjson/stringbuffer.h>
+#include <rapidjson/prettywriter.h>
+
 #include <vector>
 #include <queue>
 #include <map>
@@ -27,6 +32,7 @@
 #include <functional>
 #include <iostream>
 #include <utility>
+
 #include "core/Repository.h"
 #include "core/reporting/SiteToSiteProvenanceReportingTask.h"
 #include "../include/io/StreamFactory.h"
@@ -36,12 +42,7 @@
 #include "core/ProcessSession.h"
 #include "provenance/Provenance.h"
 #include "FlowController.h"
-
-#include "rapidjson/document.h"
-#include "rapidjson/writer.h"
-#include "rapidjson/stringbuffer.h"
-#include "rapidjson/prettywriter.h"
-
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -62,35 +63,35 @@
   const char* c_key = key.c_str();
   const char* c_val = value.c_str();
 
-  keyVal.SetString(c_key, key.length(), alloc);
-  valueVal.SetString(c_val, value.length(), alloc);
+  keyVal.SetString(c_key, gsl::narrow<rapidjson::SizeType>(key.length()), alloc);
+  valueVal.SetString(c_val, gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
 
   parent.AddMember(keyVal, valueVal, alloc);
 }
 
 rapidjson::Value getStringValue(const std::string& value, rapidjson::Document::AllocatorType& alloc) {
   rapidjson::Value Val;
-  Val.SetString(value.c_str(), value.length(), alloc);
+  Val.SetString(value.c_str(), gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
   return Val;
 }
 
 template<size_t N>
 rapidjson::Value getStringValue(const utils::SmallString<N>& value, rapidjson::Document::AllocatorType& alloc) {
   rapidjson::Value Val;
-  Val.SetString(value.c_str(), value.length(), alloc);
+  Val.SetString(value.c_str(), gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
   return Val;
 }
 
 void appendJsonStr(const std::string& value, rapidjson::Value& parent, rapidjson::Document::AllocatorType& alloc) {
   rapidjson::Value valueVal;
-  valueVal.SetString(value.c_str(), value.length(), alloc);
+  valueVal.SetString(value.c_str(), gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
   parent.PushBack(valueVal, alloc);
 }
 
 template<size_t N>
 void appendJsonStr(const utils::SmallString<N>& value, rapidjson::Value& parent, rapidjson::Document::AllocatorType& alloc) {
   rapidjson::Value valueVal;
-  valueVal.SetString(value.c_str(), value.length(), alloc);
+  valueVal.SetString(value.c_str(), gsl::narrow<rapidjson::SizeType>(value.length()), alloc);
   parent.PushBack(valueVal, alloc);
 }
 
@@ -144,7 +145,7 @@
     recordJson.AddMember("childIds", childUuidJson, alloc);
 
     rapidjson::Value applicationVal;
-    applicationVal.SetString(ProvenanceAppStr, std::strlen(ProvenanceAppStr));
+    applicationVal.SetString(ProvenanceAppStr, gsl::narrow<rapidjson::SizeType>(std::strlen(ProvenanceAppStr)));
     recordJson.AddMember("application", applicationVal, alloc);
 
     array.PushBack(recordJson, alloc);
diff --git a/libminifi/src/core/yaml/YamlConfiguration.cpp b/libminifi/src/core/yaml/YamlConfiguration.cpp
index 2f33f0b..2a9b17d 100644
--- a/libminifi/src/core/yaml/YamlConfiguration.cpp
+++ b/libminifi/src/core/yaml/YamlConfiguration.cpp
@@ -134,8 +134,7 @@
         auto lastOfIdx = procCfg.javaClass.find_last_of(".");
         if (lastOfIdx != std::string::npos) {
           lastOfIdx++;  // if a value is found, increment to move beyond the .
-          int nameLength = procCfg.javaClass.length() - lastOfIdx;
-          std::string processorName = procCfg.javaClass.substr(lastOfIdx, nameLength);
+          std::string processorName = procCfg.javaClass.substr(lastOfIdx);
           processor = this->createProcessor(processorName, procCfg.javaClass, uuid);
         } else {
           // Allow unqualified class names for core processors
@@ -498,8 +497,7 @@
           auto lastOfIdx = type.find_last_of(".");
           if (lastOfIdx != std::string::npos) {
             lastOfIdx++;  // if a value is found, increment to move beyond the .
-            int nameLength = type.length() - lastOfIdx;
-            type = type.substr(lastOfIdx, nameLength);
+            type = type.substr(lastOfIdx);
           }
 
           auto name = controllerServiceNode["name"].as<std::string>();
diff --git a/libminifi/src/io/BufferStream.cpp b/libminifi/src/io/BufferStream.cpp
index 3816ce9..6d3ebab 100644
--- a/libminifi/src/io/BufferStream.cpp
+++ b/libminifi/src/io/BufferStream.cpp
@@ -18,7 +18,9 @@
 #include <cstdint>
 #include <algorithm>
 #include <cstring>
+
 #include "io/BufferStream.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -36,7 +38,8 @@
 
 int BufferStream::read(uint8_t *buf, int len) {
   gsl_Expects(len >= 0);
-  len = (std::min<uint64_t>)(len, buffer_.size() - readOffset_);
+  int bytes_available_in_buffer = gsl::narrow<int>(buffer_.size() - readOffset_);
+  len = std::min(len, bytes_available_in_buffer);
   auto begin = buffer_.begin() + readOffset_;
   std::copy(begin, begin + len, buf);
 
diff --git a/libminifi/src/io/InputStream.cpp b/libminifi/src/io/InputStream.cpp
index 9905abf..cdd101e 100644
--- a/libminifi/src/io/InputStream.cpp
+++ b/libminifi/src/io/InputStream.cpp
@@ -21,6 +21,7 @@
 #include <string>
 #include <algorithm>
 #include "io/InputStream.h"
+#include "utils/gsl.h"
 #include "utils/OptionalUtils.h"
 
 namespace org {
@@ -30,7 +31,7 @@
 namespace io {
 
 int InputStream::read(std::vector<uint8_t>& buffer, int len) {
-  if (buffer.size() < len) {
+  if (buffer.size() < gsl::narrow<size_t>(len)) {
     buffer.resize(len);
   }
   int ret = read(buffer.data(), len);
@@ -83,7 +84,8 @@
   }
 
   std::vector<uint8_t> buffer(len);
-  if (read(buffer.data(), len) != len) {
+  uint32_t bytes_read = gsl::narrow<uint32_t>(read(buffer.data(), len));
+  if (bytes_read != len) {
     return -1;
   }
 
diff --git a/libminifi/src/io/OutputStream.cpp b/libminifi/src/io/OutputStream.cpp
index 4f82c63..355cea7 100644
--- a/libminifi/src/io/OutputStream.cpp
+++ b/libminifi/src/io/OutputStream.cpp
@@ -22,6 +22,7 @@
 #include <string>
 #include <algorithm>
 #include "io/OutputStream.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -30,7 +31,7 @@
 namespace io {
 
 int OutputStream::write(const std::vector<uint8_t>& buffer, int len) {
-  if (buffer.size() < len) {
+  if (buffer.size() < gsl::narrow<size_t>(len)) {
     return -1;
   }
   return write(buffer.data(), len);
@@ -46,11 +47,11 @@
 }
 
 int OutputStream::write(const std::string& str, bool widen) {
-  return write_str(str.c_str(), str.length(), widen);
+  return write_str(str.c_str(), gsl::narrow<uint32_t>(str.length()), widen);
 }
 
 int OutputStream::write(const char* str, bool widen) {
-  return write_str(str, std::strlen(str), widen);
+  return write_str(str, gsl::narrow<uint32_t>(std::strlen(str)), widen);
 }
 
 int OutputStream::write_str(const char* str, uint32_t len, bool widen) {
diff --git a/libminifi/src/io/ZlibStream.cpp b/libminifi/src/io/ZlibStream.cpp
index 8e58dc5..e944f3a 100644
--- a/libminifi/src/io/ZlibStream.cpp
+++ b/libminifi/src/io/ZlibStream.cpp
@@ -18,6 +18,8 @@
 
 #include "io/ZlibStream.h"
 #include "Exception.h"
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -81,7 +83,7 @@
     logger_->log_trace("writeData has %u B of input data left", strm_.avail_in);
 
     strm_.next_out = outputBuffer_.data();
-    strm_.avail_out = outputBuffer_.size();
+    strm_.avail_out = gsl::narrow<uInt>(outputBuffer_.size());
 
     int flush = value == nullptr ? Z_FINISH : Z_NO_FLUSH;
     logger_->log_trace("calling deflate with flush %d", flush);
@@ -92,7 +94,7 @@
       state_ = ZlibStreamState::ERRORED;
       return -1;
     }
-    int output_size = outputBuffer_.size() - strm_.avail_out;
+    int output_size = gsl::narrow<int>(outputBuffer_.size() - strm_.avail_out);
     logger_->log_trace("deflate produced %d B of output data", output_size);
     if (output_->write(outputBuffer_.data(), output_size) != output_size) {
       logger_->log_error("Failed to write to underlying stream");
@@ -149,7 +151,7 @@
     logger_->log_trace("writeData has %u B of input data left", strm_.avail_in);
 
     strm_.next_out = outputBuffer_.data();
-    strm_.avail_out = outputBuffer_.size();
+    strm_.avail_out = gsl::narrow<uInt>(outputBuffer_.size());
 
     ret = inflate(&strm_, Z_NO_FLUSH);
     if (ret == Z_STREAM_ERROR ||
@@ -160,7 +162,7 @@
       state_ = ZlibStreamState::ERRORED;
       return -1;
     }
-    int output_size = outputBuffer_.size() - strm_.avail_out;
+    int output_size = gsl::narrow<int>(outputBuffer_.size() - strm_.avail_out);
     logger_->log_trace("deflate produced %d B of output data", output_size);
     if (output_->write(outputBuffer_.data(), output_size) != output_size) {
       logger_->log_error("Failed to write to underlying stream");
diff --git a/libminifi/src/provenance/Provenance.cpp b/libminifi/src/provenance/Provenance.cpp
index 5bedec6..bff5e1d 100644
--- a/libminifi/src/provenance/Provenance.cpp
+++ b/libminifi/src/provenance/Provenance.cpp
@@ -17,16 +17,19 @@
  */
 
 #include "provenance/Provenance.h"
+
 #include <cstdint>
 #include <memory>
 #include <string>
 #include <vector>
 #include <list>
+
 #include "core/Repository.h"
 #include "io/BufferStream.h"
 #include "core/logging/Logger.h"
 #include "core/Relationship.h"
 #include "FlowController.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -71,7 +74,7 @@
     logger_->log_debug("NiFi Provenance Read event %s", getUUIDStr());
   }
 
-  org::apache::nifi::minifi::io::BufferStream stream((const uint8_t*) value.data(), value.length());
+  org::apache::nifi::minifi::io::BufferStream stream((const uint8_t*) value.data(), gsl::narrow<int>(value.length()));
 
   ret = DeSerialize(stream);
 
@@ -139,7 +142,7 @@
   }
 
   // write flow attributes
-  uint32_t numAttributes = this->_attributes.size();
+  uint32_t numAttributes = gsl::narrow<uint32_t>(this->_attributes.size());
   ret = outStream.write(numAttributes);
   if (ret != 4) {
     return false;
@@ -178,8 +181,8 @@
 
   if (this->_eventType == ProvenanceEventRecord::FORK || this->_eventType == ProvenanceEventRecord::CLONE || this->_eventType == ProvenanceEventRecord::JOIN) {
     // write UUIDs
-    uint32_t number = this->_parentUuids.size();
-    ret = outStream.write(number);
+    uint32_t parent_uuids_count = gsl::narrow<uint32_t>(this->_parentUuids.size());
+    ret = outStream.write(parent_uuids_count);
     if (ret != 4) {
       return false;
     }
@@ -189,8 +192,8 @@
         return false;
       }
     }
-    number = this->_childrenUuids.size();
-    ret = outStream.write(number);
+    uint32_t children_uuids_count = gsl::narrow<uint32_t>(this->_childrenUuids.size());
+    ret = outStream.write(children_uuids_count);
     if (ret != 4) {
       return false;
     }
@@ -234,7 +237,7 @@
 bool ProvenanceEventRecord::DeSerialize(const uint8_t *buffer, const size_t bufferSize) {
   int ret;
 
-  org::apache::nifi::minifi::io::BufferStream outStream(buffer, bufferSize);
+  org::apache::nifi::minifi::io::BufferStream outStream(buffer, gsl::narrow<unsigned int>(bufferSize));
 
   ret = outStream.read(uuid_);
   if (ret <= 0) {
diff --git a/libminifi/src/serialization/FlowFileV3Serializer.cpp b/libminifi/src/serialization/FlowFileV3Serializer.cpp
index 34a1087..1fa30a7 100644
--- a/libminifi/src/serialization/FlowFileV3Serializer.cpp
+++ b/libminifi/src/serialization/FlowFileV3Serializer.cpp
@@ -18,6 +18,7 @@
 
 #include "serialization/FlowFileV3Serializer.h"
 #include "core/ProcessSession.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -53,11 +54,11 @@
     return ret;
   }
   sum += ret;
-  ret = out->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), str.length());
+  ret = out->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), gsl::narrow<int>(str.length()));
   if (ret < 0) {
     return ret;
   }
-  if (ret != str.length()) {
+  if (gsl::narrow<size_t>(ret) != str.length()) {
     return -1;
   }
   sum += ret;
diff --git a/libminifi/src/sitetosite/RawSocketProtocol.cpp b/libminifi/src/sitetosite/RawSocketProtocol.cpp
index 5f1b55c..7ea213f 100644
--- a/libminifi/src/sitetosite/RawSocketProtocol.cpp
+++ b/libminifi/src/sitetosite/RawSocketProtocol.cpp
@@ -31,6 +31,7 @@
 #include "sitetosite/RawSocketProtocol.h"
 #include "io/CRCStream.h"
 #include "sitetosite/Peer.h"
+#include "utils/gsl.h"
 
 namespace org {
 namespace apache {
@@ -262,7 +263,7 @@
     }
   }
 
-  uint32_t size = properties.size();
+  uint32_t size = gsl::narrow<uint32_t>(properties.size());
   ret = peer_->write(size);
   if (ret <= 0) {
     return false;
diff --git a/libminifi/src/sitetosite/SiteToSiteClient.cpp b/libminifi/src/sitetosite/SiteToSiteClient.cpp
index 59d936b..2eabfa1 100644
--- a/libminifi/src/sitetosite/SiteToSiteClient.cpp
+++ b/libminifi/src/sitetosite/SiteToSiteClient.cpp
@@ -16,9 +16,13 @@
  * limitations under the License.
  */
 #include "sitetosite/SiteToSiteClient.h"
+
 #include <map>
 #include <string>
 #include <memory>
+
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -60,7 +64,7 @@
     if (ret <= 0)
       return -1;
   }
-  return 3 + message.size();
+  return gsl::narrow<int>(3 + message.size());
 }
 
 void SiteToSiteClient::deleteTransaction(const utils::Identifier& transactionID) {
@@ -441,7 +445,7 @@
     }
   }
   // start to read the packet
-  uint32_t numAttributes = packet->_attributes.size();
+  uint32_t numAttributes = gsl::narrow<uint32_t>(packet->_attributes.size());
   ret = transaction->getStream().write(numAttributes);
   if (ret != 4) {
     return -1;
diff --git a/libminifi/src/utils/ByteArrayCallback.cpp b/libminifi/src/utils/ByteArrayCallback.cpp
index c4545ec..33c9634 100644
--- a/libminifi/src/utils/ByteArrayCallback.cpp
+++ b/libminifi/src/utils/ByteArrayCallback.cpp
@@ -16,10 +16,14 @@
  * limitations under the License.
  */
 #include "utils/ByteArrayCallback.h"
+
 #include <vector>
 #include <utility>
 #include <string>
 #include <memory>
+
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -31,7 +35,7 @@
   if (stream->size() > 0) {
     std::unique_ptr<char> buffer = std::unique_ptr<char>(new char[stream->size()]);
     readFully(buffer.get(), stream->size());
-    stream->read(reinterpret_cast<uint8_t*>(buffer.get()), stream->size());
+    stream->read(reinterpret_cast<uint8_t*>(buffer.get()), gsl::narrow<int>(stream->size()));
     return stream->size();
   }
   return size_.load();
@@ -41,7 +45,7 @@
   stream->seek(0);
   std::unique_ptr<char> buffer = std::unique_ptr<char>(new char[size_.load()]);
   auto written = readFully(buffer.get(), size_);
-  stream->write(reinterpret_cast<uint8_t*>(buffer.get()), written);
+  stream->write(reinterpret_cast<uint8_t*>(buffer.get()), gsl::narrow<int>(written));
   return stream->size();
 }
 
diff --git a/libminifi/src/utils/Environment.cpp b/libminifi/src/utils/Environment.cpp
index 35a7763..edc426f 100644
--- a/libminifi/src/utils/Environment.cpp
+++ b/libminifi/src/utils/Environment.cpp
@@ -28,6 +28,8 @@
 #include <vector>
 #include <iostream>
 
+#include "utils/gsl.h"
+
 namespace org {
 namespace apache {
 namespace nifi {
@@ -52,7 +54,7 @@
     // GetEnvironmentVariableA does not set last error to 0 on success, so an error from a pervious API call would influence the GetLastError() later,
     // so we set the last error to 0 before calling
     SetLastError(ERROR_SUCCESS);
-    uint32_t ret = GetEnvironmentVariableA(name, buffer.data(), buffer.size());
+    uint32_t ret = GetEnvironmentVariableA(name, buffer.data(), gsl::narrow<DWORD>(buffer.size()));
     if (ret > 0U) {
       exists = true;
       value = std::string(buffer.data(), ret);
@@ -118,7 +120,7 @@
     // the return value specifies the required size of the buffer,
     // in characters, including the null-terminating character."
     while (true) {
-      len = GetCurrentDirectoryA(buffer.size(), buffer.data());
+      len = GetCurrentDirectoryA(gsl::narrow<DWORD>(buffer.size()), buffer.data());
       if (len < buffer.size()) {
         break;
       }
diff --git a/libminifi/src/utils/StringUtils.cpp b/libminifi/src/utils/StringUtils.cpp
index e80adf1..7a02720 100644
--- a/libminifi/src/utils/StringUtils.cpp
+++ b/libminifi/src/utils/StringUtils.cpp
@@ -94,37 +94,36 @@
   return true;
 }
 
-std::string StringUtils::replaceEnvironmentVariables(std::string& original_string) {
-  int32_t beg_seq = 0;
-  int32_t end_seq = 0;
-  std::string source_string = original_string;
+std::string StringUtils::replaceEnvironmentVariables(std::string source_string) {
+  std::string::size_type beg_seq = 0;
+  std::string::size_type end_seq = 0;
   do {
     beg_seq = source_string.find("${", beg_seq);
+    if (beg_seq == std::string::npos) {
+      break;
+    }
     if (beg_seq > 0 && source_string.at(beg_seq - 1) == '\\') {
       beg_seq += 2;
       continue;
     }
-    if (beg_seq < 0)
-      break;
     end_seq = source_string.find("}", beg_seq + 2);
-    if (end_seq < 0)
+    if (end_seq == std::string::npos) {
       break;
-    if (end_seq - (beg_seq + 2) < 0) {
+    }
+    if (end_seq <= beg_seq + 2) {
       beg_seq += 2;
       continue;
     }
-    const std::string env_field = source_string.substr(beg_seq + 2, end_seq - (beg_seq + 2));
-    const std::string env_field_wrapped = source_string.substr(beg_seq, end_seq + 1);
-    if (env_field.empty()) {
-      continue;
-    }
+    auto env_var_length = end_seq - (beg_seq + 2);
+    const std::string env_var = source_string.substr(beg_seq + 2, env_var_length);
+    const std::string env_var_wrapped = source_string.substr(beg_seq, env_var_length + 3);
 
     std::string env_value;
-    std::tie(std::ignore, env_value) = utils::Environment::getEnvironmentVariable(env_field.c_str());
+    std::tie(std::ignore, env_value) = utils::Environment::getEnvironmentVariable(env_var.c_str());
 
-    source_string = replaceAll(source_string, env_field_wrapped, env_value);
+    source_string = replaceAll(source_string, env_var_wrapped, env_value);
     beg_seq = 0;  // restart
-  } while (beg_seq >= 0);
+  } while (beg_seq < source_string.size());
 
   source_string = replaceAll(source_string, "\\$", "$");
 
diff --git a/libminifi/src/utils/file/PathUtils.cpp b/libminifi/src/utils/file/PathUtils.cpp
index 394c2e2..4923845 100644
--- a/libminifi/src/utils/file/PathUtils.cpp
+++ b/libminifi/src/utils/file/PathUtils.cpp
@@ -64,7 +64,7 @@
   std::vector<char> buffer(MAX_PATH);
   uint32_t len = 0U;
   while (true) {
-    len = GetFullPathNameA(path.c_str(), buffer.size(), buffer.data(), nullptr /*lpFilePart*/);
+    len = GetFullPathNameA(path.c_str(), gsl::narrow<DWORD>(buffer.size()), buffer.data(), nullptr /*lpFilePart*/);
     if (len < buffer.size()) {
       break;
     }
diff --git a/libminifi/src/utils/tls/TLSUtils.cpp b/libminifi/src/utils/tls/TLSUtils.cpp
index 046be91..24be2e7 100644
--- a/libminifi/src/utils/tls/TLSUtils.cpp
+++ b/libminifi/src/utils/tls/TLSUtils.cpp
@@ -20,6 +20,7 @@
 #include <cstring>
 #include <string>
 
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 
 namespace org {
@@ -45,7 +46,7 @@
     // a null terminator. Per their documentation:
     // "The actual length of the password must be returned to the calling function. "
     memset(buf, 0x00, size);
-    return pass.copy(buf, size);
+    return gsl::narrow<int>(pass.copy(buf, size));
   }
   return -1;
 }
diff --git a/libminifi/test/BufferReader.h b/libminifi/test/BufferReader.h
index 783c95b..2b4bf73 100644
--- a/libminifi/test/BufferReader.h
+++ b/libminifi/test/BufferReader.h
@@ -20,6 +20,7 @@
 #define NIFI_MINIFI_CPP_BUFFERREADER_H
 
 #include "FlowFileRecord.h"
+#include "utils/gsl.h"
 
 class BufferReader : public org::apache::nifi::minifi::InputStreamCallback {
  public:
@@ -30,7 +31,7 @@
     std::size_t remaining_len = len;
     int total_read = 0;
     while (remaining_len > 0) {
-      auto ret = input.read(tmpBuffer, std::min(remaining_len, sizeof(tmpBuffer)));
+      auto ret = input.read(tmpBuffer, gsl::narrow<int>(std::min(remaining_len, sizeof(tmpBuffer))));
       if (ret == 0) break;
       if (ret < 0) return ret;
       remaining_len -= ret;
diff --git a/libminifi/test/archive-tests/MergeFileTests.cpp b/libminifi/test/archive-tests/MergeFileTests.cpp
index 384f9f1..60e233f 100644
--- a/libminifi/test/archive-tests/MergeFileTests.cpp
+++ b/libminifi/test/archive-tests/MergeFileTests.cpp
@@ -39,6 +39,7 @@
 #include "serialization/FlowFileV3Serializer.h"
 #include "serialization/PayloadSerializer.h"
 #include "../Utils.h"
+#include "utils/gsl.h"
 
 std::string FLOW_FILE;
 std::string EXPECT_MERGE_CONTENT_FIRST;
@@ -87,7 +88,7 @@
     REQUIRE(size_ + len <= capacity_);
     int total_read = 0;
     do {
-      auto ret = input.read(end(), len);
+      auto ret = input.read(end(), gsl::narrow<int>(len));
       if (ret == 0) break;
       if (ret < 0) return ret;
       size_ += ret;
@@ -111,7 +112,7 @@
    public:
     explicit ArchiveEntryReader(archive* arch) : arch(arch) {}
     int read(uint8_t* out, std::size_t len) {
-      return archive_read_data(arch, out, len);
+      return gsl::narrow<int>(archive_read_data(arch, out, len));
     }
    private:
     archive* arch;
@@ -677,7 +678,7 @@
 }
 
 void writeString(const std::string& str, const std::shared_ptr<minifi::io::BaseStream>& out) {
-  out->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), str.length());
+  out->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), gsl::narrow<int>(str.length()));
 }
 
 TEST_CASE("FlowFile serialization", "[testFlowFileSerialization]") {
diff --git a/libminifi/test/archive-tests/util/ArchiveTests.cpp b/libminifi/test/archive-tests/util/ArchiveTests.cpp
index 5f94cf9..a643b26 100644
--- a/libminifi/test/archive-tests/util/ArchiveTests.cpp
+++ b/libminifi/test/archive-tests/util/ArchiveTests.cpp
@@ -19,15 +19,16 @@
  */
 #include "ArchiveTests.h"
 
+#include <archive.h>
+#include <archive_entry.h>
+
 #include <algorithm>
 #include <set>
 #include <string>
 #include <utility>
 
-#include <archive.h> // NOLINT
-#include <archive_entry.h> // NOLINT
-
 #include "../../TestBase.h"
+#include "utils/gsl.h"
 
 TAE_MAP_T build_test_archive_map(int NUM_FILES, const char** FILE_NAMES, const char** FILE_CONTENT) {
   TAE_MAP_T test_entries;
@@ -138,13 +139,12 @@
       REQUIRE(size == test_entry.size);
 
       if (size > 0) {
-        int rlen, nlen = 0;
+        size_t nlen = 0;
         std::vector<char> buf(size);
         bool read_ok = true;
 
         for (;;) {
-          rlen = archive_read_data(a, buf.data(), size);
-          nlen += rlen;
+          const auto rlen = archive_read_data(a, buf.data(), size);
           if (rlen == 0)
             break;
           if (rlen < 0) {
@@ -152,6 +152,7 @@
             read_ok = false;
             break;
           }
+          nlen += rlen;
         }
 
         if (read_ok) {
diff --git a/libminifi/test/persistence-tests/PersistenceTests.cpp b/libminifi/test/persistence-tests/PersistenceTests.cpp
index 962ab40..7919426 100644
--- a/libminifi/test/persistence-tests/PersistenceTests.cpp
+++ b/libminifi/test/persistence-tests/PersistenceTests.cpp
@@ -34,6 +34,7 @@
 #include "../test/BufferReader.h"
 #include "core/repository/VolatileFlowFileRepository.h"
 #include "../../extensions/rocksdb-repos/DatabaseContentRepository.h"
+#include "utils/gsl.h"
 #include "utils/IntegrationTestUtils.h"
 
 using Connection = minifi::Connection;
@@ -95,7 +96,7 @@
     processor->onSchedule(processorContext.get(), new core::ProcessSessionFactory(processorContext));
   }
   std::shared_ptr<core::FlowFile> write(const std::string& data) {
-    minifi::io::BufferStream stream(reinterpret_cast<const uint8_t*>(data.c_str()), data.length());
+    minifi::io::BufferStream stream(reinterpret_cast<const uint8_t*>(data.c_str()), gsl::narrow<int>(data.length()));
     core::ProcessSession sessionGenFlowFile(inputContext);
     std::shared_ptr<core::FlowFile> flow = std::static_pointer_cast<core::FlowFile>(sessionGenFlowFile.create());
     sessionGenFlowFile.importFrom(stream, flow);
@@ -246,7 +247,7 @@
   void onTrigger(core::ProcessContext* /*context*/, core::ProcessSession *session) override {
     auto ff = session->get();
     std::string data = "<override>";
-    minifi::io::BufferStream stream(reinterpret_cast<const uint8_t*>(data.c_str()), data.length());
+    minifi::io::BufferStream stream(reinterpret_cast<const uint8_t*>(data.c_str()), gsl::narrow<int>(data.length()));
     session->importFrom(stream, ff);
     session->transfer(ff, {"success", "d"});
   }
diff --git a/libminifi/test/rocksdb-tests/ContentSessionTests.cpp b/libminifi/test/rocksdb-tests/ContentSessionTests.cpp
index ecc987c..0b58d0d 100644
--- a/libminifi/test/rocksdb-tests/ContentSessionTests.cpp
+++ b/libminifi/test/rocksdb-tests/ContentSessionTests.cpp
@@ -25,6 +25,7 @@
 #include "DatabaseContentRepository.h"
 #include "FlowFileRecord.h"
 #include "../TestBase.h"
+#include "utils/gsl.h"
 
 template<typename ContentRepositoryClass>
 class ContentSessionController : public TestController {
@@ -46,7 +47,8 @@
 };
 
 const std::shared_ptr<minifi::io::BaseStream>& operator<<(const std::shared_ptr<minifi::io::BaseStream>& stream, const std::string& str) {
-  REQUIRE(stream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), str.length()) == str.length());
+  int length = gsl::narrow<int>(str.length());
+  REQUIRE(stream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str.data())), length) == length);
   return stream;
 }
 
diff --git a/libminifi/test/rocksdb-tests/RepoTests.cpp b/libminifi/test/rocksdb-tests/RepoTests.cpp
index 6f21ce1..9248dc8 100644
--- a/libminifi/test/rocksdb-tests/RepoTests.cpp
+++ b/libminifi/test/rocksdb-tests/RepoTests.cpp
@@ -31,6 +31,7 @@
 #include "properties/Configure.h"
 #include "../unit/ProvenanceTestHelper.h"
 #include "../TestBase.h"
+#include "utils/gsl.h"
 #include "utils/IntegrationTestUtils.h"
 
 namespace {
@@ -292,7 +293,7 @@
       prov_repo, ff_repository, config, std::move(flowConfig), content_repo, "", true);
 
   std::string data = "banana";
-  minifi::io::BufferStream content(reinterpret_cast<const uint8_t*>(data.c_str()), data.length());
+  minifi::io::BufferStream content(reinterpret_cast<const uint8_t*>(data.c_str()), gsl::narrow<int>(data.length()));
 
   /**
    * Currently it is the Connection's responsibility to persist the incoming
diff --git a/libminifi/test/unit/CRCTests.cpp b/libminifi/test/unit/CRCTests.cpp
index 6880eee..17c62da 100644
--- a/libminifi/test/unit/CRCTests.cpp
+++ b/libminifi/test/unit/CRCTests.cpp
@@ -21,6 +21,7 @@
 #include "io/CRCStream.h"
 #include "io/BufferStream.h"
 #include "../TestBase.h"
+#include "utils/gsl.h"
 
 TEST_CASE("Test CRC1", "[testcrc1]") {
   org::apache::nifi::minifi::io::BufferStream base;
@@ -34,7 +35,7 @@
   org::apache::nifi::minifi::io::CRCStream<org::apache::nifi::minifi::io::BaseStream> test(gsl::make_not_null(&base));
   std::string fox = "the quick brown fox jumped over the brown fox";
   std::vector<uint8_t> charvect(fox.begin(), fox.end());
-  test.write(charvect, charvect.size());
+  test.write(charvect, gsl::narrow<int>(charvect.size()));
   REQUIRE(1922388889 == test.getCRC());
 }
 
@@ -73,8 +74,8 @@
   std::vector<uint8_t> textVector1(textString.begin(), textString.end());
   std::vector<uint8_t> textVector2(textString.begin(), textString.end());
 
-  test_noinit.write(textVector1, textVector1.size());
-  test_initzero.write(textVector2, textVector2.size());
+  test_noinit.write(textVector1, gsl::narrow<int>(textVector1.size()));
+  test_initzero.write(textVector2, gsl::narrow<int>(textVector2.size()));
   REQUIRE(test_noinit.getCRC() == test_initzero.getCRC());
 }
 
@@ -84,17 +85,17 @@
   org::apache::nifi::minifi::io::BufferStream base_full;
   org::apache::nifi::minifi::io::CRCStream<org::apache::nifi::minifi::io::BaseStream> test_full(gsl::make_not_null(&base_full), 0);
   std::vector<uint8_t> textVector_full(textString.begin(), textString.end());
-  test_full.write(textVector_full, textVector_full.size());
+  test_full.write(textVector_full, gsl::narrow<int>(textVector_full.size()));
 
   org::apache::nifi::minifi::io::BufferStream base_piece1;
   org::apache::nifi::minifi::io::CRCStream<org::apache::nifi::minifi::io::BaseStream> test_piece1(gsl::make_not_null(&base_piece1), 0);
   std::vector<uint8_t> textVector_piece1(textString.begin(), textString.begin() + 15);
-  test_piece1.write(textVector_piece1, textVector_piece1.size());
+  test_piece1.write(textVector_piece1, gsl::narrow<int>(textVector_piece1.size()));
 
   org::apache::nifi::minifi::io::BufferStream base_piece2;
   org::apache::nifi::minifi::io::CRCStream<org::apache::nifi::minifi::io::BaseStream> test_piece2(gsl::make_not_null(&base_piece2), test_piece1.getCRC());
   std::vector<uint8_t> textVector_piece2(textString.begin() + 15, textString.end());
-  test_piece2.write(textVector_piece2, textVector_piece2.size());
+  test_piece2.write(textVector_piece2, gsl::narrow<int>(textVector_piece2.size()));
 
   REQUIRE(test_full.getCRC() == test_piece2.getCRC());
 }
diff --git a/libminifi/test/unit/EncryptionUtilsTests.cpp b/libminifi/test/unit/EncryptionUtilsTests.cpp
index 977be35..934b889 100644
--- a/libminifi/test/unit/EncryptionUtilsTests.cpp
+++ b/libminifi/test/unit/EncryptionUtilsTests.cpp
@@ -73,7 +73,7 @@
   utils::crypto::Bytes key = utils::crypto::generateKey();
   std::string plaintext = "my social security number is 914-52-5373";
 
-  const auto base64_length = [](int raw_length) { return (raw_length + 2) / 3 * 4; };
+  const auto base64_length = [](size_t raw_length) { return (raw_length + 2) / 3 * 4; };
 
   std::string encrypted_text = utils::crypto::encrypt(plaintext, key);
   REQUIRE(encrypted_text.size() ==
diff --git a/libminifi/test/unit/FileStreamTests.cpp b/libminifi/test/unit/FileStreamTests.cpp
index 66d2c15..5a74035 100644
--- a/libminifi/test/unit/FileStreamTests.cpp
+++ b/libminifi/test/unit/FileStreamTests.cpp
@@ -23,6 +23,7 @@
 
 #include "io/FileStream.h"
 #include "../TestBase.h"
+#include "utils/gsl.h"
 
 TEST_CASE("TestFileOverWrite", "[TestFiles]") {
   TestController testController;
@@ -39,7 +40,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
@@ -53,7 +54,7 @@
 
   std::vector<uint8_t> verifybuffer;
 
-  REQUIRE(stream.read(verifybuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(verifybuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   data = verifybuffer.data();
 
@@ -77,7 +78,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
@@ -91,7 +92,7 @@
 
   std::vector<uint8_t> verifybuffer;
 
-  REQUIRE(stream.read(verifybuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(verifybuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   data = verifybuffer.data();
 
@@ -115,7 +116,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
@@ -129,7 +130,7 @@
 
   std::vector<uint8_t> verifybuffer;
 
-  REQUIRE(stream.read(verifybuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(verifybuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   data = verifybuffer.data();
 
@@ -153,7 +154,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
@@ -167,7 +168,7 @@
 
   std::vector<uint8_t> verifybuffer;
 
-  REQUIRE(stream.read(nullptr, stream.size()) == -1);
+  REQUIRE(stream.read(nullptr, gsl::narrow<int>(stream.size())) == -1);
 
   data = verifybuffer.data();
 
@@ -191,7 +192,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
@@ -226,7 +227,7 @@
 
   minifi::io::FileStream stream(path, 0, true);
   std::vector<uint8_t> readBuffer;
-  REQUIRE(stream.read(readBuffer, stream.size()) == stream.size());
+  REQUIRE(stream.read(readBuffer, gsl::narrow<int>(stream.size())) == stream.size());
 
   uint8_t* data = readBuffer.data();
 
diff --git a/libminifi/test/unit/FlowFileSerializationTests.cpp b/libminifi/test/unit/FlowFileSerializationTests.cpp
index d89e335..fef1327 100644
--- a/libminifi/test/unit/FlowFileSerializationTests.cpp
+++ b/libminifi/test/unit/FlowFileSerializationTests.cpp
@@ -24,6 +24,7 @@
 #include "serialization/PayloadSerializer.h"
 #include "core/FlowFile.h"
 #include "../TestBase.h"
+#include "utils/gsl.h"
 
 std::shared_ptr<minifi::FlowFileRecord> createEmptyFlowFile() {
   auto flowFile = std::make_shared<minifi::FlowFileRecord>();
@@ -34,7 +35,7 @@
 TEST_CASE("Payload Serializer", "[testPayload]") {
   std::string content = "flowFileContent";
   auto contentStream = std::make_shared<minifi::io::BufferStream>();
-  contentStream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(content.data())), content.length());
+  contentStream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(content.data())), gsl::narrow<int>(content.length()));
 
   auto result = std::make_shared<minifi::io::BufferStream>();
 
@@ -44,7 +45,7 @@
   flowFile->addAttribute("second", "two");
 
   minifi::PayloadSerializer serializer([&] (const std::shared_ptr<core::FlowFile>&, minifi::InputStreamCallback* cb) {
-    return cb->process(contentStream);
+    return gsl::narrow<int>(cb->process(contentStream));
   });
   serializer.serialize(flowFile, result);
 
@@ -56,7 +57,7 @@
 TEST_CASE("FFv3 Serializer", "[testFFv3]") {
   std::string content = "flowFileContent";
   auto contentStream = std::make_shared<minifi::io::BufferStream>();
-  contentStream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(content.data())), content.length());
+  contentStream->write(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(content.data())), gsl::narrow<int>(content.length()));
 
   auto result = std::make_shared<minifi::io::BufferStream>();
 
@@ -66,7 +67,7 @@
   flowFile->addAttribute("second", "two");
 
   minifi::FlowFileV3Serializer serializer([&] (const std::shared_ptr<core::FlowFile>&, minifi::InputStreamCallback* cb) {
-    return cb->process(contentStream);
+    return gsl::narrow<int>(cb->process(contentStream));
   });
   serializer.serialize(flowFile, result);
 
diff --git a/libminifi/test/unit/LoggerConfigurationTests.cpp b/libminifi/test/unit/LoggerConfigurationTests.cpp
index bdb16b9..5e2f03e 100644
--- a/libminifi/test/unit/LoggerConfigurationTests.cpp
+++ b/libminifi/test/unit/LoggerConfigurationTests.cpp
@@ -41,6 +41,7 @@
   REQUIRE(expected == actual);
 }
 
+#ifndef WIN32
 class TestLoggerConfiguration : public logging::LoggerConfiguration {
  public:
   static std::shared_ptr<logging::internal::LoggerNamespace> initialize_namespaces(const std::shared_ptr<logging::LoggerProperties> &logger_properties) {
@@ -50,7 +51,7 @@
     return logging::LoggerConfiguration::get_logger(LogTestController::getInstance().logger_, root_namespace, name, formatter);
   }
 };
-#ifndef WIN32
+
 TEST_CASE("TestLoggerConfiguration::initialize_namespaces", "[test initialize_namespaces]") {
   TestController test_controller;
   LogTestController &logTestController = LogTestController::getInstance();
diff --git a/libminifi/test/unit/MinifiConcurrentQueueTests.cpp b/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
index 1b0dc0f..42b4987 100644
--- a/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
+++ b/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
@@ -24,6 +24,7 @@
 #include <set>
 
 #include "../TestBase.h"
+#include "utils/gsl.h"
 #include "utils/MinifiConcurrentQueue.h"
 #include "utils/StringUtils.h"
 #include "utils/IntegrationTestUtils.h"
@@ -121,7 +122,7 @@
       while (queue.dequeueWait(s)) {
         if (!std::count(results.begin(), results.end(), s)) {
           results.push_back(s);
-          results_size = results.size();
+          results_size = gsl::narrow<int>(results.size());
         }
         // The consumer is busy enqueing so noone is waiting for this ;(
         queue.enqueue(std::move(s));
diff --git a/libminifi/test/unit/SiteToSiteHelper.h b/libminifi/test/unit/SiteToSiteHelper.h
index 693ec31..b4d5e8f 100644
--- a/libminifi/test/unit/SiteToSiteHelper.h
+++ b/libminifi/test/unit/SiteToSiteHelper.h
@@ -22,6 +22,8 @@
 #include "io/BufferStream.h"
 #include "io/EndianCheck.h"
 #include "core/Core.h"
+#include "utils/gsl.h"
+
 /**
  * Test repository
  */
@@ -37,7 +39,7 @@
   }
 
   void push_response(const std::string& resp) {
-    server_responses_.write(reinterpret_cast<const uint8_t*>(resp.data()), resp.length());
+    server_responses_.write(reinterpret_cast<const uint8_t*>(resp.data()), gsl::narrow<int>(resp.length()));
   }
 
   int write(const uint8_t *value, int size) override {
diff --git a/libminifi/test/unit/StringUtilsTests.cpp b/libminifi/test/unit/StringUtilsTests.cpp
index e76fa0e..2ecc8de 100644
--- a/libminifi/test/unit/StringUtilsTests.cpp
+++ b/libminifi/test/unit/StringUtilsTests.cpp
@@ -50,54 +50,24 @@
   REQUIRE(expected == StringUtils::split(org::apache::nifi::minifi::core::getClassName<org::apache::nifi::minifi::utils::StringUtils>(), "::"));
 }
 
-TEST_CASE("TestStringUtils::testEnv1", "[test split classname]") {
-  std::string test_string = "hello world ${blahblahnamenamenotexist}";
-
-
+TEST_CASE("StringUtils::replaceEnvironmentVariables works correctly", "[replaceEnvironmentVariables]") {
   utils::Environment::setEnvironmentVariable("blahblahnamenamenotexist", "computer", 0);
 
-  std::string expected = "hello world computer";
+  REQUIRE("hello world computer" == StringUtils::replaceEnvironmentVariables("hello world ${blahblahnamenamenotexist}"));
+  REQUIRE("hello world ${blahblahnamenamenotexist" == StringUtils::replaceEnvironmentVariables("hello world ${blahblahnamenamenotexist"));
+  REQUIRE("hello world $computer" == StringUtils::replaceEnvironmentVariables("hello world $${blahblahnamenamenotexist}"));
+  REQUIRE("hello world ${blahblahnamenamenotexist}" == StringUtils::replaceEnvironmentVariables("hello world \\${blahblahnamenamenotexist}"));
+  REQUIRE("the computer costs $123" == StringUtils::replaceEnvironmentVariables("the ${blahblahnamenamenotexist} costs \\$123"));
+  REQUIRE("computer bug" == StringUtils::replaceEnvironmentVariables("${blahblahnamenamenotexist} bug"));
+  REQUIRE("O computer! My computer!" == StringUtils::replaceEnvironmentVariables("O ${blahblahnamenamenotexist}! My ${blahblahnamenamenotexist}!"));
 
-  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
-}
+  utils::Environment::setEnvironmentVariable("blahblahnamenamenotexist_2", "no", 0);
+  REQUIRE("computer says 'no'" == StringUtils::replaceEnvironmentVariables("${blahblahnamenamenotexist} says '${blahblahnamenamenotexist_2}'"));
+  REQUIRE("no computer can say no to computer nougats" == StringUtils::replaceEnvironmentVariables(
+      "${blahblahnamenamenotexist_2} ${blahblahnamenamenotexist} can say ${blahblahnamenamenotexist_2} to ${blahblahnamenamenotexist} ${blahblahnamenamenotexist_2}ugats"));
 
-TEST_CASE("TestStringUtils::testEnv2", "[test split classname]") {
-  std::string test_string = "hello world ${blahblahnamenamenotexist";
-
-  utils::Environment::setEnvironmentVariable("blahblahnamenamenotexist", "computer");
-
-  std::string expected = "hello world ${blahblahnamenamenotexist";
-
-  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
-}
-
-TEST_CASE("TestStringUtils::testEnv3", "[test split classname]") {
-  std::string test_string = "hello world $${blahblahnamenamenotexist}";
-
-  utils::Environment::setEnvironmentVariable("blahblahnamenamenotexist", "computer");
-
-  std::string expected = "hello world $computer";
-
-  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
-}
-
-TEST_CASE("TestStringUtils::testEnv4", "[test split classname]") {
-  std::string test_string = "hello world \\${blahblahnamenamenotexist}";
-
-  utils::Environment::setEnvironmentVariable("blahblahnamenamenotexist", "computer");
-
-  std::string expected = "hello world ${blahblahnamenamenotexist}";
-
-  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
-}
-
-TEST_CASE("TestStringUtils::testEnv5", "[test split classname]") {
-  // can't use blahblahnamenamenotexist because the utils::Environment::setEnvironmentVariable in other functions may have already set it
-  std::string test_string = "hello world ${blahblahnamenamenotexist2}";
-
-  std::string expected = "hello world ";
-
-  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
+  REQUIRE("hello world ${}" == StringUtils::replaceEnvironmentVariables("hello world ${}"));
+  REQUIRE("hello world " == StringUtils::replaceEnvironmentVariables("hello world ${blahblahnamenamenotexist_reallydoesnotexist}"));
 }
 
 TEST_CASE("TestStringUtils::testJoin", "[test string join]") {
diff --git a/libminifi/test/unit/ZlibStreamTests.cpp b/libminifi/test/unit/ZlibStreamTests.cpp
index 7a81f06..3418448 100644
--- a/libminifi/test/unit/ZlibStreamTests.cpp
+++ b/libminifi/test/unit/ZlibStreamTests.cpp
@@ -21,6 +21,7 @@
 #include <algorithm>
 #include "../TestBase.h"
 #include "io/ZlibStream.h"
+#include "utils/gsl.h"
 #include "utils/StringUtils.h"
 
 namespace io = org::apache::nifi::minifi::io;
@@ -34,13 +35,17 @@
   SECTION("Empty") {
   }
   SECTION("Simple content in one write") {
-    REQUIRE(strlen("foobar") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foobar")), strlen("foobar")));
+    int length = gsl::narrow<int>(strlen("foobar"));
+    REQUIRE(length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foobar")), length));
     original += "foobar";
   }
   SECTION("Simple content in two writes") {
-    REQUIRE(strlen("foo") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foo")), strlen("foo")));
+    int foo_length = gsl::narrow<int>(strlen("foo"));
+    REQUIRE(foo_length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foo")), foo_length));
     original += "foo";
-    REQUIRE(strlen("bar") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("bar")), strlen("bar")));
+
+    int bar_length = gsl::narrow<int>(strlen("bar"));
+    REQUIRE(bar_length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("bar")), bar_length));
     original += "bar";
   }
   SECTION("Large data") {
@@ -50,7 +55,7 @@
     for (size_t i = 0U; i < 1024U; i++) {
       std::generate(buf.begin(), buf.end(), [&](){return dist(gen);});
       original += std::string(reinterpret_cast<const char*>(buf.data()), buf.size());
-      REQUIRE(-1 != compressStream.write(buf.data(), buf.size()));
+      REQUIRE(-1 != compressStream.write(buf.data(), gsl::narrow<int>(buf.size())));
     }
   }
 
@@ -66,7 +71,7 @@
   io::BufferStream decompressBuffer;
   io::ZlibDecompressStream decompressStream(gsl::make_not_null(&decompressBuffer));
 
-  decompressStream.write(const_cast<uint8_t*>(compressBuffer.getBuffer()), compressBuffer.size());
+  decompressStream.write(const_cast<uint8_t*>(compressBuffer.getBuffer()), gsl::narrow<int>(compressBuffer.size()));
 
   REQUIRE(decompressStream.isFinished());
   REQUIRE(original == std::string(reinterpret_cast<const char*>(decompressBuffer.getBuffer()), decompressBuffer.size()));
@@ -81,13 +86,17 @@
   SECTION("Empty") {
   }
   SECTION("Simple content in one write") {
-    REQUIRE(strlen("foobar") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foobar")), strlen("foobar")));
+    int foobar_length = gsl::narrow<int>(strlen("foobar"));
+    REQUIRE(foobar_length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foobar")), foobar_length));
     original += "foobar";
   }
   SECTION("Simple content in two writes") {
-    REQUIRE(strlen("foo") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foo")), strlen("foo")));
+    int foo_length = gsl::narrow<int>(strlen("foo"));
+    REQUIRE(foo_length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("foo")), foo_length));
     original += "foo";
-    REQUIRE(strlen("bar") == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("bar")), strlen("bar")));
+
+    int bar_length = gsl::narrow<int>(strlen("bar"));
+    REQUIRE(bar_length == compressStream.write(reinterpret_cast<uint8_t*>(const_cast<char*>("bar")), bar_length));
     original += "bar";
   }
   SECTION("Large data") {
@@ -97,7 +106,8 @@
     for (size_t i = 0U; i < 1024U; i++) {
       std::generate(buf.begin(), buf.end(), [&](){return dist(gen);});
       original += std::string(reinterpret_cast<const char*>(buf.data()), buf.size());
-      REQUIRE(buf.size() == compressStream.write(buf.data(), buf.size()));
+      int buffer_size = gsl::narrow<int>(buf.size());
+      REQUIRE(buffer_size == compressStream.write(buf.data(), buffer_size));
     }
   }
 
diff --git a/main/AgentDocs.cpp b/main/AgentDocs.cpp
index 92c3e78..7307828 100644
--- a/main/AgentDocs.cpp
+++ b/main/AgentDocs.cpp
@@ -44,15 +44,11 @@
 namespace docs {
 
 std::string AgentDocs::extractClassName(const std::string &processor) const {
-  auto lastOfIdx = processor.find_last_of(".");
-  if (lastOfIdx != std::string::npos) {
-    lastOfIdx++;  // if a value is found, increment to move beyond the .
-    int nameLength = processor.length() - lastOfIdx;
-    std::string processorName = processor.substr(lastOfIdx, nameLength);
-    return processorName;
+  auto positionOfLastDot = processor.find_last_of(".");
+  if (positionOfLastDot != std::string::npos) {
+    return processor.substr(positionOfLastDot + 1);
   }
   return processor;
-
 }
 
 void AgentDocs::generate(const std::string &docsdir, std::ostream &genStream) {
diff --git a/nanofi/include/sitetosite/CPeer.h b/nanofi/include/sitetosite/CPeer.h
index d145e0b..12af30e 100644
--- a/nanofi/include/sitetosite/CPeer.h
+++ b/nanofi/include/sitetosite/CPeer.h
@@ -79,7 +79,7 @@
   peer->_host[host_len] = '\0';
   peer->_url[host_len + 7] = ':';
   if(peer->_port != 0) {
-    snprintf(peer->_url + host_len + 8, 5, "%d", peer->_port);
+    snprintf(peer->_url + host_len + 8, 6, "%d", peer->_port);
   }
   return;
 }
@@ -88,7 +88,7 @@
   peer->_port = port;
   if(peer->_url != NULL) {
     int i;
-    for(i = strlen(peer->_url) -1; i >= 0; --i) {  // look for the last ':' in the string
+    for(i = (int)(strlen(peer->_url)) - 1; i >= 0; --i) {  // look for the last ':' in the string
       if(peer->_url[i] == ':'){
         memset(peer->_url + i + 1, 0, 6);  // zero the port area  - the new port can be shorter
         snprintf(peer->_url + i + 1, 6, "%d", peer->_port);
diff --git a/nanofi/tests/CTestsBase.h b/nanofi/tests/CTestsBase.h
index b3c0767..8c37e3a 100644
--- a/nanofi/tests/CTestsBase.h
+++ b/nanofi/tests/CTestsBase.h
@@ -138,7 +138,8 @@
   }
 
   ~TestControllerWithTemporaryWorkingDirectory() {
-    chdir(old_cwd_);
+    int success = chdir(old_cwd_);
+    (void) success;
     free(old_cwd_);
   }
 
