diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js
index f1e703e424117599e0bcfed5157f02064ba8c9c7..964ee2c5311b89daae531a389a2aac0904789f48 100644
--- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js
+++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js
@@ -17,78 +17,163 @@
 define(['jquery', 'bootstrap'], function ($) {
 	'use strict';
 
-	return {
-		initialize: function() {
-			// Card expand / collapse handling
-			$(document).on('click', '.gridder-list', function(e) {
-				e.preventDefault();
-				var $element = $(this);
-				var $contentContainer = $element.next();
-				if (!$element.hasClass('selectedItem')) {
-					// Find possible current open one and close it
-					$('.gridder-list').removeClass('selectedItem');
-					$('.gridder-content.gridder-show').slideUp(function() {
-						$(this).removeClass('gridder-show');
-					});
-					// Open clicked one in parallel
-					$element.addClass('selectedItem');
-					$contentContainer.addClass('gridder-show').slideDown();
-				} else {
-					// Collapse this currently open grid
-					$contentContainer.slideUp(function() {
-						$contentContainer.removeClass('gridder-show');
-					});
-					$element.removeClass('selectedItem');
-				}
-			});
+	/**
+	 *
+	 * @type {{transitionInProgress: boolean}}
+	 */
+	var CardLayout = {
+		transitionInProgress: false
+	};
 
-			// Close current and open previous card
-			$(document).on('click', '.gridder-nav-prev', function() {
-				var $currentOpenContent = $('.gridder-content.gridder-show');
-				if ($currentOpenContent.length > 0) {
-					var $currentOpenCard = $currentOpenContent.prev();
-					var $previousCardContent = $currentOpenCard.prev();
-					var $previousCard = $previousCardContent.prev();
-					if ($previousCard.length > 0) {
-						$currentOpenCard.removeClass('selectedItem');
-						$currentOpenContent.slideUp(function() {
-							$(this).removeClass('gridder-show');
-						});
-						$previousCard.addClass('selectedItem');
-						$previousCardContent.addClass('gridder-show').slideDown();
-					}
-				}
-			});
+	/**
+	 * Initialize the CardLayout, bind events
+	 */
+	CardLayout.initialize = function() {
+		$(document).on('click', '.gridder-list', function(e) {
+			e.preventDefault();
+			var $element = $(this);
+			if (!$element.hasClass('selectedItem')) {
+				CardLayout.openCard($element);
+			} else {
+				CardLayout.closeCard($element);
+			}
+		});
+
+		// Close current and open previous card
+		$(document).on('click', '.gridder-nav-prev', function(e) {
+			e.preventDefault();
+			CardLayout.openPrevCard();
+		});
+
+		// Close current and open next card
+		$(document).on('click', '.gridder-nav-next', function(e) {
+			e.preventDefault();
+			CardLayout.openNextCard();
+		});
+
+		// Close current open card
+		$(document).on('click', '.gridder-close', function(e) {
+			e.preventDefault();
+			CardLayout.closeCurrentCard();
+		});
+
+		CardLayout.checkNavigationButtons();
+	};
+
+	/**
+	 * Find and return the current open card
+	 *
+	 * @returns {jQuery}
+	 */
+	CardLayout.getCurrentOpenCard = function() {
+		return $('.gridder-content.gridder-show').prev();
+	};
+
+	/**
+	 * Find and close the current open card
+	 */
+	CardLayout.closeCurrentCard = function() {
+		CardLayout.closeCard(CardLayout.getCurrentOpenCard());
+		CardLayout.checkNavigationButtons();
+	};
+
+	/**
+	 * Open the given card and call the callback function
+	 *
+	 * @param {jQuery} $element
+	 * @param {function} callback
+	 * @returns {boolean}
+	 */
+	CardLayout.openCard = function($element, callback) {
+		if (CardLayout.transitionInProgress) {
+			return false;
+		}
+		CardLayout.transitionInProgress = true;
+		$('.gridder-list').removeClass('selectedItem');
+		$('.gridder-content.gridder-show').slideUp(function() {
+			$(this).removeClass('gridder-show');
+		});
+		$element.addClass('selectedItem');
+		$element.next().addClass('gridder-show').slideDown(function() {
+			CardLayout.transitionInProgress = false;
+			if (typeof callback === 'function') {
+				callback();
+			}
+			CardLayout.checkNavigationButtons();
+		});
+	};
 
-			// Close current and open next card
-			$(document).on('click', '.gridder-nav-next', function() {
-				var $currentOpenContent = $('.gridder-content.gridder-show');
-				if ($currentOpenContent.length > 0) {
-					var $currentOpenCard = $currentOpenContent.prev();
-					var $nextCard = $currentOpenContent.next();
-					var $nextCardContent = $nextCard.next();
-					if ($nextCardContent.length > 0) {
-						$currentOpenCard.removeClass('selectedItem');
-						$currentOpenContent.slideUp(function() {
-							$(this).removeClass('gridder-show');
-						});
-						$nextCard.addClass('selectedItem');
-						$nextCardContent.addClass('gridder-show').slideDown();
-					}
-				}
+	/**
+	 * Close the given card and call the callback function
+	 *
+	 * @param {jQuery} $element
+	 * @param {function} callback
+	 * @returns {boolean}
+	 */
+	CardLayout.closeCard = function($element, callback) {
+		if (CardLayout.transitionInProgress) {
+			return false;
+		}
+		CardLayout.transitionInProgress = true;
+		var $contentContainer = $element.next();
+		$element.removeClass('selectedItem');
+		$contentContainer.slideUp(function() {
+			$contentContainer.removeClass('gridder-show');
+			CardLayout.transitionInProgress = false;
+			if (typeof callback === 'function') {
+				callback();
+			}
+			CardLayout.checkNavigationButtons();
+		});
+	};
+
+	/**
+	 * Find the next card and open it, if it exists
+	 */
+	CardLayout.openNextCard = function() {
+		var $currentOpenCard = CardLayout.getCurrentOpenCard();
+		var $nextCard = $currentOpenCard.next().next();
+		if ($nextCard.length) {
+			CardLayout.closeCard($currentOpenCard, function() {
+				CardLayout.openCard($nextCard);
 			});
+		}
+	};
 
-			// Close current open card
-			$(document).on('click', '.gridder-close', function() {
-				var $currentOpenContent = $('.gridder-content.gridder-show');
-				if ($currentOpenContent.length > 0) {
-					var $currentOpenCard = $currentOpenContent.prev();
-					$currentOpenCard.removeClass('selectedItem');
-					$currentOpenContent.slideUp(function() {
-						$(this).removeClass('gridder-show');
-					});
-				}
+	/**
+	 * Find the previous card and open it, if it exists
+	 */
+	CardLayout.openPrevCard = function() {
+		var $currentOpenCard = CardLayout.getCurrentOpenCard();
+		var $nextCard = $currentOpenCard.prev().prev();
+		if ($nextCard.length) {
+			CardLayout.closeCard($currentOpenCard, function() {
+				CardLayout.openCard($nextCard);
 			});
 		}
 	};
+
+	/**
+	 * Check the navigation icons and enable/disable the buttons
+	 */
+	CardLayout.checkNavigationButtons = function() {
+		var $currentOpenCard = CardLayout.getCurrentOpenCard();
+		if ($currentOpenCard.length === 0) {
+			$('.gridder-close').addClass('disabled');
+		} else {
+			$('.gridder-close').removeClass('disabled');
+		}
+		if ($currentOpenCard.prev().prev().length === 0) {
+			$('.gridder-nav-prev').addClass('disabled')
+		} else {
+			$('.gridder-nav-prev').removeClass('disabled')
+		}
+		if ($currentOpenCard.next().next().length === 0) {
+			$('.gridder-nav-next').addClass('disabled')
+		} else {
+			$('.gridder-nav-next').removeClass('disabled')
+		}
+	};
+
+	return CardLayout;
 });