diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py
index 537a2f3c859157f8aba3c92d9aa74a5f68e86740..c144f360033d76c42ad02d1078baa3a2742bb8e5 100755
--- a/linux-ramdump-parser-v2/ramdump.py
+++ b/linux-ramdump-parser-v2/ramdump.py
@@ -17,6 +17,9 @@ import gzip
 import functools
 import string
 import random
+import platform
+import stat
+
 from boards import get_supported_boards, get_supported_ids
 from tempfile import NamedTemporaryFile
 
@@ -435,7 +438,10 @@ class RamDump():
                 if urc < 0:
                     break
 
-    def __init__(self, vmlinux_path, nm_path, gdb_path, objdump_path, ebi, file_path, phys_offset, outdir, qtf_path, hw_id=None, hw_version=None, arm64=False, page_offset=None, qtf=False):
+    def __init__(self, vmlinux_path, nm_path, gdb_path, objdump_path, ebi,
+                 file_path, phys_offset, outdir, qtf_path, hw_id=None,
+                 hw_version=None, arm64=False, page_offset=None, qtf=False,
+                 t32_host_system=None):
         self.ebi_files = []
         self.phys_offset = None
         self.tz_start = 0
@@ -457,6 +463,7 @@ class RamDump():
         self.thread_size = 8192
         self.qtf_path = qtf_path
         self.qtf = qtf
+        self.t32_host_system = t32_host_system
         if ebi is not None:
             # TODO sanity check to make sure the memory regions don't overlap
             for file_path, start, end in ebi:
@@ -685,16 +692,22 @@ class RamDump():
                     (imemc, imemc_start, imemc_end, imemc_path))
         return True
 
-    # TODO support linux launcher, for when linux T32 actually happens
     def create_t32_launcher(self):
         out_path = self.outdir
 
+        t32_host_system = self.t32_host_system or platform.system()
+
         launch_config = open(out_path + '/t32_config.t32', 'wb')
         launch_config.write('OS=\n')
         launch_config.write('ID=T32_1000002\n')
-        launch_config.write('TMP=C:\\TEMP\n')
-        launch_config.write('SYS=C:\\T32\n')
-        launch_config.write('HELP=C:\\T32\\pdf\n')
+        if t32_host_system != 'Linux':
+            launch_config.write('TMP=C:\\TEMP\n')
+            launch_config.write('SYS=C:\\T32\n')
+            launch_config.write('HELP=C:\\T32\\pdf\n')
+        else:
+            launch_config.write('TMP=/tmp\n')
+            launch_config.write('SYS=/opt/t32\n')
+            launch_config.write('HELP=/opt/t32/pdf\n')
         launch_config.write('\n')
         launch_config.write('PBI=SIM\n')
         launch_config.write('SCREEN=\n')
@@ -711,7 +724,9 @@ class RamDump():
 
         startup_script = open(out_path + '/t32_startup_script.cmm', 'wb')
 
-        if self.arm64 and (self.hw_id == 8916 or self.hw_id == 8939 or self.hw_id == 8936):
+        is_cortex_a53 = self.hw_id == 8916 or self.hw_id == 8939 or self.hw_id == 8936
+
+        if self.arm64 and is_cortex_a53:
             startup_script.write('sys.cpu CORTEXA53\n'.encode('ascii', 'ignore'))
         else:
             startup_script.write('sys.cpu {0}\n'.format(self.cpu_type).encode('ascii', 'ignore'))
@@ -724,7 +739,7 @@ class RamDump():
         if self.arm64:
             startup_script.write('Register.Set NS 1\n'.encode('ascii', 'ignore'))
 
-            if self.hw_id == 8916 or self.hw_id == 8939:
+            if is_cortex_a53:
                 startup_script.write('Data.Set SPR:0x30201 %Quad 0x000000008007D000\n'.encode('ascii', 'ignore'))
                 startup_script.write('Data.Set SPR:0x30202 %Quad 0x00000012B5193519\n'.encode('ascii', 'ignore'))
                 startup_script.write('Data.Set SPR:0x30A20 %Quad 0x000000FF440C0400\n'.encode('ascii', 'ignore'))
@@ -757,16 +772,30 @@ class RamDump():
             startup_script.write('mmu.scan\n'.encode('ascii', 'ignore'))
         startup_script.write(
             ('data.load.elf ' + os.path.abspath(self.vmlinux) + ' /nocode\n').encode('ascii', 'ignore'))
-        if self.arm64:
-            startup_script.write(
-                 'task.config C:\\T32\\demo\\arm64\\kernel\\linux\\linux-3.x\\linux3.t32\n'.encode('ascii', 'ignore'))
-            startup_script.write(
-                 'menu.reprogram C:\\T32\\demo\\arm64\\kernel\\linux\\linux-3.x\\linux.men\n'.encode('ascii', 'ignore'))
+
+        if t32_host_system != 'Linux':
+            if self.arm64:
+                startup_script.write(
+                     'task.config C:\\T32\\demo\\arm64\\kernel\\linux\\linux-3.x\\linux3.t32\n'.encode('ascii', 'ignore'))
+                startup_script.write(
+                     'menu.reprogram C:\\T32\\demo\\arm64\\kernel\\linux\\linux-3.x\\linux.men\n'.encode('ascii', 'ignore'))
+            else:
+                startup_script.write(
+                    'task.config c:\\t32\\demo\\arm\\kernel\\linux\\linux.t32\n'.encode('ascii', 'ignore'))
+                startup_script.write(
+                    'menu.reprogram c:\\t32\\demo\\arm\\kernel\\linux\\linux.men\n'.encode('ascii', 'ignore'))
         else:
