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 99de0d3a37148243ed6d4d1fb1cd5206b290fed5..436b3684133b9e0d2a34e01d078ec49e092043f2 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
@@ -1415,8 +1415,8 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
             // If a call media handler doesn't have an icon use a standard android icon
             for (String callMediaHandler : callMediaHandlers) {
                 Map<String, String> details = getCallMediaHandlerDetails(callMediaHandler);
-                String drawablePath = details.get("icoPath");
-                Drawable handlerIcon = StringUtils.isEmpty(drawablePath) ? null : Drawable.createFromPath(details.get("icoPath"));
+                String drawablePath = details.get("iconPath");
+                Drawable handlerIcon = StringUtils.isEmpty(drawablePath) ? null : Drawable.createFromPath(details.get("iconPath"));
                 if (handlerIcon == null) {
                     handlerIcon = context.getDrawable(R.drawable.ic_jami);
                 }
@@ -1429,8 +1429,6 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
         }
 
         if (choosePluginMode) {
-            //change preview image
-            displayVideoSurface(true,true);
             // hide hang up button and other call buttons
             displayHangupButton(false);
             // Display the plugins recyclerpicker
@@ -1450,13 +1448,12 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
                 }
                 if (position > 0) {
                     String callMediaId = callMediaHandlers.get(position-1);
-                    toggleCallMediaHandler(callMediaId, true);
+                    presenter.startPlugin(callMediaId);
+                    //toggleCallMediaHandler(callMediaId, true);
                 }
             }
 
         } else {
-            //change preview image
-            displayVideoSurface(true,true);
             if (previousPluginPosition > 0) {
                 String callMediaId = callMediaHandlers.
                         get(previousPluginPosition-1);
@@ -1464,10 +1461,14 @@ public class CallFragment extends BaseSupportFragment<CallPresenter> implements
                 toggleCallMediaHandler(callMediaId, false);
                 rp.scrollToPosition(previousPluginPosition);
             }
+            presenter.stopPlugin();
             binding.recyclerPicker.setVisibility(View.GONE);
             movePreview(false);
             displayHangupButton(true);
         }
+
+        //change preview image
+        displayVideoSurface(true,true);
     }
 
     /**
diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
index 04fd494c276271c2cf89beeafb9645e962a2ebbd..c19257110853dd3e3896f3cbd8437c2149e01011 100644
--- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
@@ -58,6 +58,8 @@ import cx.ring.utils.Log;
 import cx.ring.utils.Ringer;
 import io.reactivex.Completable;
 
+import static cx.ring.daemon.RingserviceJNI.toggleCallMediaHandler;
+
 public class HardwareServiceImpl extends HardwareService implements AudioManager.OnAudioFocusChangeListener, BluetoothWrapper.BluetoothChangeListener {
 
     private static final Point VIDEO_SIZE_LOW = new Point(320, 240);
@@ -86,6 +88,8 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager
     private boolean mShouldCapture = false;
     private boolean mShouldSpeakerphone = false;
     private final boolean mHasSpeakerPhone;
+    private boolean mIsChoosePlugin = false;
+    private String mMediaHandlerId;
 
     public HardwareServiceImpl(Context context) {
         mContext = context;
@@ -478,6 +482,20 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager
         }
     }
 
+    public void startMediaHandler(String mediaHandlerId) {
+        mIsChoosePlugin = true;
+        mMediaHandlerId = mediaHandlerId;
+    }
+
+    private void toggleMediaHandler() {
+        toggleCallMediaHandler(mMediaHandlerId, true);
+    }
+
+    public void stopMediaHandler() {
+        mIsChoosePlugin = false;
+        mMediaHandlerId = "";
+    }
+
     @Override
     public void startCapture(@Nullable String camId) {
         if (mIsScreenSharing) {
@@ -506,7 +524,7 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager
             return;
         }
         final Conference conf = mCameraPreviewCall.get();
-        boolean useHardwareCodec = mPreferenceService.isHardwareAccelerationEnabled() && (conf == null || !conf.isConference());
+        boolean useHardwareCodec = mPreferenceService.isHardwareAccelerationEnabled() && (conf == null || !conf.isConference()) && !mIsChoosePlugin;
         if (conf != null && useHardwareCodec) {
             SipCall call = conf.getCall();
             if (call != null) {
@@ -526,6 +544,8 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager
                 new CameraService.CameraListener() {
                     @Override
                     public void onOpened() {
+                        if(mIsChoosePlugin && !mMediaHandlerId.isEmpty())
+                            toggleMediaHandler();
                     }
 
                     @Override
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 207d4b1f9c678c2ce059eea9cfba24a55118dbd9..ccd4ced88c3069e08b89be248e1cd04cb6c6fb9b 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
@@ -720,4 +720,18 @@ public class CallPresenter extends RootPresenter<CallView> {
     public boolean isMaximized(SipCall call) {
         return mConference.getMaximizedCall() == call;
     }
+
+    public void startPlugin(String mediaHandlerId) {
+        mHardwareService.startMediaHandler(mediaHandlerId);
+        if(mConference == null)
+            return;
+        mHardwareService.switchInput(mConference.getId(), mHardwareService.isPreviewFromFrontCamera());
+    }
+
+    public void stopPlugin() {
+        mHardwareService.stopMediaHandler();
+        if(mConference == null)
+            return;
+        mHardwareService.switchInput(mConference.getId(), mHardwareService.isPreviewFromFrontCamera());
+    }
 }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
index de47bef2ea1df98bcd6b3025fa6552e53b0a45b7..722facc76cbbbfdb2333fe98b5fb85aca603cf3a 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
@@ -163,6 +163,10 @@ public abstract class HardwareService {
 
     public abstract void unregisterCameraDetectionCallback();
 
+    public abstract void startMediaHandler(String mediaHandlerId);
+
+    public abstract void stopMediaHandler();
+
     public void connectivityChanged(boolean isConnected) {
         Log.i(TAG, "connectivityChange() " + isConnected);
         connectivityEvents.onNext(isConnected);