diff --git a/dependencies/trampoline/src b/dependencies/trampoline/src
index 027e58ee..06e9f4d7 160000
--- a/dependencies/trampoline/src
+++ b/dependencies/trampoline/src
@@ -1 +1 @@
-Subproject commit 027e58ee9bdcfef285c16e731c8db218082b9639
+Subproject commit 06e9f4d7c8505a1e8c8ec4d65e21e93161eae6f7
diff --git a/media-layer/trampoline/src/GLESv1_CM.cpp b/media-layer/trampoline/src/GLESv1_CM.cpp
index baa6763f..e0071543 100644
--- a/media-layer/trampoline/src/GLESv1_CM.cpp
+++ b/media-layer/trampoline/src/GLESv1_CM.cpp
@@ -12,7 +12,7 @@ static int get_glFogfv_params_length(GLenum pname) {
 #endif
 CALL(11, glFogfv, void, (GLenum pname, const GLfloat *params))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(pname, copy_array(get_glFogfv_params_length(pname), params));
+    trampoline(true, pname, copy_array(get_glFogfv_params_length(pname), params));
 #else
     GLenum pname = args.next<GLenum>();
     const GLfloat *params = args.next_arr<GLfloat>();
@@ -90,7 +90,7 @@ static gl_state_t gl_state;
             state.type = type; \
             state.stride = stride; \
             state.pointer = uint32_t(pointer); \
-            trampoline(state); \
+            trampoline(true, state); \
         } \
     }
 #else
@@ -106,7 +106,7 @@ CALL_GL_POINTER(12, glVertexPointer)
 
 CALL(13, glLineWidth, void, (GLfloat width))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(width);
+    trampoline(true, width);
 #else
     func(args.next<float>());
     return 0;
@@ -115,7 +115,7 @@ CALL(13, glLineWidth, void, (GLfloat width))
 
 CALL(14, glBlendFunc, void, (GLenum sfactor, GLenum dfactor))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(sfactor, dfactor);
+    trampoline(true, sfactor, dfactor);
 #else
     GLenum sfactor = args.next<GLenum>();
     GLenum dfactor = args.next<GLenum>();
@@ -126,7 +126,7 @@ CALL(14, glBlendFunc, void, (GLenum sfactor, GLenum dfactor))
 
 CALL(15, glDrawArrays, void, (GLenum mode, GLint first, GLsizei count))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(gl_state, mode, first, count);
+    trampoline(true, gl_state, mode, first, count);
 #else
     gl_state_t gl_state = args.next<gl_state_t>();
     gl_state.send_to_driver();
