diff --git a/mod/notes.php b/mod/notes.php
index 39649d81f6..475e0b7e57 100644
--- a/mod/notes.php
+++ b/mod/notes.php
@@ -45,7 +45,7 @@ function notes_content(App $a, bool $update = false)
 		return;
 	}
 
-	$o = BaseProfile::getTabsHTML($a, 'notes', true, $a->getLoggedInUserNickname(), false);
+	$o = BaseProfile::getTabsHTML('notes', true, $a->getLoggedInUserNickname(), false);
 
 	if (!$update) {
 		$o .= '<h3>' . DI::l10n()->t('Personal Notes') . '</h3>';
diff --git a/mod/photos.php b/mod/photos.php
index 14eb88ac95..8bcd9f460c 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -865,9 +865,8 @@ function photos_content(App $a)
 		$contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => $owner_uid, 'blocked' => false, 'pending' => false]);
 	}
 
-	if ($user['hidewall'] && (DI::userSession()->getLocalUserId() != $owner_uid) && !$remote_contact) {
-		DI::sysmsg()->addNotice(DI::l10n()->t('Access to this item is restricted.'));
-		return;
+	if ($user['hidewall'] && !DI::userSession()->isAuthenticated()) {
+		DI::baseUrl()->redirect('profile/' . $user['nickname'] . '/restricted');
 	}
 
 	$sql_extra = Security::getPermissionsSQLByUserId($owner_uid);
@@ -876,7 +875,7 @@ function photos_content(App $a)
 
 	// tabs
 	$is_owner = (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $owner_uid));
-	$o .= BaseProfile::getTabsHTML($a, 'photos', $is_owner, $user['nickname'], $profile['hide-friends']);
+	$o .= BaseProfile::getTabsHTML('photos', $is_owner, $user['nickname'], $profile['hide-friends']);
 
 	// Display upload form
 	if ($datatype === 'upload') {
diff --git a/src/App.php b/src/App.php
index abad4ee35d..623a5b63a2 100644
--- a/src/App.php
+++ b/src/App.php
@@ -69,7 +69,6 @@ class App
 	private $theme_info = [
 		'videowidth'        => 425,
 		'videoheight'       => 350,
-		'events_in_profile' => true
 	];
 
 	private $user_id       = 0;
diff --git a/src/Content/Feature.php b/src/Content/Feature.php
index d594891b85..58dcf2ae59 100644
--- a/src/Content/Feature.php
+++ b/src/Content/Feature.php
@@ -120,6 +120,12 @@ class Feature
 				['tagadelic',           DI::l10n()->t('Tag Cloud'),               DI::l10n()->t('Provide a personal tag cloud on your profile page'), false, DI::config()->get('feature_lock', 'tagadelic', false)],
 				['profile_membersince', DI::l10n()->t('Display Membership Date'), DI::l10n()->t('Display membership date in profile'), false, DI::config()->get('feature_lock', 'profile_membersince', false)],
 			],
+
+			//Advanced Calendar Settings
+			'advanced_calendar' => [
+				DI::l10n()->t('Advanced Calendar Settings'),
+				['public_calendar',     DI::l10n()->t('Allow anonymous access to your calendar'), DI::l10n()->t('Allows anonymous visitors to consult your calendar and your public events. Contact birthday events are private to you.'), false, DI::config()->get('feature_lock', 'public_calendar', false)],
+			]
 		];
 
 		// removed any locked features and remove the entire category if this makes it empty
diff --git a/src/Model/Event.php b/src/Model/Event.php
index 6f1b29a6c3..5d71dd16af 100644
--- a/src/Model/Event.php
+++ b/src/Model/Event.php
@@ -21,6 +21,7 @@
 
 namespace Friendica\Model;
 
+use Friendica\Content\Feature;
 use Friendica\Content\Text\BBCode;
 use Friendica\Core\Hook;
 use Friendica\Core\Logger;
@@ -28,8 +29,7 @@ use Friendica\Core\Renderer;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\DI;
-use Friendica\Network\HTTPException\NotFoundException;
-use Friendica\Network\HTTPException\UnauthorizedException;
+use Friendica\Network\HTTPException;
 use Friendica\Protocol\Activity;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Map;
@@ -281,7 +281,7 @@ class Event
 			if (!DBA::isResult($existing_event)) {
 				return 0;
 			}
-			
+
 			if ($existing_event['edited'] === $event['edited']) {
 				return $event['id'];
 			}
@@ -501,36 +501,32 @@ class Event
 	 * Additionally, it can check if the owner array is selectable
 	 *
 	 * @param string $nickname
-	 * @param bool   $check
 	 *
 	 * @return array the owner array
-	 * @throws NotFoundException The given nickname does not exist
-	 * @throws UnauthorizedException The access for the given nickname is restricted
+	 * @throws HTTPException\InternalServerErrorException
+	 * @throws HTTPException\NotFoundException The given nickname does not exist
+	 * @throws HTTPException\UnauthorizedException The access for the given nickname is restricted
 	 */
