diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php
index 119482456c1b015f30a5ebe5894c894a30f27c21..0a524e79e7966522e1870240086221a28012e863 100644
--- a/Classes/Controller/OverviewController.php
+++ b/Classes/Controller/OverviewController.php
@@ -28,20 +28,18 @@ namespace SGalinski\SgNews\Controller;
 
 use SGalinski\SgNews\Domain\Model\Category;
 use SGalinski\SgNews\Domain\Model\News;
-use SGalinski\SgNews\Domain\Model\Tag;
 use SGalinski\SgNews\Domain\Repository\CategoryRepository;
 use SGalinski\SgNews\Domain\Repository\NewsRepository;
 use SGalinski\SgNews\Domain\Repository\TagRepository;
 use SGalinski\SgNews\Service\ConfigurationService;
 use SGalinski\SgNews\Service\HeaderMetaDataService;
 use TYPO3\CMS\Core\Http\ImmediateResponseException;
+use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Persistence\Generic\Query;
 use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
 use TYPO3\CMS\Extbase\Persistence\QueryInterface;
 use TYPO3\CMS\Frontend\Controller\ErrorController;
 use TYPO3\CMS\Frontend\Page\PageAccessFailureReasons;
-use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 
 /**
  * Controller that handles the overview page of categories and their news
@@ -108,88 +106,43 @@ class OverviewController extends AbstractController {
 	 * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException
 	 */
 	public function overviewAction(array $newsFilter = [], int $currentPageBrowserPage = 0) {
-		switch ((int) $this->settings['groupBy']) {
-			case 1:
-				$this->overviewWithCategories([], [], $newsFilter, $currentPageBrowserPage);
-				break;
-			case 2:
-				$this->overviewWithTags([], [], $newsFilter, $currentPageBrowserPage);
-				break;
-			default:
-				$this->forward('overviewWithoutCategories', NULL, NULL, $this->request->getArguments());
-				break;
+		if ((int) $this->settings['groupBy'] === 0 && (bool) $this->settings['enableFilter'] === FALSE) {
+			$this->forward('overviewWithoutCategories', NULL, NULL, $this->request->getArguments());
 		}
-	}
 
-	/**
-	 * Highlights the best fitting news in the metadata of the page
-	 *
-	 * @param array|null $categoryIds
-	 * @param array|null $tagIds
-	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
-	 */
-	protected function highlightBestFitNews(array $categoryIds = NULL, array $tagIds = NULL) {
+		// Setup settings
 		$startTime = (int) $this->settings['starttime'];
 		$endTime = (int) $this->settings['endtime'];
+		$newsLimit = (int) $this->settings['newsLimit'];
+		$offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimit);
+		$configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
+		$sortBy = $configurationService->getConfiguration('sortBy', $this->settings);
+		$sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings);
+		$this->tagRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]);
+		$this->categoryRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]);
+		$useAllFilters = (bool) $this->settings['enableFilter'];
+		$isCategoryFiltered = $useAllFilters || (int) $this->settings['groupBy'] === 1;
+		$isTagFiltered = $useAllFilters || (int) $this->settings['groupBy'] === 2;
 
-		/** @var News $highlightedNews */
-		$highlightedNews = $this->newsRepository
-			->findLastUpdatedOrHighlightedNewsByCategories(
-				1, FALSE, $categoryIds, 0, FALSE, $this->settings['sortBy'], $tagIds, $startTime, $endTime
-			)->getFirst();
-		if (!$highlightedNews) {
-			return;
-		}
-
-		/** @var Category $category */
-		$category = $this->categoryRepository->findByUid($highlightedNews->getPid());
-		$highlightedNewsMetaData = NULL;
-		if ($category) {
-			$highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category);
-		}
-
-		if (!version_compare(ExtensionManagementUtility::getExtensionVersion('sg_seo'), '5.0.0', '>=')) {
-			if ($highlightedNewsMetaData['image']) {
-				HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']);
-			} elseif ($highlightedNewsMetaData['teaserImage']) {
-				HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']);
-			}
+		// Get tag pid
+		$tagPid = (int) $this->settings['tagPid'];
+		if (!$tagPid) {
+			$tagPid = $GLOBALS['TSFE']->id;
 		}
-	}
-
-	/**
-	 * Renders the news overview grouped by categories
-	 *
-	 * @param array $newsByCategory
-	 * @param array $allNews
-	 * @param array $newsFilter
-	 * @param int $currentPageBrowserPage
-	 * @return void
-	 * @throws \InvalidArgumentException
-	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
-	 * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException
-	 * @throws ImmediateResponseException
-	 * @throws \TYPO3\CMS\Core\Error\Http\PageNotFoundException
-	 */
-	protected function overviewWithCategories(
-		array $newsByCategory = [], array $allNews = [], array $newsFilter = [], int $currentPageBrowserPage = 0
-	) {
-		$newsLimitPerCategory = (int) $this->settings['newsLimit'];
-		$this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
-
-		$offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerCategory);
 
 		if ($this->settings['onlyNewsWithinThisPageSection']) {
 			$categories = $this->categoryRepository->findCategoriesInRootLine($GLOBALS['TSFE']->id);
+			$tags = $this->tagRepository->findTagsInRootLine($tagPid);
 		} else {
+			$tags = $this->tagRepository->findAll()->toArray();
 			$categories = $this->categoryRepository->findAll()->toArray();
 		}
 