@@ -140,7 +140,7 @@ CALL(15, glDrawArrays, void, (GLenum mode, GLint first, GLsizei count))
 
 CALL(16, glColor4f, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(red, green, blue, alpha);
+    trampoline(true, red, green, blue, alpha);
 #else
     GLfloat red = args.next<float>();
     GLfloat green = args.next<float>();
@@ -153,7 +153,7 @@ CALL(16, glColor4f, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alp
 
 CALL(17, glClear, void, (GLbitfield mask))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(mask);
+    trampoline(true, mask);
 #else
     func(args.next<GLbitfield>());
     return 0;
@@ -162,7 +162,7 @@ CALL(17, glClear, void, (GLbitfield mask))
 
 CALL(18, glBufferData, void, (GLenum target, GLsizeiptr size, const void *data, GLenum usage))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(gl_state.bound_array_buffer, target, copy_array(size, (unsigned char *) data), usage);
+    trampoline(true, gl_state.bound_array_buffer, target, copy_array(size, (unsigned char *) data), usage);
 #else
     glBindBuffer(GL_ARRAY_BUFFER, args.next<GLuint>());
     GLenum target = args.next<GLenum>();
@@ -176,7 +176,7 @@ CALL(18, glBufferData, void, (GLenum target, GLsizeiptr size, const void *data,
 
 CALL(19, glFogx, void, (GLenum pname, GLfixed param))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(pname, param);
+    trampoline(true, pname, param);
 #else
     GLenum pname = args.next<GLenum>();
     GLfixed param = args.next<GLfixed>();
@@ -187,7 +187,7 @@ CALL(19, glFogx, void, (GLenum pname, GLfixed param))
 
 CALL(20, glFogf, void, (GLenum pname, GLfloat param))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(pname, param);
+    trampoline(true, pname, param);
 #else
     GLenum pname = args.next<GLenum>();
     GLfloat param = args.next<GLfloat>();
@@ -198,7 +198,7 @@ CALL(20, glFogf, void, (GLenum pname, GLfloat param))
 
 CALL(21, glMatrixMode, void, (GLenum mode))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(mode);
+    trampoline(true, mode);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -209,7 +209,7 @@ CALL_GL_POINTER(22, glColorPointer)
 
 CALL(23, glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(x, y, width, height);
+    trampoline(true, x, y, width, height);
 #else
     GLint x = args.next<GLint>();
     GLint y = args.next<GLint>();
@@ -222,7 +222,7 @@ CALL(23, glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height))
 
 CALL(24, glTexParameteri, void, (GLenum target, GLenum pname, GLint param))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(gl_state.bound_texture, target, pname, param);
+    trampoline(true, gl_state.bound_texture, target, pname, param);
 #else
     glBindTexture(GL_TEXTURE_2D, args.next<GLuint>());
     GLenum target = args.next<GLenum>();
@@ -271,7 +271,7 @@ static int get_texture_size(const GLsizei width, const GLsizei height, const GLe
 
 CALL(25, glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(gl_state.bound_texture, target, level, internalformat, width, height, border, format, type, copy_array(get_texture_size(width, height, format, type, true), (const unsigned char *) pixels));
+    trampoline(true, gl_state.bound_texture, target, level, internalformat, width, height, border, format, type, copy_array(get_texture_size(width, height, format, type, true), (const unsigned char *) pixels));
 #else
     glBindTexture(GL_TEXTURE_2D, args.next<GLuint>());
     GLenum target = args.next<GLenum>();
@@ -290,7 +290,7 @@ CALL(25, glTexImage2D, void, (GLenum target, GLint level, GLint internalformat,
 
 CALL(26, glEnable, void, (GLenum cap))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(cap);
+    trampoline(true, cap);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -305,7 +305,7 @@ void glEnableClientState(const GLenum array) {
 
 CALL(28, glPolygonOffset, void, (GLfloat factor, GLfloat units))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(factor, units);
+    trampoline(true, factor, units);
 #else
     GLfloat factor = args.next<GLfloat>();
     GLfloat units = args.next<GLfloat>();
@@ -324,7 +324,7 @@ void glDisableClientState(const GLenum array) {
 
 CALL(30, glDepthRangef, void, (GLclampf near, GLclampf far))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(near, far);
+    trampoline(true, near, far);
 #else
     GLclampf near = args.next<GLclampf>();
     GLclampf far = args.next<GLclampf>();
@@ -335,7 +335,7 @@ CALL(30, glDepthRangef, void, (GLclampf near, GLclampf far))
 
 CALL(31, glDepthFunc, void, (GLenum func))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(func);
+    trampoline(true, func);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -354,7 +354,7 @@ void glBindBuffer(const GLenum target, const GLuint buffer) {
 
 CALL(33, glClearColor, void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(red, green, blue, alpha);
+    trampoline(true, red, green, blue, alpha);
 #else
     GLclampf red = args.next<GLclampf>();
     GLclampf green = args.next<GLclampf>();
@@ -367,7 +367,7 @@ CALL(33, glClearColor, void, (GLclampf red, GLclampf green, GLclampf blue, GLcla
 
 CALL(34, glPopMatrix, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -376,7 +376,7 @@ CALL(34, glPopMatrix, void, ())
 
 CALL(35, glLoadIdentity, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -385,7 +385,7 @@ CALL(35, glLoadIdentity, void, ())
 
 CALL(36, glScalef, void, (GLfloat x, GLfloat y, GLfloat z))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(x, y, z);
+    trampoline(true, x, y, z);
 #else
     GLfloat x = args.next<GLfloat>();
     GLfloat y = args.next<GLfloat>();
@@ -397,7 +397,7 @@ CALL(36, glScalef, void, (GLfloat x, GLfloat y, GLfloat z))
 
 CALL(37, glPushMatrix, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -406,7 +406,7 @@ CALL(37, glPushMatrix, void, ())
 
 CALL(38, glDepthMask, void, (GLboolean flag))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(flag);
+    trampoline(true, flag);
 #else
     func(args.next<GLboolean>());
     return 0;
@@ -415,7 +415,7 @@ CALL(38, glDepthMask, void, (GLboolean flag))
 
 CALL(39, glHint, void, (GLenum target, GLenum mode))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(target, mode);
+    trampoline(true, target, mode);
 #else
     GLenum target = args.next<GLenum>();
     GLenum mode = args.next<GLenum>();
@@ -431,7 +431,7 @@ static int get_glMultMatrixf_size() {
 #endif
 CALL(40, glMultMatrixf, void, (const GLfloat *m))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(copy_array(get_glMultMatrixf_size(), m));
+    trampoline(true, copy_array(get_glMultMatrixf_size(), m));
 #else
     func(args.next_arr<GLfloat>());
     return 0;
@@ -440,7 +440,7 @@ CALL(40, glMultMatrixf, void, (const GLfloat *m))
 
 CALL(42, glDeleteBuffers, void, (GLsizei n, const GLuint *buffers))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(copy_array(n, buffers));
+    trampoline(true, copy_array(n, buffers));
 #else
     uint32_t n;
     const GLuint *buffers = args.next_arr<GLuint>(&n);
@@ -451,7 +451,7 @@ CALL(42, glDeleteBuffers, void, (GLsizei n, const GLuint *buffers))
 
 CALL(43, glColorMask, void, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(red, green, blue, alpha);
+    trampoline(true, red, green, blue, alpha);
 #else
     GLboolean red = args.next<GLboolean>();
     GLboolean green = args.next<GLboolean>();
@@ -464,7 +464,7 @@ CALL(43, glColorMask, void, (GLboolean red, GLboolean green, GLboolean blue, GLb
 
 CALL(44, glTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(gl_state.bound_texture, target, level, xoffset, yoffset, width, height, format, type, copy_array(get_texture_size(width, height, format, type, true), (const unsigned char *) pixels));
+    trampoline(true, gl_state.bound_texture, target, level, xoffset, yoffset, width, height, format, type, copy_array(get_texture_size(width, height, format, type, true), (const unsigned char *) pixels));
 #else
     glBindTexture(GL_TEXTURE_2D, args.next<GLuint>());
     GLenum target = args.next<GLenum>();
@@ -483,7 +483,7 @@ CALL(44, glTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLin
 
 CALL(45, glGenTextures, void, (GLsizei n, GLuint *textures))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(n, uint32_t(textures));
+    trampoline(false, n, uint32_t(textures));
 #else
     GLsizei n = args.next<GLsizei>();
     GLuint *textures = new GLuint[n];
@@ -496,7 +496,7 @@ CALL(45, glGenTextures, void, (GLsizei n, GLuint *textures))
 
 CALL(46, glDeleteTextures, void, (GLsizei n, const GLuint *textures))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(copy_array(n, textures));
+    trampoline(true, copy_array(n, textures));
 #else
     uint32_t n;
     const GLuint *textures = args.next_arr<GLuint>(&n);
@@ -507,7 +507,7 @@ CALL(46, glDeleteTextures, void, (GLsizei n, const GLuint *textures))
 
 CALL(47, glAlphaFunc, void, (GLenum func, GLclampf ref))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(func, ref);
+    trampoline(true, func, ref);
 #else
     GLenum func2 = args.next<GLenum>();
     GLclampf ref = args.next<GLclampf>();
@@ -535,7 +535,7 @@ static int get_glGetFloatv_params_size(GLenum pname) {
 #endif
 CALL(48, glGetFloatv, void, (GLenum pname, GLfloat *params))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(pname, uint32_t(params));
+    trampoline(false, pname, uint32_t(params));
 #else
     GLenum pname = args.next<GLenum>();
     int size = get_glGetFloatv_params_size(pname);
@@ -559,7 +559,7 @@ void glBindTexture(const GLenum target, const GLuint texture) {
 
 CALL(50, glTranslatef, void, (GLfloat x, GLfloat y, GLfloat z))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(x, y, z);
+    trampoline(true, x, y, z);
 #else
     GLfloat x = args.next<GLfloat>();
     GLfloat y = args.next<GLfloat>();
@@ -571,7 +571,7 @@ CALL(50, glTranslatef, void, (GLfloat x, GLfloat y, GLfloat z))
 
 CALL(51, glShadeModel, void, (GLenum mode))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(mode);
+    trampoline(true, mode);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -580,7 +580,7 @@ CALL(51, glShadeModel, void, (GLenum mode))
 
 CALL(52, glOrthof, void, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(left, right, bottom, top, near, far);
+    trampoline(true, left, right, bottom, top, near, far);
 #else
     GLfloat left = args.next<GLfloat>();
     GLfloat right = args.next<GLfloat>();
@@ -595,7 +595,7 @@ CALL(52, glOrthof, void, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat t
 
 CALL(53, glDisable, void, (GLenum cap))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(cap);
+    trampoline(true, cap);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -604,7 +604,7 @@ CALL(53, glDisable, void, (GLenum cap))
 
 CALL(54, glCullFace, void, (GLenum mode))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(mode);
+    trampoline(true, mode);
 #else
     func(args.next<GLenum>());
     return 0;
@@ -613,7 +613,7 @@ CALL(54, glCullFace, void, (GLenum mode))
 
 CALL(55, glRotatef, void, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(angle, x, y, z);
+    trampoline(true, angle, x, y, z);
 #else
     GLfloat angle = args.next<GLfloat>();
     GLfloat x = args.next<GLfloat>();
@@ -626,7 +626,7 @@ CALL(55, glRotatef, void, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z))
 
 CALL(56, glViewport, void, (GLint x, GLint y, GLsizei width, GLsizei height))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(x, y, width, height);
+    trampoline(true, x, y, width, height);
 #else
     GLint x = args.next<GLint>();
     GLint y = args.next<GLint>();
@@ -639,7 +639,7 @@ CALL(56, glViewport, void, (GLint x, GLint y, GLsizei width, GLsizei height))
 
 CALL(57, glNormal3f, void, (GLfloat nx, GLfloat ny, GLfloat nz))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(nx, ny, nz);
+    trampoline(true, nx, ny, nz);
 #else
     GLfloat nx = args.next<GLfloat>();
     GLfloat ny = args.next<GLfloat>();
@@ -651,7 +651,7 @@ CALL(57, glNormal3f, void, (GLfloat nx, GLfloat ny, GLfloat nz))
 
 CALL(58, glIsEnabled, GLboolean, (GLenum cap))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return trampoline(cap);
+    return trampoline(false, cap);
 #else
     return func(args.next<GLenum>());
 #endif
@@ -676,7 +676,7 @@ static int get_glGetIntegerv_params_size(GLenum pname) {
 #endif
 CALL(61, glGetIntegerv, void, (GLenum pname, GLint *params))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(pname, uint32_t(params));
+    trampoline(false, pname, uint32_t(params));
 #else
     GLenum pname = args.next<GLenum>();
     int size = get_glGetIntegerv_params_size(pname);
@@ -690,7 +690,7 @@ CALL(61, glGetIntegerv, void, (GLenum pname, GLint *params))
 
 CALL(65, glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *data))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(x, y, width, height, format, type, uint32_t(data));
+    trampoline(false, x, y, width, height, format, type, uint32_t(data));
 #else
     GLint x = args.next<GLint>();
     GLint y = args.next<GLint>();
@@ -709,7 +709,7 @@ CALL(65, glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, G
 
 CALL(67, glGenBuffers, void, (GLsizei n, GLuint *buffers))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(n, uint32_t(buffers));
+    trampoline(false, n, uint32_t(buffers));
 #else
     GLsizei n = args.next<GLsizei>();
     GLuint *buffers = new GLuint[n];
diff --git a/media-layer/trampoline/src/guest/guest.cpp b/media-layer/trampoline/src/guest/guest.cpp
index d699e269..374e941c 100644
--- a/media-layer/trampoline/src/guest/guest.cpp
+++ b/media-layer/trampoline/src/guest/guest.cpp
@@ -26,7 +26,7 @@ static int get_pipe(const char *env) {
     std::string str = value;
     return std::stoi(str);
 }
-static uint32_t trampoline_pipe(const uint32_t id) {
+static uint32_t trampoline_pipe(const uint32_t id, const bool allow_early_return, const uint32_t length, const unsigned char *args) {
     // Get Pipes
     static int arguments_pipe = -1;
     static int return_value_pipe = -1;
@@ -34,20 +34,30 @@ static uint32_t trampoline_pipe(const uint32_t id) {
         arguments_pipe = get_pipe(TRAMPOLINE_ARGUMENTS_PIPE_ENV);
         return_value_pipe = get_pipe(TRAMPOLINE_RETURN_VALUE_PIPE_ENV);
     }
-    // Write ID
-    if (write(arguments_pipe, &id, sizeof(uint32_t)) != sizeof(uint32_t)) {
+    // Write Command
+    const trampoline_pipe_arguments cmd = {
+        .id = id,
+        .allow_early_return = allow_early_return,
+        .length = length,
+        .args_addr = uint32_t(args)
+    };
+    if (write(arguments_pipe, &cmd, sizeof(trampoline_pipe_arguments)) != sizeof(trampoline_pipe_arguments)) {
         ERR("Unable To Write Trampoline Command");
     }
     // Return
-    uint32_t ret;
-    if (read(return_value_pipe, &ret, sizeof(uint32_t)) != sizeof(uint32_t)) {
-        ERR("Unable To Read Trampoline Return Value");
+    if (length > 0 || !allow_early_return) {
+        uint32_t ret;
+        if (read(return_value_pipe, &ret, sizeof(uint32_t)) != sizeof(uint32_t)) {
+            ERR("Unable To Read Trampoline Return Value");
+        }
+        return ret;
+    } else {
+        return 0;
     }
-    return ret;
 }
 
 // Main Function
-uint32_t _raw_trampoline(const uint32_t id, const uint32_t length, const unsigned char *args) {
+uint32_t _raw_trampoline(const uint32_t id, const bool allow_early_return, const uint32_t length, const unsigned char *args) {
     // Configure Method
     static int use_syscall = -1;
     if (use_syscall == -1) {
@@ -57,30 +67,6 @@ uint32_t _raw_trampoline(const uint32_t id, const uint32_t length, const unsigne
     if (use_syscall) {
         return trampoline_syscall(id, length, args);
     } else {
-        return trampoline_pipe(id);
+        return trampoline_pipe(id, allow_early_return, length, args);
     }
 }
-
-// Arguments Memory
-unsigned char *get_arguments_memory() {
-    static unsigned char fallback[MAX_TRAMPOLINE_ARGS_SIZE];
-    // Find Result
-    static unsigned char *ret = nullptr;
-    if (ret == nullptr) {
-        ret = fallback;
-        // Try Shared Memory
-        const char *shared_memory_name = getenv(TRAMPOLINE_SHARED_MEMORY_ENV);
-        if (shared_memory_name != nullptr) {
-            int fd = shm_open(shared_memory_name, O_RDWR, 0600);
-            if (fd == -1) {
-                ERR("Unable To Open Shared Memory: %s", strerror(errno));
-            }
-            ret = (unsigned char *) mmap(nullptr, MAX_TRAMPOLINE_ARGS_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
-            if (ret == MAP_FAILED) {
-                ERR("Unable To Map Shared Memory: %s", strerror(errno));
-            }
-        }
-    }
-    // Return
-    return ret;
-}
\ No newline at end of file
diff --git a/media-layer/trampoline/src/guest/guest.h b/media-layer/trampoline/src/guest/guest.h
index fa9d22b4..7a7cf636 100644
--- a/media-layer/trampoline/src/guest/guest.h
+++ b/media-layer/trampoline/src/guest/guest.h
@@ -5,8 +5,7 @@
 #include "../common/common.h"
 
 // Trampoline Function
-unsigned char *get_arguments_memory();
-uint32_t _raw_trampoline(uint32_t id, uint32_t length, const unsigned char *args);
+uint32_t _raw_trampoline(uint32_t id, bool allow_early_return, uint32_t length, const unsigned char *args);
 
 // Compile Trampoline Arguments
 template <typename T>
@@ -53,12 +52,12 @@ void _add_to_trampoline_args(unsigned char *&out, const T &first, const Args...
 
 // Main Trampoline Function
 template <typename... Args>
-unsigned int _trampoline(unsigned int id, Args... args) {
-    static unsigned char *out = get_arguments_memory();
+unsigned int _trampoline(const unsigned int id, const bool allow_early_return, Args... args) {
+    static unsigned char out[MAX_TRAMPOLINE_ARGS_SIZE];
     unsigned char *end = out;
     _add_to_trampoline_args(end, args...);
     const uint32_t length = end - out;
-    return _raw_trampoline(id, length, out);
+    return _raw_trampoline(id, allow_early_return, length, out);
 }
 #define trampoline(...) _trampoline(_id, ##__VA_ARGS__)
 
diff --git a/media-layer/trampoline/src/media-layer-core.cpp b/media-layer/trampoline/src/media-layer-core.cpp
index c70c072b..f9c19aff 100644
--- a/media-layer/trampoline/src/media-layer-core.cpp
+++ b/media-layer/trampoline/src/media-layer-core.cpp
@@ -13,7 +13,7 @@
 
 CALL(0, SDL_Init, int, (uint32_t flags))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return trampoline(flags);
+    return trampoline(false, flags);
 #else
     uint32_t flags = args.next<uint32_t>();
     return func(flags);
@@ -22,7 +22,7 @@ CALL(0, SDL_Init, int, (uint32_t flags))
 
 CALL(1, SDL_PollEvent, int, (SDL_Event *event))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return trampoline(uint32_t(event));
+    return trampoline(false, uint32_t(event));
 #else
     SDL_Event event;
     const int ret = func(&event);
@@ -33,7 +33,7 @@ CALL(1, SDL_PollEvent, int, (SDL_Event *event))
 
 CALL(2, SDL_PushEvent, int, (SDL_Event *event))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return trampoline(*event);
+    return trampoline(false, *event);
 #else
     SDL_Event event = args.next<SDL_Event>();
     return func(&event);
@@ -42,7 +42,7 @@ CALL(2, SDL_PushEvent, int, (SDL_Event *event))
 
 CALL(3, SDL_WM_SetCaption, void, (const char *title, const char *icon))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(copy_array(title), copy_array(icon));
+    trampoline(true, copy_array(title), copy_array(icon));
 #else
     const char *title = args.next_arr<char>();
     const char *icon = args.next_arr<char>();
@@ -53,7 +53,7 @@ CALL(3, SDL_WM_SetCaption, void, (const char *title, const char *icon))
 
 CALL(4, media_toggle_fullscreen, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -62,7 +62,7 @@ CALL(4, media_toggle_fullscreen, void, ())
 
 CALL(5, SDL_WM_GrabInput, SDL_GrabMode, (SDL_GrabMode mode))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return (SDL_GrabMode) trampoline(mode);
+    return (SDL_GrabMode) trampoline(false, mode);
 #else
     return func(args.next<SDL_GrabMode>());
 #endif
@@ -70,7 +70,7 @@ CALL(5, SDL_WM_GrabInput, SDL_GrabMode, (SDL_GrabMode mode))
 
 CALL(6, SDL_ShowCursor, int, (int32_t toggle))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    return trampoline(toggle);
+    return trampoline(false, toggle);
 #else
     return func(args.next<int32_t>());
 #endif
@@ -78,7 +78,7 @@ CALL(6, SDL_ShowCursor, int, (int32_t toggle))
 
 CALL(8, media_swap_buffers, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -96,7 +96,7 @@ CALL(9, media_cleanup, void, ())
 
 CALL(10, media_get_framebuffer_size, void, (int *width, int *height))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(uint32_t(width), uint32_t(height));
+    trampoline(false, uint32_t(width), uint32_t(height));
 #else
     int width;
     int height;
@@ -109,7 +109,7 @@ CALL(10, media_get_framebuffer_size, void, (int *width, int *height))
 
 CALL(59, media_audio_update, void, (float volume, float x, float y, float z, float yaw))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(volume, x, y, z, yaw);
+    trampoline(true, volume, x, y, z, yaw);
 #else
     float volume = args.next<float>();
     float x = args.next<float>();
@@ -123,7 +123,7 @@ CALL(59, media_audio_update, void, (float volume, float x, float y, float z, flo
 
 CALL(60, media_audio_play, void, (const char *source, const char *name, float x, float y, float z, float pitch, float volume, int is_ui))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(copy_array(source), copy_array(name), x, y, z, pitch, volume, is_ui);
+    trampoline(true, copy_array(source), copy_array(name), x, y, z, pitch, volume, is_ui);
 #else
     const char *source = args.next_arr<char>();
     const char *name = args.next_arr<char>();
@@ -140,7 +140,7 @@ CALL(60, media_audio_play, void, (const char *source, const char *name, float x,
 
 CALL(62, media_set_interactable, void, (int is_interactable))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(is_interactable);
+    trampoline(true, is_interactable);
 #else
     func(args.next<int>());
     return 0;
@@ -149,7 +149,7 @@ CALL(62, media_set_interactable, void, (int is_interactable))
 
 CALL(63, media_disable_vsync, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -158,7 +158,7 @@ CALL(63, media_disable_vsync, void, ())
 
 CALL(64, media_set_raw_mouse_motion_enabled, void, (int enabled))
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline(enabled);
+    trampoline(true, enabled);
 #else
     func(args.next<int>());
     return 0;
@@ -167,7 +167,7 @@ CALL(64, media_set_raw_mouse_motion_enabled, void, (int enabled))
 
 CALL(66, media_force_egl, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;
@@ -176,7 +176,7 @@ CALL(66, media_force_egl, void, ())
 
 CALL(68, media_ensure_loaded, void, ())
 #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
-    trampoline();
+    trampoline(true);
 #else
     func();
     return 0;