diff --git a/source/application/api/use_case/kws/CMakeLists.txt b/source/application/api/use_case/kws/CMakeLists.txt
index 517a35a..ea0761c 100644
--- a/source/application/api/use_case/kws/CMakeLists.txt
+++ b/source/application/api/use_case/kws/CMakeLists.txt
@@ -27,7 +27,8 @@
 # Create static library
 add_library(${KWS_API_TARGET} STATIC
     src/KwsProcessing.cc
-    src/MicroNetKwsModel.cc)
+    src/MicroNetKwsModel.cc
+    src/KwsClassifier.cc)
 
 target_include_directories(${KWS_API_TARGET} PUBLIC include)
 
diff --git a/source/application/api/use_case/kws/include/KwsClassifier.hpp b/source/application/api/use_case/kws/include/KwsClassifier.hpp
new file mode 100644
index 0000000..d050e85
--- /dev/null
+++ b/source/application/api/use_case/kws/include/KwsClassifier.hpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2022 Arm Limited. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef KWS_CLASSIFIER_HPP
+#define KWS_CLASSIFIER_HPP
+
+#include "ClassificationResult.hpp"
+#include "TensorFlowLiteMicro.hpp"
+#include "Classifier.hpp"
+
+#include <vector>
+
+namespace arm {
+namespace app {
+
+    /**
+     * @brief   KWS Classifier - a helper class to get certain number of top
+     *          results from the output vector from a classification NN.
+     *          Allows for averaging of previous results.
+     **/
+    class KwsClassifier : public Classifier {
+    public:
+
+        /**
+         * @brief           Gets the top N classification results from the
+         *                  output vector.
+         * @param[in]       outputTensor   Inference output tensor from an NN model.
+         * @param[out]      vecResults     A vector of classification results.
+         *                                 populated by this function.
+         * @param[in]       labels         Labels vector to match classified classes.
+         * @param[in]       topNCount      Number of top classifications to pick. Default is 1.
+         * @param[in]       useSoftmax     Whether Softmax normalisation should be applied to output. Default is false.
+         * @param[in/out]   resultHistory  History of previous classification results to be updated.
+         * @return          true if successful, false otherwise.
+         **/
+         using Classifier::GetClassificationResults;  /* We are overloading not overriding. */
+         bool GetClassificationResults(TfLiteTensor* outputTensor, std::vector<ClassificationResult>& vecResults,
+                 const std::vector <std::string>& labels, uint32_t topNCount,
+                 bool use_softmax, std::vector<std::vector<float>>& resultHistory);
+
+        /**
+         * @brief        Average the given history of results.
+         * @param[in]    resultHistory   The history of results to take on average of.
+         * @param[out]   averageResult   The calculated average.
+         **/
+         static void AveragResults(const std::vector<std::vector<float>>& resultHistory,
+                 std::vector<float>& averageResult);
+    };
+
+} /* namespace app */
+} /* namespace arm */
+
+#endif /* KWS_CLASSIFIER_HPP */
diff --git a/source/application/api/use_case/kws/include/KwsProcessing.hpp b/source/application/api/use_case/kws/include/KwsProcessing.hpp
index 0ede425..e2d3ff9 100644
--- a/source/application/api/use_case/kws/include/KwsProcessing.hpp
+++ b/source/application/api/use_case/kws/include/KwsProcessing.hpp
@@ -19,7 +19,7 @@
 
 #include "AudioUtils.hpp"
 #include "BaseProcessing.hpp"
-#include "Classifier.hpp"
+#include "KwsClassifier.hpp"
 #include "MicroNetKwsMfcc.hpp"
 
 #include <functional>
@@ -55,9 +55,8 @@
          * @param[in]   inputSize  Size of the input data.
          * @return      true if successful, false otherwise.
          **/
-        bool DoPreProcess(const void* input, size_t inputSize) override;
+        bool DoPreProcess(const void* input, size_t inferenceIndex = 0) override;
 
-        size_t m_audioWindowIndex = 0;  /* Index of audio slider, used when caching features in longer clips. */
         size_t m_audioDataWindowSize;   /* Amount of audio needed for 1 inference. */
         size_t m_audioDataStride;       /* Amount of audio to stride across if doing >1 inference in longer clips. */
 
