diff --git a/android/src/main/java/cz/nic/tablexia/android/AndroidQRCodeScanner.java b/android/src/main/java/cz/nic/tablexia/android/AndroidQRCodeScanner.java
index e09868467f9b6e1bb7e5d58acb153e68691c632b..2eef5f7eb9394a157c3499f90e8b213a2240df80 100644
--- a/android/src/main/java/cz/nic/tablexia/android/AndroidQRCodeScanner.java
+++ b/android/src/main/java/cz/nic/tablexia/android/AndroidQRCodeScanner.java
@@ -19,17 +19,20 @@ import com.google.zxing.Result;
 import com.google.zxing.common.HybridBinarizer;
 
 import cz.nic.tablexia.android.camera.CameraSurface;
+import cz.nic.tablexia.android.camera.OnCameraReadyCallback;
 import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.ui.QRCodeScanner;
 
 /**
  * Created by Vitaliy Vashchenko on 6.10.16.
  */
-public class AndroidQRCodeScanner extends QRCodeScanner implements Camera.PreviewCallback {
+public class AndroidQRCodeScanner extends QRCodeScanner implements Camera.PreviewCallback, OnCameraReadyCallback {
 
     private final AndroidLauncher           activity;
     private       CameraSurface             cameraSurface;
     private       ScreenOrientationListener screenOrientationListener;
+    private boolean previewCalled = false;
+    private boolean cameraReady = false;
 
     @Override
     public void onPreviewFrame(byte[] bytes, Camera camera) {
@@ -51,6 +54,12 @@ public class AndroidQRCodeScanner extends QRCodeScanner implements Camera.Previe
         }
     }
 
+    @Override
+    public void onCameraReady() {
+        cameraReady = true;
+        if (previewCalled) startPreviewAsync();
+    }
+
 
     private class ScreenOrientationListener extends OrientationEventListener {
 
@@ -75,14 +84,22 @@ public class AndroidQRCodeScanner extends QRCodeScanner implements Camera.Previe
         return activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
     }
 
+    @Override
+    public void enableScanning() {
+        prepareCameraAsync();
+    }
+
     @Override
     public void startCameraPreview() {
-        startPreviewAsync();
+        if (!cameraReady) {
+            previewCalled = true;
+        }else {
+            startPreviewAsync();
+        }
     }
 
     @Override
     public void stopCameraPreview() {
-        prepareCamera();
         stopPreviewAsync();
     }
 
@@ -104,11 +121,20 @@ public class AndroidQRCodeScanner extends QRCodeScanner implements Camera.Previe
         activity.post(r);
     }
 
+    public synchronized void prepareCameraAsync() {
+        Runnable r = new Runnable() {
+            public void run() {
+                prepareCamera();
+            }
+        };
+        activity.post(r);
+    }
+
     private void prepareCamera() {
         Log.debug(getClass().getSimpleName(), "prepareCamera");
         if (cameraSurface == null) {
             Log.debug(getClass(), "surface is null");
-            cameraSurface = new CameraSurface(activity);
+            cameraSurface = new CameraSurface(activity, this);
         }
         if (cameraSurface.getParent() == null) {
             Log.debug(getClass(), "parent==null - adding view to parent");
diff --git a/android/src/main/java/cz/nic/tablexia/android/camera/CameraSurface.java b/android/src/main/java/cz/nic/tablexia/android/camera/CameraSurface.java
index 6e148ab333561699144a399ff81708a2ff450098..38dd5f3089913eaea8c6739d742799c7405255e6 100644
--- a/android/src/main/java/cz/nic/tablexia/android/camera/CameraSurface.java
+++ b/android/src/main/java/cz/nic/tablexia/android/camera/CameraSurface.java
@@ -24,12 +24,13 @@ import java.io.IOException;
 
 public class CameraSurface extends SurfaceView implements SurfaceHolder.Callback {
     private Camera camera;
-    private boolean previewReady = false;
+    private OnCameraReadyCallback cameraReadyCallback;
     
 
-    public CameraSurface(Context context) {
+    public CameraSurface(Context context, OnCameraReadyCallback cameraReadyCallback) {
         super(context);
         getHolder().addCallback(this);
+        this.cameraReadyCallback = cameraReadyCallback;
     }
 
 
@@ -42,7 +43,7 @@ public class CameraSurface extends SurfaceView implements SurfaceHolder.Callback
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
         try {
             camera.setPreviewDisplay(holder);
-            previewReady = true;
+            cameraReadyCallback.onCameraReady();
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -65,15 +66,10 @@ public class CameraSurface extends SurfaceView implements SurfaceHolder.Callback
         camera.stopPreview();
         holder.removeCallback(this);
         holder.getSurface().release();
-        previewReady = false;
         camera.release();
         camera = null;
     }
     
-    public boolean isPreviewReady() {
-        return previewReady;
-    }
-
     public Camera getCamera() {
         return camera;
     }
diff --git a/android/src/main/java/cz/nic/tablexia/android/camera/OnCameraReadyCallback.java b/android/src/main/java/cz/nic/tablexia/android/camera/OnCameraReadyCallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bcaa50c402acf414b83fbbd396f333d276ce4d0
--- /dev/null
+++ b/android/src/main/java/cz/nic/tablexia/android/camera/OnCameraReadyCallback.java
@@ -0,0 +1,8 @@
+package cz.nic.tablexia.android.camera;
+
+/**
+ * Created by Vitaliy Vashchenko on 7.10.16.
+ */
+public interface OnCameraReadyCallback {
+    void onCameraReady();
+}