diff --git a/src/backends/backendsCommon/DynamicBackend.cpp b/src/backends/backendsCommon/DynamicBackend.cpp
index 8af61c0..77ae83f 100644
--- a/src/backends/backendsCommon/DynamicBackend.cpp
+++ b/src/backends/backendsCommon/DynamicBackend.cpp
@@ -30,11 +30,12 @@
     BackendVersion backendVersion = GetBackendVersion();
     if (!DynamicBackendUtils::IsBackendCompatible(backendVersion))
     {
-        throw RuntimeException(boost::str(boost::format("The dynamic backend %1% (version %2%) is not compatible"
-                                                        "with the current Backend API (vesion %3%)")
-                                          % backendId
-                                          % backendVersion
-                                          % IBackendInternal::GetApiVersion()));
+        // This exception message could not be formatted simply using fmt::format
+        std::stringstream message;
+        message << "The dynamic backend " << backendId << " (version " << backendVersion <<
+        ") is not compatible with the current Backend API (version " << IBackendInternal::GetApiVersion() << ")";
+
+        throw RuntimeException(message.str());
     }
 }
 
diff --git a/src/backends/backendsCommon/DynamicBackendUtils.cpp b/src/backends/backendsCommon/DynamicBackendUtils.cpp
index 46b5a52..8850c0f 100644
--- a/src/backends/backendsCommon/DynamicBackendUtils.cpp
+++ b/src/backends/backendsCommon/DynamicBackendUtils.cpp
@@ -24,7 +24,7 @@
     void* sharedObjectHandle = dlopen(sharedObjectPath.c_str(), RTLD_LAZY);
     if (!sharedObjectHandle)
     {
-        throw RuntimeException(boost::str(boost::format("OpenHandle error: %1%") % GetDlError()));
+        throw RuntimeException(fmt::format("OpenHandle error: {}", GetDlError()));
     }
 
     return sharedObjectHandle;
diff --git a/src/backends/backendsCommon/DynamicBackendUtils.hpp b/src/backends/backendsCommon/DynamicBackendUtils.hpp
index 63ee611..32215ad 100644
--- a/src/backends/backendsCommon/DynamicBackendUtils.hpp
+++ b/src/backends/backendsCommon/DynamicBackendUtils.hpp
@@ -10,7 +10,7 @@
 
 #include <armnn/Exceptions.hpp>
 
-#include <boost/format.hpp>
+#include <fmt/format.h>
 
 #include <string>
 #include <vector>
@@ -75,7 +75,7 @@
     auto entryPoint = reinterpret_cast<EntryPointType>(dlsym(const_cast<void*>(sharedObjectHandle), symbolName));
     if (!entryPoint)
     {
-        throw RuntimeException(boost::str(boost::format("GetEntryPoint error: %1%") % GetDlError()));
+        throw RuntimeException(fmt::format("GetEntryPoint error: {}", GetDlError()));
     }
 
     return entryPoint;
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp
index ff97fc7..e9023b6 100644
--- a/src/backends/backendsCommon/WorkloadData.cpp
+++ b/src/backends/backendsCommon/WorkloadData.cpp
@@ -14,7 +14,7 @@
 #include <string>
 #include <sstream>
 
-#include <boost/format.hpp>
+#include <fmt/format.h>
 
 using namespace armnnUtils;
 
@@ -387,16 +387,15 @@
     const Optional<unsigned int>& quantizationDim = tensorInfo.GetQuantizationDim();
     if (!quantizationDim.has_value())
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("%1%: Quantization dimension for per-axis quantization not set on tensor %2%.")
-            % descName % tensorName));
+        throw InvalidArgumentException(fmt::format("{0}: Quantization dimension for per-axis quantization "
+                                                   "not set on tensor {1}.", descName, tensorName));
     }
 
     if (quantizationDim.value() != 0)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("%1%: Quantization dimension for per-axis quantization expected to be 0 on tensor %2%, "
-            "but got: %3%") % descName % tensorName % quantizationDim.value()));
+        throw InvalidArgumentException(fmt::format(
+            "{0}: Quantization dimension for per-axis quantization expected to be 0 on tensor {1}, "
+            "but got: {2}", descName, tensorName, quantizationDim.value()));
     }
 }
 
