diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c
index a4a6ec1729..a9cf32b072 100644
--- a/frontend/menu/rmenu.c
+++ b/frontend/menu/rmenu.c
@@ -884,144 +884,91 @@ static void set_keybind_digital(uint64_t default_retro_joypad_id, uint64_t input
 
 #if defined(HAVE_OSKUTIL)
 #ifdef __CELLOS_LV2__
-static char filepath[PATH_MAX];
 
 static bool osk_callback_enter_rsound(void *data)
 {
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-
-   if(!(OSK_IS_RUNNING(g_extern.console.misc.oskutil_handle)) && g_extern.console.misc.oskutil_handle.text_can_be_fetched)
+   if (g_extern.lifecycle_mode_state & (1ULL << MODE_OSK_ENTRY_SUCCESS))
    {
-      strlcpy(g_settings.audio.device, OUTPUT_TEXT_STRING(g_extern.console.misc.oskutil_handle), sizeof(g_settings.audio.device));
-
-      if(!rstate->osk_unbind_after_finish)
-         rstate->osk_callback = NULL;
-
-      return true;
+      RARCH_LOG("OSK - Applying input data.\n");
+      char tmp_str[256];
+      int num = wcstombs(tmp_str, g_extern.console.misc.oskutil_handle.text_buf, sizeof(tmp_str));
+      tmp_str[num] = 0;
+      snprintf(g_settings.audio.device, sizeof(g_settings.audio.device), "%s", tmp_str);
+      goto do_exit;
    }
+   else if (g_extern.lifecycle_mode_state & (1ULL << MODE_OSK_ENTRY_FAIL))
+      goto do_exit;
+
    return false;
+
+do_exit:
+   g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_DRAW) | (1ULL << MODE_OSK_ENTRY_SUCCESS) |
+         (1ULL << MODE_OSK_ENTRY_FAIL));
+   return true;
 }
 
 static bool osk_callback_enter_rsound_init(void *data)
 {
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-
    oskutil_write_initial_message(&g_extern.console.misc.oskutil_handle, L"192.168.1.1");
    oskutil_write_message(&g_extern.console.misc.oskutil_handle, L"Enter IP address for the RSound Server.");
    oskutil_start(&g_extern.console.misc.oskutil_handle);
 
-   rstate->osk_unbind_after_finish = true;
-   rstate->osk_callback = osk_callback_enter_rsound;
-
    return true;
 }
 
