diff --git a/docs/documentation.md b/docs/documentation.md
index 9fe2b46..3e7a5c4 100644
--- a/docs/documentation.md
+++ b/docs/documentation.md
@@ -168,27 +168,23 @@
 hal
 ├── CMakeLists.txt
 ├── include
-│   ├── data_acq.h
-│   ├── data_psn.h
-│   ├── hal.h
-│   └── timer.h
+│     ├── hal.h
+│     ├── hal_lcd.h
+│     └── timer.h
 └── source
     ├── components
-    │   ├── cmsis_device
-    │   ├── lcd
-    │   ├── npu
-    │   ├── npu_ta
-    │   └── stdout
-    ├── platform
-    │   ├── mps3
-    │   ├── native
-    │   └── simple
-    ├── profiles
-    │   ├── bare-metal
-    │   └── native
-    ├── data_acq.c
-    ├── data_psn.c
-    └── hal.c
+    │     ├── cmsis_device
+    │     ├── lcd
+    │     ├── npu
+    │     ├── npu_ta
+    │     ├── platform_pmu
+    │     └── stdout
+    ├── hal.c
+    ├── hal_timer.c
+    └── platform
+        ├── mps3
+        ├── native
+        └── simple
 ```
 
 HAL is built as a separate project into a static library `libhal.a`. It is linked with use-case executable.
@@ -220,19 +216,8 @@
   `source/platform/simple`:
   These folders contain platform specific declaration and defines, such as, platform initialisation code, peripheral
   memory map, system registers, system specific timer implementation and other.
-  Platform is built from selected components and configured cmsis device. The platform could be used with different
-  profiles. Profile is included into the platform build based on `PLATFORM_PROFILE` build parameter.
-  Platform code is a separate CMake project, and it is built into a static library `libplatform-drivers.a`. It is linked
-  into HAL library.
-
-- `source/profiles/bare-metal`\
-  `source/profiles/native`:
-  As mentioned before, profiles are added into platform build. Currently, we support bare-metal and native profiles.
-  bare-metal contains the HAL support layer and platform initialization helpers. Function calls are routed
-  to platform-specific logic at this level.
-
-  Native profile allows the built application to be executed on the build (native) machine, i.e. x86. It bypasses and
-  stubs platform devices replacing them with standard C or C++ library calls.
+  Platform is built from selected components and configured cmsis device. It is a separate CMake project, and is 
+  built into a static library `libplatform-drivers.a`. It is linked into HAL library.
 
 ## Models and resources
 
diff --git a/docs/sections/customizing.md b/docs/sections/customizing.md
index 982479e..604e708 100644
--- a/docs/sections/customizing.md
+++ b/docs/sections/customizing.md
@@ -28,8 +28,7 @@
 
 The following sign indicates the important conventions to apply:
 
-> **Convention:** The code is developed using `C++11` and `C99` standards. This is then governed by TensorFlow Lite for
-> Microcontrollers framework.
+> **Convention:** The code is developed using `C++14` and `C99` standards.
 
 ## Software project description
 
@@ -98,20 +97,16 @@
   |--------------------|----------------------------------------------------------------------------------------------|
   |  `inited`            |  Initialization flag. Is set after the `platform_init()` function is called.                   |
   |  `plat_name`         |  Platform name. it is set to `mps3-bare` for MPS3 build and `FVP` for Fast Model build.      |
-  |  `data_acq`          |  Pointer to data acquisition module responsible for user interaction and other data collection for the application logic.               |
-  |  `data_psn`          |  Pointer to data presentation module responsible for data output through components available in the selected platform: `LCD --` for MPS3, `console --` for Fast Model. |
   |  `timer`             |  Pointer to platform timer implementation (see `platform_timer`)                               |
   |  `platform_init`     |  Pointer to platform initialization function.                                                |
   |  `platform_release`  |  Pointer to platform release function                                                        |
 
-- `hal_init` function: Initializes the HAL structure based on the compile time configuration. This must be called before
+- `hal_init` function: Initializes the HAL structure based on the compile-time configuration. This must be called before
     any other function in this API.
 
   |  Parameter name  | Description|
   |------------------|-----------------------------------------------------|
   |  `platform`        | Pointer to a pre-allocated `hal_platform` struct.   |
-  |  `data_acq`        | Pointer to a pre-allocated data acquisition module  |
-  |  `data_psn`        | Pointer to a pre-allocated data presentation module |
   |  `timer`           | Pointer to a pre-allocated timer module             |
   |  `return`          | Zero returned if successful, an error code is returned if unsuccessful.            |
 
@@ -129,28 +124,6 @@
   | ----------------| ------------------------------------------------------------------- |
   |  `platform`       | Pointer to a pre-allocated and initialized `hal_platform` struct.   |
 
-- `data_acq_module` structure: Structure to encompass the data acquisition module and linked methods.
-
-  | Attribute name | Description                                        |
-  |----------------|----------------------------------------------------|
-  | `inited`        | Initialization flag. Is set after the `system_init ()` function is called. |
-  | `system_name`    | Channel name. It is set to `UART` for MPS3 build and Fast Model builds.   |
-  | `system_init`    | Pointer to data acquisition module initialization function. The pointer is set according to the platform selected during the build. This function is called by the platform initialization routines. |
-  | `get_input`      | Pointer to a function reading user input. The pointer is set according to the selected platform during the build. For MPS3 and Fast Model environments, the function reads data from UART.   |
-
-- `data_psn_module` structure: Structure to encompass the data presentation module and associated methods.
-
-  | Attribute name     | Description                                    |
-  |--------------------|------------------------------------------------|
-  | `inited`             | Initialization flag. It is set after the `system_init ()` function is called. |
-  | `system_name`        | System component name used to present data. It is set to `lcd` for the MPS3 build and to `log_psn` for the Fast Model build. For Fast Model, the console output of the data summary replaces all pixel drawing functions.  |
-  | `system_init`        | Pointer to data presentation module initialization function. The pointer is set according to the platform selected during the build. This function is called by the platform initialization routines. |
-  | `present_data_image` | Pointer to a function to draw an image. The pointer is set according to the selected platform during the build. For MPS3, the image is drawn on the LCD. For Fast Model, the image summary is printed in the UART (coordinates, channel info, downsample factor). |
-  | `present_data_text`  | Pointer to a function to print a text. The pointer is set according to the selected platform during the build. For MPS3, the text is drawn on the LCD. For Fast Model, the text is printed in the UART. |
-  | `present_box`        | Pointer to a function to draw a rectangle. The pointer is set according to the selected platform during the build. For MPS3, the image is drawn on the LCD. For Fast Model, the image summary is printed in the UART. |
-  | `clear`              | Pointer to a function to clear the output. The pointer is set according to the selected platform during the build. For MPS3, the function clears the LCD. For Fast Model, nothing happens. |
-  | `set_text_color`     | Pointer to a function to set text color for the next call of `present_data_text()` function. The pointer is set according to the selected platform during the build. For MPS3, the function sets the color for the text printed on the LCD. For Fast Model, nothing happens. |
-
 - `platform_timer` structure: The structure to hold a platform-specific timer implementation.
 
   | Attribute name      | Description                                    |
@@ -175,12 +148,10 @@
 {
 
   hal_platform platform;
-  data_acq_module dataAcq;
-  data_psn_module dataPsn;
   platform_timer timer;
 
   /* Initialise the HAL and platform */
-  hal_init(&platform, &dataAcq, &dataPsn, &timer);
+  hal_init(&platform, &timer);
   hal_platform_init(&platform);
 
   ...
@@ -608,22 +579,23 @@
 
 ## Reading user input from console
 
-The platform data acquisition module uses the `get_input` function to read the keyboard input from the UART. It can be
-used as follows:
+The platform package under HAL must provide an implementation for a function `GetLine`. This is then wrapped by HAL to 
+expose a function called `hal_get_user_input`. 
 
 ```C++
 char ch_input[128];