@@ -106,11 +105,11 @@
     class KwsPostProcess : public BasePostProcess {
 
     private:
-        TfLiteTensor* m_outputTensor;                   /* Model output tensor. */
-        Classifier& m_kwsClassifier;                    /* KWS Classifier object. */
-        const std::vector<std::string>& m_labels;       /* KWS Labels. */
-        std::vector<ClassificationResult>& m_results;   /* Results vector for a single inference. */
-
+        TfLiteTensor* m_outputTensor;                      /* Model output tensor. */
+        KwsClassifier& m_kwsClassifier;                    /* KWS Classifier object. */
+        const std::vector<std::string>& m_labels;          /* KWS Labels. */
+        std::vector<ClassificationResult>& m_results;      /* Results vector for a single inference. */
+        std::vector<std::vector<float>> m_resultHistory;   /* Store previous results so they can be averaged. */
     public:
         /**
          * @brief           Constructor
@@ -119,9 +118,9 @@
          * @param[in]       labels         Vector of string labels to identify each output of the model.
          * @param[in/out]   results        Vector of classification results to store decoded outputs.
          **/
-        KwsPostProcess(TfLiteTensor* outputTensor, Classifier& classifier,
+        KwsPostProcess(TfLiteTensor* outputTensor, KwsClassifier& classifier,
                        const std::vector<std::string>& labels,
-                       std::vector<ClassificationResult>& results);
+                       std::vector<ClassificationResult>& results, size_t averagingWindowLen = 1);
 
         /**
          * @brief    Should perform post-processing of the result of inference then
diff --git a/source/application/api/use_case/kws/include/KwsResult.hpp b/source/application/api/use_case/kws/include/KwsResult.hpp
index 38f32b4..e0bb868 100644
--- a/source/application/api/use_case/kws/include/KwsResult.hpp
+++ b/source/application/api/use_case/kws/include/KwsResult.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2021-2022 Arm Limited. All rights reserved.
  * SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -47,7 +47,7 @@
             this->m_inferenceNumber = inferenceIdx;
 
             this->m_resultVec = ResultVec();
-            for (auto & i : resultVec) {
+            for (auto& i : resultVec) {
                 if (i.m_normalisedVal >= this->m_threshold) {
                     this->m_resultVec.emplace_back(i);
                 }
diff --git a/source/application/api/use_case/kws/src/KwsClassifier.cc b/source/application/api/use_case/kws/src/KwsClassifier.cc
new file mode 100644
index 0000000..fe409b1
--- /dev/null
+++ b/source/application/api/use_case/kws/src/KwsClassifier.cc
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2022 Arm Limited. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "KwsClassifier.hpp"
+
+#include "TensorFlowLiteMicro.hpp"
+#include "PlatformMath.hpp"
+#include "log_macros.h"
+#include "../include/KwsClassifier.hpp"
+
+
+#include <vector>
+#include <algorithm>
+#include <string>
+#include <set>
+#include <cstdint>
+#include <cinttypes>
+
+
+namespace arm {
+namespace app {
+
+    bool KwsClassifier::GetClassificationResults(TfLiteTensor* outputTensor,
+            std::vector<ClassificationResult>& vecResults, const std::vector <std::string>& labels,
+            uint32_t topNCount, bool useSoftmax, std::vector<std::vector<float>>& resultHistory)
+    {
+        if (outputTensor == nullptr) {
+            printf_err("Output vector is null pointer.\n");
+            return false;
+        }
+
+        uint32_t totalOutputSize = 1;
+        for (int inputDim = 0; inputDim < outputTensor->dims->size; inputDim++) {
+            totalOutputSize *= outputTensor->dims->data[inputDim];
+        }
+
+        /* Sanity checks. */
+        if (totalOutputSize < topNCount) {
+            printf_err("Output vector is smaller than %" PRIu32 "\n", topNCount);
+            return false;
+        } else if (totalOutputSize != labels.size()) {
+            printf_err("Output size doesn't match the labels' size\n");
+            return false;
+        } else if (topNCount == 0) {
+            printf_err("Top N results cannot be zero\n");
+            return false;
+        }
+
+        bool resultState;
+        vecResults.clear();
+
+        /* De-Quantize Output Tensor */
+        QuantParams quantParams = GetTensorQuantParams(outputTensor);
+
+        /* Floating point tensor data to be populated
+         * NOTE: The assumption here is that the output tensor size isn't too
+         * big and therefore, there's neglibible impact on heap usage. */
+        std::vector<float> resultData(totalOutputSize);
+        resultData.resize(totalOutputSize);
+
+        /* Populate the floating point buffer */
+        switch (outputTensor->type) {
+            case kTfLiteUInt8: {
+                uint8_t* tensor_buffer = tflite::GetTensorData<uint8_t>(outputTensor);
+                for (size_t i = 0; i < totalOutputSize; ++i) {
+                    resultData[i] = quantParams.scale *
+                        (static_cast<float>(tensor_buffer[i]) - quantParams.offset);
+                }
+                break;
+            }
+            case kTfLiteInt8: {
+                int8_t* tensor_buffer = tflite::GetTensorData<int8_t>(outputTensor);
+                for (size_t i = 0; i < totalOutputSize; ++i) {
+                    resultData[i] = quantParams.scale *
+                        (static_cast<float>(tensor_buffer[i]) - quantParams.offset);
+                }
+                break;
+            }
+            case kTfLiteFloat32: {
+                float* tensor_buffer = tflite::GetTensorData<float>(outputTensor);
+                for (size_t i = 0; i < totalOutputSize; ++i) {
+                    resultData[i] = tensor_buffer[i];
+                }
+                break;
+            }
+            default:
+                printf_err("Tensor type %s not supported by classifier\n",
+                    TfLiteTypeGetName(outputTensor->type));
+                return false;
+        }
+
+        if (useSoftmax) {
+            math::MathUtils::SoftmaxF32(resultData);
+        }
+
+        /* If keeping track of recent results, update and take an average. */
+        if (resultHistory.size() > 1) {
+            std::rotate(resultHistory.begin(), resultHistory.begin() + 1, resultHistory.end());
+            resultHistory.back() = resultData;
+            AveragResults(resultHistory, resultData);
+        }
+
+        /* Get the top N results. */
+        resultState = GetTopNResults(resultData, vecResults, topNCount, labels);
+
+        if (!resultState) {
+            printf_err("Failed to get top N results set\n");
+            return false;
+        }
+
+        return true;
+    }
+
+    void app::KwsClassifier::AveragResults(const std::vector<std::vector<float>>& resultHistory,
+            std::vector<float>& averageResult)
+    {
+        /* Compute averages of each class across the window length. */
+        float sum;
+        for (size_t j = 0; j < averageResult.size(); j++) {
+            sum = 0;
+            for (size_t i = 0; i < resultHistory.size(); i++) {
+                sum += resultHistory[i][j];
+            }
+            averageResult[j] = (sum / resultHistory.size());
+        }
+    }
+
+} /* namespace app */
+} /* namespace arm */
\ No newline at end of file
diff --git a/source/application/api/use_case/kws/src/KwsProcessing.cc b/source/application/api/use_case/kws/src/KwsProcessing.cc
index 2d5c085..843ac58 100644
--- a/source/application/api/use_case/kws/src/KwsProcessing.cc
+++ b/source/application/api/use_case/kws/src/KwsProcessing.cc
@@ -66,9 +66,8 @@
         }
     }
 