-static bool osk_callback_enter_title_init(void *data);
-
 static bool osk_callback_enter_filename(void *data)
 {
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-   char filename_tmp[256];
-
-   if(!(OSK_IS_RUNNING(g_extern.console.misc.oskutil_handle)) && g_extern.console.misc.oskutil_handle.text_can_be_fetched)
+   if (g_extern.lifecycle_mode_state & (1ULL << MODE_OSK_ENTRY_SUCCESS))
    {
-      strlcpy(filename_tmp, OUTPUT_TEXT_STRING(g_extern.console.misc.oskutil_handle), sizeof(filename_tmp));
+      RARCH_LOG("OSK - Applying input data.\n");
+      char tmp_str[256];
+      char filepath[PATH_MAX];
+      int num = wcstombs(tmp_str, g_extern.console.misc.oskutil_handle.text_buf, sizeof(tmp_str));
+      tmp_str[num] = 0;
+      snprintf(tmp_str, sizeof(tmp_str), "%s", tmp_str);
 
-      switch(rstate->osk_param)
+      switch(rmenu_state.osk_param)
       {
          case CONFIG_FILE:
             break;
          case SHADER_PRESET_FILE:
-            snprintf(filepath, sizeof(filepath), "%s/%s.cgp", default_paths.cgp_dir, filename_tmp);
-            break;
-         case INPUT_PRESET_FILE:
-            snprintf(filepath, sizeof(filepath), "%s/%s.cfg", default_paths.input_presets_dir, filename_tmp);
-            break;
-      }
-
-      if(!rstate->osk_unbind_after_finish)
-         rstate->osk_callback = NULL;
-
-      rstate->osk_init  = osk_callback_enter_title_init;
-
-      return true;
-   }
-
-   return false;
-}
-
-static bool osk_callback_enter_filename_init(void *data)
-{
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-
-   oskutil_write_initial_message(&g_extern.console.misc.oskutil_handle, L"example");
-   oskutil_write_message(&g_extern.console.misc.oskutil_handle, 
-         L"Enter filename for preset (with no file extension)");
-   oskutil_start(&g_extern.console.misc.oskutil_handle);
-
-   rstate->osk_unbind_after_finish = false;
-
-   if(!rstate->osk_unbind_after_finish)
-      rstate->osk_init = NULL;
-
-   rstate->osk_callback = osk_callback_enter_filename;
-
-   return true;
-}
-
-static bool osk_callback_enter_title(void *data)
-{
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-   char filetitle_tmp[256];
-
-   if(!(OSK_IS_RUNNING(g_extern.console.misc.oskutil_handle)) && g_extern.console.misc.oskutil_handle.text_can_be_fetched)
-   {
-      if(g_extern.console.misc.oskutil_handle.text_can_be_fetched)
-         snprintf(filetitle_tmp, sizeof(filetitle_tmp), "%s", OUTPUT_TEXT_STRING(g_extern.console.misc.oskutil_handle));
-      else
-         snprintf(filetitle_tmp, sizeof(filetitle_tmp), "%s", "Custom");
-
-      switch(rstate->osk_param)
-      {
-         case CONFIG_FILE:
-            break;
-         case SHADER_PRESET_FILE:
-            {
-               struct gl_cg_cgp_info current_settings;
-               current_settings.shader[0] = g_settings.video.cg_shader_path;
-               current_settings.shader[1] = g_settings.video.second_pass_shader;
-               current_settings.filter_linear[0] = g_settings.video.smooth;
-               current_settings.filter_linear[1] = g_settings.video.second_pass_smooth;
-               current_settings.render_to_texture = true;
-               current_settings.fbo_scale = g_settings.video.fbo.scale_x; //fbo.scale_x and y are the same anyway
-               gl_cg_save_cgp(filepath, &current_settings);
-            }
+            snprintf(filepath, sizeof(filepath), "%s/%s.cgp", default_paths.cgp_dir, tmp_str);
+            RARCH_LOG("[osk_callback_enter_filename]: filepath is: %s.\n", filepath);
+
+            struct gl_cg_cgp_info current_settings;
+            current_settings.shader[0] = g_settings.video.cg_shader_path;
+            current_settings.shader[1] = g_settings.video.second_pass_shader;
+            current_settings.filter_linear[0] = g_settings.video.smooth;
+            current_settings.filter_linear[1] = g_settings.video.second_pass_smooth;
+            current_settings.render_to_texture = true;
+            current_settings.fbo_scale = g_settings.video.fbo.scale_x; //fbo.scale_x and y are the same anyway
+            gl_cg_save_cgp(filepath, &current_settings);
             break;
          case INPUT_PRESET_FILE:
+            snprintf(filepath, sizeof(filepath), "%s/%s.cfg", default_paths.input_presets_dir, tmp_str);
+            RARCH_LOG("[osk_callback_enter_filename]: filepath is: %s.\n", filepath);
             config_save_keybinds(filepath);
             break;
       }
 
-      if(!rstate->osk_unbind_after_finish)
-         rstate->osk_callback = NULL;
-
-      return true;
+      goto do_exit;
    }
+   else if (g_extern.lifecycle_mode_state & (1ULL << MODE_OSK_ENTRY_FAIL))
+      goto do_exit;
 
    return false;
+do_exit:
+   g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_DRAW) | (1ULL << MODE_OSK_ENTRY_SUCCESS) |
+         (1ULL << MODE_OSK_ENTRY_FAIL));
+   return true;
 }
 