-platform.data_acq->get_input(ch_input, sizeof(ch_input));
+hal_get_user_input(ch_input, sizeof(ch_input));
 ```
 
-The function is blocked until a user provides an input.
+The function intends to block until a line has been provided. For embedded targets, this call might be redirected to get
+input from a UART block. For the host targets, this will just be a call to the C standard library instead.
 
 ## Output to MPS3 LCD
 
-The platform presentation module has functions to print text or an image to the board LCD. For example:
+The HAL exposes LCD functions to print text or an image to the board LCD. For example:
 
-- `present_data_text`
-- `present_data_image`
+- `hal_lcd_display_text`
+- `hal_lcd_display_image`
 
 Text presentation function has the following signature:
 
@@ -640,7 +612,7 @@
 
 ```C++
 std::string hello("Hello world");
-platform.data_psn->present_data_text(hello.c_str(), hello.size(), 10, 35, 0);
+hal_lcd_display_text(hello.c_str(), hello.size(), 10, 35, 0);
 ```
 
 The image presentation function has the following signature:
@@ -653,14 +625,15 @@
 - `const uint32_t pos_y`: The y coordinate of the first pixel.
 - `const uint32_t downsample_factor`: The factor by which the image is to be downsampled.
 
-For example, the following code snippet visualizes an input tensor data for `MobileNet v2 224`, by downsampling it
-twice:
+For example, the following code snippet visualizes an input tensor data for `MobileNet v2 224`, by down-sampling it
+by a factor of two:
 
 ```C++
