diff --git a/source/application/main/UseCaseCommonUtils.cc b/source/application/main/UseCaseCommonUtils.cc
index b3653d9..615f684 100644
--- a/source/application/main/UseCaseCommonUtils.cc
+++ b/source/application/main/UseCaseCommonUtils.cc
@@ -41,11 +41,30 @@
         return atoi(chInput);
     }
 
-    void DumpTensor(TfLiteTensor* tensor, const size_t lineBreakForNumElements)
-    {
-        char strhex[8];
-        std::string strdump;
+    void DumpTensorData(const uint8_t* tensorData,
+                        size_t size,
+                        size_t lineBreakForNumElements)
+        {
+            char strhex[8];
+            std::string strdump;
 
+            for (size_t i = 0; i < size; ++i) {
+                if (0 == i % lineBreakForNumElements) {
+                    printf("%s\n\t", strdump.c_str());
+                    strdump.clear();
+                }
+                snprintf(strhex, sizeof(strhex) - 1,
+                         "0x%02x, ", tensorData[i]);
+                strdump += std::string(strhex);
+            }
+
+            if (!strdump.empty()) {
+                printf("%s\n", strdump.c_str());
+            }
+        }
+
+    void DumpTensor(const TfLiteTensor* tensor, const size_t lineBreakForNumElements)
+    {
         if (!tensor) {
             printf_err("invalid tensor\n");
             return;
@@ -54,19 +73,7 @@
         const uint32_t tensorSz = tensor->bytes;
         const uint8_t* tensorData = tflite::GetTensorData<uint8_t>(tensor);
 
-        for (size_t i = 0; i < tensorSz; ++i) {
-            if (0 == i % lineBreakForNumElements) {
-                printf("%s\n\t", strdump.c_str());
-                strdump.clear();
-            }
-            snprintf(strhex, sizeof(strhex) - 1,
-                     "0x%02x, ", tensorData[i]);
-            strdump += std::string(strhex);
-        }
-
-        if (strdump.size()) {
-            printf("%s\n", strdump.c_str());
-        }
+        DumpTensorData(tensorData, tensorSz, lineBreakForNumElements);
     }
 
     bool ListFilesHandler(ApplicationContext& ctx)
@@ -92,7 +99,7 @@
                                              strNumFiles.size(),
                                              dataPsnTxtStartX,
                                              dataPsnTxtStartY,
-                                             0);
+                                             false);
 
 #if NUMBER_OF_FILES > 0
         constexpr uint32_t dataPsnTxtYIncr = 16;
@@ -103,7 +110,7 @@
             std::string currentFilename{get_filename(i)};
             platform.data_psn->present_data_text(currentFilename.c_str(),
                                                  currentFilename.size(),
-                                                 dataPsnTxtStartX, yVal, 0);
+                                                 dataPsnTxtStartX, yVal, false);
 
             info("\t%" PRIu32 " => %s\n", i, currentFilename.c_str());
         }
diff --git a/source/application/main/include/AudioUtils.hpp b/source/application/main/include/AudioUtils.hpp
index cba981d..cbf7bb7 100644
--- a/source/application/main/include/AudioUtils.hpp
+++ b/source/application/main/include/AudioUtils.hpp
@@ -124,18 +124,6 @@
             return ((m_dataSize - m_size)/m_stride);
         }
 
-        /**
-         * @brief  Calculates number of times the window can stride through the given data.
-         *         May not be a whole number.
-         * @return Number of strides to cover all data.
-         */
-        float FractionalTotalStrides() {
-            if (this->m_dataSize < this->m_size) {
-                return 0;
-            } else {
-                return ((this->m_dataSize - this->m_size)/ static_cast<float>(this->m_stride));
-            }
-        }
 
     protected:
         T *m_start = nullptr;
@@ -146,11 +134,11 @@
     };
 
     /*
-     * Sliding window for ASR will cover the whole of the input, even if
+     * Sliding window that will cover the whole length of the input, even if
      * this means the last window is not a full window length.
      */
     template<class T>
