diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 747ee6076c020fd30b3e0509e99ac03fc2313700..7e98c6f0f08bafcb86aeb8782e9b8861ff9cd147 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -111,6 +111,7 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
 
     private MenuItem dialPadBtn = null;
     private boolean restartVideo = false;
+    private boolean restartPreview = false;
     private PowerManager.WakeLock mScreenWakeLock;
     private int mCurrentOrientation = 0;
 
@@ -242,8 +243,13 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
     @Override
     public void onStart() {
         super.onStart();
-        if (restartVideo) {
-            displayVideoSurface(true);
+        if (restartVideo && restartPreview) {
+            displayVideoSurface(true, !presenter.isPipMode());
+            restartVideo = false;
+            restartPreview = false;
+        }
+        else if (restartVideo) {
+            displayVideoSurface(true, false);
             restartVideo = false;
         }
     }
@@ -254,6 +260,9 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
         if (binding.videoSurface.getVisibility() == View.VISIBLE) {
             restartVideo = true;
         }
+        if (binding.previewContainer.getVisibility() == View.VISIBLE) {
+            restartPreview = true;
+        }
     }
 
     @Nullable
@@ -449,10 +458,9 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
     }
 
     @Override
-    public void displayVideoSurface(final boolean display) {
-        binding.videoSurface.setVisibility(display ? View.VISIBLE : View.GONE);
-        binding.previewContainer.setVisibility(mDeviceRuntimeService.hasVideoPermission() && display ? View.VISIBLE : View.GONE);
-
+    public void displayVideoSurface(final boolean displayVideoSurface, final boolean displayPreviewContainer) {
+        binding.videoSurface.setVisibility(displayVideoSurface ? View.VISIBLE : View.GONE);
+        binding.previewContainer.setVisibility(displayPreviewContainer ? View.VISIBLE : View.GONE);
         updateMenu();
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
index 492f98c0661fba8dc5fe34e3e25974d33f21e9fc..da27b6b5640a2fe0982549d8edfd3bf5a02e1763 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
@@ -262,9 +262,9 @@ public class TVCallFragment extends BaseFragment<CallPresenter> implements CallV
     }
 
     @Override
-    public void displayVideoSurface(final boolean display) {
-        binding.videoSurface.setVisibility(display ? View.VISIBLE : View.GONE);
-        binding.previewContainer.setVisibility(mDeviceRuntimeService.hasVideoPermission() && display ? View.VISIBLE : View.GONE);
+    public void displayVideoSurface(final boolean displayVideoSurface, final boolean displayPreviewContainer) {
+        binding.videoSurface.setVisibility(displayVideoSurface ? View.VISIBLE : View.GONE);
+        binding.previewContainer.setVisibility(displayPreviewContainer ? View.VISIBLE : View.GONE);
     }
 
     @Override
@@ -274,9 +274,8 @@ public class TVCallFragment extends BaseFragment<CallPresenter> implements CallV
             //mVideoPreview.setZOrderMediaOverlay(true);
             binding.videoSurface.setZOrderMediaOverlay(false);
         } else {
-            binding.videoSurface.setZOrderMediaOverlay(false);
-            //mVideoSurface.setZOrderMediaOverlay(true);
-            //mVideoSurface.setZOrderOnTop(true);
+            binding.videoSurface.setZOrderMediaOverlay(true);
+            binding.videoSurface.setZOrderOnTop(true);
         }
     }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
index 6b80fd7653aa124ff6c01b65ac89603c36ac36ee..bae5ae7b3bea62d046c12d1d2137b49002236f02 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
@@ -53,6 +53,7 @@ public class CallPresenter extends RootPresenter<CallView> {
     private boolean mOnGoingCall = false;
     private boolean mAudioOnly = true;
     private boolean permissionChanged = false;
+    private boolean pipIsActive = false;
 
     private int videoWidth = -1;
     private int videoHeight = -1;
@@ -298,7 +299,7 @@ public class CallPresenter extends RootPresenter<CallView> {
             view.updateMenu();
             if (!mAudioOnly) {
                 mHardwareService.setPreviewSettings();
-                view.displayVideoSurface(true);
+                view.displayVideoSurface(true, mDeviceRuntimeService.hasVideoPermission());
                 if(permissionChanged) {
                     mHardwareService.switchInput(mSipCall.getCallId(), permissionChanged);
                     permissionChanged = false;
@@ -339,9 +340,9 @@ public class CallPresenter extends RootPresenter<CallView> {
         Log.d(TAG, "VIDEO_EVENT: " + event.start + " " + event.callId + " " + event.w + "x" + event.h);
 
         if (event.start) {
-            getView().displayVideoSurface(true);
+            getView().displayVideoSurface(true, !isPipMode() && mDeviceRuntimeService.hasVideoPermission());
         } else if (mSipCall != null && mSipCall.getCallId().equals(event.callId)) {
-            getView().displayVideoSurface(event.started);
+            getView().displayVideoSurface(event.started, event.started && !isPipMode() && mDeviceRuntimeService.hasVideoPermission());
             if (event.started) {
                 videoWidth = event.w;
                 videoHeight = event.h;
@@ -391,12 +392,19 @@ public class CallPresenter extends RootPresenter<CallView> {
         }
     }
 
+    public boolean isPipMode() {
+        return pipIsActive;
+    }
+
     public void pipModeChanged(boolean pip) {
+        pipIsActive = pip;
         if (pip) {
             getView().displayHangupButton(false);
             getView().displayPreviewSurface(false);
+            getView().displayVideoSurface(true, false);
         } else {
             getView().displayPreviewSurface(true);
+            getView().displayVideoSurface(true, mDeviceRuntimeService.hasVideoPermission());
         }
     }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
index 2b06cf9b959c53df6341ab1b2b2cdb03fc9c6959..4fd3a3f1f6b05cdf98cc30bfa2cd5c199e7dbe59 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
@@ -26,7 +26,7 @@ public interface CallView {
 
     void displayContactBubble(boolean display);
 
-    void displayVideoSurface(boolean display);
+    void displayVideoSurface(boolean displayVideoSurface, boolean displayPreviewContainer);
 
     void displayPreviewSurface(boolean display);