about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOndřej Hruška <ondra@ondrovo.com>2017-07-25 21:36:22 +0200
committerOndřej Hruška <ondra@ondrovo.com>2017-07-25 21:36:22 +0200
commit7e5691804d4f0019a89b8b8a3dad532bc9d940ea (patch)
tree84c2f4e4ac07bea3915639a50df84eb62b6c5768
parent852acbd7385a640d9e00e462d58a847851744034 (diff)
parent7232cdf7e8249f79078005931b1165e54e413fa9 (diff)
Merge git://github.com/tootsuite/mastodon into tootsuite-master
-rw-r--r--Aptfile1
-rw-r--r--app.json2
-rw-r--r--app/controllers/api/v1/favourites_controller.rb4
-rw-r--r--app/controllers/api/web/push_subscriptions_controller.rb23
-rw-r--r--app/javascript/images/background-photo.jpgbin264344 -> 0 bytes
-rw-r--r--app/javascript/images/boost_sprite.pngbin1326 -> 0 bytes
-rw-r--r--app/javascript/images/fluffy-elephant-friend.pngbin60667 -> 0 bytes
-rw-r--r--app/javascript/images/logo.pngbin7752 -> 0 bytes
-rw-r--r--app/javascript/images/logo.svg2
-rw-r--r--app/javascript/images/logo_alt.svg1
-rw-r--r--app/javascript/images/logo_full.svg1
-rw-r--r--app/javascript/images/mastodon.jpgbin133743 -> 0 bytes
-rw-r--r--app/javascript/mastodon/components/column.js16
-rw-r--r--app/javascript/mastodon/components/loading_indicator.js1
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js13
-rw-r--r--app/javascript/mastodon/components/status_list.js22
-rw-r--r--app/javascript/mastodon/features/account/components/action_bar.js59
-rw-r--r--app/javascript/mastodon/features/compose/components/compose_form.js3
-rw-r--r--app/javascript/mastodon/features/ui/components/bundle.js13
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js7
-rw-r--r--app/javascript/mastodon/features/ui/components/tabs_bar.js12
-rw-r--r--app/javascript/mastodon/locales/ar.json3
-rw-r--r--app/javascript/mastodon/locales/bg.json3
-rw-r--r--app/javascript/mastodon/locales/ca.json3
-rw-r--r--app/javascript/mastodon/locales/de.json3
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json14
-rw-r--r--app/javascript/mastodon/locales/en.json5
-rw-r--r--app/javascript/mastodon/locales/eo.json3
-rw-r--r--app/javascript/mastodon/locales/es.json3
-rw-r--r--app/javascript/mastodon/locales/fa.json3
-rw-r--r--app/javascript/mastodon/locales/fi.json3
-rw-r--r--app/javascript/mastodon/locales/fr.json25
-rw-r--r--app/javascript/mastodon/locales/he.json3
-rw-r--r--app/javascript/mastodon/locales/hr.json3
-rw-r--r--app/javascript/mastodon/locales/hu.json3
-rw-r--r--app/javascript/mastodon/locales/id.json3
-rw-r--r--app/javascript/mastodon/locales/io.json3
-rw-r--r--app/javascript/mastodon/locales/it.json3
-rw-r--r--app/javascript/mastodon/locales/ja.json5
-rw-r--r--app/javascript/mastodon/locales/ko.json3
-rw-r--r--app/javascript/mastodon/locales/nl.json37
-rw-r--r--app/javascript/mastodon/locales/no.json3
-rw-r--r--app/javascript/mastodon/locales/oc.json35
-rw-r--r--app/javascript/mastodon/locales/pl.json5
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json3
-rw-r--r--app/javascript/mastodon/locales/pt.json3
-rw-r--r--app/javascript/mastodon/locales/ru.json5
-rw-r--r--app/javascript/mastodon/locales/th.json3
-rw-r--r--app/javascript/mastodon/locales/tr.json3
-rw-r--r--app/javascript/mastodon/locales/uk.json3
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json3
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json3
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json3
-rw-r--r--app/javascript/mastodon/web_push_subscription.js2
-rw-r--r--app/javascript/styles/about.scss264
-rw-r--r--app/javascript/styles/boost.scss2
-rw-r--r--app/javascript/styles/components.scss165
-rw-r--r--app/javascript/styles/containers.scss3
-rw-r--r--app/javascript/styles/forms.scss4
-rw-r--r--app/javascript/styles/stream_entries.scss14
-rw-r--r--app/javascript/styles/variables.scss9
-rw-r--r--app/models/domain_block.rb2
-rw-r--r--app/models/user.rb1
-rw-r--r--app/services/block_domain_service.rb4
-rw-r--r--app/services/unblock_domain_service.rb2
-rw-r--r--app/views/about/_contact.html.haml16
-rw-r--r--app/views/about/_links.html.haml12
-rw-r--r--app/views/about/_version.html.haml9
-rw-r--r--app/views/about/more.html.haml59
-rw-r--r--app/views/about/show.html.haml3
-rw-r--r--app/views/about/terms.html.haml25
-rw-r--r--app/views/accounts/show.html.haml6
-rw-r--r--app/views/admin/domain_blocks/show.html.haml19
-rw-r--r--app/views/home/index.html.haml3
-rw-r--r--app/views/layouts/admin.html.haml2
-rw-r--r--app/views/layouts/auth.html.haml3
-rw-r--r--app/views/manifests/show.json.rabl2
-rw-r--r--app/views/well_known/webfinger/show.json.rabl2
-rw-r--r--app/views/well_known/webfinger/show.xml.ruby2
-rw-r--r--app/workers/scheduler/user_cleanup_scheduler.rb13
-rw-r--r--config/deploy.rb2
-rw-r--r--config/locales/activerecord.nl.yml12
-rw-r--r--config/locales/ar.yml6
-rw-r--r--config/locales/bg.yml6
-rw-r--r--config/locales/ca.yml7
-rw-r--r--config/locales/de.yml7
-rw-r--r--config/locales/devise.nl.yml20
-rw-r--r--config/locales/doorkeeper.nl.yml6
-rw-r--r--config/locales/en.yml28
-rw-r--r--config/locales/eo.yml6
-rw-r--r--config/locales/es.yml6
-rw-r--r--config/locales/fa.yml7
-rw-r--r--config/locales/fi.yml6
-rw-r--r--config/locales/fr.yml70
-rw-r--r--config/locales/he.yml7
-rw-r--r--config/locales/hr.yml6
-rw-r--r--config/locales/hu.yml6
-rw-r--r--config/locales/id.yml7
-rw-r--r--config/locales/io.yml6
-rw-r--r--config/locales/it.yml6
-rw-r--r--config/locales/ja.yml17
-rw-r--r--config/locales/ko.yml7
-rw-r--r--config/locales/nl.yml270
-rw-r--r--config/locales/no.yml7
-rw-r--r--config/locales/oc.yml167
-rw-r--r--config/locales/pl.yml26
-rw-r--r--config/locales/pt-BR.yml7
-rw-r--r--config/locales/pt.yml7
-rw-r--r--config/locales/ru.yml7
-rw-r--r--config/locales/simple_form.en.yml2
-rw-r--r--config/locales/simple_form.ja.yml3
-rw-r--r--config/locales/simple_form.oc.yml5
-rw-r--r--config/locales/simple_form.pl.yml3
-rw-r--r--config/locales/th.yml7
-rw-r--r--config/locales/tr.yml7
-rw-r--r--config/locales/uk.yml7
-rw-r--r--config/locales/zh-CN.yml7
-rw-r--r--config/locales/zh-HK.yml7
-rw-r--r--config/locales/zh-TW.yml6
-rw-r--r--config/routes.rb2
-rw-r--r--config/sidekiq.yml3
-rw-r--r--lib/mastodon/version.rb10
-rw-r--r--lib/tasks/mastodon.rake31
-rw-r--r--package.json1
-rw-r--r--public/android-chrome-192x192.pngbin14344 -> 6702 bytes
-rw-r--r--public/apple-touch-icon.pngbin4217 -> 6977 bytes
-rw-r--r--public/badge.pngbin31156 -> 5579 bytes
-rw-r--r--public/browserconfig.xml2
-rw-r--r--public/favicon-dev.icobin9854 -> 9086 bytes
-rw-r--r--public/favicon.icobin927 -> 9086 bytes
-rw-r--r--public/mask-icon.svg2
-rw-r--r--public/mstile-150x150.pngbin6916 -> 5796 bytes
-rw-r--r--scalingo.json2
-rw-r--r--spec/controllers/api/web/push_subscriptions_controller_spec.rb26
-rw-r--r--spec/views/about/_contact.html.haml_spec.rb7
-rw-r--r--spec/views/about/_links.html.haml_spec.rb38
-rw-r--r--spec/workers/pubsubhubbub/confirmation_worker_spec.rb2
-rw-r--r--spec/workers/pubsubhubbub/delivery_worker_spec.rb1
-rw-r--r--yarn.lock4
139 files changed, 1198 insertions, 760 deletions
diff --git a/Aptfile b/Aptfile
index 3af0956e3..f89f74bd4 100644
--- a/Aptfile
+++ b/Aptfile
@@ -4,3 +4,4 @@ ffmpeg
 libxdamage1
 libxfixes3
 libicu-dev
+libidn11-dev
diff --git a/app.json b/app.json
index 049f63a9e..a935b8232 100644
--- a/app.json
+++ b/app.json
@@ -2,7 +2,7 @@
   "name": "Mastodon",
   "description": "A GNU Social-compatible microblogging server",
   "repository": "https://github.com/tootsuite/mastodon",
