diff --git a/tests/ExecuteNetwork/ExecuteNetwork.cpp b/tests/ExecuteNetwork/ExecuteNetwork.cpp
index 16d34c8..8acab71 100644
--- a/tests/ExecuteNetwork/ExecuteNetwork.cpp
+++ b/tests/ExecuteNetwork/ExecuteNetwork.cpp
@@ -238,9 +238,12 @@
                     return EXIT_FAILURE;
                 }
 
-                for (int i = 0; i < outputSize; ++i)
+                if (!params.m_DontPrintOutputs)
                 {
-                    printf("%f ", tfLiteDelageOutputData[i]);
+                    for (int i = 0; i < outputSize; ++i)
+                    {
+                        printf("%f ", tfLiteDelageOutputData[i]);
+                    }
                 }
             }
             else if (params.m_OutputTypes[outputIndex].compare("int") == 0)
@@ -253,9 +256,12 @@
                     return EXIT_FAILURE;
                 }
 
-                for (int i = 0; i < outputSize; ++i)
+                if (!params.m_DontPrintOutputs)
                 {
-                    printf("%d ", tfLiteDelageOutputData[i]);
+                    for (int i = 0; i < outputSize; ++i)
+                    {
+                        printf("%d ", tfLiteDelageOutputData[i]);
+                    }
                 }
             }
             else if (params.m_OutputTypes[outputIndex].compare("qsymms8") == 0)
@@ -268,9 +274,12 @@
                     return EXIT_FAILURE;
                 }
 
-                for (int i = 0; i < outputSize; ++i)
+                if (!params.m_DontPrintOutputs)
                 {
-                    printf("%d ", tfLiteDelageOutputData[i]);
+                    for (int i = 0; i < outputSize; ++i)
+                    {
+                        printf("%d ", tfLiteDelageOutputData[i]);
+                    }
                 }
             }
             else if (params.m_OutputTypes[outputIndex].compare("qasymm8") == 0 ||
@@ -284,9 +293,12 @@
                     return EXIT_FAILURE;
                 }
 
-                for (int i = 0; i < outputSize; ++i)
+                if (!params.m_DontPrintOutputs)
                 {
-                    printf("%u ", tfLiteDelageOutputData[i]);
+                    for (int i = 0; i < outputSize; ++i)
+                    {
+                        printf("%u ", tfLiteDelageOutputData[i]);
+                    }
                 }
             }
             else
@@ -472,6 +484,10 @@
                 {
                     ARMNN_LOG(warning) << "The input data was generated, note that the output will not be useful";
                 }
+                if (params.m_DontPrintOutputs)
+                {
+                    ARMNN_LOG(info) << "Printing outputs to console is disabled.";
+                }
 
                 // Print output tensors
                 const auto& infosOut = model.GetOutputBindingInfos();
@@ -479,9 +495,9 @@
                 {
                     const armnn::TensorInfo& infoOut = infosOut[i].second;
 
-                    // We've made sure before that the number of output files either equals numOutputs, in which case
-                    // we override those files when processing the results of each iteration (only the result of the
-                    // last iteration will be stored), or there are enough
+                    // We've made sure before that the number of output files either equals numOutputs, in which
+                    // case we override those files when processing the results of each iteration (only the result
+                    // of the last iteration will be stored), or there are enough
                     // output files for each output of each iteration.
                     size_t outputFileIndex = x * numOutputs + i;
                     if (!params.m_OutputTensorFiles.empty())
@@ -499,7 +515,8 @@
                     TensorPrinter printer(inferenceModelParams.m_OutputBindings[i],
                                           infoOut,
                                           outputTensorFile,
-                                          params.m_DequantizeOutput);
+                                          params.m_DequantizeOutput,
+                                          !params.m_DontPrintOutputs);
                     mapbox::util::apply_visitor(printer, outputs[x][i]);
                 }
 
@@ -575,14 +592,18 @@
                     {
                         ARMNN_LOG(warning) << "The input data was generated, note that the output will not be useful";
                     }
