diff --git a/app/build.gradle b/app/build.gradle
index 9f09d10..74e9cf2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,15 +6,15 @@ plugins {
 android {
     signingConfigs {
         digiview {
-                try{
-                    storeFile file(digiviewStoreFile)
-                    storePassword digiviewStorePassword
-                    keyPassword digiviewKeyPassword
-                    keyAlias digiviewKeyAlias
-                }
-                catch (ex) {
-                        println("You should define mStoreFile, mStorePassword, mKeyPassword and mKeyAlias in ~/.gradle/gradle.properties : "+ ex.message)
-                }
+            try{
+                storeFile file(digiviewStoreFile)
+                storePassword digiviewStorePassword
+                keyPassword digiviewKeyPassword
+                keyAlias digiviewKeyAlias
+            }
+            catch (ex) {
+                    println("You should define mStoreFile, mStorePassword, mKeyPassword and mKeyAlias in ~/.gradle/gradle.properties : "+ ex.message)
+            }
         }
     }
 
@@ -65,7 +65,6 @@ android {
 }
 
 dependencies {
-
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
diff --git a/app/src/main/java/com/fpvout/digiview/MainActivity.java b/app/src/main/java/com/fpvout/digiview/MainActivity.java
index af1f600..44bea20 100644
--- a/app/src/main/java/com/fpvout/digiview/MainActivity.java
+++ b/app/src/main/java/com/fpvout/digiview/MainActivity.java
@@ -1,7 +1,5 @@
 package com.fpvout.digiview;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.animation.LayoutTransition;
 import android.content.Context;
 import android.content.Intent;
@@ -10,7 +8,6 @@
 import android.hardware.usb.UsbDevice;
 import android.hardware.usb.UsbManager;
 import android.os.Bundle;
-import android.os.Handler;
 import android.util.Log;
 import android.view.GestureDetector;
 import android.view.MotionEvent;
@@ -24,17 +21,19 @@
 import androidx.activity.result.ActivityResultCallback;
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.view.WindowInsetsCompat;
 import androidx.core.view.WindowInsetsControllerCompat;
 import androidx.preference.PreferenceManager;
 
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
 import io.sentry.SentryLevel;
 import io.sentry.android.core.SentryAndroid;
 
 import static com.fpvout.digiview.UsbMaskConnection.ACTION_USB_PERMISSION;
-import static com.fpvout.digiview.VideoReaderExoplayer.VideoZoomedIn;
 
 public class MainActivity extends AppCompatActivity implements UsbDeviceListener {
     private static final String TAG = "DIGIVIEW";
@@ -47,13 +46,18 @@ public class MainActivity extends AppCompatActivity implements UsbDeviceListener
     boolean usbConnected = false;
     SurfaceView fpvView;
     private int shortAnimationDuration;
-    private float buttonAlpha = 1;
-    private View settingsButton;
+    private FloatingActionButton settingsButton;
     private View watermarkView;
     private OverlayView overlayView;
     private GestureDetector gestureDetector;
     private ScaleGestureDetector scaleGestureDetector;
     private SharedPreferences sharedPreferences;
+    private final Runnable hideButtonsRunnable = new Runnable() {
+        @Override
+        public void run() {
+            toggleView(settingsButton, false);
+        }
+    };
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -97,7 +101,7 @@ protected void onCreate(Bundle savedInstanceState) {
         });
 
         mVideoReader = new VideoReaderExoplayer(fpvView, this);
-        mVideoReader.setVideoPlayingEventListener(this::hideOverlay);
+        mVideoReader.setVideoPlayingEventListener(this::hideFullOverlay);
         mVideoReader.setVideoWaitingEventListener(() -> showOverlay(R.string.waiting_for_video, OverlayStatus.Connected));
 
         mUsbMaskConnection = new UsbMaskConnection();
@@ -132,7 +136,7 @@ private void setupGestureDetectors() {
         gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
             @Override
             public boolean onSingleTapConfirmed(MotionEvent e) {
-                toggleSettingsButton();
+                toggleFullOverlay();
                 return super.onSingleTapConfirmed(e);
             }
 
@@ -163,94 +167,78 @@ public boolean onTouchEvent(MotionEvent event) {
         return super.onTouchEvent(event);
     }
 
-    private void updateWatermark() {
-        if (overlayView.getVisibility() == View.VISIBLE) {
-            watermarkView.setAlpha(0);
-            return;
-        }
+    private void toggleFullOverlay() {
+        if (overlayView.getAlpha() > 0.0f) return;
 
-        if (sharedPreferences.getBoolean(ShowWatermark, true)) {
-            watermarkView.setAlpha(0.3F);
-        } else {
-            watermarkView.setAlpha(0F);
-        }
+        toggleView(settingsButton, hideButtonsRunnable);
     }
 
-    private void updateVideoZoom() {
-        if (sharedPreferences.getBoolean(VideoZoomedIn, true)) {
-            mVideoReader.zoomIn();
-        } else {
-            mVideoReader.zoomOut();
-        }
-    }
+    private void hideFullOverlay() {
+        toggleView(watermarkView, sharedPreferences.getBoolean(ShowWatermark, true), 0.3f);
 
-    private void cancelButtonAnimation() {
-        Handler handler = settingsButton.getHandler();
-        if (handler != null) {
-            handler.removeCallbacksAndMessages(null);
-        }
+        toggleView(settingsButton, false);
+        toggleView(overlayView, false);
     }
 
-//    private void showSettingsButton() {
-//        cancelButtonAnimation();
-//
-//        if (overlayView.getVisibility() == View.VISIBLE) {
-//            buttonAlpha = 1;
-//            settingsButton.setAlpha(1);
-//        }
-//    }
+    private void showFullOverlay() {
+        toggleView(watermarkView, false);
 
-    private void toggleSettingsButton() {
-        if (buttonAlpha == 1 && overlayView.getVisibility() == View.VISIBLE) return;
+        toggleView(settingsButton, true);
+    }
 
-        // cancel any pending delayed animations first
-        cancelButtonAnimation();
+    private void showOverlay(int textId, OverlayStatus connected) {
+        toggleView(overlayView, true);
+        showFullOverlay();
+        overlayView.show(textId, connected);
+    }
 
-        if (buttonAlpha == 1) {
-            buttonAlpha = 0;
-        } else {
-            buttonAlpha = 1;
-        }
+    private void toggleView(FloatingActionButton view, @Nullable Runnable runnable) {
+        toggleView(view, view.getVisibility() != View.VISIBLE, runnable);
+    }
 
-        settingsButton.animate()
-                .alpha(buttonAlpha)
-                .setDuration(shortAnimationDuration)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        autoHideSettingsButton();
-                    }
-                });
+    private void toggleView(View view, boolean visible) {
+        toggleView(view, visible, 1.0f, null);
     }
 
-    private void autoHideSettingsButton() {
-        if (overlayView.getVisibility() == View.VISIBLE) return;
-        if (buttonAlpha == 0) return;
+    private void toggleView(FloatingActionButton view, boolean visible) {
+        toggleView(view, visible, null);
+    }
+
+    private void toggleView(View view, boolean visible, float visibleAlpha) {
+        toggleView(view, visible, visibleAlpha, null);
+    }
 
-        settingsButton.postDelayed(() -> {
-            buttonAlpha = 0;
-            settingsButton.animate()
+    private void toggleView(View view, boolean visible, float visibleAlpha, @Nullable Runnable runnable) {
+        if (!visible) {
+            view.removeCallbacks(runnable);
+            view.animate().cancel();
+            view.animate()
                     .alpha(0)
+                    .setDuration(shortAnimationDuration)
+                    .setListener(null);
+        } else {
+            view.removeCallbacks(runnable);
+            view.animate().cancel();
+            view.animate()
+                    .alpha(visibleAlpha)
                     .setDuration(shortAnimationDuration);
-        }, 3000);
+            view.postDelayed(runnable, 3000);
+        }
     }
 
-    private void showOverlay(int textId, OverlayStatus connected) {
-        overlayView.show(textId, connected);
-        updateWatermark();
-        autoHideSettingsButton();
-        updateVideoZoom();
-
-    }
+    private void toggleView(FloatingActionButton view, boolean visible, @Nullable Runnable runnable) {
+        if (view.getHandler() != null) {
+            view.getHandler().removeCallbacksAndMessages(null);
+        }
 
-    private void hideOverlay() {
-        overlayView.hide();
-        updateWatermark();
-        autoHideSettingsButton();
-        updateVideoZoom();
+        if (!visible) {
+            view.hide();
+        } else {
+            view.show();
+            view.postDelayed(runnable, 3000);
+        }
     }
 
-
     @Override
     public void usbDeviceApproved(UsbDevice device) {
         Log.i(TAG, "USB - usbDevice approved");
@@ -266,15 +254,11 @@ public void usbDeviceDetached() {
         this.onStop();
     }
 
-
     private void connect() {
         usbConnected = true;
         mUsbMaskConnection.setUsbDevice(usbManager, usbDevice);
         mVideoReader.setUsbMaskConnection(mUsbMaskConnection);
-        overlayView.hide();
         mVideoReader.start();
-        updateWatermark();
-        autoHideSettingsButton();
         showOverlay(R.string.waiting_for_video, OverlayStatus.Connected);
     }
 
@@ -295,11 +279,6 @@ public void onResume() {
                 showOverlay(R.string.waiting_for_usb_device, OverlayStatus.Disconnected);
             }
         }
-
-        settingsButton.setAlpha(1);
-        autoHideSettingsButton();
-        updateWatermark();
-        updateVideoZoom();
     }
 
 
diff --git a/app/src/main/java/com/fpvout/digiview/OverlayView.java b/app/src/main/java/com/fpvout/digiview/OverlayView.java
index 8a6c736..305dab9 100644
--- a/app/src/main/java/com/fpvout/digiview/OverlayView.java
+++ b/app/src/main/java/com/fpvout/digiview/OverlayView.java
@@ -2,7 +2,6 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -22,18 +21,11 @@ public OverlayView(Context context, AttributeSet attrs) {
         imageView = findViewById(R.id.backdrop_image);
     }
 
-    public void hide(){
-        setVisibility(View.GONE);
-    }
-
     public void show(int textResourceId, OverlayStatus status){
         showInfo(getContext().getString(textResourceId), status);
     }
 
     private void showInfo(String text, OverlayStatus status){
-
-        setVisibility(View.VISIBLE);
-
         textView.setText(text);
 
         int image = R.drawable.ic_goggles_white;
diff --git a/app/src/main/java/com/fpvout/digiview/VideoReaderExoplayer.java b/app/src/main/java/com/fpvout/digiview/VideoReaderExoplayer.java
index 8e340e6..571639a 100644
--- a/app/src/main/java/com/fpvout/digiview/VideoReaderExoplayer.java
+++ b/app/src/main/java/com/fpvout/digiview/VideoReaderExoplayer.java
@@ -87,14 +87,14 @@ public void start() {
                 default:
                     return new VideoStreamServiceDataSource(dataSpec, mUsbMaskConnection.getVideoStreamService());
             }
-            };
+        };
 
-            ExtractorsFactory extractorsFactory = () ->new Extractor[] {new H264Extractor(performancePreset.h264ReaderMaxSyncFrameSize, performancePreset.h264ReaderSampleTime)};
-            MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory).createMediaSource(MediaItem.fromUri(Uri.EMPTY));
-            mPlayer.setMediaSource(mediaSource);
+        ExtractorsFactory extractorsFactory = () -> new Extractor[]{new H264Extractor(performancePreset.h264ReaderMaxSyncFrameSize, performancePreset.h264ReaderSampleTime)};
+        MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory).createMediaSource(MediaItem.fromUri(Uri.EMPTY));
+        mPlayer.setMediaSource(mediaSource);
 
-            mPlayer.prepare();
-            mPlayer.play();
+        mPlayer.prepare();
+        mPlayer.play();
         mPlayer.addListener(new Player.Listener() {
             @Override
             public void onPlayerError(@NonNull ExoPlaybackException error) {
@@ -108,12 +108,12 @@ public void onPlayerError(@NonNull ExoPlaybackException error) {
                         break;
                     case ExoPlaybackException.TYPE_RENDERER:
                         Log.e(TAG, "PLAYER_SOURCE - TYPE_RENDERER: " + error.getSourceException().getMessage());
-                            break;
-                        case ExoPlaybackException.TYPE_UNEXPECTED:
-                            Log.e(TAG, "PLAYER_SOURCE - TYPE_UNEXPECTED: " + error.getSourceException().getMessage());
-                            break;
-                    }
+                        break;
+                    case ExoPlaybackException.TYPE_UNEXPECTED:
+                        Log.e(TAG, "PLAYER_SOURCE - TYPE_UNEXPECTED: " + error.getSourceException().getMessage());
+                        break;
                 }
+            }
 
             @Override
             public void onPlaybackStateChanged(int state) {
@@ -127,10 +127,10 @@ public void onPlaybackStateChanged(int state) {
                         if (videoWaitingListener != null)
                             videoWaitingListener.onVideoWaiting(); // let MainActivity know so it can hide watermark/show settings button
                         (new Handler(Looper.getMainLooper())).postDelayed(() -> restart(), 1000);
-                            break;
-                    }
+                        break;
                 }
-            });
+            }
+        });
 
         mPlayer.addVideoListener(new Player.Listener() {
             @Override
@@ -148,7 +148,7 @@ public void onVideoSizeChanged(@NonNull VideoSize videosize) {
                     surfaceView.setLayoutParams(params);
                 }
             }
-            });
+        });
     }
 
     public void toggleZoom() {
@@ -167,32 +167,32 @@ public void toggleZoom() {
             Format videoFormat = mPlayer.getVideoFormat();
             if (videoFormat == null) return;
 
-                params.dimensionRatio = videoFormat.width + ":" + videoFormat.height;
-            }
-
-            surfaceView.setLayoutParams(params);
+            params.dimensionRatio = videoFormat.width + ":" + videoFormat.height;
         }
 
-        public void zoomIn() {
-            if (!zoomedIn) {
-                toggleZoom();
-            }
+        surfaceView.setLayoutParams(params);
+    }
+
+    public void zoomIn() {
+        if (!zoomedIn) {
+            toggleZoom();
         }
+    }
 
-        public void zoomOut() {
-            if (zoomedIn) {
-                toggleZoom();
-            }
+    public void zoomOut() {
+        if (zoomedIn) {
+            toggleZoom();
         }
+    }
 
-        public void restart() {
-            mPlayer.release();
+    public void restart() {
+        mPlayer.release();
 
-            if (mUsbMaskConnection.isReady()) {
-                mUsbMaskConnection.start();
-                start();
-            }
+        if (mUsbMaskConnection.isReady()) {
+            mUsbMaskConnection.start();
+            start();
         }
+    }
 
     public void stop() {
         if (mPlayer != null)
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 3d2145d..3f8df06 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -19,6 +19,15 @@
         app:layout_constraintTop_toTopOf="parent">
     
 
+    
+
     
 
-    
 
     
-    
     
         - @string/video_preset_default
- @string/video_preset_conservative