diff --git a/config/obsw_config.py b/config/obsw_config.py
index d45e1cc58d92bfa2ddd48b4da5431a09c3b76d22..55c878e8db53a89d8b3aacf62c11ff50075548f5 100644
--- a/config/obsw_config.py
+++ b/config/obsw_config.py
@@ -10,7 +10,7 @@
 import struct
 import pprint
 import logging
-from socket import INADDR_ANY
+# from tmtc_core.tc.obsw_pus_tc_base import PusTelecommand
 from config.obsw_definitions import ModeList, ComIF
 
 """
@@ -69,6 +69,7 @@ G_APID = 0x73
 
 # Binary Upload Settings
 G_MAX_BINARY_FRAME_LENGTH = 1500
+G_MAX_APP_DATA_LENGTH = G_MAX_BINARY_FRAME_LENGTH - 10
 
 G_COM_IF = 2
 # COM Port for serial communication
diff --git a/tc/obsw_tc_service23.py b/tc/obsw_tc_service23.py
index e5604065319ea222392b8070740a5e14c08830b8..5366c5bd92d79acaaeca494d7ec9484771c824d3 100644
--- a/tc/obsw_tc_service23.py
+++ b/tc/obsw_tc_service23.py
@@ -201,6 +201,81 @@ def generate_format_sd_card_packet(
     app_data = bytearray(object_id)
     return PusTelecommand(service=23, subservice=182, ssc=ssc, app_data=app_data)
 
+def generate_generic_folder_structure(
+        tc_queue: Deque, init_ssc: int, object_id: bytearray = g.SD_CARD_HANDLER_ID,
+        iobc: bool = False):
+    tc_queue.appendleft(("print", "Creating TC folder"))
+    command = generate_mkdir_srv23_9_packet("TC", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TC", directory_name="LARGE", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TC", directory_name="SMALL", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+
+    tc_queue.appendleft(("print", "Creating TM folder"))
+    command = generate_mkdir_srv23_9_packet("TM", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TM", directory_name="HK", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TM", directory_name="SC", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TM/SC", directory_name="LARGE", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="TM/SC", directory_name="SMALL", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+
+    tc_queue.appendleft(("print", "Creating BIN folder"))
+    command = generate_mkdir_srv23_9_packet("BIN", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    command = generate_mkdir_srv23_9_packet(
+        repository_path="BIN", directory_name="AT91", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+    init_ssc += 1
+    if iobc:
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN", directory_name="IOBC", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN/IOBC", directory_name="BL", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN/IOBC", directory_name="OBSW", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+    else:
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN", directory_name="AT91", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN/AT91", directory_name="BL", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+        command = generate_mkdir_srv23_9_packet(
+            repository_path="BIN/AT91", directory_name="OBSW", ssc=init_ssc)
+        tc_queue.appendleft(command.pack_command_tuple())
+        init_ssc += 1
+
+    tc_queue.appendleft(("print", "Creating MISC folder"))
+    command = generate_mkdir_srv23_9_packet("MISC", ssc=init_ssc)
+    tc_queue.appendleft(command.pack_command_tuple())
+
 
 def generate_create_file_srv23_1_packet(
         filename: str, repository_path: str, ssc: int, max_size_of_app_data: int,
@@ -373,6 +448,10 @@ def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque:
         tc_queue.append(("print", "Printing active file system"))
         command = generate_print_sd_card_packet(ssc=2300)
         tc_queue.appendleft(command.pack_command_tuple())
+    elif op_code == 181:
+        tc_queue.append(("print", "Clearing active file system"))
+        command = generate_clear_sd_card_packet(ssc=2300)
+        tc_queue.appendleft(command.pack_command_tuple())
     elif op_code == 182:
         tc_queue.append(("print", "Formatting active file system"))
         command = generate_format_sd_card_packet(ssc=2300)
diff --git a/tmtc_core b/tmtc_core
index 4d37769e7c8254bf7e20a016cf076ae48db31e57..5313a6e1fbc3e15d3b5145c6c7a1b741b843b2f9 160000
--- a/tmtc_core
+++ b/tmtc_core
@@ -1 +1 @@
-Subproject commit 4d37769e7c8254bf7e20a016cf076ae48db31e57
+Subproject commit 5313a6e1fbc3e15d3b5145c6c7a1b741b843b2f9
diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py
index fa58a0ea2e0b62a4089a5d2eb3a6a42311b8049a..aeae7054b9ffa65ec17ec097a0eb828b43a3134b 100644
--- a/utility/obsw_binary_uploader.py
+++ b/utility/obsw_binary_uploader.py
@@ -12,15 +12,21 @@ from tkinter import filedialog
 from collections import deque
 
 from tmtc_core.comIF.obsw_com_interface import CommunicationInterface
-from tc.obsw_tc_service23 import FileTransferHelper
+from tc.obsw_tc_service23 import FileTransferHelper, generate_generic_folder_structure
 import config.obsw_config as g
+from tmtc_core.tc.obsw_pus_tc_base import PusTelecommand
+from tmtc_core.utility.obsw_logger import get_logger
 
+LOGGER = get_logger()
 
-def perform_binary_upload(comIF: CommunicationInterface):
+
+def perform_binary_upload(com_if: CommunicationInterface):
     print("Please select file to upload")
     root = tk.Tk()
     root.withdraw()
     root.wm_attributes('-topmost', 1)
+    # TODO: implement command line version which just parses the _bin folder, displays the options
+    #       and asks for a selection.
     file_path = filedialog.askopenfilename(parent=root)
     print("File select: " + str(file_path))
     calc_hamming_code = input("Calculate and send hamming code? [y/n]: ")
@@ -31,9 +37,9 @@ def perform_binary_upload(comIF: CommunicationInterface):
         calc_hamming_code = False
         print("Hamming code will not be calculated")
 
-    # Right now, the size of PUS packets is limited to 1500 bytes. Therefore, we split up the
-    # binary.
-    frame_length = g.G_MAX_BINARY_FRAME_LENGTH
+    # Right now, the size of PUS packets is limited to 1500 bytes which also limits the app
+    # data length.
+    frame_length = g.G_MAX_APP_DATA_LENGTH
 
     if calc_hamming_code:
         # now we calculate the hamming code
@@ -43,21 +49,30 @@ def perform_binary_upload(comIF: CommunicationInterface):
     with open(file_path, 'rb') as file:
         data_to_read = bytearray(file.read())
 
-    print("Test")
+    print("Generating folder structure..")
     tc_queue = deque()
-
-    # Delete existing binary file first, otherwise data might be appeneded to otherwise
-    # valid file which already exists.
-    file_transfer_helper = FileTransferHelper(
-        tc_queue=tc_queue, max_size_of_app_data=1500, target_repository="BIN/AT91/BL",
-        target_filename="bl.bin")
-
-    file_transfer_helper.generate_packets(1)
-    file_transfer_helper.set_to_delete_old_file()
-    # We have to split the binary here first
-    # generate_append_to_file_packets_automatically(tc_queue, ,, 1024, data_to_read)
+    generate_generic_folder_structure(tc_queue, 0)
     while tc_queue:
         (tc_packet, tc_info) = tc_queue.pop()
-        comIF.send_telecommand(tc_packet, tc_info)
-        print("Sending..")
-        time.sleep(30.0)
+        if not isinstance(tc_packet, str):
+            com_if.send_telecommand(tc_packet, tc_info)
+        elif tc_packet == "print":
+            LOGGER.info(tc_info)
+
+        time.sleep(0.5)
+
+    # Delete existing binary file first, otherwise data might be appended to otherwise
+    # valid file which already exists.
+    # file_transfer_helper = FileTransferHelper(
+    #     tc_queue=tc_queue, max_size_of_app_data=1500, target_repository="BIN/AT91/BL",
+    #     target_filename="bl.bin")
+    #
+    # file_transfer_helper.generate_packets(1)
+    # file_transfer_helper.set_to_delete_old_file()
+    # # We have to split the binary here first
+    # # generate_append_to_file_packets_automatically(tc_queue, ,, 1024, data_to_read)
+    # while tc_queue:
+    #     (tc_packet, tc_info) = tc_queue.pop()
+    #     com_if.send_telecommand(tc_packet, tc_info)
+    #     print("Sending..")
+    #     time.sleep(30.0)