diff --git a/applications/message_handler_openamp/main.cpp b/applications/message_handler_openamp/main.cpp
index 62bdc97..c120610 100644
--- a/applications/message_handler_openamp/main.cpp
+++ b/applications/message_handler_openamp/main.cpp
@@ -179,14 +179,14 @@
     auto messageHandler = std::make_shared<MessageHandler>(*rproc, "ethos-u-0.0");
 
     printf("TFLM arena. pa=%" PRIx32 ", da=%" PRIx32 ", len=%" PRIx32 "\n",
-           resourceTable.carveout.da,
            resourceTable.carveout.pa,
+           resourceTable.carveout.da,
            resourceTable.carveout.len);
 
     std::array<std::shared_ptr<InferenceRunner>, NUM_PARALLEL_TASKS> inferenceRunner;
 
     for (size_t i = 0; i < NUM_PARALLEL_TASKS; i++) {
-        auto tensorArena = static_cast<uint8_t *>(messageHandler->physicalToVirtual(resourceTable.carveout.pa));
+        auto tensorArena = reinterpret_cast<uint8_t *>(resourceTable.carveout.da);
 
         inferenceRunner[i] = std::make_shared<InferenceRunner>(&tensorArena[arenaSize * i],
                                                                arenaSize,
diff --git a/applications/message_handler_openamp/message_handler.cpp b/applications/message_handler_openamp/message_handler.cpp
index 4bd611d..9694f39 100644
--- a/applications/message_handler_openamp/message_handler.cpp
+++ b/applications/message_handler_openamp/message_handler.cpp
@@ -1,6 +1,5 @@
 /*
  * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
- *
  * SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the License); you may
@@ -308,7 +307,7 @@
     rsp.ifm_count = 0;
     rsp.ofm_count = 0;
 
-    bool failed = networkToVirtual(network);
+    bool failed = getNetwork(network);
 
     if (!failed) {
         InferenceProcess::InferenceParser parser;
@@ -333,15 +332,7 @@
 
     req = inference;
 
-    for (uint32_t i = 0; i < req.ifm_count; i++) {
-        bufferToVirtual(req.ifm[i]);
-    }
-
-    for (uint32_t i = 0; i < req.ofm_count; i++) {
-        bufferToVirtual(req.ofm[i]);
-    }
-
-    networkToVirtual(req.network);
+    getNetwork(req.network);
 
     inferenceQueue.send(message);
 }
@@ -368,35 +359,10 @@
     responseQueue.send(message);
 }
 
-bool MessageHandler::getNetwork(const EthosU::ethosu_core_network_buffer &buffer, void *&data, size_t &size) {
+bool MessageHandler::getNetwork(EthosU::ethosu_core_network_buffer &buffer) {
     switch (buffer.type) {
     case EthosU::ETHOSU_CORE_NETWORK_BUFFER:
-        data = physicalToVirtual(buffer.buffer.ptr);
-        size = buffer.buffer.size;
         return false;
-    case EthosU::ETHOSU_CORE_NETWORK_INDEX:
-        return getIndexedNetwork(buffer.index, data, size);
-    default:
-        LOG_WARN("Unsupported network model type. type=%" PRIu32, buffer.type);
-        return true;
-    }
-}
-
-bool MessageHandler::bufferToVirtual(EthosU::ethosu_core_buffer &buffer) {
-    void *ptr = physicalToVirtual(buffer.ptr);
-    if (ptr == nullptr) {
-        return true;
-    }
-
-    buffer.ptr = reinterpret_cast<uint32_t>(ptr);
-
-    return false;
-}
-
-bool MessageHandler::networkToVirtual(EthosU::ethosu_core_network_buffer &buffer) {
-    switch (buffer.type) {
-    case EthosU::ETHOSU_CORE_NETWORK_BUFFER:
-        return bufferToVirtual(buffer.buffer);
     case EthosU::ETHOSU_CORE_NETWORK_INDEX: {
         void *ptr;
         size_t size;
diff --git a/applications/message_handler_openamp/message_handler.hpp b/applications/message_handler_openamp/message_handler.hpp
index 779b05f..86b7c4d 100644
--- a/applications/message_handler_openamp/message_handler.hpp
+++ b/applications/message_handler_openamp/message_handler.hpp
@@ -1,6 +1,5 @@
 /*
  * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
- *
  * SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the License); you may
@@ -88,15 +87,12 @@
     void sendCancelInferenceRsp(const uint32_t src, const uint64_t msgId, const EthosU::ethosu_core_status status);
 
     EthosU::ethosu_core_msg_capabilities_rsp getCapabilities() const;
-    bool getNetwork(const EthosU::ethosu_core_network_buffer &buffer, void *&data, size_t &size);
+    bool getNetwork(EthosU::ethosu_core_network_buffer &buffer);
 
     // Tasks returning response messages
     static void responseTask(void *param);
 
 private:
-    bool bufferToVirtual(EthosU::ethosu_core_buffer &buffer);
-    bool networkToVirtual(EthosU::ethosu_core_network_buffer &buffer);
-
     InferenceQueue inferenceQueue;
     ResponseQueue responseQueue;
     EthosU::ethosu_core_msg_capabilities_rsp capabilities;