@@ -407,9 +406,9 @@
     int32_t quantizationOffset = tensorInfo.GetQuantizationOffset();
     if (quantizationOffset != 0)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("%1%: Quantization offset for per-axis quantization expected to be 0 on tensor %2%, "
-            "but got: %3%") % descName % tensorName % quantizationOffset));
+        throw InvalidArgumentException(fmt::format(
+            "{0}: Quantization offset for per-axis quantization expected to be 0 on tensor {1}, but got: {2}",
+            descName, tensorName, quantizationOffset));
     }
 }
 
@@ -428,9 +427,9 @@
 
         if (!canHavePerAxisQuantization)
         {
-            throw InvalidArgumentException(boost::str(
-                boost::format("%1%: Per-axis quantization parameters set on tensor %2%, "
-                "but data type does not support per-axis quantization.") % descName % "weight"));
+            throw InvalidArgumentException(fmt::format(
+                "{0}: Per-axis quantization parameters set on tensor {1}, but data type does not support "
+                "per-axis quantization.", descName, "weight"));
         }
 
 
@@ -443,9 +442,9 @@
             const TensorInfo& biasInfo = optionalBiasInfo.value();
             if (!biasInfo.HasPerAxisQuantization())
             {
-                throw InvalidArgumentException(boost::str(
-                    boost::format("%1%: Per-axis quantization parameters not set on bias tensor, despite being set on "
-                    "weight tensor.") % descName));
+                throw InvalidArgumentException(fmt::format(
+                        "{}: Per-axis quantization parameters not set on bias tensor, "
+                        "despite being set on weight tensor.", descName));
             }
 
             ValidateTensorDataType(biasInfo, DataType::Signed32, descName, "bias");
@@ -480,23 +479,22 @@
 
     if (m_Inputs.size() != m_Outputs.size())
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("%1%: Number of inputs (%2%) does not match the number of outputs (%3%).") %
-                          descriptorName % m_Inputs.size() % m_Outputs.size()));
+        throw InvalidArgumentException(fmt::format(
+            "{0}: Number of inputs ({1}) does not match the number of outputs ({2}).",
+            descriptorName, m_Inputs.size(), m_Outputs.size()));
     }
 
     for (unsigned int i = 0; i < m_Inputs.size(); ++i)
     {
         if (!m_Inputs[i])
         {
-            throw InvalidArgumentException(boost::str(boost::format("%1%: Invalid NULL input %2%.") %
-                                                      descriptorName % i));
+            throw InvalidArgumentException(fmt::format(
+                "{0}: Invalid NULL input {1}.", descriptorName, i));
         }
 
         if (!m_Outputs[i])
         {
-            throw InvalidArgumentException(boost::str(boost::format("%1%: Invalid NULL output %2%") %
-                                                      descriptorName % i));
+            throw InvalidArgumentException(fmt::format("{0}: Invalid NULL output {1}", descriptorName, i));
         }
     }
 }
@@ -509,17 +507,16 @@
 
     if (workloadInfo.m_InputTensorInfos.size() != 1)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of input infos (%1%) is not 1.")
-            % workloadInfo.m_InputTensorInfos.size()));
+        throw InvalidArgumentException(fmt::format("Number of input infos ({}) is not 1.",
+                                                   workloadInfo.m_InputTensorInfos.size()));
 
     }
 
     if (workloadInfo.m_InputTensorInfos.size() != workloadInfo.m_OutputTensorInfos.size())
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of input infos (%1%) does not match the number of output infos (%2%)")
-            % workloadInfo.m_InputTensorInfos.size() % workloadInfo.m_OutputTensorInfos.size()));
+        throw InvalidArgumentException(fmt::format(
+            "Number of input infos ({0}) does not match the number of output infos ({1})",
+            workloadInfo.m_InputTensorInfos.size(), workloadInfo.m_OutputTensorInfos.size()));
     }
 
     for (std::size_t i = 0; i < workloadInfo.m_InputTensorInfos.size(); ++i)