-    bool KwsPreProcess::DoPreProcess(const void* data, size_t inputSize)
+    bool KwsPreProcess::DoPreProcess(const void* data, size_t inferenceIndex)
     {
-        UNUSED(inputSize);
         if (data == nullptr) {
             printf_err("Data pointer is null");
         }
@@ -77,8 +76,8 @@
         auto input = static_cast<const int16_t*>(data);
         this->m_mfccSlidingWindow.Reset(input);
 
-        /* Cache is only usable if we have more than 1 inference in an audio clip. */
-        bool useCache = this->m_audioWindowIndex > 0 && this->m_numReusedMfccVectors > 0;
+        /* Cache is only usable if we have more than 1 inference to do and it's not the first inference. */
+        bool useCache = inferenceIndex > 0 && this->m_numReusedMfccVectors > 0;
 
         /* Use a sliding window to calculate MFCC features frame by frame. */
         while (this->m_mfccSlidingWindow.HasNext()) {
@@ -163,7 +162,7 @@
         TfLiteQuantization quant = inputTensor->quantization;
 
         if (kTfLiteAffineQuantization == quant.type) {
-            auto *quantParams = (TfLiteAffineQuantization *) quant.params;
+            auto* quantParams = (TfLiteAffineQuantization*) quant.params;
             const float quantScale = quantParams->scale->data[0];
             const int quantOffset = quantParams->zero_point->data[0];
 
@@ -191,20 +190,22 @@
         return mfccFeatureCalc;
     }
 
-    KwsPostProcess::KwsPostProcess(TfLiteTensor* outputTensor, Classifier& classifier,
+    KwsPostProcess::KwsPostProcess(TfLiteTensor* outputTensor, KwsClassifier& classifier,
                                    const std::vector<std::string>& labels,
-                                   std::vector<ClassificationResult>& results)
+                                   std::vector<ClassificationResult>& results, size_t averagingWindowLen)
             :m_outputTensor{outputTensor},
              m_kwsClassifier{classifier},
              m_labels{labels},
              m_results{results}
-    {}
+    {
+        this->m_resultHistory = {averagingWindowLen, std::vector<float>(labels.size())};
+    }
 
     bool KwsPostProcess::DoPostProcess()
     {
         return this->m_kwsClassifier.GetClassificationResults(
                 this->m_outputTensor, this->m_results,
-                this->m_labels, 1, true);
+                this->m_labels, 1, true, this->m_resultHistory);
     }
 
 } /* namespace app */