-    class ASRSlidingWindow : public SlidingWindow<T> {
+    class FractionalSlidingWindow : public SlidingWindow<T> {
     public:
         using SlidingWindow<T>::SlidingWindow;
 
@@ -161,6 +149,19 @@
         bool HasNext() {
             return this->m_count < 1 + this->FractionalTotalStrides() && (this->NextWindowStartIndex() < this->m_dataSize);
         }
+
+        /**
+        * @brief  Calculates number of times the window can stride through the given data.
+        *         May not be a whole number.
+        * @return Number of strides to cover all data.
+        */
+        float FractionalTotalStrides() {
+            if (this->m_dataSize < this->m_size) {
+                return 0;
+            } else {
+                return ((this->m_dataSize - this->m_size) / static_cast<float>(this->m_stride));
+            }
+        }
     };
 
 
diff --git a/source/application/main/include/UseCaseCommonUtils.hpp b/source/application/main/include/UseCaseCommonUtils.hpp
index d328392..0af22f3 100644
--- a/source/application/main/include/UseCaseCommonUtils.hpp
+++ b/source/application/main/include/UseCaseCommonUtils.hpp
@@ -58,8 +58,13 @@
      * @param[in]   lineBreakForNumElements     number of elements
      *              after which line break will be added.
      **/
-    void DumpTensor(TfLiteTensor* tensor,
-                    const size_t lineBreakForNumElements = 16);
+    void DumpTensor(const TfLiteTensor* tensor,
+                    size_t lineBreakForNumElements = 16);
+
+
+    void DumpTensorData(const uint8_t* tensorData,
+                        size_t size,
+                        size_t lineBreakForNumElements = 16);
 #endif /* VERIFY_TEST_OUTPUT */
 
     /**
diff --git a/source/use_case/asr/src/UseCaseHandler.cc b/source/use_case/asr/src/UseCaseHandler.cc
index dcc879f..8ef318f 100644
--- a/source/use_case/asr/src/UseCaseHandler.cc
+++ b/source/use_case/asr/src/UseCaseHandler.cc
@@ -135,7 +135,7 @@
             }
 
             /* Initialise an audio slider. */
-            auto audioDataSlider = audio::ASRSlidingWindow<const int16_t>(
+            auto audioDataSlider = audio::FractionalSlidingWindow<const int16_t>(
                                         audioArr,
                                         audioArrSize,
                                         audioParamsWinLen,
diff --git a/source/use_case/inference_runner/src/UseCaseHandler.cc b/source/use_case/inference_runner/src/UseCaseHandler.cc
index a75b2e4..b98b1c5 100644
--- a/source/use_case/inference_runner/src/UseCaseHandler.cc
+++ b/source/use_case/inference_runner/src/UseCaseHandler.cc
@@ -41,6 +41,17 @@
 
         const size_t numInputs = model.GetNumInputs();
 
+#if VERIFY_TEST_OUTPUT
+        info("Initial input tensors values:\n");
+        for (size_t inputIndex = 0; inputIndex < model.GetNumInputs(); inputIndex++) {
+            arm::app::DumpTensor(model.GetInputTensor(inputIndex));
+        }
+        info("Initial output tensors values:\n");
+        for (size_t outputIndex = 0; outputIndex < model.GetNumOutputs(); outputIndex++) {
+            arm::app::DumpTensor(model.GetOutputTensor(outputIndex));
+        }
+#endif /* VERIFY_TEST_OUTPUT */
+
         /* Populate each input tensor with random data. */
         for (size_t inputIndex = 0; inputIndex < numInputs; inputIndex++) {
 
diff --git a/source/use_case/kws_asr/src/UseCaseHandler.cc b/source/use_case/kws_asr/src/UseCaseHandler.cc
index 60c0fd2..9080348 100644
--- a/source/use_case/kws_asr/src/UseCaseHandler.cc
+++ b/source/use_case/kws_asr/src/UseCaseHandler.cc
@@ -357,7 +357,7 @@
         }
 
         /* Initialise an audio slider. */
-        auto audioDataSlider = audio::ASRSlidingWindow<const int16_t>(
+        auto audioDataSlider = audio::FractionalSlidingWindow<const int16_t>(
                 audioBuffer.data(),
                 audioBuffer.size(),
                 asrAudioParamsWinLen,