@@ -527,36 +524,33 @@
         if (workloadInfo.m_InputTensorInfos[i].GetNumElements() !=
             workloadInfo.m_OutputTensorInfos[i].GetNumElements())
         {
-            throw InvalidArgumentException(boost::str(
-                boost::format("Number of elements for tensor input and output %1% does not match")
-                % i ));
+            throw InvalidArgumentException(fmt::format(
+                "Number of elements for tensor input and output {} does not match", i ));
         }
     }
 
     if (m_Inputs.size() != 1)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of inputs (%1%) is not 1.")
-            % m_Inputs.size()));
+        throw InvalidArgumentException(fmt::format("Number of inputs ({}) is not 1.", m_Inputs.size()));
     }
 
     if (m_Inputs.size() != m_Outputs.size())
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of inputs (%1%) does not match the number of outputs (%2%)")
-            % m_Inputs.size() % m_Outputs.size()));
+        throw InvalidArgumentException(fmt::format(
+            "Number of inputs ({0}) does not match the number of outputs ({1})",
+            m_Inputs.size(), m_Outputs.size()));
     }
 
     for (unsigned int i = 0; i < m_Inputs.size(); ++i)
     {
         if (!m_Inputs[i])
         {
-            throw InvalidArgumentException(boost::str(boost::format("Invalid null input %1%") % i));
+            throw InvalidArgumentException(fmt::format("Invalid null input {}", i));
         }
 
         if (!m_Outputs[i])
         {
-            throw InvalidArgumentException(boost::str(boost::format("Invalid null output %1%") % i));
+            throw InvalidArgumentException(fmt::format("Invalid null output {}", i));
         }
     }
 }
@@ -569,21 +563,17 @@
 
     if (m_Inputs.size() != 1)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of inputs (%1%) is not 1.")
-            % m_Inputs.size()));
+        throw InvalidArgumentException(fmt::format("Number of inputs ({}) is not 1.", m_Inputs.size()));
     }
 
     if (m_Outputs.size() != 0)
     {
-        throw InvalidArgumentException(boost::str(
-            boost::format("Number of outputs (%1%) is not 0.")
-            % m_Inputs.size() % m_Outputs.size()));
+        throw InvalidArgumentException(fmt::format("Number of outputs ({}) is not 0.", m_Outputs.size()));
     }
 
     if (!m_Inputs[0])
     {
-        throw InvalidArgumentException(boost::str(boost::format("Invalid null input 0")));
+        throw InvalidArgumentException(fmt::format("Invalid null input 0"));
     }
 }
 
@@ -1288,9 +1278,9 @@
     if (m_Parameters.m_DilationX < 1 || m_Parameters.m_DilationY < 1 )
     {
         throw InvalidArgumentException(
-            boost::str(boost::format("%1%: dilationX (provided %2%) and dilationY (provided %3%) "
-                                     "cannot be smaller than 1.") % descriptorName %
-                                     m_Parameters.m_DilationX % m_Parameters.m_DilationX));
+            fmt::format("{}: dilationX (provided {}) and dilationY (provided {}) "
+                        "cannot be smaller than 1.",
+                        descriptorName, m_Parameters.m_DilationX, m_Parameters.m_DilationX));
     }
 
     const unsigned int channelIndex = (m_Parameters.m_DataLayout == DataLayout::NCHW) ? 1 : 3;
@@ -1302,11 +1292,10 @@
     const unsigned int numWeightOutputChannels    = outputTensorInfo.GetShape()[channelIndex];
     if (numWeightChannelMultiplier * numWeightInputChannels != numWeightOutputChannels)
     {
-        throw InvalidArgumentException(
-            boost::str(boost::format("%1%: output_channels (provided %2%) should be "
-                                     "equal to input_channels (provided %3%) multiplied by channel_multiplier "
-                                     "(provided %4%).") % descriptorName % numWeightOutputChannels %
-                                     numWeightInputChannels % numWeightChannelMultiplier));
+        throw InvalidArgumentException(fmt::format(
+            "{0}: output_channels (provided {1}) should be equal to input_channels (provided {2}) "
+            "multiplied by channel_multiplier (provided {3}).",
+            descriptorName, numWeightOutputChannels, numWeightInputChannels, numWeightChannelMultiplier));
     }
 
     ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
