diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d40ff6f4bb27cfe13cbc5e2d379f9a86b0b4eb5..d0ee5b2e9448619df0db9710c3da54c36d284b26 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 ### New Features
 - Custom content warnings/spoiler text ([d4864213](https://github.com/pixelfed/pixelfed/commit/d4864213))
 - Add NetworkTimelineService cache ([1310d95c](https://github.com/pixelfed/pixelfed/commit/1310d95c))
+- Customizable Legal Notice page ([0b7d0a96](https://github.com/pixelfed/pixelfed/commit/0b7d0a96))
 
 ### Breaking
 - Replaced `predis` with `phpredis` as default redis driver due to predis being deprecated, install [phpredis](https://github.com/phpredis/phpredis/blob/develop/INSTALL.markdown) if you're still using predis.
@@ -59,6 +60,7 @@
 - Fix AdminStatService cache key, fixes #3612 ([d1dbed89](https://github.com/pixelfed/pixelfed/commit/d1dbed89))
 - Improve mute/block v1 api endpoints, fixes #3540 ([c3e8a0e4](https://github.com/pixelfed/pixelfed/commit/c3e8a0e4))
 - Set Last-Modified header for atom feeds, fixes #2988 ([c18dcde3](https://github.com/pixelfed/pixelfed/commit/c18dcde3))
+- Add instance post/profile embed config setting ([7734dc03](https://github.com/pixelfed/pixelfed/commit/7734dc03))
 -  ([](https://github.com/pixelfed/pixelfed/commit/))
 
 ## [v0.11.3 (2022-05-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.2...v0.11.3)
diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php
index 94d14941048d7bed37c29474deece605e8fdb0b7..a136eda9fa01759c59e54e73e9308635b96c00b0 100644
--- a/app/Http/Controllers/PageController.php
+++ b/app/Http/Controllers/PageController.php
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use Illuminate\Http\Request;
 use Auth, Cache;
 use App\Page;
+use App\Services\ConfigCacheService;
 
 class PageController extends Controller
 {
@@ -18,7 +19,8 @@ class PageController extends Controller
 			'/site/about' => 'site:about',
 			'/site/privacy' => 'site:privacy',
 			'/site/terms' => 'site:terms',
-			'/site/kb/community-guidelines' => 'site:help:community-guidelines'
+			'/site/kb/community-guidelines' => 'site:help:community-guidelines',
+			'/site/legal-notice' => 'site:legal-notice'
 		];
 	}
 
@@ -60,10 +62,11 @@ class PageController extends Controller
 		$page->title = $request->input('title');
 		$page->active = (bool) $request->input('active');
 		$page->save();
-		if($page->cached) {
-			$keys = $this->cacheKeys();
-			$key = $keys[$page->slug];
-			Cache::forget($key);
+		$keys = $this->cacheKeys();
+		$key = $keys[$page->slug];
+		Cache::forget($key);
+		if($page->slug === '/site/legal-notice') {
+			ConfigCacheService::put('instance.has_legal_notice', $page->active);
 		}
 		return response()->json(['msg' => 200]);
 	}
@@ -75,14 +78,17 @@ class PageController extends Controller
 		]);
 
 		$page = Page::findOrFail($request->input('id'));
+		$keys = $this->cacheKeys();
+		$key = $keys[$page->slug];
 		$page->delete();
+		Cache::forget($key);
 		return redirect(route('admin.settings.pages'));
 	}
 
 	public function generatePage(Request $request)
 	{
 		$this->validate($request, [
-			'page' => 'required|string|in:about,terms,privacy,community_guidelines',
+			'page' => 'required|string|in:about,terms,privacy,community_guidelines,legal_notice',
 		]);
 
 		$page = $request->input('page');
@@ -103,6 +109,10 @@ class PageController extends Controller
 			case 'community_guidelines':
 				Page::firstOrCreate(['slug' => '/site/kb/community-guidelines']);
 				break;
+
+			case 'legal_notice':
+				Page::firstOrCreate(['slug' => '/site/legal-notice']);
+				break;
 		}
 
 		return redirect(route('admin.settings.pages'));
diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php
index 179db033d0312611e005b99f759ed62ef29516fc..30957cf289ffa60a85177fb38bbc214d89763322 100644
--- a/app/Http/Controllers/ProfileController.php
+++ b/app/Http/Controllers/ProfileController.php
@@ -243,6 +243,10 @@ class ProfileController extends Controller
 	{
 		$res = view('profile.embed-removed');
 
+		if(!config('instance.embed.profile')) {
+			return response($res)->withHeaders(['X-Frame-Options' => 'ALLOWALL']);
+		}
+
 		if(strlen($username) > 15 || strlen($username) < 2) {
 			return response($res)->withHeaders(['X-Frame-Options' => 'ALLOWALL']);
 		}
diff --git a/app/Http/Controllers/SiteController.php b/app/Http/Controllers/SiteController.php
index f4cac26bebd2915a038a7836b128468e0d7d32b3..379b24505f0cdffd4b6dc5d445eda5ebb2bafe59 100644
--- a/app/Http/Controllers/SiteController.php
+++ b/app/Http/Controllers/SiteController.php
@@ -154,4 +154,14 @@ class SiteController extends Controller
 
 		return redirect($url);
 	}
+
+	public function legalNotice(Request $request)
+	{
+		$page = Cache::remember('site:legal-notice', now()->addDays(120), function() {
+			$slug = '/site/legal-notice';
+			return Page::whereSlug($slug)->whereActive(true)->first();
+		});
+		abort_if(!$page, 404);
+		return View::make('site.legal-notice')->with(compact('page'))->render();
+	}
 }
diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php
index db57d7a7b16c415a08a4f0377712666d0dafd504..7bfac3aa66c56a4f690a07080a08a6b799c37b59 100644
--- a/app/Http/Controllers/StatusController.php
+++ b/app/Http/Controllers/StatusController.php
@@ -106,6 +106,11 @@ class StatusController extends Controller
 
 	public function showEmbed(Request $request, $username, int $id)
 	{
+		if(!config('instance.embed.post')) {
+			$res = view('status.embed-removed');
+			return response($res)->withHeaders(['X-Frame-Options' => 'ALLOWALL']);
+		}
+
 		$profile = Profile::whereNull(['domain','status'])
 			->whereIsPrivate(false)
 			->whereUsername($username)
diff --git a/app/Services/ConfigCacheService.php b/app/Services/ConfigCacheService.php
index 91d644ee73e3b562cfc3ef10df9cb964eb430154..b334e9e3324b3c80e92391ff86535afcb6719bdc 100644
--- a/app/Services/ConfigCacheService.php
+++ b/app/Services/ConfigCacheService.php
@@ -53,6 +53,8 @@ class ConfigCacheService
 				'account.autofollow',
 				'account.autofollow_usernames',
 				'config.discover.features',
+
+				'instance.has_legal_notice',
 				// 'system.user_mode'
 			];
 
diff --git a/config/instance.php b/config/instance.php
index 15ce670f8151cca7b994953a3189e968b5224621..3347e8f833d70111677d3decd3c51d89300f2fa5 100644
--- a/config/instance.php
+++ b/config/instance.php
@@ -84,4 +84,11 @@ return [
 	],
 
 	'enable_cc' => env('ENABLE_CONFIG_CACHE', false),
+
+	'has_legal_notice' => env('INSTANCE_LEGAL_NOTICE', false),
+
+	'embed' => [
+		'profile' => env('INSTANCE_PROFILE_EMBEDS', true),
+		'post' => env('INSTANCE_POST_EMBEDS', true),
+	],
 ];
diff --git a/resources/views/admin/pages/home.blade.php b/resources/views/admin/pages/home.blade.php
index bab2946476559d6f283bc5b8a0b0383d25127b63..f4125bc42fce61fcb2c023a24266227cd9cb07f3 100644
--- a/resources/views/admin/pages/home.blade.php
+++ b/resources/views/admin/pages/home.blade.php
@@ -11,7 +11,7 @@
 					<p class="lead text-white mt-n4 mb-0">Manage public and custom page content</p>
 				</div>
 
-                @if($pages->count() < 4)
+                @if($pages->count() < 5)
                 <div class="col-12">
                     <hr>
                     <div class="btn-group">
@@ -37,12 +37,19 @@
                         </form>
                         @endif
                         @if(!$pages->contains('slug', '=', '/site/kb/community-guidelines'))
-                        <form class="form-inline" method="post" action="/i/admin/settings/pages/create">
+                        <form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
                             @csrf
                             <input type="hidden" name="page" value="community_guidelines">
                             <button type="submit" class="btn btn-default font-weight-bold">Customize Guidelines Page</button>
                         </form>
                         @endif
+                        @if(!$pages->contains('slug', '=', '/site/legal-notice'))
+                        <form class="form-inline" method="post" action="/i/admin/settings/pages/create">
+                            @csrf
+                            <input type="hidden" name="page" value="legal_notice">
+                            <button type="submit" class="btn btn-default font-weight-bold">Customize Legal Notice Page</button>
+                        </form>
+                        @endif
                   </div>
                 </div>
                 @endif
diff --git a/resources/views/layouts/partial/footer.blade.php b/resources/views/layouts/partial/footer.blade.php
index 86ef1de023b9f5ead4891a90c358f9ea8496eb2d..5fb4e27dc78cd73db07c827763b5bdbf6b211e5b 100644
--- a/resources/views/layouts/partial/footer.blade.php
+++ b/resources/views/layouts/partial/footer.blade.php
@@ -7,6 +7,9 @@
           <a href="{{route('site.terms')}}" class="text-dark p-2">{{__('site.terms')}}</a>
           <a href="{{route('site.privacy')}}" class="text-dark p-2">{{__('site.privacy')}}</a>
           <a href="{{route('site.language')}}" class="text-dark p-2">{{__('site.language')}}</a>
+          @if(config_cache('instance.has_legal_notice'))
+            <a href="/site/legal-notice" class="text-dark p-2">Legal Notice</a>
+          @endif
         </p>
         <p class="text-center text-muted small mb-0">
           <span class="text-muted">© {{date('Y')}} {{config('pixelfed.domain.app')}}</span>
diff --git a/resources/views/site/legal-notice.blade.php b/resources/views/site/legal-notice.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..18e7d92cdba3cc95b5095d3af69d89b7588b953e
--- /dev/null
+++ b/resources/views/site/legal-notice.blade.php
@@ -0,0 +1,19 @@
+@extends('layouts.app')
+
+@section('content')
+<div class="container mt-5">
+  <div class="col-12">
+    <p class="font-weight-bold text-lighter text-uppercase">{{ $page->title ?? 'Legal Notice' }}</p>
+    <div class="card border shadow-none">
+      <div class="card-body p-md-5 text-justify mx-md-3" style="white-space: pre-line">
+        @if($page && $page->content)
+        {!! $page->content !!}
+        @endif
+      </div>
+    </div>
+  </div>
+</div>
+@endsection
+@push('meta')
+<meta property="og:description" content="{{ $page->title ?? 'Legal Notice' }}">
+@endpush
diff --git a/routes/api.php b/routes/api.php
index d4732a9f3a9ba6f557e10c3a2989af908bc66475..f3d0db24ad76c8ba2752617efd47545263c8ee15 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -100,6 +100,11 @@ Route::group(['prefix' => 'api'], function() use($middleware) {
 	Route::group(['prefix' => 'v1.1'], function() use($middleware) {
 		Route::post('report', 'Api\ApiV1Dot1Controller@report')->middleware($middleware);
 		Route::delete('accounts/avatar', 'Api\ApiV1Dot1Controller@deleteAvatar')->middleware($middleware);
+		Route::get('direct/thread', 'DirectMessageController@thread')->middleware($middleware);
+
+		Route::group(['prefix' => 'stories'], function () use($middleware) {
+			Route::get('recent', 'StoryController@recent')->middleware($middleware);
+		});
 	});
 
 	Route::group(['prefix' => 'live'], function() use($middleware) {
diff --git a/routes/web.php b/routes/web.php
index ab9aa03a0805e47250b79b4bae9fcfb1357af522..14e30da02d3d07ab75553c0d864a5164a262697a 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -513,6 +513,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
 		Route::get('newsroom/archive', 'NewsroomController@archive');
 		Route::get('newsroom/search', 'NewsroomController@search');
 		Route::get('newsroom', 'NewsroomController@index');
+		Route::get('legal-notice', 'SiteController@legalNotice');
 	});
 
 	Route::group(['prefix' => 'timeline'], function () {