-static bool osk_callback_enter_title_init(void *data)
+static bool osk_callback_enter_filename_init(void *data)
 {
-   rmenu_state_t *rstate = (rmenu_state_t*)state;
-
-   oskutil_write_initial_message(&g_extern.console.misc.oskutil_handle, L"Example file title");
-   oskutil_write_message(&g_extern.console.misc.oskutil_handle, L"Enter title for preset");
+   oskutil_write_initial_message(&g_extern.console.misc.oskutil_handle, L"example");
+   oskutil_write_message(&g_extern.console.misc.oskutil_handle, L"Enter filename for preset");
    oskutil_start(&g_extern.console.misc.oskutil_handle);
 
-   rstate->osk_unbind_after_finish = true;
-   rstate->osk_callback = osk_callback_enter_title;
-
    return true;
 }
 
@@ -1345,6 +1292,7 @@ static int set_setting_action(void *data, unsigned switchvalue, uint64_t input)
          {
             rmenu_state.osk_param = SHADER_PRESET_FILE;
             rmenu_state.osk_init = osk_callback_enter_filename_init;
+            rmenu_state.osk_callback = osk_callback_enter_filename;
          }
 #endif
          break;
@@ -1387,6 +1335,7 @@ static int set_setting_action(void *data, unsigned switchvalue, uint64_t input)
          {
 #ifdef HAVE_OSKUTIL
             rmenu_state.osk_init = osk_callback_enter_rsound_init;
+            rmenu_state.osk_callback = osk_callback_enter_rsound;
 #endif
          }
          if(input & (1ULL << RMENU_DEVICE_NAV_START))
@@ -1704,6 +1653,7 @@ static int set_setting_action(void *data, unsigned switchvalue, uint64_t input)
             rmenu_state_t *rstate = (rmenu_state_t*)&rmenu_state;
             rstate->osk_param = INPUT_PRESET_FILE;
             rstate->osk_init = osk_callback_enter_filename_init;
+            rstate->osk_callback = osk_callback_enter_filename;
          }
          break;
 #endif
@@ -2567,19 +2517,17 @@ bool rmenu_iterate(void)
       current_menu.input_poll(&current_menu, &rmenu_state);
 
 #ifdef HAVE_OSKUTIL
-   bool osk_init_succeeded = false;
-   bool osk_callback_finished = false;
-   if(rmenu_state.osk_init)
-      osk_init_succeeded = rmenu_state.osk_init(&rmenu_state);
+   if(rmenu_state.osk_init != NULL)
+   {
+      if (rmenu_state.osk_init(&rmenu_state))
+         rmenu_state.osk_init = NULL;
+   }
 
-   if(osk_init_succeeded && rmenu_state.osk_unbind_after_finish)
-      rmenu_state.osk_init = NULL;
-
-   if(rmenu_state.osk_callback)
-      osk_callback_finished = rmenu_state.osk_callback(&rmenu_state);
-
-   if(osk_callback_finished && rmenu_state.osk_unbind_after_finish)
-      rmenu_state.osk_callback = NULL;
+   if(rmenu_state.osk_callback != NULL)
+   {
+      if (rmenu_state.osk_callback(&rmenu_state))
+         rmenu_state.osk_callback = NULL;
+   }
 #endif
 
    int input_entry_ret = 0;
diff --git a/frontend/menu/utils/menu_stack.h b/frontend/menu/utils/menu_stack.h
index fc3eefe7ee..77de9ef324 100644
--- a/frontend/menu/utils/menu_stack.h
+++ b/frontend/menu/utils/menu_stack.h
@@ -37,7 +37,6 @@ typedef struct
    uint64_t input;
    uint64_t old_state;
 #ifdef HAVE_OSKUTIL
-   bool osk_unbind_after_finish;
    unsigned osk_param;
    bool (*osk_init)(void *data);
    bool (*osk_callback)(void *data);
diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c
index f28bb1ab36..10d7c35968 100644
--- a/frontend/platform/platform_ps3.c
+++ b/frontend/platform/platform_ps3.c
@@ -159,12 +159,33 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat
          g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
          break;
 #ifdef HAVE_OSKUTIL
+      case CELL_SYSUTIL_OSKDIALOG_LOADED:
+         break;
+      case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED:
+         RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED.\n");
+         pOskAbort(); //fall-through
       case CELL_SYSUTIL_OSKDIALOG_FINISHED:
