diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c
index e5f087b243..4e5db6d03f 100644
--- a/frontend/drivers/platform_psp.c
+++ b/frontend/drivers/platform_psp.c
@@ -319,6 +319,8 @@ static void frontend_psp_exec(const char *path, bool should_load_game)
{
#if defined(HAVE_KERNEL_PRX) || defined(IS_SALAMANDER) || defined(VITA)
char argp[512] = {0};
+ char boot_params[1024];
+ char core_name[256];
SceSize args = 0;
#if !defined(VITA)
@@ -338,8 +340,23 @@ static void frontend_psp_exec(const char *path, bool should_load_game)
RARCH_LOG("Attempt to load executable: [%s].\n", path);
#if defined(VITA)
RARCH_LOG("Attempt to load executable: %d [%s].\n", args, argp);
- int ret = sceAppMgrLoadExec(path, args==0? NULL : (char * const*)((const char*[]){argp, 0}), NULL);
- RARCH_LOG("Attempt to load executable: [%d].\n", ret);
+#ifdef IS_SALAMANDER
+ sceAppMgrGetAppParam(boot_params);
+ if (strstr(boot_params,"psgm:play")) {
+ char *param1 = strstr(boot_params, "¶m=")+7;
+ char *param2 = strstr(boot_params, "¶m2=");
+ memcpy(core_name, param1, param2 - param1);
+ core_name[param2-param1] = 0;
+ sprintf(argp, param2 + 8);
+ int ret = sceAppMgrLoadExec(core_name, (char * const*)((const char*[]){argp, 0}), NULL);
+ RARCH_LOG("Attempt to load executable: [%d].\n", ret);
+ }
+ else
+#endif
+ {
+ int ret = sceAppMgrLoadExec(path, args == 0 ? NULL : (char * const*)((const char*[]){argp, 0}), NULL);
+ RARCH_LOG("Attempt to load executable: [%d].\n", ret);
+ }
#else
exitspawn_kernel(path, args, argp);
#endif
diff --git a/vita/launcher/Makefile b/vita/launcher/Makefile
new file mode 100644
index 0000000000..75b0ad0dc9
--- /dev/null
+++ b/vita/launcher/Makefile
@@ -0,0 +1,34 @@
+TITLE_ID = RAXXXXXXX
+TARGET = Launcher
+OBJS = main.o
+
+LIBS = -lSceAppMgr_stub
+
+PREFIX = arm-vita-eabi
+CC = $(PREFIX)-gcc
+CFLAGS = -Wl,-q -Wall
+ASFLAGS = $(CFLAGS)
+
+all: builder/eboot.bin
+
+%.vpk: eboot.bin
+ vita-mksfoex -s TITLE_ID=$(TITLE_ID) "Launcher" param.sfo
+ vita-pack-vpk -s param.sfo -b eboot.bin $@ \
+ -a contents/icon0.png=sce_sys/icon0.png \
+ -a contents/bg.png=sce_sys/livearea/contents/bg.png \
+ -a contents/startup.png=sce_sys/livearea/contents/startup.png \
+ -a contents/template.xml=sce_sys/livearea/contents/template.xml \
+ -a contents/args.txt=args.txt
+
+builder/eboot.bin: $(TARGET).velf
+ vita-make-fself -s $< $@
+
+%.velf: %.elf
+ vita-elf-create $< $@
+
+$(TARGET).elf: $(OBJS)
+ $(CC) $(CFLAGS) $^ $(LIBS) -o $@
+
+clean:
+ @rm -rf $(TARGET).vpk $(TARGET).velf $(TARGET).elf $(OBJS) \
+ eboot.bin param.sfo
diff --git a/vita/launcher/builder/build.bat b/vita/launcher/builder/build.bat
new file mode 100644
index 0000000000..9753e749c7
--- /dev/null
+++ b/vita/launcher/builder/build.bat
@@ -0,0 +1,8 @@
+@set /p title="Insert bubble name: "
+@set /p rom="Insert rom fullpath: "
+@set /p core="Insert core fullpath: "
+@set /p id="Insert bubble title ID (9 characters [NOTE: Only UPPERCASE letters or numbers]): "
+@echo|set /p="%core%"> "contents/core.txt"
+@echo|set /p="%rom%"> "contents/rom.txt"
+vita-mksfoex -s TITLE_ID=%id% "%title%" param.sfo
+vita-pack-vpk -s param.sfo -b eboot.bin "%title%.vpk" -a contents/icon0.png=sce_sys/icon0.png -a contents/bg.png=sce_sys/livearea/contents/bg.png -a contents/startup.png=sce_sys/livearea/contents/startup.png -a contents/template.xml=sce_sys/livearea/contents/template.xml -a contents/core.txt=core.txt -a contents/rom.txt=rom.txt
\ No newline at end of file
diff --git a/vita/launcher/builder/vita-mksfoex.exe b/vita/launcher/builder/vita-mksfoex.exe
new file mode 100644
index 0000000000..0da9a2a018
Binary files /dev/null and b/vita/launcher/builder/vita-mksfoex.exe differ
diff --git a/vita/launcher/builder/vita-pack-vpk.exe b/vita/launcher/builder/vita-pack-vpk.exe
new file mode 100644
index 0000000000..b75a75274d
Binary files /dev/null and b/vita/launcher/builder/vita-pack-vpk.exe differ
diff --git a/vita/launcher/contents/template.xml b/vita/launcher/contents/template.xml
new file mode 100644
index 0000000000..60e0b8ea32
--- /dev/null
+++ b/vita/launcher/contents/template.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ bg.png
+
+
+
+ startup.png
+
+
\ No newline at end of file
diff --git a/vita/launcher/main.c b/vita/launcher/main.c
new file mode 100644
index 0000000000..0c2ec2c1f1
--- /dev/null
+++ b/vita/launcher/main.c
@@ -0,0 +1,26 @@
+#include
+#include
+#include
+#include
+
+int main(int argc, const char *argv[]) {
+ char core[256], rom[256];
+ memset(core, 0, 256);
+ memset(rom, 0, 256);
+ FILE *f = fopen("app0:core.txt", "rb");
+ FILE *f2 = fopen("app0:rom.txt", "rb");
+ if (f && f2) {
+ fread(core, 1, 256, f);
+ fread(rom, 1, 256, f2);
+ fclose(f);
+ fclose(f2);
+ char uri[512];
+ sprintf(uri, "psgm:play?titleid=%s¶m=%s¶m2=%s", "RETROVITA", core, rom);
+
+ sceAppMgrLaunchAppByUri(0xFFFFF, uri);
+ }
+
+ sceKernelExitProcess(0);
+
+ return 0;
+}