diff --git a/src/src/org/renpy/android/SDLSurfaceView.java b/src/src/org/renpy/android/SDLSurfaceView.java
index 7385010c93..b7c2997942 100644
--- a/src/src/org/renpy/android/SDLSurfaceView.java
+++ b/src/src/org/renpy/android/SDLSurfaceView.java
@@ -45,6 +45,7 @@
 import android.opengl.GLSurfaceView;
 import android.net.Uri;
 import android.os.PowerManager;
+import android.os.Handler;
 import android.content.pm.PackageManager;
 import android.content.pm.ApplicationInfo;
 import android.graphics.PixelFormat;
@@ -1058,17 +1059,17 @@ public boolean onKeyUp(int keyCode, final KeyEvent event) {
 
     @Override
     public boolean onKeyMultiple(int keyCode, int count, KeyEvent event){
+        String keys = event.getCharacters();
         if (DEBUG)
             Log.d(TAG, String.format(
-                "onKeyMultiple() keyCode=%d count=%d", keyCode, count));
-        String keys = event.getCharacters();
+                "onKeyMultiple() keyCode=%d count=%d, keys=%s", keyCode, count, keys));
         char[] keysBuffer = new char[keys.length()];
         if (mDelLen > 0){
             mDelLen = 0;
             return true;
         }
         if (keyCode == 0){
-            // FIXME: here is hardcoed value of "q" key
+            // FIXME: here is hardcoded value of "q" key
             // on hacker's keyboard. It is passed to
             // nativeKey function to get it worked if
             // we get 9 and some non-ascii characters
@@ -1076,14 +1077,8 @@ public boolean onKeyMultiple(int keyCode, int count, KeyEvent event){
             keyCode = 45;
         }
         if (mInputActivated && event.getAction() == KeyEvent.ACTION_MULTIPLE){
-            keys.getChars(0, keys.length(), keysBuffer, 0);
-
-            for(char c: keysBuffer){
-                //Log.i("python", "Char from multiply " + (int) c);
-                // Calls both up/down events to emulate key pressing
-                nativeKey(keyCode, 1, (int) c);
-                nativeKey(keyCode, 0, (int) c);
-            }
+            String message = String.format("INSERTN:%s", keys);
+            dispatchCommand(message);
             return true;
         }else {
             return super.onKeyMultiple(keyCode, count, event);
@@ -1110,6 +1105,50 @@ public boolean onKeyPreIme(int keyCode, final KeyEvent event){
         return super.onKeyPreIme(keyCode, event);
     }
 
+    public void delayed_message(String message, int delay){
+        Handler handler = new Handler();
+        final String msg = message;
+        final int d = delay;
+        handler.postDelayed(new Runnable(){
+        @Override
+            public void run(){
+                dispatchCommand(msg);
+        }
+        }, d);
+    }
+
+    public void dispatchCommand(String message){
+
+        Boolean ret = false;
+        int delay = 0;
+        while (message.length() > 50){
+            delayed_message(message.substring(0, 50), delay);
+            delay += 100;
+            message = String.format("INSERTN:%s", message.substring(50, message.length()));
+            if (message.length() <= 50){
+                delayed_message(message, delay+50);
+                return;
+            }
+        }
+
+        if (DEBUG) Log.d(TAG, String.format("dispatch :%s", message));
+        int keyCode = 45;
+        //send control sequence start \x01
+        nativeKey(keyCode, 1, 1);
+        nativeKey(keyCode, 0, 1);
+
+        for(int i=0; i < message.length(); i++){
+            //Calls both up/down events to emulate key pressing
+            nativeKey(keyCode, 1, (int) message.charAt(i));
+            nativeKey(keyCode, 0, (int) message.charAt(i));
+        }
+
+        //send control sequence start \x01
+        nativeKey(keyCode, 1, 2);
+        nativeKey(keyCode, 0, 2);
+
+    }
+
     @Override
     public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
         // setting inputtype to TYPE_CLASS_TEXT is necessary for swiftkey to enable
@@ -1118,27 +1157,28 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
         outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;
         return new BaseInputConnection(this, false){
 
-
             private void deleteLastText(){
                 // send back space keys
-                for (int i = 0; i < mDelLen; i++){
-                    nativeKey(KeyEvent.KEYCODE_DEL, 1, 23);
-                    nativeKey(KeyEvent.KEYCODE_DEL, 0, 23);
+                if (DEBUG){
+                    Log.i("Python:", String.format("delete text%s", mDelLen));
+                    }
+
+                if (mDelLen == 0){
+                    return;
                 }
+
+                String message = String.format("DEL:%s", mDelLen);
+                dispatchCommand(message);
             }
 
             @Override
             public boolean setComposingText(CharSequence text,
                     int newCursorPosition){
-                if (DEBUG) Log.i("Python:", String.format("set Composing Text %s", text));
                 this.deleteLastText();
+                if (DEBUG) Log.i("Python:", String.format("set Composing Text %s", text));
                 // send text
-                for(int i = 0; i < text.length(); i++){
-                    // Calls both up/down events to emulate key pressing
-                    char c = text.charAt(i);
-                    nativeKey(45, 1, (int) c);
-                    nativeKey(45, 0, (int) c);
-                }
+                String message = String.format("INSERT:%s", text);
+                dispatchCommand(message);
                 // store len to be deleted for next time
                 mDelLen = text.length();
                 return super.setComposingText(text, newCursorPosition);
@@ -1147,8 +1187,8 @@ public boolean setComposingText(CharSequence text,
             @Override
             public boolean commitText(CharSequence text, int newCursorPosition) {
                 // some code which takes the input and manipulates it and calls editText.getText().replace() afterwards
-                if (DEBUG) Log.i("Python:", String.format("Commit Text %s", text));
                 this.deleteLastText();
+                if (DEBUG) Log.i("Python:", String.format("Commit Text %s", text));
                 mDelLen = 0;
                 return super.commitText(text, newCursorPosition);
             }
@@ -1168,6 +1208,17 @@ public boolean setComposingRegion(int start, int end){
             @Override
             public boolean deleteSurroundingText (int beforeLength, int afterLength){
                 if (DEBUG) Log.d("Python:", String.format("deleteLastText %s %s", beforeLength, afterLength));
+                // move cursor to place from where to start deleting
+                // send right arrow keys
+                for (int i = 0; i < afterLength; i++){
+                    nativeKey(45, 1, 39);
+                    nativeKey(45, 0, 39);
+                }
+                // remove text before cursor
+                mDelLen = beforeLength + afterLength;
+                this.deleteLastText();
+                mDelLen = 0;
+
                 return super.deleteSurroundingText(beforeLength, afterLength);
             }