-         oskutil_close(osk);
-         oskutil_finished(osk);
+         if (status == CELL_SYSUTIL_OSKDIALOG_FINISHED)
+            RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_FINISHED.\n");
+
+         pOskUnloadAsync(&osk->outputInfo);
+
+         if (osk->outputInfo.result == CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK)
+         {
+            RARCH_LOG("Setting MODE_OSK_ENTRY_SUCCESS.\n");
+            g_extern.lifecycle_mode_state |= (1ULL << MODE_OSK_ENTRY_SUCCESS);
+         }
+         else
+         {
+            RARCH_LOG("Setting MODE_OSK_ENTRY_FAIL.\n");
+            g_extern.lifecycle_mode_state |= (1ULL << MODE_OSK_ENTRY_FAIL);
+         }
+
+         osk->flags &= ~OSK_IN_USE;
          break;
       case CELL_SYSUTIL_OSKDIALOG_UNLOADED:
-         oskutil_unload(osk);
+         RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_UNLOADED.\n");
+         sys_memory_container_destroy(g_extern.console.misc.oskutil_handle.containerid);
          break;
 #endif
    }
@@ -399,13 +420,6 @@ static void system_deinit(void)
 {
 #ifndef IS_SALAMANDER
 
-#ifdef HAVE_OSKUTIL
-   oskutil_params *osk = &g_extern.console.misc.oskutil_handle;
-
-   if(osk)
-      oskutil_unload(osk);
-#endif
-
 #if defined(HAVE_LOGGER) || defined(HAVE_FILE_LOGGER)
    inl_logger_deinit();
 #endif
diff --git a/general.h b/general.h
index 93b892e6d1..50810da9fb 100644
--- a/general.h
+++ b/general.h
@@ -136,6 +136,9 @@ enum menu_enums
    MODE_UNZIP_TO_CACHEDIR,
    MODE_UNZIP_DELETE_PENDING,
    MODE_FILEBROWSER_REFRESH_PENDING,
+   MODE_OSK_DRAW,
+   MODE_OSK_ENTRY_SUCCESS,
+   MODE_OSK_ENTRY_FAIL,
 };
 
 // All config related settings go here.
diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c
index fd0f0bb248..c5cb223702 100644
--- a/ps3/ps3_input.c
+++ b/ps3/ps3_input.c
@@ -290,11 +290,10 @@ static int16_t ps3_input_state(void *data, const struct retro_keybind **binds,
 void oskutil_init(oskutil_params *params, unsigned containersize)
 {
    params->flags = 0;
-   params->is_running = false;
    if(containersize)
       params->osk_memorycontainer =  containersize; 
    else
-      params->osk_memorycontainer =  1024*1024*7;
+      params->osk_memorycontainer =  1024*1024*2;
 }
 
 static bool oskutil_enable_key_layout (void)
@@ -337,18 +336,24 @@ void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg)
 
 bool oskutil_start(oskutil_params *params) 
 {
-   memset(params->osk_text_buffer, 0, sizeof(*params->osk_text_buffer));
-   memset(params->osk_text_buffer_char, 0, 256);
-
-   params->text_can_be_fetched = false;
-
    if (params->flags & OSK_IN_USE)
-      return (true);
+   {
+      RARCH_WARN("OSK util already initialized and in use\n");
+      return true;
+   }
 
-   int ret = sys_memory_container_create(&params->containerid, params->osk_memorycontainer);
+   int ret = 0;
+
+   ret = sys_memory_container_create(&params->containerid, params->osk_memorycontainer);
 
    if(ret < 0)
-      return (false);
+      goto do_deinit;
+
+   params->outputInfo.osk_callback_return_param = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK;
+   params->outputInfo.osk_callback_num_chars = 256;
+   params->outputInfo.osk_callback_return_string = (uint16_t *)params->text_buf;
+
+   memset(params->text_buf, 0, sizeof(*params->text_buf));
 
    params->inputFieldInfo.osk_inputfield_max_length = CELL_OSKDIALOG_STRING_SIZE;	
 
@@ -358,55 +363,19 @@ bool oskutil_start(oskutil_params *params)
       return (false);
 
    ret = pOskLoadAsync(params->containerid, &params->dialogParam, &params->inputFieldInfo);
-   if(ret < 0)
-      return (false);
+
+   if (ret < 0)
+      goto do_deinit;
 
    params->flags |= OSK_IN_USE;
-   params->is_running = true;
+   g_extern.lifecycle_mode_state |= (1ULL << MODE_OSK_DRAW);
 
-   return (true);
+   return true;
+
+do_deinit:
+   RARCH_ERR("Could not properly initialize OSK util.\n");
+   return false;
 }