+                    if (params.m_DontPrintOutputs)
+                    {
+                        ARMNN_LOG(info) << "Printing outputs to console is disabled.";
+                    }
 
                     // Print output tensors
                     const auto& infosOut = model.GetOutputBindingInfos();
                     for (size_t i = 0; i < numOutputs; i++)
                     {
                         // We've made sure before that the number of output files either equals numOutputs, in which
-                        // case we override those files when processing the results of each iteration (only the result
-                        // of the last iteration will be stored), or there are enough
+                        // case we override those files when processing the results of each iteration (only the
+                        // result of the last iteration will be stored), or there are enough
                         // output files for each output of each iteration.
                         size_t outputFileIndex = iteration * numOutputs + i;
                         if (!params.m_OutputTensorFiles.empty())
@@ -602,7 +623,8 @@
                         TensorPrinter printer(inferenceModelParams.m_OutputBindings[i],
                                               infoOut,
                                               outputTensorFile,
-                                              params.m_DequantizeOutput);
+                                              params.m_DequantizeOutput,
+                                              !params.m_DontPrintOutputs);
                         mapbox::util::apply_visitor(printer, inferenceOutputMap.at(cb->GetInferenceId())[i]);
                     }
 
@@ -683,14 +705,18 @@
                     {
                         ARMNN_LOG(warning) << "The input data was generated, note that the output will not be useful";
                     }
+                    if (params.m_DontPrintOutputs)
+                    {
+                        ARMNN_LOG(info) << "Printing outputs to console is disabled.";
+                    }
 
                     // Print output tensors
                     const auto& infosOut = model.GetOutputBindingInfos();
                     for (size_t i = 0; i < numOutputs; i++)
                     {
                         // We've made sure before that the number of output files either equals numOutputs, in which
-                        // case we override those files when processing the results of each iteration (only the result
-                        // of the last iteration will be stored), or there are enough
+                        // case we override those files when processing the results of each iteration (only the
+                        // result of the last iteration will be stored), or there are enough
                         // output files for each output of each iteration.
                         size_t outputFileIndex = j * numOutputs + i;
                         if (!params.m_OutputTensorFiles.empty())
@@ -709,7 +735,8 @@
                         TensorPrinter printer(inferenceModelParams.m_OutputBindings[i],
                                               infoOut,
                                               outputTensorFile,
-                                              params.m_DequantizeOutput);
+                                              params.m_DequantizeOutput,
+                                              !params.m_DontPrintOutputs);
                         mapbox::util::apply_visitor(printer, outputs[j][i]);
                     }
 
diff --git a/tests/ExecuteNetwork/ExecuteNetworkParams.hpp b/tests/ExecuteNetwork/ExecuteNetworkParams.hpp
index e519b02..db8194b 100644
--- a/tests/ExecuteNetwork/ExecuteNetworkParams.hpp
+++ b/tests/ExecuteNetwork/ExecuteNetworkParams.hpp
@@ -50,6 +50,7 @@
     std::vector<std::string>      m_OutputTypes;
     bool                          m_ParseUnsupported = false;
     bool                          m_PrintIntermediate;
+    bool                          m_DontPrintOutputs;
     bool                          m_QuantizeInput;
     bool                          m_SaveCachedNetwork;
     size_t                        m_SimultaneousIterations;
diff --git a/tests/ExecuteNetwork/ExecuteNetworkProgramOptions.cpp b/tests/ExecuteNetwork/ExecuteNetworkProgramOptions.cpp
index 927d804..b1c87d0 100644
--- a/tests/ExecuteNetwork/ExecuteNetworkProgramOptions.cpp
+++ b/tests/ExecuteNetwork/ExecuteNetworkProgramOptions.cpp
@@ -254,6 +254,11 @@
                  "Add unsupported operators as stand-in layers (where supported by parser)",
                  cxxopts::value<bool>(m_ExNetParams.m_ParseUnsupported)->default_value("false")->implicit_value("true"))
 
