diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp
index 68b1a355d..b210c283b 100644
--- a/es-app/src/guis/GuiMenu.cpp
+++ b/es-app/src/guis/GuiMenu.cpp
@@ -160,6 +160,24 @@ GuiMenu::GuiMenu(Window* window) : GuiComponent(window), mMenu(window, "MAIN MEN
 				});
 			}
 
+			// GameList view style
+			auto gamelist_style = std::make_shared< OptionListComponent<std::string> >(mWindow, "GAMELIST VIEW STYLE", false);
+			std::vector<std::string> styles;
+			styles.push_back("automatic");
+			styles.push_back("basic");
+			styles.push_back("detailed");
+			styles.push_back("video");
+			for (auto it = styles.begin(); it != styles.end(); it++)
+				gamelist_style->add(*it, *it, Settings::getInstance()->getString("GamelistViewStyle") == *it);
+			s->addWithLabel("GAMELIST VIEW STYLE", gamelist_style);
+			s->addSaveFunc([gamelist_style] {
+				bool needReload = false;
+				if (Settings::getInstance()->getString("GamelistViewStyle") != gamelist_style->getSelected())
+					needReload = true;
+				Settings::getInstance()->setString("GamelistViewStyle", gamelist_style->getSelected()); 
+				if (needReload)
+					ViewController::get()->reloadAll();
+			});
 			mWindow->pushGui(s);
 	});
 
diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp
index cc83eece5..294f953cd 100644
--- a/es-app/src/views/ViewController.cpp
+++ b/es-app/src/views/ViewController.cpp
@@ -231,33 +231,51 @@ std::shared_ptr<IGameListView> ViewController::getGameListView(SystemData* syste
 	bool themeHasVideoView = system->getTheme()->hasView("video");
 
 	//decide type
-	bool detailed = false;
-	bool video	  = false;
-	std::vector<FileData*> files = system->getRootFolder()->getFilesRecursive(GAME | FOLDER);
-	for(auto it = files.begin(); it != files.end(); it++)
+	GameListViewType selectedViewType = AUTOMATIC;
+
+	std::string viewPreference = Settings::getInstance()->getString("GamelistViewStyle");
+	if (viewPreference.compare("basic") == 0)
+		selectedViewType = BASIC;
+	if (viewPreference.compare("detailed") == 0)
+		selectedViewType = DETAILED;
+	if (viewPreference.compare("video") == 0)
+		selectedViewType = VIDEO;
+
+	if (selectedViewType == AUTOMATIC)
 	{
-		if(themeHasVideoView && !(*it)->getVideoPath().empty())
+		std::vector<FileData*> files = system->getRootFolder()->getFilesRecursive(GAME | FOLDER);
+		for (auto it = files.begin(); it != files.end(); it++)
 		{
-			video = true;
-			break;
-		}
-		else if(!(*it)->getThumbnailPath().empty())
-		{
-			detailed = true;
-			// Don't break out in case any subsequent files have video
+			if (themeHasVideoView && !(*it)->getVideoPath().empty())
+			{
+				selectedViewType = VIDEO;
+				break;
+			}
+			else if (!(*it)->getThumbnailPath().empty())
+			{
+				selectedViewType = DETAILED;
+				// Don't break out in case any subsequent files have video
+			}
 		}
 	}
-		
-	if (video)
-		// Create the view
-		view = std::shared_ptr<IGameListView>(new VideoGameListView(mWindow, system->getRootFolder()));
-	else if(detailed)
-		view = std::shared_ptr<IGameListView>(new DetailedGameListView(mWindow, system->getRootFolder()));
-	else
-		view = std::shared_ptr<IGameListView>(new BasicGameListView(mWindow, system->getRootFolder()));
-		
-	// uncomment for experimental "image grid" view
-	//view = std::shared_ptr<IGameListView>(new GridGameListView(mWindow, system->getRootFolder()));
+
+	// Create the view
+	switch (selectedViewType)
+	{
+		case VIDEO:
+			view = std::shared_ptr<IGameListView>(new VideoGameListView(mWindow, system->getRootFolder()));
+			break;
+		case DETAILED:
+			view = std::shared_ptr<IGameListView>(new DetailedGameListView(mWindow, system->getRootFolder()));
+			break;
+		// case GRID placeholder for future implementation.
+		//		view = std::shared_ptr<IGameListView>(new GridGameListView(mWindow, system->getRootFolder()));
+		//		break;
+		case BASIC:
+		default:
+			view = std::shared_ptr<IGameListView>(new BasicGameListView(mWindow, system->getRootFolder()));
+			break;
+	}
 
 	view->setTheme(system->getTheme());
 
diff --git a/es-app/src/views/ViewController.h b/es-app/src/views/ViewController.h
index 2658f44a9..78051650f 100644
--- a/es-app/src/views/ViewController.h
+++ b/es-app/src/views/ViewController.h
@@ -49,6 +49,15 @@ public:
 		GAME_LIST
 	};
 
+	enum GameListViewType
+	{
+		AUTOMATIC,
+		BASIC,
+		DETAILED,
+		VIDEO
+		// GRID TODO!
+	};
+
 	struct State
 	{
 		ViewMode viewing;
diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp
index df90ba7b6..0c4305dfe 100644
--- a/es-core/src/Settings.cpp
+++ b/es-core/src/Settings.cpp
@@ -75,6 +75,7 @@ void Settings::setDefaults()
 	mStringMap["ThemeSet"] = "";
 	mStringMap["ScreenSaverBehavior"] = "dim";
 	mStringMap["Scraper"] = "TheGamesDB";
+	mStringMap["GamelistViewStyle"] = "automatic";
 }
 
 template <typename K, typename V>