-platform.data_psn->present_data_image((uint8_t *) inputTensor->data.data, 224, 224, 3, 10, 35, 2);
+hal_lcd_display_image((uint8_t *) inputTensor->data.data, 224, 224, 3, 10, 35, 2);
 ```
 
-Please refer to the [Hardware Abstraction Layer API](./customizing.md#hardware-abstraction-layer-api) section for more data presentation functions.
+Please refer to the [Hardware Abstraction Layer API](./customizing.md#hardware-abstraction-layer-api) section for more
+LCD related functions.
 
 ## Building custom use-case
 
diff --git a/source/application/main/Main.cc b/source/application/main/Main.cc
index 8ed9c5a..e27d5b5 100644
--- a/source/application/main/Main.cc
+++ b/source/application/main/Main.cc
@@ -42,12 +42,10 @@
 int main ()
 {
     hal_platform    platform;
-    data_acq_module dataAcq;
-    data_psn_module dataPsn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_init(&platform, &timer);
 
     if (0 == hal_platform_init(&platform)) {
         /* Application information, UART should have been initialised. */
diff --git a/source/application/main/UseCaseCommonUtils.cc b/source/application/main/UseCaseCommonUtils.cc
index d439446..340a767 100644
--- a/source/application/main/UseCaseCommonUtils.cc
+++ b/source/application/main/UseCaseCommonUtils.cc
@@ -36,12 +36,7 @@
     fflush(stdout);
 }
 
-
-
-
-bool PresentInferenceResult(
-    hal_platform &platform,
-    const std::vector<arm::app::ClassificationResult> &results)
+bool PresentInferenceResult(const std::vector<arm::app::ClassificationResult> &results)
 {
     constexpr uint32_t dataPsnTxtStartX1 = 150;
     constexpr uint32_t dataPsnTxtStartY1 = 30;
@@ -51,7 +46,7 @@
 
     constexpr uint32_t dataPsnTxtYIncr = 16;  /* Row index increment. */
 
-    platform.data_psn->set_text_color(COLOR_GREEN);
+    hal_lcd_set_text_color(COLOR_GREEN);
 
     /* Display each result. */
     uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -66,13 +61,13 @@
                 std::to_string(results[i].m_labelIdx) +
                 " (" + std::to_string(results[i].m_normalisedVal) + ")";
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 resultStr.c_str(), resultStr.size(),
                 dataPsnTxtStartX1, rowIdx1, false);
         rowIdx1 += dataPsnTxtYIncr;
 
         resultStr = std::to_string(i + 1) + ") " + results[i].m_label;
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 resultStr.c_str(), resultStr.size(),
                 dataPsnTxtStartX2, rowIdx2, 0);
         rowIdx2 += dataPsnTxtYIncr;
@@ -134,12 +129,12 @@
     return runInf;
 }
 
-int ReadUserInputAsInt(hal_platform& platform)
+int ReadUserInputAsInt()
 {
     char chInput[128];
     memset(chInput, 0, sizeof(chInput));
 
-    platform.data_acq->get_input(chInput, sizeof(chInput));
+    hal_get_user_input(chInput, sizeof(chInput));
     return atoi(chInput);
 }
 
@@ -181,7 +176,6 @@
 bool ListFilesHandler(ApplicationContext& ctx)
 {
     auto& model = ctx.Get<Model&>("model");
-    auto& platform = ctx.Get<hal_platform&>("platform");
 
     constexpr uint32_t dataPsnTxtStartX = 20;
     constexpr uint32_t dataPsnTxtStartY = 40;
@@ -192,12 +186,12 @@
     }
 
     /* Clear the LCD */
-    platform.data_psn->clear(COLOR_BLACK);
+    hal_lcd_clear(COLOR_BLACK);
 
     /* Show the total number of embedded files. */
     std::string strNumFiles = std::string{"Total Number of Files: "} +
                                std::to_string(NUMBER_OF_FILES);
-    platform.data_psn->present_data_text(strNumFiles.c_str(),
+    hal_lcd_display_text(strNumFiles.c_str(),
                                          strNumFiles.size(),
                                          dataPsnTxtStartX,
                                          dataPsnTxtStartY,
@@ -210,7 +204,7 @@
         for (uint32_t i = 0; i < NUMBER_OF_FILES; ++i, yVal += dataPsnTxtYIncr) {
 
             std::string currentFilename{get_filename(i)};
-            platform.data_psn->present_data_text(currentFilename.c_str(),
+            hal_lcd_display_text(currentFilename.c_str(),
                                                  currentFilename.size(),
                                                  dataPsnTxtStartX, yVal, false);
 
diff --git a/source/application/main/include/UseCaseCommonUtils.hpp b/source/application/main/include/UseCaseCommonUtils.hpp
index 7f5dde6..9b6d550 100644
--- a/source/application/main/include/UseCaseCommonUtils.hpp
+++ b/source/application/main/include/UseCaseCommonUtils.hpp
@@ -31,12 +31,10 @@
   /**
    * @brief           Presents inference results using the data presentation
    *                  object.
-   * @param[in]       platform    Reference to the hal platform object.
    * @param[in]       results     Vector of classification results to be displayed.
    * @return          true if successful, false otherwise.
    **/
-bool PresentInferenceResult(hal_platform& platform,
-                            const std::vector<arm::app::ClassificationResult>& results);
+bool PresentInferenceResult(const std::vector<arm::app::ClassificationResult>& results);
 
 
 /**
@@ -82,10 +80,9 @@
 
     /**
      * @brief           Read input and return as an integer.
-     * @param[in]       platform   Reference to the hal platform object.
      * @return          Integer value corresponding to the user input.
      **/
-    int ReadUserInputAsInt(hal_platform& platform);
+    int ReadUserInputAsInt();
 
 #if VERIFY_TEST_OUTPUT
     /**
diff --git a/source/hal/CMakeLists.txt b/source/hal/CMakeLists.txt
index 10016c2..37bf267 100644
--- a/source/hal/CMakeLists.txt
+++ b/source/hal/CMakeLists.txt
@@ -39,8 +39,6 @@
 target_sources(${HAL_TARGET}
     PRIVATE
     source/hal.c
-    source/data_psn.c
-    source/data_acq.c
     source/hal_timer.c)
 
 if (DEFINED VERIFY_TEST_OUTPUT)
diff --git a/source/hal/include/data_acq.h b/source/hal/include/data_acq.h
deleted file mode 100644
index 965fbe5..0000000
--- a/source/hal/include/data_acq.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2021 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 DATA_ACQ_H
-#define DATA_ACQ_H
-
-/**
- * This file is the top level abstraction for the data acquisition module.
- **/
-#include <stdint.h>
-
-/* Structure to encompass the data acquisition module and it's methods. */
-typedef struct data_acquisition_module {
-    int inited;                 /**< initialised or not. */
-    char system_name[8];        /**< name(s) of the channel in use. */
-    int (* system_init)(void);  /**< channel initialisation function. */
-
-    /* Function to go and check if there are any events that require handling. */
-    int (* get_input)(char *user_input, int size);
-} data_acq_module;
-
-/**
- * @brief           Initialise the data acquisition channel: goes and
- *                  sets the required channel up for usage.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          acquisition structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_acq_channel_init(data_acq_module *module);
-
-/**
- * @brief           Releases the data acquisition channel.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          acquisition structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_acq_channel_release(data_acq_module *module);
-
-#endif /* DATA_ACQ_H */
diff --git a/source/hal/include/data_psn.h b/source/hal/include/data_psn.h
deleted file mode 100644
index 05d7649..0000000
--- a/source/hal/include/data_psn.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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");
- * 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 DATA_PSN_H
-#define DATA_PSN_H
-
-/**
- * This file is the top level abstraction for the data presentation module
- **/
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-/* Structure to encompass the data presentation module and it's methods */
-typedef struct data_presentation_module {
-    int inited;                 /**< initialised or not */
-    char system_name[8];        /**< name of the system in use */
-    int (* system_init)(void);  /**< pointer to init function */
-
-    /** Pointer to the image presentation function */
-    int (* present_data_image)(const uint8_t *data, const uint32_t width,
-        const uint32_t height, const uint32_t channels,
-        const uint32_t pos_x, const uint32_t pos_y,
-        const uint32_t downsample_factor);
-
-    /* Pointer to text presentation function */
-    int (* present_data_text)(const char *str, const size_t str_sz,
-        const uint32_t pos_x, const uint32_t pos_y,
-        const bool allow_multiple_lines);
-
-    /* Pointer to box presentation function */
-    int (* present_box)(const uint32_t pos_x, const uint32_t pos_y,
-        const uint32_t width, const uint32_t height, const uint16_t color);
-
-    /* Pointer to clear presentation function */
-    int (* clear)(const uint16_t color);
-
-    /* Pointer to set text color presentation function */
-    int (* set_text_color)(const uint16_t color);
-} data_psn_module;
-
-
-/**
- * @brief           Initialises the data presentation system.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          presentation structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_psn_system_init(data_psn_module *module);
-
-/**
- * @brief           Releases the data presentation system.
- * @param[in,out]   module  Pointer to a pre-allocated data
- *                          presentation structure object.
- * @return          0 if successful, error code otherwise.
- **/
-int data_psn_system_release(data_psn_module *module);
-
-#endif /* DATA_PSN_H */
diff --git a/source/hal/include/hal.h b/source/hal/include/hal.h
index 6335e6d..25ea1e2 100644
--- a/source/hal/include/hal.h
+++ b/source/hal/include/hal.h
@@ -28,20 +28,18 @@
 extern "C" {
 #endif
 
-#include "platform_drivers.h"           /* Platform drivers */
-#include "data_acq.h"                   /* Data acquisition abstraction */
-#include "data_psn.h"                   /* Data presentation abstraction */
-#include "timer.h"                      /* Timer/profiler API */
+#include "platform_drivers.h"   /* Platform drivers */
+#include "timer.h"              /* Timer/profiler API */
+#include "hal_lcd.h"            /* LCD functions */
 
 #include <inttypes.h>
+#include <stdbool.h>
 
 /* Structure to define a platform context to be used by the application */
 typedef struct hal_platform_context {
     int inited;                         /**< initialised */
     char plat_name[64];                 /**< name of this platform */
-    data_acq_module * data_acq;         /**< data acquisition module pointer */
-    data_psn_module * data_psn;         /**< data presentation module pointer */
-    platform_timer *  timer;            /**< timer */
+    platform_timer* timer;              /**< timer */
     int (* platform_init)();            /**< pointer to platform initialisation function */
     void (* platform_release)();        /**< pointer to platform release function */
 } hal_platform;
@@ -50,13 +48,10 @@
  * @brief           Initialise the HAL structure based on compile time config. This
  *                  should be called before any other function in this API.
  * @param[in,out]   platform    Pointer to a pre-allocated platform struct.
- * @param[in,out]   data_acq    Pointer to a pre-allocated data acquisition module.
- * @param[in,out]   data_psn    Pointer to a pre-allocated data presentation module.
  * @param[in,out]   timer       Pointer to a pre-allocated timer module.
  * @return          0 if successful, error code otherwise.
  **/
-int hal_init(hal_platform *platform, data_acq_module *data_acq,
-    data_psn_module *data_psn, platform_timer *timer);
+int hal_init(hal_platform* platform, platform_timer* timer);
 
 
 /**
@@ -66,7 +61,7 @@
  *                          platform structure.
  * @return      0 if successful, error code otherwise.
  **/
-int hal_platform_init(hal_platform *platform);
+int hal_platform_init(hal_platform* platform);
 
 
 /**
@@ -74,7 +69,15 @@
  * @param[in]   platform    pointer to a pre-allocated and initialised
  *                          platform structure.
  **/
-void hal_platform_release(hal_platform *platform);
+void hal_platform_release(hal_platform* platform);
+
+/**
+ * @brief       Gets user input from the stdin interface.
+ * @param[out]  user_input  Pointer to a buffer where the input will be stored.
+ * @param[in]   size        Buffer size in bytes.
+ * @return      True if successful, false otherwise.
+ */
+bool hal_get_user_input(char* user_input, int size);
 
 #ifdef __cplusplus
 }
diff --git a/source/hal/include/hal_lcd.h b/source/hal/include/hal_lcd.h
new file mode 100644
index 0000000..0a484c5
--- /dev/null
+++ b/source/hal/include/hal_lcd.h
@@ -0,0 +1,49 @@
+/*
+ * 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");
+ * 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 HAL_LCD_H
+#define HAL_LCD_H
+/**
+ * This file is the top level abstraction for the LCD related functions
+ **/
+
+#include "lcd_img.h"
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+/**
+ * See lcd_img.h for function docstrings.
+ * In the following macro definitions:
+ * d = data (pointer)
+ * w = width
+ * h = height
+ * c = channels
+ * x = x position
+ * y = y position
+ * s = down-sample factor (images)
+ * m = allow multiple lines (text)
+ * cl = colour
+ */
+#define hal_lcd_init()                          lcd_init()
+#define hal_lcd_display_image(d,w,h,c,x,y,s)    lcd_display_image(d,w,h,c,x,y,s)
+#define hal_lcd_display_text(s,l,x,y,m)         lcd_display_text(s,l,x,y,m)
+#define hal_lcd_display_box(x,y,w,h,cl)         lcd_display_box(x,y,w,h,cl)
+#define hal_lcd_clear(cl)                       lcd_clear(cl)
+#define hal_lcd_set_text_color(cl)              lcd_set_text_color(cl)
+
+#endif /* HAL_LCD_H */
diff --git a/source/hal/source/data_acq.c b/source/hal/source/data_acq.c
deleted file mode 100644
index ec6c725..0000000
--- a/source/hal/source/data_acq.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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 "data_acq.h"
-
-#include "log_macros.h"
-#include "platform_drivers.h"
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-
-/**
- * @brief       Get the user input from USART.
- * @param[out]  user_input  String read from the UART block.
- * @param[in]   size        String read length.
- * @return      0 if successful, error code otherwise.
- **/
-static int get_uart_user_input(char* user_input, int size)
-{
-    if (1 != GetLine(user_input, size - 1)) {
-        return 1;
-    }
-    return 0;
-}
-
-int data_acq_channel_init(data_acq_module* module)
-{
-    assert(module);
-
-    /* UART should have been initialised with low level initialisation
-     * routines. */
-    module->system_init = NULL;
-
-    strncpy(module->system_name, "UART", sizeof(module->system_name));
-    module->get_input = get_uart_user_input;
-    module->inited = 1;
-
-    return !(module->inited);
-}
-
-int data_acq_channel_release(data_acq_module* module)
-{
-    assert(module);
-    module->inited = 0;
-    module->get_input = NULL;
-    return 0;
-}
diff --git a/source/hal/source/data_psn.c b/source/hal/source/data_psn.c
deleted file mode 100644
index de088d7..0000000
--- a/source/hal/source/data_psn.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 "data_psn.h"
-
-#include "lcd_img.h"
-#include "platform_drivers.h"
-
-#include <assert.h>
-#include <string.h>
-
-int data_psn_system_init(data_psn_module* module)
-{
-    assert(module);
-
-    /* LCD output supported. */
-    module->system_init = lcd_init;
-    module->present_data_image = lcd_display_image;
-    module->present_data_text = lcd_display_text;
-    module->present_box = lcd_display_box;
-    module->set_text_color = lcd_set_text_color;
-    module->clear = lcd_clear;
-    strncpy(module->system_name, "lcd", sizeof(module->system_name));
-    module->inited =  !module->system_init();
-    return !module->inited;
-}
-
-int data_psn_system_release(data_psn_module* module)
-{
-    assert(module);
-    module->inited = 0;
-    return 0;
-}
diff --git a/source/hal/source/hal.c b/source/hal/source/hal.c
index 2715a17..d6028e7 100644
--- a/source/hal/source/hal.c
+++ b/source/hal/source/hal.c
@@ -23,13 +23,8 @@
 #include <assert.h>
 #include <string.h>
 
-int hal_init(hal_platform* platform, data_acq_module* data_acq,
-    data_psn_module* data_psn, platform_timer* timer)
+int hal_init(hal_platform* platform, platform_timer* timer)
 {
-    assert(platform && data_acq && data_psn);
-
-    platform->data_acq  = data_acq;
-    platform->data_psn  = data_psn;
     platform->timer     = timer;
     platform->platform_init     = platform_init;
     platform->platform_release  = platform_release;
@@ -59,46 +54,33 @@
         return state;
     }
 
-    /* Initialise the data acquisition module */
-    if (0 != (state = data_acq_channel_init(platform->data_acq))) {
-        if (!platform->data_acq->inited) {
-            printf_err("Failed to initialise data acq module: %s\n",
-                platform->data_acq->system_name);
-        }
-        hal_platform_release(platform);
+    /* Initialise LCD */
+    if (0 != (state = hal_lcd_init())) {
+        printf_err("hal_lcd_init failed\n");
         return state;
     }
 
-    /* Initialise the presentation module */
-    if (0 != (state = data_psn_system_init(platform->data_psn))) {
-        printf_err("Failed to initialise data psn module: %s\n",
-            platform->data_psn->system_name);
-        data_acq_channel_release(platform->data_acq);
-        hal_platform_release(platform);
-        return state;
-    }
-
-    /* Followed by the timer module */
+    /* Initialise the timer module */
     init_timer(platform->timer);
 
     info("%s platform initialised\n", platform->plat_name);
-    debug("Using %s module for data acquisition\n",
-            platform->data_acq->system_name);
-    debug("Using %s module for data presentation\n",
-        platform->data_psn->system_name);
-
     platform->inited = !state;
-
     return state;
 }
 
 void hal_platform_release(hal_platform *platform)
 {
     assert(platform && platform->platform_release);
-    data_acq_channel_release(platform->data_acq);
-    data_psn_system_release(platform->data_psn);
 
     hal_platform_clear(platform);
     info("Releasing platform %s\n", platform->plat_name);
     platform->platform_release();
 }
+
+bool hal_get_user_input(char* user_input, int size)
+{
+    if (1 != GetLine(user_input, size - 1)) {
+        return true;
+    }
+    return false;
+}
diff --git a/source/use_case/ad/src/MainLoop.cc b/source/use_case/ad/src/MainLoop.cc
index 5a289bf..e858320 100644
--- a/source/use_case/ad/src/MainLoop.cc
+++ b/source/use_case/ad/src/MainLoop.cc
@@ -78,7 +78,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -93,7 +93,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto audioIndex = static_cast<uint32_t>(
-                        arm::app::ReadUserInputAsInt(platform));
+                        arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyVibrationHandler(caseContext,
                                                            audioIndex,
                                                            false);
diff --git a/source/use_case/ad/src/UseCaseHandler.cc b/source/use_case/ad/src/UseCaseHandler.cc
index 853ab08..5585f36 100644
--- a/source/use_case/ad/src/UseCaseHandler.cc
+++ b/source/use_case/ad/src/UseCaseHandler.cc
@@ -33,12 +33,11 @@
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    reference to the hal platform object
      * @param[in]       result      average sum of classification results
      * @param[in]       threshold   if larger than this value we have an anomaly
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, float result, float threshold);
+    static bool PresentInferenceResult(float result, float threshold);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -64,7 +63,6 @@
     /* Vibration classification handler */
     bool ClassifyVibrationHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnTxtInfStartX = 20;
@@ -114,7 +112,7 @@
         auto audioDataStride = nMelSpecVectorsInAudioStride * frameStride;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
 
@@ -153,7 +151,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     str_inf.c_str(), str_inf.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
             info("Running inference on audio clip %" PRIu32 " => %s\n", currentIndex, get_filename(currentIndex));
@@ -202,12 +200,12 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     str_inf.c_str(), str_inf.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
             ctx.Set<float>("result", result);
-            if (!PresentInferenceResult(platform, result, scoreThreshold)) {
+            if (!PresentInferenceResult(result, scoreThreshold)) {
                 return false;
             }
 
@@ -221,13 +219,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform, float result, float threshold)
+    static bool PresentInferenceResult(float result, float threshold)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 30;
         constexpr uint32_t dataPsnTxtYIncr   = 16; /* Row index increment */
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Display each result */
         uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -242,7 +240,7 @@
             anomalyResult += std::string("Everything fine, no anomaly detected!");
         }
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 anomalyScore.c_str(), anomalyScore.size(),
                 dataPsnTxtStartX1, rowIdx1, false);
 
diff --git a/source/use_case/asr/src/MainLoop.cc b/source/use_case/asr/src/MainLoop.cc
index 40624f3..058211a 100644
--- a/source/use_case/asr/src/MainLoop.cc
+++ b/source/use_case/asr/src/MainLoop.cc
@@ -121,7 +121,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -136,7 +136,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto clipIndex = static_cast<uint32_t>(
-                                    arm::app::ReadUserInputAsInt(platform));
+                                    arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext,
                                                            clipIndex,
                                                            false);
diff --git a/source/use_case/asr/src/UseCaseHandler.cc b/source/use_case/asr/src/UseCaseHandler.cc
index 7bce2c6..420f725 100644
--- a/source/use_case/asr/src/UseCaseHandler.cc
+++ b/source/use_case/asr/src/UseCaseHandler.cc
@@ -36,13 +36,10 @@
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    Reference to the hal platform object.
      * @param[in]       results     Vector of classification results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(
-                    hal_platform& platform,
-                    const std::vector<arm::app::asr::AsrResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::asr::AsrResult>& results);
 
     /* Audio inference classification handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
@@ -50,8 +47,7 @@
         constexpr uint32_t dataPsnTxtInfStartX = 20;
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
@@ -103,7 +99,7 @@
 
         /* Loop to process audio clips. */
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Get current audio clip index. */
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
@@ -136,7 +132,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -192,13 +188,13 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
             ctx.Set<std::vector<arm::app::asr::AsrResult>>("results", results);
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -212,14 +208,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::asr::AsrResult>& results)
+    static bool PresentInferenceResult(const std::vector<arm::app::asr::AsrResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 60;
         constexpr bool allow_multiple_lines = true;
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         info("Final results:\n");
         info("Total number of inferences: %zu\n", results.size());
@@ -243,7 +238,7 @@
         /* Get the decoded result for the combined result. */
         std::string finalResultStr = audio::asr::DecodeOutput(combinedResults);
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             finalResultStr.c_str(), finalResultStr.size(),
                             dataPsnTxtStartX1, dataPsnTxtStartY1,
                             allow_multiple_lines);
diff --git a/source/use_case/img_class/src/MainLoop.cc b/source/use_case/img_class/src/MainLoop.cc
index 05322d1..7b67a19 100644
--- a/source/use_case/img_class/src/MainLoop.cc
+++ b/source/use_case/img_class/src/MainLoop.cc
@@ -60,7 +60,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayCommonMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -70,7 +70,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyImageHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/img_class/src/UseCaseHandler.cc b/source/use_case/img_class/src/UseCaseHandler.cc
index 1f1d78b..9061282 100644
--- a/source/use_case/img_class/src/UseCaseHandler.cc
+++ b/source/use_case/img_class/src/UseCaseHandler.cc
@@ -44,7 +44,6 @@
     /* Image inference classification handler. */
     bool ClassifyImageHandler(ApplicationContext& ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 2;
@@ -89,7 +88,7 @@
         std::vector<ClassificationResult> results;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Strings for presentation/logging. */
             std::string str_inf{"Running inference... "};
@@ -98,7 +97,7 @@
             LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
 
             /* Display this image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 static_cast<uint8_t *>(inputTensor->data.data),
                 nCols, nRows, nChannels,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -109,7 +108,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Run inference over this image. */
@@ -122,7 +121,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             auto& classifier = ctx.Get<ImgClassClassifier&>("classifier");
@@ -137,7 +136,7 @@
             arm::app::DumpTensor(outputTensor);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
diff --git a/source/use_case/inference_runner/src/UseCaseHandler.cc b/source/use_case/inference_runner/src/UseCaseHandler.cc
index 1125830..2f4b7c8 100644
--- a/source/use_case/inference_runner/src/UseCaseHandler.cc
+++ b/source/use_case/inference_runner/src/UseCaseHandler.cc
@@ -116,7 +116,6 @@
 
 bool RunInferenceHandler(ApplicationContext& ctx)
 {
-    auto& platform = ctx.Get<hal_platform&>("platform");
     auto& profiler = ctx.Get<Profiler&>("profiler");
     auto& model = ctx.Get<Model&>("model");
 
@@ -143,9 +142,8 @@
     std::string str_inf{"Running inference... "};
 
     /* Display message on the LCD - inference running. */
-    platform.data_psn->present_data_text(
-                            str_inf.c_str(), str_inf.size(),
-                            dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
+    hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
+                         dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
     if (!RunInference(model, profiler)) {
         return false;
@@ -153,7 +151,7 @@
 
     /* Erase. */
     str_inf = std::string(str_inf.size(), ' ');
-    platform.data_psn->present_data_text(
+    hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
diff --git a/source/use_case/kws/src/MainLoop.cc b/source/use_case/kws/src/MainLoop.cc
index 044c957..76dff8c 100644
--- a/source/use_case/kws/src/MainLoop.cc
+++ b/source/use_case/kws/src/MainLoop.cc
@@ -87,7 +87,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -97,7 +97,7 @@
             case MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the audio clip index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext, clipIndex, false);
                 break;
             }
diff --git a/source/use_case/kws/src/UseCaseHandler.cc b/source/use_case/kws/src/UseCaseHandler.cc
index 8dd7724..e04cefc 100644
--- a/source/use_case/kws/src/UseCaseHandler.cc
+++ b/source/use_case/kws/src/UseCaseHandler.cc
@@ -35,16 +35,14 @@
 namespace arm {
 namespace app {
 
-   
+
     /**
      * @brief           Presents inference results using the data presentation
      *                  object.
-     * @param[in]       platform    Reference to the hal platform object.
      * @param[in]       results     Vector of classification results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::kws::KwsResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::kws::KwsResult>& results);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -68,7 +66,6 @@
     /* Audio inference handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnTxtInfStartX = 20;
@@ -137,7 +134,7 @@
         const float secondsPerSample = 1.0/audio::MicroNetKwsMFCC::ms_defaultSamplingFreq;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
 
@@ -171,7 +168,7 @@
 
             /* Display message on the LCD - inference running. */
             std::string str_inf{"Running inference... "};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
             info("Running inference on audio clip %" PRIu32 " => %s\n", currentIndex,
@@ -223,13 +220,13 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             ctx.Set<std::vector<arm::app::kws::KwsResult>>("results", results);
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -242,61 +239,6 @@
         return true;
     }
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::kws::KwsResult>& results)
-    {
-        constexpr uint32_t dataPsnTxtStartX1 = 20;
-        constexpr uint32_t dataPsnTxtStartY1 = 30;
-        constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
-
-        platform.data_psn->set_text_color(COLOR_GREEN);
-        info("Final results:\n");
-        info("Total number of inferences: %zu\n", results.size());
-
-        /* Display each result */
-        uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
-
-        for (uint32_t i = 0; i < results.size(); ++i) {
-
-            std::string topKeyword{"<none>"};
-            float score = 0.f;
-            if (!results[i].m_resultVec.empty()) {
-                topKeyword = results[i].m_resultVec[0].m_label;
-                score = results[i].m_resultVec[0].m_normalisedVal;
-            }
-
-            std::string resultStr =
-                std::string{"@"} + std::to_string(results[i].m_timeStamp) +
-                std::string{"s: "} + topKeyword + std::string{" ("} +
-                std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
-
-            platform.data_psn->present_data_text(
-                                    resultStr.c_str(), resultStr.size(),
-                                    dataPsnTxtStartX1, rowIdx1, false);
-            rowIdx1 += dataPsnTxtYIncr;
-
-            if (results[i].m_resultVec.empty()) {
-                info("For timestamp: %f (inference #: %" PRIu32
-                     "); label: %s; threshold: %f\n",
-                     results[i].m_timeStamp, results[i].m_inferenceNumber,
-                     topKeyword.c_str(),
-                     results[i].m_threshold);
-            } else {
-                for (uint32_t j = 0; j < results[i].m_resultVec.size(); ++j) {
-                    info("For timestamp: %f (inference #: %" PRIu32
-                         "); label: %s, score: %f; threshold: %f\n",
-                         results[i].m_timeStamp,
-                         results[i].m_inferenceNumber,
-                         results[i].m_resultVec[j].m_label.c_str(),
-                         results[i].m_resultVec[j].m_normalisedVal,
-                         results[i].m_threshold);
-                }
-            }
-        }
-
-        return true;
-    }
-
     /**
      * @brief Generic feature calculator factory.
      *
@@ -344,6 +286,60 @@
         };
     }
 
+    static bool PresentInferenceResult(const std::vector<arm::app::kws::KwsResult>& results)
+    {
+        constexpr uint32_t dataPsnTxtStartX1 = 20;
+        constexpr uint32_t dataPsnTxtStartY1 = 30;
+        constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
+
+        hal_lcd_set_text_color(COLOR_GREEN);
+        info("Final results:\n");
+        info("Total number of inferences: %zu\n", results.size());
+
+        /* Display each result */
+        uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
+
+        for (uint32_t i = 0; i < results.size(); ++i) {
+
+            std::string topKeyword{"<none>"};
+            float score = 0.f;
+            if (!results[i].m_resultVec.empty()) {
+                topKeyword = results[i].m_resultVec[0].m_label;
+                score = results[i].m_resultVec[0].m_normalisedVal;
+            }
+
+            std::string resultStr =
+                    std::string{"@"} + std::to_string(results[i].m_timeStamp) +
+                    std::string{"s: "} + topKeyword + std::string{" ("} +
+                    std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
+
+            hal_lcd_display_text(
+                    resultStr.c_str(), resultStr.size(),
+                    dataPsnTxtStartX1, rowIdx1, false);
+            rowIdx1 += dataPsnTxtYIncr;
+
+            if (results[i].m_resultVec.empty()) {
+                info("For timestamp: %f (inference #: %" PRIu32
+                             "); label: %s; threshold: %f\n",
+                     results[i].m_timeStamp, results[i].m_inferenceNumber,
+                     topKeyword.c_str(),
+                     results[i].m_threshold);
+            } else {
+                for (uint32_t j = 0; j < results[i].m_resultVec.size(); ++j) {
+                    info("For timestamp: %f (inference #: %" PRIu32
+                                 "); label: %s, score: %f; threshold: %f\n",
+                         results[i].m_timeStamp,
+                         results[i].m_inferenceNumber,
+                         results[i].m_resultVec[j].m_label.c_str(),
+                         results[i].m_resultVec[j].m_normalisedVal,
+                         results[i].m_threshold);
+                }
+            }
+        }
+
+        return true;
+    }
+
     template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
         FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
                             size_t cacheSize,
diff --git a/source/use_case/kws_asr/src/MainLoop.cc b/source/use_case/kws_asr/src/MainLoop.cc
index a2beab3..096c966 100644
--- a/source/use_case/kws_asr/src/MainLoop.cc
+++ b/source/use_case/kws_asr/src/MainLoop.cc
@@ -156,7 +156,7 @@
         int menuOption = MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -171,7 +171,7 @@
                        NUMBER_OF_FILES-1);
                 fflush(stdout);
                 auto clipIndex = static_cast<uint32_t>(
-                        arm::app::ReadUserInputAsInt(platform));
+                        arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyAudioHandler(caseContext,
                                                            clipIndex,
                                                            false);
diff --git a/source/use_case/kws_asr/src/UseCaseHandler.cc b/source/use_case/kws_asr/src/UseCaseHandler.cc
index d598de6..1e1a400 100644
--- a/source/use_case/kws_asr/src/UseCaseHandler.cc
+++ b/source/use_case/kws_asr/src/UseCaseHandler.cc
@@ -53,11 +53,10 @@
     /**
      * @brief           Presents kws inference results using the data presentation
      *                  object.
-     * @param[in]       platform    reference to the hal platform object
      * @param[in]       results     vector of classification results to be displayed
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::kws::KwsResult>& results);
+    static bool PresentInferenceResult(std::vector<arm::app::kws::KwsResult>& results);
 
     /**
      * @brief           Presents asr inference results using the data presentation
@@ -66,7 +65,7 @@
      * @param[in]       results     vector of classification results to be displayed
      * @return          true if successful, false otherwise
      **/
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results);
+    static bool PresentInferenceResult(std::vector<arm::app::asr::AsrResult>& results);
 
     /**
      * @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -186,9 +185,8 @@
         std::vector<arm::app::kws::KwsResult> kwsResults;
 
         /* Display message on the LCD - inference running. */
-        auto& platform = ctx.Get<hal_platform&>("platform");
         std::string str_inf{"Running KWS inference... "};
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -258,11 +256,11 @@
 
         /* Erase. */
         str_inf = std::string(str_inf.size(), ' ');
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
-        if (!PresentInferenceResult(platform, kwsResults)) {
+        if (!PresentInferenceResult(kwsResults)) {
             return output;
         }
 
@@ -285,8 +283,7 @@
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
         auto& profiler = ctx.Get<Profiler&>("profiler");
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         /* Get model reference. */
         auto& asrModel = ctx.Get<Model&>("asrmodel");
@@ -356,7 +353,7 @@
 
         /* Display message on the LCD - inference running. */
         std::string str_inf{"Running ASR inference... "};
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                 str_inf.c_str(), str_inf.size(),
                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -407,11 +404,11 @@
 
             /* Erase */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                         str_inf.c_str(), str_inf.size(),
                         dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
         }
-        if (!PresentInferenceResult(platform, asrResults)) {
+        if (!PresentInferenceResult(asrResults)) {
             return false;
         }
 
@@ -423,8 +420,7 @@
     /* Audio inference classification handler. */
     bool ClassifyAudioHandler(ApplicationContext& ctx, uint32_t clipIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         /* If the request has a valid size, set the audio index. */
         if (clipIndex < NUMBER_OF_FILES) {
@@ -457,14 +453,13 @@
     }
 
 
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       std::vector<arm::app::kws::KwsResult>& results)
+    static bool PresentInferenceResult(std::vector<arm::app::kws::KwsResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 30;
         constexpr uint32_t dataPsnTxtYIncr   = 16;  /* Row index increment. */
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Display each result. */
         uint32_t rowIdx1 = dataPsnTxtStartY1 + 2 * dataPsnTxtYIncr;
@@ -484,7 +479,7 @@
                     std::string{"s: "} + topKeyword + std::string{" ("} +
                     std::to_string(static_cast<int>(score * 100)) + std::string{"%)"};
 
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                         resultStr.c_str(), resultStr.size(),
                         dataPsnTxtStartX1, rowIdx1, 0);
             rowIdx1 += dataPsnTxtYIncr;
@@ -502,13 +497,13 @@
         return true;
     }
 
-    static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results)
+    static bool PresentInferenceResult(std::vector<arm::app::asr::AsrResult>& results)
     {
         constexpr uint32_t dataPsnTxtStartX1 = 20;
         constexpr uint32_t dataPsnTxtStartY1 = 80;
         constexpr bool allow_multiple_lines = true;
 
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* Results from multiple inferences should be combined before processing. */
         std::vector<arm::app::ClassificationResult> combinedResults;
@@ -528,7 +523,7 @@
 
         std::string finalResultStr = audio::asr::DecodeOutput(combinedResults);
 
-        platform.data_psn->present_data_text(
+        hal_lcd_display_text(
                     finalResultStr.c_str(), finalResultStr.size(),
                     dataPsnTxtStartX1, dataPsnTxtStartY1, allow_multiple_lines);
 
diff --git a/source/use_case/noise_reduction/src/MainLoop.cc b/source/use_case/noise_reduction/src/MainLoop.cc
index c6214e3..bcaff6d 100644
--- a/source/use_case/noise_reduction/src/MainLoop.cc
+++ b/source/use_case/noise_reduction/src/MainLoop.cc
@@ -98,7 +98,7 @@
 
         if (bUseMenu) {
             DisplayMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -108,7 +108,7 @@
             case MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the audio clip IFM index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto clipIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 SetAppCtxClipIdx(caseContext, clipIndex);
                 executionSuccessful = NoiseReductionHandler(caseContext, false);
                 break;
diff --git a/source/use_case/noise_reduction/src/UseCaseHandler.cc b/source/use_case/noise_reduction/src/UseCaseHandler.cc
index 792b460..acb8ba7 100644
--- a/source/use_case/noise_reduction/src/UseCaseHandler.cc
+++ b/source/use_case/noise_reduction/src/UseCaseHandler.cc
@@ -64,8 +64,6 @@
             pMemDumpBytesWritten = ctx.Get<size_t*>("MEM_DUMP_BYTE_WRITTEN");
         }
         std::reference_wrapper<size_t> memDumpBytesWritten = std::ref(*pMemDumpBytesWritten);
-
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         /* Get model reference. */
@@ -106,7 +104,7 @@
             audioFileAccessorFunc = ctx.Get<std::function<const char*(const uint32_t)>>("featureFileNames");
         }
         do{
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             auto startDumpAddress = memDumpBaseAddr + memDumpBytesWritten;
             auto currentIndex = ctx.Get<uint32_t>("clipIndex");
@@ -158,7 +156,7 @@
                 std::string str_inf{"Running inference... "};
 
                 /* Display message on the LCD - inference running. */
-                platform.data_psn->present_data_text(
+                hal_lcd_display_text(
                             str_inf.c_str(), str_inf.size(),
                             dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -191,7 +189,7 @@
 
                 /* Erase. */
                 str_inf = std::string(str_inf.size(), ' ');
-                platform.data_psn->present_data_text(
+                hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
@@ -218,14 +216,14 @@
             IncrementAppCtxClipIdx(ctx);
 
             std::string clearString{' '};
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     clearString.c_str(), clearString.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             std::string completeMsg{"Inference complete!"};
 
             /* Display message on the LCD - inference complete. */
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                     completeMsg.c_str(), completeMsg.size(),
                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
diff --git a/source/use_case/object_detection/src/MainLoop.cc b/source/use_case/object_detection/src/MainLoop.cc
index 4bec357..0f98c8a 100644
--- a/source/use_case/object_detection/src/MainLoop.cc
+++ b/source/use_case/object_detection/src/MainLoop.cc
@@ -67,7 +67,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) {
             DisplayDetectionMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
         switch (menuOption) {
@@ -77,7 +77,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ObjectDetectionHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/object_detection/src/UseCaseHandler.cc b/source/use_case/object_detection/src/UseCaseHandler.cc
index 27d767d..f3b317e 100644
--- a/source/use_case/object_detection/src/UseCaseHandler.cc
+++ b/source/use_case/object_detection/src/UseCaseHandler.cc
@@ -30,31 +30,27 @@
     /**
      * @brief           Presents inference results along using the data presentation
      *                  object.
-     * @param[in]       platform           Reference to the hal platform object.
      * @param[in]       results            Vector of detection results to be displayed.
      * @return          true if successful, false otherwise.
      **/
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::object_detection::DetectionResult>& results);
+    static bool PresentInferenceResult(const std::vector<arm::app::object_detection::DetectionResult>& results);
 
     /**
      * @brief           Draw boxes directly on the LCD for all detected objects.
-     * @param[in]       platform           Reference to the hal platform object.
      * @param[in]       results            Vector of detection results to be displayed.
      * @param[in]       imageStartX        X coordinate where the image starts on the LCD.
      * @param[in]       imageStartY        Y coordinate where the image starts on the LCD.
      * @param[in]       imgDownscaleFactor How much image has been downscaled on LCD.
      **/
-    static void DrawDetectionBoxes(hal_platform& platform,
-                                   const std::vector<arm::app::object_detection::DetectionResult>& results,
-                                   uint32_t imgStartX,
-                                   uint32_t imgStartY,
-                                   uint32_t imgDownscaleFactor);
+    static void DrawDetectionBoxes(
+            const std::vector<arm::app::object_detection::DetectionResult>& results,
+           uint32_t imgStartX,
+           uint32_t imgStartY,
+           uint32_t imgDownscaleFactor);
 
     /* Object detection classification handler. */
     bool ObjectDetectionHandler(ApplicationContext& ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform&>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 1;
@@ -64,7 +60,7 @@
         constexpr uint32_t dataPsnTxtInfStartX = 150;
         constexpr uint32_t dataPsnTxtInfStartY = 40;
 
-        platform.data_psn->clear(COLOR_BLACK);
+        hal_lcd_clear(COLOR_BLACK);
 
         auto& model = ctx.Get<Model&>("model");
 
@@ -114,7 +110,7 @@
             image::RgbToGrayscale(curr_image, dstPtr, copySz);
 
             /* Display image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 (channelsImageDisplayed == 3) ? curr_image : dstPtr,
                 nCols, nRows, channelsImageDisplayed,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -125,7 +121,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Run inference over this image. */
@@ -138,7 +134,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(str_inf.c_str(), str_inf.size(),
+            hal_lcd_display_text(str_inf.c_str(), str_inf.size(),
                                     dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
 
             /* Detector post-processing*/
@@ -153,14 +149,14 @@
                 results);
 
             /* Draw boxes. */
-            DrawDetectionBoxes(platform, results, dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
+            DrawDetectionBoxes(results, dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
 
 #if VERIFY_TEST_OUTPUT
             arm::app::DumpTensor(modelOutput0);
             arm::app::DumpTensor(modelOutput1);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
@@ -173,11 +169,9 @@
         return true;
     }
 
-
-    static bool PresentInferenceResult(hal_platform& platform,
-                                       const std::vector<arm::app::object_detection::DetectionResult>& results)
+    static bool PresentInferenceResult(const std::vector<arm::app::object_detection::DetectionResult>& results)
     {
-        platform.data_psn->set_text_color(COLOR_GREEN);
+        hal_lcd_set_text_color(COLOR_GREEN);
 
         /* If profiling is enabled, and the time is valid. */
         info("Final results:\n");
@@ -192,8 +186,7 @@
         return true;
     }
 
-    static void DrawDetectionBoxes(hal_platform& platform,
-                                   const std::vector<arm::app::object_detection::DetectionResult>& results,
+    static void DrawDetectionBoxes(const std::vector<arm::app::object_detection::DetectionResult>& results,
                                    uint32_t imgStartX,
                                    uint32_t imgStartY,
                                    uint32_t imgDownscaleFactor)
@@ -202,20 +195,20 @@
 
         for (const auto& result: results) {
             /* Top line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     result.m_w/imgDownscaleFactor, lineThickness, COLOR_GREEN);
             /* Bot line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + (result.m_y0 + result.m_h)/imgDownscaleFactor - lineThickness,
                     result.m_w/imgDownscaleFactor, lineThickness, COLOR_GREEN);
 
             /* Left line. */
-            platform.data_psn->present_box(imgStartX + result.m_x0/imgDownscaleFactor,
+            hal_lcd_display_box(imgStartX + result.m_x0/imgDownscaleFactor,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     lineThickness, result.m_h/imgDownscaleFactor, COLOR_GREEN);
             /* Right line. */
-            platform.data_psn->present_box(imgStartX + (result.m_x0 + result.m_w)/imgDownscaleFactor - lineThickness,
+            hal_lcd_display_box(imgStartX + (result.m_x0 + result.m_w)/imgDownscaleFactor - lineThickness,
                     imgStartY + result.m_y0/imgDownscaleFactor,
                     lineThickness, result.m_h/imgDownscaleFactor, COLOR_GREEN);
         }
diff --git a/source/use_case/vww/src/MainLoop.cc b/source/use_case/vww/src/MainLoop.cc
index 30e85bf..03d6196 100644
--- a/source/use_case/vww/src/MainLoop.cc
+++ b/source/use_case/vww/src/MainLoop.cc
@@ -58,7 +58,7 @@
         int menuOption = common::MENU_OPT_RUN_INF_NEXT;
         if (bUseMenu) { 
             DisplayCommonMenu();
-            menuOption = arm::app::ReadUserInputAsInt(platform);
+            menuOption = arm::app::ReadUserInputAsInt();
             printf("\n");
         }
 
@@ -69,7 +69,7 @@
             case common::MENU_OPT_RUN_INF_CHOSEN: {
                 printf("    Enter the image index [0, %d]: ", NUMBER_OF_FILES-1);
                 fflush(stdout);
-                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt(platform));
+                auto imgIndex = static_cast<uint32_t>(arm::app::ReadUserInputAsInt());
                 executionSuccessful = ClassifyImageHandler(caseContext, imgIndex, false);
                 break;
             }
diff --git a/source/use_case/vww/src/UseCaseHandler.cc b/source/use_case/vww/src/UseCaseHandler.cc
index a47f191..56ba2b5 100644
--- a/source/use_case/vww/src/UseCaseHandler.cc
+++ b/source/use_case/vww/src/UseCaseHandler.cc
@@ -42,7 +42,6 @@
     /* Image inference classification handler. */
     bool ClassifyImageHandler(ApplicationContext &ctx, uint32_t imgIndex, bool runAll)
     {
-        auto& platform = ctx.Get<hal_platform &>("platform");
         auto& profiler = ctx.Get<Profiler&>("profiler");
 
         constexpr uint32_t dataPsnImgDownscaleFactor = 1;
@@ -89,7 +88,7 @@
         std::vector<ClassificationResult> results;
 
         do {
-            platform.data_psn->clear(COLOR_BLACK);
+            hal_lcd_clear(COLOR_BLACK);
 
             /* Strings for presentation/logging. */
             std::string str_inf{"Running inference... "};
@@ -98,7 +97,7 @@
             LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
 
             /* Display this image on the LCD. */
-            platform.data_psn->present_data_image(
+            hal_lcd_display_image(
                 static_cast<uint8_t *>(inputTensor->data.data),
                 nCols, nRows, nChannels,
                 dataPsnImgStartX, dataPsnImgStartY, dataPsnImgDownscaleFactor);
@@ -115,7 +114,7 @@
             }
 
             /* Display message on the LCD - inference running. */
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -129,7 +128,7 @@
 
             /* Erase. */
             str_inf = std::string(str_inf.size(), ' ');
-            platform.data_psn->present_data_text(
+            hal_lcd_display_text(
                                 str_inf.c_str(), str_inf.size(),
                                 dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
 
@@ -145,7 +144,7 @@
             arm::app::DumpTensor(outputTensor);
 #endif /* VERIFY_TEST_OUTPUT */
 
-            if (!PresentInferenceResult(platform, results)) {
+            if (!PresentInferenceResult(results)) {
                 return false;
             }
 
diff --git a/tests/common/ProfilerTests.cc b/tests/common/ProfilerTests.cc
index 1435dde..889e2f2 100644
--- a/tests/common/ProfilerTests.cc
+++ b/tests/common/ProfilerTests.cc
@@ -26,12 +26,10 @@
 TEST_CASE("Common: Test Profiler")
 {
     hal_platform    platform;
-    data_acq_module data_acq {};
-    data_psn_module data_psn {};
     platform_timer  timer {};
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* An invalid profiler shouldn't be of much use */
diff --git a/tests/use_case/img_class/ImgClassificationUCTest.cc b/tests/use_case/img_class/ImgClassificationUCTest.cc
index b989415..62d8eb8 100644
--- a/tests/use_case/img_class/ImgClassificationUCTest.cc
+++ b/tests/use_case/img_class/ImgClassificationUCTest.cc
@@ -44,12 +44,10 @@
 TEST_CASE("Inference by index", "[.]")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -84,12 +82,10 @@
 TEST_CASE("Inference run all images", "[.]")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -120,12 +116,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/kws/KWSHandlerTest.cc b/tests/use_case/kws/KWSHandlerTest.cc
index a7e75fb..3013611 100644
--- a/tests/use_case/kws/KWSHandlerTest.cc
+++ b/tests/use_case/kws/KWSHandlerTest.cc
@@ -44,12 +44,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -123,12 +121,10 @@
 TEST_CASE("Inference run all clips")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -161,12 +157,10 @@
 TEST_CASE("List all audio clips")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/noise_reduction/RNNNoiseUCTests.cc b/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
index c2b7ffb..a376dd5 100644
--- a/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
+++ b/tests/use_case/noise_reduction/RNNNoiseUCTests.cc
@@ -26,10 +26,8 @@
 
 #define PLATFORM \
 hal_platform    platform; \
-data_acq_module data_acq; \
-data_psn_module data_psn; \
 platform_timer  timer;    \
-hal_init(&platform, &data_acq, &data_psn, &timer); \
+hal_init(&platform, &timer); \
 hal_platform_init(&platform);
 
 #define CONTEXT \
diff --git a/tests/use_case/object_detection/ObjectDetectionUCTest.cc b/tests/use_case/object_detection/ObjectDetectionUCTest.cc
index 2e63f36..79e76bd 100644
--- a/tests/use_case/object_detection/ObjectDetectionUCTest.cc
+++ b/tests/use_case/object_detection/ObjectDetectionUCTest.cc
@@ -43,12 +43,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -75,12 +73,10 @@
 TEST_CASE("Inference run all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
@@ -107,12 +103,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform. */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     /* Model wrapper object. */
diff --git a/tests/use_case/vww/VisualWakeWordUCTests.cc b/tests/use_case/vww/VisualWakeWordUCTests.cc
index 700a6bb..16bd5a6 100644
--- a/tests/use_case/vww/VisualWakeWordUCTests.cc
+++ b/tests/use_case/vww/VisualWakeWordUCTests.cc
@@ -42,12 +42,10 @@
 TEST_CASE("Inference by index")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */
@@ -79,12 +77,10 @@
 TEST_CASE("Inference run all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */
@@ -112,12 +108,10 @@
 TEST_CASE("List all images")
 {
     hal_platform    platform;
-    data_acq_module data_acq;
-    data_psn_module data_psn;
     platform_timer  timer;
 
     /* Initialise the HAL and platform */
-    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_init(&platform, &timer);
     hal_platform_init(&platform);
 
     arm::app::VisualWakeWordModel model;    /* model wrapper object */
