diff --git a/es-app/src/views/SystemView.cpp b/es-app/src/views/SystemView.cpp
index 91c3d5bc5..1a8c3cc0d 100644
--- a/es-app/src/views/SystemView.cpp
+++ b/es-app/src/views/SystemView.cpp
@@ -28,8 +28,9 @@ SystemView::SystemView()
     , mUpdatedGameCount {false}
     , mViewNeedsReload {true}
     , mLegacyMode {false}
-    , mHoldingKey {false}
     , mNavigated {false}
+    , mMaxFade {false}
+    , mFadeTransitions {false}
 {
     setSize(Renderer::getScreenWidth(), Renderer::getScreenHeight());
 
@@ -101,8 +102,6 @@ bool SystemView::input(InputConfig* config, Input input)
     mNavigated = false;
 
     if (input.value != 0) {
-        mHoldingKey = true;
-
         if (config->getDeviceId() == DEVICE_KEYBOARD && input.value && input.id == SDLK_r &&
             SDL_GetModState() & KMOD_LCTRL && Settings::getInstance()->getBool("Debug")) {
             LOG(LogDebug) << "SystemView::input(): Reloading all";
@@ -137,15 +136,15 @@ bool SystemView::input(InputConfig* config, Input input)
             return true;
         }
     }
-    else {
-        mHoldingKey = false;
-    }
 
     return mCarousel->input(config, input);
 }
 
 void SystemView::update(int deltaTime)
 {
+    if (!mCarousel->isAnimationPlaying(0))
+        mMaxFade = false;
+
     mCarousel->update(deltaTime);
 
     for (auto& video : mSystemElements[mCarousel->getCursor()].videoComponents)
@@ -167,25 +166,17 @@ void SystemView::render(const glm::mat4& parentTrans)
 
     bool fade {false};
 
-    if (mNavigated && mCarousel->isAnimationPlaying(0) &&
-        Settings::getInstance()->getString("TransitionStyle") == "fade")
+    if (mNavigated && mMaxFade)
         fade = true;
 
     if (!fade)
         renderElements(parentTrans, false);
     glm::mat4 trans {getTransform() * parentTrans};
 
-    // During fade transitions draw a black rectangle above all elements placed below the carousel.
-    if (mFadeOpacity != 0.0f) {
-        unsigned int fadeColor {0x00000000 | static_cast<unsigned int>(mFadeOpacity * 255.0f)};
-        Renderer::setMatrix(trans);
-        Renderer::drawRect(0.0f, 0.0f, mSize.x, mSize.y, fadeColor, fadeColor);
-    }
-
     mCarousel->render(trans);
 
     // For legacy themes the carousel is always rendered on top of all other elements.
-    if (!mLegacyMode)
+    if (!mLegacyMode && !fade)
         renderElements(parentTrans, true);
 }
 
@@ -274,11 +265,12 @@ void SystemView::onCursorChanged(const CursorState& /*state*/)
     if (scrollVelocity != 0)
         mPreviousScrollVelocity = scrollVelocity;
 
-    std::string transition_style {Settings::getInstance()->getString("TransitionStyle")};
+    std::string transitionStyle {Settings::getInstance()->getString("TransitionStyle")};
+    mFadeTransitions = transitionStyle == "fade";
 
     Animation* anim;
 
-    if (transition_style == "fade") {
+    if (transitionStyle == "fade") {
         float startFade {mFadeOpacity};
         anim = new LambdaAnimation(
             [this, startFade, startPos, endPos, posMax](float t) {
@@ -302,13 +294,18 @@ void SystemView::onCursorChanged(const CursorState& /*state*/)
                 if (t > 0.5f)
                     mCamOffset = endPos;
 
+                if (t >= 0.7f && t != 1.0f)
+                    mMaxFade = true;
+
                 // Update the game count when the entire animation has been completed.
-                if (mFadeOpacity == 1.0f)
+                if (mFadeOpacity == 1.0f) {
+                    mMaxFade = false;
                     updateGameCount();
+                }
             },
             500);
     }
-    else if (transition_style == "slide") {
+    else if (transitionStyle == "slide") {
         mUpdatedGameCount = false;
         anim = new LambdaAnimation(
             [this, startPos, endPos, posMax](float t) {
@@ -435,7 +432,7 @@ void SystemView::populate()
                                                                     ThemeFlags::ALL);
                         elements.children.emplace_back(elements.videoComponents.back().get());
                     }
-                    else if (element.second.type == "animation") {
+                    else if (element.second.type == "animation" && element.second.has("path")) {
                         const std::string extension {Utils::FileSystem::getExtension(
                             element.second.get<std::string>("path"))};
                         if (extension == ".json") {
@@ -553,6 +550,8 @@ void SystemView::populate()
                 nullptr));
         }
     }
+
+    mFadeTransitions = Settings::getInstance()->getString("TransitionStyle") == "fade";
 }
 
 void SystemView::updateGameCount()
@@ -1055,20 +1054,32 @@ void SystemView::renderElements(const glm::mat4& parentTrans, bool abovePrimary)
                 glm::ivec2 {static_cast<int>(mSize.x), static_cast<int>(mSize.y)});
 
             if (mLegacyMode && mSystemElements.size() > static_cast<size_t>(index)) {
-                for (auto element : mSystemElements[index].legacyExtras)
+                for (auto element : mSystemElements[index].legacyExtras) {
+                    if (mFadeTransitions)
+                        element->setDim(1.0f - mFadeOpacity);
                     element->render(elementTrans);
+                }
             }
             else if (!mLegacyMode && mSystemElements.size() > static_cast<size_t>(index)) {
                 for (auto child : mSystemElements[index].children) {
-                    if (abovePrimary && child->getZIndex() > primaryZIndex && mFadeOpacity == 0.0f)
+                    if (abovePrimary && child->getZIndex() > primaryZIndex) {
+                        if (mFadeTransitions || child->getOpacity() != 1.0f)
+                            child->setOpacity(1.0f - mFadeOpacity);
                         child->render(elementTrans);
-                    else if (!abovePrimary && child->getZIndex() <= primaryZIndex)
+                    }
+                    else if (!abovePrimary && child->getZIndex() <= primaryZIndex) {
+                        if (mFadeTransitions || child->getDim() != 1.0f)
+                            child->setDim(1.0f - mFadeOpacity);
                         child->render(elementTrans);
+                    }
                 }
             }
 
-            if (mLegacyMode)
+            if (mLegacyMode) {
+                if (mFadeTransitions)
+                    mLegacySystemInfo->setDim(1.0f - mFadeOpacity);
                 mLegacySystemInfo->render(elementTrans);
+            }
 
             Renderer::popClipRect();
         }
diff --git a/es-app/src/views/SystemView.h b/es-app/src/views/SystemView.h
index 2784f9ae5..faa2c722b 100644
--- a/es-app/src/views/SystemView.h
+++ b/es-app/src/views/SystemView.h
@@ -119,8 +119,9 @@ private:
     bool mUpdatedGameCount;
     bool mViewNeedsReload;
     bool mLegacyMode;
-    bool mHoldingKey;
     bool mNavigated;
+    bool mMaxFade;
+    bool mFadeTransitions;
 };
 
 #endif // ES_APP_VIEWS_SYSTEM_VIEW_H