@@ -1430,9 +1419,8 @@
     if (inputBatchSize != outputBatchSize)
     {
         throw InvalidArgumentException(
-            boost::str(boost::format("%1%: Input batch size (%2%) "
-                "does not match output batch size (%3%)") %
-                descriptorName % inputBatchSize % outputBatchSize));
+            fmt::format("{}: Input batch size ({}) does not match output batch size ({})",
+                        descriptorName, inputBatchSize, outputBatchSize));
     }
 
     DataLayoutIndexed dimensionIndices(m_Parameters.m_DataLayout);
@@ -1441,9 +1429,8 @@
     if (inputChannelCount != outputChannelCount)
     {
         throw InvalidArgumentException(
-            boost::str(boost::format("%1%: Input channel count (%2%) "
-                "does not match output channel count (%3%)") %
-                descriptorName % inputChannelCount % outputChannelCount));
+            fmt::format("{}: Input channel count ({}) does not match output channel count ({})",
+                        descriptorName, inputChannelCount, outputChannelCount));
     }
 }
 
@@ -1479,9 +1466,8 @@
     if (inputBatchSize != outputBatchSize)
     {
         throw InvalidArgumentException(
-                boost::str(boost::format("%1%: Input batch size (%2%) "
-                           "does not match output batch size (%3%)") %
-                           descriptorName % inputBatchSize % outputBatchSize));
+                fmt::format("{}: Input batch size ({}) does not match output batch size ({})",
+                            descriptorName, inputBatchSize, outputBatchSize));
     }
 
     DataLayoutIndexed dimensionIndices(m_Parameters.m_DataLayout);
@@ -1490,9 +1476,8 @@
     if (inputChannelCount != outputChannelCount)
     {
         throw InvalidArgumentException(
-                boost::str(boost::format("%1%: Input channel count (%2%) "
-                           "does not match output channel count (%3%)") %
-                           descriptorName % inputChannelCount % outputChannelCount));
+                fmt::format("{}: Input channel count ({}) does not match output channel count ({})",
+                            descriptorName, inputChannelCount, outputChannelCount));
     }
 }
 
diff --git a/src/backends/cl/ClContextControl.cpp b/src/backends/cl/ClContextControl.cpp
index ebde68d..7ab825f 100644
--- a/src/backends/cl/ClContextControl.cpp
+++ b/src/backends/cl/ClContextControl.cpp
@@ -15,7 +15,7 @@
 #include <arm_compute/core/CL/CLKernelLibrary.h>
 #include <arm_compute/runtime/CL/CLScheduler.h>
 
-#include <boost/format.hpp>
+#include <fmt/format.h>
 
 namespace cl
 {
@@ -51,9 +51,9 @@
     }
     catch (const cl::Error& clError)
     {
-        throw ClRuntimeUnavailableException(boost::str(boost::format(
-            "Could not initialize the CL runtime. Error description: %1%. CL error code: %2%"
-        ) % clError.what() % clError.err()));
+        throw ClRuntimeUnavailableException(fmt::format(
+            "Could not initialize the CL runtime. Error description: {0}. CL error code: {1}",
+            clError.what(), clError.err()));
     }
 
     // Removes the use of global CL context.
@@ -149,9 +149,9 @@
     }
     catch (const cl::Error& clError)
     {
-        throw ClRuntimeUnavailableException(boost::str(boost::format(
-            "Could not initialize the CL runtime. Error description: %1%. CL error code: %2%"
-        ) % clError.what() % clError.err()));
+        throw ClRuntimeUnavailableException(fmt::format(
+            "Could not initialize the CL runtime. Error description: {0}. CL error code: {1}",
+            clError.what(), clError.err()));
     }
 
     // Note the first argument (path to cl source code) will be ignored as they should be embedded in the armcompute.
