diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py
index 7f27a9e3f6255ef4cac7671785d2af0ee00f9e31..5930a349caa31871a46dea965b41b10ae199ce12 100644
--- a/utility/obsw_binary_uploader.py
+++ b/utility/obsw_binary_uploader.py
@@ -12,6 +12,7 @@ import tkinter as tk
 from tkinter import filedialog
 from collections import deque
 from glob import glob
+from typing import Deque
 
 from tmtc_core.comIF.obsw_com_interface import CommunicationInterface
 from tc.obsw_tc_service23_sdcard import FileTransferHelper
@@ -19,20 +20,29 @@ import config.obsw_config as g
 from tmtc_core.utility.obsw_tmtc_printer import TmTcPrinter, DisplayMode
 from tmtc_core.utility.obsw_logger import get_logger
 from tmtc_core.sendreceive.obsw_tm_listener import TmListener
-from tmtc_core.tm.obsw_pus_tm_factory import PusTmQueueT
 
 LOGGER = get_logger()
 
 
+class BinaryFileUploader:
+    def __init__(self):
+        pass
+
+
 def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinter,
                         tm_listener: TmListener):
+    """
+    TODO: This should be a class..
+    @param com_if:
+    @param tmtc_printer:
+    @param tm_listener:
+    @return:
+    """
     gui_cl_prompt = input("GUI(0) or command line version (1)? [0/1]: ")
     if gui_cl_prompt == 0:
         gui_cl_prompt = True
     else:
         gui_cl_prompt = False
-    # TODO: prompt whether this is a binary upload or a normal file upload. Or use op code
-    #       two different commands to achieve the same.
     print("Please select file to upload: ")
     file_path = ""
     if gui_cl_prompt:
@@ -149,11 +159,35 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte
     else:
         print_string += " File will not be locked."
     LOGGER.info(print_string)
+
+    reception_deque = deque()
+    perform_send_algorithm(tc_queue, total_num_packets, com_if, tmtc_printer, tm_listener,
+                           reception_deque)
+
+    print_string = "BinaryUploader: All binary packets were sent!"
+    LOGGER.info(print_string)
+    print_string = str(reception_deque.__len__()) + " replies received."
+
+    LOGGER.info(print_string)
+    time.sleep(15)
+    reception_deque.extend(tm_listener.retrieve_tm_packet_queue())
+    for tm_list in reception_deque:
+        for tm_packet in tm_list:
+            if tm_packet.get_service() == 23 and tm_packet.get_subservice() == 132:
+                # tmtc_printer.print_telemetry(tm_packet)
+                pass
+    tm_listener.clear_tm_packet_queue()
+    LOGGER.info("Transitioning back to listener mode..")
+
+
+def perform_send_algorithm(tc_queue: Deque, number_of_packets: int, com_if: CommunicationInterface,
+                           tmtc_printer: TmTcPrinter, tm_listener: TmListener,
+                           reception_deque: Deque):
     interval = 0.6
+    last_check = time.time()
     last_sent = time.time()
-    total_time = interval * total_num_packets
+    total_time = interval * number_of_packets
     idx = 1
-    reception_deque: PusTmQueueT = deque()
     while tc_queue:
         next_send = last_sent + interval
         (tc_packet, tc_info) = tc_queue.pop()
@@ -168,28 +202,17 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte
         remaining_time_string = "Remaining time: " + \
                                 str(round(total_time - (idx - 2) * interval, 2)) + \
                                 " seconds"
-        print_progress_bar(idx - 2, total_num_packets, print_end="\n", suffix=remaining_time_string)
+        print_progress_bar(idx - 2, number_of_packets, print_end="\n", suffix=remaining_time_string)
         # sys.stdout.write("\033[F")  # Cursor up one line
-        reception_deque.extend(tm_listener.retrieve_tm_packet_queue())
+        packets_received = tm_listener.retrieve_tm_packet_queue()
+        reception_deque.extend(packets_received)
+        # Every 5 seconds, check whether any reply has been received. If not, cancel operation.
+        if time.time() - last_check > 5.0 and len(packets_received) == 0:
+            LOGGER.warning("No replies are being received, cancelling upload operation..")
         time_to_sleep = next_send - time.time()
         last_sent = next_send
         time.sleep(time_to_sleep)
 
-    print_string = "BinaryUploader: All binary packets were sent!"
-    LOGGER.info(print_string)
-    print_string = str(reception_deque.__len__()) + " replies received."
-
-    LOGGER.info(print_string)
-    time.sleep(15)
-    reception_deque.extend(tm_listener.retrieve_tm_packet_queue())
-    for tm_list in reception_deque:
-        for tm_packet in tm_list:
-            if tm_packet.get_service() == 23 and tm_packet.get_subservice() == 132:
-                # tmtc_printer.print_telemetry(tm_packet)
-                pass
-    tm_listener.clear_tm_packet_queue()
-    LOGGER.info("Transitioning back to listener mode..")
-
 
 # https://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console
 # Thank you Greensticks :-)