+                ("do-not-print-output",
+                 "The default behaviour of ExecuteNetwork is to print the resulting outputs on the console. "
+                 "This behaviour can be changed by adding this flag to your command.",
+                 cxxopts::value<bool>(m_ExNetParams.m_DontPrintOutputs)->default_value("false")->implicit_value("true"))
+
                 ("q,quantize-input",
                  "If this option is enabled, all float inputs will be quantized as appropriate for the model's inputs. "
                  "If unset, default to not quantized. Accepted values (true or false)",
diff --git a/tests/NetworkExecutionUtils/NetworkExecutionUtils.cpp b/tests/NetworkExecutionUtils/NetworkExecutionUtils.cpp
index 0906c1c..da3188c 100644
--- a/tests/NetworkExecutionUtils/NetworkExecutionUtils.cpp
+++ b/tests/NetworkExecutionUtils/NetworkExecutionUtils.cpp
@@ -116,19 +116,26 @@
 TensorPrinter::TensorPrinter(const std::string& binding,
                              const armnn::TensorInfo& info,
                              const std::string& outputTensorFile,
-                             bool dequantizeOutput)
+                             bool dequantizeOutput,
+                             const bool printToConsole)
                              : m_OutputBinding(binding)
                              , m_Scale(info.GetQuantizationScale())
                              , m_Offset(info.GetQuantizationOffset())
                              , m_OutputTensorFile(outputTensorFile)
-                             , m_DequantizeOutput(dequantizeOutput) {}
+                             , m_DequantizeOutput(dequantizeOutput)
+                             , m_PrintToConsole(printToConsole) {}
 
 void TensorPrinter::operator()(const std::vector<float>& values)
 {
-    ForEachValue(values, [](float value)
+    if (m_PrintToConsole)
     {
-        printf("%f ", value);
-    });
+        std::cout << m_OutputBinding << ": ";
+        ForEachValue(values, [](float value)
+        {
+            printf("%f ", value);
+        });
+        printf("\n");
+    }
     WriteToFile(values);
 }
 
@@ -142,9 +149,19 @@
         ForEachValue(values, [&scale, &offset, &dequantizedValues](uint8_t value)
         {
             auto dequantizedValue = armnn::Dequantize(value, scale, offset);
-            printf("%f ", dequantizedValue);
             dequantizedValues.push_back(dequantizedValue);
         });
+
+        if (m_PrintToConsole)
+        {
+            std::cout << m_OutputBinding << ": ";
+            ForEachValue(dequantizedValues, [](float value)
+            {
+                printf("%f ", value);
+            });
+            printf("\n");
+        }
+
         WriteToFile(dequantizedValues);
     }
     else
@@ -156,31 +173,47 @@
 
 void TensorPrinter::operator()(const std::vector<int8_t>& values)
 {
-    ForEachValue(values, [](int8_t value)
+    if (m_PrintToConsole)
     {
-        printf("%d ", value);
-    });
+        std::cout << m_OutputBinding << ": ";
+        ForEachValue(values, [](int8_t value)
+        {
+            printf("%d ", value);
+        });
+        printf("\n");
+    }
     WriteToFile(values);
 }
 
 void TensorPrinter::operator()(const std::vector<int>& values)
 {
-    ForEachValue(values, [](int value)
+    if (m_PrintToConsole)
     {
-        printf("%d ", value);
-    });
+        std::cout << m_OutputBinding << ": ";
+        ForEachValue(values, [](int value)
+        {
+            printf("%d ", value);
+        });
+        printf("\n");
+    }
     WriteToFile(values);
 }
 
 template<typename Container, typename Delegate>
 void TensorPrinter::ForEachValue(const Container& c, Delegate delegate)
 {
-    std::cout << m_OutputBinding << ": ";
+    if (m_PrintToConsole)
+    {
+        std::cout << m_OutputBinding << ": ";
+    }
     for (const auto& value : c)
     {
         delegate(value);
     }
-    printf("\n");
+    if (m_PrintToConsole)
+    {
+        printf("\n");
+    }
 }
 
 template<typename T>
diff --git a/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp b/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp
index d92c17c..0abda4f 100644
--- a/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp
+++ b/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp
@@ -26,7 +26,8 @@
     TensorPrinter(const std::string& binding,
                   const armnn::TensorInfo& info,
                   const std::string& outputTensorFile,
-                  bool dequantizeOutput);
+                  bool dequantizeOutput,
+                  bool printToConsole = true);
 
     void operator()(const std::vector<float>& values);
 
@@ -48,6 +49,7 @@
     int m_Offset;
     std::string m_OutputTensorFile;
     bool m_DequantizeOutput;
+    bool m_PrintToConsole;
 };
 
 using TContainer =