-            startup_script.write(
-                'task.config c:\\t32\\demo\\arm\\kernel\\linux\\linux.t32\n'.encode('ascii', 'ignore'))
-            startup_script.write(
-                'menu.reprogram c:\\t32\\demo\\arm\\kernel\\linux\\linux.men\n'.encode('ascii', 'ignore'))
+            if self.arm64:
+                startup_script.write(
+                    'task.config /opt/t32/demo/arm64/kernel/linux/linux-3.x/linux3.t32\n'.encode('ascii', 'ignore'))
+                startup_script.write(
+                    'menu.reprogram /opt/t32/demo/arm64/kernel/linux/linux-3.x/linux.men\n'.encode('ascii', 'ignore'))
+            else:
+                startup_script.write(
+                    'task.config /opt/t32/demo/arm/kernel/linux/linux.t32\n'.encode('ascii', 'ignore'))
+                startup_script.write(
+                    'menu.reprogram /opt/t32/demo/arm/kernel/linux/linux.men\n'.encode('ascii', 'ignore'))
+
         startup_script.write('task.dtask\n'.encode('ascii', 'ignore'))
         startup_script.write(
             'v.v  %ASCII %STRING linux_banner\n'.encode('ascii', 'ignore'))
@@ -778,16 +807,29 @@ class RamDump():
                 'do {0}\n'.format(out_path + '/core0_regs.cmm').encode('ascii', 'ignore'))
         startup_script.close()
 
-        t32_bat = open(out_path + '/launch_t32.bat', 'wb')
-        if self.arm64:
-            t32_binary = 'C:\\T32\\bin\\windows64\\t32MARM64.exe'
-        elif self.hw_id == 8916 or self.hw_id == 8939 or self.hw_id == 8936:
-            t32_binary = 'C:\\T32\\bin\\windows64\\t32MARM.exe'
+        if t32_host_system != 'Linux':
+            t32_bat = open(out_path + '/launch_t32.bat', 'wb')
+            if self.arm64:
+                t32_binary = 'C:\\T32\\bin\\windows64\\t32MARM64.exe'
+            elif is_cortex_a53:
+                t32_binary = 'C:\\T32\\bin\\windows64\\t32MARM.exe'
+            else:
+                t32_binary = 'c:\\t32\\t32MARM.exe'
+            t32_bat.write(('start '+ t32_binary + ' -c ' + out_path + '/t32_config.t32, ' +
+                          out_path + '/t32_startup_script.cmm').encode('ascii', 'ignore'))
         else:
-            t32_binary = 'c:\\t32\\t32MARM.exe'
+            t32_bat = open(out_path + '/launch_t32.sh', 'wb')
+            if self.arm64:
+                t32_binary = '/opt/t32/bin/pc_linux64/t32marm64-qt'
+            elif is_cortex_a53:
+                t32_binary = '/opt/t32/bin/pc_linux64/t32marm-qt'
+            else:
+                t32_binary = '/opt/t32/bin/pc_linux64/t32marm-qt'
+            t32_bat.write('#!/bin/sh\n\n')
+            t32_bat.write('cd $(dirname $0)\n')
+            t32_bat.write('{} -c t32_config.t32, t32_startup_script.cmm &\n'.format(t32_binary))
+            os.chmod(out_path + '/launch_t32.sh', stat.S_IRWXU)
 
-        t32_bat.write(('start '+ t32_binary + ' -c ' + out_path + '/t32_config.t32, ' +
-                      out_path + '/t32_startup_script.cmm').encode('ascii', 'ignore'))
         t32_bat.close()
         print_out_str(
             '--- Created a T32 Simulator launcher (run {0}/launch_t32.bat)'.format(out_path))
diff --git a/linux-ramdump-parser-v2/ramparse.py b/linux-ramdump-parser-v2/ramparse.py
index 9920ee95eae1e6bac378cda8594c94f770966084..35d7531d61b8eb7636fe453d59fb325a0230a134 100755
--- a/linux-ramdump-parser-v2/ramparse.py
+++ b/linux-ramdump-parser-v2/ramparse.py
@@ -99,6 +99,9 @@ if __name__ == '__main__':
     parser.add_option('-o', '--outdir', dest='outdir', help='Output directory')
     parser.add_option('-s', '--t32launcher', action='store_true',
                       dest='t32launcher', help='Create T32 simulator launcher', default=False)
+    parser.add_option('', '--t32-host-system', dest='t32_host_system',
+                      metavar='HOST', choices=('Linux', 'Windows'),
+                      help='T32 host system (for launcher script generation). Supported choices: "Linux", "Windows". Defaults to the system ramparse.py is running on.')
     parser.add_option('-x', '--everything', action='store_true',
                       dest='everything', help='Output everything (may be slow')
     parser.add_option('-f', '--output-file', dest='outfile',
@@ -274,7 +277,8 @@ if __name__ == '__main__':
                    options.autodump, options.phys_offset, options.outdir, options.qtf_path,
                    options.force_hardware, options.force_hardware_version,
                    arm64=options.arm64,
-                   page_offset=options.page_offset, qtf=options.qtf)
+                   page_offset=options.page_offset, qtf=options.qtf,
+                   t32_host_system=options.t32_host_system)
 
     if options.shell or options.classic_shell:
         print("Entering interactive shell mode.")