-		if (count($categories) <= 0) {
-			return;
-		}
-
+		// Apply category restrictions
 		$categoryRestrictions = GeneralUtility::intExplode(',', $this->settings['categoryRestrictions'], TRUE);
+		if (!$isCategoryFiltered) {
+			$categoryRestrictions = [];
+		}
 		if (count($categoryRestrictions) > 0) {
 			foreach ($categories as $key => $category) {
 				$categoryId = $category->getUid();
@@ -211,114 +164,106 @@ class OverviewController extends AbstractController {
 			}
 		}
 
-		if (count($categories) <= 0) {
-			return;
+		// Apply tag restrictions
+		$tagRestrictions = GeneralUtility::intExplode(',', $this->settings['tagRestrictions'], TRUE);
+		if (!$isTagFiltered) {
+			$tagRestrictions = [];
 		}
-
-		$startTime = (int) $this->settings['starttime'];
-		$endTime = (int) $this->settings['endtime'];
-
-		$configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
-		$sortBy = $configurationService->getConfiguration('sortBy', $this->settings);
-		$sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings);
-
-		$categoryIds = [];
-		$categoriesById = [];
-		$newsMetaData = [];
-		foreach ($categories as $category) {
-			/** @var Category $category */
-			$categoryId = $category->getUid();
-			$categoryIdsForSelect = [$categoryId];
-			$categoryIds[] = $category->getUid();
-			$categoriesById[$categoryId] = $category;
-			if ($category->_getProperty('_languageUid') > 0) {
-				$originalLangCategory = $this->categoryRepository->findOriginalLanguageById($category->getUid());
-				if ($originalLangCategory) {
-					$originalLangCategoryId = $originalLangCategory->getUid();
-					$categoryIdsForSelect[] = $originalLangCategoryId;
-					$categoryIds[] = $originalLangCategoryId;
-					$categoriesById[$originalLangCategoryId] = $originalLangCategory;
-				}
-			}
-
-			$tagIds = NULL;
-			if ($newsFilter['tag']) {
-				$tagIds = [(int) $newsFilter['tag']];
-			}
-			foreach ($categoryIdsForSelect as $categoryIdsForSelectId) {
-				$news = $this->newsRepository->findAllSortedNewsByCategories(
-					[$categoryIdsForSelectId], $newsLimitPerCategory, $offset, $sortBy, $tagIds, $startTime, $endTime,
-					$sortDirection
-				);
-
-				$newsMetaData[$categoryIdsForSelectId] = [];
-				foreach ($news as $newsEntry) {
-					/** @var News $newsEntry */
-					$category = $categoriesById[$categoryIdsForSelectId];
-					if (!$category) {
-						// Category isn't visible.
-						continue;
-					}
-
-					$data = $this->getMetaDataForNews($newsEntry, $category);
-					$newsMetaData[$categoryIdsForSelectId][] = $data;
+		if (count($tagRestrictions) > 0) {
+			foreach ($tags as $key => $tag) {
+				if (!in_array($tag->getUid(), $tagRestrictions, TRUE)) {
+					unset($tags[$key]);
 				}
 			}
 		}
 
-		$maxNewsPerCategory = 0;
-		foreach ($categoriesById as $categoryId => $category) {
-			if (!isset($newsMetaData[$categoryId]) || count($newsMetaData[$categoryId]) <= 0) {
-				// Hide empty categories.
-				continue;
-			}
-
-			/** @var Category $category */
-			if (isset($newsByCategory[$categoryId])) {
-				/** @var Category $category */
-				$newsByCategory[$categoryId]['newsMetaData'] =
-					array_merge($newsByCategory[$categoryId]['newsMetaData'], $newsMetaData[$categoryId], $newsFilter);
-			} else {
-				$newsByCategory[$categoryId] = [
-					'record' => $category,
-					'recordId' => $categoryId,
-					'recordType' => 'category',
-					'newsMetaData' => $newsMetaData[$categoryId],
-					'newsCount' => count($newsMetaData[$categoryId])
-				];
+		// Get category ids or use the one in the filter
+		$categoryIds = [];
+		if ($newsFilter['category']) {
+			$categoryIds = [(int) $newsFilter['category']];
+		} elseif ($isCategoryFiltered) {
+			foreach ($categories as $category) {
+				$categoryIds[] = $category->getUid();
 			}
-
-			$maxNewsPerCategory = \max($maxNewsPerCategory, \count($newsByCategory[$categoryId]['newsMetaData']));
+		} else {
+			$categoryIds = NULL;
 		}
 
-		$tagIds = NULL;
+		// Get tag ids or use the one in the filter
+		$tagIds = [];
 		if ($newsFilter['tag']) {
 			$tagIds = [(int) $newsFilter['tag']];
+		} elseif ($isTagFiltered) {
+			foreach ($tags as $tag) {
+				$tagIds[] = $tag->getUid();
+			}
+		} else {
+			$tagIds = NULL;
 		}
-		if ($newsFilter['category']) {
-			$categoryIds = [(int) $newsFilter['category']];
-		}
+
+		// Get all news by category and tag ids
 		$news = $this->newsRepository->findAllSortedNewsByCategories(
-			$categoryIds, $newsLimitPerCategory, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection
+			$categoryIds, $newsLimit, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection
 		);
 
+		// Process news result query based on filters
+		$allNews = [];
+		$newsItems = [];
+		$areCategoriesCreated = FALSE;
 		foreach ($news as $newsEntry) {
 			/** @var News $newsEntry */
-			$categoryId = $newsEntry->getPid();
-			$category = $categoriesById[$categoryId];
-			if (!$category) {
-				// Category isn't visible.
-				continue;
+			$newsCategory = $this->categoryRepository->findOriginalLanguageById(
+					$newsEntry->getPid()
+				) ?? $this->categoryRepository->findByUid($newsEntry->getPid());
+			$newsCategoryId = $newsCategory->getUid();
+			$newsMetaData = $this->getMetaDataForNews($newsEntry, $newsCategory);
+
+			if ((int) $this->settings['groupBy'] === 1) {
+				if (!$areCategoriesCreated) {
+					// Add all required categories
+					foreach ($categories as $category) {
+						/** @var Category $category */
+						$newsItems[$category->getUid()] = [
+							'record' => $category,
+							'recordId' => $category->getUid(),
+							'recordType' => 'category',
+							'newsMetaData' => [],
+							'newsCount' => 0
+						];
+					}
+					$areCategoriesCreated = TRUE;
+				}
+
+				$newsItems[$newsCategoryId]['newsMetaData'][] = $newsMetaData;
+				$newsItems[$newsCategoryId]['newsCount'] += 1;
+			} else {
+				foreach ($tags as $tag) {
+					$tagId = $tag->getUid();
+					if (!isset($newsItems[$tagId])) {
+						$newsItems[$tagId] = [
+							'record' => $tag,
+							'recordId' => $tagId,
+							'recordType' => 'tag',
+							'newsMetaData' => [],
+							'newsCount' => 0
+						];
+					}
+
+					if ($newsEntry->getTags()->contains($tag)) {
+						$newsItems[$tagId]['newsMetaData'][] = $newsMetaData;
+						$newsItems[$tagId]['newsCount'] += 1;
+					}
+				}
 			}
 
-			$data = $this->getMetaDataForNews($newsEntry, $category);
-			$allNews[] = $data;
+			$allNews[] = $newsMetaData;
 		}
 
-		$this->highlightBestFitNews($categoryIds);
+		$this->highlightBestFitNews($categoryIds, $tagIds);
 
+		// Check to achieve less Ajax calls.
 		$newsCount = $this->newsRepository->newsCountByCategories($categoryIds, $tagIds, $startTime, $endTime);
-		$numberOfPages = (int) ($newsLimitPerCategory <= 0 ? 0 : ceil($newsCount / $newsLimitPerCategory));
+		$numberOfPages = (int) ($newsLimit <= 0 ? 0 : ceil($newsCount / $newsLimit));
 		if ($numberOfPages !== 0 && $currentPageBrowserPage >= $numberOfPages) {
 			/** @var ErrorController $errorController */
 			$errorController = GeneralUtility::makeInstance(ErrorController::class);
@@ -330,191 +275,94 @@ class OverviewController extends AbstractController {
 			throw new ImmediateResponseException($response);
 		}
 
-		// find all tags
-		$tagPid = $GLOBALS['TSFE']->id;
-		if ($this->settings['onlyNewsWithinThisPageSection']) {
-			$tags = $this->tagRepository->findTagsInRootLine($tagPid);
-		} else {
-			$tags = $this->tagRepository->findAll()->toArray();
-		}
-
 		// remember selection of the filter values, if any
-		$selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']);
 		$selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']);
+		$selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']);
 		$this->view->assign('selectedCategory', $selectedCategory);
 		$this->view->assign('selectedTag', $selectedTag);
 		$this->view->assign('tags', $tags);
 		$this->view->assign('categories', $categories);
 		$this->view->assign('numberOfPages', $numberOfPages);
-		$this->view->assign('newsItems', $newsByCategory);
-		$this->view->assign('groupBy', 'category');
+		$this->view->assign('newsItems', $newsItems);
 		$this->view->assign('allNews', $allNews);
-		$this->view->assign('categoryTabs', TRUE);
+		$this->setupGridColumns();
+
+		switch ($this->settings['groupBy']) {
+			case 1:
+				$this->view->assign('groupBy', 'category');
+				$this->view->assign('categoryTabs', TRUE);
+				break;
+			case 2:
+				$this->view->assign('groupBy', 'tag');
+				$this->view->assign('tagTabs', TRUE);
+				break;
+			default:
+				$this->view->assign('groupBy', 'none');
+		}
 	}
 
 	/**
-	 * Renders the news overview grouped by tags
+	 * Assign the grid column classes to the frontend
 	 *
-	 * @param array $newsByTag
-	 * @param array $allNews
-	 * @param array $newsFilter
-	 * @param int $currentPageBrowserPage
 	 * @return void
-	 * @throws \InvalidArgumentException
-	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
-	 * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException
-	 * @throws ImmediateResponseException
-	 * @throws \TYPO3\CMS\Core\Error\Http\PageNotFoundException
 	 */
-	protected function overviewWithTags(
-		array $newsByTag = [], array $allNews = [], array $newsFilter = [], int $currentPageBrowserPage = 0
-	) {
-		$startTime = (int) $this->settings['starttime'];
-		$endTime = (int) $this->settings['endtime'];
-		$newsLimitPerTag = (int) $this->settings['newsLimit'];
-		$offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerTag);
-		$tagPid = (int) $this->settings['tagPid'];
-		if (!$tagPid) {
-			$tagPid = $GLOBALS['TSFE']->id;
+	protected function setupGridColumns(): void {
+		if (!isset($this->settings['gridColumns'])) {
+			$this->view->assign('gridColumnClasses', 'col-md-4 col-sm-6 col-xs-12');
+			return;
 		}
 
-		$configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
-		$sortBy = $configurationService->getConfiguration('sortBy', $this->settings);
-		$sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings);
-
-		$categoryIds = NULL;
-		if ($newsFilter['category']) {
-			$categoryIds = [(int) $newsFilter['category']];
-		}
+		$columnAmount = (int) $this->settings['gridColumns'];
+		$columnClasses = '';
 
-		$this->tagRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]);
-		if ($this->settings['onlyNewsWithinThisPageSection']) {
-			$tags = $this->tagRepository->findTagsInRootLine($tagPid);
-		} else {
-			$tags = $this->tagRepository->findAll()->toArray();
+		switch ($columnAmount) {
+			case 4:
+				$columnClasses .= 'col-lg-3 ';
+			case 3:
+				$columnClasses .= 'col-md-4 ';
+			case 2:
+				$columnClasses .= 'col-sm-6 ';
+			default:
+				$columnClasses .= 'col-xs-12';
 		}
 
-		$tagRestrictions = GeneralUtility::intExplode(',', $this->settings['tagRestrictions'], TRUE);
-		if (count($tagRestrictions) > 0) {
-			foreach ($tags as $key => $tag) {
-				if (!in_array($tag->getUid(), $tagRestrictions, TRUE)) {
-					unset($tags[$key]);
-				}
-			}
-		}
+		$this->view->assign('gridColumnClasses', $columnClasses);
+	}
 
-		// Get news by tag id
-		$tagIds = [];
-		$tagsById = [];
-		$categoriesById = [];
-		$newsMetaData = [];
-		foreach ($tags as $tag) {
-			/** @var $tag Tag */
-			$tagId = $tag->getUid();
-			$tagIds[] = $tagId;
-			$tagsById[$tagId] = $tag;
-
-			$news = $this->newsRepository->findAllSortedNewsByCategories(
-				$categoryIds, $newsLimitPerTag, $offset, $sortBy, [$tagId], $startTime, $endTime, $sortDirection
-			);
-			$newsMetaData[$tagId] = [];
-			foreach ($news as $newsEntry) {
-				/** @var News $newsEntry */
-				$categoryId = $newsEntry->getPid();
-				if (!isset($categoriesById[$categoryId])) {
-					$categoriesById[$categoryId] = $this->categoryRepository->findByUid($categoryId);
-				}
-				$category = $categoriesById[$categoryId];
-				if (!$category) {
-					// Category isn't visible.
-					continue;
-				}
+	/**
+	 * Highlights the best fitting news in the metadata of the page
+	 *
+	 * @param array|null $categoryIds
+	 * @param array|null $tagIds
+	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
+	 */
+	protected function highlightBestFitNews(array $categoryIds = NULL, array $tagIds = NULL) {
+		$startTime = (int) $this->settings['starttime'];
+		$endTime = (int) $this->settings['endtime'];
 
-				$newsMetaData[$tagId][] = $this->getMetaDataForNews($newsEntry, $category);
-			}
+		/** @var News $highlightedNews */
+		$highlightedNews = $this->newsRepository
+			->findLastUpdatedOrHighlightedNewsByCategories(
+				1, FALSE, $categoryIds, 0, FALSE, $this->settings['sortBy'], $tagIds, $startTime, $endTime
+			)->getFirst();
+		if (!$highlightedNews) {
+			return;
 		}
 
-		// Process news by tag id
-		$maxNewsPerTag = 0;
-		foreach ($tagsById as $tagId => $tag) {
-			if (\count($newsMetaData[$tagId]) <= 0) {
-				// Hide empty tags.
-				continue;
-			}
-
-			if (isset($newsByTag[$tagId])) {
-				$newsByTag[$tagId]['newsMetaData'] =
-					\array_merge($newsByTag[$tagId]['newsMetaData'], $newsMetaData[$tagId]);
-			} else {
-				$newsByTag[$tagId] = [
-					'record' => $tag,
-					'recordId' => $tagId,
-					'recordType' => 'tag',
-					'newsMetaData' => $newsMetaData[$tagId],
-					'newsCount' => \count($newsMetaData[$tagId])
-				];
-			}
-
-			$maxNewsPerTag = \max($maxNewsPerTag, \count($newsByTag[$tagId]['newsMetaData']));
+		/** @var Category $category */
+		$category = $this->categoryRepository->findByUid($highlightedNews->getPid());
+		$highlightedNewsMetaData = NULL;
+		if ($category) {
+			$highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category);
 		}
 
-		// Get all news by tags.
-		if ($newsFilter['tag']) {
-			$tagIds = [(int) $newsFilter['tag']];
-		}
-		$news = $this->newsRepository->findAllSortedNewsByCategories(
-			$categoryIds, $newsLimitPerTag, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection
-		);
-		foreach ($news as $newsEntry) {
-			/** @var News $newsEntry */
-			$categoryId = $newsEntry->getPid();
-			if (!isset($categoriesById[$categoryId])) {
-				$categoriesById[$categoryId] = $this->categoryRepository->findByUid($categoryId);
-			}
-			/** @var Category $category */
-			$category = $categoriesById[$categoryId];
-			if (!$category) {
-				// Category isn't visible.
-				continue;
+		if (!version_compare(ExtensionManagementUtility::getExtensionVersion('sg_seo'), '5.0.0', '>=')) {
+			if ($highlightedNewsMetaData['image']) {
+				HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']);
+			} elseif ($highlightedNewsMetaData['teaserImage']) {
+				HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']);
 			}
-
-			$allNews[] = $this->getMetaDataForNews($newsEntry, $category);
-		}
-
-		$this->highlightBestFitNews([], $tagIds);
-
-		// Check to achieve less Ajax calls.
-		$newsCount = $this->newsRepository->newsCountByCategories([], $tagIds, $startTime, $endTime);
-		$numberOfPages = (int) ($newsLimitPerTag <= 0 ? 0 : ceil($newsCount / $newsLimitPerTag));
-		if ($numberOfPages !== 0 && $currentPageBrowserPage >= $numberOfPages) {
-			/** @var ErrorController $errorController */
-			$errorController = GeneralUtility::makeInstance(ErrorController::class);
-			$response = $errorController->pageNotFoundAction(
-				$GLOBALS['TYPO3_REQUEST'],
-				'The requested page does not exist',
-				['code' => PageAccessFailureReasons::PAGE_NOT_FOUND]
-			);
-			throw new ImmediateResponseException($response);
 		}
-
-		if ($this->settings['onlyNewsWithinThisPageSection']) {
-			$categories = $this->categoryRepository->findCategoriesInRootLine($GLOBALS['TSFE']->id);
-		} else {
-			$categories = $this->categoryRepository->findAll()->toArray();
-		}
-
-		// remember selection of the filter values, if any
-		$selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']);
-		$selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']);
-		$this->view->assign('selectedCategory', $selectedCategory);
-		$this->view->assign('selectedTag', $selectedTag);
-		$this->view->assign('tags', $tags);
-		$this->view->assign('categories', $categories);
-		$this->view->assign('numberOfPages', $numberOfPages);
-		$this->view->assign('newsItems', $newsByTag);
-		$this->view->assign('groupBy', 'tag');
-		$this->view->assign('allNews', $allNews);
-		$this->view->assign('tagTabs', TRUE);
 	}
 
 	/**
@@ -651,6 +499,7 @@ class OverviewController extends AbstractController {
 		$this->view->assign('categories', $categories);
 		$this->view->assign('numberOfPages', $numberOfPages);
 		$this->view->assign('newsMetaData', $newsMetaData);
+		$this->setupGridColumns();
 	}
 
 	/**
diff --git a/Configuration/FlexForms/Overview.xml b/Configuration/FlexForms/Overview.xml
index 23ce498fe2ad094c3fbf2f4d96be4d5e2647ff1f..10b59fda4f6bbbac6dcaddcc5f0e878460b3b5f2 100644
--- a/Configuration/FlexForms/Overview.xml
+++ b/Configuration/FlexForms/Overview.xml
@@ -13,6 +13,7 @@
 					<settings.groupBy>
 						<TCEforms>
 							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.groupBy</label>
+							<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.groupBy.description</description>
 							<onChange>reload</onChange>
 							<config>
 								<type>select</type>
@@ -36,11 +37,28 @@
 						</TCEforms>
 					</settings.groupBy>
 
+					<settings.enableFilter>
+						<TCEforms>
+							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter</label>
+							<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter.description</description>
+							<onChange>reload</onChange>
+							<config>
+								<type>check</type>
+								<default>0</default>
+							</config>
+						</TCEforms>
+					</settings.enableFilter>
+
 					<settings.categoryRestrictions>
 						<TCEforms>
 							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryRestrictions</label>
 							<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryRestrictions.description</description>
-							<displayCond>FIELD:settings.groupBy:=:1</displayCond>
+							<displayCond>
+								<or>
+									<value1>FIELD:settings.groupBy:=:1</value1>
+									<value2>FIELD:settings.enableFilter:=:1</value2>
+								</or>
+							</displayCond>
 							<config>
 								<type>select</type>
 								<renderType>selectMultipleSideBySide</renderType>
@@ -57,7 +75,12 @@
 						<TCEforms>
 							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.tags</label>
 							<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.tags.description</description>
-							<displayCond>FIELD:settings.groupBy:=:2</displayCond>
+							<displayCond>
+								<or>
+									<value1>FIELD:settings.groupBy:=:2</value1>
+									<value2>FIELD:settings.enableFilter:=:1</value2>
+								</or>
+							</displayCond>
 							<config>
 								<type>select</type>
 								<renderType>selectTree</renderType>
@@ -77,16 +100,6 @@
 						</TCEforms>
 					</settings.tagRestrictions>
 
-					<settings.enableFilter>
-						<TCEforms>
-							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter</label>
-							<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter.description</description>
-							<config>
-								<type>check</type>
-								<default>0</default>
-							</config>
-						</TCEforms>
-					</settings.enableFilter>
 					<settings.categoryLabel>
 						<TCEforms>
 							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryLabel</label>
@@ -220,6 +233,34 @@
 							</config>
 						</TCEforms>
 					</settings.layout>
+					<settings.gridColumns>
+						<TCEforms>
+							<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns</label>
+							<config>
+								<type>select</type>
+								<renderType>selectSingle</renderType>
+								<default>3</default>
+								<items>
+									<numIndex index="0">
+										<numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.1</numIndex>
+										<numIndex index="1">1</numIndex>
+									</numIndex>
+									<numIndex index="1">
+										<numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.2</numIndex>
+										<numIndex index="1">2</numIndex>
+									</numIndex>
+									<numIndex index="2">
+										<numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.3</numIndex>
+										<numIndex index="1">3</numIndex>
+									</numIndex>
+									<numIndex index="3">
+										<numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.4</numIndex>
+										<numIndex index="1">4</numIndex>
+									</numIndex>
+								</items>
+							</config>
+						</TCEforms>
+					</settings.gridColumns>
 				</el>
 			</ROOT>
 		</main>
diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf
index 22069fcaa5e58020b26571c5b28a768defbbb1e2..10d21c38c025ad2e9731b8d48b500ae8578ab2b9 100644
--- a/Resources/Private/Language/de.locallang_db.xlf
+++ b/Resources/Private/Language/de.locallang_db.xlf
@@ -113,6 +113,26 @@
 				<source><![CDATA[News which are excluded from the list]]></source>
 				<target><![CDATA[News, welche nicht in der Liste dargestellt werden]]></target>
 			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns" approved="yes">
+				<source><![CDATA[Columns]]></source>
+				<target><![CDATA[Anzahl der Spalten]]></target>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.1" approved="yes">
+				<source><![CDATA[1 Column]]></source>
+				<target><![CDATA[1 Spalte]]></target>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.2" approved="yes">
+				<source><![CDATA[2 Columns]]></source>
+				<target><![CDATA[2 Spalten]]></target>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.3" approved="yes">
+				<source><![CDATA[3 Columns]]></source>
+				<target><![CDATA[3 Spalten]]></target>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.4" approved="yes">
+				<source><![CDATA[4 Columns]]></source>
+				<target><![CDATA[4 Spalten]]></target>
+			</trans-unit>
 			<trans-unit id="plugin.flexForm.layout" approved="yes">
 				<source><![CDATA[Layout]]></source>
 				<target><![CDATA[Layout]]></target>
@@ -232,16 +252,20 @@ If none are selected, all categories will be available in the frontend.]]></sour
 Wenn keine ausgewählt werden, sind alle Kategorien im Frontend verfügbar.]]></target>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.enableFilter" approved="yes">
-				<source><![CDATA[Enable filtering by all criteria.]]></source>
-				<target><![CDATA[Ermögliche das Filtern mit allen Krierien.]]></target>
+				<source><![CDATA[Show all filters]]></source>
+				<target><![CDATA[Zeige alle Filter an]]></target>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.enableFilter.description" approved="yes">
 				<source><![CDATA[Filters will be rendered as select boxes and tabs will be hidden.]]></source>
 				<target><![CDATA[Filter werden als Dropdown-Box angezeigt und die Tabs ausgeblendet.]]></target>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.groupBy" approved="yes">
-				<source><![CDATA[Group news pages in tabs by]]></source>
-				<target><![CDATA[News-Seiten nach folgendem Kriterium in Tabs gruppieren]]></target>
+				<source><![CDATA[Group news pages by]]></source>
+				<target><![CDATA[News-Seiten nach folgendem Kriterium gruppieren]]></target>
+			</trans-unit>
+			<trans-unit id="plugin.overview.flexForm.groupBy.description" approved="yes">
+				<source><![CDATA[News pages will be grouped in tabs.]]></source>
+				<target><![CDATA[News-Seiten werden in Tabs gruppiert.]]></target>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.groupBy.I.0" approved="yes">
 				<source><![CDATA[No grouping]]></source>
diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf
index a24ed7c27096f50f44c0e42f5be02a6a69ad3954..4d42520c1b82b563b95e9ebf859d6c61489b0978 100644
--- a/Resources/Private/Language/locallang_db.xlf
+++ b/Resources/Private/Language/locallang_db.xlf
@@ -87,6 +87,21 @@
 			<trans-unit id="plugin.flexForm.excludedNews">
 				<source><![CDATA[News which are excluded from the list]]></source>
 			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns">
+				<source><![CDATA[Columns]]></source>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.1">
+				<source><![CDATA[1 Column]]></source>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.2">
+				<source><![CDATA[2 Columns]]></source>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.3">
+				<source><![CDATA[3 Columns]]></source>
+			</trans-unit>
+			<trans-unit id="plugin.flexForm.gridColumns.4">
+				<source><![CDATA[4 Columns]]></source>
+			</trans-unit>
 			<trans-unit id="plugin.flexForm.layout">
 				<source><![CDATA[Layout]]></source>
 			</trans-unit>
@@ -176,13 +191,16 @@
 If none are selected, all categories will be available in the frontend.]]></source>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.enableFilter">
-				<source><![CDATA[Enable filtering by all criteria.]]></source>
+				<source><![CDATA[Show all filters]]></source>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.enableFilter.description">
 				<source><![CDATA[Filters will be rendered as select boxes and tabs will be hidden.]]></source>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.groupBy">
-				<source><![CDATA[Group news pages in tabs by]]></source>
+				<source><![CDATA[Group news pages by]]></source>
+			</trans-unit>
+			<trans-unit id="plugin.overview.flexForm.groupBy.description">
+				<source><![CDATA[News pages will be grouped in tabs.]]></source>
 			</trans-unit>
 			<trans-unit id="plugin.overview.flexForm.groupBy.I.0">
 				<source><![CDATA[No grouping]]></source>
diff --git a/Resources/Private/Templates/Overview/Overview.html b/Resources/Private/Templates/Overview/Overview.html
index 6cc96d8d84c29ee7978647ea1e0ab66355eb1bf2..1538104f9f84b4923c4178dc4b71ea434922ad66 100644
--- a/Resources/Private/Templates/Overview/Overview.html
+++ b/Resources/Private/Templates/Overview/Overview.html
@@ -58,7 +58,7 @@
 							<ul class="tx-sgnews-list tx-sgnews-list-{dataItems.record.uid} row" data-record="{dataItems.record.uid}">
 								<f:for each="{dataItems.newsMetaData}" as="newsMetaDataEntry">
 									<f:if condition="{newsMetaDataEntry.news}">
-										<li class="col-md-4 col-sm-6 col-xs-12">
+										<li class="{gridColumnClasses}">
 											<f:render partial="Teaser" arguments="{
 											newsMetaData: newsMetaDataEntry,
 											headerTag: '<h2>',
@@ -92,7 +92,7 @@
 <f:section name="content">
 	<ul class="tx-sgnews-list tx-sgnews-list-0 row" data-record="0">
 		<f:for each="{allNews}" as="newsMetaDataEntry">
-			<li class="col-md-4 col-sm-6 col-xs-12">
+			<li class="{gridColumnClasses}">
 				<f:render partial="Teaser" arguments="{
 								newsMetaData: newsMetaDataEntry,
 								headerTag: '<h2>',
diff --git a/Resources/Private/Templates/Overview/OverviewWithoutCategories.html b/Resources/Private/Templates/Overview/OverviewWithoutCategories.html
index e41b2fc4b9b96bd21054ebb41c371f2b1bd5e5b7..f1839f91f8ac6ff3ec81ff96df463c8bd3b3d5c1 100644
--- a/Resources/Private/Templates/Overview/OverviewWithoutCategories.html
+++ b/Resources/Private/Templates/Overview/OverviewWithoutCategories.html
@@ -18,7 +18,7 @@
 			<f:then>
 				<ul class="tx-sgnews-list tx-sgnews-list-0 row" data-record="0">
 					<f:for each="{newsMetaData}" as="newsMetaDataEntry">
-						<li class="col-md-4 col-sm-6 col-xs-12">
+						<li class="{gridColumnClasses}">
 							<f:render partial="Teaser" arguments="{
 											newsMetaData: newsMetaDataEntry,
 											headerTag: '<h2>',