-
-void oskutil_close(oskutil_params *params)
-{
-   pOskAbort();
-}
-
-void oskutil_finished(oskutil_params *params)
-{
-   int num;
-
-   params->outputInfo.osk_callback_return_param = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK;
-   params->outputInfo.osk_callback_num_chars = 256;
-   params->outputInfo.osk_callback_return_string = (uint16_t *)params->osk_text_buffer;
-
-   pOskUnloadAsync(&params->outputInfo);
-
-   switch (params->outputInfo.osk_callback_return_param)
-   {
-      case CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK:
-         num = wcstombs(params->osk_text_buffer_char, params->osk_text_buffer, 256);
-         params->osk_text_buffer_char[num]=0;
-         params->text_can_be_fetched = true;
-         break;
-      case CELL_OSKDIALOG_INPUT_FIELD_RESULT_CANCELED:
-      case CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT:
-      case CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT:
-      default:
-         params->osk_text_buffer_char[0]=0;
-         params->text_can_be_fetched = false;
-         break;
-   }
-
-   params->flags &= ~OSK_IN_USE;
-}
-
-void oskutil_unload(oskutil_params *params)
-{
-   sys_memory_container_destroy(params->containerid);
-   params->is_running = false;
-}
-
 #endif
 
 /*============================================================
@@ -454,6 +423,8 @@ static void* ps3_input_init(void)
    cellPadInit(MAX_PADS);
 #ifdef HAVE_MOUSE
    cellMouseInit(MAX_MICE);
+#endif
+#ifdef HAVE_OSKUTIL
 #endif
    return (void*)-1;
 }
diff --git a/ps3/ps3_input.h b/ps3/ps3_input.h
index bbfcc14ac3..48ea0e5428 100644
--- a/ps3/ps3_input.h
+++ b/ps3/ps3_input.h
@@ -29,9 +29,6 @@
 #define DEADZONE_LOW 55
 #define DEADZONE_HIGH 210
 
-#define OSK_IS_RUNNING(object) object.is_running
-#define OUTPUT_TEXT_STRING(object) object.osk_text_buffer_char
-
 #ifdef HAVE_OSKUTIL
 
 typedef struct
@@ -39,11 +36,8 @@ typedef struct
    unsigned int osk_memorycontainer;
    wchar_t init_message[CELL_OSKDIALOG_STRING_SIZE + 1];
    wchar_t message[CELL_OSKDIALOG_STRING_SIZE + 1];
-   wchar_t osk_text_buffer[CELL_OSKDIALOG_STRING_SIZE + 1];
-   char osk_text_buffer_char[CELL_OSKDIALOG_STRING_SIZE + 1];
+   wchar_t text_buf[CELL_OSKDIALOG_STRING_SIZE + 1];
    uint32_t flags;
-   bool is_running;
-   bool text_can_be_fetched;
    sys_memory_container_t containerid;
    CellOskDialogPoint pos;
    CellOskDialogInputFieldInfo inputFieldInfo;
@@ -54,11 +48,6 @@ typedef struct
 void oskutil_write_message(oskutil_params *params, const wchar_t* msg);
 void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg);
 void oskutil_init(oskutil_params *params, unsigned containersize);
-bool oskutil_start(oskutil_params *params);
-void oskutil_stop(oskutil_params *params);
-void oskutil_finished(oskutil_params *params);
-void oskutil_close(oskutil_params *params);
-void oskutil_unload(oskutil_params *params);
 
 #endif