diff --git a/include/nav.php b/include/nav.php
index 3a32c8e7d8..13999e0e80 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -150,11 +150,11 @@ function nav_info(App $a)
 	}
 
 	if (in_array(Config::get('system', 'community_page_style'), [CP_USERS_ON_SERVER, CP_USERS_AND_GLOBAL])) {
-		$nav['community'] = array('community', t('Community'), '', t('Conversations on this site'));
+		$nav['community'] = array('community/local', t('Community'), '', t('Conversations on this site'));
 	}
 
 	if (in_array(Config::get('system', 'community_page_style'), [CP_GLOBAL_COMMUNITY, CP_USERS_AND_GLOBAL])) {
-		$nav['global'] = array('global', t('Global Timeline'), '', t('Conversations on the network'));
+		$nav['global'] = array('community/global', t('Global Timeline'), '', t('Conversations on the network'));
 	}
 
 	if (local_user()) {
diff --git a/mod/community.php b/mod/community.php
index 0c1324fec9..138873be57 100644
--- a/mod/community.php
+++ b/mod/community.php
@@ -20,11 +20,38 @@ function community_content(App $a, $update = 0) {
 		return;
 	}
 
-	if (!local_user() && !in_array(Config::get('system','community_page_style'), [CP_USERS_ON_SERVER, CP_USERS_AND_GLOBAL])) {
-		notice(t('Not available.') . EOL);
+	$page_style = Config::get('system','community_page_style');
+
+	if ($a->argc > 1) {
+		$content = $a->argv[1];
+	} else {
+		// When only the global community is allowed, we use this as default
+		$content = $page_style == CP_GLOBAL_COMMUNITY ? 'global' : 'local';
+	}
+
+	if (!in_array($content, ['local', 'global'])) {
+		notice(t('Community option not available.') . EOL);
 		return;
 	}
 
+	// Check if we are allowed to display the content to visitors
+	if (!local_user()) {
+		$available = $page_style == CP_USERS_AND_GLOBAL;
+
+		if (!$available) {
+			$available = ($page_style == CP_USERS_ON_SERVER) && ($content == 'local');
+		}
+
+		if (!$available) {
+			$available = ($page_style == CP_GLOBAL_COMMUNITY) && ($content == 'global');
+		}
+
+		if (!$available) {
+			notice(t('Not available.') . EOL);
+			return;
+		}
+	}
+
 	require_once 'include/bbcode.php';
 	require_once 'include/security.php';
 	require_once 'include/conversation.php';
@@ -51,7 +78,7 @@ function community_content(App $a, $update = 0) {
 		$a->set_pager_itemspage($itemspage_network);
 	}
 
-	$r = community_getitems($a->pager['start'], $a->pager['itemspage']);
+	$r = community_getitems($a->pager['start'], $a->pager['itemspage'], $content);
 
 	if (!DBM::is_result($r)) {
 		info(t('No results.') . EOL);
@@ -60,7 +87,7 @@ function community_content(App $a, $update = 0) {
 
 	$maxpostperauthor = Config::get('system','max_author_posts_community_page');
 
-	if ($maxpostperauthor != 0) {
+	if (($maxpostperauthor != 0) && ($content == 'local')) {
 		$count = 1;
 		$previousauthor = "";
 		$numposts = 0;
@@ -80,7 +107,7 @@ function community_content(App $a, $update = 0) {
 				}
 			}
 			if (sizeof($s) < $a->pager['itemspage']) {
-				$r = community_getitems($a->pager['start'] + ($count * $a->pager['itemspage']), $a->pager['itemspage']);
+				$r = community_getitems($a->pager['start'] + ($count * $a->pager['itemspage']), $a->pager['itemspage'], $content);
 			}
 		} while ((sizeof($s) < $a->pager['itemspage']) && (++$count < 50) && (sizeof($r) > 0));
 	} else {
@@ -94,23 +121,35 @@ function community_content(App $a, $update = 0) {
 	$t = get_markup_template("community.tpl");
 	return replace_macros($t, array(
 		'$content' => $o,
-		'$header' => t("Community"),
-		'$show_global_community_hint' => false,
-		'$global_community_hint' => ''
+		'$header' => $content == 'global' ? t("Global Timeline") : t("Community"),
+		'$show_global_community_hint' => ($content == 'global') && Config::get('system', 'show_global_community_hint'),
+		'$global_community_hint' => t("This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users.")
 	));
 }
 
-function community_getitems($start, $itemspage) {
-	$r = dba::p("SELECT ".item_fieldlists()." FROM `thread`
-		INNER JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
-		INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
-		AND `item`.`allow_cid` = ''  AND `item`.`allow_gid` = ''
-		AND `item`.`deny_cid`  = '' AND `item`.`deny_gid`  = ''".
-		item_joins()." AND `contact`.`self`
-		WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
-		AND NOT `thread`.`private` AND `thread`.`wall`
-		ORDER BY `thread`.`received` DESC LIMIT ".intval($start).", ".intval($itemspage)
-	);
+function community_getitems($start, $itemspage, $content) {
+	if ($content == 'local') {
+		$r = dba::p("SELECT ".item_fieldlists()." FROM `thread`
+			INNER JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
+			INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
+			AND `item`.`allow_cid` = ''  AND `item`.`allow_gid` = ''
+			AND `item`.`deny_cid`  = '' AND `item`.`deny_gid`  = ''".
+			item_joins()." AND `contact`.`self`
+			WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
+			AND NOT `thread`.`private` AND `thread`.`wall`
+			ORDER BY `thread`.`received` DESC LIMIT ".intval($start).", ".intval($itemspage)
+		);
+		return dba::inArray($r);
+	} elseif ($content == 'global') {
+		$r = dba::p("SELECT ".item_fieldlists()." FROM `thread`
+			INNER JOIN `item` ON `item`.`id` = `thread`.`iid` ".item_joins().
+			"WHERE `thread`.`uid` = 0 AND `verb` = ?
+			ORDER BY `thread`.`created` DESC LIMIT ".intval($start).", ".intval($itemspage),
+			ACTIVITY_POST
+		);
+		return dba::inArray($r);
+	}
 
-	return dba::inArray($r);
+	// Should never happen
+	return array();
 }
diff --git a/src/Module/GlobalModule.php b/src/Module/GlobalModule.php
deleted file mode 100644
index 0d9c1110cd..0000000000
--- a/src/Module/GlobalModule.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-/**
- * @file src/Module/GlobalModule.php
- */
-
-namespace Friendica\Module;
-
-use Friendica\BaseModule;
-use Friendica\Core\Config;
-use Friendica\Core\PConfig;
-use Friendica\Database\DBM;
-use dba;
-
-/**
- * Global module
- *
- * Displays global posts on the server
- *
- * @author heluecht@pirati.ca
- */
-class GlobalModule extends BaseModule {
-	public static function init()
-	{
-		if (!local_user()) {
-			unset($_SESSION['theme']);
-			unset($_SESSION['mobile-theme']);
-		}
-	}
-
-	public static function content($update = 0)
-	{
-		$a = self::getApp();
-
-		$o = '';
-
-		if (Config::get('system','block_public') && !local_user() && !remote_user()) {
-			notice(t('Public access denied.') . EOL);
-			return;
-		}
-
-		if (!local_user() && !in_array(Config::get('system','community_page_style'), [CP_GLOBAL_COMMUNITY, CP_USERS_AND_GLOBAL])) {
-			notice(t('Not available.') . EOL);
-			return;
-		}
-
-		require_once 'include/bbcode.php';
-		require_once 'include/security.php';
-		require_once 'include/conversation.php';
-
-		if (!$update) {
-			nav_set_selected('global');
-		}
-
-		if (Config::get('system', 'comment_public')) {
-			// check if we serve a mobile device and get the user settings
-			// accordingly
-			if ($a->is_mobile) {
-				$itemspage_network = PConfig::get(local_user(),'system','itemspage_mobile_network', 20);
-			} else {
-				$itemspage_network = PConfig::get(local_user(),'system','itemspage_network', 40);
-			}
-
-			// now that we have the user settings, see if the theme forces
-			// a maximum item number which is lower then the user choice
-			if (($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) {
-				$itemspage_network = $a->force_max_items;
-			}
-
-			$a->set_pager_itemspage($itemspage_network);
-		}
-
-		$r = self::getPublicItems($a->pager['start'], $a->pager['itemspage']);
-
-		if (!DBM::is_result($r)) {
-			info(t('No results.') . EOL);
-			return $o;
-		}
-
-		$o .= conversation($a, $r, 'community', $update);
-
-		$o .= alt_pager($a, count($r));
-
-		$t = get_markup_template("community.tpl");
-		return replace_macros($t, array(
-			'$content' => $o,
-			'$header' => t("Global Timeline"),
-			'$show_global_community_hint' => Config::get('system', 'show_global_community_hint'),
-			'$global_community_hint' => t("This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users.")
-		));
-	}
-
-	private static function getPublicItems($start, $itemspage)
-	{
-		$r = dba::p("SELECT ".item_fieldlists()." FROM `thread`
-			INNER JOIN `item` ON `item`.`id` = `thread`.`iid` ".item_joins().
-			"WHERE `thread`.`uid` = 0 AND `verb` = ?
-			ORDER BY `thread`.`created` DESC LIMIT ".intval($start).", ".intval($itemspage),
-			ACTIVITY_POST
-		);
-
-		return dba::inArray($r);
-	}
-}