-	public static function getOwnerForNickname(string $nickname, bool $check = true): array
+	public static function getOwnerForNickname(string $nickname): array
 	{
 		$owner = User::getOwnerDataByNick($nickname);
-		if (empty($owner)) {
-			throw new NotFoundException(DI::l10n()->t('User not found.'));
+		if (empty($owner) || $owner['account_removed'] || $owner['account_expired']) {
+			throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
 		}
 
-		if ($check) {
-			$contact_id = DI::userSession()->getRemoteContactID($owner['uid']);
+		if (!DI::userSession()->isAuthenticated() && $owner['hidewall']) {
+			throw new HTTPException\UnauthorizedException(DI::l10n()->t('Access to this profile has been restricted.'));
+		}
 
-			$remote_contact = $contact_id && DBA::exists('contact', ['id' => $contact_id, 'uid' => $owner['uid']]);
-
-			$is_owner = DI::userSession()->getLocalUserId() == $owner['uid'];
-
-			if ($owner['hidewall'] && !$is_owner && !$remote_contact) {
-				throw new UnauthorizedException(DI::l10n()->t('Access to this profile has been restricted.'));
-			}
+		if (!DI::userSession()->isAuthenticated() && !Feature::isEnabled($owner['uid'], 'public_calendar')) {
+			throw new HTTPException\UnauthorizedException(DI::l10n()->t('Permission denied.'));
 		}
 
 		return $owner;
 	}
 
 	/**
-	 * Get an event by its event ID.
+	 * Get an event by its event ID. Checks permissions.
 	 *
 	 * @param int         $owner_uid The User ID of the owner of the event
 	 * @param int         $event_id  The ID of the event in the event table
@@ -538,37 +534,32 @@ class Event
 	 * @return array Query result
 	 * @throws \Exception
 	 */
-	public static function getByIdAndUid(int $owner_uid, int $event_id, string $nickname = null): array
+	public static function getByIdAndUid(int $owner_uid, int $event_id): array
 	{
-		if (!empty($nickname)) {
-			$owner = static::getOwnerForNickname($nickname, true);
-			$owner_uid = $owner['uid'];
-
-			// get the permissions
-			$sql_perms = Item::getPermissionsSQLByUserId($owner_uid);
-			// we only want to have the events of the profile owner
-			$sql_extra = " AND `event`.`cid` = 0 " . $sql_perms;
-		} else {
-			$sql_extra = "";
-		}
-
 		// Only allow events if there is a valid owner_id.
 		if ($owner_uid == 0) {
 			return [];
 		}
 
-		// Query for the event by event id
-		$events = DBA::toArray(DBA::p("SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event`
-			LEFT JOIN `post-user` ON `post-user`.`event-id` = `event`.`id` AND `post-user`.`uid` = `event`.`uid`
-			WHERE `event`.`uid` = ? AND `event`.`id` = ? $sql_extra",
-			$owner_uid, $event_id));
+		// get the permissions
+		$sql_perms = Item::getPermissionsSQLByUserId($owner_uid);
 
+		// Query for the event by event id
+		$events = DBA::toArray(DBA::p(
+			"SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event`
+			LEFT JOIN `post-user` 
+				ON `post-user`.`event-id` = `event`.`id` 
+				AND `post-user`.`uid` = `event`.`uid`
+			WHERE `event`.`id` = ?
+			  AND `event`.`uid` = ?
+			  $sql_perms",
+			$event_id, $owner_uid
+		));
 		if (empty($events)) {
-			throw new NotFoundException(DI::l10n()->t('Event not found.'));
-		} else {
-			$events = self::removeDuplicates($events);
-			return $events[0];
+			throw new HTTPException\NotFoundException(DI::l10n()->t('Event not found.'));
 		}
+
+		return $events[0];
 	}
 
 	/**
@@ -577,34 +568,23 @@ class Event
 	 * @param int         $owner_uid The User ID of the owner of the events.
 	 * @param string|null $start     Start time of the timeframe.
 	 * @param string|null $finish    Finish time of the timeframe.
-	 * @param bool        $ignore
-	 * @param string|null $nickname
+	 * @param bool|null   $ignore    Filters ignored events (false: unignored events, true: ignored events, null: all events)
 	 *
 	 * @return array Query results.
-	 * @throws NotFoundException
-	 * @throws UnauthorizedException
+	 * @throws HTTPException\NotFoundException
+	 * @throws HTTPException\UnauthorizedException
 	 */
-	public static function getListByDate(int $owner_uid, string $start = null, string $finish = null, bool $ignore = false, string $nickname = null): array
+	public static function getListByDate(int $owner_uid, string $start = null, string $finish = null, ?bool $ignore = false): array
 	{
-		if (!empty($nickname)) {
-			$owner     = static::getOwnerForNickname($nickname);
-			$owner_uid = $owner['uid'];
-
-			// get the permissions
-			$sql_perms = Item::getPermissionsSQLByUserId($owner_uid);
-			// we only want to have the events of the profile owner
-			$sql_extra = " AND `event`.`cid` = 0 " . $sql_perms;
-		} else {
-			$sql_extra = "";
-		}
-
 		// Only allow events if there is a valid owner_id.
 		if ($owner_uid == 0) {
 			return [];
 		}
 
-		if (empty($start) || empty($finish)) {
+		// get the permissions
+		$sql_perms = Item::getPermissionsSQLByUserId($owner_uid);
 
+		if (empty($start) || empty($finish)) {
 			$y = intval(DateTimeFormat::localNow('Y'));
 			$m = intval(DateTimeFormat::localNow('m'));
 
@@ -616,41 +596,36 @@ class Event
 			}
 		}
 
+		if ($ignore === true) {
+			$sql_ignore = " AND `event`.`ignore` = 1";
+		} elseif ($ignore === false) {
+			$sql_ignore = " AND `event`.`ignore` = 0";
+		} else {
+			$sql_ignore = "";
+		}
+
 		// Query for the event by date.
-		$events = DBA::toArray(DBA::p("SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event`
-				LEFT JOIN `post-user` ON `post-user`.`event-id` = `event`.`id` AND `post-user`.`uid` = `event`.`uid`
-				WHERE `event`.`uid` = ? AND `event`.`ignore` = ?
-				AND (`finish` >= ? OR (`nofinish` AND `start` >= ?)) AND `start` <= ?
-				" . $sql_extra,
-			$owner_uid, $ignore,
-			$start, $start, $finish
+		$events = DBA::toArray(DBA::p(
+			"SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event`
+			LEFT JOIN `post-user`
+			    ON `post-user`.`event-id` = `event`.`id`
+	            AND `post-user`.`uid` = `event`.`uid`
+			WHERE `event`.`uid` = ?
+			  $sql_ignore
+			  AND (`finish` >= ? OR (`nofinish` AND `start` >= ?))
+			  AND `start` <= ?
+			  $sql_perms",
+			$owner_uid,
+			$start, $start,
+			$finish
 		));
 
-		$events = self::removeDuplicates($events ?? []);
+		$events = self::removeDuplicates($events);
 		return self::sortByDate($events);
 	}
 
 	/**
-	 * Convert an array query results in an array which could be used by the events template.
-	 *
-	 * @param array $event_result Event query array.
-	 * @return array Event array for the template.
-	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-	 * @throws \ImagickException
-	 */
-	public static function prepareListForTemplate(array $event_result): array
-	{
-		$event_list = [];
-
-		foreach ($event_result as $event) {
-			$event_list[] = static::prepareForItem($event);
-		}
-
-		return $event_list;
-	}
-
-	/**
-	 * Convert an one event in an array which could be used by the events template.
+	 * Convert an event in an array which could be used by the event template.
 	 *
 	 * @param array $event Event query array.
 	 * @return array Event array for the template.
@@ -696,29 +671,25 @@ class Event
 			[$title, $_trash] = explode("<br", BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['desc'])), BBCode::TWITTER_API);
 		}
 
-		$author_link = $event['author-link'];
-
-		$event['author-link'] = Contact::magicLink($author_link);
-
-		$html = self::getHTML($event);
-		$event['summary']  = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['summary']));
-		$event['desc']     = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['desc']));
-		$event['location'] = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['location']));
+		$event['author-link'] = Contact::magicLink($event['author-link']);
+		$event['summary']     = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['summary']));
+		$event['desc']        = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['desc']));
+		$event['location']    = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['location']));
 
 		return [
-			'id'       => $event['id'],
-			'start'    => $start,
-			'end'      => $end,
-			'allDay'   => false,
-			'title'    => $title,
-			'j'        => $j,
-			'd'        => $day,
-			'edit'     => $edit,
-			'drop'     => $drop,
-			'copy'     => $copy,
-			'item'     => $event,
-			'html'     => $html,
-			'plink'    => Item::getPlink($event),
+			'id'     => $event['id'],
+			'start'  => $start,
+			'end'    => $end,
+			'allDay' => false,
+			'title'  => $title,
+			'j'      => $j,
+			'd'      => $day,
+			'edit'   => $edit,
+			'drop'   => $drop,
+			'copy'   => $copy,
+			'item'   => $event,
+			'html'   => self::getHTML($event),
+			'plink'  => Item::getPlink($event),
 		];
 	}
 
@@ -727,8 +698,6 @@ class Event
 	 *
 	 * @param array  $events Query result for events.
 	 * @param string $format The output format (ical/csv).
-	 *
-	 * @param string $timezone Timezone (missing parameter!)
 	 * @return string Content according to selected export format.
 	 *
 	 * @todo  Implement timezone support
@@ -749,8 +718,8 @@ class Event
 				foreach ($events as $event) {
 					/// @todo The time / date entries don't include any information about the
 					/// timezone the event is scheduled in :-/
-					$tmp1 = strtotime($event['start']);
-					$tmp2 = strtotime($event['finish']);
+					$tmp1        = strtotime($event['start']);
+					$tmp2        = strtotime($event['finish']);
 					$time_format = "%H:%M:%S";
 					$date_format = "%Y-%m-%d";
 
@@ -792,21 +761,21 @@ class Event
 						$tmp = $event['summary'];
 						$tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
 						$tmp = addcslashes($tmp, ',;');
-						$o .= 'SUMMARY:' . $tmp . PHP_EOL;
+						$o   .= 'SUMMARY:' . $tmp . PHP_EOL;
 					}
 
 					if ($event['desc']) {
 						$tmp = $event['desc'];
 						$tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
 						$tmp = addcslashes($tmp, ',;');
-						$o .= 'DESCRIPTION:' . $tmp . PHP_EOL;
+						$o   .= 'DESCRIPTION:' . $tmp . PHP_EOL;
 					}
 
 					if ($event['location']) {
 						$tmp = $event['location'];
 						$tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
 						$tmp = addcslashes($tmp, ',;');
-						$o .= 'LOCATION:' . $tmp . PHP_EOL;
+						$o   .= 'LOCATION:' . $tmp . PHP_EOL;
 					}
 
 					$o .= 'END:VEVENT' . PHP_EOL;
@@ -932,42 +901,42 @@ class Event
 		$tformat       = DI::l10n()->t('g:i A'); // 8:01 AM.
 
 		// Convert the time to different formats.
-		$dtstart_dt = DI::l10n()->getDay(DateTimeFormat::local($item['event-start'], $dformat));
+		$dtstart_dt    = DI::l10n()->getDay(DateTimeFormat::local($item['event-start'], $dformat));
 		$dtstart_title = DateTimeFormat::utc($item['event-start'], DateTimeFormat::ATOM);
 		// Format: Jan till Dec.
 		$month_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], 'M'));
 		// Format: 1 till 31.
-		$date_short = DateTimeFormat::local($item['event-start'], 'j');
-		$start_time = DateTimeFormat::local($item['event-start'], $tformat);
+		$date_short  = DateTimeFormat::local($item['event-start'], 'j');
+		$start_time  = DateTimeFormat::local($item['event-start'], $tformat);
 		$start_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], $dformat_short));
 
 		// If the option 'nofinisch' isn't set, we need to format the finish date/time.
 		if (!$item['event-nofinish']) {
-			$finish = true;
-			$dtend_dt  = DI::l10n()->getDay(DateTimeFormat::local($item['event-finish'], $dformat));
+			$finish      = true;
+			$dtend_dt    = DI::l10n()->getDay(DateTimeFormat::local($item['event-finish'], $dformat));
 			$dtend_title = DateTimeFormat::utc($item['event-finish'], DateTimeFormat::ATOM);
-			$end_short = DI::l10n()->getDayShort(DateTimeFormat::utc($item['event-finish'], $dformat_short));
-			$end_time = DateTimeFormat::local($item['event-finish'], $tformat);
+			$end_short   = DI::l10n()->getDayShort(DateTimeFormat::utc($item['event-finish'], $dformat_short));
+			$end_time    = DateTimeFormat::local($item['event-finish'], $tformat);
 			// Check if start and finish time is at the same day.
 			if (substr($dtstart_title, 0, 10) === substr($dtend_title, 0, 10)) {
 				$same_date = true;
 			}
 		} else {
 			$dtend_title = '';
-			$dtend_dt = '';
-			$end_time = '';
-			$end_short = '';
+			$dtend_dt    = '';
+			$end_time    = '';
+			$end_short   = '';
 		}
 
 		// Format the event location.
 		$location = self::locationToArray($item['event-location']);
 
 		// Construct the profile link (magic-auth).
-		$author = ['uid' => 0, 'id' => $item['author-id'],
-				'network' => $item['author-network'], 'url' => $item['author-link']];
+		$author       = ['uid'     => 0, 'id' => $item['author-id'],
+		                 'network' => $item['author-network'], 'url' => $item['author-link']];
 		$profile_link = Contact::magicLinkByContact($author);
 
-		$tpl = Renderer::getMarkupTemplate('event_stream_item.tpl');
+		$tpl    = Renderer::getMarkupTemplate('event_stream_item.tpl');
 		$return = Renderer::replaceMacros($tpl, [
 			'$id'             => $item['event-id'],
 			'$title'          => BBCode::convertForUriId($item['uri-id'], $item['event-summary']),
@@ -1025,15 +994,15 @@ class Event
 		if (strpos($s, '[/map]') !== false) {
 			$found = preg_match("/\[map\](.*?)\[\/map\]/ism", $s, $match);
 			if (intval($found) > 0 && array_key_exists(1, $match)) {
-				$location['address'] =  $match[1];
+				$location['address'] = $match[1];
 				// Remove the map bbcode from the location name.
 				$location['name'] = str_replace($match[0], "", $s);
 			}
-		// Map tag with coordinates - e.g. [map=48.864716,2.349014].
+			// Map tag with coordinates - e.g. [map=48.864716,2.349014].
 		} elseif (strpos($s, '[map=') !== false) {
 			$found = preg_match("/\[map=(.*?)\]/ism", $s, $match);
 			if (intval($found) > 0 && array_key_exists(1, $match)) {
-				$location['coordinates'] =  $match[1];
+				$location['coordinates'] = $match[1];
 				// Remove the map bbcode from the location name.
 				$location['name'] = str_replace($match[0], "", $s);
 			}
@@ -1063,10 +1032,10 @@ class Event
 	{
 		// Check for duplicates
 		$condition = [
-			'uid' => $contact['uid'],
-			'cid' => $contact['id'],
+			'uid'   => $contact['uid'],
+			'cid'   => $contact['id'],
 			'start' => DateTimeFormat::utc($birthday),
-			'type' => 'birthday'
+			'type'  => 'birthday'
 		];
 		if (DBA::exists('event', $condition)) {
 			return false;
diff --git a/src/Model/Profile.php b/src/Model/Profile.php
index dcd39a30c1..26395cb4d1 100644
--- a/src/Model/Profile.php
+++ b/src/Model/Profile.php
@@ -461,7 +461,7 @@ class Profile
 			'$unfollow' => DI::l10n()->t('Unfollow'),
 			'$unfollow_link' => $unfollow_link,
 			'$subscribe_feed' => DI::l10n()->t('Atom feed'),
-			'$subscribe_feed_link' => $profile['poll'],
+			'$subscribe_feed_link' => $profile['hidewall'] ? '' : $profile['poll'],
 			'$wallmessage' => DI::l10n()->t('Message'),
 			'$wallmessage_link' => $wallmessage_link,
 			'$account_type' => $account_type,
diff --git a/src/Module/ActivityPub/Objects.php b/src/Module/ActivityPub/Objects.php
index e2328b5e58..8c8109d667 100644
--- a/src/Module/ActivityPub/Objects.php
+++ b/src/Module/ActivityPub/Objects.php
@@ -29,6 +29,7 @@ use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
+use Friendica\Model\User;
 use Friendica\Network\HTTPException;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Util\HTTPSignature;
@@ -74,7 +75,9 @@ class Objects extends BaseModule
 			throw new HTTPException\NotFoundException();
 		}
 
-		$validated = in_array($item['private'], [Item::PUBLIC, Item::UNLISTED]);
+		$owner = User::getById($item['uid'], ['hidewall']);
+
+		$validated = empty($owner['hidewall']) && in_array($item['private'], [Item::PUBLIC, Item::UNLISTED]);
 
 		if (!$validated) {
 			$requester = HTTPSignature::getSigner('', $_SERVER);
diff --git a/src/Module/BaseProfile.php b/src/Module/BaseProfile.php
index 56577ef33a..3573542c05 100644
--- a/src/Module/BaseProfile.php
+++ b/src/Module/BaseProfile.php
@@ -23,23 +23,24 @@ namespace Friendica\Module;
 
 use Friendica\App;
 use Friendica\BaseModule;
+use Friendica\Content\Feature;
 use Friendica\Core\Hook;
 use Friendica\Core\Renderer;
 use Friendica\DI;
+use Friendica\Model\User;
 
 class BaseProfile extends BaseModule
 {
 	/**
 	 * Returns the HTML for the profile pages tabs
 	 *
-	 * @param App    $a
 	 * @param string $current
 	 * @param bool   $is_owner
 	 * @param string $nickname
 	 * @return string
 	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
 	 */
-	public static function getTabsHTML(App $a, string $current, bool $is_owner, string $nickname, bool $hide_friends)
+	public static function getTabsHTML(string $current, bool $is_owner, string $nickname, bool $hide_friends)
 	{
 		$baseProfileUrl = DI::baseUrl() . '/profile/' . $nickname;
 
@@ -79,7 +80,7 @@ class BaseProfile extends BaseModule
 		];
 
 		// the calendar link for the full-featured events calendar
-		if ($is_owner && $a->getThemeInfoValue('events_in_profile')) {
+		if ($is_owner) {
 			$tabs[] = [
 				'label' => DI::l10n()->t('Calendar'),
 				'url'   => DI::baseUrl() . '/calendar',
@@ -88,17 +89,18 @@ class BaseProfile extends BaseModule
 				'id'    => 'calendar-tab',
 				'accesskey' => 'c',
 			];
-			// if the user is not the owner of the calendar we only show a calendar
-			// with the public events of the calendar owner
-		} elseif (!$is_owner) {
-			$tabs[] = [
-				'label' => DI::l10n()->t('Calendar'),
-				'url'   => DI::baseUrl() . '/calendar/show/' . $nickname,
-				'sel'   => $current == 'calendar' ? 'active' : '',
-				'title' => DI::l10n()->t('Calendar'),
-				'id'    => 'calendar-tab',
-				'accesskey' => 'c',
-			];
+		} else {
+			$owner = User::getByNickname($nickname, ['uid']);
+			if(DI::userSession()->isAuthenticated() || $owner && Feature::isEnabled($owner['uid'], 'public_calendar')) {
+				$tabs[] = [
+					'label' => DI::l10n()->t('Calendar'),
+					'url'   => DI::baseUrl() . '/calendar/show/' . $nickname,
+					'sel'   => $current == 'calendar' ? 'active' : '',
+					'title' => DI::l10n()->t('Calendar'),
+					'id'    => 'calendar-tab',
+					'accesskey' => 'c',
+				];
+			}
 		}
 
 		if ($is_owner) {
diff --git a/src/Module/Calendar/Event/Get.php b/src/Module/Calendar/Event/Get.php
index f0824d15a5..9bb86a7232 100644
--- a/src/Module/Calendar/Event/Get.php
+++ b/src/Module/Calendar/Event/Get.php
@@ -22,12 +22,14 @@
 namespace Friendica\Module\Calendar\Event;
 
 use Friendica\App;
+use Friendica\Content\Feature;
 use Friendica\Core\L10n;
 use Friendica\Core\Session\Capability\IHandleUserSessions;
 use Friendica\Core\System;
 use Friendica\Model\Event;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
+use Friendica\Model\User;
 use Friendica\Module\Response;
 use Friendica\Network\HTTPException;
 use Friendica\Util\DateTimeFormat;
@@ -43,24 +45,27 @@ class Get extends \Friendica\BaseModule
 	/** @var IHandleUserSessions */
 	protected $session;
 
-	public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, array $server, array $parameters = [])
+	public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, array $server, array $parameters = [])
 	{
 		parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
 
 		$this->session = $session;
+		$this->app     = $app;
 	}
 
 	protected function rawContent(array $request = [])
 	{
-		if (!$this->session->getLocalUserId()) {
+		$nickname = $this->parameters['nickname'] ?? $this->app->getLoggedInUserNickname();
+		if (!$nickname) {
 			throw new HTTPException\UnauthorizedException();
 		}
 
-		// get events by id or by date
+		$owner = Event::getOwnerForNickname($nickname);
+
 		if (!empty($request['id'])) {
-			$events = [Event::getByIdAndUid($this->session->getLocalUserId(), $request['id'], $this->parameters['nickname'] ?? null)];
+			$events = [Event::getByIdAndUid($owner['uid'], $request['id'])];
 		} else {
-			$events = Event::getListByDate($this->session->getLocalUserId(), $request['start'] ?? '', $request['end'] ?? '', false, $this->parameters['nickname'] ?? null);
+			$events = Event::getListByDate($owner['uid'], $request['start'] ?? '', $request['end'] ?? '');
 		}
 
 		System::jsonExit($events ? self::map($events) : []);
diff --git a/src/Module/Calendar/Event/Show.php b/src/Module/Calendar/Event/Show.php
index 85d4d47a7a..f08b663a23 100644
--- a/src/Module/Calendar/Event/Show.php
+++ b/src/Module/Calendar/Event/Show.php
@@ -23,11 +23,13 @@ namespace Friendica\Module\Calendar\Event;
 
 use Friendica\App;
 use Friendica\BaseModule;
+use Friendica\Content\Feature;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
 use Friendica\Core\Session\Capability\IHandleUserSessions;
 use Friendica\Core\System;
 use Friendica\Model\Event;
+use Friendica\Model\User;
 use Friendica\Module\Response;
 use Friendica\Network\HTTPException;
 use Friendica\Util\Profiler;
@@ -40,22 +42,27 @@ class Show extends BaseModule
 {
 	/** @var IHandleUserSessions */
 	protected $session;
+	/** @var App */
+	private $app;
 
-	public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, array $server, array $parameters = [])
+	public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, array $server, array $parameters = [])
 	{
 		parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
 
 		$this->session = $session;
+		$this->app     = $app;
 	}
 
 	protected function rawContent(array $request = [])
 	{
-		if (!$this->session->getLocalUserId()) {
-			throw new HTTPException\UnauthorizedException($this->t('Permission denied.'));
+		$nickname = $this->parameters['nickname'] ?? $this->app->getLoggedInUserNickname();
+		if (!$nickname) {
+			throw new HTTPException\UnauthorizedException();
 		}
 
-		$event = Event::getByIdAndUid($this->session->getLocalUserId(), (int)$this->parameters['id'] ?? 0, $this->parameters['nickname'] ?? '');
+		$owner = Event::getOwnerForNickname($nickname);
 
+		$event = Event::getByIdAndUid($owner['uid'], (int)$this->parameters['id'] ?? 0);
 		if (empty($event)) {
 			throw new HTTPException\NotFoundException($this->t('Event not found.'));
 		}
diff --git a/src/Module/Calendar/Show.php b/src/Module/Calendar/Show.php
index 9bcc004fd1..9a3e768ecc 100644
--- a/src/Module/Calendar/Show.php
+++ b/src/Module/Calendar/Show.php
@@ -23,6 +23,7 @@ namespace Friendica\Module\Calendar;
 
 use Friendica\App;
 use Friendica\BaseModule;
+use Friendica\Content\Feature;
 use Friendica\Content\Nav;
 use Friendica\Content\Widget;
 use Friendica\Core\L10n;
@@ -30,9 +31,11 @@ use Friendica\Core\Renderer;
 use Friendica\Core\Session\Capability\IHandleUserSessions;
 use Friendica\Core\Theme;
 use Friendica\Model\Event;
+use Friendica\Model\User;
 use Friendica\Module\BaseProfile;
 use Friendica\Module\Response;
 use Friendica\Module\Security\Login;
+use Friendica\Network\HTTPException;
 use Friendica\Navigation\SystemMessages;
 use Friendica\Util\Profiler;
 use Psr\Log\LoggerInterface;
@@ -60,7 +63,21 @@ class Show extends BaseModule
 
 	protected function content(array $request = []): string
 	{
-		if (!$this->session->getLocalUserId()) {
+		$nickname = $this->parameters['nickname'] ?? $this->app->getLoggedInUserNickname();
+		if (!$nickname) {
+			throw new HTTPException\UnauthorizedException();
+		}
+
+		$owner = User::getOwnerDataByNick($nickname);
+		if (!$owner || $owner['account_expired'] || $owner['account_removed']) {
+			throw new HTTPException\NotFoundException($this->t('User not found.'));
+		}
+
+		if (!$this->session->isAuthenticated() && $owner['hidewall']) {
+			$this->baseUrl->redirect('profile/' . $nickname . '/restricted');
+		}
+
+		if (!$this->session->isAuthenticated() && !Feature::isEnabled($owner['uid'], 'public_calendar')) {
 			$this->sysMessages->addNotice($this->t('Permission denied.'));
 			return Login::form();
 		}
@@ -73,42 +90,26 @@ class Show extends BaseModule
 		$this->page->registerFooterScript('view/asset/moment/min/moment-with-locales.min.js');
 		$this->page->registerFooterScript('view/asset/fullcalendar/dist/fullcalendar.min.js');
 
-		$htpl = Renderer::getMarkupTemplate('calendar/calendar_head.tpl');
+		$is_owner = $nickname == $this->app->getLoggedInUserNickname();
 
+		$htpl = Renderer::getMarkupTemplate('calendar/calendar_head.tpl');
 		$this->page['htmlhead'] .= Renderer::replaceMacros($htpl, [
-			'$calendar_api' => 'calendar/api/get' . (!empty($this->parameters['nickname']) ? '/' . $this->parameters['nickname'] : ''),
-			'$event_api'    => 'calendar/event/show' . (!empty($this->parameters['nickname']) ? '/' . $this->parameters['nickname'] : ''),
+			'$calendar_api' => 'calendar/api/get' . ($is_owner ? '' : '/' . $nickname),
+			'$event_api'    => 'calendar/event/show' . ($is_owner ? '' : '/' . $nickname),
 			'$modparams'    => 2,
 			'$i18n'         => $i18n,
 		]);
 
-		$tabs = '';
-
-		if (empty($this->parameters['nickname'])) {
-			if ($this->app->getThemeInfoValue('events_in_profile')) {
-				Nav::setSelected('home');
-			} else {
-				Nav::setSelected('calendar');
-			}
-
-			// tabs
-			if ($this->app->getThemeInfoValue('events_in_profile')) {
-				$tabs = BaseProfile::getTabsHTML($this->app, 'calendar', true, $this->app->getLoggedInUserNickname(), false);
-			}
-
-			$this->page['aside'] .= Widget\CalendarExport::getHTML($this->session->getLocalUserId());
-		} else {
-			$owner = Event::getOwnerForNickname($this->parameters['nickname'], true);
-
-			Nav::setSelected('calendar');
-
-			// get the tab navigation bar
-			$tabs = BaseProfile::getTabsHTML($this->app, 'calendar', false, $owner['nickname'], $owner['hide-friends']);
+		Nav::setSelected($is_owner ? 'home' : 'calendar');
 
+		if (!$is_owner) {
 			$this->page['aside'] .= Widget\VCard::getHTML($owner);
-			$this->page['aside'] .= Widget\CalendarExport::getHTML($owner['uid']);
 		}
 
+		$this->page['aside'] .= Widget\CalendarExport::getHTML($owner['uid']);
+
+		$tabs = BaseProfile::getTabsHTML('calendar', $is_owner, $nickname, !$is_owner && $owner['hide-friends']);
+
 		// ACL blocks are loaded in modals in frio
 		$this->page->registerFooterScript(Theme::getPathForFile('asset/typeahead.js/dist/typeahead.bundle.js'));
 		$this->page->registerFooterScript(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.js'));
diff --git a/src/Module/DFRN/Poll.php b/src/Module/DFRN/Poll.php
index e41dafed56..1562ce0de2 100644
--- a/src/Module/DFRN/Poll.php
+++ b/src/Module/DFRN/Poll.php
@@ -23,7 +23,9 @@ namespace Friendica\Module\DFRN;
 
 use Friendica\BaseModule;
 use Friendica\Core\System;
+use Friendica\Model\User;
 use Friendica\Module\Response;
+use Friendica\Network\HTTPException;
 use Friendica\Protocol\OStatus;
 
 /**
@@ -33,7 +35,19 @@ class Poll extends BaseModule
 {
 	protected function rawContent(array $request = [])
 	{
+		$owner = User::getByNickname(
+			$this->parameters['nickname'] ?? '',
+			['nickname', 'blocked', 'account_expired', 'account_removed', 'hidewall']
+		);
+		if (!$owner || $owner['account_expired'] || $owner['account_removed']) {
+			throw new HTTPException\NotFoundException($this->t('User not found.'));
+		}
+
+		if ($owner['blocked'] || $owner['hidewall']) {
+			throw new HTTPException\UnauthorizedException($this->t('Access to this profile has been restricted.'));
+		}
+
 		$last_update = $request['last_update'] ?? '';
-		System::httpExit(OStatus::feed($this->parameters['nickname'], $last_update, 10) ?? '', Response::TYPE_ATOM);
+		System::httpExit(OStatus::feed($owner['nickname'], $last_update, 10) ?? '', Response::TYPE_ATOM);
 	}
 }
diff --git a/src/Module/Feed.php b/src/Module/Feed.php
index b24ccbc946..59714af387 100644
--- a/src/Module/Feed.php
+++ b/src/Module/Feed.php
@@ -23,9 +23,9 @@ namespace Friendica\Module;
 
 use Friendica\BaseModule;
 use Friendica\Core\System;
-use Friendica\DI;
-use Friendica\Protocol\Feed as ProtocolFeed;
+use Friendica\Model\User;
 use Friendica\Network\HTTPException;
+use Friendica\Protocol\Feed as ProtocolFeed;
 
 /**
  * Provides public Atom feeds
@@ -37,23 +37,14 @@ use Friendica\Network\HTTPException;
  * - /feed/[nickname]/replies => comments
  * - /feed/[nickname]/activity => activity
  *
- * The nocache GET parameter is provided mainly for debug purposes, requires auth
- *
  * @author Hypolite Petovan <hypolite@mrpetovan.com>
  */
 class Feed extends BaseModule
 {
 	protected function rawContent(array $request = [])
 	{
-		$last_update = $this->getRequestValue($request, 'last_update', '');
-		$nocache     = !empty($request['nocache']) && DI::userSession()->getLocalUserId();
-
-		$type = null;
-		// @TODO: Replace with parameter from router
-		if (DI::args()->getArgc() > 2) {
-			$type = DI::args()->getArgv()[2];
-		}
-
+		$nick = $this->parameters['nickname'] ?? '';
+		$type = $this->parameters['type'] ?? null;
 		switch ($type) {
 			case 'posts':
 			case 'comments':
@@ -67,11 +58,19 @@ class Feed extends BaseModule
 				$type = 'posts';
 		}
 
-		$feed = ProtocolFeed::atom($this->parameters['nickname'], $last_update, 10, $type, $nocache, true);
-		if (empty($feed)) {
-			throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
+		$last_update = $this->getRequestValue($request, 'last_update', '');
+
+		$owner = User::getOwnerDataByNick($nick);
+		if (!$owner || $owner['account_expired'] || $owner['account_removed']) {
+			throw new HTTPException\NotFoundException($this->t('User not found.'));
 		}
 
+		if ($owner['blocked'] || $owner['hidewall']) {
+			throw new HTTPException\UnauthorizedException($this->t('Access to this profile has been restricted.'));
+		}
+
+		$feed = ProtocolFeed::atom($owner, $last_update, 10, $type);
+
 		System::httpExit($feed, Response::TYPE_ATOM);
 	}
 }
diff --git a/src/Module/Item/Display.php b/src/Module/Item/Display.php
index df500f7ccb..01bf9a5587 100644
--- a/src/Module/Item/Display.php
+++ b/src/Module/Item/Display.php
@@ -196,8 +196,7 @@ class Display extends BaseModule
 
 	protected function getDisplayData(array $item, bool $update = false, int $updateUid = 0, bool $force = false): string
 	{
-		$isRemoteContact = false;
-		$itemUid         = $this->session->getLocalUserId();
+		$itemUid = $this->session->getLocalUserId();
 
 		$parent = null;
 		if (!$this->session->getLocalUserId() && !empty($item['parent-uri-id'])) {
@@ -206,8 +205,7 @@ class Display extends BaseModule
 
 		if (!empty($parent)) {
 			$pageUid         = $parent['uid'];
-			$isRemoteContact = $this->session->getRemoteContactID($pageUid);
-			if ($isRemoteContact) {
+			if ($this->session->getRemoteContactID($pageUid)) {
 				$itemUid = $parent['uid'];
 			}
 		} else {
@@ -215,13 +213,11 @@ class Display extends BaseModule
 		}
 
 		if (!empty($pageUid) && ($pageUid != $this->session->getLocalUserId())) {
-			$page_user = User::getById($pageUid, ['hidewall']);
+			$page_user = User::getById($pageUid, ['nickname', 'hidewall']);
 		}
 
-		$is_owner = $this->session->getLocalUserId() && (in_array($pageUid, [$this->session->getLocalUserId(), 0]));
-
-		if (!empty($page_user['hidewall']) && !$is_owner && !$isRemoteContact) {
-			throw new HTTPException\ForbiddenException($this->t('Access to this profile has been restricted.'));
+		if (!empty($page_user['hidewall']) && !$this->session->isAuthenticated()) {
+			$this->baseUrl->redirect('profile/' . $page_user['nickname'] . '/restricted');
 		}
 
 		$sql_extra = Item::getPermissionsSQLByUserId($pageUid);
@@ -275,6 +271,8 @@ class Display extends BaseModule
 
 		$output = '';
 
+		$is_owner = $this->session->getLocalUserId() && (in_array($pageUid, [$this->session->getLocalUserId(), 0]));
+
 		// We need the editor here to be able to reshare an item.
 		if ($is_owner && !$update) {
 			$output .= $this->conversation->statusEditor([], 0, true);
diff --git a/src/Module/Profile/Common.php b/src/Module/Profile/Common.php
index 6837e0f821..5056758603 100644
--- a/src/Module/Profile/Common.php
+++ b/src/Module/Profile/Common.php
@@ -61,7 +61,7 @@ class Common extends BaseProfile
 			$a->redirect('profile/' . $nickname . '/contacts');
 		};
 
-		$o = self::getTabsHTML($a, 'contacts', false, $profile['nickname'], $profile['hide-friends']);
+		$o = self::getTabsHTML('contacts', false, $profile['nickname'], $profile['hide-friends']);
 
 		$tabs = self::getContactFilterTabs('profile/' . $nickname, 'common', $displayCommonTab);
 
diff --git a/src/Module/Profile/Contacts.php b/src/Module/Profile/Contacts.php
index 6397ff4595..5f8363a03d 100644
--- a/src/Module/Profile/Contacts.php
+++ b/src/Module/Profile/Contacts.php
@@ -57,7 +57,7 @@ class Contacts extends Module\BaseProfile
 
 		Nav::setSelected('home');
 
-		$o = self::getTabsHTML($a, 'contacts', $is_owner, $profile['nickname'], $profile['hide-friends']);
+		$o = self::getTabsHTML('contacts', $is_owner, $profile['nickname'], $profile['hide-friends']);
 
 		$tabs = self::getContactFilterTabs('profile/' . $nickname, $type, DI::userSession()->isAuthenticated() && $profile['uid'] != DI::userSession()->getLocalUserId());
 
diff --git a/src/Module/Profile/Media.php b/src/Module/Profile/Media.php
index bae2f9ad86..6c140acce2 100644
--- a/src/Module/Profile/Media.php
+++ b/src/Module/Profile/Media.php
@@ -44,7 +44,7 @@ class Media extends BaseProfile
 
 		$is_owner = DI::userSession()->getLocalUserId() == $profile['uid'];
 
-		$o = self::getTabsHTML($a, 'media', $is_owner, $profile['nickname'], $profile['hide-friends']);
+		$o = self::getTabsHTML('media', $is_owner, $profile['nickname'], $profile['hide-friends']);
 
 		$o .= Contact::getPostsFromUrl($profile['url'], false, 0, 0, true);
 
diff --git a/src/Module/Profile/Photos.php b/src/Module/Profile/Photos.php
index 50af6f0e96..12c0552b6a 100644
--- a/src/Module/Profile/Photos.php
+++ b/src/Module/Profile/Photos.php
@@ -72,8 +72,8 @@ class Photos extends \Friendica\Module\BaseProfile
 			throw new HttpException\ForbiddenException($this->t('Public access denied.'));
 		}
 
-		$owner = User::getOwnerDataByNick($this->parameters['nickname']);
-		if (!isset($owner['account_removed']) || $owner['account_removed']) {
+		$owner = Profile::load($this->app, $this->parameters['nickname'] ?? '');
+		if (!$owner || $owner['account_removed'] || $owner['account_expired']) {
 			throw new HTTPException\NotFoundException($this->t('User not found.'));
 		}
 
@@ -88,8 +88,8 @@ class Photos extends \Friendica\Module\BaseProfile
 			$remote_contact = $contact && !$contact['blocked'] && !$contact['pending'];
 		}
 
-		if ($owner['hidewall'] && !$is_owner && !$remote_contact) {
-			throw new HttpException\ForbiddenException($this->t('Access to this item is restricted.'));
+		if ($owner['hidewall'] && !$this->session->isAuthenticated()) {
+			$this->baseUrl->redirect('profile/' . $owner['nickname'] . '/restricted');
 		}
 
 		$this->session->set('photo_return', $this->args->getCommand());
@@ -174,13 +174,11 @@ class Photos extends \Friendica\Module\BaseProfile
 			]);
 		}
 
-		$this->page['aside'] .= Widget\VCard::getHTML($owner);
-
 		if (!empty($photo_albums_widget)) {
 			$this->page['aside'] .= $photo_albums_widget;
 		}
 
-		$o = self::getTabsHTML($this->app, 'photos', $is_owner, $owner['nickname'], Profile::getByUID($owner['uid'])['hide-friends'] ?? false);
+		$o = self::getTabsHTML('photos', $is_owner, $owner['nickname'], Profile::getByUID($owner['uid'])['hide-friends'] ?? false);
 
 		$tpl = Renderer::getMarkupTemplate('photos_recent.tpl');
 		$o .= Renderer::replaceMacros($tpl, [
diff --git a/src/Module/Profile/Profile.php b/src/Module/Profile/Profile.php
index 07db082591..2c680d4467 100644
--- a/src/Module/Profile/Profile.php
+++ b/src/Module/Profile/Profile.php
@@ -76,21 +76,19 @@ class Profile extends BaseProfile
 	{
 		$a = DI::app();
 
-		$profile = ProfileModel::load($a, $this->parameters['nickname']);
+		$profile = ProfileModel::load($a, $this->parameters['nickname'] ?? '');
 		if (!$profile) {
 			throw new HTTPException\NotFoundException(DI::l10n()->t('Profile not found.'));
 		}
 
 		$remote_contact_id = DI::userSession()->getRemoteContactID($profile['uid']);
 
-		if (DI::config()->get('system', 'block_public') && !DI::userSession()->getLocalUserId() && !$remote_contact_id) {
+		if (DI::config()->get('system', 'block_public') && !DI::userSession()->isAuthenticated()) {
 			return Login::form();
 		}
 
-		$is_owner = DI::userSession()->getLocalUserId() == $profile['uid'];
-
-		if (!empty($profile['hidewall']) && !$is_owner && !$remote_contact_id) {
-			throw new HTTPException\ForbiddenException(DI::l10n()->t('Access to this profile has been restricted.'));
+		if (!empty($profile['hidewall']) && !DI::userSession()->isAuthenticated()) {
+			$this->baseUrl->redirect('profile/' . $profile['nickname'] . '/restricted');
 		}
 
 		if (!empty($profile['page-flags']) && $profile['page-flags'] == User::PAGE_FLAGS_COMMUNITY) {
@@ -102,12 +100,7 @@ class Profile extends BaseProfile
 		Nav::setSelected('home');
 
 		$is_owner = DI::userSession()->getLocalUserId() == $profile['uid'];
-		$o = self::getTabsHTML($a, 'profile', $is_owner, $profile['nickname'], $profile['hide-friends']);
-
-		if (!empty($profile['hidewall']) && !$is_owner && !$remote_contact_id) {
-			DI::sysmsg()->addNotice(DI::l10n()->t('Access to this profile has been restricted.'));
-			return '';
-		}
+		$o = self::getTabsHTML('profile', $is_owner, $profile['nickname'], $profile['hide-friends']);
 
 		$view_as_contacts = [];
 		$view_as_contact_id = 0;
@@ -307,8 +300,8 @@ class Profile extends BaseProfile
 		}
 
 		// site block
-		$blocked   = !DI::userSession()->getLocalUserId() && !$remote_contact_id && DI::config()->get('system', 'block_public');
-		$userblock = !DI::userSession()->getLocalUserId() && !$remote_contact_id && $profile['hidewall'];
+		$blocked   = !DI::userSession()->isAuthenticated() && DI::config()->get('system', 'block_public');
+		$userblock = !DI::userSession()->isAuthenticated() && $profile['hidewall'];
 		if (!$blocked && !$userblock) {
 			$keywords = str_replace(['#', ',', ' ', ',,'], ['', ' ', ',', ','], $profile['pub_keywords'] ?? '');
 			if (strlen($keywords)) {
diff --git a/src/Module/Profile/Restricted.php b/src/Module/Profile/Restricted.php
new file mode 100644
index 0000000000..31ce69fbd4
--- /dev/null
+++ b/src/Module/Profile/Restricted.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Module\Profile;
+
+use Friendica\App;
+use Friendica\BaseModule;
+use Friendica\Core\L10n;
+use Friendica\Core\Renderer;
+use Friendica\Model\Profile;
+use Friendica\Module\Response;
+use Friendica\Network\HTTPException;
+use Friendica\Util\Profiler;
+use Psr\Log\LoggerInterface;
+
+class Restricted extends BaseModule
+{
+	/** @var App */
+	private $app;
+
+	public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+	{
+		parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
+
+		$this->app = $app;
+	}
+
+	protected function content(array $request = []): string
+	{
+		$profile = Profile::load($this->app, $this->parameters['nickname'] ?? '', false);
+		if (!$profile) {
+			throw new HTTPException\NotFoundException($this->t('Profile not found.'));
+		}
+
+		if (empty($profile['hidewall'])) {
+			$this->baseUrl->redirect('profile/' . $profile['nickname']);
+		}
+
+		$tpl = Renderer::getMarkupTemplate('exception.tpl');
+		return Renderer::replaceMacros($tpl, [
+			'$title'   => $this->t('Restricted profile'),
+			'$message' => $this->t('This profile has been restricted which prevents access to their public content from anonymous visitors.'),
+		]);
+	}
+}
diff --git a/src/Module/Profile/Schedule.php b/src/Module/Profile/Schedule.php
index 0e1f92018e..10dd5339f8 100644
--- a/src/Module/Profile/Schedule.php
+++ b/src/Module/Profile/Schedule.php
@@ -58,7 +58,7 @@ class Schedule extends BaseProfile
 
 		$a = DI::app();
 
-		$o = self::getTabsHTML($a, 'schedule', true, $a->getLoggedInUserNickname(), false);
+		$o = self::getTabsHTML('schedule', true, $a->getLoggedInUserNickname(), false);
 
 		$schedule = [];
 		$delayed = DBA::select('delayed-post', [], ['uid' => DI::userSession()->getLocalUserId()]);
diff --git a/src/Module/Profile/Status.php b/src/Module/Profile/Status.php
index 6543ea1952..0a4a17e462 100644
--- a/src/Module/Profile/Status.php
+++ b/src/Module/Profile/Status.php
@@ -105,12 +105,11 @@ class Status extends BaseProfile
 		$is_owner = DI::userSession()->getLocalUserId() == $profile['uid'];
 		$last_updated_key = "profile:" . $profile['uid'] . ":" . DI::userSession()->getLocalUserId() . ":" . $remote_contact;
 
-		if (!empty($profile['hidewall']) && !$is_owner && !$remote_contact) {
-			DI::sysmsg()->addNotice(DI::l10n()->t('Access to this profile has been restricted.'));
-			return '';
+		if (!empty($profile['hidewall']) && !DI::userSession()->isAuthenticated()) {
+			$this->baseUrl->redirect('profile/' . $profile['nickname'] . '/restricted');
 		}
 
-		$o .= self::getTabsHTML($a, 'status', $is_owner, $profile['nickname'], $profile['hide-friends']);
+		$o .= self::getTabsHTML('status', $is_owner, $profile['nickname'], $profile['hide-friends']);
 
 		$o .= Widget::commonFriendsVisitor($profile['uid'], $profile['nickname']);
 
diff --git a/src/Module/Settings/Account.php b/src/Module/Settings/Account.php
index 4217b1e88d..8768115ec3 100644
--- a/src/Module/Settings/Account.php
+++ b/src/Module/Settings/Account.php
@@ -586,7 +586,7 @@ class Account extends BaseSettings
 			'$profile_in_dir'     => $profile_in_dir,
 			'$profile_in_net_dir' => ['profile_in_netdirectory', DI::l10n()->t('Allow your profile to be searchable globally?'), $profile['net-publish'], DI::l10n()->t("Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.") . $net_pub_desc],
 			'$hide_friends'       => ['hide-friends', DI::l10n()->t('Hide your contact/friend list from viewers of your profile?'), $profile['hide-friends'], DI::l10n()->t('A list of your contacts is displayed on your profile page. Activate this option to disable the display of your contact list.')],
-			'$hide_wall'          => ['hidewall', DI::l10n()->t('Hide your profile details from anonymous viewers?'), $user['hidewall'], DI::l10n()->t('Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means.')],
+			'$hide_wall'          => ['hidewall', $this->t('Hide your public content from anonymous viewers'), $user['hidewall'], $this->t('Anonymous visitors will only see your basic profile details. Your public posts and replies will still be freely accessible on the remote servers of your followers and through relays.')],
 			'$unlisted'           => ['unlisted', DI::l10n()->t('Make public posts unlisted'), DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'unlisted'), DI::l10n()->t('Your public posts will not appear on the community pages or in search results, nor be sent to relay servers. However they can still appear on public feeds on remote servers.')],
 			'$accessiblephotos'   => ['accessible-photos', DI::l10n()->t('Make all posted pictures accessible'), DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'accessible-photos'), DI::l10n()->t("This option makes every posted picture accessible via the direct link. This is a workaround for the problem that most other networks can't handle permissions on pictures. Non public pictures still won't be visible for the public on your photo albums though.")],
 			'$blockwall'          => ['blockwall', DI::l10n()->t('Allow friends to post to your profile page?'), (intval($user['blockwall']) ? '0' : '1'), DI::l10n()->t('Your contacts may write posts on your profile wall. These posts will be distributed to your contacts')],
diff --git a/src/Module/Update/Profile.php b/src/Module/Update/Profile.php
index be15820e45..c1b7522e5c 100644
--- a/src/Module/Update/Profile.php
+++ b/src/Module/Update/Profile.php
@@ -49,7 +49,7 @@ class Profile extends BaseModule
 		$is_owner = DI::userSession()->getLocalUserId() == $a->getProfileOwner();
 		$last_updated_key = "profile:" . $a->getProfileOwner() . ":" . DI::userSession()->getLocalUserId() . ":" . $remote_contact;
 
-		if (!$is_owner && !$remote_contact) {
+		if (!DI::userSession()->isAuthenticated()) {
 			$user = User::getById($a->getProfileOwner(), ['hidewall']);
 			if ($user['hidewall']) {
 				throw new ForbiddenException(DI::l10n()->t('Access to this profile has been restricted.'));
diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php
index 7c6a68b601..3dac91e849 100644
--- a/src/Protocol/Feed.php
+++ b/src/Protocol/Feed.php
@@ -40,6 +40,7 @@ use Friendica\Model\Item;
 use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Model\User;
+use Friendica\Network\HTTPException;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 use Friendica\Util\ParseUrl;
@@ -915,28 +916,23 @@ class Feed
 	 * Updates the provided last_update parameter if the result comes from the
 	 * cache or it is empty
 	 *
-	 * @param string  $owner_nick  Nickname of the feed owner
+	 * @param array   $owner       owner-view record of the feed owner
 	 * @param string  $last_update Date of the last update
 	 * @param integer $max_items   Number of maximum items to fetch
 	 * @param string  $filter      Feed items filter (activity, posts or comments)
 	 * @param boolean $nocache     Wether to bypass caching
 	 *
 	 * @return string Atom feed
-	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+	 * @throws HTTPException\InternalServerErrorException
 	 * @throws \ImagickException
 	 */
-	public static function atom(string $owner_nick, string $last_update, int $max_items = 300, string $filter = 'activity', bool $nocache = false)
+	public static function atom(array $owner, string $last_update, int $max_items = 300, string $filter = 'activity', bool $nocache = false)
 	{
 		$stamp = microtime(true);
 
-		$owner = User::getOwnerDataByNick($owner_nick);
-		if (!$owner) {
-			return;
-		}
+		$cachekey = 'feed:feed:' . $owner['nickname'] . ':' . $filter . ':' . $last_update;
 
-		$cachekey = 'feed:feed:' . $owner_nick . ':' . $filter . ':' . $last_update;
-
-		// Display events in the users's timezone
+		// Display events in the user's timezone
 		if (strlen($owner['timezone'])) {
 			DI::app()->setTimeZone($owner['timezone']);
 		}
diff --git a/static/routes.config.php b/static/routes.config.php
index 8d1fec6f0e..b4ce8f79ed 100644
--- a/static/routes.config.php
+++ b/static/routes.config.php
@@ -38,6 +38,7 @@ $profileRoutes = [
 	'/photos'                                  => [Module\Profile\Photos::class,       [R::GET         ]],
 	'/profile'                                 => [Module\Profile\Profile::class,      [R::GET]],
 	'/remote_follow'                           => [Module\Profile\RemoteFollow::class, [R::GET, R::POST]],
+	'/restricted'                              => [Module\Profile\Restricted::class,   [R::GET         ]],
 	'/schedule'                                => [Module\Profile\Schedule::class,     [R::GET, R::POST]],
 	'/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class,       [R::GET]],
 	'/unkmail'                                 => [Module\Profile\UnkMail::class,      [R::GET, R::POST]],
@@ -416,13 +417,8 @@ return [
 
 	'/featured/{nickname}'      => [Module\ActivityPub\Featured::class, [R::GET]],
 
-	'/feed'     => [
-		'/{nickname}'          => [Module\Feed::class, [R::GET]],
-		'/{nickname}/posts'    => [Module\Feed::class, [R::GET]],
-		'/{nickname}/comments' => [Module\Feed::class, [R::GET]],
-		'/{nickname}/replies'  => [Module\Feed::class, [R::GET]],
-		'/{nickname}/activity' => [Module\Feed::class, [R::GET]],
-	],
+	'/feed/{nickname}[/{type:posts|comments|replies|activity}]' => [Module\Feed::class, [R::GET]],
+
 	'/feedtest' => [Module\Debug\Feed::class, [R::GET]],
 
 	'/fetch'             => [
diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po
index a51b305db3..c1fb00c8fd 100644
--- a/view/lang/C/messages.po
+++ b/view/lang/C/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 2022.12-dev\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-11-30 04:38+0100\n"
+"POT-Creation-Date: 2022-11-30 18:10-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -23,14 +23,13 @@ msgid "Unable to locate original post."
 msgstr ""
 
 #: mod/item.php:179 mod/item.php:184 mod/item.php:855 mod/message.php:69
-#: mod/message.php:114 mod/notes.php:44 mod/photos.php:159 mod/photos.php:888
-#: src/Module/Attach.php:55 src/Module/BaseApi.php:94
+#: mod/message.php:114 mod/notes.php:44 mod/photos.php:159 mod/photos.php:883
+#: src/Model/Event.php:522 src/Module/Attach.php:55 src/Module/BaseApi.php:94
 #: src/Module/BaseNotifications.php:98 src/Module/BaseSettings.php:52
 #: src/Module/Calendar/Event/API.php:88 src/Module/Calendar/Event/Form.php:84
-#: src/Module/Calendar/Event/Show.php:54 src/Module/Calendar/Export.php:62
-#: src/Module/Calendar/Show.php:64 src/Module/Contact/Advanced.php:60
-#: src/Module/Contact/Follow.php:86 src/Module/Contact/Follow.php:160
-#: src/Module/Contact/MatchInterests.php:86
+#: src/Module/Calendar/Export.php:62 src/Module/Calendar/Show.php:77
+#: src/Module/Contact/Advanced.php:60 src/Module/Contact/Follow.php:86
+#: src/Module/Contact/Follow.php:160 src/Module/Contact/MatchInterests.php:86
 #: src/Module/Contact/Suggestions.php:54 src/Module/Contact/Unfollow.php:66
 #: src/Module/Contact/Unfollow.php:80 src/Module/Contact/Unfollow.php:112
 #: src/Module/Delegation.php:118 src/Module/FollowConfirm.php:38
@@ -50,7 +49,7 @@ msgstr ""
 #: src/Module/Settings/Delegation.php:69 src/Module/Settings/Display.php:41
 #: src/Module/Settings/Display.php:119
 #: src/Module/Settings/Profile/Photo/Crop.php:165
-#: src/Module/Settings/Profile/Photo/Index.php:115
+#: src/Module/Settings/Profile/Photo/Index.php:111
 #: src/Module/Settings/RemoveMe.php:117 src/Module/Settings/UserExport.php:80
 #: src/Module/Settings/UserExport.php:114
 #: src/Module/Settings/UserExport.php:215
@@ -246,7 +245,7 @@ msgstr ""
 msgid "Discard"
 msgstr ""
 
-#: mod/message.php:136 src/Content/Nav.php:282 view/theme/frio/theme.php:249
+#: mod/message.php:136 src/Content/Nav.php:282 view/theme/frio/theme.php:247
 msgid "Messages"
 msgstr ""
 
@@ -292,16 +291,16 @@ msgstr ""
 msgid "Insert web link"
 msgstr ""
 
-#: mod/message.php:203 mod/message.php:360 mod/photos.php:1501
+#: mod/message.php:203 mod/message.php:360 mod/photos.php:1496
 #: src/Content/Conversation.php:371 src/Content/Conversation.php:717
 #: src/Module/Item/Compose.php:204 src/Module/Post/Edit.php:142
 #: src/Module/Profile/UnkMail.php:155 src/Object/Post.php:537
 msgid "Please wait"
 msgstr ""
 
-#: mod/message.php:204 mod/message.php:359 mod/photos.php:918
-#: mod/photos.php:1035 mod/photos.php:1307 mod/photos.php:1348
-#: mod/photos.php:1404 mod/photos.php:1478
+#: mod/message.php:204 mod/message.php:359 mod/photos.php:913
+#: mod/photos.php:1030 mod/photos.php:1302 mod/photos.php:1343
+#: mod/photos.php:1399 mod/photos.php:1473
 #: src/Module/Calendar/Event/Form.php:250 src/Module/Contact/Advanced.php:132
 #: src/Module/Contact/Profile.php:327
 #: src/Module/Debug/ActivityPubConversion.php:140
@@ -311,7 +310,7 @@ msgstr ""
 #: src/Module/Install.php:252 src/Module/Install.php:294
 #: src/Module/Install.php:331 src/Module/Invite.php:178
 #: src/Module/Item/Compose.php:189 src/Module/Moderation/Item/Source.php:79
-#: src/Module/Profile/Profile.php:246 src/Module/Profile/UnkMail.php:156
+#: src/Module/Profile/Profile.php:239 src/Module/Profile/UnkMail.php:156
 #: src/Module/Settings/Profile/Index.php:231 src/Object/Post.php:986
 #: view/theme/duepuntozero/config.php:85 view/theme/frio/config.php:171
 #: view/theme/quattro/config.php:87 view/theme/vier/config.php:135
@@ -370,7 +369,7 @@ msgid_plural "%d messages"
 msgstr[0] ""
 msgstr[1] ""
 
-#: mod/notes.php:51 src/Module/BaseProfile.php:106
+#: mod/notes.php:51 src/Module/BaseProfile.php:108
 msgid "Personal Notes"
 msgstr ""
 
@@ -384,29 +383,30 @@ msgstr ""
 msgid "Save"
 msgstr ""
 
-#: mod/photos.php:68 mod/photos.php:139 mod/photos.php:795
+#: mod/photos.php:68 mod/photos.php:139 mod/photos.php:791
 #: src/Model/Event.php:514 src/Model/Profile.php:234
-#: src/Module/Calendar/Export.php:67 src/Module/Feed.php:72
-#: src/Module/HCard.php:51 src/Module/Profile/Common.php:40
-#: src/Module/Profile/Common.php:51 src/Module/Profile/Contacts.php:39
-#: src/Module/Profile/Contacts.php:49 src/Module/Profile/Media.php:38
-#: src/Module/Profile/Photos.php:77 src/Module/Profile/RemoteFollow.php:71
-#: src/Module/Profile/Status.php:58 src/Module/Register.php:267
+#: src/Module/Calendar/Export.php:67 src/Module/DFRN/Poll.php:43
+#: src/Module/Feed.php:65 src/Module/HCard.php:51
+#: src/Module/Profile/Common.php:40 src/Module/Profile/Common.php:51
+#: src/Module/Profile/Contacts.php:39 src/Module/Profile/Contacts.php:49
+#: src/Module/Profile/Media.php:38 src/Module/Profile/Photos.php:77
+#: src/Module/Profile/RemoteFollow.php:71 src/Module/Profile/Status.php:58
+#: src/Module/Register.php:267
 msgid "User not found."
 msgstr ""
 
-#: mod/photos.php:107 src/Module/BaseProfile.php:67
+#: mod/photos.php:107 src/Module/BaseProfile.php:68
 #: src/Module/Profile/Photos.php:169
 msgid "Photo Albums"
 msgstr ""
 
 #: mod/photos.php:108 src/Module/Profile/Photos.php:170
-#: src/Module/Profile/Photos.php:187
+#: src/Module/Profile/Photos.php:185
 msgid "Recent Photos"
 msgstr ""
 
-#: mod/photos.php:110 mod/photos.php:1083 src/Module/Profile/Photos.php:172
-#: src/Module/Profile/Photos.php:189
+#: mod/photos.php:110 mod/photos.php:1078 src/Module/Profile/Photos.php:172
+#: src/Module/Profile/Photos.php:187
 msgid "Upload New Photos"
 msgstr ""
 
@@ -444,9 +444,9 @@ msgstr ""
 msgid "%1$s was tagged in %2$s by %3$s"
 msgstr ""
 
-#: mod/photos.php:630 mod/photos.php:633 mod/photos.php:664
-#: src/Module/Media/Photo/Upload.php:193
-#: src/Module/Settings/Profile/Photo/Index.php:63
+#: mod/photos.php:630 mod/photos.php:633 mod/photos.php:660
+#: src/Module/Media/Photo/Upload.php:188
+#: src/Module/Settings/Profile/Photo/Index.php:59
 #, php-format
 msgid "Image exceeds size limit of %s"
 msgstr ""
@@ -465,70 +465,66 @@ msgid ""
 "administrator"
 msgstr ""
 
-#: mod/photos.php:672
+#: mod/photos.php:668
 msgid "Image file is empty."
 msgstr ""
 
-#: mod/photos.php:687 src/Module/Media/Photo/Upload.php:155
-#: src/Module/Media/Photo/Upload.php:156
-#: src/Module/Settings/Profile/Photo/Index.php:72
+#: mod/photos.php:683 src/Module/Media/Photo/Upload.php:154
+#: src/Module/Media/Photo/Upload.php:155
+#: src/Module/Settings/Profile/Photo/Index.php:68
 msgid "Unable to process image."
 msgstr ""
 
-#: mod/photos.php:713 src/Module/Media/Photo/Upload.php:211
-#: src/Module/Settings/Profile/Photo/Index.php:99
+#: mod/photos.php:709 src/Module/Media/Photo/Upload.php:206
+#: src/Module/Settings/Profile/Photo/Index.php:95
 msgid "Image upload failed."
 msgstr ""
 
-#: mod/photos.php:799 src/Module/Conversation/Community.php:187
+#: mod/photos.php:795 src/Module/Conversation/Community.php:187
 #: src/Module/Directory.php:48 src/Module/Profile/Photos.php:72
 #: src/Module/Search/Index.php:64
 msgid "Public access denied."
 msgstr ""
 
-#: mod/photos.php:804
+#: mod/photos.php:800
 msgid "No photos selected"
 msgstr ""
 
-#: mod/photos.php:873 src/Module/Profile/Photos.php:92
-msgid "Access to this item is restricted."
-msgstr ""
-
-#: mod/photos.php:934
+#: mod/photos.php:929
 #, php-format
 msgid "The maximum accepted image size is %s"
 msgstr ""
 
-#: mod/photos.php:941
+#: mod/photos.php:936
 msgid "Upload Photos"
 msgstr ""
 
-#: mod/photos.php:945 mod/photos.php:1031
+#: mod/photos.php:940 mod/photos.php:1026
 msgid "New album name: "
 msgstr ""
 
-#: mod/photos.php:946
+#: mod/photos.php:941
 msgid "or select existing album:"
 msgstr ""
 
-#: mod/photos.php:947
+#: mod/photos.php:942
 msgid "Do not show a status post for this upload"
 msgstr ""
 
-#: mod/photos.php:949 mod/photos.php:1303 src/Content/Conversation.php:373
+#: mod/photos.php:944 mod/photos.php:1298 src/Content/Conversation.php:373
 #: src/Module/Calendar/Event/Form.php:253 src/Module/Post/Edit.php:179
 msgid "Permissions"
 msgstr ""
 
-#: mod/photos.php:1012
+#: mod/photos.php:1007
 msgid "Do you really want to delete this photo album and all its photos?"
 msgstr ""
 
-#: mod/photos.php:1013 mod/photos.php:1036
+#: mod/photos.php:1008 mod/photos.php:1031
 msgid "Delete Album"
 msgstr ""
 
-#: mod/photos.php:1014 mod/photos.php:1115 src/Content/Conversation.php:389
+#: mod/photos.php:1009 mod/photos.php:1110 src/Content/Conversation.php:389
 #: src/Module/Contact/Follow.php:173 src/Module/Contact/Revoke.php:109
 #: src/Module/Contact/Unfollow.php:126
 #: src/Module/Media/Attachment/Browser.php:77
@@ -538,130 +534,130 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
-#: mod/photos.php:1040
+#: mod/photos.php:1035
 msgid "Edit Album"
 msgstr ""
 
-#: mod/photos.php:1041
+#: mod/photos.php:1036
 msgid "Drop Album"
 msgstr ""
 
-#: mod/photos.php:1045
+#: mod/photos.php:1040
 msgid "Show Newest First"
 msgstr ""
 
-#: mod/photos.php:1047
+#: mod/photos.php:1042
 msgid "Show Oldest First"
 msgstr ""
 
-#: mod/photos.php:1068 src/Module/Profile/Photos.php:140
+#: mod/photos.php:1063 src/Module/Profile/Photos.php:140
 msgid "View Photo"
 msgstr ""
 
-#: mod/photos.php:1101
+#: mod/photos.php:1096
 msgid "Permission denied. Access to this item may be restricted."
 msgstr ""
 
-#: mod/photos.php:1103
+#: mod/photos.php:1098
 msgid "Photo not available"
 msgstr ""
 
-#: mod/photos.php:1113
+#: mod/photos.php:1108
 msgid "Do you really want to delete this photo?"
 msgstr ""
 
-#: mod/photos.php:1114 mod/photos.php:1308
+#: mod/photos.php:1109 mod/photos.php:1303
 msgid "Delete Photo"
 msgstr ""
 
-#: mod/photos.php:1206
+#: mod/photos.php:1201
 msgid "View photo"
 msgstr ""
 
-#: mod/photos.php:1208
+#: mod/photos.php:1203
 msgid "Edit photo"
 msgstr ""
 
-#: mod/photos.php:1209
+#: mod/photos.php:1204
 msgid "Delete photo"
 msgstr ""
 
-#: mod/photos.php:1210
+#: mod/photos.php:1205
 msgid "Use as profile photo"
 msgstr ""
 
-#: mod/photos.php:1217
+#: mod/photos.php:1212
 msgid "Private Photo"
 msgstr ""
 
-#: mod/photos.php:1223
+#: mod/photos.php:1218
 msgid "View Full Size"
 msgstr ""
 
-#: mod/photos.php:1276
+#: mod/photos.php:1271
 msgid "Tags: "
 msgstr ""
 
-#: mod/photos.php:1279
+#: mod/photos.php:1274
 msgid "[Select tags to remove]"
 msgstr ""
 
-#: mod/photos.php:1294
+#: mod/photos.php:1289
 msgid "New album name"
 msgstr ""
 
-#: mod/photos.php:1295
+#: mod/photos.php:1290
 msgid "Caption"
 msgstr ""
 
-#: mod/photos.php:1296
+#: mod/photos.php:1291
 msgid "Add a Tag"
 msgstr ""
 
-#: mod/photos.php:1296
+#: mod/photos.php:1291
 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
 msgstr ""
 
-#: mod/photos.php:1297
+#: mod/photos.php:1292
 msgid "Do not rotate"
 msgstr ""
 
-#: mod/photos.php:1298
+#: mod/photos.php:1293
 msgid "Rotate CW (right)"
 msgstr ""
 
-#: mod/photos.php:1299
+#: mod/photos.php:1294
 msgid "Rotate CCW (left)"
 msgstr ""
 
-#: mod/photos.php:1345 mod/photos.php:1401 mod/photos.php:1475
+#: mod/photos.php:1340 mod/photos.php:1396 mod/photos.php:1470
 #: src/Module/Contact.php:547 src/Module/Item/Compose.php:188
 #: src/Object/Post.php:983
 msgid "This is you"
 msgstr ""
 
-#: mod/photos.php:1347 mod/photos.php:1403 mod/photos.php:1477
+#: mod/photos.php:1342 mod/photos.php:1398 mod/photos.php:1472
 #: src/Object/Post.php:531 src/Object/Post.php:985
 msgid "Comment"
 msgstr ""
 
-#: mod/photos.php:1349 mod/photos.php:1405 mod/photos.php:1479
+#: mod/photos.php:1344 mod/photos.php:1400 mod/photos.php:1474
 #: src/Content/Conversation.php:386 src/Module/Calendar/Event/Form.php:248
 #: src/Module/Item/Compose.php:199 src/Module/Post/Edit.php:162
 #: src/Object/Post.php:997
 msgid "Preview"
 msgstr ""
 
-#: mod/photos.php:1350 src/Content/Conversation.php:341
+#: mod/photos.php:1345 src/Content/Conversation.php:341
 #: src/Module/Post/Edit.php:127 src/Object/Post.php:987
 msgid "Loading..."
 msgstr ""
 
-#: mod/photos.php:1436 src/Content/Conversation.php:633 src/Object/Post.php:255
+#: mod/photos.php:1431 src/Content/Conversation.php:633 src/Object/Post.php:255
 msgid "Select"
 msgstr ""
 
-#: mod/photos.php:1437 src/Content/Conversation.php:634
+#: mod/photos.php:1432 src/Content/Conversation.php:634
 #: src/Module/Moderation/Users/Active.php:136
 #: src/Module/Moderation/Users/Blocked.php:136
 #: src/Module/Moderation/Users/Index.php:151
@@ -669,31 +665,31 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: mod/photos.php:1498 src/Object/Post.php:378
+#: mod/photos.php:1493 src/Object/Post.php:378
 msgid "Like"
 msgstr ""
 
-#: mod/photos.php:1499 src/Object/Post.php:378
+#: mod/photos.php:1494 src/Object/Post.php:378
 msgid "I like this (toggle)"
 msgstr ""
 
-#: mod/photos.php:1500 src/Object/Post.php:379
+#: mod/photos.php:1495 src/Object/Post.php:379
 msgid "Dislike"
 msgstr ""
 
-#: mod/photos.php:1502 src/Object/Post.php:379
+#: mod/photos.php:1497 src/Object/Post.php:379
 msgid "I don't like this (toggle)"
 msgstr ""
 
-#: mod/photos.php:1524
+#: mod/photos.php:1519
 msgid "Map"
 msgstr ""
 
-#: src/App.php:493
+#: src/App.php:492
 msgid "No system theme config value set."
 msgstr ""
 
-#: src/App.php:614
+#: src/App.php:613
 msgid "Apologies but the website is unavailable at the moment."
 msgstr ""
 
@@ -1524,6 +1520,20 @@ msgstr ""
 msgid "Display membership date in profile"
 msgstr ""
 
+#: src/Content/Feature.php:126
+msgid "Advanced Calendar Settings"
+msgstr ""
+
+#: src/Content/Feature.php:127
+msgid "Allow anonymous access to your calendar"
+msgstr ""
+
+#: src/Content/Feature.php:127
+msgid ""
+"Allows anonymous visitors to consult your calendar and your public events. "
+"Contact birthday events are private to you."
+msgstr ""
+
 #: src/Content/ForumManager.php:151 src/Content/Nav.php:242
 #: src/Content/Text/HTML.php:903 src/Content/Widget.php:524
 msgid "Forums"
@@ -1542,7 +1552,7 @@ msgstr ""
 msgid "show more"
 msgstr ""
 
-#: src/Content/Item.php:294 src/Model/Item.php:2914
+#: src/Content/Item.php:294 src/Model/Item.php:2919
 msgid "event"
 msgstr ""
 
@@ -1551,7 +1561,7 @@ msgstr ""
 msgid "status"
 msgstr ""
 
-#: src/Content/Item.php:303 src/Model/Item.php:2916
+#: src/Content/Item.php:303 src/Model/Item.php:2921
 #: src/Module/Post/Tag/Add.php:123
 msgid "photo"
 msgstr ""
@@ -1561,7 +1571,7 @@ msgstr ""
 msgid "%1$s tagged %2$s's %3$s with %4$s"
 msgstr ""
 
-#: src/Content/Item.php:386 view/theme/frio/theme.php:270
+#: src/Content/Item.php:386 view/theme/frio/theme.php:268
 msgid "Follow Thread"
 msgstr ""
 
@@ -1615,7 +1625,7 @@ msgstr ""
 
 #: src/Content/Item.php:403 src/Content/Widget.php:80
 #: src/Model/Contact.php:1192 src/Model/Contact.php:1203
-#: src/Module/Contact/Follow.php:167 view/theme/vier/theme.php:198
+#: src/Module/Contact/Follow.php:167 view/theme/vier/theme.php:196
 msgid "Connect/Follow"
 msgstr ""
 
@@ -1652,56 +1662,56 @@ msgstr ""
 msgid "Sign in"
 msgstr ""
 
-#: src/Content/Nav.php:193 src/Module/BaseProfile.php:56
+#: src/Content/Nav.php:193 src/Module/BaseProfile.php:57
 #: src/Module/Contact.php:436 src/Module/Contact/Profile.php:380
-#: src/Module/Settings/TwoFactor/Index.php:119 view/theme/frio/theme.php:237
+#: src/Module/Settings/TwoFactor/Index.php:119 view/theme/frio/theme.php:235
 msgid "Status"
 msgstr ""
 
 #: src/Content/Nav.php:193 src/Content/Nav.php:272
-#: view/theme/frio/theme.php:237
+#: view/theme/frio/theme.php:235
 msgid "Your posts and conversations"
 msgstr ""
 
-#: src/Content/Nav.php:194 src/Module/BaseProfile.php:48
+#: src/Content/Nav.php:194 src/Module/BaseProfile.php:49
 #: src/Module/BaseSettings.php:100 src/Module/Contact.php:460
-#: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:240
-#: src/Module/Welcome.php:57 view/theme/frio/theme.php:238
+#: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:233
+#: src/Module/Welcome.php:57 view/theme/frio/theme.php:236
 msgid "Profile"
 msgstr ""
 
-#: src/Content/Nav.php:194 view/theme/frio/theme.php:238
+#: src/Content/Nav.php:194 view/theme/frio/theme.php:236
 msgid "Your profile page"
 msgstr ""
 
-#: src/Content/Nav.php:195 src/Module/BaseProfile.php:64
-#: src/Module/Media/Photo/Browser.php:74 view/theme/frio/theme.php:242
+#: src/Content/Nav.php:195 src/Module/BaseProfile.php:65
+#: src/Module/Media/Photo/Browser.php:74 view/theme/frio/theme.php:240
 msgid "Photos"
 msgstr ""
 
-#: src/Content/Nav.php:195 view/theme/frio/theme.php:242
+#: src/Content/Nav.php:195 view/theme/frio/theme.php:240
 msgid "Your photos"
 msgstr ""
 
-#: src/Content/Nav.php:196 src/Module/BaseProfile.php:72
-#: src/Module/BaseProfile.php:75 src/Module/Contact.php:452
-#: view/theme/frio/theme.php:243
+#: src/Content/Nav.php:196 src/Module/BaseProfile.php:73
+#: src/Module/BaseProfile.php:76 src/Module/Contact.php:452
+#: view/theme/frio/theme.php:241
 msgid "Media"
 msgstr ""
 
-#: src/Content/Nav.php:196 view/theme/frio/theme.php:243
+#: src/Content/Nav.php:196 view/theme/frio/theme.php:241
 msgid "Your postings with media"
 msgstr ""
 
 #: src/Content/Nav.php:197 src/Content/Nav.php:257
-#: src/Module/BaseProfile.php:84 src/Module/BaseProfile.php:87
-#: src/Module/BaseProfile.php:95 src/Module/BaseProfile.php:98
-#: src/Module/Settings/Display.php:205 view/theme/frio/theme.php:244
-#: view/theme/frio/theme.php:248
+#: src/Module/BaseProfile.php:85 src/Module/BaseProfile.php:88
+#: src/Module/BaseProfile.php:96 src/Module/BaseProfile.php:99
+#: src/Module/Settings/Display.php:205 view/theme/frio/theme.php:242
+#: view/theme/frio/theme.php:246
 msgid "Calendar"
 msgstr ""
 
-#: src/Content/Nav.php:197 view/theme/frio/theme.php:244
+#: src/Content/Nav.php:197 view/theme/frio/theme.php:242
 msgid "Your calendar"
 msgstr ""
 
@@ -1734,7 +1744,7 @@ msgstr ""
 #: src/Module/Settings/TwoFactor/AppSpecific.php:129
 #: src/Module/Settings/TwoFactor/Index.php:118
 #: src/Module/Settings/TwoFactor/Recovery.php:107
-#: src/Module/Settings/TwoFactor/Verify.php:146 view/theme/vier/theme.php:243
+#: src/Module/Settings/TwoFactor/Verify.php:146 view/theme/vier/theme.php:241
 msgid "Help"
 msgstr ""
 
@@ -1769,9 +1779,9 @@ msgid "Tags"
 msgstr ""
 
 #: src/Content/Nav.php:238 src/Content/Nav.php:293
-#: src/Content/Text/HTML.php:899 src/Module/BaseProfile.php:125
-#: src/Module/BaseProfile.php:128 src/Module/Contact.php:373
-#: src/Module/Contact.php:467 view/theme/frio/theme.php:251
+#: src/Content/Text/HTML.php:899 src/Module/BaseProfile.php:127
+#: src/Module/BaseProfile.php:130 src/Module/Contact.php:373
+#: src/Module/Contact.php:467 view/theme/frio/theme.php:249
 msgid "Contacts"
 msgstr ""
 
@@ -1810,11 +1820,11 @@ msgstr ""
 msgid "Terms of Service of this Friendica instance"
 msgstr ""
 
-#: src/Content/Nav.php:270 view/theme/frio/theme.php:247
+#: src/Content/Nav.php:270 view/theme/frio/theme.php:245
 msgid "Network"
 msgstr ""
 
-#: src/Content/Nav.php:270 view/theme/frio/theme.php:247
+#: src/Content/Nav.php:270 view/theme/frio/theme.php:245
 msgid "Conversations from your friends"
 msgstr ""
 
@@ -1843,7 +1853,7 @@ msgstr ""
 msgid "Mark all system notifications as seen"
 msgstr ""
 
-#: src/Content/Nav.php:282 view/theme/frio/theme.php:249
+#: src/Content/Nav.php:282 view/theme/frio/theme.php:247
 msgid "Private mail"
 msgstr ""
 
@@ -1865,15 +1875,15 @@ msgstr ""
 
 #: src/Content/Nav.php:291 src/Module/Admin/Addons/Details.php:114
 #: src/Module/Admin/Themes/Details.php:93 src/Module/BaseSettings.php:170
-#: src/Module/Welcome.php:52 view/theme/frio/theme.php:250
+#: src/Module/Welcome.php:52 view/theme/frio/theme.php:248
 msgid "Settings"
 msgstr ""
 
-#: src/Content/Nav.php:291 view/theme/frio/theme.php:250
+#: src/Content/Nav.php:291 view/theme/frio/theme.php:248
 msgid "Account settings"
 msgstr ""
 
-#: src/Content/Nav.php:293 view/theme/frio/theme.php:251
+#: src/Content/Nav.php:293 view/theme/frio/theme.php:249
 msgid "Manage/edit friends and contacts"
 msgstr ""
 
@@ -1946,8 +1956,8 @@ msgid ""
 "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1245 src/Model/Item.php:3536
-#: src/Model/Item.php:3542 src/Model/Item.php:3543
+#: src/Content/Text/BBCode.php:1245 src/Model/Item.php:3541
+#: src/Model/Item.php:3547 src/Model/Item.php:3548
 msgid "Link to source"
 msgstr ""
 
@@ -2007,46 +2017,46 @@ msgid_plural "%d invitations available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Content/Widget.php:78 view/theme/vier/theme.php:196
+#: src/Content/Widget.php:78 view/theme/vier/theme.php:194
 msgid "Find People"
 msgstr ""
 
-#: src/Content/Widget.php:79 view/theme/vier/theme.php:197
+#: src/Content/Widget.php:79 view/theme/vier/theme.php:195
 msgid "Enter name or interest"
 msgstr ""
 
-#: src/Content/Widget.php:81 view/theme/vier/theme.php:199
+#: src/Content/Widget.php:81 view/theme/vier/theme.php:197
 msgid "Examples: Robert Morgenstein, Fishing"
 msgstr ""
 
 #: src/Content/Widget.php:82 src/Module/Contact.php:394
-#: src/Module/Directory.php:96 view/theme/vier/theme.php:200
+#: src/Module/Directory.php:96 view/theme/vier/theme.php:198
 msgid "Find"
 msgstr ""
 
 #: src/Content/Widget.php:83 src/Module/Contact/Suggestions.php:73
-#: view/theme/vier/theme.php:201
+#: view/theme/vier/theme.php:199
 msgid "Friend Suggestions"
 msgstr ""
 
-#: src/Content/Widget.php:84 view/theme/vier/theme.php:202
+#: src/Content/Widget.php:84 view/theme/vier/theme.php:200
 msgid "Similar Interests"
 msgstr ""
 
-#: src/Content/Widget.php:85 view/theme/vier/theme.php:203
+#: src/Content/Widget.php:85 view/theme/vier/theme.php:201
 msgid "Random Profile"
 msgstr ""
 
-#: src/Content/Widget.php:86 view/theme/vier/theme.php:204
+#: src/Content/Widget.php:86 view/theme/vier/theme.php:202
 msgid "Invite Friends"
 msgstr ""
 
 #: src/Content/Widget.php:87 src/Module/Directory.php:88
-#: view/theme/vier/theme.php:205
+#: view/theme/vier/theme.php:203
 msgid "Global Directory"
 msgstr ""
 
-#: src/Content/Widget.php:89 view/theme/vier/theme.php:207
+#: src/Content/Widget.php:89 view/theme/vier/theme.php:205
 msgid "Local Directory"
 msgstr ""
 
@@ -2166,21 +2176,21 @@ msgid "More Trending Tags"
 msgstr ""
 
 #: src/Content/Widget/VCard.php:102 src/Model/Profile.php:378
-#: src/Module/Contact/Profile.php:371 src/Module/Profile/Profile.php:175
+#: src/Module/Contact/Profile.php:371 src/Module/Profile/Profile.php:168
 msgid "XMPP:"
 msgstr ""
 
 #: src/Content/Widget/VCard.php:103 src/Model/Profile.php:379
-#: src/Module/Contact/Profile.php:373 src/Module/Profile/Profile.php:179
+#: src/Module/Contact/Profile.php:373 src/Module/Profile/Profile.php:172
 msgid "Matrix:"
 msgstr ""
 
 #: src/Content/Widget/VCard.php:104 src/Model/Event.php:82
-#: src/Model/Event.php:109 src/Model/Event.php:471 src/Model/Event.php:992
+#: src/Model/Event.php:109 src/Model/Event.php:471 src/Model/Event.php:961
 #: src/Model/Profile.php:373 src/Module/Calendar/Event/Form.php:239
 #: src/Module/Contact/Profile.php:369 src/Module/Directory.php:147
 #: src/Module/Notifications/Introductions.php:187
-#: src/Module/Profile/Profile.php:193
+#: src/Module/Profile/Profile.php:186
 msgid "Location:"
 msgstr ""
 
@@ -2195,7 +2205,7 @@ msgstr ""
 msgid "Unfollow"
 msgstr ""
 
-#: src/Core/ACL.php:165 src/Module/Profile/Profile.php:241
+#: src/Core/ACL.php:165 src/Module/Profile/Profile.php:234
 msgid "Yourself"
 msgstr ""
 
@@ -2966,12 +2976,12 @@ msgid "l F d, Y \\@ g:i A \\G\\M\\TP (e)"
 msgstr ""
 
 #: src/Model/Event.php:75 src/Model/Event.php:92 src/Model/Event.php:469
-#: src/Model/Event.php:974
+#: src/Model/Event.php:943
 msgid "Starts:"
 msgstr ""
 
 #: src/Model/Event.php:78 src/Model/Event.php:98 src/Model/Event.php:470
-#: src/Model/Event.php:978
+#: src/Model/Event.php:947
 msgid "Finishes:"
 msgstr ""
 
@@ -2983,21 +2993,21 @@ msgstr ""
 msgid "Sept"
 msgstr ""
 
-#: src/Model/Event.php:462 src/Module/Calendar/Show.php:125
+#: src/Model/Event.php:462 src/Module/Calendar/Show.php:122
 msgid "today"
 msgstr ""
 
-#: src/Model/Event.php:463 src/Module/Calendar/Show.php:126
+#: src/Model/Event.php:463 src/Module/Calendar/Show.php:123
 #: src/Util/Temporal.php:341
 msgid "month"
 msgstr ""
 
-#: src/Model/Event.php:464 src/Module/Calendar/Show.php:127
+#: src/Model/Event.php:464 src/Module/Calendar/Show.php:124
 #: src/Util/Temporal.php:342
 msgid "week"
 msgstr ""
 
-#: src/Model/Event.php:465 src/Module/Calendar/Show.php:128
+#: src/Model/Event.php:465 src/Module/Calendar/Show.php:125
 #: src/Util/Temporal.php:343
 msgid "day"
 msgstr ""
@@ -3006,58 +3016,57 @@ msgstr ""
 msgid "No events to display"
 msgstr ""
 
-#: src/Model/Event.php:525 src/Module/Item/Display.php:224
-#: src/Module/Profile/Profile.php:93 src/Module/Profile/Profile.php:108
-#: src/Module/Profile/Status.php:109 src/Module/Update/Profile.php:55
+#: src/Model/Event.php:518 src/Module/DFRN/Poll.php:47 src/Module/Feed.php:69
+#: src/Module/Update/Profile.php:55
 msgid "Access to this profile has been restricted."
 msgstr ""
 
-#: src/Model/Event.php:567 src/Module/Calendar/Event/Show.php:60
+#: src/Model/Event.php:559 src/Module/Calendar/Event/Show.php:67
 msgid "Event not found."
 msgstr ""
 
-#: src/Model/Event.php:662
+#: src/Model/Event.php:637
 msgid "l, F j"
 msgstr ""
 
-#: src/Model/Event.php:689
+#: src/Model/Event.php:664
 msgid "Edit event"
 msgstr ""
 
-#: src/Model/Event.php:690
+#: src/Model/Event.php:665
 msgid "Duplicate event"
 msgstr ""
 
-#: src/Model/Event.php:691
+#: src/Model/Event.php:666
 msgid "Delete event"
 msgstr ""
 
-#: src/Model/Event.php:930 src/Module/Debug/Localtime.php:38
+#: src/Model/Event.php:899 src/Module/Debug/Localtime.php:38
 msgid "l F d, Y \\@ g:i A"
 msgstr ""
 
-#: src/Model/Event.php:931
+#: src/Model/Event.php:900
 msgid "D g:i A"
 msgstr ""
 
-#: src/Model/Event.php:932
+#: src/Model/Event.php:901
 msgid "g:i A"
 msgstr ""
 
-#: src/Model/Event.php:993 src/Model/Event.php:995
+#: src/Model/Event.php:962 src/Model/Event.php:964
 msgid "Show map"
 msgstr ""
 
-#: src/Model/Event.php:994
+#: src/Model/Event.php:963
 msgid "Hide map"
 msgstr ""
 
-#: src/Model/Event.php:1087
+#: src/Model/Event.php:1056
 #, php-format
 msgid "%s's birthday"
 msgstr ""
 
-#: src/Model/Event.php:1088
+#: src/Model/Event.php:1057
 #, php-format
 msgid "Happy Birthday %s"
 msgstr ""
@@ -3111,61 +3120,61 @@ msgstr ""
 msgid "Detected languages in this post:\\n%s"
 msgstr ""
 
-#: src/Model/Item.php:2918
+#: src/Model/Item.php:2923
 msgid "activity"
 msgstr ""
 
-#: src/Model/Item.php:2920
+#: src/Model/Item.php:2925
 msgid "comment"
 msgstr ""
 
-#: src/Model/Item.php:2923
+#: src/Model/Item.php:2928
 msgid "post"
 msgstr ""
 
-#: src/Model/Item.php:3064
+#: src/Model/Item.php:3069
 #, php-format
 msgid "Content warning: %s"
 msgstr ""
 
-#: src/Model/Item.php:3448
+#: src/Model/Item.php:3453
 msgid "bytes"
 msgstr ""
 
-#: src/Model/Item.php:3479
+#: src/Model/Item.php:3484
 #, php-format
 msgid "%2$s (%3$d%%, %1$d vote)"
 msgid_plural "%2$s (%3$d%%, %1$d votes)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3481
+#: src/Model/Item.php:3486
 #, php-format
 msgid "%2$s (%1$d vote)"
 msgid_plural "%2$s (%1$d votes)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3486
+#: src/Model/Item.php:3491
 #, php-format
 msgid "%d voter. Poll end: %s"
 msgid_plural "%d voters. Poll end: %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3488
+#: src/Model/Item.php:3493
 #, php-format
 msgid "%d voter."
 msgid_plural "%d voters."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Model/Item.php:3490
+#: src/Model/Item.php:3495
 #, php-format
 msgid "Poll end: %s"
 msgstr ""
 
-#: src/Model/Item.php:3524 src/Model/Item.php:3525
+#: src/Model/Item.php:3529 src/Model/Item.php:3530
 msgid "View on separate page"
 msgstr ""
 
@@ -3173,12 +3182,12 @@ msgstr ""
 msgid "[no subject]"
 msgstr ""
 
-#: src/Model/Photo.php:1153 src/Module/Media/Photo/Upload.php:203
+#: src/Model/Photo.php:1145 src/Module/Media/Photo/Upload.php:198
 msgid "Wall Photos"
 msgstr ""
 
-#: src/Model/Profile.php:361 src/Module/Profile/Profile.php:255
-#: src/Module/Profile/Profile.php:257
+#: src/Model/Profile.php:361 src/Module/Profile/Profile.php:248
+#: src/Module/Profile/Profile.php:250
 msgid "Edit profile"
 msgstr ""
 
@@ -3187,7 +3196,7 @@ msgid "Change profile photo"
 msgstr ""
 
 #: src/Model/Profile.php:376 src/Module/Directory.php:152
-#: src/Module/Profile/Profile.php:183
+#: src/Module/Profile/Profile.php:176
 msgid "Homepage:"
 msgstr ""
 
@@ -4109,7 +4118,7 @@ msgid "Policies"
 msgstr ""
 
 #: src/Module/Admin/Site.php:445 src/Module/Calendar/Event/Form.php:252
-#: src/Module/Contact.php:477 src/Module/Profile/Profile.php:248
+#: src/Module/Contact.php:477 src/Module/Profile/Profile.php:241
 msgid "Advanced"
 msgstr ""
 
@@ -5400,28 +5409,28 @@ msgstr ""
 msgid "Item Source"
 msgstr ""
 
-#: src/Module/BaseProfile.php:51 src/Module/Contact.php:463
+#: src/Module/BaseProfile.php:52 src/Module/Contact.php:463
 msgid "Profile Details"
 msgstr ""
 
-#: src/Module/BaseProfile.php:59 src/Module/Contact.php:447
+#: src/Module/BaseProfile.php:60 src/Module/Contact.php:447
 #: src/Module/Contact/Follow.php:192 src/Module/Contact/Unfollow.php:138
 msgid "Status Messages and Posts"
 msgstr ""
 
-#: src/Module/BaseProfile.php:109
+#: src/Module/BaseProfile.php:111
 msgid "Only You Can See This"
 msgstr ""
 
-#: src/Module/BaseProfile.php:114 src/Module/Profile/Schedule.php:82
+#: src/Module/BaseProfile.php:116 src/Module/Profile/Schedule.php:82
 msgid "Scheduled Posts"
 msgstr ""
 
-#: src/Module/BaseProfile.php:117
+#: src/Module/BaseProfile.php:119
 msgid "Posts that are scheduled for publishing"
 msgstr ""
 
-#: src/Module/BaseProfile.php:136 src/Module/BaseProfile.php:139
+#: src/Module/BaseProfile.php:138 src/Module/BaseProfile.php:141
 msgid "Tips for New Members"
 msgstr ""
 
@@ -5542,7 +5551,7 @@ msgstr ""
 msgid "Event Finishes:"
 msgstr ""
 
-#: src/Module/Calendar/Event/Form.php:237 src/Module/Profile/Profile.php:171
+#: src/Module/Calendar/Event/Form.php:237 src/Module/Profile/Profile.php:164
 #: src/Module/Settings/Profile/Index.php:247
 msgid "Description:"
 msgstr ""
@@ -5557,7 +5566,7 @@ msgstr ""
 msgid "Share this event"
 msgstr ""
 
-#: src/Module/Calendar/Event/Form.php:251 src/Module/Profile/Profile.php:247
+#: src/Module/Calendar/Event/Form.php:251 src/Module/Profile/Profile.php:240
 msgid "Basic"
 msgstr ""
 
@@ -5573,19 +5582,19 @@ msgstr ""
 msgid "calendar"
 msgstr ""
 
-#: src/Module/Calendar/Show.php:121
+#: src/Module/Calendar/Show.php:118
 msgid "Events"
 msgstr ""
 
-#: src/Module/Calendar/Show.php:122
+#: src/Module/Calendar/Show.php:119
 msgid "View"
 msgstr ""
 
-#: src/Module/Calendar/Show.php:123
+#: src/Module/Calendar/Show.php:120
 msgid "Create New Event"
 msgstr ""
 
-#: src/Module/Calendar/Show.php:129
+#: src/Module/Calendar/Show.php:126
 msgid "list"
 msgstr ""
 
@@ -5880,7 +5889,7 @@ msgstr ""
 
 #: src/Module/Contact/Follow.php:171 src/Module/Contact/Profile.php:377
 #: src/Module/Notifications/Introductions.php:191
-#: src/Module/Profile/Profile.php:206
+#: src/Module/Profile/Profile.php:199
 msgid "Tags:"
 msgstr ""
 
@@ -5900,8 +5909,8 @@ msgstr ""
 #: src/Module/Contact/MatchInterests.php:94
 #: src/Module/Media/Attachment/Upload.php:79
 #: src/Module/Media/Attachment/Upload.php:84
-#: src/Module/Media/Photo/Upload.php:84 src/Module/Media/Photo/Upload.php:89
-#: src/Module/Media/Photo/Upload.php:138
+#: src/Module/Media/Photo/Upload.php:83 src/Module/Media/Photo/Upload.php:88
+#: src/Module/Media/Photo/Upload.php:137
 msgid "Invalid request."
 msgstr ""
 
@@ -7096,7 +7105,7 @@ msgstr ""
 msgid "The requested item doesn't exist or has been deleted."
 msgstr ""
 
-#: src/Module/Item/Display.php:253
+#: src/Module/Item/Display.php:249
 msgid ""
 "Unfortunately, the requested conversation isn't available to you.</p>\n"
 "<p>Possible reasons include:</p>\n"
@@ -7144,7 +7153,7 @@ msgstr ""
 
 #: src/Module/Media/Attachment/Browser.php:79
 #: src/Module/Media/Photo/Browser.php:90
-#: src/Module/Settings/Profile/Photo/Index.php:132
+#: src/Module/Settings/Profile/Photo/Index.php:128
 msgid "Upload"
 msgstr ""
 
@@ -8178,43 +8187,43 @@ msgstr ""
 msgid "View Album"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:81
+#: src/Module/Profile/Profile.php:81 src/Module/Profile/Restricted.php:50
 msgid "Profile not found."
 msgstr ""
 
-#: src/Module/Profile/Profile.php:134
+#: src/Module/Profile/Profile.php:127
 #, php-format
 msgid ""
 "You're currently viewing your profile as <b>%s</b> <a href=\"%s\" class="
 "\"btn btn-sm pull-right\">Cancel</a>"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:143 src/Module/Settings/Account.php:576
+#: src/Module/Profile/Profile.php:136 src/Module/Settings/Account.php:576
 msgid "Full Name:"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:148
+#: src/Module/Profile/Profile.php:141
 msgid "Member since:"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:154
+#: src/Module/Profile/Profile.php:147
 msgid "j F, Y"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:155
+#: src/Module/Profile/Profile.php:148
 msgid "j F"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:163 src/Util/Temporal.php:166
+#: src/Module/Profile/Profile.php:156 src/Util/Temporal.php:166
 msgid "Birthday:"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:254
+#: src/Module/Profile/Profile.php:159 src/Module/Settings/Profile/Index.php:254
 #: src/Util/Temporal.php:168
 msgid "Age: "
 msgstr ""
 
-#: src/Module/Profile/Profile.php:166 src/Module/Settings/Profile/Index.php:254
+#: src/Module/Profile/Profile.php:159 src/Module/Settings/Profile/Index.php:254
 #: src/Util/Temporal.php:168
 #, php-format
 msgid "%d year old"
@@ -8222,33 +8231,33 @@ msgid_plural "%d years old"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Module/Profile/Profile.php:233
+#: src/Module/Profile/Profile.php:226
 msgid "Forums:"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:245
+#: src/Module/Profile/Profile.php:238
 msgid "View profile as:"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:262
+#: src/Module/Profile/Profile.php:255
 msgid "View as"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:325 src/Module/Profile/Profile.php:328
+#: src/Module/Profile/Profile.php:318 src/Module/Profile/Profile.php:321
 #: src/Module/Profile/Status.php:65 src/Module/Profile/Status.php:68
-#: src/Protocol/Feed.php:1028 src/Protocol/OStatus.php:1047
+#: src/Protocol/Feed.php:1024 src/Protocol/OStatus.php:1047
 #, php-format
 msgid "%s's timeline"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:326 src/Module/Profile/Status.php:66
-#: src/Protocol/Feed.php:1032 src/Protocol/OStatus.php:1052
+#: src/Module/Profile/Profile.php:319 src/Module/Profile/Status.php:66
+#: src/Protocol/Feed.php:1028 src/Protocol/OStatus.php:1052
 #, php-format
 msgid "%s's posts"
 msgstr ""
 
-#: src/Module/Profile/Profile.php:327 src/Module/Profile/Status.php:67
-#: src/Protocol/Feed.php:1035 src/Protocol/OStatus.php:1056
+#: src/Module/Profile/Profile.php:320 src/Module/Profile/Status.php:67
+#: src/Protocol/Feed.php:1031 src/Protocol/OStatus.php:1056
 #, php-format
 msgid "%s's comments"
 msgstr ""
@@ -8294,6 +8303,16 @@ msgstr ""
 msgid "Your Webfinger address or profile URL:"
 msgstr ""
 
+#: src/Module/Profile/Restricted.php:59
+msgid "Restricted profile"
+msgstr ""
+
+#: src/Module/Profile/Restricted.php:60
+msgid ""
+"This profile has been restricted which prevents access to their public "
+"content from anonymous visitors."
+msgstr ""
+
 #: src/Module/Profile/Schedule.php:84
 msgid "Scheduled"
 msgstr ""
@@ -8973,14 +8992,14 @@ msgid ""
 msgstr ""
 
 #: src/Module/Settings/Account.php:589
-msgid "Hide your profile details from anonymous viewers?"
+msgid "Hide your public content from anonymous viewers"
 msgstr ""
 
 #: src/Module/Settings/Account.php:589
 msgid ""
-"Anonymous visitors will only see your profile picture, your display name and "
-"the nickname you are using on your profile page. Your public posts and "
-"replies will still be accessible by other means."
+"Anonymous visitors will only see your basic profile details. Your public "
+"posts and replies will still be freely accessible on the remote servers of "
+"your followers and through relays."
 msgstr ""
 
 #: src/Module/Settings/Account.php:590
@@ -9783,7 +9802,7 @@ msgstr ""
 #: src/Module/Settings/Profile/Photo/Crop.php:107
 #: src/Module/Settings/Profile/Photo/Crop.php:125
 #: src/Module/Settings/Profile/Photo/Crop.php:143
-#: src/Module/Settings/Profile/Photo/Index.php:105
+#: src/Module/Settings/Profile/Photo/Index.php:101
 #, php-format
 msgid "Image size reduction [%s] failed."
 msgstr ""
@@ -9823,31 +9842,31 @@ msgstr ""
 msgid "Missing uploaded image."
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:128
+#: src/Module/Settings/Profile/Photo/Index.php:124
 msgid "Profile Picture Settings"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:129
+#: src/Module/Settings/Profile/Photo/Index.php:125
 msgid "Current Profile Picture"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:130
+#: src/Module/Settings/Profile/Photo/Index.php:126
 msgid "Upload Profile Picture"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:131
+#: src/Module/Settings/Profile/Photo/Index.php:127
 msgid "Upload Picture:"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:136
+#: src/Module/Settings/Profile/Photo/Index.php:132
 msgid "or"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:138
+#: src/Module/Settings/Profile/Photo/Index.php:134
 msgid "skip this step"
 msgstr ""
 
-#: src/Module/Settings/Profile/Photo/Index.php:140
+#: src/Module/Settings/Profile/Photo/Index.php:136
 msgid "select a photo from your photo albums"
 msgstr ""
 
@@ -11502,11 +11521,11 @@ msgstr ""
 msgid "Back to top"
 msgstr ""
 
-#: view/theme/frio/theme.php:219
+#: view/theme/frio/theme.php:217
 msgid "Guest"
 msgstr ""
 
-#: view/theme/frio/theme.php:222
+#: view/theme/frio/theme.php:220
 msgid "Visitor"
 msgstr ""
 
@@ -11554,7 +11573,7 @@ msgstr ""
 msgid "Community Pages"
 msgstr ""
 
-#: view/theme/vier/config.php:139 view/theme/vier/theme.php:151
+#: view/theme/vier/config.php:139 view/theme/vier/theme.php:149
 msgid "Community Profiles"
 msgstr ""
 
@@ -11562,7 +11581,7 @@ msgstr ""
 msgid "Help or @NewHere ?"
 msgstr ""
 
-#: view/theme/vier/config.php:141 view/theme/vier/theme.php:322
+#: view/theme/vier/config.php:141 view/theme/vier/theme.php:320
 msgid "Connect Services"
 msgstr ""
 
@@ -11570,10 +11589,10 @@ msgstr ""
 msgid "Find Friends"
 msgstr ""
 
-#: view/theme/vier/config.php:143 view/theme/vier/theme.php:178
+#: view/theme/vier/config.php:143 view/theme/vier/theme.php:176
 msgid "Last users"
 msgstr ""
 
-#: view/theme/vier/theme.php:237
+#: view/theme/vier/theme.php:235
 msgid "Quick Start"
 msgstr ""
diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php
index c504678577..c8f22228b6 100644
--- a/view/theme/frio/theme.php
+++ b/view/theme/frio/theme.php
@@ -53,8 +53,6 @@ function frio_init(App $a)
 	global $frio;
 	$frio = 'view/theme/frio';
 
-	// disable the events module link in the profile tab
-	$a->setThemeInfoValue('events_in_profile', false);
 	$a->setThemeInfoValue('videowidth', 622);
 
 	Renderer::setActiveTemplateEngine('smarty3');
diff --git a/view/theme/vier/theme.php b/view/theme/vier/theme.php
index 062e4a105c..65612623d2 100644
--- a/view/theme/vier/theme.php
+++ b/view/theme/vier/theme.php
@@ -42,8 +42,6 @@ use Friendica\Util\Strings;
 
 function vier_init(App $a)
 {
-	$a->setThemeInfoValue('events_in_profile', false);
-
 	Renderer::setActiveTemplateEngine('smarty3');
 
 	$args = DI::args();