-  "logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png",
+  "logo": "https://github.com/tootsuite/mastodon/raw/master/app/javascript/images/logo.svg",
   "env": {
     "HEROKU": {
       "description": "Leave this as true",
diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb
index 92c0a62a9..9d73bb337 100644
--- a/app/controllers/api/v1/favourites_controller.rb
+++ b/app/controllers/api/v1/favourites_controller.rb
@@ -20,9 +20,7 @@ class Api::V1::FavouritesController < Api::BaseController
 
   def cached_favourites
     cache_collection(
-      Status.where(
-        id: results.map(&:status_id)
-      ),
+      Status.reorder(nil).joins(:favourites).merge(results),
       Status
     )
   end
diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb
index 8425db7b4..d66237feb 100644
--- a/app/controllers/api/web/push_subscriptions_controller.rb
+++ b/app/controllers/api/web/push_subscriptions_controller.rb
@@ -6,8 +6,8 @@ class Api::Web::PushSubscriptionsController < Api::BaseController
   before_action :require_user!
 
   def create
-    params.require(:data).require(:endpoint)
-    params.require(:data).require(:keys).require([:auth, :p256dh])
+    params.require(:subscription).require(:endpoint)
+    params.require(:subscription).require(:keys).require([:auth, :p256dh])
 
     active_session = current_session
 
@@ -16,10 +16,23 @@ class Api::Web::PushSubscriptionsController < Api::BaseController
       active_session.update!(web_push_subscription: nil)
     end
 
+    # Mobile devices do not support regular notifications, so we enable push notifications by default
+    alerts_enabled = active_session.detection.device.mobile? || active_session.detection.device.tablet?
+
+    data = {
+      alerts: {
+        follow: alerts_enabled,
+        favourite: alerts_enabled,
+        reblog: alerts_enabled,
+        mention: alerts_enabled,
+      },
+    }
+
     web_subscription = ::Web::PushSubscription.create!(
-      endpoint: params[:data][:endpoint],
-      key_p256dh: params[:data][:keys][:p256dh],
-      key_auth: params[:data][:keys][:auth]
+      endpoint: params[:subscription][:endpoint],
+      key_p256dh: params[:subscription][:keys][:p256dh],
+      key_auth: params[:subscription][:keys][:auth],
+      data: data
     )
 
     active_session.update!(web_push_subscription: web_subscription)
diff --git a/app/javascript/images/background-photo.jpg b/app/javascript/images/background-photo.jpg
deleted file mode 100644
index 03341b8ec..000000000
--- a/app/javascript/images/background-photo.jpg
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/boost_sprite.png b/app/javascript/images/boost_sprite.png
deleted file mode 100644
index 564bf2646..000000000
--- a/app/javascript/images/boost_sprite.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/fluffy-elephant-friend.png b/app/javascript/images/fluffy-elephant-friend.png
deleted file mode 100644
index f0df29927..000000000
--- a/app/javascript/images/fluffy-elephant-friend.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/logo.png b/app/javascript/images/logo.png
deleted file mode 100644
index f0c1c46c3..000000000
--- a/app/javascript/images/logo.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg
index 16cb3a944..4b72b3ac8 100644
--- a/app/javascript/images/logo.svg
+++ b/app/javascript/images/logo.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" height="1000" width="1000"><path d="M500 0a500 500 0 0 0-353.553 146.447 500 500 0 1 0 707.106 707.106A500 500 0 0 0 500 0zm-.059 280.05h107.12c-19.071 13.424-26.187 51.016-27.12 73.843V562.05c0 44.32-35.68 80-80 80s-80-35.68-80-80v-202c0-44.32 35.68-80 80-80zm-.441 52c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zm-279.059 7.9c44.32 0 80 35.68 80 80v206.157c.933 22.827 8.049 60.42 27.12 73.842H220.44c-44.32 0-80-35.68-80-80v-200c0-44.32 35.68-80 80-80zm559.12 0c44.32 0 80 35.68 80 80v200c0 44.32-35.68 80-80 80H672.44c19.071-13.424 26.187-51.016 27.12-73.843V419.95c0-44.32 35.68-80 80-80zM220 392c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm560 0c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm-280.5 40.05c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zM220 491.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zM499.5 532c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zM220 591.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28z" fill="#fff"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="61.076954mm" height="65.47831mm" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg>
diff --git a/app/javascript/images/logo_alt.svg b/app/javascript/images/logo_alt.svg
new file mode 100644
index 000000000..e88ca7418
--- /dev/null
+++ b/app/javascript/images/logo_alt.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="61.077141mm" height="65.47831mm" viewBox="0 0 216.41507 232.00976"><path d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" fill="#3088d4"/><path d="M65.68743 96.45938c0 9.01375-7.3075 16.32125-16.3225 16.32125-9.01375 0-16.32-7.3075-16.32-16.32125 0-9.01375 7.30625-16.3225 16.32-16.3225 9.015 0 16.3225 7.30875 16.3225 16.3225M124.52893 96.45938c0 9.01375-7.30875 16.32125-16.3225 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.3225 7.30875 16.3225 16.3225M183.36933 96.45938c0 9.01375-7.3075 16.32125-16.32125 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.32125 7.30875 16.32125 16.3225" fill="#fff"/></svg>
diff --git a/app/javascript/images/logo_full.svg b/app/javascript/images/logo_full.svg
new file mode 100644
index 000000000..8b1328e8c
--- /dev/null
+++ b/app/javascript/images/logo_full.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 713.35878 175.8678" height="49.633801mm" width="201.3257mm"><path d="M160.55476 105.43125c-2.4125 12.40625-21.5975 25.9825-43.63375 28.61375-11.49125 1.3725-22.80375 2.63125-34.8675 2.07875-19.73-.90375-35.2975-4.71-35.2975-4.71 0 1.92125.11875 3.75.355 5.46 2.565 19.47 19.3075 20.6375 35.16625 21.18125 16.00625.5475 30.2575-3.9475 30.2575-3.9475l.65875 14.4725s-11.19625 6.01125-31.14 7.11625c-10.99875.605-24.65375-.27625-40.56-4.485C6.99851 162.08 1.06601 125.31.15851 88-.11899 76.9225.05226 66.47625.05226 57.74125c0-38.1525 24.99625-49.335 24.99625-49.335C37.65226 2.6175 59.27976.18375 81.76351 0h.5525c22.48375.18375 44.125 2.6175 56.72875 8.40625 0 0 24.99625 11.1825 24.99625 49.335 0 0 .3125 28.1475-3.48625 47.69" fill="#3088d4"/><path d="M34.65751 48.494c0-5.55375 4.5025-10.055 10.055-10.055 5.55375 0 10.055 4.50125 10.055 10.055 0 5.5525-4.50125 10.055-10.055 10.055-5.5525 0-10.055-4.5025-10.055-10.055M178.86476 60.69975v46.195h-18.30125v-44.8375c0-9.4525-3.9775-14.24875-11.9325-14.24875-8.79375 0-13.2025 5.69125-13.2025 16.94375V89.2935h-18.19375V64.75225c0-11.2525-4.40875-16.94375-13.2025-16.94375-7.955 0-11.9325 4.79625-11.9325 14.24875v44.8375H73.79851v-46.195c0-9.44125 2.40375-16.94375 7.2325-22.495 4.98-5.55 11.50125-8.395 19.595-8.395 9.36625 0 16.45875 3.59875 21.14625 10.79875l4.56 7.6425 4.55875-7.6425c4.68875-7.2 11.78-10.79875 21.1475-10.79875 8.09375 0 14.61375 2.845 19.59375 8.395 4.82875 5.55125 7.2325 13.05375 7.2325 22.495M241.91276 83.663625c3.77625-3.99 5.595-9.015 5.595-15.075 0-6.06-1.81875-11.085-5.595-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.84875 5.91125-3.6375 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.81875 11.085 5.45625 15.075 3.63625 3.8425 8.2525 5.76375 13.84875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.595-52.025h18.04625v73.9h-18.04625v-8.72125c-5.455 7.2425-13.01 10.79-22.80125 10.79-9.3725 0-17.34625-3.695-24.06125-11.23375-6.57375-7.5375-9.93125-16.84875-9.93125-27.785 0-10.78875 3.3575-20.10125 9.93125-27.63875 6.715-7.5375 14.68875-11.38 24.06125-11.38 9.79125 0 17.34625 3.5475 22.80125 10.78875v-8.72zM326.26951 67.258625c5.315 3.99 7.97375 9.60625 7.83375 16.7 0 7.53875-2.65875 13.45-8.11375 17.58875-5.45625 3.99125-12.03 6.06-20.00375 6.06-14.40875 0-24.20125-5.9125-29.3775-17.58875l15.66875-9.31c2.0975 6.35375 6.71375 9.60625 13.70875 9.60625 6.43375 0 9.6525-2.07 9.6525-6.35625 0-3.10375-4.1975-5.91125-12.73-8.1275-3.21875-.8875-5.87625-1.77375-7.97375-2.51375-2.9375-1.18125-5.455-2.5125-7.55375-4.1375-5.17625-3.99-7.83375-9.3125-7.83375-16.11 0-7.2425 2.5175-13.00625 7.55375-17.145 5.17625-4.28625 11.47-6.355 19.025-6.355 12.03 0 20.84375 5.1725 26.5775 15.66625l-15.38625 8.8675c-2.23875-5.02375-6.015-7.53625-11.19125-7.53625-5.45625 0-8.11375 2.06875-8.11375 6.05875 0 3.10375 4.19625 5.91125 12.73 8.12875 6.575 1.4775 11.75 3.695 15.5275 6.50375M383.626635 49.966125h-15.8075v30.7425c0 3.695 1.4 5.91125 4.0575 6.945 1.95875.74 5.875.8875 11.75.59125v17.29375c-12.16875 1.4775-20.9825.295-26.15875-3.69625-5.175-3.8425-7.69375-10.93625-7.69375-21.13375v-30.7425h-12.17v-18.3275h12.17v-14.9275l18.045-5.76375v20.69125h15.8075v18.3275zM441.124885 83.2205c3.6375-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.8175-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.93125 1.92-13.56875 5.76375-3.4975 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.81875 10.6425 5.31625 14.6325 3.6375 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.13375-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.4975-20.1 10.63125-27.6375 7.13375-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.165-3.69375-26.29875-11.2325M524.92126 83.663625c3.6375-3.99 5.455-9.015 5.455-15.075 0-6.06-1.8175-11.085-5.455-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.98875 5.91125-3.63625 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.82 11.085 5.45625 15.075 3.77625 3.8425 8.5325 5.76375 13.98875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.455-81.585h18.04625v103.46h-18.04625v-8.72125c-5.315 7.2425-12.87 10.79-22.66125 10.79-9.3725 0-17.485-3.695-24.2-11.23375-6.575-7.5375-9.9325-16.84875-9.9325-27.785 0-10.78875 3.3575-20.10125 9.9325-27.63875 6.715-7.5375 14.8275-11.38 24.2-11.38 9.79125 0 17.34625 3.5475 22.66125 10.78875v-38.28zM611.79626 83.2205c3.63625-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.81875-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.9325 1.92-13.56875 5.76375-3.49875 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.8175 10.6425 5.31625 14.6325 3.63625 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.135-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.49625-20.1 10.63125-27.6375 7.135-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.16375-3.69375-26.29875-11.2325M713.35876 60.163875v45.37375h-18.04625v-43.00875c0-4.8775-1.25875-8.5725-3.77625-11.38-2.37875-2.5125-5.73625-3.84375-10.0725-3.84375-10.2125 0-15.3875 6.06-15.3875 18.3275v39.905h-18.04625v-73.89875h18.04625v8.27625c4.33625-6.94625 11.19-10.345 20.84375-10.345 7.69375 0 13.98875 2.66 18.885 8.12875 5.035 5.46875 7.55375 12.85875 7.55375 22.465" fill="#fff"/></svg>
diff --git a/app/javascript/images/mastodon.jpg b/app/javascript/images/mastodon.jpg
deleted file mode 100644
index 2dfeb879f..000000000
--- a/app/javascript/images/mastodon.jpg
+++ /dev/null
Binary files differdiff --git a/app/javascript/mastodon/components/column.js b/app/javascript/mastodon/components/column.js
index 0dd31e137..93f1d6260 100644
--- a/app/javascript/mastodon/components/column.js
+++ b/app/javascript/mastodon/components/column.js
@@ -1,5 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+import detectPassiveEvents from 'detect-passive-events';
 import scrollTop from '../scroll';
 
 export default class Column extends React.PureComponent {
@@ -30,16 +31,19 @@ export default class Column extends React.PureComponent {
     this.node = c;
   }
 
+  componentDidMount () {
+    this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents ? { passive: true } : false);
+  }
+
+  componentWillUnmount () {
+    this.node.removeEventListener('wheel', this.handleWheel);
+  }
+
   render () {
     const { children } = this.props;
 
     return (
-      <div
-        role='region'
-        className='column'
-        ref={this.setRef}
-        onWheel={this.handleWheel}
-      >
+      <div role='region' className='column' ref={this.setRef}>
         {children}
       </div>
     );
diff --git a/app/javascript/mastodon/components/loading_indicator.js b/app/javascript/mastodon/components/loading_indicator.js
index c09244834..d6a5adb6f 100644
--- a/app/javascript/mastodon/components/loading_indicator.js
+++ b/app/javascript/mastodon/components/loading_indicator.js
@@ -3,6 +3,7 @@ import { FormattedMessage } from 'react-intl';
 
 const LoadingIndicator = () => (
   <div className='loading-indicator'>
+    <div className='loading-indicator__figure' />
     <FormattedMessage id='loading_indicator.label' defaultMessage='Loading...' />
   </div>
 );
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 2fad0fa5a..3e947b4c5 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -15,6 +15,7 @@ const messages = defineMessages({
   mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
   block: { id: 'account.block', defaultMessage: 'Block @{name}' },
   reply: { id: 'status.reply', defaultMessage: 'Reply' },
+  share: { id: 'status.share', defaultMessage: 'Share' },
   replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
   reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
@@ -60,6 +61,13 @@ export default class StatusActionBar extends ImmutablePureComponent {
     this.props.onReply(this.props.status, this.context.router.history);
   }
 
+  handleShareClick = () => {
+    navigator.share({
+      text: this.props.status.get('search_index'),
+      url: this.props.status.get('url'),
+    });
+  }
+
   handleFavouriteClick = () => {
     this.props.onFavourite(this.props.status);
   }
@@ -139,11 +147,16 @@ export default class StatusActionBar extends ImmutablePureComponent {
       replyTitle = intl.formatMessage(messages.replyAll);
     }
 
+    const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
+      <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
+    );
+
     return (
       <div className='status__action-bar'>
         <IconButton className='status__action-bar-button' disabled={anonymousAccess} title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} />
         <IconButton className='status__action-bar-button' disabled={anonymousAccess || reblogDisabled} active={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
         <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
+        {shareButton}
 
         <div className='status__action-bar-dropdown'>
           <DropdownMenu disabled={anonymousAccess} items={menu} icon='ellipsis-h' size={18} direction='right' ariaLabel='More' />
diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js
index 59f792920..3dd207dbc 100644
--- a/app/javascript/mastodon/components/status_list.js
+++ b/app/javascript/mastodon/components/status_list.js
@@ -31,16 +31,18 @@ export default class StatusList extends ImmutablePureComponent {
   intersectionObserverWrapper = new IntersectionObserverWrapper();
 
   handleScroll = debounce(() => {
-    const { scrollTop, scrollHeight, clientHeight } = this.node;
-    const offset = scrollHeight - scrollTop - clientHeight;
-    this._oldScrollPosition = scrollHeight - scrollTop;
-
-    if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) {
-      this.props.onScrollToBottom();
-    } else if (scrollTop < 100 && this.props.onScrollToTop) {
-      this.props.onScrollToTop();
-    } else if (this.props.onScroll) {
-      this.props.onScroll();
+    if (this.node) {
+      const { scrollTop, scrollHeight, clientHeight } = this.node;
+      const offset = scrollHeight - scrollTop - clientHeight;
+      this._oldScrollPosition = scrollHeight - scrollTop;
+
+      if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) {
+        this.props.onScrollToBottom();
+      } else if (scrollTop < 100 && this.props.onScrollToTop) {
+        this.props.onScrollToTop();
+      } else if (this.props.onScroll) {
+        this.props.onScroll();
+      }
     }
   }, 200, {
     trailing: true,
diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js
index 374da103e..b8df724c6 100644
--- a/app/javascript/mastodon/features/account/components/action_bar.js
+++ b/app/javascript/mastodon/features/account/components/action_bar.js
@@ -16,7 +16,6 @@ const messages = defineMessages({
   follow: { id: 'account.follow', defaultMessage: 'Follow' },
   report: { id: 'account.report', defaultMessage: 'Report @{name}' },
   media: { id: 'account.media', defaultMessage: 'Media' },
-  disclaimer: { id: 'account.disclaimer', defaultMessage: 'This user is from another instance. This number may be larger.' },
   blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
   unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
 });
@@ -68,7 +67,19 @@ export default class ActionBar extends React.PureComponent {
 
     if (account.get('acct') !== account.get('username')) {
       const domain = account.get('acct').split('@')[1];
-      extraInfo = <abbr title={intl.formatMessage(messages.disclaimer)}>*</abbr>;
+
+      extraInfo = (
+        <div className='account__disclaimer'>
+          <FormattedMessage
+            id='account.disclaimer_full'
+            defaultMessage="Information below may reflect the user's profile incompletely."
+          />
+          {' '}
+          <a target='_blank' rel='noopener' href={account.get('url')}>
+            <FormattedMessage id='account.view_full_profile' defaultMessage='View full profile' />
+          </a>
+        </div>
+      );
 
       menu.push(null);
 
@@ -80,26 +91,30 @@ export default class ActionBar extends React.PureComponent {
     }
 
     return (
-      <div className='account__action-bar'>
-        <div className='account__action-bar-dropdown'>
-          <DropdownMenu items={menu} icon='bars' size={24} direction='right' />
-        </div>
-
-        <div className='account__action-bar-links'>
-          <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
-            <span><FormattedMessage id='account.posts' defaultMessage='Posts' /></span>
-            <strong><FormattedNumber value={account.get('statuses_count')} /> {extraInfo}</strong>
-          </Link>
-
-          <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
-            <span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span>
-            <strong><FormattedNumber value={account.get('following_count')} /> {extraInfo}</strong>
-          </Link>
-
-          <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
-            <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span>
-            <strong><FormattedNumber value={account.get('followers_count')} /> {extraInfo}</strong>
-          </Link>
+      <div>
+        {extraInfo}
+
+        <div className='account__action-bar'>
+          <div className='account__action-bar-dropdown'>
+            <DropdownMenu items={menu} icon='bars' size={24} direction='right' />
+          </div>
+
+          <div className='account__action-bar-links'>
+            <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
+              <span><FormattedMessage id='account.posts' defaultMessage='Posts' /></span>
+              <strong><FormattedNumber value={account.get('statuses_count')} /></strong>
+            </Link>
+
+            <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
+              <span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span>
+              <strong><FormattedNumber value={account.get('following_count')} /></strong>
+            </Link>
+
+            <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
+              <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span>
+              <strong><FormattedNumber value={account.get('followers_count')} /></strong>
+            </Link>
+          </div>
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 837bf8fcb..708978481 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -16,13 +16,14 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container';
 import EmojiPickerDropdown from './emoji_picker_dropdown';
 import UploadFormContainer from '../containers/upload_form_container';
 import WarningContainer from '../containers/warning_container';
+import { isMobile } from '../../../is_mobile';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { length } from 'stringz';
 import { isMobile } from '../../../is_mobile';
 
 const messages = defineMessages({
   placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' },
-  spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Content warning' },
+  spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },
   publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },
   publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },
 });
diff --git a/app/javascript/mastodon/features/ui/components/bundle.js b/app/javascript/mastodon/features/ui/components/bundle.js
index 72798f690..fc88e0c70 100644
--- a/app/javascript/mastodon/features/ui/components/bundle.js
+++ b/app/javascript/mastodon/features/ui/components/bundle.js
@@ -52,14 +52,8 @@ class Bundle extends React.Component {
   load = (props) => {
     const { fetchComponent, onFetch, onFetchSuccess, onFetchFail, renderDelay } = props || this.props;
 
-    this.setState({ mod: undefined });
     onFetch();
 
-    if (renderDelay !== 0) {
-      this.timestamp = new Date();
-      this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay);
-    }
-
     if (Bundle.cache[fetchComponent.name]) {
       const mod = Bundle.cache[fetchComponent.name];
 
@@ -68,6 +62,13 @@ class Bundle extends React.Component {
       return Promise.resolve();
     }
 
+    this.setState({ mod: undefined });
+
+    if (renderDelay !== 0) {
+      this.timestamp = new Date();
+      this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay);
+    }
+
     return fetchComponent()
       .then((mod) => {
         Bundle.cache[fetchComponent.name] = mod;
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index 515c377b9..7de66ce3f 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -1,5 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+import { injectIntl } from 'react-intl';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
@@ -21,6 +22,7 @@ const componentMap = {
   'FAVOURITES': FavouritedStatuses,
 };
 
+@injectIntl
 export default class ColumnsArea extends ImmutablePureComponent {
 
   static contextTypes = {
@@ -28,6 +30,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
   };
 
   static propTypes = {
+    intl: PropTypes.object.isRequired,
     columns: ImmutablePropTypes.list.isRequired,
     singleColumn: PropTypes.bool,
     children: PropTypes.node,
@@ -64,8 +67,8 @@ export default class ColumnsArea extends ImmutablePureComponent {
 
   renderView = (link, index) => {
     const columnIndex = getIndex(this.context.router.history.location.pathname);
-    const title = link.props.children[1] && React.cloneElement(link.props.children[1]);
-    const icon = (link.props.children[0] || link.props.children).props.className.split(' ')[2].split('-')[1];
+    const title = this.props.intl.formatMessage({ id: link.props['data-preview-title-id'] });
+    const icon = link.props['data-preview-icon'];
 
     const view = (index === columnIndex) ?
       React.cloneElement(this.props.children) :
diff --git a/app/javascript/mastodon/features/ui/components/tabs_bar.js b/app/javascript/mastodon/features/ui/components/tabs_bar.js
index b4153ff45..baec86d0d 100644
--- a/app/javascript/mastodon/features/ui/components/tabs_bar.js
+++ b/app/javascript/mastodon/features/ui/components/tabs_bar.js
@@ -3,14 +3,14 @@ import NavLink from 'react-router-dom/NavLink';
 import { FormattedMessage } from 'react-intl';
 
 export const links = [
-  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/statuses/new'><i className='fa fa-fw fa-pencil' /><FormattedMessage id='tabs_bar.compose' defaultMessage='Compose' /></NavLink>,
-  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/timelines/home'><i className='fa fa-fw fa-home' /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
-  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/notifications'><i className='fa fa-fw fa-bell' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
+  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/statuses/new' data-preview-title-id='tabs_bar.compose' data-preview-icon='pencil' ><i className='fa fa-fw fa-pencil' /><FormattedMessage id='tabs_bar.compose' defaultMessage='Compose' /></NavLink>,
+  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/timelines/home' data-preview-title-id='column.home' data-preview-icon='home' ><i className='fa fa-fw fa-home' /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
+  <NavLink className='tabs-bar__link primary' activeClassName='active' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><i className='fa fa-fw fa-bell' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
 
-  <NavLink className='tabs-bar__link secondary' activeClassName='active' to='/timelines/public/local'><i className='fa fa-fw fa-users' /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
-  <NavLink className='tabs-bar__link secondary' activeClassName='active' exact to='/timelines/public'><i className='fa fa-fw fa-globe' /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
+  <NavLink className='tabs-bar__link secondary' activeClassName='active' to='/timelines/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><i className='fa fa-fw fa-users' /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
+  <NavLink className='tabs-bar__link secondary' activeClassName='active' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><i className='fa fa-fw fa-globe' /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
 
-  <NavLink className='tabs-bar__link primary' activeClassName='active' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started'><i className='fa fa-fw fa-asterisk' /></NavLink>,
+  <NavLink className='tabs-bar__link primary' activeClassName='active' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started' data-preview-title-id='tabs_bar.federated_timeline' data-preview-icon='asterisk' ><i className='fa fa-fw fa-asterisk' /></NavLink>,
 ];
 
 export function getIndex (path) {
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 89ddb2d15..7f27d78cd 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -1,7 +1,7 @@
 {
   "account.block": "حظر @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "هذا المستخدم من مثيل خادم آخر. قد يكون هذا الرقم أكبر.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "تعديل الملف الشخصي",
   "account.follow": "تابِع",
   "account.followers": "المتابعون",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "إلغاء المتابعة",
   "account.unmute": "إلغاء الكتم عن @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه في المرّة القادمة",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 3dba91b82..68aaf56b0 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Блокирай",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Редактирай профила си",
   "account.follow": "Последвай",
   "account.followers": "Последователи",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Не следвай",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 54f2e5e22..6fdcde4b4 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloquejar @{name}",
   "account.block_domain": "Amagar tot de {domain}",
-  "account.disclaimer": "Aquest usuari és d'un altra instància. Aquest número podria ser més gran.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Editar perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidors",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Mostra {domain}",
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Treure silenci de @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index a041e6655..f911c7b75 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -1,7 +1,7 @@
 {
   "account.block": "@{name} blocken",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Dieser Benutzer ist von einer anderen Instanz. Diese Zahl könnte größer sein.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Profil bearbeiten",
   "account.follow": "Folgen",
   "account.followers": "Folgende",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Entfolgen",
   "account.unmute": "@{name} nicht mehr stummschalten",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Du kannst {combo} drücken, um dies beim nächsten Mal zu überspringen",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 956878f57..a7b8f01d0 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -359,10 +359,6 @@
         "id": "account.media"
       },
       {
-        "defaultMessage": "This user is from another instance. This number may be larger.",
-        "id": "account.disclaimer"
-      },
-      {
         "defaultMessage": "Hide everything from {domain}",
         "id": "account.block_domain"
       },
@@ -371,6 +367,14 @@
         "id": "account.unblock_domain"
       },
       {
+        "defaultMessage": "Information below may reflect the user's profile incompletely.",
+        "id": "account.disclaimer_full"
+      },
+      {
+        "defaultMessage": "View full profile",
+        "id": "account.view_full_profile"
+      },
+      {
         "defaultMessage": "Posts",
         "id": "account.posts"
       },
@@ -452,7 +456,7 @@
         "id": "compose_form.placeholder"
       },
       {
-        "defaultMessage": "Content warning",
+        "defaultMessage": "Write your warning here",
         "id": "compose_form.spoiler_placeholder"
       },
       {
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index fe2bd4cb4..3a201b9c1 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Edit profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
@@ -45,7 +46,7 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive": "Mark media as sensitive",
   "compose_form.spoiler": "Hide text behind warning",
-  "compose_form.spoiler_placeholder": "Content warning",
+  "compose_form.spoiler_placeholder": "Write your warning here",
   "confirmation_modal.cancel": "Cancel",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 029cef883..0bb5159c8 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloki @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Redakti la profilon",
   "account.follow": "Sekvi",
   "account.followers": "Sekvantoj",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Malsekvi",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 36ad66ace..a39b608c6 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloquear",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Editar perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Dejar de seguir",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 113daef77..6842558d9 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,7 +1,7 @@
 {
   "account.block": "مسدودسازی @{name}",
   "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
-  "account.disclaimer": "این کاربر عضو سرور متفاوتی است. شاید عدد واقعی بیشتر از این باشد.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "ویرایش نمایه",
   "account.follow": "پی بگیرید",
   "account.followers": "پیگیران",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "رفع پنهان‌سازی از {domain}",
   "account.unfollow": "پایان پیگیری",
   "account.unmute": "باصدا کردن @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index da9e5d0f2..efc9b1053 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Estä @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Muokkaa",
   "account.follow": "Seuraa",
   "account.followers": "Seuraajia",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Lopeta seuraaminen",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index fc33052b1..3cc1f152a 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloquer",
   "account.block_domain": "Tout masquer de {domain}",
-  "account.disclaimer": "Ce compte est situé sur une autre instance. Les nombres peuvent être plus grands.",
+  "account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.",
   "account.edit_profile": "Modifier le profil",
   "account.follow": "Suivre",
   "account.followers": "Abonné⋅e⋅s",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Ne plus masquer {domain}",
   "account.unfollow": "Ne plus suivre",
   "account.unmute": "Ne plus masquer",
+"account.view_full_profile": "Afficher le profil complet",
   "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois",
   "bundle_column_error.body": "Une erreur s'est produite lors du chargement de ce composant.",
   "bundle_column_error.retry": "Réessayer",
@@ -41,11 +42,11 @@
   "compose_form.lock_disclaimer.lock": "verrouillé",
   "compose_form.placeholder": "Qu’avez-vous en tête ?",
   "compose_form.privacy_disclaimer": "Votre statut privé va être transmis aux personnes mentionnées sur {domains}. Avez-vous confiance en {domainsCount, plural, one {ce serveur} other {ces serveurs}} pour ne pas divulguer votre statut ? Les statuts privés ne fonctionnent que sur les instances de Mastodon. Si {domains} {domainsCount, plural, one {n’est pas une instance de Mastodon} other {ne sont pas des instances de Mastodon}}, il n’y aura aucune indication que votre statut est privé, et il pourrait être partagé ou rendu visible d’une autre manière à d’autres personnes imprévues.",
-  "compose_form.publish": "Pouet ",
+  "compose_form.publish": "Pouet ",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive": "Marquer le média comme délicat",
+  "compose_form.sensitive": "Marquer le média comme sensible",
   "compose_form.spoiler": "Masquer le texte derrière un avertissement",
-  "compose_form.spoiler_placeholder": "Avertissement",
+  "compose_form.spoiler_placeholder": "Écrivez ici votre avertissement",
   "confirmation_modal.cancel": "Annuler",
   "confirmations.block.confirm": "Bloquer",
   "confirmations.block.message": "Confirmez vous le blocage de {name} ?",
@@ -68,13 +69,13 @@
   "emoji_button.symbols": "Symboles",
   "emoji_button.travel": "Lieux et voyages",
   "empty_column.community": "Le fil public local est vide. Écrivez-donc quelque chose pour le remplir !",
-  "empty_column.hashtag": "Il n’y a encore aucun contenu relatif à ce hashtag",
+  "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag",
   "empty_column.home": "Vous ne suivez encore personne. Visitez {public} ou bien utilisez la recherche pour vous connecter à d’autres utilisateur⋅ice⋅s.",
   "empty_column.home.inactivity": "Votre accueil est vide. Si vous ne vous êtes pas connecté⋅e depuis un moment, il se remplira automatiquement très bientôt.",
   "empty_column.home.public_timeline": "le fil public",
   "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres utilisateur⋅ice⋅s pour débuter la conversation.",
   "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des utilisateur⋅ice⋅s d’autres instances pour remplir le fil public.",
-  "follow_request.authorize": "Autoriser",
+  "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
   "getting_started.appsshort": "Applications",
   "getting_started.faq": "FAQ",
@@ -126,8 +127,8 @@
   "onboarding.page_one.welcome": "Bienvenue sur Mastodon !",
   "onboarding.page_six.admin": "L’administrateur⋅trice de votre instance est {admin}",
   "onboarding.page_six.almost_done": "Nous y sommes presque…",
-  "onboarding.page_six.appetoot": "Bon Appetoot!",
-  "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appetoot!",
+  "onboarding.page_six.appetoot": "Bon Appétoot!",
+  "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appétoot!",
   "onboarding.page_six.github": "Mastodon est un logiciel libre, gratuit et open-source. Vous pouvez rapporter des bogues, suggérer des fonctionnalités, ou contribuer à son développement sur {github}.",
   "onboarding.page_six.guidelines": "règles de la communauté",
   "onboarding.page_six.read_guidelines": "S’il vous plaît, n’oubliez pas de lire les {guidelines} !",
@@ -151,7 +152,7 @@
   "report.target": "Signalement",
   "search.placeholder": "Rechercher",
   "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
-  "standalone.public_title": "Coup d'oeil",
+  "standalone.public_title": "Coup d'œil",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
   "status.delete": "Effacer",
   "status.favourite": "Ajouter aux favoris",
@@ -165,8 +166,8 @@
   "status.reply": "Répondre",
   "status.replyAll": "Répondre au fil",
   "status.report": "Signaler @{name}",
-  "status.sensitive_toggle": "Cliquer pour dévoiler",
-  "status.sensitive_warning": "Contenu délicat",
+  "status.sensitive_toggle": "Cliquer pour afficher",
+  "status.sensitive_warning": "Contenu sensible",
   "status.show_less": "Replier",
   "status.show_more": "Déplier",
   "status.unmute_conversation": "Ne plus masquer la conversation",
@@ -180,7 +181,7 @@
   "upload_form.undo": "Annuler",
   "upload_progress.label": "Envoi en cours…",
   "video_player.expand": "Agrandir la vidéo",
-  "video_player.toggle_sound": "Mettre/Couper le son",
+  "video_player.toggle_sound": "Activer/Désactiver le son",
   "video_player.toggle_visible": "Afficher/Cacher la vidéo",
   "video_player.video_error": "Erreur lors de la lecture de la vidéo"
 }
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index c8dc4fe8d..36be0842b 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -1,7 +1,7 @@
 {
   "account.block": "חסימת @{name}",
   "account.block_domain": "להסתיר הכל מהקהילה {domain}",
-  "account.disclaimer": "משתמש זה מגיע מקהילה אחרת. המספר הזה עשוי להיות גדול יותר.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "עריכת פרופיל",
   "account.follow": "מעקב",
   "account.followers": "עוקבים",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "הסר חסימה מקהילת {domain}",
   "account.unfollow": "הפסקת מעקב",
   "account.unmute": "הפסקת השתקת @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index fd669b2b2..363c4c490 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Sakrij sve sa {domain}",
-  "account.disclaimer": "Ovaj korisnik je sa druge instance. Ovaj broj bi mogao biti veći.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Uredi profil",
   "account.follow": "Slijedi",
   "account.followers": "Sljedbenici",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Otkrij {domain}",
   "account.unfollow": "Prestani slijediti",
   "account.unmute": "Poništi utišavanje @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Možeš pritisnuti {combo} kako bi ovo preskočio sljedeći put",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index b3672cb7a..d43570f0d 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokkolás",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Profil szerkesztése",
   "account.follow": "Követés",
   "account.followers": "Követők",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Követés abbahagyása",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 8a17262fe..916f313bb 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokir @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Pengguna ini berasal dari server lain. Angka berikut mungkin lebih besar.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Ubah profil",
   "account.follow": "Ikuti",
   "account.followers": "Pengikut",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Berhenti mengikuti",
   "account.unmute": "Berhenti membisukan @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 154ca66ce..a87cc9328 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokusar @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Ca uzero esas de altra instaluro. Ca nombro forsan esas plu granda.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Modifikar profilo",
   "account.follow": "Sequar",
   "account.followers": "Sequanti",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Ne plus sequar",
   "account.unmute": "Ne plus celar @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 6cb274bae..243ed7344 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blocca @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Questo utente si trova su un altro server. Questo numero potrebbe essere maggiore.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Modifica profilo",
   "account.follow": "Segui",
   "account.followers": "Seguaci",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Non seguire",
   "account.unmute": "Non silenziare @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 7fe27a092..ca36122f7 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -1,7 +1,7 @@
 {
   "account.block": "ブロック",
   "account.block_domain": "{domain}全体を非表示",
-  "account.disclaimer": "このユーザーは他のインスタンスに所属しているため、数字が正確で無い場合があります。",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "プロフィールを編集",
   "account.follow": "フォロー",
   "account.followers": "フォロワー",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "{domain}を表示",
   "account.unfollow": "フォロー解除",
   "account.unmute": "ミュート解除",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "次からは{combo}を押せば、これをスキップできます。",
   "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。",
   "bundle_column_error.retry": "再試行",
@@ -45,7 +46,7 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive": "メディアを閲覧注意としてマークする",
   "compose_form.spoiler": "テキストを隠す",
-  "compose_form.spoiler_placeholder": "警告",
+  "compose_form.spoiler_placeholder": "ここに警告を書いてください",
   "confirmation_modal.cancel": "キャンセル",
   "confirmations.block.confirm": "ブロック",
   "confirmations.block.message": "本当に{name}をブロックしますか?",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index fbd0098d7..768efa37d 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -1,7 +1,7 @@
 {
   "account.block": "차단",
   "account.block_domain": "{domain} 전체를 숨김",
-  "account.disclaimer": "이 사용자는 다른 인스턴스에 소속되어 있으므로, 수치가 정확하지 않을 수도 있습니다.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "프로필 편집",
   "account.follow": "팔로우",
   "account.followers": "팔로워",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "{domain} 숨김 해제",
   "account.unfollow": "팔로우 해제",
   "account.unmute": "뮤트 해제",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "다음부터 {combo}를 누르면 이 과정을 건너뛸 수 있습니다.",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index f7b0bbf68..fbfabc5d1 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokkeer @{name}",
   "account.block_domain": "Negeer alles van {domain}",
-  "account.disclaimer": "Deze gebruiker zit op een andere server. Dit getal kan hoger zijn.",
+  "account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.",
   "account.edit_profile": "Profiel bewerken",
   "account.follow": "Volgen",
   "account.followers": "Volgers",
@@ -17,13 +17,14 @@
   "account.unblock_domain": "{domain} niet meer negeren",
   "account.unfollow": "Ontvolgen",
   "account.unmute": "@{name} niet meer negeren",
+  "account.view_full_profile": "Volledig profiel tonen", 
   "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
+  "bundle_column_error.body": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
+  "bundle_column_error.retry": "Opnieuw proberen",
+  "bundle_column_error.title": "Netwerkfout",
+  "bundle_modal_error.close": "Sluiten",
+  "bundle_modal_error.message": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
+  "bundle_modal_error.retry": "Opnieuw proberen",
   "column.blocks": "Geblokkeerde gebruikers",
   "column.community": "Lokale tijdlijn",
   "column.favourites": "Favorieten",
@@ -43,20 +44,20 @@
   "compose_form.privacy_disclaimer": "Jouw privétoot wordt afgeleverd aan de vermelde gebruikers op {domains}. Vertrouw jij {domainsCount, plural, one {die server} other {die servers}}? Het privé plaatsen van toots werkt alleen op Mastodon-servers. Wanneer {domains} {domainsCount, plural, one {geen Mastodon-server is} other {geen Mastodon-servers zijn}}, dan wordt er niet aangegeven dat de toot privé is, waardoor het kan worden geboost of op een andere manier zichtbaar wordt gemaakt voor mensen waarvoor het niet was bedoeld.",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive": "Media als gevoelig markeren",
+  "compose_form.sensitive": "Media als gevoelig markeren (nsfw)",
   "compose_form.spoiler": "Tekst achter waarschuwing verbergen",
   "compose_form.spoiler_placeholder": "Waarschuwingstekst",
   "confirmation_modal.cancel": "Annuleren",
   "confirmations.block.confirm": "Blokkeren",
-  "confirmations.block.message": "Weet je zeker dat je {name} wilt blokkeren?",
+  "confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?",
   "confirmations.delete.confirm": "Verwijderen",
-  "confirmations.delete.message": "Weet je zeker dat je deze toot wilt verwijderen?",
+  "confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?",
   "confirmations.domain_block.confirm": "Negeer alles van deze server",
   "confirmations.domain_block.message": "Weet je het echt, echt zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gewenst.",
   "confirmations.mute.confirm": "Negeren",
-  "confirmations.mute.message": "Weet je zeker dat je {name} wilt negeren?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
+  "confirmations.unfollow.confirm": "Ontvolgen",
+  "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
   "emoji_button.activity": "Activiteiten",
   "emoji_button.flags": "Vlaggen",
   "emoji_button.food": "Eten en drinken",
@@ -67,7 +68,7 @@
   "emoji_button.search": "Zoeken...",
   "emoji_button.symbols": "Symbolen",
   "emoji_button.travel": "Reizen en plekken",
-  "empty_column.community": "De lokale tijdlijn is leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
+  "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
   "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
   "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.",
   "empty_column.home.inactivity": "Deze tijdlijn is leeg. Wanneer je een tijdje inactief bent geweest wordt deze snel opnieuw aangemaakt.",
@@ -106,13 +107,13 @@
   "notification.mention": "{name} vermeldde jou",
   "notification.reblog": "{name} boostte jouw toot",
   "notifications.clear": "Meldingen verwijderen",
-  "notifications.clear_confirmation": "Weet je zeker dat je al jouw meldingen wilt verwijderen?",
+  "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
   "notifications.column_settings.alert": "Desktopmeldingen",
   "notifications.column_settings.favourite": "Favorieten:",
   "notifications.column_settings.follow": "Nieuwe volgers:",
   "notifications.column_settings.mention": "Vermeldingen:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.push_meta": "This device",
+  "notifications.column_settings.push": "Pushmeldingen",
+  "notifications.column_settings.push_meta": "Dit apparaat",
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "In kolom tonen",
   "notifications.column_settings.sound": "Geluid afspelen",
@@ -146,12 +147,12 @@
   "privacy.unlisted.long": "Niet op openbare tijdlijnen tonen",
   "privacy.unlisted.short": "Minder openbaar",
   "reply_indicator.cancel": "Annuleren",
+  "report.heading": "Rapporteren",
   "report.placeholder": "Extra opmerkingen",
   "report.submit": "Verzenden",
   "report.target": "Rapporteren van",
   "search.placeholder": "Zoeken",
   "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
-  "standalone.public_title": "A look inside...",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
   "status.delete": "Verwijderen",
   "status.favourite": "Favoriet",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 98f59f774..8727f6147 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokkér @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
-  "account.disclaimer": "Denne brukeren er fra en annen instans. Dette tallet kan være høyere.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Rediger profil",
   "account.follow": "Følg",
   "account.followers": "Følgere",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Vis {domain}",
   "account.unfollow": "Avfølg",
   "account.unmute": "Avdemp @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index ca094c18a..c39d57333 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blocar @{name}",
   "account.block_domain": "Tot amagar del domeni {domain}",
-  "account.disclaimer": "Aqueste compte es sus una autra instància. Los nombres pòdon èsser mai grandes.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Modificar lo perfil",
   "account.follow": "Sègre",
   "account.followers": "Seguidors",
@@ -17,19 +17,20 @@
   "account.unblock_domain": "Desblocar {domain}",
   "account.unfollow": "Quitar de sègre",
   "account.unmute": "Quitar de rescondre @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
+  "bundle_column_error.body": "Quicòm a fach meuca pendent lo cargament d’aqueste compausant.",
+  "bundle_column_error.retry": "Tornar ensejar",
+  "bundle_column_error.title": "Error de ret",
+  "bundle_modal_error.close": "Tampar",
+  "bundle_modal_error.message": "Quicòm a fach meuca pendent lo cargament d’aqueste compausant.",
+  "bundle_modal_error.retry": "Tornar ensejar",
   "column.blocks": "Personas blocadas",
-  "column.community": "Flux d’actualitat public local",
+  "column.community": "Flux public local",
   "column.favourites": "Favorits",
   "column.follow_requests": "Demandas d’abonament",
   "column.home": "Acuèlh",
-  "column.mutes": "Personas mesas en silenci",
+  "column.mutes": "Personas en silenci",
   "column.notifications": "Notificacions",
   "column.public": "Flux public global",
   "column_back_button.label": "Tornar",
@@ -55,8 +56,8 @@
   "confirmations.domain_block.message": "Sètz segur segur de voler blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.",
   "confirmations.mute.confirm": "Metre en silenci",
   "confirmations.mute.message": "Sètz segur de voler metre en silenci {name} ?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "confirmations.unfollow.confirm": "Quitar de sègre",
+  "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?",
   "emoji_button.activity": "Activitat",
   "emoji_button.flags": "Drapèus",
   "emoji_button.food": "Beure e manjar",
@@ -69,7 +70,7 @@
   "emoji_button.travel": "Viatges & lòcs",
   "empty_column.community": "Lo flux public local es void. Escribètz quicòm per lo garnir !",
   "empty_column.hashtag": "I a pas encara de contengut ligat a aqueste hashtag",
-  "empty_column.home": "Pel moment segètz pas segun. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.",
+  "empty_column.home": "Pel moment segètz pas degun. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.",
   "empty_column.home.inactivity": "Vòstra pagina d’acuèlh es voida. Se sètz estat inactiu per un moment, serà tornada generar per vos dins una estona.",
   "empty_column.home.public_timeline": "lo flux public",
   "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.",
@@ -111,8 +112,8 @@
   "notifications.column_settings.favourite": "Favorits :",
   "notifications.column_settings.follow": "Nòus seguidors :",
   "notifications.column_settings.mention": "Mencions :",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.push_meta": "This device",
+  "notifications.column_settings.push": "Notificacions",
+  "notifications.column_settings.push_meta": "Aqueste periferic",
   "notifications.column_settings.reblog": "Partatges :",
   "notifications.column_settings.show": "Mostrar dins la colomna",
   "notifications.column_settings.sound": "Emetre un son",
@@ -125,7 +126,7 @@
   "onboarding.page_one.handle": "Sètz sus {domain}, doncas vòstre identificant complet es {handle}",
   "onboarding.page_one.welcome": "Benvengut a Mastodon !",
   "onboarding.page_six.admin": "Vòstre administrator d’instància es {admin}.",
-  "onboarding.page_six.almost_done": "Gaireben acabat...",
+  "onboarding.page_six.almost_done": "Gaireben acabat…",
   "onboarding.page_six.appetoot": "Bon Appetoot!",
   "onboarding.page_six.apps_available": "I a d’aplicacions per mobil per iOS, Android e mai.",
   "onboarding.page_six.github": "Mastodon es un logicial liure e open-source.  Podètz senhalar de bugs, demandar de foncionalitats e contribuir al còdi sus {github}.",
@@ -151,14 +152,14 @@
   "report.target": "Senhalar {target}",
   "search.placeholder": "Recercar",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
-  "standalone.public_title": "A look inside...",
+  "standalone.public_title": "Una ulhada dedins…",
   "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
   "status.delete": "Escafar",
   "status.favourite": "Apondre als favorits",
   "status.load_more": "Cargar mai",
   "status.media_hidden": "Mèdia rescondut",
   "status.mention": "Mencionar",
-  "status.mute_conversation": "Mute conversation",
+  "status.mute_conversation": "Rescondre la conversacion",
   "status.open": "Desplegar aqueste estatut",
   "status.reblog": "Partejar",
   "status.reblogged_by": "{name} a partejat :",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 348984648..af069b6d7 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Blokuj wszystko z {domain}",
-  "account.disclaimer": "Ten użytkownik pochodzi z innej instancji. Ta liczba może być większa.",
+  "account.disclaimer_full": "Poniższe informacje mogą nie odwzorowywać bezbłędnie profilu użytkownika.",
   "account.edit_profile": "Edytuj profil",
   "account.follow": "Śledź",
   "account.followers": "Śledzący",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Odblokuj domenę {domain}",
   "account.unfollow": "Przestań śledzić",
   "account.unmute": "Cofnij wyciszenie @{name}",
+  "account.view_full_profile": "Wyświetl pełny profil",
   "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
   "bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.",
   "bundle_column_error.retry": "Spróbuj ponownie",
@@ -45,7 +46,7 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive": "Oznacz treści jako wrażliwe",
   "compose_form.spoiler": "Ukryj tekst za ostrzeżeniem",
-  "compose_form.spoiler_placeholder": "Ostrzeżenie o zawartości",
+  "compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości",
   "confirmation_modal.cancel": "Anuluj",
   "confirmations.block.confirm": "Zablokuj",
   "confirmations.block.message": "Czy na pewno chcesz zablokować {name}?",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 3944e33e9..86da7c4e6 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Editar perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Não silenciar @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index 3944e33e9..86da7c4e6 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Editar perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Não silenciar @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index cffc285f4..16af3fe7e 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Блокировать",
   "account.block_domain": "Блокировать все с {domain}",
-  "account.disclaimer": "Это пользователь с другого узла. Число может быть больше.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Изменить профиль",
   "account.follow": "Подписаться",
   "account.followers": "Подписаны",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Разблокировать {domain}",
   "account.unfollow": "Отписаться",
   "account.unmute": "Снять глушение",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Нажмите {combo}, чтобы пропустить это в следующий раз",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
@@ -45,7 +46,7 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive": "Отметить как чувствительный контент",
   "compose_form.spoiler": "Скрыть текст за предупреждением",
-  "compose_form.spoiler_placeholder": "Предупреждение о скрытом тексте",
+  "compose_form.spoiler_placeholder": "Напишите свое предупреждение здесь",
   "confirmation_modal.cancel": "Отмена",
   "confirmations.block.confirm": "Заблокировать",
   "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 63bed6d8c..be5c0815d 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "This user is from another instance. This number may be larger.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Edit profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 5bd308e95..9d4d5fa17 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Engelle @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "Bu kullanıcının hesabı farklı sunucuda bulunduğu için bu sayı daha fazla olabilir.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Profili düzenle",
   "account.follow": "Takip et",
   "account.followers": "Takipçiler",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "Takipten vazgeç",
   "account.unmute": "Sesi aç @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Bir dahaki sefere {combo} tuşuna basabilirsiniz",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index e1611505d..60a551bb6 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -1,7 +1,7 @@
 {
   "account.block": "Заблокувати",
   "account.block_domain": "Заглушити {domain}",
-  "account.disclaimer": "Це користувач з іншої інстанції. Число може бути більше.",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "Налаштування профілю",
   "account.follow": "Підписатися",
   "account.followers": "Підписники",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Розблокувати {domain}",
   "account.unfollow": "Відписатися",
   "account.unmute": "Зняти глушення",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 18bf872e5..97f1f5e27 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -1,7 +1,7 @@
 {
   "account.block": "屏蔽 @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "由于这个账户处于另一个服务器实例上,实际数字会比这个更多。",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "修改个人资料",
   "account.follow": "关注",
   "account.followers": "关注者",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "取消关注",
   "account.unmute": "取消 @{name} 的静音",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "如你想在下次路过时显示,请按{combo},",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index a461085c7..c65c3d45c 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -1,7 +1,7 @@
 {
   "account.block": "封鎖 @{name}",
   "account.block_domain": "Hide everything from {domain}",
-  "account.disclaimer": "由於這個用戶在另一個服務站,實際數字會比這個更多。",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "修改個人資料",
   "account.follow": "關注",
   "account.followers": "關注的人",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "Unhide {domain}",
   "account.unfollow": "取消關注",
   "account.unmute": "取消 @{name} 的靜音",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "如你想在下次路過這顯示,請按{combo},",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index d766fb394..12e840b16 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,7 +1,7 @@
 {
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的一切",
-  "account.disclaimer": "這使用者來自其他副本,實際數字可能更大。",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.edit_profile": "編輯用戶資訊",
   "account.follow": "關注",
   "account.followers": "專注者",
@@ -17,6 +17,7 @@
   "account.unblock_domain": "不再隱藏 {domain}",
   "account.unfollow": "取消關注",
   "account.unmute": "不再消音 @{name}",
+  "account.view_full_profile": "View full profile",
   "boost_modal.combo": "下次你可以按 {combo} 來跳過",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Try again",
diff --git a/app/javascript/mastodon/web_push_subscription.js b/app/javascript/mastodon/web_push_subscription.js
index 391d3bcec..96ac63b52 100644
--- a/app/javascript/mastodon/web_push_subscription.js
+++ b/app/javascript/mastodon/web_push_subscription.js
@@ -37,7 +37,7 @@ const unsubscribe = ({ registration, subscription }) =>
 
 const sendSubscriptionToBackend = (subscription) =>
   axios.post('/api/web/push_subscriptions', {
-    data: subscription,
+    subscription,
   }).then(response => response.data);
 
 // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload
diff --git a/app/javascript/styles/about.scss b/app/javascript/styles/about.scss
index 687c12fac..af1d45a09 100644
--- a/app/javascript/styles/about.scss
+++ b/app/javascript/styles/about.scss
@@ -120,18 +120,55 @@
 }
 
 .information-board {
-  margin: 20px 0;
-  display: flex;
-  justify-content: space-between;
-  border-top: 1px solid lighten($ui-base-color, 10%);
-  border-bottom: 1px solid lighten($ui-base-color, 10%);
-  padding-right: 14px;
+  background: darken($ui-base-color, 4%);
+  padding: 40px 0;
+
+  .panel {
+    position: absolute;
+    width: 280px;
+    box-sizing: border-box;
+    background: darken($ui-base-color, 8%);
+    padding: 20px;
+    padding-top: 10px;
+    border-radius: 4px 4px 0 0;
+    right: 0;
+    bottom: -40px;
+
+    .panel-header {
+      font-family: 'mastodon-font-display', sans-serif;
+      font-size: 14px;
+      line-height: 24px;
+      font-weight: 500;
+      color: $ui-base-lighter-color;
+      padding-bottom: 5px;
+      margin-bottom: 15px;
+      border-bottom: 1px solid lighten($ui-base-color, 4%);
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      overflow: hidden;
+
+      span {
+        font-weight: 400;
+        color: lighten($ui-base-color, 34%);
+      }
+    }
+  }
+
+  .container {
+    position: relative;
+    padding-right: 280px + 15px;
+  }
+
+  .information-board-sections {
+    display: flex;
+    justify-content: space-between;
+  }
 
   .section {
     flex: 1 0 0;
-    padding: 14px;
-    text-align: right;
     font: 16px/28px 'mastodon-font-sans-serif', sans-serif;
+    text-align: right;
+    padding: 0 15px;
 
     span,
     strong {
@@ -143,7 +180,6 @@
 
       &:last-child {
         color: $ui-secondary-color;
-        font-size: 14px;
       }
     }
 
@@ -201,100 +237,6 @@
   }
 }
 
-.contact-email {
-  text-align: center;
-  margin: 40px 0;
-
-  strong {
-    display: block;
-    color: $primary-text-color;
-    word-break: break-word;
-  }
-}
-
-.sidebar-layout {
-  display: flex;
-
-  .main {
-    flex: 1 1 auto;
-    padding: 14px 0;
-
-    .panel {
-      padding-right: 14px;
-    }
-  }
-
-  .sidebar {
-    border-left: 1px solid lighten($ui-base-color, 10%);
-    width: 200px;
-    flex: 0 0 auto;
-  }
-
-  .panel {
-    .panel-header {
-      background: lighten($ui-base-color, 10%);
-      padding: 7px 14px;
-      text-transform: uppercase;
-      font-size: 12px;
-      font-weight: 500;
-    }
-
-    .panel-body {
-      padding: 14px;
-    }
-
-    .panel-list {
-      ul {
-        list-style: none;
-        margin: 0;
-
-        li {
-          margin: 0;
-          font-family: inherit;
-          font-size: 13px;
-          line-height: 18px;
-
-          a {
-            display: block;
-            padding: 7px 14px;
-            color: rgba($primary-text-color, 0.7);
-            text-decoration: none;
-            transition: all 200ms linear;
-
-            i.fa {
-              margin-right: 5px;
-            }
-
-            &:hover {
-              color: $primary-text-color;
-              background-color: darken($ui-base-color, 5%);
-              transition: all 100ms linear;
-            }
-
-            &.selected {
-              color: $primary-text-color;
-              background-color: $ui-highlight-color;
-
-              &:hover {
-                background-color: lighten($ui-highlight-color, 5%);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  @media screen and (max-width: 625px) {
-    flex-direction: column;
-
-    .sidebar {
-      border: 1px solid lighten($ui-base-color, 10%);
-      width: auto;
-    }
-  }
-}
-
 .features-list__row {
   display: flex;
   padding: 10px 0;
@@ -320,7 +262,7 @@
   .text {
     font-size: 16px;
     line-height: 30px;
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
 
     h6 {
       font-weight: 500;
@@ -336,6 +278,15 @@
     background: linear-gradient(150deg, lighten($ui-base-color, 8%), $ui-base-color);
     position: relative;
 
+    &.compact {
+      background: $ui-base-color;
+      padding-bottom: 15px;
+
+      .hero .heading {
+        padding-bottom: 30px;
+      }
+    }
+
     .mascot-container {
       max-width: 800px;
       margin: 0 auto;
@@ -388,10 +339,9 @@
           position: absolute;
           transition: all 0.1s linear;
           animation-name: floating;
-          animation-duration: 1.7s;
           animation-iteration-count: infinite;
           animation-direction: alternate;
-          animation-timing-function: linear;
+          animation-timing-function: ease-in-out;
           z-index: 2;
         }
 
@@ -400,7 +350,8 @@
           height: 170px;
           right: -120px;
           bottom: 0;
-          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 447.1875 234.375" height="170" width="324"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M21.69 233.366c-6.45-1.268-13.347-5.63-16.704-10.564-10.705-15.734-1.513-37.724 18.632-44.57l4.8-1.632.173-17.753c.146-14.77.515-19.063 2.2-25.55 6.736-25.944 24.46-46.032 47.766-54.137 11.913-4.143 19.558-5.366 34.178-5.47l13.828-.096V71.12c0-4.755 2.853-17.457 5.238-23.327 8.588-21.137 26.735-35.957 52.153-42.593 23.248-6.07 50.153-6.415 71.863-.923 11.14 2.82 25.686 9.957 33.857 16.615 19.335 15.756 31.82 41.05 35.183 71.275.59 5.305.672 5.435 3.11 4.926 11.833-2.474 30.4-3.132 40.065-1.42 24.388 4.32 40.568 19.076 47.214 43.058 2.16 7.8 3.953 23.894 3.59 32.237l-.24 5.498 5.156 1.317c6.392 1.633 14.55 7.098 18.003 12.062 1.435 2.062 3.305 6.597 4.156 10.078 1.428 5.84 1.43 6.8.04 12.44-1.807 7.318-5.672 13.252-10.872 16.694-8.508 5.63 3.756 5.33-211.916 5.216-108.56-.056-199.22-.464-201.47-.906z"/></svg>');
+          animation-duration: 3s;
+          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 447.1875 234.375" height="170" width="324"><path fill="#{hex-color($ui-base-lighter-color)}" d="M21.69 233.366c-6.45-1.268-13.347-5.63-16.704-10.564-10.705-15.734-1.513-37.724 18.632-44.57l4.8-1.632.173-17.753c.146-14.77.515-19.063 2.2-25.55 6.736-25.944 24.46-46.032 47.766-54.137 11.913-4.143 19.558-5.366 34.178-5.47l13.828-.096V71.12c0-4.755 2.853-17.457 5.238-23.327 8.588-21.137 26.735-35.957 52.153-42.593 23.248-6.07 50.153-6.415 71.863-.923 11.14 2.82 25.686 9.957 33.857 16.615 19.335 15.756 31.82 41.05 35.183 71.275.59 5.305.672 5.435 3.11 4.926 11.833-2.474 30.4-3.132 40.065-1.42 24.388 4.32 40.568 19.076 47.214 43.058 2.16 7.8 3.953 23.894 3.59 32.237l-.24 5.498 5.156 1.317c6.392 1.633 14.55 7.098 18.003 12.062 1.435 2.062 3.305 6.597 4.156 10.078 1.428 5.84 1.43 6.8.04 12.44-1.807 7.318-5.672 13.252-10.872 16.694-8.508 5.63 3.756 5.33-211.916 5.216-108.56-.056-199.22-.464-201.47-.906z"/></svg>');
         }
 
         .float-2 {
@@ -408,8 +359,9 @@
           height: 100px;
           right: 210px;
           bottom: 0;
+          animation-duration: 3.5s;
           animation-delay: 0.2s;
-          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 536.25 222.1875" height="100" width="241"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M42.626 221.23c-14.104-1.174-26.442-5.133-32.825-10.534-4.194-3.548-7.684-10.66-8.868-18.075-1.934-12.102.633-22.265 7.528-29.81 7.61-8.328 19.998-12.76 39.855-14.257l8.47-.638-2.08-6.223c-4.826-14.422-6.357-24.813-6.37-43.255-.012-14.923.28-18.513 2.1-25.724 2.283-9.048 8.483-23.034 13.345-30.1 14.76-21.45 43.505-38.425 70.535-41.65 30.628-3.655 64.47 12.073 89.668 41.673l5.955 6.995 2.765-4.174c1.52-2.296 5.74-6.93 9.376-10.295 18.382-17.02 43.436-20.676 73.352-10.705 12.158 4.052 21.315 9.53 29.64 17.733 12.752 12.562 18.16 25.718 18.19 44.26l.02 10.98 2.312-3.01c15.64-20.365 42.29-20.485 62.438-.28 3.644 3.653 7.558 8.593 8.697 10.976 4.895 10.24 5.932 25.688 2.486 37.046-.76 2.507-1.388 4.816-1.393 5.13-.006.316 6.845.87 15.224 1.234 53.06 2.297 76.356 12.98 81.817 37.526 3.554 15.973-3.71 28.604-19.566 34.02-4.554 1.555-17.922 1.655-234.517 1.757-126.327.06-233.497-.21-238.154-.597z"/></svg>');
+          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 536.25 222.1875" height="100" width="241"><path fill="#{hex-color($ui-base-lighter-color)}" d="M42.626 221.23c-14.104-1.174-26.442-5.133-32.825-10.534-4.194-3.548-7.684-10.66-8.868-18.075-1.934-12.102.633-22.265 7.528-29.81 7.61-8.328 19.998-12.76 39.855-14.257l8.47-.638-2.08-6.223c-4.826-14.422-6.357-24.813-6.37-43.255-.012-14.923.28-18.513 2.1-25.724 2.283-9.048 8.483-23.034 13.345-30.1 14.76-21.45 43.505-38.425 70.535-41.65 30.628-3.655 64.47 12.073 89.668 41.673l5.955 6.995 2.765-4.174c1.52-2.296 5.74-6.93 9.376-10.295 18.382-17.02 43.436-20.676 73.352-10.705 12.158 4.052 21.315 9.53 29.64 17.733 12.752 12.562 18.16 25.718 18.19 44.26l.02 10.98 2.312-3.01c15.64-20.365 42.29-20.485 62.438-.28 3.644 3.653 7.558 8.593 8.697 10.976 4.895 10.24 5.932 25.688 2.486 37.046-.76 2.507-1.388 4.816-1.393 5.13-.006.316 6.845.87 15.224 1.234 53.06 2.297 76.356 12.98 81.817 37.526 3.554 15.973-3.71 28.604-19.566 34.02-4.554 1.555-17.922 1.655-234.517 1.757-126.327.06-233.497-.21-238.154-.597z"/></svg>');
         }
 
         .float-3 {
@@ -417,8 +369,9 @@
           height: 140px;
           right: 110px;
           top: -30px;
-          animation-delay: 0.1s;
-          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 388.125 202.5" height="140" width="267"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M181.37 201.458c-17.184-1.81-36.762-8.944-49.523-18.05l-5.774-4.12-8.074 2.63c-11.468 3.738-21.382 4.962-35.815 4.422-14.79-.554-24.577-2.845-36.716-8.594-15.483-7.332-28.498-19.98-35.985-34.968C2.44 128.675-.94 108.435.9 91.356c3.362-31.234 18.197-53.698 43.63-66.074 12.803-6.23 22.384-8.55 37.655-9.122 14.433-.54 24.347.684 35.814 4.42l8.073 2.633 5.635-4.01c24.81-17.656 60.007-23.332 92.914-14.985 10.11 2.565 25.498 9.62 33.102 15.178l5.068 3.704 7.632-2.564c10.89-3.66 21.086-4.916 35.516-4.376 45.816 1.716 76.422 30.03 81.285 75.196 1.84 17.08-1.54 37.32-8.585 51.422-7.487 14.99-20.502 27.636-35.984 34.968-12.14 5.75-21.926 8.04-36.716 8.593-14.43.54-24.626-.716-35.516-4.376l-7.632-2.564-5.068 3.704c-12.844 9.387-32.714 16.488-51.545 18.42-10.607 1.09-13.916 1.08-24.81-.066z"/></svg>');
+          animation-duration: 4s;
+          animation-delay: 0.5s;
+          background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 388.125 202.5" height="140" width="267"><path fill="#{hex-color($ui-base-lighter-color)}" d="M181.37 201.458c-17.184-1.81-36.762-8.944-49.523-18.05l-5.774-4.12-8.074 2.63c-11.468 3.738-21.382 4.962-35.815 4.422-14.79-.554-24.577-2.845-36.716-8.594-15.483-7.332-28.498-19.98-35.985-34.968C2.44 128.675-.94 108.435.9 91.356c3.362-31.234 18.197-53.698 43.63-66.074 12.803-6.23 22.384-8.55 37.655-9.122 14.433-.54 24.347.684 35.814 4.42l8.073 2.633 5.635-4.01c24.81-17.656 60.007-23.332 92.914-14.985 10.11 2.565 25.498 9.62 33.102 15.178l5.068 3.704 7.632-2.564c10.89-3.66 21.086-4.916 35.516-4.376 45.816 1.716 76.422 30.03 81.285 75.196 1.84 17.08-1.54 37.32-8.585 51.422-7.487 14.99-20.502 27.636-35.984 34.968-12.14 5.75-21.926 8.04-36.716 8.593-14.43.54-24.626-.716-35.516-4.376l-7.632-2.564-5.068 3.704c-12.844 9.387-32.714 16.488-51.545 18.42-10.607 1.09-13.916 1.08-24.81-.066z"/></svg>');
         }
       }
 
@@ -500,13 +453,15 @@
       .brand {
         a {
           padding-left: 0;
+          padding-right: 0;
           color: $white;
         }
 
         img {
-          width: 32px;
           height: 32px;
-          margin-right: 10px;
+          position: relative;
+          top: 4px;
+          left: -10px;
         }
       }
     }
@@ -530,6 +485,42 @@
     padding: 50px 0;
   }
 
+  .extended-description {
+    padding: 50px 0;
+
+    ul,
+    ol {
+      list-style: inherit;
+      margin-left: 20px;
+
+      &[type='a'] {
+        list-style-type: lower-alpha;
+      }
+
+      &[type='i'] {
+        list-style-type: lower-roman;
+      }
+    }
+
+    li > ol,
+    li > ul {
+      margin-top: 20px;
+    }
+
+    p,
+    li {
+      font: 16px/28px 'mastodon-font-sans-serif', sans-serif;
+      font-weight: 400;
+      margin-bottom: 12px;
+      color: $ui-base-lighter-color;
+
+      a {
+        color: $ui-highlight-color;
+        text-decoration: underline;
+      }
+    }
+  }
+
   h3 {
     font-family: 'mastodon-font-display', sans-serif;
     font-size: 16px;
@@ -542,7 +533,7 @@
   p {
     font-size: 16px;
     line-height: 30px;
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 
   .features {
@@ -584,6 +575,11 @@
       line-height: inherit;
       font-weight: inherit;
       color: $primary-text-color;
+      margin-bottom: 20px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
 
       a {
         color: $ui-secondary-color;
@@ -629,14 +625,14 @@
       display: block;
       font-size: 18px;
       font-weight: 400;
-      color: lighten($ui-base-color, 26%);
+      color: $ui-base-lighter-color;
     }
   }
 
   .footer-links {
     padding-bottom: 50px;
     text-align: right;
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
 
     p {
       font-size: 14px;
@@ -653,6 +649,29 @@
       padding: 0 20px;
     }
 
+    .information-board {
+      padding-bottom: 20px;
+    }
+
+    .information-board .container {
+      padding-right: 20px;
+
+      .panel {
+        position: static;
+        margin-top: 30px;
+        width: 100%;
+        border-radius: 4px;
+
+        .panel-header {
+          text-align: center;
+        }
+      }
+    }
+
+    .information-board .section {
+      text-align: center;
+    }
+
     .header-wrapper .mascot {
       left: 20px;
     }
@@ -700,10 +719,25 @@
         text-align: center;
       }
 
+      .nav {
+        display: flex;
+        flex-flow: row wrap;
+        justify-content: space-around;
+      }
+
+      .links a {
+        padding: 12px 8px;
+      }
+
       .heading h1 {
         padding: 30px 0;
       }
 
+      .links .brand img {
+        left: 0;
+        top: 0;
+      }
+
       .hero {
         .simple_form,
         .closed-registrations-message {
diff --git a/app/javascript/styles/boost.scss b/app/javascript/styles/boost.scss
index e44df2ea4..bcd97359a 100644
--- a/app/javascript/styles/boost.scss
+++ b/app/javascript/styles/boost.scss
@@ -6,7 +6,7 @@
 }
 
 button.icon-button i.fa-retweet {
-  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color(lighten($ui-base-color, 26%))}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-highlight-color)}' stroke-width='0'/></svg>");
+  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-base-lighter-color)}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-highlight-color)}' stroke-width='0'/></svg>");
 
   &:hover {
     background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color(lighten($ui-base-color, 33%))}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-highlight-color)}' stroke-width='0'/></svg>");
diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss
index 43df263d5..9e5d34f53 100644
--- a/app/javascript/styles/components.scss
+++ b/app/javascript/styles/components.scss
@@ -107,7 +107,7 @@
 .icon-button {
   display: inline-block;
   padding: 0;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   border: none;
   background: transparent;
   cursor: pointer;
@@ -145,7 +145,7 @@
     &:hover,
     &:active,
     &:focus {
-      color: lighten($ui-base-color, 26%);
+      color: $ui-base-lighter-color;
     }
 
     &.active {
@@ -185,7 +185,7 @@
   &:hover,
   &:active,
   &:focus {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
     transition: color 200ms ease-out;
   }
 
@@ -807,7 +807,7 @@
   margin-left: auto;
   padding-left: 18px;
   width: 120px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   font-size: 14px;
   text-align: right;
   white-space: nowrap;
@@ -816,7 +816,7 @@
 }
 
 .status__display-name {
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
 }
 
 .status__info .status__display-name {
@@ -865,13 +865,13 @@
 
 .status__prepend {
   margin: -10px 0 10px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   padding: 8px 0 2px;
   font-size: 14px;
   position: relative;
 
   .status__display-name strong {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 }
 
@@ -963,7 +963,7 @@
 
 .detailed-status__meta {
   margin-top: 15px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   font-size: 14px;
   line-height: 18px;
 }
@@ -1096,6 +1096,28 @@
   }
 }
 
+.account__disclaimer {
+  padding: 10px;
+  border-top: 1px solid lighten($ui-base-color, 8%);
+  color: $ui-base-lighter-color;
+
+  strong {
+    font-weight: 500;
+  }
+
+  a {
+    font-weight: 500;
+    color: inherit;
+    text-decoration: underline;
+
+    &:hover,
+    &:focus,
+    &:active {
+      text-decoration: none;
+    }
+  }
+}
+
 .account__header__content {
   color: $ui-primary-color;
   font-size: 14px;
@@ -1238,7 +1260,7 @@
   }
 
   abbr {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 }
 
@@ -1332,11 +1354,11 @@
 .muted {
   .status__content p,
   .status__content a {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 
   .status__display-name strong {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 
   .status__avatar, .emojione {
@@ -1344,7 +1366,7 @@
   }
 
   a.status__content__spoiler-link {
-    background: lighten($ui-base-color, 26%);
+    background: $ui-base-lighter-color;
     color: lighten($ui-base-color, 4%);
 
     &:hover {
@@ -1560,7 +1582,7 @@
 .static-content {
   padding: 10px;
   padding-top: 20px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
 
   h1 {
     font-size: 16px;
@@ -2041,7 +2063,7 @@
 
 .column-subheading {
   background: $ui-base-color;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   padding: 8px 20px;
   font-size: 12px;
   font-weight: 500;
@@ -2161,7 +2183,7 @@
 
 .getting-started__wrapper {
   position: relative;
-  flex: 0 0 auto;
+  overflow-y: auto;
 }
 
 .getting-started__footer {
@@ -2180,7 +2202,7 @@
   }
 
   a {
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
   }
 }
 
@@ -2244,7 +2266,7 @@ button.icon-button.active i.fa-retweet {
   font-size: 14px;
   border: 1px solid lighten($ui-base-color, 8%);
   border-radius: 4px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   margin-top: 14px;
   text-decoration: none;
   overflow: hidden;
@@ -2339,7 +2361,7 @@ button.icon-button.active i.fa-retweet {
 
 .load-more {
   display: block;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   background-color: transparent;
   border: 0;
   font-size: inherit;
@@ -2529,11 +2551,72 @@ button.icon-button.active i.fa-retweet {
 }
 
 .loading-indicator {
-  color: $ui-secondary-color;
-  font-size: 16px;
-  font-weight: 500;
-  padding-top: 120px;
-  text-align: center;
+  color: lighten($ui-base-color, 26%);
+  font-size: 12px;
+  font-weight: 400;
+  text-transform: uppercase;
+  overflow: visible;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+
+  span {
+    display: block;
+    float: left;
+    margin-left: 50%;
+    transform: translateX(-50%);
+    margin: 82px 0 0 50%;
+    white-space: nowrap;
+    animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+}
+
+.loading-indicator__figure {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: 0;
+  height: 0;
+  box-sizing: border-box;
+  border: 0 solid lighten($ui-base-color, 26%);
+  border-radius: 50%;
+  animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
+}
+
+@keyframes loader-figure {
+  0% {
+    width: 0;
+    height: 0;
+    background-color: lighten($ui-base-color, 26%);
+  }
+
+  29% {
+    background-color: lighten($ui-base-color, 26%);
+  }
+
+  30% {
+    width: 42px;
+    height: 42px;
+    background-color: transparent;
+    border-width: 21px;
+    opacity: 1;
+  }
+
+  100% {
+    width: 42px;
+    height: 42px;
+    border-width: 0;
+    opacity: 0;
+    background-color: transparent;
+  }
+}
+
+@keyframes loader-label {
+  0% { opacity: 0.25; }
+  30% { opacity: 1; }
+  100% { opacity: 0.25; }
 }
 
 .video-error-cover {
@@ -2987,13 +3070,13 @@ button.icon-button.active i.fa-retweet {
   color: $ui-secondary-color;
   font-size: 18px;
   font-weight: 500;
-  border: 2px dashed lighten($ui-base-color, 26%);
+  border: 2px dashed $ui-base-lighter-color;
   border-radius: 4px;
 }
 
 .upload-progress {
   padding: 10px;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   overflow: hidden;
   display: flex;
 
@@ -3018,7 +3101,7 @@ button.icon-button.active i.fa-retweet {
   width: 100%;
   height: 6px;
   border-radius: 6px;
-  background: lighten($ui-base-color, 26%);
+  background: $ui-base-lighter-color;
   position: relative;
   margin-top: 5px;
 }
@@ -3303,7 +3386,7 @@ button.icon-button.active i.fa-retweet {
 }
 
 .search-results__header {
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   background: lighten($ui-base-color, 2%);
   border-bottom: 1px solid darken($ui-base-color, 4%);
   padding: 15px 10px;
@@ -3399,6 +3482,10 @@ button.icon-button.active i.fa-retweet {
   }
 }
 
+.media-modal__content {
+  background: $base-overlay-background;
+}
+
 .media-modal__close {
   position: absolute;
   right: 4px;
@@ -3897,7 +3984,7 @@ button.icon-button.active i.fa-retweet {
 
 .attachment-list__icon {
   flex: 0 0 auto;
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   padding: 8px 18px;
   cursor: default;
   border-right: 1px solid lighten($ui-base-color, 8%);
@@ -3927,7 +4014,7 @@ button.icon-button.active i.fa-retweet {
 
   a {
     text-decoration: none;
-    color: lighten($ui-base-color, 26%);
+    color: $ui-base-lighter-color;
     font-weight: 500;
 
     &:hover {
@@ -4124,7 +4211,7 @@ button.icon-button.active i.fa-retweet {
 }
 
 .account-section-headline {
-  color: lighten($ui-base-color, 26%);
+  color: $ui-base-lighter-color;
   background: lighten($ui-base-color, 2%);
   border-bottom: 1px solid lighten($ui-base-color, 4%);
   padding: 15px 10px;
@@ -4160,12 +4247,26 @@ button.icon-button.active i.fa-retweet {
 noscript {
   text-align: center;
 
+  img {
+    width: 200px;
+    opacity: 0.5;
+    animation: flicker 4s infinite;
+  }
+
   div {
-    font-size: 20px;
-    margin: 20px 0;
+    font-size: 14px;
+    margin: 30px auto;
+    color: $ui-secondary-color;
+    max-width: 400px;
   }
 }
 
+@keyframes flicker {
+  0% { opacity: 1; }
+  30% { opacity: 0.75; }
+  100% { opacity: 1; }
+}
+
 @media screen and (max-width: 1024px) and (max-height: 400px) {
   $duration: 400ms;
   $delay: 100ms;
diff --git a/app/javascript/styles/containers.scss b/app/javascript/styles/containers.scss
index 44d4c1118..7dcf2c006 100644
--- a/app/javascript/styles/containers.scss
+++ b/app/javascript/styles/containers.scss
@@ -23,8 +23,7 @@
     align-items: center;
 
     img {
-      width: 32px;
-      height: 32px;
+      height: 42px;
       margin-right: 10px;
     }
 
diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss
index c467aa7db..cffb6f197 100644
--- a/app/javascript/styles/forms.scss
+++ b/app/javascript/styles/forms.scss
@@ -32,7 +32,7 @@ code {
       line-height: 18px;
       margin-top: 15px;
       margin-bottom: 0;
-      color: lighten($ui-base-color, 26%);
+      color: $ui-base-lighter-color;
 
       a {
         color: $ui-primary-color;
@@ -308,7 +308,7 @@ code {
       padding: 7px 4px;
       padding-bottom: 9px;
       font-size: 16px;
-      color: lighten($ui-base-color, 26%);
+      color: $ui-base-lighter-color;
       font-family: inherit;
       pointer-events: none;
       cursor: default;
diff --git a/app/javascript/styles/stream_entries.scss b/app/javascript/styles/stream_entries.scss
index a9111d7c9..baacb4913 100644
--- a/app/javascript/styles/stream_entries.scss
+++ b/app/javascript/styles/stream_entries.scss
@@ -36,6 +36,18 @@
     }
   }
 
+  &.with-header {
+    .entry {
+      &:first-child {
+        &,
+        .detailed-status.light,
+        .status.light {
+          border-radius: 0;
+        }
+      }
+    }
+  }
+
   .status.light {
     padding: 14px 14px 14px (48px + 14px * 2);
     position: relative;
@@ -247,7 +259,9 @@
     border: medium none;
     display: block;
     flex: 1 1 auto;
+    width: 100%;
     height: 100%;
+    overflow: hidden;
     margin-right: 2px;
 
     &:last-child {
diff --git a/app/javascript/styles/variables.scss b/app/javascript/styles/variables.scss
index bf8c12bc0..090706ff5 100644
--- a/app/javascript/styles/variables.scss
+++ b/app/javascript/styles/variables.scss
@@ -22,10 +22,11 @@ $valid-value-color: $success-green !default;
 $error-value-color: $error-red !default;
 
 // Tell UI to use selected colors
-$ui-base-color: $classic-base-color !default;             // Darkest
-$ui-primary-color: $classic-primary-color !default;       // Lighter
-$ui-secondary-color: $classic-secondary-color !default;   // Lightest
-$ui-highlight-color: $classic-highlight-color !default;   // Vibrant
+$ui-base-color: $classic-base-color !default;                  // Darkest
+$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
+$ui-primary-color: $classic-primary-color !default;            // Lighter
+$ui-secondary-color: $classic-secondary-color !default;        // Lightest
+$ui-highlight-color: $classic-highlight-color !default;        // Vibrant
 
 // Avatar border size (8% default, 100% for rounded avatars)
 $ui-avatar-border-size: 8%;
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index f26e8183f..aea8919af 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -12,7 +12,7 @@
 #
 
 class DomainBlock < ApplicationRecord
-  enum severity: [:silence, :suspend]
+  enum severity: [:silence, :suspend, :noop]
 
   attr_accessor :retroactive
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 25dc25864..96a2d09b7 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -53,6 +53,7 @@ class User < ApplicationRecord
   scope :admins,    -> { where(admin: true) }
   scope :confirmed, -> { where.not(confirmed_at: nil) }
   scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) }
+  scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended: false }) }
   scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
   scope :with_recent_ip_address, ->(value) { where(arel_table[:current_sign_in_ip].eq(value).or(arel_table[:last_sign_in_ip].eq(value))) }
 
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index e8b3a870d..a6b3c4cdb 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -11,16 +11,16 @@ class BlockDomainService < BaseService
   private
 
   def process_domain_block
+    clear_media! if domain_block.reject_media?
     if domain_block.silence?
       silence_accounts!
-    else
+    elsif domain_block.suspend?
       suspend_accounts!
     end
   end
 
   def silence_accounts!
     blocked_domain_accounts.in_batches.update_all(silenced: true)
-    clear_media! if domain_block.reject_media?
   end
 
   def clear_media!
diff --git a/app/services/unblock_domain_service.rb b/app/services/unblock_domain_service.rb
index 169d2f781..946b6d465 100644
--- a/app/services/unblock_domain_service.rb
+++ b/app/services/unblock_domain_service.rb
@@ -10,7 +10,7 @@ class UnblockDomainService < BaseService
   end
 
   def process_retroactive_updates
-    blocked_accounts.in_batches.update_all(update_options)
+    blocked_accounts.in_batches.update_all(update_options) unless domain_block.noop?
   end
 
   def blocked_accounts
diff --git a/app/views/about/_contact.html.haml b/app/views/about/_contact.html.haml
index 292a58575..822639962 100644
--- a/app/views/about/_contact.html.haml
+++ b/app/views/about/_contact.html.haml
@@ -1,5 +1,8 @@
 .panel
-  .panel-header= t 'about.contact'
+  .panel-header
+    = succeed ':' do
+      = t 'about.contact'
+    %span{ title: contact.site_contact_email.presence }= contact.site_contact_email.presence
   .panel-body
     - if contact.contact_account
       .owner
@@ -8,8 +11,9 @@
           = link_to TagManager.instance.url_for(contact.contact_account) do
             %span.display_name.emojify= display_name(contact.contact_account)
             %span.username @#{contact.contact_account.acct}
-
-    - unless contact.site_contact_email.blank?
-      .contact-email
-        = t 'about.business_email'
-        %strong= contact.site_contact_email
+    - else
+      .owner
+        .avatar= image_tag full_asset_url('avatars/original/missing.png', skip_pipeline: true)
+        .name
+          %span.display_name= t 'about.contact_missing'
+          %span.username= t 'about.contact_unavailable'
diff --git a/app/views/about/_links.html.haml b/app/views/about/_links.html.haml
deleted file mode 100644
index d7fe317e6..000000000
--- a/app/views/about/_links.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-.panel
-  .panel-header= t 'about.links'
-  .panel-list
-    %ul
-      - if user_signed_in?
-        %li= link_to t('about.get_started'), root_path
-      - else
-        - if instance.open_registrations
-          %li= link_to t('about.get_started'), new_user_registration_path
-        %li= link_to t('auth.login'), new_user_session_path
-      %li= link_to t('about.terms'), terms_path
-      %li= link_to t('about.source_code'), 'https://github.com/chronister/mastodon'
diff --git a/app/views/about/_version.html.haml b/app/views/about/_version.html.haml
deleted file mode 100644
index 3ed35da51..000000000
--- a/app/views/about/_version.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-.panel
-  .panel-header= t 'about.version'
-  .panel-body
-    - if @instance_presenter.commit_hash == ""
-      %strong= version.version_number
-    - else
-      %strong= version.version_number
-      %strong= "#{@instance_presenter.commit_hash}"
-
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index cce749561..11315fefa 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -1,16 +1,44 @@
 - content_for :page_title do
   = site_hostname
 
-.wrapper.thicc
-  .sidebar-layout
-    .main
-      .panel
-        %h2= site_hostname
+- content_for :header_tags do
+  = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
 
-        - unless @instance_presenter.site_description.blank?
-          %p!= @instance_presenter.site_description
+  %meta{ property: 'og:site_name', content: site_title }/
+  %meta{ property: 'og:url', content: about_url }/
+  %meta{ property: 'og:type', content: 'website' }/
+  %meta{ property: 'og:title', content: site_hostname }/
+  %meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/
+  %meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
+  %meta{ property: 'og:image:width', content: '400' }/
+  %meta{ property: 'og:image:height', content: '400' }/
+  %meta{ property: 'twitter:card', content: 'summary' }/
 
-      .information-board
+.landing-page
+  .header-wrapper.compact
+    .header
+      .container.links
+        .brand
+          = link_to root_url do
+            = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
+
+        %ul.nav
+          %li
+            - if user_signed_in?
+              = link_to t('settings.back'), root_url, class: 'webapp-btn'
+            - else
+              = link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
+          %li= link_to t('about.about_this'), about_more_path
+          %li= link_to t('about.other_instances'), 'https://joinmastodon.org/'
+
+      .container.hero
+        .heading
+          %h3= t('about.description_headline', domain: site_hostname)
+          %p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
+
+  .information-board
+    .container
+      .information-board-sections
         .section
           %span= t 'about.user_count_before'
           %strong= number_with_delimiter @instance_presenter.user_count
@@ -23,11 +51,14 @@
           %span= t 'about.domain_count_before'
           %strong= number_with_delimiter @instance_presenter.domain_count
           %span= t 'about.domain_count_after'
+      = render 'contact', contact: @instance_presenter
 
-      - unless @instance_presenter.site_extended_description.blank?
-        .panel!= @instance_presenter.site_extended_description
+  .extended-description
+    .container
+      = @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html')
 
-    .sidebar
-      = render 'contact', contact: @instance_presenter
-      = render 'links', instance: @instance_presenter
-      = render 'version', version: @instance_presenter
+  .footer-links
+    .container
+      %p
+        = link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
+        = " (#{@instance_presenter.version_number})"
diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml
index 999d1e37b..a3c8e4a84 100644
--- a/app/views/about/show.html.haml
+++ b/app/views/about/show.html.haml
@@ -24,8 +24,7 @@
       .container.links
         .brand
           = link_to root_url do
-            = image_tag asset_pack_path('logo.svg'), alt: '', role: 'presentation'
-            Mastodon
+            = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
 
         %ul.nav
           %li
diff --git a/app/views/about/terms.html.haml b/app/views/about/terms.html.haml
index 58064f0be..7004cb0b1 100644
--- a/app/views/about/terms.html.haml
+++ b/app/views/about/terms.html.haml
@@ -1,8 +1,23 @@
 - content_for :page_title do
   = t('terms.title', instance: site_hostname)
 
-.wrapper
-  - if @instance_presenter.site_terms.present?
-    = raw @instance_presenter.site_terms
-  - else
-    = t('terms.body_html')
+.landing-page
+  .header-wrapper.compact
+    .header
+      .container.links
+        .brand
+          = link_to root_url do
+            = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
+
+        %ul.nav
+          %li
+            - if user_signed_in?
+              = link_to t('settings.back'), root_url, class: 'webapp-btn'
+            - else
+              = link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
+          %li= link_to t('about.about_this'), about_more_path
+          %li= link_to t('about.other_instances'), 'https://joinmastodon.org/'
+
+  .extended-description
+    .container
+      = @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index 7ed634e5d..150c14791 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -23,9 +23,9 @@
     .accounts-grid
       = render 'nothing_here'
   - else
-    .activity-stream
+    .activity-stream.with-header
       = render partial: 'stream_entries/status', collection: @statuses, as: :status
 
-  .pagination
-    - if @statuses.size == 20
+  - if @statuses.size == 20
+    .pagination
       = link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next', rel: 'next'
diff --git a/app/views/admin/domain_blocks/show.html.haml b/app/views/admin/domain_blocks/show.html.haml
index 70dfef9b2..ea1929d44 100644
--- a/app/views/admin/domain_blocks/show.html.haml
+++ b/app/views/admin/domain_blocks/show.html.haml
@@ -3,13 +3,18 @@
 
 = simple_form_for @domain_block, url: admin_domain_block_path(@domain_block), method: :delete do |f|
 
-  = f.input :retroactive,
-    as: :boolean,
-    wrapper: :with_label,
-    label: t(".retroactive.#{@domain_block.severity}"),
-    hint: t(:affected_accounts,
-      scope: [:admin, :domain_blocks, :show],
-      count: @domain_block.accounts_count)
+  - if (@domain_block.noop?)
+    = f.input :retroactive,
+      as: :hidden,
+      input_html: { :value => "0" }
+  - else
+    = f.input :retroactive,
+      as: :boolean,
+      wrapper: :with_label,
+      label: t(".retroactive.#{@domain_block.severity}"),
+      hint: t(:affected_accounts,
+        scope: [:admin, :domain_blocks, :show],
+        count: @domain_block.accounts_count)
 
   .actions
     = f.button :button, t('.undo'), type: :submit
diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml
index f0f7bd619..1ed5c1ae0 100644
--- a/app/views/home/index.html.haml
+++ b/app/views/home/index.html.haml
@@ -7,6 +7,7 @@
 
 .app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
   %noscript
-    = image_tag asset_pack_path('logo.png')
+    = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon'
+
     %div
       = t('errors.noscript')
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index 59d95a0c6..c98d85f7b 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -6,7 +6,7 @@
     .sidebar-wrapper
       .sidebar
         = link_to root_path do
-          = image_tag asset_pack_path('logo.png'), class: 'logo'
+          = image_tag asset_pack_path('logo.svg'), class: 'logo', alt: 'Mastodon'
 
         = render_navigation
     .content-wrapper
diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml
index b4f1bd0f3..d8ac733f9 100644
--- a/app/views/layouts/auth.html.haml
+++ b/app/views/layouts/auth.html.haml
@@ -6,8 +6,7 @@
     .logo-container
       %h1
         = link_to root_path do
-          = image_tag asset_pack_path('logo.svg')
-          Mastodon
+          = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
 
     .form-container
       = render 'flashes'
diff --git a/app/views/manifests/show.json.rabl b/app/views/manifests/show.json.rabl
index 0aa1728e7..ee0a70324 100644
--- a/app/views/manifests/show.json.rabl
+++ b/app/views/manifests/show.json.rabl
@@ -2,7 +2,7 @@ object false
 
 node(:name)             { Setting.site_title }
 node(:short_name)       { Setting.site_title }
-node(:description)      { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon')) }
+node(:description)      { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon_html')) }
 node(:icons)            { [{ src: '/android-chrome-192x192.png', sizes: '192x192', type: 'image/png' }] }
 node(:theme_color)      { '#282c37' }
 node(:background_color) { '#d9e1e8' }
diff --git a/app/views/well_known/webfinger/show.json.rabl b/app/views/well_known/webfinger/show.json.rabl
index af11cd207..762d1860d 100644
--- a/app/views/well_known/webfinger/show.json.rabl
+++ b/app/views/well_known/webfinger/show.json.rabl
@@ -8,7 +8,7 @@ end
 
 node(:links) do
   [
-    { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: account_url(@account) },
+    { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account) },
     { rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom') },
     { rel: 'self', type: 'application/activity+json', href: account_url(@account) },
     { rel: 'salmon', href: api_salmon_url(@account.id) },
diff --git a/app/views/well_known/webfinger/show.xml.ruby b/app/views/well_known/webfinger/show.xml.ruby
index 844742d68..b0158b8bd 100644
--- a/app/views/well_known/webfinger/show.xml.ruby
+++ b/app/views/well_known/webfinger/show.xml.ruby
@@ -3,7 +3,7 @@ Nokogiri::XML::Builder.new do |xml|
     xml.Subject @canonical_account_uri
     xml.Alias short_account_url(@account)
     xml.Alias account_url(@account)
-    xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: TagManager.instance.url_for(@account))
+    xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account))
     xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom'))
     xml.Link(rel: 'self', type: 'application/activity+json', href: account_url(@account))
     xml.Link(rel: 'salmon', href: api_salmon_url(@account.id))
diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb
new file mode 100644
index 000000000..a8f8fbd83
--- /dev/null
+++ b/app/workers/scheduler/user_cleanup_scheduler.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+require 'sidekiq-scheduler'
+
+class Scheduler::UserCleanupScheduler
+  include Sidekiq::Worker
+
+  def perform
+    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
+      Account.where(id: batch.map(&:account_id)).delete_all
+      User.where(id: batch.map(&:id)).delete_all
+    end
+  end
+end
diff --git a/config/deploy.rb b/config/deploy.rb
index 0f3511485..33b88b109 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-lock '3.8.1'
+lock '3.8.2'
 
 set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git')
 set :branch, ENV.fetch('BRANCH', 'master')
diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml
new file mode 100644
index 000000000..b39c8cd78
--- /dev/null
+++ b/config/locales/activerecord.nl.yml
@@ -0,0 +1,12 @@
+nl:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: alleen letters, nummers en underscores
+        status:
+          attributes:
+            reblog:
+              taken: van toot bestaat al
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index d395dc9c3..ec051591a 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -1,21 +1,17 @@
 ---
 ar:
   about:
-    about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
+    about_mastodon_html: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
     about_this: عن مثيل الخادوم هذا
-    business_email: 'البريد الإلكتروني المهني :'
     closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
     contact: للتواصل معنا
     description_headline: ما هو %{domain}?
     domain_count_after: خوادم أخرى
     domain_count_before: متصل بـ
-    get_started: إبدأ الآن
-    links: الروابط
     other_instances: خوادم أخرى
     source_code: الشفرة المصدرية
     status_count_after: منشورا
     status_count_before: نشروا
-    terms: شروط الاستعمال
     user_count_after: مستخدم
     user_count_before: يستضيف
   accounts:
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 042d609b0..65ff5c025 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -1,21 +1,17 @@
 ---
 bg:
   about:
-    about_mastodon: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
+    about_mastodon_html: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
     about_this: За тази инстанция
-    business_email: 'Служебен e-mail:'
     closed_registrations: В момента регистрациите за тази инстанция са затворени.
     contact: За контакти
     description_headline: Какво е %{domain}?
     domain_count_after: други инстанции
     domain_count_before: Свързани към
-    get_started: Първи стъпки
-    links: Връзки
     other_instances: Други инстанции
     source_code: Програмен код
     status_count_after: публикации
     status_count_before: Написали
-    terms: Условия
     user_count_after: потребители
     user_count_before: Дом на
   accounts:
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 0ba893a12..ce4831ac2 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -1,24 +1,19 @@
 ---
 ca:
   about:
-    about_mastodon: Mastodon és un servidor de xarxa social <em>lliure i de codi obert</em>. Una alternativa <em>descentralitzada</em> a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la <em>xarxa social</em>.
+    about_mastodon_html: Mastodon és un servidor de xarxa social <em>lliure i de codi obert</em>. Una alternativa <em>descentralitzada</em> a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la <em>xarxa social</em>.
     about_this: Sobre aquesta instància
-    business_email: 'Adreça de contacte:'
     closed_registrations: Els registres estan actualment tancats en aquesta instància.
     contact: Contacte
     description_headline: Què es %{domain}?
     domain_count_after: altres instàncies
     domain_count_before: Connectat a
-    get_started: Començar
-    links: Vincles
     other_instances: Altres instàncies
     source_code: Codi font
     status_count_after: estats
     status_count_before: Que han escrit
-    terms: Termes
     user_count_after: usuaris registrats
     user_count_before: Tenim
-    version: Versió
   accounts:
     follow: Seguir
     followers: Seguidors
diff --git a/config/locales/de.yml b/config/locales/de.yml
index b084aca31..04d3fd0b8 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1,24 +1,19 @@
 ---
 de:
   about:
-    about_mastodon: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
+    about_mastodon_html: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
     about_this: Über diese Instanz
-    business_email: 'Geschäftliche E-Mail:'
     closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen.
     contact: Kontakt
     description_headline: Was ist %{domain}?
     domain_count_after: andere Instanzen
     domain_count_before: Verbunden mit
-    get_started: Erste Schritte
-    links: Links
     other_instances: Andere Instanzen
     source_code: Quellcode
     status_count_after: Beiträge verfassten
     status_count_before: die
-    terms: AGB
     user_count_after: Benutzer
     user_count_before: Heimat für
-    version: Version
   accounts:
     follow: Folgen
     followers: Folgende
diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml
index 1739feacd..f8f59e660 100644
--- a/config/locales/devise.nl.yml
+++ b/config/locales/devise.nl.yml
@@ -2,7 +2,7 @@
 nl:
   devise:
     confirmations:
-      confirmed: Je account is bevestigd.
+      confirmed: Jouw account is bevestigd.
       send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
       send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
     failure:
@@ -10,8 +10,8 @@ nl:
       inactive: Jouw account is nog niet geactiveerd.
       invalid: Ongeldig e-mailadres of wachtwoord.
       invalid_token: Ongeldige bevestigingscode.
-      last_attempt: Je hebt nog één poging over voordat jouw account geblokkeerd wordt.
-      locked: Jouw account is geblokkeerd.
+      last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort.
+      locked: Jouw account is opgeschort.
       not_found_in_database: Ongeldig e-mailadres of wachtwoord.
       timeout: Jouw sessie is verlopen, log opnieuw in.
       unauthenticated: Je dient in te loggen of te registreren.
@@ -24,21 +24,21 @@ nl:
       reset_password_instructions:
         subject: 'Mastodon: Wachtwoord opnieuw instellen'
       unlock_instructions:
-        subject: 'Mastodon: Instructies om account te deblokkeren' 
+        subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' 
     omniauth_callbacks:
       failure: Kon je niet aanmelden met jouw %{kind} account, omdat "%{reason}".
       success: Successvol aangemeld met jouw %{kind} account.
     passwords:
       no_token: Je kunt deze pagina niet benaderen zonder dat je een e-mail om je wachtwoord opnieuw in te stellen hebt ontvangen.
       send_instructions: Je ontvangt via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen.
-      send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen.
+      send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw kunt instellen. Kijk tussen je spam wanneer niks werd ontvangen.
       updated: Jouw wachtwoord is gewijzigd. Je bent nu ingelogd.
       updated_not_active: Jouw wachtwoord is gewijzigd.
     registrations:
       destroyed: Jouw account is verwijderd. Wellicht tot ziens!
       signed_up: Je bent geregistreerd.
       signed_up_but_inactive: Je bent geregistreerd. Je kon alleen niet automatisch ingelogd worden omdat jouw account nog niet geactiveerd is.
-      signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account geblokkeerd is.
+      signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account is opgeschort.
       signed_up_but_unconfirmed: Je ontvangt via e-mail instructies hoe je jouw account kunt activeren. Kijk tussen je spam wanneer niks werd ontvangen.
       update_needs_confirmation: Je hebt je e-mailadres succesvol gewijzigd, maar we moeten je nieuwe mailadres nog bevestigen. Controleer jouw e-mail en klik op de link in de mail om jouw e-mailadres te bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
       updated: Jouw accountgegevens zijn opgeslagen.
@@ -46,16 +46,16 @@ nl:
       signed_in: Je bent succesvol ingelogd.
       signed_out: Je bent succesvol uitgelogd.
     unlocks:
-      send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen.
-      send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen.
-      unlocked: Jouw account is gedeblokkeerd. Je kunt nu weer inloggen.
+      send_instructions: Je ontvangt via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen.
+      send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen.
+      unlocked: Jouw account is niet meer opgeschort. Je kunt nu weer inloggen.
   errors:
     messages:
       already_confirmed: is reeds bevestigd
       confirmation_period_expired: moet worden bevestigd binnen %{period}, probeer het nog een keer
       expired: is verlopen, vraag een nieuwe aan
       not_found: niet gevonden
-      not_locked: is niet geblokkeerd
+      not_locked: is niet opgeschort
       not_saved:
         one: '1 fout verhinderde het opslaan van deze %{resource}:'
         other: "%{count} fouten verhinderden het opslaan van deze %{resource}:"
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 9edbb8c9f..77cf2503b 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -109,6 +109,6 @@ nl:
       application:
         title: OAuth-autorisatie vereist
     scopes:
-      follow: volg, blokkeer, deblokkeer en stop het volgen van accounts
-      read: lees jouw accountgegevens
-      write: namens jou plaatsen
+      follow: accounts te volgen, te negeren en te blokkeren.
+      read: jouw accountgegevens te lezen
+      write: namens jou berichten te plaatsen
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 47f276ca1..8fa1ac0e3 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -3,12 +3,16 @@ en:
   about:
     about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail.
     about_this: About
-    business_email: 'Business e-mail:'
     closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there.
     contact: Contact
+    contact_missing: Not set
+    contact_unavailable: N/A
     description_headline: What is %{domain}?
     domain_count_after: other instances
     domain_count_before: Connected to
+    extended_description_html: |
+      <h3>A good place for rules</h3>
+      <p>The extended description has not been set up yet.</p>
     features:
       humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media.
       humane_approach_title: A more humane approach
@@ -20,18 +24,14 @@ en:
       within_reach_title: Always within reach
     find_another_instance: Find another instance
     generic_description: "%{domain} is one server in the network"
-    get_started: Get started
     hosted_on: Mastodon hosted on %{domain}
     learn_more: Learn more
-    links: Links
     other_instances: Instance list
     source_code: Source code
     status_count_after: statuses
     status_count_before: Who authored
-    terms: Terms
     user_count_after: users
     user_count_before: Home to
-    version: Version
     what_is_mastodon: What is Mastodon?
   accounts:
     follow: Follow
@@ -108,13 +108,15 @@ en:
         create: Create block
         hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts.
         severity:
-          desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data."
+          desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data. Use <strong>None</strong> if you just want to reject media files."
+          noop: None
           silence: Silence
           suspend: Suspend
         title: New domain block
       reject_media: Reject media files
       reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions
       severities:
+        noop: None
         silence: Silence
         suspend: Suspend
       severity: Severity
@@ -198,8 +200,8 @@ en:
         show: Show media
         title: Media
       no_media: No media
-      with_media: With media
       title: Account statuses
+      with_media: With media
     subscriptions:
       callback_url: Callback URL
       confirmed: Confirmed
@@ -272,7 +274,7 @@ en:
       content: Security verification failed. Are you blocking cookies?
       title: Security verification failed
     '429': Throttled
-    noscript: To use Mastodon, please enable JavaScript.
+    noscript: To use the Mastodon web application, please enable JavaScript. Alternatively, find a native app for Mastodon for your platform.
   exports:
     blocks: You block
     csv: CSV
@@ -347,15 +349,15 @@ en:
     follow:
       title: "%{name} is now following you"
     mention:
-      action_boost: 'Boost'
-      action_expand: 'Show more'
-      action_favourite: 'Favourite'
+      action_boost: Boost
+      action_expand: Show more
+      action_favourite: Favourite
       title: "%{name} mentioned you"
     reblog:
       title: "%{name} boosted your status"
     subscribed:
-      body: "You can now receive push notifications."
-      title: "Subscription registered!"
+      body: You can now receive push notifications.
+      title: Subscription registered!
   remote_follow:
     acct: Enter your username@domain you want to follow from
     missing_resource: Could not find the required redirect URL for your account
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index d47a5db0e..6673b6516 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -1,20 +1,16 @@
 ---
 eo:
   about:
-    about_mastodon: Mastodon estas <em>senpaga, malfermitkoda</em> socia reto. Ĝi estas <em>sencentra</em> alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la <em>socia reto</em> tute glate.
+    about_mastodon_html: Mastodon estas <em>senpaga, malfermitkoda</em> socia reto. Ĝi estas <em>sencentra</em> alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la <em>socia reto</em> tute glate.
     about_this: Pri tiu aperaĵo
-    business_email: 'Profesia retpoŝt-adreso:'
     contact: Kontakti
     description_headline: Kio estas %{domain}?
     domain_count_after: aliaj aperaĵoj
     domain_count_before: Konektita al
-    get_started: Komenci
-    links: Ligiloj
     other_instances: Aliaj aperaĵoj
     source_code: Fontkodo
     status_count_after: mesaĝoj
     status_count_before: Kiu publikigis
-    terms: Terms
     user_count_after: uzantoj
     user_count_before: Hejmo de
   accounts:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index c051c9a08..89e2828d0 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,21 +1,17 @@
 ---
 es:
   about:
-    about_mastodon: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
+    about_mastodon_html: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
     about_this: Acerca de esta instancia
-    business_email: 'Correo de negocios:'
     closed_registrations: Los registros están actualmente cerrados en esta instancia.
     contact: Contacto
     description_headline: "¿Qué es %{domain}?"
     domain_count_after: otras instancias
     domain_count_before: Conectado a
-    get_started: Comenzar
-    links: Enlaces
     other_instances: Otras instancias
     source_code: Código fuente
     status_count_after: estados
     status_count_before: Que han escrito
-    terms: Términos
     user_count_after: usuarios registrados
     user_count_before: Tenemos
   accounts:
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 218d859bb..c42016eb3 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -1,24 +1,19 @@
 ---
 fa:
   about:
-    about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
+    about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
     about_this: دربارهٔ این سرور
-    business_email: 'ایمیل کاری:'
     closed_registrations: امکان ثبت نام روی این سرور هم‌اینک فعال نیست.
     contact: تماس
     description_headline: "%{domain} چیست؟"
     domain_count_after: سرور دیگر
     domain_count_before: متصل به
-    get_started: آغاز کنید
-    links: پیوندها
     other_instances: سرورهای دیگر
     source_code: کدهای منبع
     status_count_after: چیز نوشته‌اند
     status_count_before: که جمعاً
-    terms: شرایط استفاده
     user_count_after: کاربر
     user_count_before: دارای
-    version: نسخه
   accounts:
     follow: پی بگیرید
     followers: پیگیران
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index a2488530f..23c844741 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -1,20 +1,16 @@
 ---
 fi:
   about:
-    about_mastodon: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
+    about_mastodon_html: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
     about_this: Tietoja tästä palvelimesta
-    business_email: 'Business e-mail:'
     contact: Ota yhteyttä
     description_headline: Mikä on %{domain}?
     domain_count_after: muuhun palvelimeen
     domain_count_before: Yhdistyneenä
-    get_started: Aloita käyttö
-    links: Linkit
     other_instances: Muut palvelimet
     source_code: Lähdekoodi
     status_count_after: statusta
     status_count_before: Ovat luoneet
-    terms: Ehdot
     user_count_after: käyttäjälle
     user_count_before: Koti
   accounts:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 7ba9e2525..13514bfc3 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -3,7 +3,6 @@ fr:
   about:
     about_mastodon_html: Mastodon est un réseau social utilisant des formats ouverts et des logiciels libres. Comme le courriel, il est décentralisé.
     about_this: À propos
-    business_email: Courriel professionnel
     closed_registrations: Les inscriptions sont actuellement fermées sur cette instance. Cependant, vous pouvez trouver une autre instance sur laquelle vous créer un compte et à partir de laquelle vous pourrez accéder au même réseau.
     contact: Contact
     description_headline: Qu’est-ce que %{domain} ?
@@ -20,18 +19,14 @@ fr:
       within_reach_title: Toujours à portée de main
     find_another_instance: Trouver une autre instance
     generic_description: "%{domain} est seulement un serveur du réseau"
-    get_started: Rejoindre le réseau
     hosted_on: Instance Mastodon hébergée par %{domain}
     learn_more: En savoir plus
-    links: Liens
     other_instances: Liste des instances
     source_code: Code source
     status_count_after: posts
     status_count_before: Ayant publié
-    terms: Conditions d’utilisation
     user_count_after: utilisateur⋅ice⋅s
     user_count_before: Abrite
-    version: Version
     what_is_mastodon: Qu’est-ce que Mastodon ?
   accounts:
     follow: Suivre
@@ -432,70 +427,7 @@ fr:
     reblogged: partagé
     sensitive_content: Contenu sensible
   terms:
-    body_html: |
-      <h2>Politique de confidentialité</h2>
-
-      <h3 id="collect">Quelles données collectons-nous?</h3>
-
-      <p>Nous collectons des données lorsque vous vous enregistrez sur notre site et les récoltons lorsque vous participez dans le forum en lisant, écrivant, et évaluant le contenu partagé ici.</p>
-
-      <p>Lors de l'enregistrement sur notre site, il peut vous être demandé de renseigner votre nom et adresse e-mail. Vous pouvez, cependant, visiter notre site sans inscription. Votre adresse e-mail devra être vérifiée grâce à un e-mail contenant un lien unique. Si ce lien est visité, nous savons que vous contrôlez cette adresse e-mail.</p>
-
-      <p>Lors de l'inscription et de la publication de statuts, nous enregistrons l'adresse IP de laquelle le(s) status viennent. Nous pouvons également conserver des historiques serveurs qui contiendront l'adresse IP de chaque requête adressée à notre serveur.</p>
-
-      <h3 id="use">Que faisons-nous avec vos données?</h3>
-
-      <p>Toute information que nous collectons pourra être utilisée d'une des manières suivantes :</p>
-
-      <ul>
-        <li>Pour personnaliser votre expérience &mdash; vos données nous aident à mieux répondre à vos besoins individuels.</li>
-        <li>Pour améliorer notre site &mdash; nous faisons tout notre possible pour améliorer notre site en fonction des données, retours et suggestions que nous recevons.</li>
-        <li>Afin d'améliorer le support client &mdash; vos données nous aident à mieux répondre à vos requêtes et demandes de support.</li>
-        <li>Afin d'envoyer des e-mails à intervalles réguliers &mdash; l'adresse e-mail que vous renseignez peut être utilisée pour vous envoyer des données et notifications concernant des changements ou en réponse à votre nom d'utilisateur⋅trice, en réponse à vos demandes et/ou autres requêtes ou questions</li>
-      </ul>
-
-      <h3 id="protect">Comment protégeons-nous vos données?</h3>
-        
-      <p>Nous appliquons une multitude de mesures afin de maintenir la sécurité de vos données personnelles lorsque vous entrez, soumettez, ou accédez à ces dernières.</p>
-
-      <h3 id="data-retention">Quelle est notre politique de conservation des données?</h3>
-
-      <p>Nous nous efforçons de:</p>
-
-      <ul>
-        <li>Ne pas garder les historiques serveurs contenant l'adresse IP de chaque requête adressée à ce serveur plus de 90 jours.</li>
-        <li>Ne pas conserver les adresses IP associées aux utilisateur⋅trices et leur contenu plus de 5 ans.</li>
-      </ul>
-
-      <h3 id="cookies">Utilisons nous des "cookies"?</h3>
-
-      <p>Oui. Les cookies sont de petits fichiers qu'un site ou prestataires de services transfèrent sur le disque dur de votre ordinateur par le biais de votre navigateur Web (si ce dernier le permet). Ces cookies permettent au site de reconnaître votre navigateur et, si vous disposez d'un compte, l'associer à votre compte.</p>
-
-      <p>Nous utilisons les cookies pour enregistrer vos préférences pour de futures visites, compiler des données agrégées à propos du trafic et des interactions effectuées sur le site afin de proposer une meilleure expérience dans le futur. Nous pouvons contracter les services d'acteurs tiers afin de nous aider à mieux comprendre les visiteurs de notre site. Ces acteurs ont l'autorisation d'utiliser ces données seulement à des fins d'améliorations.</p>
-
-      <h3 id="disclose">Divulguons-nous des données à des acteurs tiers ?</h3>
-
-      <p>Nous n'échangeons pas, ne vendons pas ni effectuons de quelconques transferts avec des acteurs tiers d'informations permettant de vous identifier personnellement. Cela n'inclut pas les acteurs de confiance qui nous aident à gérer notre entreprise et à vous servir tant que ces acteurs s'accordent à garder lesdites informations confidentielles. Nous pouvons être amenés à délivrer vos informations lorsque jugé adéquat afin de respecter la loi, d'appliquer la politique de notre site, ou afin de protéger nos droits, ceux des autres, notre propriété ou sécurité. Cependant, aucune information permettant l'identification de nos visiteurs ne sera divulguée à des fins publicitaires, commerciales ou tout autre usage.</p>
-
-      <h3 id="third-party">Liens vers des acteurs tiers</h3>
-
-      <p>Nous pouvons être amenés à inclure ou offrir les services ou produits d'acteurs tiers sur notre site. Ces acteurs tiers possèdent leur propre politique de confidentialité. Nous ne sommes donc pas responsables du contenu ou activités desdits acteurs. Néanmoins, nous cherchons à protéger l'intégrité de notre site et sommes ouverts à toute remarque concernant ces acteurs.</p>
-
-      <h3 id="coppa">Children's Online Privacy Protection Act</h3>
-
-      <p>Notre site, nos produits et services sont tous dirigés à l'usage de personnes étant âgés de 13 ans ou plus. Si ce serveur est hébergé aux États-Unis et que vous êtes âgé⋅e de moins de 13 ans, au vu du COPPA (<a href="https://fr.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) n'utilisez pas ce site.</p>
-
-      <h3 id="consent">Votre consentement</h3>
-
-      <p>En utilisant notre site, vous consentez à la politique de confiedentialité de notre site Web.</p>
-
-      <h3 id="changes">Changements de notre politique de confidentialité</h3>
-
-      <p>Si nous décidons d'apporter des changements à notre politique de confidentialité, nous les mettrons à disposition sur cette page.</p>
-
-      <p>Ce document est distribué sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 31 Mai 2013. Il a été traduit en français en Juillet 2017.</p>
-
-      <p>Originellement adapté à partir de la politique de confidentialité de <a href="https://github.com/discourse/discourse">Discourse</a></p>.
+    body_html: "<h2>Politique de confidentialité</h2>\n\n<h3 id=\"collect\">Quelles données collectons-nous?</h3>\n\n<p>Nous collectons des données lorsque vous vous enregistrez sur notre site et les récoltons lorsque vous participez dans le forum en lisant, écrivant, et évaluant le contenu partagé ici.</p>\n\n<p>Lors de l'enregistrement sur notre site, il peut vous être demandé de renseigner votre nom et adresse e-mail. Vous pouvez, cependant, visiter notre site sans inscription. Votre adresse e-mail devra être vérifiée grâce à un e-mail contenant un lien unique. Si ce lien est visité, nous savons que vous contrôlez cette adresse e-mail.</p>\n\n<p>Lors de l'inscription et de la publication de statuts, nous enregistrons l'adresse IP de laquelle le(s) status viennent. Nous pouvons également conserver des historiques serveurs qui contiendront l'adresse IP de chaque requête adressée à notre serveur.</p>\n\n<h3 id=\"use\">Que faisons-nous avec vos données?</h3>\n\n<p>Toute information que nous collectons pourra être utilisée d'une des manières suivantes :</p>\n\n<ul>\n  <li>Pour personnaliser votre expérience &mdash; vos données nous aident à mieux répondre à vos besoins individuels.</li>\n  <li>Pour améliorer notre site &mdash; nous faisons tout notre possible pour améliorer notre site en fonction des données, retours et suggestions que nous recevons.</li>\n  <li>Afin d'améliorer le support client &mdash; vos données nous aident à mieux répondre à vos requêtes et demandes de support.</li>\n  <li>Afin d'envoyer des e-mails à intervalles réguliers &mdash; l'adresse e-mail que vous renseignez peut être utilisée pour vous envoyer des données et notifications concernant des changements ou en réponse à votre nom d'utilisateur⋅trice, en réponse à vos demandes et/ou autres requêtes ou questions</li>\n</ul>\n\n<h3 id=\"protect\">Comment protégeons-nous vos données?</h3>\n  \n<p>Nous appliquons une multitude de mesures afin de maintenir la sécurité de vos données personnelles lorsque vous entrez, soumettez, ou accédez à ces dernières.</p>\n\n<h3 id=\"data-retention\">Quelle est notre politique de conservation des données?</h3>\n\n<p>Nous nous efforçons de:</p>\n\n<ul>\n  <li>Ne pas garder les historiques serveurs contenant l'adresse IP de chaque requête adressée à ce serveur plus de 90 jours.</li>\n  <li>Ne pas conserver les adresses IP associées aux utilisateur⋅trices et leur contenu plus de 5 ans.</li>\n</ul>\n\n<h3 id=\"cookies\">Utilisons nous des \"cookies\"?</h3>\n\n<p>Oui. Les cookies sont de petits fichiers qu'un site ou prestataires de services transfèrent sur le disque dur de votre ordinateur par le biais de votre navigateur Web (si ce dernier le permet). Ces cookies permettent au site de reconnaître votre navigateur et, si vous disposez d'un compte, l'associer à votre compte.</p>\n\n<p>Nous utilisons les cookies pour enregistrer vos préférences pour de futures visites, compiler des données agrégées à propos du trafic et des interactions effectuées sur le site afin de proposer une meilleure expérience dans le futur. Nous pouvons contracter les services d'acteurs tiers afin de nous aider à mieux comprendre les visiteurs de notre site. Ces acteurs ont l'autorisation d'utiliser ces données seulement à des fins d'améliorations.</p>\n\n<h3 id=\"disclose\">Divulguons-nous des données à des acteurs tiers ?</h3>\n\n<p>Nous n'échangeons pas, ne vendons pas ni effectuons de quelconques transferts avec des acteurs tiers d'informations permettant de vous identifier personnellement. Cela n'inclut pas les acteurs de confiance qui nous aident à gérer notre entreprise et à vous servir tant que ces acteurs s'accordent à garder lesdites informations confidentielles. Nous pouvons être amenés à délivrer vos informations lorsque jugé adéquat afin de respecter la loi, d'appliquer la politique de notre site, ou afin de protéger nos droits, ceux des autres, notre propriété ou sécurité. Cependant, aucune information permettant l'identification de nos visiteurs ne sera divulguée à des fins publicitaires, commerciales ou tout autre usage.</p>\n\n<h3 id=\"third-party\">Liens vers des acteurs tiers</h3>\n\n<p>Nous pouvons être amenés à inclure ou offrir les services ou produits d'acteurs tiers sur notre site. Ces acteurs tiers possèdent leur propre politique de confidentialité. Nous ne sommes donc pas responsables du contenu ou activités desdits acteurs. Néanmoins, nous cherchons à protéger l'intégrité de notre site et sommes ouverts à toute remarque concernant ces acteurs.</p>\n\n<h3 id=\"coppa\">Children's Online Privacy Protection Act</h3>\n\n<p>Notre site, nos produits et services sont tous dirigés à l'usage de personnes étant âgés de 13 ans ou plus. Si ce serveur est hébergé aux États-Unis et que vous êtes âgé⋅e de moins de 13 ans, au vu du COPPA (<a href=\"https://fr.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act\">Children's Online Privacy Protection Act</a>) n'utilisez pas ce site.</p>\n\n<h3 id=\"consent\">Votre consentement</h3>\n\n<p>En utilisant notre site, vous consentez à la politique de confiedentialité de notre site Web.</p>\n\n<h3 id=\"changes\">Changements de notre politique de confidentialité</h3>\n\n<p>Si nous décidons d'apporter des changements à notre politique de confidentialité, nous les mettrons à disposition sur cette page.</p>\n\n<p>Ce document est distribué sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 31 Mai 2013. Il a été traduit en français en Juillet 2017.</p>\n\n<p>Originellement adapté à partir de la politique de confidentialité de <a href=\"https://github.com/discourse/discourse\">Discourse</a></p>.\n"
     title: "%{instance} Conditions d'utilisations et Politique de confidentialité"
   time:
     formats:
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 251b6914e..dc6caf87a 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -1,24 +1,19 @@
 ---
 he:
   about:
-    about_mastodon: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
+    about_mastodon_html: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
     about_this: אודות שרת זה
-    business_email: 'דוא"ל עסקי:'
     closed_registrations: הרשמות סגורות לשרת זה לעת עתה.
     contact: צור קשר
     description_headline: מהו %{domain}?
     domain_count_after: שרתים אחרים
     domain_count_before: מחובר אל
-    get_started: בואו נתחיל
-    links: קישורים
     other_instances: שרתים אחרים
     source_code: קוד מקור
     status_count_after: הודעות
     status_count_before: שכתבו
-    terms: תנאים
     user_count_after: משתמשים
     user_count_before: ביתם של
-    version: גרסה
   accounts:
     follow: לעקוב
     followers: עוקבים
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 8297ca629..2d43fcad8 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -1,21 +1,17 @@
 ---
 hr:
   about:
-    about_mastodon: Mastodon je <em>besplatna, open-source</em> socijalna mreža. <em>Decentralizirana</em> alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati &mdash; koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u <em>socijalnoj mreži</em> bez problema.
+    about_mastodon_html: Mastodon je <em>besplatna, open-source</em> socijalna mreža. <em>Decentralizirana</em> alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati &mdash; koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u <em>socijalnoj mreži</em> bez problema.
     about_this: O ovoj instanci
-    business_email: 'Poslovni e-mail:'
     closed_registrations: Registracije na ovoj instanci su trenutno zatvorene.
     contact: Kontakt
     description_headline: Što je %{domain}?
     domain_count_after: druge instance
     domain_count_before: Spojen na
-    get_started: Započni
-    links: Linkovi
     other_instances: Druge instance
     source_code: Izvorni kod
     status_count_after: statusi
     status_count_before: Tko je autor
-    terms: Uvjeti
     user_count_after: korisnici
     user_count_before: Home to
   accounts:
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 24996e39d..53319a673 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -1,10 +1,8 @@
 ---
 hu:
   about:
-    about_mastodon: Mastodon egy <em>szabad, nyílt forráskódú</em> szociális hálózati kiszolgálo. Egy <em>központosítatlan</em> alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a <em>szociális hálózatban</em>.
-    get_started: Első lépések
+    about_mastodon_html: Mastodon egy <em>szabad, nyílt forráskódú</em> szociális hálózati kiszolgálo. Egy <em>központosítatlan</em> alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a <em>szociális hálózatban</em>.
     source_code: Forráskód
-    terms: Feltételek
   accounts:
     follow: Követés
     followers: Követők
@@ -32,7 +30,7 @@ hu:
     validation_errors:
       one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant
       other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant.
-  landing_strip_html: <strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse.
+  landing_strip_html: "<strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse."
   landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
   notification_mailer:
     favourite:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 7bda52c78..e0e82d378 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -1,24 +1,19 @@
 ---
 id:
   about:
-    about_mastodon: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai &mdash; apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah.
+    about_mastodon_html: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai &mdash; apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah.
     about_this: Tentang server ini
-    business_email: 'E-mail bisnis:'
     closed_registrations: Pendaftaran untuk server ini sedang ditutup.
     contact: Kontak
     description_headline: Apa itu %{domain}?
     domain_count_after: server lain
     domain_count_before: Terhubung dengan
-    get_started: Mulai
-    links: Link
     other_instances: Server lain
     source_code: Kode sumber
     status_count_after: status
     status_count_before: Yang telah menulis
-    terms: Ketentuan
     user_count_after: pengguna
     user_count_before: Tempat bernaung bagi
-    version: Versi
   accounts:
     follow: Ikuti
     followers: Pengikut
diff --git a/config/locales/io.yml b/config/locales/io.yml
index b587d4bc6..4f7323a6f 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -1,21 +1,17 @@
 ---
 io:
   about:
-    about_mastodon: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
+    about_mastodon_html: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
     about_this: Pri ta instaluro
-    business_email: 'Profesionala retpost-adreso:'
     closed_registrations: Membresko ne nun esas posible en ta instaluro.
     contact: Kontaktar
     description_headline: Quo esas %{domain}?
     domain_count_after: altra instaluri
     domain_count_before: Konektita ad
-    get_started: Komencar
-    links: Ligili
     other_instances: Altra instaluri
     source_code: Fontkodexo
     status_count_after: mesaji
     status_count_before: Qua publikigis
-    terms: Terms
     user_count_after: uzeri
     user_count_before: Hemo di
   accounts:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 5c014c61d..de9682589 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -1,21 +1,17 @@
 ---
 it:
   about:
-    about_mastodon: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
+    about_mastodon_html: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
     about_this: A proposito di questo server
-    business_email: 'Email di lavoro:'
     closed_registrations: Al momento le iscrizioni a questo server sono chiuse.
     contact: Contatti
     description_headline: Cos'è %{domain}?
     domain_count_after: altri server
     domain_count_before: Connesso a
-    get_started: Inizia
-    links: Links
     other_instances: Altri server
     source_code: Codice sorgente
     status_count_after: status
     status_count_before: Che hanno pubblicato
-    terms: Termini di Utilizzo
     user_count_after: utenti
     user_count_before: Casa di
   accounts:
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 632f93ea3..6763ed301 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -2,8 +2,7 @@
 ja:
   about:
     about_mastodon_html: Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。
-    about_this: このインスタンスについて
-    business_email: 'ビジネスメールアドレス:'
+    about_this: 詳細情報
     closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。しかし、他のインスタンスにアカウントを作成しても全く同じネットワークに参加することができます。
     contact: 連絡先
     description_headline: "%{domain} とは?"
@@ -20,18 +19,14 @@ ja:
       within_reach_title: いつでも身近に
     find_another_instance: 他のインスタンスを探す
     generic_description: "%{domain} は、Mastodon インスタンスの一つです。"
-    get_started: 参加する
     hosted_on: Mastodon hosted on %{domain}
     learn_more: もっと詳しく
-    links: リンク
     other_instances: 他のインスタンス
     source_code: ソースコード
     status_count_after: トゥート
     status_count_before: トゥート数
-    terms: プライバシーポリシー
     user_count_after: 人
     user_count_before: ユーザー数
-    version: バージョン
     what_is_mastodon: Mastodon とは?
   accounts:
     follow: フォロー
@@ -198,8 +193,8 @@ ja:
         show: メディアを表示
         title: メディア
       no_media: メディアなし
-      with_media: メディアあり
       title: トゥート一覧
+      with_media: メディアあり
     subscriptions:
       callback_url: コールバックURL
       confirmed: 確認済み
@@ -272,7 +267,7 @@ ja:
       content: セキュリティ認証に失敗しました。Cookieをブロックしていませんか?
       title: セキュリティ認証に失敗
     '429': リクエストの制限に達しました。
-    noscript: Mastodonを利用する場合はJavaScriptを有効にしてください。
+    noscript: Mastodonのウェブアプリケーションを利用する場合はJavaScriptを有効にしてください。またはあなたのプラットフォーム向けのMastodonネイティブアプリを探すことができます。
   exports:
     blocks: ブロック
     csv: CSV
@@ -345,12 +340,12 @@ ja:
     favourite:
       title: あなたのトゥートが %{name} さんにお気に入り登録されました
     follow:
-      title: '%{name} さんにフォローされました'
+      title: "%{name} さんにフォローされました"
     mention:
       action_boost: ブースト
       action_expand: もっと見る
       action_favourite: お気に入り
-      title: '%{name} さんから返信がありました'
+      title: "%{name} さんから返信がありました"
     reblog:
       title: あなたのトゥートが %{name} さんにブーストされました
     subscribed:
@@ -400,7 +395,7 @@ ja:
     title: セッション
   settings:
     authorized_apps: 認証済みアプリ
-    back: 戻る
+    back: Mastodon に戻る
     delete: アカウントの削除
     edit_profile: プロフィールを編集
     export: データのエクスポート
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index c7c310cfe..a081de38d 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -1,24 +1,19 @@
 ---
 ko:
   about:
-    about_mastodon: Mastodon 은<em>자유로운 오픈 소스</em>소셜 네트워크입니다. 상용 플랫폼의 대체로써 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 &mdash; 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 <em>소셜 네트워크</em>에 참가할 수 있습니다.
+    about_mastodon_html: Mastodon 은<em>자유로운 오픈 소스</em>소셜 네트워크입니다. 상용 플랫폼의 대체로써 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 &mdash; 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 <em>소셜 네트워크</em>에 참가할 수 있습니다.
     about_this: 이 인스턴스에 대해서
-    business_email: '비즈니스 메일 주소:'
     closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다.
     contact: 연락처
     description_headline: "%{domain} 는 무엇인가요?"
     domain_count_after: 개의 인스턴스
     domain_count_before: 연결됨
-    get_started: 참가하기
-    links: 링크
     other_instances: 다른 인스턴스
     source_code: 소스 코드
     status_count_after: Toot
     status_count_before: Toot 수
-    terms: 개인 정보 보호 정책
     user_count_after: 명
     user_count_before: 사용자 수
-    version: 버전
   accounts:
     follow: 팔로우
     followers: 팔로워
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index dfc58f6b3..58282259d 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1,23 +1,38 @@
 ---
 nl:
   about:
-    about_mastodon: Mastodon is een <em>vrij, gratis en open-source</em> sociaal netwerk. Een <em>gedecentraliseerd</em> alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt &mdash; welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het <em>sociale netwerk</em>.
+    about_mastodon_html: Mastodon is een <em>vrij, gratis en open-source</em> sociaal netwerk. Een <em>gedecentraliseerd</em> alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt &mdash; welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het <em>sociale netwerk</em>.
     about_this: Over deze server
-    business_email: 'E-mailadres:'
     closed_registrations: Registreren op deze server is momenteel uitgeschakeld.
     contact: Contact
+    contact_missing: Niet ingesteld
+    contact_unavailable: N/A
     description_headline: Wat is %{domain}?
     domain_count_after: andere servers
     domain_count_before: Verbonden met
-    get_started: Beginnen
-    links: Links
+    extended_description_html: |
+      <h3>Een goede plek voor richtlijnen</h3>
+      <p>De uitgebreide omschrijving is nog niet ingevuld.</p>
+    features:
+      humane_approach_body: Na van de fouten van andere netwerken te hebben geleerd, tracht Mastodon ethische ontwerpkeuzes te maken om misbruik van social media te voorkomen.
+      humane_approach_title: Een meer menselijke aanpak
+      not_a_product_body: Mastodon is geen commercieel netwerk. Dus geen advertenties, geen datamining en geen besloten systemen. Er is geen centrale organisatie die alles bepaald.
+      not_a_product_title: Jij bent een persoon, geen product
+      real_conversation_body: Met 500 karakters tot jouw beschikking, en ondersteuning voor tekst- en media-waarschuwingen, kan je jezelf uiten zoals jij dat wil.
+      real_conversation_title: Voor echte gesprekken gemaakt
+      within_reach_body: Meerdere apps voor iOS, Android en andere platformen, met dank aan het ontwikkelaarsvriendelijke API-systeem, zorgen ervoor dat je overal op de hoogte blijft.
+      within_reach_title: Altijd binnen bereik
+    find_another_instance: Vind een andere server
+    generic_description: "%{domain} is een server in het Mastodon-netwerk"
+    hosted_on: Mastodon op %{domain}
+    learn_more: Meer leren
     other_instances: Andere servers
     source_code: Broncode
     status_count_after: toots
     status_count_before: Zij schreven
-    terms: Voorwaarden
     user_count_after: gebruikers
     user_count_before: Thuisbasis van
+    what_is_mastodon: Wat is Mastodon?
   accounts:
     follow: Volgen
     followers: Volgers
@@ -27,8 +42,99 @@ nl:
     people_who_follow: Mensen die %{name} volgen
     posts: Toots
     remote_follow: Extern volgen
+    reserved_username: Deze gebruikersnaam is gereserveerd
     unfollow: Ontvolgen
   admin:
+    accounts:
+      are_you_sure: Weet je het zeker?
+      confirm: Bevestigen
+      confirmed: Bevestigd
+      disable_two_factor_authentication: 2FA uitschakelen
+      display_name: Weergavenaam
+      domain: Domein
+      edit: Bewerken
+      email: E-mail
+      feed_url: Feed-URL
+      followers: Volgers
+      follows: Volgt
+      ip: IP
+      location:
+        all: Alles
+        local: Lokaal
+        remote: Extern
+        title: Locatie
+      media_attachments: Media-bijlagen
+      moderation:
+        all: Alles
+        silenced: Genegeerd
+        suspended: Opgeschort
+        title: Moderatie
+      most_recent_activity: Laatst actief
+      most_recent_ip: Laatst gebruikt IP-adres
+      not_subscribed: Niet geabonneerd
+      order:
+        alphabetic: Alfabetisch
+        most_recent: Meest recent
+        title: 
+      perform_full_suspension: Volledig opschorten
+      profile_url: Profiel-URL
+      public: Openbaar
+      push_subscription_expires: PuSH-abonnement verloopt op
+      redownload: Avatar vernieuwen
+      reset: Opnieuw
+      reset_password: Wachtwoord opnieuw instellen
+      resubscribe: Opnieuw abonneren
+      salmon_url: Salmon-URL
+      search: Zoeken
+      show:
+        created_reports: Toots door dit account gerapporteerd
+        report: gerapporteerd
+        targeted_reports: Toots van dit account gerapporteerd
+      silence: Negeren
+      statuses: Toots
+      subscribe: Abonneren
+      title: Accounts
+      undo_silenced: Niet meer negeren
+      undo_suspension: Niet meer opschorten
+      unsubscribe: Opzeggen
+      username: Gebruikersnaam
+      web: Webapp
+    domain_blocks:
+      add_new: Nieuwe toevoegen
+      created_msg: Domeinblokkade wordt nu verwerkt
+      destroyed_msg: Domeinblokkade is ongedaan gemaakt
+      domain: Domein
+      new:
+        create: Blokkade aanmaken
+        hint: Een domeinblokkade voorkomt niet dat accountgegevens van dit domein aan de database worden toegevoegd, maar dat er met terugwerkende kracht en automatisch bepaalde moderatiemethoden op deze accounts worden toegepast. 
+        severity:
+          desc_html: "<strong>Negeren</strong> zorgt ervoor dat berichten van accounts van dit domein voor iedereen onzichtbaar zijn, behalve als een account wordt gevolgd. <strong>Opschorten</strong> zorgt ervoor dat alle berichten, media en profielgegevens van accounts van dit domein worden verwijderd. Gebruik <strong>Geen</strong> wanneer je alleen mediabestanden wilt weigeren."
+          noop: Geen
+          silence: Negeren
+          suspend: Opschorten
+        title: Nieuwe domeinblokkade
+      reject_media: Mediabestanden verwerpen
+      reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen.
+      severities:
+        noop: Geen
+        silence: Negeren
+        suspend: Opschorten
+      severity: Zwaarte
+      show:
+        affected_accounts:
+          one: Eén account in de database aangepast
+          other: "%{count} accounts in de database aangepast"
+        retroactive:
+          silence: Alle genegeerde accounts van dit domein niet meer negeren
+          suspend: Alle opgeschorste accounts van dit domein niet meer opschorten
+        title: Domeinblokkade voor %{domain} ongedaan maken
+        undo: Ongedaan maken
+      title: Domeinblokkades 
+      undo: Ongedaan maken
+    instances:
+      account_count: Bekende accounts
+      domain_name: Domein
+      title: Bekende servers
     reports:
       action_taken_by: Actie uitgevoerd door
       are_you_sure: Weet je het zeker?
@@ -42,13 +148,14 @@ nl:
         'false': Media tonen
         'true': Media verbergen
       report: 'Gerapporteerde toot #%{id}'
+      report_contents: Inhoud
       reported_account: Gerapporteerde account
       reported_by: Gerapporteerd door
       resolved: Opgelost
-      silence_account: Account stilzwijgen
+      silence_account: Account negeren
       status: Toot
-      suspend_account: Account blokkeren
-      target: Target
+      suspend_account: Account opschorten
+      target: Gerapporteerde account
       title: Gerapporteerde toots
       unresolved: Onopgelost
       view: Weergeven
@@ -60,7 +167,11 @@ nl:
         closed_message:
           desc_html: Wordt op de voorpagina weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld<br>En ook hier kan je HTML gebruiken
           title: Bericht wanneer registratie is uitgeschakeld
+        deletion:
+          desc_html: Toestaan dat iedereen hun eigen account kan verwijderen
+          title:  Verwijderen account toestaan
         open:
+          desc_html: Toestaan dat iedereen een account kan registereren
           title: Open registratie
       site_description:
         desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.<br>Je kan HTML gebruiken, zoals <code>&lt;a&gt;</code> en <code>&lt;em&gt;</code>.
@@ -68,8 +179,35 @@ nl:
       site_description_extended:
         desc_html: Wordt op de uitgebreide informatiepagina weergegeven<br>Je kan ook hier HTML gebruiken
         title: Uitgebreide omschrijving Mastodon-server
+      site_terms:
+        desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken.
+        title: Aangepaste gebruikersvoorwaarden
       site_title: Naam Mastodon-server
+      timeline_preview:
+        desc_html: Toon de openbare tijdlijn op de startpagina
+        title: Voorbeeld tijdlijn
       title: Server-instellingen
+    statuses:
+      back_to_account: Terug naar accountpagina
+      batch:
+        delete: Verwijderen
+        nsfw_off: NSFW UIT
+        nsfw_on: NSFW AAN
+      execute: Uitvoeren
+      failed_to_execute: Uitvoeren mislukt
+      media:
+        hide: Media verbergen
+        show: Media tonen
+        title: Media
+      no_media: Geen media
+      title: Toots van account
+    subscriptions:
+      callback_url: Callback-URL
+      confirmed: Bevestigd
+      expires_in: Verloopt over
+      last_delivery: Laatste bezorging
+      title: PubSubHubbub
+      topic: Account
     title: Beheer
   admin_mailer:
     new_report:
@@ -80,8 +218,9 @@ nl:
     signature: Mastodon-meldingen van %{instance}
     view: 'Bekijk:'
   applications:
-    invalid_url: De opgegevens URL is ongeldig
+    invalid_url: De opgegeven URL is ongeldig
   auth:
+    agreement_html: Wanneer je op registeren klikt ga je akkoord met <a href="%{rules_path}">onze gebruikersvoorwaarden</a> en <a href="%{terms_path}">ons privacybeleid</a>.
     change_password: Beveiliging
     delete_account: Account verwijderen
     delete_account_html: Wanneer je jouw account graag wilt verwijderen, kan je dat <a href="%{path}">hier doen</a>. We vragen jou daar om een bevestiging.
@@ -96,6 +235,12 @@ nl:
   authorize_follow:
     error: Helaas, er is een fout opgetreden bij het opzoeken van de externe account
     follow: Volgen
+    follow_request: 'Jij hebt een volgverzoek ingediend bij:'
+    following: 'Succes! Jij volgt nu:'
+    post_follow:
+      close: Of je kan dit venster gewoon sluiten.
+      return: Ga terug naar het profiel van de gebruiker
+      web: Ga naar de webapp
     prompt_html: 'Je (<strong>%{self}</strong>) hebt toestemming gevraagd om iemand te mogen volgen:'
     title: Volg %{acct}
   datetime:
@@ -128,7 +273,7 @@ nl:
       content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies?
       title: Veiligheidsverificatie mislukt
     '429': Te veel verbindingsaanvragen.
-    noscript: Schakel JavaScript in om Mastodon te kunnen gebruiken.
+    noscript: Schakel JavaScript in om de webapplicatie van Mastodon te gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform.
   exports:
     blocks: Jij blokkeert
     csv: CSV
@@ -162,8 +307,12 @@ nl:
       following: Volglijst
       muting: Negeerlijst
     upload: Uploaden
-  landing_strip_html: "<strong>%{name}</strong> is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt."
+  landing_strip_html: <strong>%{name}</strong> is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt.
   landing_strip_signup_html: Als je dat niet hebt, kun je je <a href="%{sign_up_path}">hier registreren</a>.
+  media_attachments:
+    validations:
+      images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld
+      too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden
   notification_mailer:
     digest:
       body: 'Hier is een korte samenvatting van wat je hebt gemist op %{instance} sinds jouw laatste bezoek op %{since}:'
@@ -188,10 +337,26 @@ nl:
       subject: Jij bent vermeld door %{name}
     reblog:
       body: 'Jouw toot werd door %{name} geboost:'
-      subject: "%{name} booste jouw toot"
+      subject: "%{name} boostte jouw toot"
   pagination:
     next: Volgende
     prev: Vorige
+    truncate: "&hellip;"
+  push_notifications:
+    favourite:
+      title: "%{name} markeerde jouw toot als favoriet"
+    follow:
+      title: "%{name} volgt jou nu"
+    mention:
+      action_boost: Boost
+      action_expand: Meer tonen
+      action_favourite: Favoriet
+      title: "%{name} vermeldde jou"
+    reblog:
+      title: "%{name} boostte jouw toot"
+    subscribed:
+      body: Je kan nu pushmeldingen ontvangen.
+      title: Aanmelding bevestigd!
   remote_follow:
     acct: Geef jouw account@domein.tld op waarvandaan je wilt volgen
     missing_resource: Kon vereiste doorverwijzings-URL voor jouw account niet vinden
@@ -233,10 +398,13 @@ nl:
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
+    revoke: Intrekken
+    revoke_success: Sessie succesvol ingetrokken
     title: Sessies
   settings:
     authorized_apps: Geautoriseerde apps
     back: Terug naar Mastodon
+    delete: Account deletion
     edit_profile: Profiel bewerken
     export: Export
     followers: Geautoriseerde volgers
@@ -245,9 +413,9 @@ nl:
     settings: Instellingen
     two_factor_authentication: Tweestapsverificatie
   statuses:
-    open_in_web: Openen in web
+    open_in_web: In de webapp openen
     over_character_limit: Limiet van %{max} tekens overschreden
-    show_more: Toon meer
+    show_more: Meer tonen
     visibilities:
       private: Alleen volgers
       private_long: Alleen aan volgers tonen
@@ -259,6 +427,76 @@ nl:
     click_to_show: Klik om te tonen
     reblogged: boostte
     sensitive_content: Gevoelige inhoud
+  terms:
+    body_html: |
+      <h2>Privacy Policy</h2>
+
+      <h3 id="collect">What information do we collect?</h3>
+
+      <p>We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.</p>
+
+      <p>When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.</p>
+
+      <p>When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.</p>
+
+      <h3 id="use">What do we use your information for?</h3>
+
+      <p>Any of the information we collect from you may be used in one of the following ways:</p>
+
+      <ul>
+        <li>To personalize your experience &mdash; your information helps us to better respond to your individual needs.</li>
+        <li>To improve our site &mdash; we continually strive to improve our site offerings based on the information and feedback we receive from you.</li>
+        <li>To improve customer service &mdash; your information helps us to more effectively respond to your customer service requests and support needs.</li>
+        <li>To send periodic emails &mdash; The email address you provide may be used to send you information, notifications that you request about changes to topics or in response to your user name, respond to inquiries, and/or other requests or questions.</li>
+      </ul>
+
+      <h3 id="protect">How do we protect your information?</h3>
+
+      <p>We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.</p>
+
+      <h3 id="data-retention">What is your data retention policy?</h3>
+
+      <p>We will make a good faith effort to:</p>
+
+      <ul>
+        <li>Retain server logs containing the IP address of all requests to this server no more than 90 days.</li>
+        <li>Retain the IP addresses associated with registered users and their posts no more than 5 years.</li>
+      </ul>
+
+      <h3 id="cookies">Do we use cookies?</h3>
+
+      <p>Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.</p>
+
+      <p>We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.</p>
+
+      <h3 id="disclose">Do we disclose any information to outside parties?</h3>
+
+      <p>We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.</p>
+
+      <h3 id="third-party">Third party links</h3>
+
+      <p>Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.</p>
+
+      <h3 id="coppa">Children's Online Privacy Protection Act Compliance</h3>
+
+      <p>Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) do not use this site.</p>
+
+      <h3 id="online">Online Privacy Policy Only</h3>
+
+      <p>This online privacy policy applies only to information collected through our site and not to information collected offline.</p>
+
+      <h3 id="consent">Your Consent</h3>
+
+      <p>By using our site, you consent to our web site privacy policy.</p>
+
+      <h3 id="changes">Changes to our Privacy Policy</h3>
+
+      <p>If we decide to change our privacy policy, we will post those changes on this page.</p>
+
+      <p>This document is CC-BY-SA. It was last updated May 31, 2013.</p>
+
+      <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
+    title: "%{instance} Terms of Service and Privacy Policy"
   time:
     formats:
       default: "%d %B %Y om %H:%M"
@@ -267,11 +505,13 @@ nl:
     description_html: Na het instellen van <strong>tweestapsverificatie</strong>, kun jij je alleen aanmelden als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren aanmeldcode.
     disable: Uitschakelen
     enable: Inschakelen
+    enabled: Tweestapsverificatie is ingeschakeld
     enabled_success: Inschakelen tweestapsverificatie geslaagd
     generate_recovery_codes: Herstelcodes genereren
     instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het aanmelden moet invoeren."
     lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig.
-    manual_instructions: Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.
+    manual_instructions: 'Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.'
+    recovery_codes: Herstelcodes back-uppen
     recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd
     recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.)
     setup: Instellen
diff --git a/config/locales/no.yml b/config/locales/no.yml
index cf94524d2..122ad5675 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -1,24 +1,19 @@
 ---
 'no':
   about:
-    about_mastodon: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
+    about_mastodon_html: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
     about_this: Om denne instansen
-    business_email: 'Bedriftsepost:'
     closed_registrations: Registreringer er for øyeblikket lukket på denne instansen.
     contact: Kontakt
     description_headline: Hva er %{domain}?
     domain_count_after: andre instanser
     domain_count_before: Koblet til
-    get_started: Kom i gang
-    links: Lenker
     other_instances: Andre instanser
     source_code: Kildekode
     status_count_after: statuser
     status_count_before: Som skrev
-    terms: Betingelser
     user_count_after: brukere
     user_count_before: Her bor
-    version: Versjon
   accounts:
     follow: Følg
     followers: Følgere
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 2eb85be58..6d9996dbc 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -1,31 +1,26 @@
 ---
 oc:
   about:
-    about_mastodon: Mastodon es un malhum social <em>liure e open-source</em>. Una alternativa <em>decentralizada</em> a las platformas comercialas, aquò evita qu’una sola companiá monopolize vòstra comunicacion. Causissètz une servidor que vos fisatz, quina que siague vòstra causida, podètz interagir amb tot lo mond. Qual que siague pòt aver son instància Mastodon e participar al <em>malhum social</em> sens cap de problèmas.
+    about_mastodon_html: Mastodon es un malhum social <em>liure e open-source</em>. Una alternativa <em>descentralizada</em> a las plat-formas comercialas, aquò evita qu’una sola companhiá monopolize vòstra comunicacion. Causissètz un servidor que vos fisatz, quina que siasque vòstra causida, podètz interagir amb tot lo mond. Qual que siasque pòt aver son instància Mastodon e participar al <em>malhum social</em> sens cap de problèmas.
     about_this: A prepaus d’aquesta instància
-    business_email: 'Corrièl professional :'
     closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància.
     contact: Contacte
     description_headline: Qué es %{domain} ?
     domain_count_after: autras instàncias
     domain_count_before: Connectat a
-    get_started: Venètz al malhum
-    links: Ligams
     other_instances: Autras instàncias
     source_code: Còdi font
     status_count_after: estatuts
     status_count_before: qu’an escrich
-    terms: Tèrmes
     user_count_after: personas
     user_count_before: Ostal de
-    version: Version
   accounts:
     follow: Sègre
     followers: Seguidors
     following: Abonaments
     nothing_here: I a pas res aquí !
     people_followed_by: Lo mond que %{name} sèc
-    people_who_follow: Lo mond que ségon %{name}
+    people_who_follow: Lo mond que sègon %{name}
     posts: Estatuts
     remote_follow: Sègre a distància
     unfollow: Quitar de sègre
@@ -60,7 +55,7 @@ oc:
       order:
         alphabetic: Alfabetic
         most_recent: Mai recent
-        title: Order
+        title: Ordre
       perform_full_suspension: Botar en tren la suspension complèta
       profile_url: URL del perfil
       public: Public
@@ -94,7 +89,7 @@ oc:
           suspend: Suspendre
         title: Nòu blocatge domeni
       reject_media: Regetar los fichièrs mèdias
-      reject_media_hint: Lèva los fichièrs gardats localament e regeta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions
+      reject_media_hint: Lèva los fichièrs gardats localament e regèta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions
       severities:
         silence: Silenci
         suspend: Suspendre
@@ -108,7 +103,7 @@ oc:
           suspend: Levar la suspension de totes los comptes d’aqueste domeni
         title: Restablir lo blocatge de domeni de %{domain}
         undo: Restablir
-      title: Bloc de domeni
+      title: Blòc de domeni
       undo: Restablir
     instances:
       account_count: Comptes coneguts
@@ -125,7 +120,7 @@ oc:
       nsfw:
         'false': Sens contengut sensible
         'true': Contengut sensible activat
-      report: 'enhalament #%{id}'
+      report: 'senhalament #%{id}'
       report_contents: Contenguts
       reported_account: Compte senhalat
       reported_by: Senhalat per
@@ -145,16 +140,41 @@ oc:
         closed_message:
           desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.<br>Podètz utilizar de balisas HTML
           title: Messatge de barradura de las inscripcions
+        deletion:
+          desc_html: Autorizar al monde a suprimir lor compte
+          title: Possibilitat de suprimir lo compte
         open:
+          desc_html: Autorizar lo monde a se marcar
           title: Inscripcions
       site_description:
-        desc_html: Afichada jos la forma de paragrafe sus la pagina d’acuèlh e utilizada coma balisa meta.<br> Podètz utilizar de balisas HTML, coma <code>&lt;a&gt;</code> et <code>&lt;em&gt;</code>.
+        desc_html: Afichada jos la forma de paragrafe sus la pagina d’acuèlh e utilizada coma balisa meta.<br> Podètz utilizar de balisas HTML, coma <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
         title: Descripcion del site
       site_description_extended:
         desc_html: Afichada sus la pagina d’informacion complementària del site<br>Podètz utilizar de balisas HTML
         title: Descripcion espandida del site
+      site_terms:
+        desc_html: Afichada sus la pagina de las condicions d’utilizacion<br>Podètz utilizar de balisas HTML
+        title: Politica de confidencialitat del site
       site_title: Títol del site
+      timeline_preview:
+        desc_html: Mostrar lo flux public sus la pagina d’acuèlh
+        title: Apercebut flux public
       title: Paramètres del site
+    statuses:
+      back_to_account: Tornar a la pagina Compte
+      batch:
+        delete: Suprimir
+        nsfw_off: NSFW OFF
+        nsfw_on: NSFW ON
+      execute: Lançar
+      failed_to_execute: Fracàs
+      media:
+        hide: Amagar mèdia
+        show: Mostrar mèdia
+        title: Mèdia
+      no_media: Cap mèdia
+      title: Estatuts del compteAccount statuses
+      with_media: Amb mèdia
     subscriptions:
       callback_url: URL de rapèl
       confirmed: Confirmat
@@ -261,11 +281,11 @@ oc:
       x_seconds: Fa %{count} segondas
   deletes:
     bad_password_msg: Ben ensajat pirata ! Senhal incorrècte
-    confirm_password: Picatz vòstre senhal acutal per verificar vòstra identitat
+    confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat
     description_html: Aquò suprimirà <strong>definitivament e sens possibilitat de retorn</strong> lo contengut de vòstre compte e lo desactivarà. Lo nom d’utilizaire serà gardat per evitar una futura impostura.
-    proceed: Delete account
-    success_msg: Your account was successfully deleted
-    warning_html: La supression del contengut d’aquesta instància es sola assegurada. Lo contengut fòrça partejat daissarà problablament de traças. Los servidors fòra-linha e los que vos sègon pas mai auràn pas la mesa a jorn de lor basa de donada.
+    proceed: Suprimir lo compte
+    success_msg: Compte ben suprimit
+    warning_html: La supression del contengut d’aquesta instància es sola assegurada. Lo contengut fòrça partejat daissarà probablament de traças. Los servidors fòra-linha e los que vos sègon pas mai auràn pas la mesa a jorn de lor basa de donada.
     warning_title: Disponibilitat del contengut difusat
   errors:
     '404': La pagina que recercatz existís pas.
@@ -282,7 +302,7 @@ oc:
     storage: Mèdias gardats
   followers:
     domain: Domeni
-    explanation_html: Se volètz vos assegurar de la confidencialitat de vòstres estatuts, vos cal saber qual sèc vòstre compte. <strong>Vòstres estatuts privats son enviats a totas las instàncias qu’an de mond que vos sègon.</strong>. Benlèu que volètz repassar vòstra lista e tirar los seguidors s’avètz de dubtes tocant las politica de confidencialitat de lor instàncias.
+    explanation_html: Se volètz vos assegurar de la confidencialitat de vòstres estatuts, vos cal saber qual sèc vòstre compte. <strong>Vòstres estatuts privats son enviats a totas las instàncias qu’an de mond que vos sègon.</strong>. Benlèu que volètz repassar vòstra lista e tirar los seguidors s’avètz de dobtes tocant las politica de confidencialitat de lor instàncias.
     followers_count: Nombre de seguidors
     lock_link: Clavar vòstre compte
     purge: Tirar dels seguidors
@@ -307,7 +327,7 @@ oc:
       following: Lista de mond que seguètz
       muting: Lista de mond que volètz pas legir
     upload: Importar
-  landing_strip_html: "<strong>%{name}</strong> es un utilizaire de %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasgue sul fediverse."
+  landing_strip_html: "<strong>%{name}</strong> es un utilizaire de %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse."
   landing_strip_signup_html: S’es pas lo cas, podètz <a href="%{sign_up_path}">vos marcar aquí</a>.
   media_attachments:
     validations:
@@ -347,6 +367,45 @@ oc:
     missing_resource: URL de redireccion pas trobada
     proceed: Contunhatz per sègre
     prompt: 'Sètz per sègre :'
+  sessions:
+    activity: Darrièra activitat
+    browser: Navigator
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      firefox: Firefox
+      generic: Navigator desconegut
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
+      opera: Opera
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Session en cors
+    description: "%{browser} sus %{platform}"
+    explanation: Aquí los navigators connectats a vòstre compte Mastodon.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: plataforma desconeguda
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Revocar
+    revoke_success: Session ben revocada
+    title: Sessions
   settings:
     authorized_apps: Aplicacions autorizadas
     back: Tornar a Mastodon
@@ -354,7 +413,7 @@ oc:
     edit_profile: Modificar lo perfil
     export: Export donadas
     followers: Seguidors autorizats
-    import: Import
+    import: Importar
     preferences: Preferéncias
     settings: Paramètres
     two_factor_authentication: Autentificacion en dos temps
@@ -373,6 +432,76 @@ oc:
     click_to_show: Clicatz per afichar
     reblogged: a partejat
     sensitive_content: Contengut sensible
+  terms:
+    body_html: |
+      <h2>Politica de confidencialitat</h2>
+
+      <h3 id="collect">Quinas informacions collectem ?</h3>
+
+      <p>Collectem informacions sus vos quand vos marcatz sus nòstre site e juntem las donadas quand participatz a nòstre forum ne legissent, escrivent e notant lo contengut partejat aquí.</p>
+
+      <p>Pendent l’inscripcion podèm vos demandar vòstre nom e adreça de corrièl. Podètz çaquelà visitar nòstre site sens vos marcar. Verificarem vòstra adreça amb un messatge donant un ligam unic. Se clicatz sul ligam sauprem qu’avètz lo contraròtle de l’adreça.</p>
+
+      <p>Quand sètz marcat e que publicatz quicòm, enregistrem l’adreça IP d’origina. Podèm tanben salvagardar los jornals del servidor que tenon l’adreça IP de totas las demandas fachas al nòstre servidor.</p>
+
+      <h3 id="use">Qué fasèm de vòstras informacions ?</h3>
+
+      <p>Totas las informacions que collectem de vos pòdon servir dins los cases seguents :</p>
+
+      <ul>
+        <li>Per personalizar vòstre experiéncia &mdash; vòstras informacions nos ajudaràn a respondre melhor a vòstres besonhs individuals.</li>
+        <li>Per melhorar nòstre site &mdash; s’eforcem de longa a melhorar çò que nòstre site ofrís segon las informacions e los comentaris que recebèm de vòstra part.</li>
+        <li>Per melhorar nòstre servici client &mdash; vòstras informacions nos ajudan per respondre amb mai eficacitat a vòstras demandas d’assisténcia.</li>
+        <li>Per enviar periodicament de corrièls &mdash; Podèm utilizar l’adreça qu’avètz donada per vos enviar d’informacions e de notificacions que demandatz tocant de cambiaments dins los subjèctes del forum o en responsa a vòstre nom d’utilizaire, en responsa a una demanda, e/o tota autra question.</li>
+      </ul>
+
+      <h3 id="protect">Cossí protegèm vòstras informacions ?</h3>
+
+      <p>Apliquem tota una mena de mesuras de seguretat per manténer la fisança de vòstras informacions personalas quand las picatz, mandatz, o i accedètz.</p>
+
+      <h3 id="data-retention">Quala es vòstra politica de conservacion de donadas ?</h3>
+
+      <p>Farem esfòrces per :</p>
+
+      <ul>
+        <li>Gardar los jornals del servidor que contenon las adreças IP de totas las demandas al servidor pas mai de 90 jorns.</li>
+        <li>Gardar las adreças IP ligadas als utilizaires e lors publicacions pas mai de 5 ans.</li>
+      </ul>
+
+      <h3 id="cookies">Empleguem de cookies ?</h3>
+
+      <p>Òc-ben. Los cookies son de pichons fichièrs qu’un site o sos forneires de servicis plaçan dins lo disc dur de vòstre ordenador via lo navigator Web (Se los acceptatz). Aqueles cookies permeton al site de reconéisser vòstre navigator e se tenètz un compte enregistrat de l’associar a vòstre compte.</p>
+
+      <p>Empleguem de cookies per comprendre e enregistrar vòstras preferéncias per vòstras visitas venentas, per recampar de donadas sul trafic del site e las interaccions per fin que posquem ofrir una melhora experiéncia del site e de las aisinas pel futur. Pòt arribar que contractèssem amb de forneires de servicis tèrces per nos ajudar a comprendre melhor nòstres visitors.  Aqueles forneires an pas lo drech que d’utilizar las donadas collectadas per nos ajudar a menar e melhorar nòstre afar.</p>
+
+      <h3 id="disclose">Divulguem d’informacions a de partits exteriors ?</h3>
+
+      <p>Vendèm pas, comercem o qualque transferiment que siasque a de partits exteriors vòstras informacions personalas identificablas. Aquò inclutz pas los tèrces partits de confisança que nos assiston a menar nòstre site, menar nòstre afar o vos servir, baste que son d’acòrd per gardar aquelas informacions confidencialas. Pòt tanben arribar que liberèssem vòstras informacions quand cresèm qu’es apropriat d’o far per se sometre a la lei, per refortir nòstras politicas, o per protegir los dreches, proprietats o seguritat de qualqu’un o de nosautres. Pasmens es possible que mandèssem d’informacions non-personalas e identificablas de nòstres visitors a d’autres partits per d’utilizacion en marketing, publicitat o un emplec mai.</p>
+
+      <h3 id="third-party">Ligams de tèrces partits</h3>
+
+      <p>Pòt arribar, a nòstra discrecion, qu’incluguèssem o ofriguèssem  de produches o servicis de tèrces partits sus nòstre site. Aqueles sites tèrces an de politicas de confidencialitats separadas e independentas. En consequéncia avèm pas cap de responsabilitat pel contengut e las activitats d’aqueles sites ligats. Pasmens cerquem de protegir l’integritat de nòstre site e aculhèm los comentaris tocant aqueles sites.</p>
+
+      <h3 id="coppa">Conformitat amb la lei de proteccion de la confidencialitat dels mainatges</h3>
+
+      <p>Nòstre site, nòstres produches e servicis son totes destinats a de monde d’almens 13 ans. S’aqueste servidor se tròba en los Estats Units per acontentar las exigéncias del COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) utilizetz pas aqueste site.</p>
+
+      <h3 id="online">Politica de confidencialitat en linha solament</h3>
+
+      <p>Aquesta politica de confidencialitat s’aplica pas qu’a las informacions collectadas via nòstre site e non pas a las informacions collectadas fòra linha.</p>
+
+      <h3 id="consent">Vòstre consentiment</h3>
+
+      <p>N’utilizant nòstre site, consentètz a nòstra politica de confidencialitat.</p>
+
+      <h3 id="changes">Cambiament dins nòstra politica de confidencialitat</h3>
+
+      <p>Se decidèm de cambiar nòstra politica de confidencialitat, publicarem los cambiaments sus aquesta pagina.</p>
+
+      <p>Aqueste document es jos licéncia CC-BY-SA. Darrièra mesa a jorn lo 31 de mai de 2013</p>
+
+      <p>Prima adaptacion de la <a href="https://github.com/discourse/discourse">politica de confidencialitat de Discourse</a>.</p>
+    title: Condicions d’utilizacion e politica de confidencialitat de %{instance}
   time:
     formats:
       default: Lo %d %b de %Y a %Ho%M
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 325d52b45..02c97e955 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -3,12 +3,16 @@ pl:
   about:
     about_mastodon_html: Mastodon jest wolną i otwartą siecią społecznościową, zdecentralizowaną alternatywą dla zamkniętych, komercyjnych platform.
     about_this: O tej instancji
-    business_email: 'Służbowy adres e-mail:'
     closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. Możesz jednak zarejestrować się na innej instancji, uzyskując dostęp do tej samej sieci.
     contact: Kontakt
+    contact_missing: Nie ustawiono
+    contact_unavailable: Nie dotyczy
     description_headline: Czym jest %{domain}?
     domain_count_after: instancji
     domain_count_before: Serwer połączony z
+    extended_description_html: |
+      <h3>Dobre miejsce na zasady użytkowania</h3>
+      <p>Nie ustawiono jeszcze szczegółowego opisu</p>
     features:
       humane_approach_body: Nauczeni na błędach innych sieci społecznościowych, zaprojektowaliśmy Mastodona tak, aby uniknąć częstych nadużyć.
       humane_approach_title: Bardziej ludzkie podejście
@@ -20,18 +24,14 @@ pl:
       within_reach_title: Zawsze w Twoim zasięgu
     find_another_instance: Znajdź inną instancję
     generic_description: "%{domain} jest jednym z serwerów sieci"
-    get_started: Rozpocznijmy!
     hosted_on: Mastodon uruchomiony na %{domain}
     learn_more: Dowiedz się więcej
-    links: Odnośniki
     other_instances: Lista instancji
     source_code: Kod źródłowy
     status_count_after: wpisów
     status_count_before: Są autorami
-    terms: Regulamin
     user_count_after: użytkowników
     user_count_before: Z serwera korzysta
-    version: Wersja
     what_is_mastodon: Czym jest Mastodon?
   accounts:
     follow: Śledź
@@ -198,8 +198,8 @@ pl:
         show: Pokaż zawartość multimedialną
         title: Media
       no_media: Bez zawartości multimedialnej
-      with_media: Z zawartością multimedialną
       title: Statusy konta
+      with_media: Z zawartością multimedialną
     subscriptions:
       callback_url: URL zwrotny
       confirmed: Potwierdzono
@@ -272,7 +272,7 @@ pl:
       content: Sprawdzanie bezpieczeństwa nie powiodło się. Czy blokujesz pliki cookie?
       title: Sprawdzanie bezpieczeństwa nie powiodło się
     '429': Uduszono
-    noscript: Aby korzystać z Mastodona, włącz JavaScript.
+    noscript: Aby korzystać z aplikacji Mastodon, włącz JavaScript. Możesz też skorzystać z natywnej aplikacji obsługującej Twoje urządzenie.
   exports:
     blocks: Blokujesz
     csv: CSV
@@ -351,15 +351,15 @@ pl:
     follow:
       title: "%{name} zaczął Cię śledzić"
     mention:
-      action_boost: 'Podbij'
-      action_expand: 'Pokaż więcej'
-      action_favourite: 'Dodaj do ulubionych'
+      action_boost: Podbij
+      action_expand: Pokaż więcej
+      action_favourite: Dodaj do ulubionych
       title: "%{name} wspomniał o Tobie"
     reblog:
       title: "%{name} podbił Twój status"
     subscribed:
-      body: "Otrzymujesz teraz powiadomienia push."
-      title: "Zarejestrowano subskrypcję!"
+      body: Otrzymujesz teraz powiadomienia push.
+      title: Zarejestrowano subskrypcję!
   remote_follow:
     acct: Podaj swój adres (nazwa@domena), z którego chcesz śledzić
     missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny
@@ -486,7 +486,7 @@ pl:
 
       <h3 id="online">Polityka prywatności dotyczy tylko Internetu</h3>
 
-      <p>Ta polityka prywatności dotyczy jedynie danych zbieranych w Internecie, nie tych, które przechowywane są na Twoim kompurerze, np. pliki cookies.</p>
+      <p>Ta polityka prywatności dotyczy jedynie danych zbieranych w Internecie, nie tych, które przechowywane są na Twoim komputerze, np. pliki cookies.</p>
 
       <h3 id="consent">Wyrażenie zgody</h3>
 
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 5ba763ae4..9bd1b0d28 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -1,24 +1,19 @@
 ---
 pt-BR:
   about:
-    about_mastodon: Mastodon é um servidor de rede social <em>grátis, e open-source</em>. Uma alternativa <em>descentralizada</em> ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie &mdash; qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na <em>rede social federada</em> sem problemas.
+    about_mastodon_html: Mastodon é um servidor de rede social <em>grátis, e open-source</em>. Uma alternativa <em>descentralizada</em> ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie &mdash; qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na <em>rede social federada</em> sem problemas.
     about_this: Sobre essa instância
-    business_email: 'Email comercial:'
     closed_registrations: Registros estão fechadas para essa instância.
     contact: Contato
     description_headline: O que é %{domain}?
     domain_count_after: outras instâncias
     domain_count_before: Conectado a
-    get_started: Comece aqui
-    links: Links
     other_instances: Outras instâncias
     source_code: Source code
     status_count_after: status
     status_count_before: Quem autorizou
-    terms: Termos
     user_count_after: usuários
     user_count_before: Lugar de
-    version: Versão
   accounts:
     follow: Seguir
     followers: Seguidores
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 346fcdda8..6bf592d1c 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -1,24 +1,19 @@
 ---
 pt:
   about:
-    about_mastodon: Mastodon é uma rede social <em>grátis e em código aberto</em>. Uma alternativa <em>descentralizada</em> às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta <em>rede social</em>.
+    about_mastodon_html: Mastodon é uma rede social <em>grátis e em código aberto</em>. Uma alternativa <em>descentralizada</em> às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta <em>rede social</em>.
     about_this: Sobre esta instância
-    business_email: 'Email comercial:'
     closed_registrations: Novos registos estão fechados nesta instância.
     contact: Contacto
     description_headline: O que é o %{domain}?
     domain_count_after: outras instâncias
     domain_count_before: Ligado a
-    get_started: Começar
-    links: Links
     other_instances: Outras instâncias
     source_code: Código fonte
     status_count_after: publicações
     status_count_before: Que fizeram
-    terms: Termos
     user_count_after: utilizadores
     user_count_before: Casa para
-    version: Versão
   accounts:
     follow: Seguir
     followers: Seguidores
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 5cfc2b1ca..141017f40 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -1,24 +1,19 @@
 ---
 ru:
   about:
-    about_mastodon: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете &mdash; что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно.
+    about_mastodon_html: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете &mdash; что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно.
     about_this: Об этом узле
-    business_email: 'Деловой e-mail:'
     closed_registrations: В данный момент регистрация на этом узле закрыта.
     contact: Связаться
     description_headline: Что такое %{domain}?
     domain_count_after: другими узлами
     domain_count_before: Связан с
-    get_started: Начать
-    links: Ссылки
     other_instances: Другие узлы
     source_code: Исходный код
     status_count_after: статусов
     status_count_before: Опубликовано
-    terms: Условия
     user_count_after: пользователей
     user_count_before: Здесь живет
-    version: Версия
   accounts:
     follow: Подписаться
     followers: Подписчики
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 536bb06e1..fb8524a24 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -41,9 +41,9 @@ en:
         setting_default_privacy: Post privacy
         setting_default_sensitive: Always mark media as sensitive
         setting_delete_modal: Show confirmation dialog before deleting a toot
+        setting_noindex: Opt-out of search engine indexing
         setting_system_font_ui: Use system's default font
         setting_unfollow_modal: Show confirmation dialog before unfollowing someone
-        setting_noindex: Opt-out of search engine indexing
         severity: Severity
         type: Import type
         username: Username
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 65845e1aa..70389e948 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -9,7 +9,6 @@ ja:
         locked: フォロワーを手動で承認する必要があります。
         note: あと<span class="note-counter">%{count}</span>文字入力できます。
         setting_noindex: 公開プロフィールおよび各投稿ページに影響します
-
       imports:
         data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい
       sessions:
@@ -38,9 +37,9 @@ ja:
         setting_default_privacy: 投稿の公開範囲
         setting_default_sensitive: メディアを常に閲覧注意としてマークする
         setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する
+        setting_noindex: 検索エンジンによるインデックスを拒否する
         setting_system_font_ui: システムのデフォルトフォントを使う
         setting_unfollow_modal: フォロー解除する前に確認ダイアログを表示する
-        setting_noindex: 検索エンジンによるインデックスを拒否する
         severity: 重大性
         type: インポートする項目
         username: ユーザー名
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index a8f259057..43cb52201 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -27,6 +27,7 @@ oc:
         data: Data
         display_name: Escais
         email: Corrièl
+        filtered_languages: Lengas filtradas
         header: Bandièra
         locale: Lenga
         locked: Far venir lo compte privat
@@ -37,7 +38,11 @@ oc:
         setting_auto_play_gif: Lectura automatica dels GIFS animats
         setting_boost_modal: Afichar una fenèstra de confirmacion abans de partejar un estatut
         setting_default_privacy: Confidencialitat de las publicacions
+        setting_default_sensitive: Totjorn marcar los mèdias coma sensibles
         setting_delete_modal: Afichar una fenèstra de confirmacion abans de suprimir un estatut
+        setting_noindex: Èsser pas indexat pels motors de recèrca
+        setting_system_font_ui: Utilizar la policia Font del sisèma
+        setting_unfollow_modal: Afichar una confirmacion abans de quitar de sègre qualqu’un
         severity: Severitat
         type: Tip d’impòrt
         username: Nom d’utilizaire
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index dc5492ea5..7e84472b9 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -40,14 +40,13 @@ pl:
         otp_attempt: Kod uwierzytelnienia dwustopniowego
         password: Hasło
         setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy
-
         setting_boost_modal: Pytaj o potwierdzenie przed podbiciem
         setting_default_privacy: Widoczność posta
         setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą
         setting_delete_modal: Pytaj o potwierdzenie przed usunięciem postu
+        setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych
         setting_system_font_ui: Używaj domyślnej czcionki systemu
         setting_unfollow_modal: Pytaj o potwierdzenie przed usunięciem śledzenia
-        setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych
         severity: Priorytet
         type: Typ importu
         username: Nazwa użytkownika
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 17eb96110..89782209e 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -1,24 +1,19 @@
 ---
 th:
   about:
-    about_mastodon: แมสโทดอน เป็น  <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค.  เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ &mdash; ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น.
+    about_mastodon_html: แมสโทดอน เป็น  <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค.  เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ &mdash; ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น.
     about_this: เกี่ยวกับอินซะแตนซ์นี้
-    business_email: 'อีเมล์ธุรกิจ:'
     closed_registrations: อินซะแตนซ์นี้ปิดรับลงทะเบียนแล้ว.
     contact: ติดต่อ
     description_headline: โดเมนคือ %{domain} ?
     domain_count_after: อินซะแตนซ์อื่นๆ
     domain_count_before: เชื่อมต่อกับ
-    get_started: เริ่มกันเลย
-    links: ลิงก์
     other_instances: อินซะแตนซ์อื่นๆ
     source_code: ซอร์สโค๊ด
     status_count_after: สถานะ
     status_count_before: Who authored
-    terms: เงื่อนไข
     user_count_after: ผู้ใช้
     user_count_before: Home to
-    version: เวอร์ชั่น
   accounts:
     follow: ติดตาม
     followers: ผู้ติดตาม
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index bb83991cd..a1f2d2078 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -1,24 +1,19 @@
 ---
 tr:
   about:
-    about_mastodon: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal ağdır. <em>Merkezileştirilmemiş</em> yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon <em>sosyal ağına</em> dahil edebilir.
+    about_mastodon_html: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal ağdır. <em>Merkezileştirilmemiş</em> yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon <em>sosyal ağına</em> dahil edebilir.
     about_this: Bu sunucu hakkında
-    business_email: 'İş e-postası:'
     closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır.
     contact: İletişim
     description_headline: Peki %{domain} nedir?
     domain_count_after: sunucu var.
     domain_count_before: Bağlı olduğu
-    get_started: Kayıt ol
-    links: Bağlantılar
     other_instances: Diğer sunucular
     source_code: Kaynak kodu
     status_count_after: adet gönderi yazıldı.
     status_count_before: Şu ana kadar
-    terms: Kullanım koşulları
     user_count_after: kullanıcı var.
     user_count_before: Kayıtlı
-    version: Sürüm
   accounts:
     follow: Takip et
     followers: Takipçiler
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 129fc5bb7..3237ea1db 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -1,24 +1,19 @@
 ---
 uk:
   about:
-    about_mastodon: Mastodon - це <em>вільна</em> соціальна мережа з <em>відкритим вихідним кодом</em>. Вона є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте &mdash; що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в <em>соціальній мережі</em>.
+    about_mastodon_html: Mastodon - це <em>вільна</em> соціальна мережа з <em>відкритим вихідним кодом</em>. Вона є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте &mdash; що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в <em>соціальній мережі</em>.
     about_this: Про цю інстанцію
-    business_email: 'Діловий email:'
     closed_registrations: На даний момент реєстрація на цій інстанції закрита.
     contact: Зв'язатися
     description_headline: Що таке %{domain}?
     domain_count_after: іншими інстанціями
     domain_count_before: Зв'язаний з
-    get_started: Почати
-    links: Посилання
     other_instances: Інші інстанції
     source_code: Вихідний код
     status_count_after: статусів
     status_count_before: Опубліковано
-    terms: Умови
     user_count_after: користувачів
     user_count_before: Тут живе
-    version: Версія
   accounts:
     follow: Підписатися
     followers: Підписники
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 0526ec1ba..0b0263294 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -1,24 +1,19 @@
 ---
 zh-CN:
   about:
-    about_mastodon: Mastodon(长毛象)是一个<em>自由、开放源码</em>的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的<em>社交</em>交流。
+    about_mastodon_html: Mastodon(长毛象)是一个<em>自由、开放源码</em>的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的<em>社交</em>交流。
     about_this: 关于本实例
-    business_email: 商业电邮︰
     closed_registrations: 这个实例目前不开放注册 _(:3」∠)_
     contact: 联络
     description_headline: 关于 %{domain}
     domain_count_after: 个其它实例
     domain_count_before: 现已接入
-    get_started: 上手使用
-    links: 链接
     other_instances: 其它实例
     source_code: 源码
     status_count_after: 条嘟文
     status_count_before: 他们共嘟出了
-    terms: 条款
     user_count_after: 位用户
     user_count_before: 这里共注册有
-    version: 版本
   accounts:
     follow: 关注
     followers: 粉丝
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 06f9ab63d..40087ed53 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -1,24 +1,19 @@
 ---
 zh-HK:
   about:
-    about_mastodon: Mastodon(萬象)是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
+    about_mastodon_html: Mastodon(萬象)是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
     about_this: 關於本服務站
-    business_email: 聯絡網站管理者︰
     closed_registrations: 本服務站暫時停止接受登記。
     contact: 聯絡
     description_headline: 關於 %{domain}
     domain_count_after: 個其他服務站
     domain_count_before: 已連接至
-    get_started: 立即登記
-    links: 連結
     other_instances: 其他服務站
     source_code: 源代碼
     status_count_after: 篇文章
     status_count_before: 他們共發佈了
-    terms: 使用條款
     user_count_after: 位使用者
     user_count_before: 這裏共註冊有
-    version: 版本
   accounts:
     follow: 關注
     followers: 關注者
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 67aa2830f..e25edc890 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1,21 +1,17 @@
 ---
 zh-TW:
   about:
-    about_mastodon: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的<em>社群網路</em>交流。
+    about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的<em>社群網路</em>交流。
     about_this: 關於本服務站
-    business_email: 商務信箱︰
     closed_registrations: 本服務站暫時停止接受註冊。
     contact: 聯絡我們
     description_headline: 關於 %{domain}
     domain_count_after: 個服務站相連
     domain_count_before: 與其他
-    get_started: 立即註冊
-    links: 連結
     other_instances: 其他服務站
     source_code: 原始碼
     status_count_after: 篇文章
     status_count_before: 他們共發佈了
-    terms: 使用條款
     user_count_after: 位註冊使用者
     user_count_before: 這裡共有
   accounts:
diff --git a/config/routes.rb b/config/routes.rb
index 50e32cce0..71729fee5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -26,7 +26,7 @@ Rails.application.routes.draw do
     confirmations:      'auth/confirmations',
   }
 
-  get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? }
+  get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? || req.format.html? }
 
   resources :accounts, path: 'users', only: [:show], param: :username do
     resources :stream_entries, path: 'updates', only: [:show] do
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 78aaa311c..8273c1201 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -18,3 +18,6 @@
   doorkeeper_cleanup_scheduler:
     cron: '1 1 * * 0'
     class: Scheduler::DoorkeeperCleanupScheduler
+  user_cleanup_scheduler:
+    cron: '4 5 * * *'
+    class: Scheduler::UserCleanupScheduler
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 3c92ce417..07969aff4 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,23 +9,27 @@ module Mastodon
     end
 
     def minor
-      4
+      5
     end
 
     def patch
-      7
+      0
     end
 
     def pre
       nil
     end
 
+    def flags
+      'rc1'
+    end
+
     def to_a
       [major, minor, patch, pre].compact
     end
 
     def to_s
-      to_a.join('.')
+      [to_a.join('.'), flags].join
     end
   end
 end
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index bceeeaf01..226523554 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -1,18 +1,10 @@
 # frozen_string_literal: true
 
 namespace :mastodon do
-  desc 'Execute daily tasks'
+  desc 'Execute daily tasks (deprecated)'
   task :daily do
-    %w(
-      mastodon:feeds:clear
-      mastodon:media:clear
-      mastodon:users:clear
-      mastodon:push:refresh
-    ).each do |task|
-      puts "Starting #{task} at #{Time.now.utc}"
-      Rake::Task[task].invoke
-    end
-    puts "Completed daily tasks at #{Time.now.utc}"
+    # No-op
+    # All of these tasks are now executed via sidekiq-scheduler
   end
 
   desc 'Turn a user into an admin, identified by the USERNAME environment variable'
@@ -143,6 +135,13 @@ namespace :mastodon do
     task clear_all: :environment do
       Redis.current.keys('feed:*').each { |key| Redis.current.del(key) }
     end
+
+    desc 'Generates home timelines for users who logged in in the past two weeks'
+    task build: :environment do
+      User.active.includes(:account).find_each do |u|
+        PrecomputeFeedService.new.call(u.account)
+      end
+    end
   end
 
   namespace :emails do
@@ -155,14 +154,10 @@ namespace :mastodon do
   end
 
   namespace :users do
-    desc 'Clear out unconfirmed users'
+    desc 'Clear out unconfirmed users (deprecated)'
     task clear: :environment do
-      # Users that never confirmed e-mail never signed in, means they
-      # only have a user record and an avatar record, with no files uploaded
-      User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
-        Account.where(id: batch.map(&:account_id)).delete_all
-        User.where(id: batch.map(&:id)).delete_all
-      end
+      # No-op
+      # This task is now executed via sidekiq-scheduler
     end
 
     desc 'List e-mails of all admin users'
diff --git a/package.json b/package.json
index c90e49db5..132d7017d 100644
--- a/package.json
+++ b/package.json
@@ -44,6 +44,7 @@
     "compression-webpack-plugin": "^0.4.0",
     "cross-env": "^5.0.1",
     "css-loader": "^0.28.4",
+    "detect-passive-events": "^1.0.2",
     "dotenv": "^4.0.0",
     "emojione": "^2.2.7",
     "emojione-picker": "^2.2.1",
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
index 3a475f61f..0b4eb9fdf 100644
--- a/public/android-chrome-192x192.png
+++ b/public/android-chrome-192x192.png
Binary files differdiff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
index b05996b37..829263f83 100644
--- a/public/apple-touch-icon.png
+++ b/public/apple-touch-icon.png
Binary files differdiff --git a/public/badge.png b/public/badge.png
index fc1f42dca..a1f2f8b08 100644
--- a/public/badge.png
+++ b/public/badge.png
Binary files differdiff --git a/public/browserconfig.xml b/public/browserconfig.xml
index fcf794bc2..7fdab5058 100644
--- a/public/browserconfig.xml
+++ b/public/browserconfig.xml
@@ -3,7 +3,7 @@
   <msapplication>
     <tile>
       <square150x150logo src="/mstile-150x150.png"/>
-      <TileColor>#1ea21e</TileColor>
+      <TileColor>#282c37</TileColor>
     </tile>
   </msapplication>
 </browserconfig>
diff --git a/public/favicon-dev.ico b/public/favicon-dev.ico
index 5f725d587..383604406 100644
--- a/public/favicon-dev.ico
+++ b/public/favicon-dev.ico
Binary files differdiff --git a/public/favicon.ico b/public/favicon.ico
index 3673ac0d5..79000c9cc 100644
--- a/public/favicon.ico
+++ b/public/favicon.ico
Binary files differdiff --git a/public/mask-icon.svg b/public/mask-icon.svg
index c35230117..f91ff5067 100644
--- a/public/mask-icon.svg
+++ b/public/mask-icon.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="16" width="16"><path d="M8 .1A7.9 7.9 0 0 0 .1 8 7.9 7.9 0 0 0 8 15.9 7.9 7.9 0 0 0 15.9 8 7.9 7.9 0 0 0 8 .1zm-.04 4.28h1.7c-.33.23-.44.9-.44 1.25v3.2c0 .7-.55 1.24-1.26 1.24-.7 0-1.26-.55-1.26-1.25v-3.2c0-.68.55-1.24 1.26-1.24zm-4.36.78c.7 0 1.26.55 1.26 1.24v3.2c0 .34.1 1.02.43 1.24H3.6c-.7 0-1.26-.55-1.26-1.24V6.4c0-.7.55-1.24 1.26-1.24zm8.7 0c.7 0 1.26.55 1.26 1.24v3.2c0 .7-.56 1.24-1.27 1.24h-1.7c.32-.22.43-.9.43-1.24V6.4c0-.7.56-1.24 1.26-1.24z" fill="#000"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 94.023018 100.80365" height="28.44903mm" width="26.535385mm"><path d="M72.57077 49.00625c-3.9125 0-7.085-3.1825-7.085-7.095 0-3.91125 3.1725-7.09375 7.085-7.09375 3.92125 0 7.09375 3.1825 7.09375 7.09375 0 3.9125-3.1725 7.095-7.09375 7.095m-25.55875 0c-3.9225 0-7.095-3.1825-7.095-7.095 0-3.91125 3.1725-7.09375 7.095-7.09375 3.91125 0 7.09375 3.1825 7.09375 7.09375 0 3.9125-3.1825 7.095-7.09375 7.095m-25.57 0c-3.91125 0-7.08375-3.1825-7.08375-7.095 0-3.91125 3.1725-7.09375 7.08375-7.09375 3.92125 0 7.09375 3.1825 7.09375 7.09375 0 3.9125-3.1725 7.095-7.09375 7.095m72.5775-15.905c0-21.86625-14.32375-28.27375-14.32375-28.27375-7.23-3.31875-19.63-4.7125-32.5175-4.8275h-.3125c-12.88875.115-25.28875 1.50875-32.5075 4.8275 0 0-14.32375 6.4075-14.32375 28.27375 0 5.00375-.105 10.995.05125 17.34C.60577 71.83 4.00702 92.905 23.78327 98.1375c9.1125 2.4125 16.945 2.9125 23.24875 2.56875 11.4225-.63375 17.84-4.07625 17.84-4.07625l-.37375-8.3025s-8.16625 2.58-17.34125 2.2675c-9.09125-.3125-18.6825-.9775-20.16-12.13875-.135-.97875-.1975-2.02875-.1975-3.13125 0 0 8.915 2.185 20.2325 2.69375 6.9075.3225 13.39875-.39375 19.98375-1.185 12.6275-1.50875 23.62375-9.29 25.0075-16.405 2.17375-11.1925 1.99625-27.3275 1.99625-27.3275" fill="#000"/></svg>
diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png
index 57eae8355..e8e289eaa 100644
--- a/public/mstile-150x150.png
+++ b/public/mstile-150x150.png
Binary files differdiff --git a/scalingo.json b/scalingo.json
index 4afaa6b4e..8df2caba1 100644
--- a/scalingo.json
+++ b/scalingo.json
@@ -2,7 +2,7 @@
   "name": "Mastodon",
   "description": "A GNU Social-compatible microblogging server",
   "repository": "https://github.com/tootsuite/mastodon",
-  "logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png",
+  "logo": "https://github.com/tootsuite/mastodon/raw/master/app/javascript/images/logo.svg",
   "env": {
     "LOCAL_DOMAIN": {
       "description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)",
diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb
index 871176a07..7e83b801d 100644
--- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb
+++ b/spec/controllers/api/web/push_subscriptions_controller_spec.rb
@@ -9,7 +9,7 @@ describe Api::Web::PushSubscriptionsController do
 
   let(:create_payload) do
     {
-      data: {
+      subscription: {
         endpoint: 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX',
         keys: {
           p256dh: 'BEm_a0bdPDhf0SOsrnB2-ategf1hHoCnpXgQsFj5JCkcoMrMt2WHoPfEYOYPzOIs9mZE8ZUaD7VA5vouy0kEkr8=',
@@ -36,25 +36,17 @@ describe Api::Web::PushSubscriptionsController do
     it 'saves push subscriptions' do
       sign_in(user)
 
-      stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200)
+      stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200)
 
       post :create, format: :json, params: create_payload
 
       user.reload
 
-      push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint])
-
-      expect(push_subscription['endpoint']).to eq(create_payload[:data][:endpoint])
-      expect(push_subscription['key_p256dh']).to eq(create_payload[:data][:keys][:p256dh])
-      expect(push_subscription['key_auth']).to eq(create_payload[:data][:keys][:auth])
-    end
+      push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint])
 
-    it 'sends welcome notification' do
-      sign_in(user)
-
-      stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200)
-
-      post :create, format: :json, params: create_payload
+      expect(push_subscription['endpoint']).to eq(create_payload[:subscription][:endpoint])
+      expect(push_subscription['key_p256dh']).to eq(create_payload[:subscription][:keys][:p256dh])
+      expect(push_subscription['key_auth']).to eq(create_payload[:subscription][:keys][:auth])
     end
   end
 
@@ -62,15 +54,15 @@ describe Api::Web::PushSubscriptionsController do
     it 'changes alert settings' do
       sign_in(user)
 
-      stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200)
+      stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200)
 
       post :create, format: :json, params: create_payload
 
-      alerts_payload[:id] = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint]).id
+      alerts_payload[:id] = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]).id
 
       put :update, format: :json, params: alerts_payload
 
-      push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint])
+      push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint])
 
       expect(push_subscription.data['follow']).to eq(alerts_payload[:data][:follow])
       expect(push_subscription.data['favourite']).to eq(alerts_payload[:data][:favourite])
diff --git a/spec/views/about/_contact.html.haml_spec.rb b/spec/views/about/_contact.html.haml_spec.rb
index d2e7a4598..25ba15794 100644
--- a/spec/views/about/_contact.html.haml_spec.rb
+++ b/spec/views/about/_contact.html.haml_spec.rb
@@ -31,12 +31,5 @@ describe 'about/_contact.html.haml' do
 
       expect(rendered).to have_content('admin@example.com')
     end
-
-    it 'does not show info when email is missing' do
-      contact = double(site_contact_email: nil, contact_account: nil)
-      render 'about/contact', contact: contact
-
-      expect(rendered).not_to have_content(I18n.t('about.business_email'))
-    end
   end
 end
diff --git a/spec/views/about/_links.html.haml_spec.rb b/spec/views/about/_links.html.haml_spec.rb
deleted file mode 100644
index 2d7f7467a..000000000
--- a/spec/views/about/_links.html.haml_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-describe 'about/_links.html.haml' do
-  context 'when signed in' do
-    before do
-      allow(view).to receive(:user_signed_in?).and_return(true)
-    end
-
-    it 'does not show sign in link' do
-      render 'about/links', instance: InstancePresenter.new
-
-      expect(rendered).to have_content(I18n.t('about.get_started'))
-      expect(rendered).not_to have_content(I18n.t('auth.login'))
-    end
-  end
-
-  context 'when signed out' do
-    before do
-      allow(view).to receive(:user_signed_in?).and_return(false)
-    end
-
-    it 'shows get started link when registrations are allowed' do
-      render 'about/links', instance: double(open_registrations: true)
-
-      expect(rendered).to have_content(I18n.t('about.get_started'))
-      expect(rendered).to have_content(I18n.t('auth.login'))
-    end
-
-    it 'hides get started link when registrations are closed' do
-      render 'about/links', instance: double(open_registrations: false)
-
-      expect(rendered).not_to have_content(I18n.t('about.get_started'))
-      expect(rendered).to have_content(I18n.t('auth.login'))
-    end
-  end
-end
diff --git a/spec/workers/pubsubhubbub/confirmation_worker_spec.rb b/spec/workers/pubsubhubbub/confirmation_worker_spec.rb
index 8f66b4520..1eecdd2b5 100644
--- a/spec/workers/pubsubhubbub/confirmation_worker_spec.rb
+++ b/spec/workers/pubsubhubbub/confirmation_worker_spec.rb
@@ -83,6 +83,6 @@ describe Pubsubhubbub::ConfirmationWorker do
   end
 
   def http_headers
-    { 'Connection' => 'close', 'Host' => 'example.com', 'User-Agent' => 'http.rb/2.2.2 (Mastodon/1.4.7; +https://cb6e6126.ngrok.io/)' }
+    { 'Connection' => 'close', 'Host' => 'example.com' }
   end
 end
diff --git a/spec/workers/pubsubhubbub/delivery_worker_spec.rb b/spec/workers/pubsubhubbub/delivery_worker_spec.rb
index b72001568..c0e0d5186 100644
--- a/spec/workers/pubsubhubbub/delivery_worker_spec.rb
+++ b/spec/workers/pubsubhubbub/delivery_worker_spec.rb
@@ -59,7 +59,6 @@ describe Pubsubhubbub::DeliveryWorker do
         'Content-Type' => 'application/atom+xml',
         'Host' => 'example.com',
         'Link' => "<https://#{Rails.configuration.x.local_domain}/api/push>; rel=\"hub\", <https://#{Rails.configuration.x.local_domain}/users/#{subscription.account.username}.atom>; rel=\"self\"",
-        'User-Agent' => 'http.rb/2.2.2 (Mastodon/1.4.7; +https://cb6e6126.ngrok.io/)',
       }.tap do |basic|
         known_digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), subscription.secret.to_s, payload)
         basic.merge('X-Hub-Signature' => "sha1=#{known_digest}") if subscription.secret?
diff --git a/yarn.lock b/yarn.lock
index dcf09643e..0f895f3b6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2328,6 +2328,10 @@ detect-node@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
 
+detect-passive-events@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-1.0.2.tgz#0e39d7b675907eff55b8965f5be3fc0b0f4178b9"
+
 diff@3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"