about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2019-01-11 10:53:58 +0100
committerGitHub <noreply@github.com>2019-01-11 10:53:58 +0100
commit2cfa55185a5fc7d93a160a4e9a4730aae6725b0f (patch)
treec57169b5a3d717f4e68b8ec5d2d6e220d1456434
parentd1da0a1086fa25f22739277fbf32ba1b3745317d (diff)
parent394525e32994e605093c87d3a9fad2a4202f3401 (diff)
Merge pull request #885 from ThibG/glitch-soc/merge-upstream
Merge upstream changes
-rw-r--r--.eslintignore43
-rw-r--r--.eslintrc.js199
-rw-r--r--.eslintrc.yml177
-rw-r--r--AUTHORS.md89
-rw-r--r--CHANGELOG.md105
-rw-r--r--Gemfile6
-rw-r--r--Gemfile.lock26
-rw-r--r--app/controllers/admin/domain_blocks_controller.rb11
-rw-r--r--app/controllers/admin/followers_controller.rb6
-rw-r--r--app/controllers/admin/instances_controller.rb27
-rw-r--r--app/controllers/admin/statuses_controller.rb2
-rw-r--r--app/controllers/api/v1/accounts_controller.rb2
-rw-r--r--app/controllers/api/v1/custom_emojis_controller.rb4
-rw-r--r--app/controllers/api/v1/scheduled_statuses_controller.rb77
-rw-r--r--app/controllers/api/v1/statuses_controller.rb9
-rw-r--r--app/controllers/concerns/signature_verification.rb45
-rw-r--r--app/controllers/remote_interaction_controller.rb5
-rw-r--r--app/helpers/admin/filter_helper.rb3
-rw-r--r--app/javascript/flavours/glitch/components/account.js4
-rw-r--r--app/javascript/flavours/glitch/components/media_gallery.js4
-rw-r--r--app/javascript/flavours/glitch/features/status/components/card.js6
-rw-r--r--app/javascript/flavours/glitch/packs/public.js28
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss14
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss9
-rw-r--r--app/javascript/flavours/glitch/styles/dashboard.scss1
-rw-r--r--app/javascript/mastodon/components/account.js4
-rw-r--r--app/javascript/mastodon/components/media_gallery.js4
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js9
-rw-r--r--app/javascript/mastodon/features/account/components/action_bar.js8
-rw-r--r--app/javascript/mastodon/features/getting_started/index.js23
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js9
-rw-r--r--app/javascript/mastodon/features/status/components/card.js6
-rw-r--r--app/javascript/mastodon/initial_state.js1
-rw-r--r--app/javascript/mastodon/locales/ar.json2
-rw-r--r--app/javascript/mastodon/locales/ast.json2
-rw-r--r--app/javascript/mastodon/locales/bg.json2
-rw-r--r--app/javascript/mastodon/locales/ca.json48
-rw-r--r--app/javascript/mastodon/locales/co.json6
-rw-r--r--app/javascript/mastodon/locales/cs.json8
-rw-r--r--app/javascript/mastodon/locales/cy.json2
-rw-r--r--app/javascript/mastodon/locales/da.json10
-rw-r--r--app/javascript/mastodon/locales/de.json6
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json20
-rw-r--r--app/javascript/mastodon/locales/el.json6
-rw-r--r--app/javascript/mastodon/locales/en.json2
-rw-r--r--app/javascript/mastodon/locales/eo.json2
-rw-r--r--app/javascript/mastodon/locales/es.json2
-rw-r--r--app/javascript/mastodon/locales/eu.json50
-rw-r--r--app/javascript/mastodon/locales/fa.json2
-rw-r--r--app/javascript/mastodon/locales/fi.json2
-rw-r--r--app/javascript/mastodon/locales/fr.json4
-rw-r--r--app/javascript/mastodon/locales/gl.json4
-rw-r--r--app/javascript/mastodon/locales/he.json2
-rw-r--r--app/javascript/mastodon/locales/hr.json2
-rw-r--r--app/javascript/mastodon/locales/hu.json2
-rw-r--r--app/javascript/mastodon/locales/hy.json2
-rw-r--r--app/javascript/mastodon/locales/id.json2
-rw-r--r--app/javascript/mastodon/locales/io.json2
-rw-r--r--app/javascript/mastodon/locales/it.json50
-rw-r--r--app/javascript/mastodon/locales/ja.json2
-rw-r--r--app/javascript/mastodon/locales/ka.json2
-rw-r--r--app/javascript/mastodon/locales/ko.json6
-rw-r--r--app/javascript/mastodon/locales/lv.json358
-rw-r--r--app/javascript/mastodon/locales/ms.json2
-rw-r--r--app/javascript/mastodon/locales/nl.json6
-rw-r--r--app/javascript/mastodon/locales/no.json2
-rw-r--r--app/javascript/mastodon/locales/oc.json10
-rw-r--r--app/javascript/mastodon/locales/pl.json4
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json48
-rw-r--r--app/javascript/mastodon/locales/pt.json2
-rw-r--r--app/javascript/mastodon/locales/ro.json172
-rw-r--r--app/javascript/mastodon/locales/ru.json2
-rw-r--r--app/javascript/mastodon/locales/sk.json18
-rw-r--r--app/javascript/mastodon/locales/sl.json2
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json2
-rw-r--r--app/javascript/mastodon/locales/sr.json2
-rw-r--r--app/javascript/mastodon/locales/sv.json2
-rw-r--r--app/javascript/mastodon/locales/ta.json2
-rw-r--r--app/javascript/mastodon/locales/te.json70
-rw-r--r--app/javascript/mastodon/locales/th.json2
-rw-r--r--app/javascript/mastodon/locales/tr.json2
-rw-r--r--app/javascript/mastodon/locales/uk.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_lv.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json2
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json2
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json2
-rw-r--r--app/javascript/packs/public.js28
-rw-r--r--app/javascript/styles/mastodon/admin.scss14
-rw-r--r--app/javascript/styles/mastodon/components.scss10
-rw-r--r--app/javascript/styles/mastodon/dashboard.scss1
-rw-r--r--app/lib/activitypub/activity.rb2
-rw-r--r--app/lib/activitypub/activity/follow.rb2
-rw-r--r--app/lib/activitypub/activity/move.rb43
-rw-r--r--app/lib/activitypub/adapter.rb1
-rw-r--r--app/models/account.rb23
-rw-r--r--app/models/concerns/account_associations.rb1
-rw-r--r--app/models/concerns/account_finder_concern.rb4
-rw-r--r--app/models/instance.rb21
-rw-r--r--app/models/instance_filter.rb17
-rw-r--r--app/models/media_attachment.rb38
-rw-r--r--app/models/relay.rb2
-rw-r--r--app/models/scheduled_status.rb39
-rw-r--r--app/policies/instance_policy.rb2
-rw-r--r--app/serializers/activitypub/actor_serializer.rb5
-rw-r--r--app/serializers/rest/scheduled_status_serializer.rb15
-rw-r--r--app/services/activitypub/fetch_remote_account_service.rb8
-rw-r--r--app/services/activitypub/process_account_service.rb11
-rw-r--r--app/services/app_sign_up_service.rb2
-rw-r--r--app/services/follow_service.rb2
-rw-r--r--app/services/post_status_service.rb176
-rw-r--r--app/services/report_service.rb2
-rw-r--r--app/services/suspend_account_service.rb1
-rw-r--r--app/validators/note_length_validator.rb22
-rw-r--r--app/validators/unreserved_username_validator.rb16
-rw-r--r--app/validators/url_validator.rb4
-rw-r--r--app/views/admin/domain_blocks/_domain_block.html.haml13
-rw-r--r--app/views/admin/domain_blocks/index.html.haml17
-rw-r--r--app/views/admin/followers/index.html.haml2
-rw-r--r--app/views/admin/instances/_instance.html.haml7
-rw-r--r--app/views/admin/instances/index.html.haml48
-rw-r--r--app/views/admin/instances/show.html.haml44
-rw-r--r--app/views/remote_follow/new.html.haml4
-rw-r--r--app/views/remote_interaction/new.html.haml10
-rw-r--r--app/views/stream_entries/_detailed_status.html.haml10
-rw-r--r--app/views/stream_entries/_simple_status.html.haml10
-rw-r--r--app/workers/publish_scheduled_status_worker.rb24
-rw-r--r--app/workers/scheduler/scheduled_statuses_scheduler.rb19
-rw-r--r--app/workers/unfollow_follow_worker.rb18
-rw-r--r--config/initializers/paperclip.rb2
-rw-r--r--config/locales/ar.yml77
-rw-r--r--config/locales/ast.yml5
-rw-r--r--config/locales/ca.yml45
-rw-r--r--config/locales/co.yml45
-rw-r--r--config/locales/cs.yml71
-rw-r--r--config/locales/cy.yml13
-rw-r--r--config/locales/da.yml20
-rw-r--r--config/locales/de.yml43
-rw-r--r--config/locales/devise.ar.yml1
-rw-r--r--config/locales/devise.ca.yml1
-rw-r--r--config/locales/devise.co.yml3
-rw-r--r--config/locales/devise.cs.yml1
-rw-r--r--config/locales/devise.da.yml1
-rw-r--r--config/locales/devise.de.yml1
-rw-r--r--config/locales/devise.el.yml1
-rw-r--r--config/locales/devise.eu.yml1
-rw-r--r--config/locales/devise.fr.yml1
-rw-r--r--config/locales/devise.gl.yml1
-rw-r--r--config/locales/devise.it.yml1
-rw-r--r--config/locales/devise.ja.yml1
-rw-r--r--config/locales/devise.nl.yml1
-rw-r--r--config/locales/devise.oc.yml1
-rw-r--r--config/locales/devise.pl.yml1
-rw-r--r--config/locales/devise.pt-BR.yml1
-rw-r--r--config/locales/devise.ru.yml2
-rw-r--r--config/locales/devise.sk.yml3
-rw-r--r--config/locales/doorkeeper.cs.yml2
-rw-r--r--config/locales/el.yml43
-rw-r--r--config/locales/en.yml52
-rw-r--r--config/locales/eo.yml13
-rw-r--r--config/locales/es.yml13
-rw-r--r--config/locales/eu.yml46
-rw-r--r--config/locales/fa.yml13
-rw-r--r--config/locales/fi.yml10
-rw-r--r--config/locales/fr.yml43
-rw-r--r--config/locales/gl.yml45
-rw-r--r--config/locales/he.yml7
-rw-r--r--config/locales/hu.yml10
-rw-r--r--config/locales/id.yml7
-rw-r--r--config/locales/io.yml7
-rw-r--r--config/locales/it.yml13
-rw-r--r--config/locales/ja.yml45
-rw-r--r--config/locales/ka.yml13
-rw-r--r--config/locales/ko.yml43
-rw-r--r--config/locales/lv.yml1
-rw-r--r--config/locales/ms.yml10
-rw-r--r--config/locales/nl.yml39
-rw-r--r--config/locales/no.yml10
-rw-r--r--config/locales/oc.yml43
-rw-r--r--config/locales/pl.yml49
-rw-r--r--config/locales/pt-BR.yml45
-rw-r--r--config/locales/pt.yml10
-rw-r--r--config/locales/ro.yml112
-rw-r--r--config/locales/ru.yml13
-rw-r--r--config/locales/simple_form.ar.yml13
-rw-r--r--config/locales/simple_form.ca.yml19
-rw-r--r--config/locales/simple_form.co.yml19
-rw-r--r--config/locales/simple_form.cs.yml21
-rw-r--r--config/locales/simple_form.da.yml12
-rw-r--r--config/locales/simple_form.de.yml19
-rw-r--r--config/locales/simple_form.el.yml19
-rw-r--r--config/locales/simple_form.eu.yml18
-rw-r--r--config/locales/simple_form.fr.yml19
-rw-r--r--config/locales/simple_form.gl.yml19
-rw-r--r--config/locales/simple_form.it.yml19
-rw-r--r--config/locales/simple_form.ja.yml19
-rw-r--r--config/locales/simple_form.ko.yml19
-rw-r--r--config/locales/simple_form.nl.yml11
-rw-r--r--config/locales/simple_form.oc.yml19
-rw-r--r--config/locales/simple_form.pl.yml19
-rw-r--r--config/locales/simple_form.pt-BR.yml19
-rw-r--r--config/locales/simple_form.ro.yml29
-rw-r--r--config/locales/simple_form.sk.yml29
-rw-r--r--config/locales/sk.yml59
-rw-r--r--config/locales/sl.yml2
-rw-r--r--config/locales/sr-Latn.yml10
-rw-r--r--config/locales/sr.yml13
-rw-r--r--config/locales/sv.yml10
-rw-r--r--config/locales/te.yml123
-rw-r--r--config/locales/th.yml7
-rw-r--r--config/locales/tr.yml7
-rw-r--r--config/locales/uk.yml10
-rw-r--r--config/locales/zh-CN.yml10
-rw-r--r--config/locales/zh-HK.yml10
-rw-r--r--config/locales/zh-TW.yml10
-rw-r--r--config/navigation.rb3
-rw-r--r--config/routes.rb9
-rw-r--r--config/settings.yml14
-rw-r--r--config/sidekiq.yml3
-rw-r--r--db/migrate/20181207011115_downcase_custom_emoji_domains.rb10
-rw-r--r--db/migrate/20181226021420_add_also_known_as_to_accounts.rb5
-rw-r--r--db/migrate/20190103124649_create_scheduled_statuses.rb9
-rw-r--r--db/migrate/20190103124754_add_scheduled_status_id_to_media_attachments.rb8
-rw-r--r--db/schema.rb15
-rw-r--r--db/seeds.rb2
-rw-r--r--docker-compose.yml5
-rw-r--r--lib/mastodon/version.rb6
-rw-r--r--package.json9
-rw-r--r--postcss.config.js14
-rw-r--r--spec/controllers/admin/domain_blocks_controller_spec.rb24
-rw-r--r--spec/controllers/api/v1/conversations_controller_spec.rb2
-rw-r--r--spec/controllers/api/v1/media_controller_spec.rb12
-rw-r--r--spec/controllers/api/v1/notifications_controller_spec.rb4
-rw-r--r--spec/controllers/api/v1/timelines/home_controller_spec.rb2
-rw-r--r--spec/controllers/api/v1/timelines/list_controller_spec.rb2
-rw-r--r--spec/controllers/api/v1/timelines/public_controller_spec.rb4
-rw-r--r--spec/controllers/api/v1/timelines/tag_controller_spec.rb2
-rw-r--r--spec/fabricators/scheduled_status_fabricator.rb4
-rw-r--r--spec/helpers/jsonld_helper_spec.rb28
-rw-r--r--spec/lib/activitypub/activity/move_spec.rb52
-rw-r--r--spec/lib/feed_manager_spec.rb8
-rw-r--r--spec/models/account_warning_preset_spec.rb5
-rw-r--r--spec/models/account_warning_spec.rb5
-rw-r--r--spec/models/scheduled_status_spec.rb4
-rw-r--r--spec/policies/instance_policy_spec.rb2
-rw-r--r--spec/services/batched_remove_status_service_spec.rb4
-rw-r--r--spec/services/post_status_service_spec.rb44
-rw-r--r--spec/services/remove_status_service_spec.rb2
-rw-r--r--spec/services/resolve_account_service_spec.rb2
-rw-r--r--spec/validators/unreserved_username_validator_spec.rb44
-rw-r--r--spec/validators/url_validator_spec.rb34
-rw-r--r--spec/workers/publish_scheduled_status_worker_spec.rb23
-rw-r--r--vendor/.keep (renamed from vendor/assets/javascripts/.keep)0
-rw-r--r--vendor/assets/stylesheets/.keep0
-rw-r--r--yarn.lock8
254 files changed, 3402 insertions, 1438 deletions
diff --git a/.eslintignore b/.eslintignore
index 6d540c413..d4930e1f5 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,30 +1,13 @@
-# See https://help.github.com/articles/ignoring-files for more about ignoring files.
-#
-# If you find yourself ignoring temporary files generated by your text editor
-# or operating system, you probably want to add a global ignore instead:
-#   git config --global core.excludesfile '~/.gitignore_global'
-
-# Ignore bundler config.
-/.bundle
-
-# Ignore the default SQLite database.
-/db/*.sqlite3
-/db/*.sqlite3-journal
-
-# Ignore all logfiles and tempfiles.
-/log/*
-!/log/.keep
-/tmp
-coverage
-public/system
-public/assets
-.env
-.env.production
-node_modules/
-neo4j/
-
-# Ignore Vagrant files
-.vagrant/
-
-# Ignore Capistrano customizations
-config/deploy/*
+/build/**
+/coverage/**
+/db/**
+/lib/**
+/log/**
+/node_modules/**
+/nonobox/**
+/public/**
+!/public/embed.js
+/spec/**
+/tmp/**
+/vendor/**
+!.eslintrc.js
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000..56e3d0530
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,199 @@
+module.exports = {
+  root: true,
+
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+    jest: true,
+  },
+
+  globals: {
+    ATTACHMENT_HOST: false,
+  },
+
+  parser: 'babel-eslint',
+
+  plugins: [
+    'react',
+    'jsx-a11y',
+    'import',
+    'promise',
+  ],
+
+  parserOptions: {
+    sourceType: 'module',
+    ecmaFeatures: {
+      experimentalObjectRestSpread: true,
+      jsx: true,
+    },
+    ecmaVersion: 2018,
+  },
+
+  settings: {
+    react: {
+      version: 'detect',
+    },
+    'import/extensions': [
+      '.js',
+    ],
+    'import/ignore': [
+      'node_modules',
+      '\\.(css|scss|json)$',
+    ],
+  },
+
+  rules: {
+    'brace-style': 'warn',
+    'comma-dangle': ['error', 'always-multiline'],
+    'comma-spacing': [
+      'warn',
+      {
+        before: false,
+        after: true,
+      },
+    ],
+    'comma-style': ['warn', 'last'],
+    'consistent-return': 'error',
+    'dot-notation': 'error',
+    eqeqeq: 'error',
+    indent: ['warn', 2],
+    'jsx-quotes': ['error', 'prefer-single'],
+    'no-catch-shadow': 'error',
+    'no-cond-assign': 'error',
+    'no-console': [
+      'warn',
+      {
+        allow: [
+          'error',
+          'warn',
+        ],
+      },
+    ],
+    'no-fallthrough': 'error',
+    'no-irregular-whitespace': 'error',
+    'no-mixed-spaces-and-tabs': 'warn',
+    'no-nested-ternary': 'warn',
+    'no-trailing-spaces': 'warn',
+    'no-undef': 'error',
+    'no-unreachable': 'error',
+    'no-unused-expressions': 'error',
+    'no-unused-vars': [
+      'error',
+      {
+        vars: 'all',
+        args: 'after-used',
+        ignoreRestSiblings: true,
+      },
+    ],
+    'object-curly-spacing': ['error', 'always'],
+    'padded-blocks': [
+      'error',
+      {
+        classes: 'always',
+      },
+    ],
+    quotes: ['error', 'single'],
+    semi: 'error',
+    strict: 'off',
+    'valid-typeof': 'error',
+
+    'react/jsx-boolean-value': 'error',
+    'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
+    'react/jsx-curly-spacing': 'error',
+    'react/jsx-equals-spacing': 'error',
+    'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
+    'react/jsx-indent': ['error', 2],
+    'react/jsx-no-bind': 'error',
+    'react/jsx-no-duplicate-props': 'error',
+    'react/jsx-no-undef': 'error',
+    'react/jsx-tag-spacing': 'error',
+    'react/jsx-uses-react': 'error',
+    'react/jsx-uses-vars': 'error',
+    'react/jsx-wrap-multilines': 'error',
+    'react/no-multi-comp': 'off',
+    'react/no-string-refs': 'error',
+    'react/prop-types': 'error',
+    'react/self-closing-comp': 'error',
+
+    'jsx-a11y/accessible-emoji': 'warn',
+    'jsx-a11y/alt-text': 'warn',
+    'jsx-a11y/anchor-has-content': 'warn',
+    'jsx-a11y/anchor-is-valid': [
+      'warn',
+      {
+        components: [
+          'Link',
+          'NavLink',
+        ],
+        specialLink: [
+          'to',
+        ],
+        aspect: [
+          'noHref',
+          'invalidHref',
+          'preferButton',
+        ],
+      },
+    ],
+    'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
+    'jsx-a11y/aria-props': 'warn',
+    'jsx-a11y/aria-proptypes': 'warn',
+    'jsx-a11y/aria-role': 'warn',
+    'jsx-a11y/aria-unsupported-elements': 'warn',
+    'jsx-a11y/heading-has-content': 'warn',
+    'jsx-a11y/html-has-lang': 'warn',
+    'jsx-a11y/iframe-has-title': 'warn',
+    'jsx-a11y/img-redundant-alt': 'warn',
+    'jsx-a11y/interactive-supports-focus': 'warn',
+    'jsx-a11y/label-has-for': 'off',
+    'jsx-a11y/mouse-events-have-key-events': 'warn',
+    'jsx-a11y/no-access-key': 'warn',
+    'jsx-a11y/no-distracting-elements': 'warn',
+    'jsx-a11y/no-noninteractive-element-interactions': [
+      'warn',
+      {
+        handlers: [
+          'onClick',
+        ],
+      },
+    ],
+    'jsx-a11y/no-onchange': 'warn',
+    'jsx-a11y/no-redundant-roles': 'warn',
+    'jsx-a11y/no-static-element-interactions': [
+      'warn',
+      {
+        handlers: [
+          'onClick',
+        ],
+      },
+    ],
+    'jsx-a11y/role-has-required-aria-props': 'warn',
+    'jsx-a11y/role-supports-aria-props': 'off',
+    'jsx-a11y/scope': 'warn',
+    'jsx-a11y/tabindex-no-positive': 'warn',
+
+    'import/extensions': [
+      'error',
+      'always',
+      {
+        js: 'never',
+      },
+    ],
+    'import/newline-after-import': 'error',
+    'import/no-extraneous-dependencies': [
+      'error',
+      {
+        devDependencies: [
+          'config/webpack/**',
+          'app/javascript/mastodon/test_setup.js',
+          'app/javascript/**/__tests__/**',
+        ],
+      },
+    ],
+    'import/no-unresolved': 'error',
+    'import/no-webpack-loader-syntax': 'error',
+
+    'promise/catch-or-return': 'error',
+  },
+};
diff --git a/.eslintrc.yml b/.eslintrc.yml
deleted file mode 100644
index 10b87a8c3..000000000
--- a/.eslintrc.yml
+++ /dev/null
@@ -1,177 +0,0 @@
----
-root: true
-
-env:
-  browser: true
-  node: true
-  es6: true
-  jest: true
-
-globals:
-  ATTACHMENT_HOST: false
-
-parser: babel-eslint
-
-plugins:
-- react
-- jsx-a11y
-- import
-- promise
-
-parserOptions:
-  sourceType: module
-  ecmaFeatures:
-    experimentalObjectRestSpread: true
-    jsx: true
-  ecmaVersion: 2018
-
-settings:
-  react:
-    version: detect
-  import/extensions:
-  - .js
-  import/ignore:
-  - node_modules
-  - \\.(css|scss|json)$
-  import/resolver:
-    node:
-      moduleDirectory:
-        - node_modules
-        - app/javascript
-
-rules:
-  brace-style: warn
-  comma-dangle:
-  - error
-  - always-multiline
-  comma-spacing:
-  - warn
-  - before: false
-    after: true
-  comma-style:
-  - warn
-  - last
-  consistent-return: error
-  dot-notation: error
-  eqeqeq: error
-  indent:
-  - warn
-  - 2
-  jsx-quotes:
-  - error
-  - prefer-single
-  no-catch-shadow: error
-  no-cond-assign: error
-  no-console:
-  - warn
-  - allow:
-    - error
-    - warn
-  no-fallthrough: error
-  no-irregular-whitespace: error
-  no-mixed-spaces-and-tabs: warn
-  no-nested-ternary: warn
-  no-trailing-spaces: warn
-  no-undef: error
-  no-unreachable: error
-  no-unused-expressions: error
-  no-unused-vars:
-  - error
-  - vars: all
-    args: after-used
-    ignoreRestSiblings: true
-  object-curly-spacing:
-  - error
-  - always
-  padded-blocks:
-  - error
-  - classes: always
-  quotes:
-  - error
-  - single
-  semi: error
-  strict: off
-  valid-typeof: error
-
-  react/jsx-boolean-value: error
-  react/jsx-closing-bracket-location:
-  - error
-  - line-aligned
-  react/jsx-curly-spacing: error
-  react/jsx-equals-spacing: error
-  react/jsx-first-prop-new-line:
-  - error
-  - multiline-multiprop
-  react/jsx-indent:
-  - error
-  - 2
-  react/jsx-no-bind: error
-  react/jsx-no-duplicate-props: error
-  react/jsx-no-undef: error
-  react/jsx-tag-spacing: error
-  react/jsx-uses-react: error
-  react/jsx-uses-vars: error
-  react/jsx-wrap-multilines: error
-  react/no-multi-comp: off
-  react/no-string-refs: error
-  react/prop-types: error
-  react/self-closing-comp: error
-
-  jsx-a11y/accessible-emoji: warn
-  jsx-a11y/alt-text: warn
-  jsx-a11y/anchor-has-content: warn
-  jsx-a11y/anchor-is-valid:
-  - warn
-  - components:
-    - Link
-    - NavLink
-    specialLink:
-    - to
-    aspect:
-    - noHref
-    - invalidHref
-    - preferButton
-  jsx-a11y/aria-activedescendant-has-tabindex: warn
-  jsx-a11y/aria-props: warn
-  jsx-a11y/aria-proptypes: warn
-  jsx-a11y/aria-role: warn
-  jsx-a11y/aria-unsupported-elements: warn
-  jsx-a11y/heading-has-content: warn
-  jsx-a11y/html-has-lang: warn
-  jsx-a11y/iframe-has-title: warn
-  jsx-a11y/img-redundant-alt: warn
-  jsx-a11y/interactive-supports-focus: warn
-  jsx-a11y/label-has-for: off
-  jsx-a11y/mouse-events-have-key-events: warn
-  jsx-a11y/no-access-key: warn
-  jsx-a11y/no-distracting-elements: warn
-  jsx-a11y/no-noninteractive-element-interactions:
-  - warn
-  - handlers:
-    - onClick
-  jsx-a11y/no-onchange: warn
-  jsx-a11y/no-redundant-roles: warn
-  jsx-a11y/no-static-element-interactions:
-  - warn
-  - handlers:
-    - onClick
-  jsx-a11y/role-has-required-aria-props: warn
-  jsx-a11y/role-supports-aria-props: off
-  jsx-a11y/scope: warn
-  jsx-a11y/tabindex-no-positive: warn
-
-  import/extensions:
-  - error
-  - always
-  - js: never
-  import/newline-after-import: error
-  import/no-extraneous-dependencies:
-  - error
-  - devDependencies:
-    - "config/webpack/**"
-    - "app/javascript/mastodon/test_setup.js"
-    - "app/javascript/**/__tests__/**"
-  import/no-unresolved: error
-  import/no-webpack-loader-syntax: error
-
-  promise/catch-or-return: error
diff --git a/AUTHORS.md b/AUTHORS.md
index b81b6d245..dfbd2cdcd 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -4,38 +4,38 @@ and provided thanks to the work of the following contributors:
 * [Gargron](https://github.com/Gargron)
 * [ykzts](https://github.com/ykzts)
 * [akihikodaki](https://github.com/akihikodaki)
-* [mjankowski](https://github.com/mjankowski)
 * [ThibG](https://github.com/ThibG)
+* [mjankowski](https://github.com/mjankowski)
 * [unarist](https://github.com/unarist)
 * [m4sk1n](https://github.com/m4sk1n)
+* [dependabot[bot]](https://github.com/apps/dependabot)
 * [yiskah](https://github.com/yiskah)
 * [nolanlawson](https://github.com/nolanlawson)
 * [sorin-davidoi](https://github.com/sorin-davidoi)
+* [ysksn](https://github.com/ysksn)
 * [abcang](https://github.com/abcang)
 * [lynlynlynx](https://github.com/lynlynlynx)
-* [dependabot[bot]](https://github.com/apps/dependabot)
 * [alpaca-tc](https://github.com/alpaca-tc)
+* [mayaeh](https://github.com/mayaeh)
+* [renatolond](https://github.com/renatolond)
 * [nclm](https://github.com/nclm)
 * [ineffyble](https://github.com/ineffyble)
-* [renatolond](https://github.com/renatolond)
 * [jeroenpraat](https://github.com/jeroenpraat)
-* [mayaeh](https://github.com/mayaeh)
 * [blackle](https://github.com/blackle)
 * [Quent-in](https://github.com/Quent-in)
 * [JantsoP](https://github.com/JantsoP)
+* [mabkenar](https://github.com/mabkenar)
 * [nullkal](https://github.com/nullkal)
 * [yookoala](https://github.com/yookoala)
-* [mabkenar](https://github.com/mabkenar)
-* [ysksn](https://github.com/ysksn)
+* [Kjwon15](https://github.com/Kjwon15)
 * [shuheiktgw](https://github.com/shuheiktgw)
 * [ashfurrow](https://github.com/ashfurrow)
-* [Kjwon15](https://github.com/Kjwon15)
+* [Quenty31](https://github.com/Quenty31)
 * [zunda](https://github.com/zunda)
 * [eramdam](https://github.com/eramdam)
-* [masarakki](https://github.com/masarakki)
 * [takayamaki](https://github.com/takayamaki)
+* [masarakki](https://github.com/masarakki)
 * [ticky](https://github.com/ticky)
-* [Quenty31](https://github.com/Quenty31)
 * [danhunsaker](https://github.com/danhunsaker)
 * [ThisIsMissEm](https://github.com/ThisIsMissEm)
 * [hcmiya](https://github.com/hcmiya)
@@ -88,16 +88,19 @@ and provided thanks to the work of the following contributors:
 * [mistydemeo](https://github.com/mistydemeo)
 * [dunn](https://github.com/dunn)
 * [xqus](https://github.com/xqus)
+* [hugogameiro](https://github.com/hugogameiro)
 * [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
 * [fakenine](https://github.com/fakenine)
 * [tsuwatch](https://github.com/tsuwatch)
 * [victorhck](https://github.com/victorhck)
+* [ashleyhull-versent](https://github.com/ashleyhull-versent)
+* [kedamaDQ](https://github.com/kedamaDQ)
 * [puckipedia](https://github.com/puckipedia)
 * [fvh-P](https://github.com/fvh-P)
 * [contraexemplo](https://github.com/contraexemplo)
-* [hugogameiro](https://github.com/hugogameiro)
 * [kazu9su](https://github.com/kazu9su)
 * [Komic](https://github.com/Komic)
+* [lmorchard](https://github.com/lmorchard)
 * [diomed](https://github.com/diomed)
 * [ariasuni](https://github.com/ariasuni)
 * [Neetshin](mailto:neetshin@neetsh.in)
@@ -105,7 +108,6 @@ and provided thanks to the work of the following contributors:
 * [ProgVal](https://github.com/ProgVal)
 * [valentin2105](https://github.com/valentin2105)
 * [yuntan](https://github.com/yuntan)
-* [ashleyhull-versent](https://github.com/ashleyhull-versent)
 * [goofy-bz](mailto:goofy@babelzilla.org)
 * [kadiix](https://github.com/kadiix)
 * [kodacs](https://github.com/kodacs)
@@ -119,35 +121,37 @@ and provided thanks to the work of the following contributors:
 * [northerner](https://github.com/northerner)
 * [fhemberger](https://github.com/fhemberger)
 * [greysteil](https://github.com/greysteil)
-* [hnrysmth](https://github.com/hnrysmth)
+* [hensmith](https://github.com/hensmith)
+* [hinaloe](https://github.com/hinaloe)
 * [d6rkaiz](https://github.com/d6rkaiz)
+* [Reverite](https://github.com/Reverite)
 * [JMendyk](https://github.com/JMendyk)
 * [JohnD28](https://github.com/JohnD28)
 * [znz](https://github.com/znz)
 * [Naouak](https://github.com/Naouak)
+* [pawelngei](https://github.com/pawelngei)
 * [reneklacan](https://github.com/reneklacan)
 * [ekiru](https://github.com/ekiru)
 * [tcitworld](https://github.com/tcitworld)
 * [geta6](https://github.com/geta6)
 * [happycoloredbanana](https://github.com/happycoloredbanana)
-* [kedamaDQ](https://github.com/kedamaDQ)
 * [leopku](https://github.com/leopku)
 * [SansPseudoFix](https://github.com/SansPseudoFix)
 * [tomfhowe](https://github.com/tomfhowe)
 * [noraworld](https://github.com/noraworld)
 * [theboss](https://github.com/theboss)
 * [178inaba](https://github.com/178inaba)
+* [Aditoo17](https://github.com/Aditoo17)
 * [alyssais](https://github.com/alyssais)
 * [kodnaplakal](https://github.com/kodnaplakal)
 * [stalker314314](https://github.com/stalker314314)
 * [huertanix](https://github.com/huertanix)
 * [genesixx](https://github.com/genesixx)
 * [halkeye](https://github.com/halkeye)
-* [hinaloe](https://github.com/hinaloe)
 * [treby](https://github.com/treby)
-* [Reverite](https://github.com/Reverite)
 * [jpdevries](https://github.com/jpdevries)
-* [H-C-F](https://github.com/H-C-F)
+* [gdpelican](https://github.com/gdpelican)
+* [kmichl](https://github.com/kmichl)
 * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 * [saper](https://github.com/saper)
 * [nevillepark](https://github.com/nevillepark)
@@ -157,6 +161,7 @@ and provided thanks to the work of the following contributors:
 * [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
 * [harukasan](https://github.com/harukasan)
 * [stamak](https://github.com/stamak)
+* [noellabo](https://github.com/noellabo)
 * [Technowix](mailto:technowix@users.noreply.github.com)
 * [Eychics](https://github.com/Eychics)
 * [Thor Harald Johansen](mailto:thj@thj.no)
@@ -165,22 +170,27 @@ and provided thanks to the work of the following contributors:
 * [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
 * [R0ckweb](https://github.com/R0ckweb)
 * [caasi](https://github.com/caasi)
+* [chr-1x](https://github.com/chr-1x)
 * [esetomo](https://github.com/esetomo)
 * [foxiehkins](https://github.com/foxiehkins)
 * [hoodie](mailto:hoodiekitten@outlook.com)
 * [luzi82](https://github.com/luzi82)
 * [duxovni](https://github.com/duxovni)
+* [trwnh](https://github.com/trwnh)
 * [unsmell](https://github.com/unsmell)
+* [valerauko](https://github.com/valerauko)
 * [chriswmartin](https://github.com/chriswmartin)
 * [vahnj](https://github.com/vahnj)
 * [ikuradon](https://github.com/ikuradon)
 * [AndreLewin](https://github.com/AndreLewin)
 * [rinsuki](https://github.com/rinsuki)
+* [0xflotus](https://github.com/0xflotus)
 * [redtachyons](https://github.com/redtachyons)
 * [thurloat](https://github.com/thurloat)
 * [aaribaud](https://github.com/aaribaud)
 * [Andrew](mailto:andrewlchronister@gmail.com)
 * [estuans](https://github.com/estuans)
+* [BenLubar](https://github.com/BenLubar)
 * [dissolve](https://github.com/dissolve)
 * [PurpleBooth](https://github.com/PurpleBooth)
 * [bradurani](https://github.com/bradurani)
@@ -192,7 +202,7 @@ and provided thanks to the work of the following contributors:
 * [cdutson](https://github.com/cdutson)
 * [farlistener](https://github.com/farlistener)
 * [DavidLibeau](https://github.com/DavidLibeau)
-* [SirCmpwn](https://github.com/SirCmpwn)
+* [ddevault](https://github.com/ddevault)
 * [Fjoerfoks](https://github.com/Fjoerfoks)
 * [fmauNeko](https://github.com/fmauNeko)
 * [gloaec](https://github.com/gloaec)
@@ -207,6 +217,7 @@ and provided thanks to the work of the following contributors:
 * [jasonrhodes](https://github.com/jasonrhodes)
 * [Jason Snell](mailto:jason@newrelic.com)
 * [jviide](https://github.com/jviide)
+* [YuleZ](https://github.com/YuleZ)
 * [crakaC](https://github.com/crakaC)
 * [tkbky](https://github.com/tkbky)
 * [Kaylee](mailto:kaylee@codethat.sucks)
@@ -223,10 +234,12 @@ and provided thanks to the work of the following contributors:
 * [petzah](https://github.com/petzah)
 * [ignisf](https://github.com/ignisf)
 * [raymestalez](https://github.com/raymestalez)
+* [remram44](https://github.com/remram44)
 * [sascha-sl](https://github.com/sascha-sl)
 * [u1-liquid](https://github.com/u1-liquid)
 * [sim6](https://github.com/sim6)
 * [stemid](https://github.com/stemid)
+* [sumdog](https://github.com/sumdog)
 * [ThomasLeister](https://github.com/ThomasLeister)
 * [mcat-ee](https://github.com/mcat-ee)
 * [tototoshi](https://github.com/tototoshi)
@@ -243,7 +256,6 @@ and provided thanks to the work of the following contributors:
 * [aus-social](https://github.com/aus-social)
 * [imbsky](https://github.com/imbsky)
 * [bsky](mailto:me@imbsky.net)
-* [chr-1x](https://github.com/chr-1x)
 * [codl](https://github.com/codl)
 * [cpsdqs](https://github.com/cpsdqs)
 * [barzamin](https://github.com/barzamin)
@@ -252,6 +264,7 @@ and provided thanks to the work of the following contributors:
 * [ik11235](https://github.com/ik11235)
 * [kawax](https://github.com/kawax)
 * [007lva](https://github.com/007lva)
+* [mbajur](https://github.com/mbajur)
 * [matsurai25](https://github.com/matsurai25)
 * [mecab](https://github.com/mecab)
 * [nicobz25](https://github.com/nicobz25)
@@ -259,7 +272,6 @@ and provided thanks to the work of the following contributors:
 * [pinfort](https://github.com/pinfort)
 * [rbaumert](https://github.com/rbaumert)
 * [rhoio](https://github.com/rhoio)
-* [trwnh](https://github.com/trwnh)
 * [usagi-f](https://github.com/usagi-f)
 * [vidarlee](https://github.com/vidarlee)
 * [vjackson725](https://github.com/vjackson725)
@@ -269,11 +281,11 @@ and provided thanks to the work of the following contributors:
 * [Awea](https://github.com/Awea)
 * [halcy](https://github.com/halcy)
 * [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf)
-* [NecroTechno](https://github.com/NecroTechno)
 * [8398a7](https://github.com/8398a7)
 * [857b](https://github.com/857b)
 * [insom](https://github.com/insom)
-* [Aditoo17](https://github.com/Aditoo17)
+* [tachyons](https://github.com/tachyons)
+* [Esteth](https://github.com/Esteth)
 * [unascribed](https://github.com/unascribed)
 * [Aguay-val](https://github.com/Aguay-val)
 * [Akihiko Odaki](mailto:nekomanma@pixiv.co.jp)
@@ -283,6 +295,7 @@ and provided thanks to the work of the following contributors:
 * [alxrcs](https://github.com/alxrcs)
 * [console-cowboy](https://github.com/console-cowboy)
 * [pointlessone](https://github.com/pointlessone)
+* [Alkarex](https://github.com/Alkarex)
 * [a2](https://github.com/a2)
 * [0xa](https://github.com/0xa)
 * [palindromordnilap](https://github.com/palindromordnilap)
@@ -299,7 +312,6 @@ and provided thanks to the work of the following contributors:
 * [ayumin](https://github.com/ayumin)
 * [BaptisteGelez](https://github.com/BaptisteGelez)
 * [bzg](https://github.com/bzg)
-* [BenLubar](https://github.com/BenLubar)
 * [benediktg](https://github.com/benediktg)
 * [blakebarnett](https://github.com/blakebarnett)
 * [bradj](https://github.com/bradj)
@@ -341,6 +353,7 @@ and provided thanks to the work of the following contributors:
 * [espenronnevik](https://github.com/espenronnevik)
 * [Finariel](https://github.com/Finariel)
 * [siuying](https://github.com/siuying)
+* [fwenzel](https://github.com/fwenzel)
 * [GenbuHase](https://github.com/GenbuHase)
 * [hattori6789](https://github.com/hattori6789)
 * [algernon](https://github.com/algernon)
@@ -375,10 +388,9 @@ and provided thanks to the work of the following contributors:
 * [jguerder](https://github.com/jguerder)
 * [Jehops](https://github.com/Jehops)
 * [joshuap](https://github.com/joshuap)
-* [YuleZ](https://github.com/YuleZ)
 * [Tiwy57](https://github.com/Tiwy57)
 * [xuv](https://github.com/xuv)
-* [Jnsll](https://github.com/Jnsll)
+* [June Sallou](mailto:jnsll@users.noreply.github.com)
 * [j0k3r](https://github.com/j0k3r)
 * [KEINOS](https://github.com/KEINOS)
 * [futoase](https://github.com/futoase)
@@ -389,7 +401,6 @@ and provided thanks to the work of the following contributors:
 * [k0ta0uchi](https://github.com/k0ta0uchi)
 * [KrzysiekJ](https://github.com/KrzysiekJ)
 * [leowzukw](https://github.com/leowzukw)
-* [lmorchard](https://github.com/lmorchard)
 * [Tak](https://github.com/Tak)
 * [cacheflow](https://github.com/cacheflow)
 * [ldidry](https://github.com/ldidry)
@@ -426,6 +437,7 @@ and provided thanks to the work of the following contributors:
 * [lae](https://github.com/lae)
 * [Nanamachi](https://github.com/Nanamachi)
 * [orinthe](https://github.com/orinthe)
+* [NecroTechno](https://github.com/NecroTechno)
 * [Dar13](https://github.com/Dar13)
 * [ngerakines](https://github.com/ngerakines)
 * [vonneudeck](https://github.com/vonneudeck)
@@ -443,7 +455,6 @@ and provided thanks to the work of the following contributors:
 * [Pangoraw](https://github.com/Pangoraw)
 * [peterkeen](https://github.com/peterkeen)
 * [pgate](https://github.com/pgate)
-* [remram44](https://github.com/remram44)
 * [retokromer](https://github.com/retokromer)
 * [rfwatson](https://github.com/rfwatson)
 * [rfreebern](https://github.com/rfreebern)
@@ -455,19 +466,22 @@ and provided thanks to the work of the following contributors:
 * [sts10](https://github.com/sts10)
 * [skoji](https://github.com/skoji)
 * [ScienJus](https://github.com/ScienJus)
-* [larkinscott](https://github.com/larkinscott)
-* [imolein](https://github.com/imolein)
-* [blinry](https://github.com/blinry)
-* [Noiwex](https://github.com/Noiwex)
-* [yuki764](https://github.com/yuki764)
-* [shnjp](https://github.com/shnjp)
-* [ernix](https://github.com/ernix)
-* [rosylilly](https://github.com/rosylilly)
-* [shouko](https://github.com/shouko)
+* [Scott Larkin](mailto:scott@codeclimate.com)
+* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
+* [Sebastian Morr](mailto:sebastian@morr.cc)
+* [Sergei Č](mailto:noiwex1911@gmail.com)
+* [Setuu](mailto:yuki764setuu@gmail.com)
+* [Shaun Gillies](mailto:me@shaungillies.net)
+* [Shin Adachi](mailto:shn@glucose.jp)
+* [Shin Kojima](mailto:shin@kojima.org)
+* [Sho Kusano](mailto:rosylilly@aduca.org)
+* [Shouko Yu](mailto:imshouko@gmail.com)
 * [Sina Mashek](mailto:sina@mashek.xyz)
-* [sossii](https://github.com/sossii)
+* [Sir-Boops](mailto:admin@boops.me)
+* [Soshi Kato](mailto:mail@sossii.com)
 * [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
 * [StefOfficiel](mailto:pichard.stephane@free.fr)
+* [Steven Tappert](mailto:admin@dark-it.net)
 * [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
 * [Sébastien Santoro](mailto:dereckson@espace-win.org)
 * [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
@@ -521,11 +535,13 @@ and provided thanks to the work of the following contributors:
 * [jacob](mailto:jacobherringtondeveloper@gmail.com)
 * [jenn kaplan](mailto:me@jkap.io)
 * [jirayudech](mailto:jirayudech@gmail.com)
+* [jomo](mailto:github@jomo.tv)
 * [jooops](mailto:joops@autistici.org)
 * [jukper](mailto:jukkaperanto@gmail.com)
 * [jumoru](mailto:jumoru@mailbox.org)
 * [karlyeurl](mailto:karl.yeurl@gmail.com)
 * [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
+* [kodai](mailto:shirafuta.kodai@gmail.com)
 * [kuro5hin](mailto:rusty@kuro5hin.org)
 * [luzpaz](mailto:luzpaz@users.noreply.github.com)
 * [maxypy](mailto:maxime@mpigou.fr)
@@ -533,6 +549,7 @@ and provided thanks to the work of the following contributors:
 * [mimikun](mailto:dzdzble_effort_311@outlook.jp)
 * [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
 * [muan](mailto:muan@github.com)
+* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
 * [neetshin](mailto:neetshin@neetsh.in)
 * [nightpool](mailto:nightpool@users.noreply.github.com)
 * [rch850](mailto:rich850@gmail.com)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e24df451..0ce92ec00 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,111 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## [Unreleased]
+### Added
+
+- Add link for adding a user to a list from their profile (#9062)
+- Add joining several hashtags in a single column (#8904)
+- Add volume sliders for videos (#9366)
+- Add a tooltip explaining what a locked account is (#9403)
+- Add preloaded cache for common JSON-LD contexts (#9412)
+- Add profile directory (#9427)
+- Add setting to not group reblogs in home feed (#9248)
+- Add admin ability to remove a user's header image (#9495)
+- Add account hashtags to ActivityPub actor JSON (#9450)
+- Add error message for avatar image that's too large (#9518)
+- Add notification quick-filter bar (#9399)
+- Add new first-time tutorial (#9531)
+- Add moderation warnings (#9519)
+- Add emoji codepoint mappings for v11.0 (#9618)
+- Add REST API for creating an account (#9572)
+- Add support for Malayalam in language filter (#9624)
+- Add exclude_reblogs option to account statuses API (#9640)
+- Add local followers page to admin account UI (#9610)
+- Add healthcheck commands to docker-compose.yml (#9143)
+- Add handler for Move activity to migrate followers (#9629)
+- Add CSV export for lists and domain blocks (#9677)
+- Add `tootctl accounts follow ACCT` (#9414)
+- Add scheduled statuses (#9706)
+- Add immutable caching for S3 objects (#9722)
+- Add cache to custom emojis API (#9732)
+- Add preview cards to non-detailed statuses on public pages (#9714)
+- Add `mod` and `moderator` to list of default reserved usernames (#9713)
+- Add quick links to the admin interface in the web UI (#8545)
+
+### Changed
+
+- Temporarily pause timeline if mouse moved recently (#9200)
+- Change the password form order (#9267)
+- Redesign admin UI for accounts (#9340, #9643)
+- Redesign admin UI for instances/domain blocks (#9645)
+- Swap avatar and header input fields in profile page (#9271)
+- When posting in mobile mode, go back to previous history location (#9502)
+- Split out is_changing_upload from is_submitting (#9536)
+- Back to the getting-started when pins the timeline. (#9561)
+- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses (#9573)
+- Limit maximum visibility of local silenced users to unlisted (#9583)
+- Change API error message for unconfirmed accounts (#9625)
+- Change the icon to "reply-all" when it's a reply to other accounts (#9378)
+- Do not ignore federated reports targetting already-reported accounts (#9534)
+- Upgrade default Ruby version to 2.6.0 (#9688)
+- Change e-mail digest frequency (#9689)
+- Change Docker images for Tor support in docker-compose.yml (#9438)
+- Display fallback link card thumbnail when none is given (#9715)
+- Change account bio length validation to ignore mention domains and URLs (#9717)
+- Use configured contact user for "anonymous" federation activities (#9661)
+- Change remote interaction dialog to use specific actions instead of generic "interact" (#9743)
+- Always re-fetch public key when signature verification fails to support blind key rotation (#9667)
+- Make replies to boosts impossible, connect reply to original status instead (#9129)
+- Change e-mail MX validation to check both A and MX records against blacklist (#9489)
+
+### Removed
+
+- Remove links to bridge.joinmastodon.org (non-functional) (#9608)
+- Remove LD-Signatures from activities that do not need them (#9659)
+
+### Fixed
+
+- Remove unused computation of reblog references from updateTimeline (#9244)
+- Fix loaded embeds resetting if a status arrives from API again (#9270)
+- Fix race condition causing shallow status with only a "favourited" attribute (#9272)
+- Remove intermediary arrays when creating hash maps from results (#9291)
+- Extract counters from accounts table to account_stats table to improve performance (#9295)
+- Change identities id column to a bigint (#9371)
+- Fix conversations API pagination (#9407)
+- Improve account suspension speed and completeness (#9290)
+- Fix thread depth computation in statuses_controller (#9426)
+- Fix database deadlocks by moving account stats update outside transaction (#9437)
+- Escape HTML in profile name preview in profile settings (#9446)
+- Use same CORS policy for /@:username and /users/:username (#9485)
+- Make custom emoji domains case insensitive (#9474)
+- Various fixes to scrollable lists and media gallery (#9501)
+- Fix bootsnap cache directory being declared relatively (#9511)
+- Fix timeline pagination in the web UI (#9516)
+- Fix padding on dropdown elements in preferences (#9517)
+- Make avatar and headers respect GIF autoplay settings (#9515)
+- Do no retry Web Push workers if the server returns a 4xx response (#9434)
+- Minor scrollable list fixes (#9551)
+- Ignore low-confidence CharlockHolmes guesses when parsing link cards (#9510)
+- Fix `tootctl accounts rotate` not updating public keys (#9556)
+- Fix CSP / X-Frame-Options for media players (#9558)
+- Fix unnecessary loadMore calls when the end of a timeline has been reached (#9581)
+- Skip mailer job retries when a record no longer exists (#9590)
+- Fix composer not getting focus after reply confirmation dialog (#9602)
+- Fix signature verification stoplight triggering on non-timeout errors (#9617)
+- Fix ThreadResolveWorker getting queued with invalid URLs (#9628)
+- Fix crash when clearing uninitialized timeline (#9662)
+- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker (#9660)
+- Skip full text search if it fails, instead of erroring out completely (#9654)
+- Fix profile metadata links not verifying correctly sometimes (#9673)
+- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order (#9687)
+- Fix unreadable text color in report modal for some statuses (#9716)
+- Stop GIFV timeline preview explicitly when it's opened in modal (#9749)
+
+### Security
+
+- Sanitize and sandbox toot embeds in web UI (#9552)
+
 ## [2.6.5] - 2018-12-01
 ### Changed
 
diff --git a/Gemfile b/Gemfile
index 01d637b70..3912180a1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -53,12 +53,12 @@ gem 'htmlentities', '~> 4.3'
 gem 'http', '~> 3.3'
 gem 'http_accept_language', '~> 2.1'
 gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2'
-gem 'httplog', '~> 1.1'
+gem 'httplog', '~> 1.2'
 gem 'idn-ruby', require: 'idn'
 gem 'kaminari', '~> 1.1'
 gem 'link_header', '~> 0.0'
 gem 'mime-types', '~> 3.2', require: 'mime/types/columnar'
-gem 'nokogiri', '~> 1.9'
+gem 'nokogiri', '~> 1.10'
 gem 'nsa', '~> 0.2'
 gem 'oj', '~> 3.7'
 gem 'ostatus2', '~> 2.0'
@@ -128,7 +128,7 @@ group :development do
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.3'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.61', require: false
+  gem 'rubocop', '~> 0.62', require: false
   gem 'brakeman', '~> 4.3', require: false
   gem 'bundler-audit', '~> 0.6', require: false
   gem 'scss_lint', '~> 0.57', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 35a41c6a6..7d2878483 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -268,7 +268,7 @@ GEM
       domain_name (~> 0.5)
     http-form_data (2.1.1)
     http_accept_language (2.1.1)
-    httplog (1.1.1)
+    httplog (1.2.0)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
     i18n (1.1.1)
@@ -356,7 +356,7 @@ GEM
       net-ssh (>= 2.6.5)
     net-ssh (5.0.2)
     nio4r (2.3.1)
-    nokogiri (1.9.1)
+    nokogiri (1.10.0)
       mini_portile2 (~> 2.4.0)
     nokogumbo (2.0.0)
       nokogiri (~> 1.8, >= 1.8.4)
@@ -365,7 +365,7 @@ GEM
       concurrent-ruby (~> 1.0.0)
       sidekiq (>= 3.5.0)
       statsd-ruby (~> 1.2.0)
-    oj (3.7.4)
+    oj (3.7.6)
     omniauth (1.9.0)
       hashie (>= 3.4.6, < 3.7.0)
       rack (>= 1.6.2, < 3)
@@ -392,7 +392,7 @@ GEM
       av (~> 0.9.0)
       paperclip (>= 2.5.2)
     parallel (1.12.1)
-    parallel_tests (2.27.0)
+    parallel_tests (2.27.1)
       parallel
     parser (2.5.3.0)
       ast (~> 2.4.0)
@@ -418,7 +418,7 @@ GEM
     pry-byebug (3.6.0)
       byebug (~> 10.0)
       pry (~> 0.10)
-    pry-rails (0.3.8)
+    pry-rails (0.3.9)
       pry (>= 0.10.4)
     public_suffix (3.0.3)
     puma (3.12.0)
@@ -527,7 +527,7 @@ GEM
       rspec-core (~> 3.0, >= 3.0.0)
       sidekiq (>= 2.4.0)
     rspec-support (3.8.0)
-    rubocop (0.61.1)
+    rubocop (0.62.0)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
       parser (>= 2.5, != 2.5.1.1)
@@ -607,7 +607,7 @@ GEM
     tty-command (0.8.2)
       pastel (~> 0.7.0)
     tty-cursor (0.6.0)
-    tty-prompt (0.18.0)
+    tty-prompt (0.18.1)
       necromancer (~> 0.4.0)
       pastel (~> 0.7.0)
       timers (~> 4.0)
@@ -622,12 +622,12 @@ GEM
       unf (~> 0.1.0)
     tzinfo (1.2.5)
       thread_safe (~> 0.1)
-    tzinfo-data (1.2018.7)
+    tzinfo-data (1.2018.9)
       tzinfo (>= 1.0.0)
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.5)
-    unicode-display_width (1.4.0)
+    unicode-display_width (1.4.1)
     uniform_notifier (1.12.1)
     warden (1.2.7)
       rack (>= 1.0)
@@ -639,7 +639,7 @@ GEM
       activesupport (>= 4.2)
       rack-proxy (>= 0.6.1)
       railties (>= 4.2)
-    webpush (0.3.4)
+    webpush (0.3.5)
       hkdf (~> 0.2)
       jwt (~> 2.0)
     websocket-driver (0.7.0)
@@ -695,7 +695,7 @@ DEPENDENCIES
   http (~> 3.3)
   http_accept_language (~> 2.1)
   http_parser.rb (~> 0.6)!
-  httplog (~> 1.1)
+  httplog (~> 1.2)
   i18n-tasks (~> 0.9)
   idn-ruby
   iso-639
@@ -712,7 +712,7 @@ DEPENDENCIES
   microformats (~> 4.0)
   mime-types (~> 3.2)
   net-ldap (~> 0.10)
-  nokogiri (~> 1.9)
+  nokogiri (~> 1.10)
   nsa (~> 0.2)
   oj (~> 3.7)
   omniauth (~> 1.9)
@@ -746,7 +746,7 @@ DEPENDENCIES
   rqrcode (~> 0.10)
   rspec-rails (~> 3.8)
   rspec-sidekiq (~> 3.0)
-  rubocop (~> 0.61)
+  rubocop (~> 0.62)
   sanitize (~> 5.0)
   scss_lint (~> 0.57)
   sidekiq (~> 5.2)
diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb
index 90c70275a..5f307ddee 100644
--- a/app/controllers/admin/domain_blocks_controller.rb
+++ b/app/controllers/admin/domain_blocks_controller.rb
@@ -4,14 +4,9 @@ module Admin
   class DomainBlocksController < BaseController
     before_action :set_domain_block, only: [:show, :destroy]
 
-    def index
-      authorize :domain_block, :index?
-      @domain_blocks = DomainBlock.page(params[:page])
-    end
-
     def new
       authorize :domain_block, :create?
-      @domain_block = DomainBlock.new
+      @domain_block = DomainBlock.new(domain: params[:_domain])
     end
 
     def create
@@ -22,7 +17,7 @@ module Admin
       if @domain_block.save
         DomainBlockWorker.perform_async(@domain_block.id)
         log_action :create, @domain_block
-        redirect_to admin_domain_blocks_path, notice: I18n.t('admin.domain_blocks.created_msg')
+        redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
       else
         render :new
       end
@@ -36,7 +31,7 @@ module Admin
       authorize @domain_block, :destroy?
       UnblockDomainService.new.call(@domain_block, retroactive_unblock?)
       log_action :destroy, @domain_block
-      redirect_to admin_domain_blocks_path, notice: I18n.t('admin.domain_blocks.destroyed_msg')
+      redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.destroyed_msg')
     end
 
     private
diff --git a/app/controllers/admin/followers_controller.rb b/app/controllers/admin/followers_controller.rb
index 819628b20..d826f47c5 100644
--- a/app/controllers/admin/followers_controller.rb
+++ b/app/controllers/admin/followers_controller.rb
@@ -8,15 +8,11 @@ module Admin
 
     def index
       authorize :account, :index?
-      @followers = followers.recent.page(params[:page]).per(PER_PAGE)
+      @followers = @account.followers.local.recent.page(params[:page]).per(PER_PAGE)
     end
 
     def set_account
       @account = Account.find(params[:account_id])
     end
-
-    def followers
-      Follow.includes(:account).where(target_account: @account)
-    end
   end
 end
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index 6f8eaf65c..431ce6f4d 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -4,14 +4,21 @@ module Admin
   class InstancesController < BaseController
     def index
       authorize :instance, :index?
+
       @instances = ordered_instances
     end
 
-    def resubscribe
-      authorize :instance, :resubscribe?
-      params.require(:by_domain)
-      Pubsubhubbub::SubscribeWorker.push_bulk(subscribeable_accounts.pluck(:id))
-      redirect_to admin_instances_path
+    def show
+      authorize :instance, :show?
+
+      @instance        = Instance.new(Account.by_domain_accounts.find_by(domain: params[:id]) || DomainBlock.find_by!(domain: params[:id]))
+      @following_count = Follow.where(account: Account.where(domain: params[:id])).count
+      @followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
+      @reports_count   = Report.where(target_account: Account.where(domain: params[:id])).count
+      @blocks_count    = Block.where(target_account: Account.where(domain: params[:id])).count
+      @available       = DeliveryFailureTracker.available?(Account.select(:shared_inbox_url).where(domain: params[:id]).first&.shared_inbox_url)
+      @media_storage   = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
+      @domain_block    = DomainBlock.find_by(domain: params[:id])
     end
 
     private
@@ -27,17 +34,11 @@ module Admin
     helper_method :paginated_instances
 
     def ordered_instances
-      paginated_instances.map { |account| Instance.new(account) }
-    end
-
-    def subscribeable_accounts
-      Account.remote.where(protocol: :ostatus).where(domain: params[:by_domain])
+      paginated_instances.map { |resource| Instance.new(resource) }
     end
 
     def filter_params
-      params.permit(
-        :domain_name
-      )
+      params.permit(:limited)
     end
   end
 end
diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb
index 62f49806c..650195034 100644
--- a/app/controllers/admin/statuses_controller.rb
+++ b/app/controllers/admin/statuses_controller.rb
@@ -26,7 +26,7 @@ module Admin
       authorize :status, :index?
 
       @statuses = @account.statuses.where(id: params[:id])
-      authorize @statuses[0], :show?
+      authorize @statuses.first, :show?
 
       @form = Form::StatusBatch.new
     end
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 6e4084c4e..2ccbc3cbb 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -76,7 +76,7 @@ class Api::V1::AccountsController < Api::BaseController
   end
 
   def account_params
-    params.permit(:username, :email, :password, :agreement)
+    params.permit(:username, :email, :password, :agreement, :locale)
   end
 
   def check_enabled_registrations
diff --git a/app/controllers/api/v1/custom_emojis_controller.rb b/app/controllers/api/v1/custom_emojis_controller.rb
index f8cd64455..7bac27da4 100644
--- a/app/controllers/api/v1/custom_emojis_controller.rb
+++ b/app/controllers/api/v1/custom_emojis_controller.rb
@@ -4,6 +4,8 @@ class Api::V1::CustomEmojisController < Api::BaseController
   respond_to :json
 
   def index
-    render json: CustomEmoji.local.where(disabled: false), each_serializer: REST::CustomEmojiSerializer
+    render_cached_json('api:v1:custom_emojis', expires_in: 1.minute) do
+      ActiveModelSerializers::SerializableResource.new(CustomEmoji.local.where(disabled: false), each_serializer: REST::CustomEmojiSerializer)
+    end
   end
 end
diff --git a/app/controllers/api/v1/scheduled_statuses_controller.rb b/app/controllers/api/v1/scheduled_statuses_controller.rb
new file mode 100644
index 000000000..9950296f3
--- /dev/null
+++ b/app/controllers/api/v1/scheduled_statuses_controller.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+class Api::V1::ScheduledStatusesController < Api::BaseController
+  include Authorization
+
+  before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, except: [:update, :destroy]
+  before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:update, :destroy]
+
+  before_action :set_statuses, only: :index
+  before_action :set_status, except: :index
+
+  after_action :insert_pagination_headers, only: :index
+
+  def index
+    render json: @statuses, each_serializer: REST::ScheduledStatusSerializer
+  end
+
+  def show
+    render json: @status, serializer: REST::ScheduledStatusSerializer
+  end
+
+  def update
+    @status.update!(scheduled_status_params)
+    render json: @status, serializer: REST::ScheduledStatusSerializer
+  end
+
+  def destroy
+    @status.destroy!
+    render_empty
+  end
+
+  private
+
+  def set_statuses
+    @statuses = current_account.scheduled_statuses.paginate_by_id(limit_param(DEFAULT_STATUSES_LIMIT), params_slice(:max_id, :since_id, :min_id))
+  end
+
+  def set_status
+    @status = current_account.scheduled_statuses.find(params[:id])
+  end
+
+  def scheduled_status_params
+    params.permit(:scheduled_at)
+  end
+
+  def pagination_params(core_params)
+    params.slice(:limit).permit(:limit).merge(core_params)
+  end
+
+  def insert_pagination_headers
+    set_pagination_headers(next_path, prev_path)
+  end
+
+  def next_path
+    if records_continue?
+      api_v1_scheduled_statuses_url pagination_params(max_id: pagination_max_id)
+    end
+  end
+
+  def prev_path
+    unless @statuses.empty?
+      api_v1_scheduled_statuses_url pagination_params(min_id: pagination_since_id)
+    end
+  end
+
+  def records_continue?
+    @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
+  end
+
+  def pagination_max_id
+    @statuses.last.id
+  end
+
+  def pagination_since_id
+    @statuses.first.id
+  end
+end
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 49a52f7a6..29b420c67 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -45,16 +45,17 @@ class Api::V1::StatusesController < Api::BaseController
 
   def create
     @status = PostStatusService.new.call(current_user.account,
-                                         status_params[:status],
-                                         status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id]),
+                                         text: status_params[:status],
+                                         thread: status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id]),
                                          media_ids: status_params[:media_ids],
                                          sensitive: status_params[:sensitive],
                                          spoiler_text: status_params[:spoiler_text],
                                          visibility: status_params[:visibility],
+                                         scheduled_at: status_params[:scheduled_at],
                                          application: doorkeeper_token.application,
                                          idempotency: request.headers['Idempotency-Key'])
 
-    render json: @status, serializer: REST::StatusSerializer
+    render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
   end
 
   def destroy
@@ -77,7 +78,7 @@ class Api::V1::StatusesController < Api::BaseController
   end
 
   def status_params
-    params.permit(:status, :in_reply_to_id, :sensitive, :spoiler_text, :visibility, media_ids: [])
+    params.permit(:status, :in_reply_to_id, :sensitive, :spoiler_text, :visibility, :scheduled_at, media_ids: [])
   end
 
   def pagination_params(core_params)
diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb
index 887096e8b..91566c4fa 100644
--- a/app/controllers/concerns/signature_verification.rb
+++ b/app/controllers/concerns/signature_verification.rb
@@ -60,23 +60,26 @@ module SignatureVerification
     signature             = Base64.decode64(signature_params['signature'])
     compare_signed_string = build_signed_string(signature_params['headers'])
 
-    if account.keypair.public_key.verify(OpenSSL::Digest::SHA256.new, signature, compare_signed_string)
-      @signed_request_account = account
-      @signed_request_account
-    elsif account.possibly_stale?
-      account = account.refresh!
+    return account unless verify_signature(account, signature, compare_signed_string).nil?
 
-      if account.keypair.public_key.verify(OpenSSL::Digest::SHA256.new, signature, compare_signed_string)
-        @signed_request_account = account
-        @signed_request_account
-      else
-        @signature_verification_failure_reason = "Verification failed for #{account.username}@#{account.domain} #{account.uri}"
-        @signed_request_account = nil
-      end
-    else
-      @signature_verification_failure_reason = "Verification failed for #{account.username}@#{account.domain} #{account.uri}"
+    account_stoplight = Stoplight("source:#{request.ip}") { account.possibly_stale? ? account.refresh! : account_refresh_key(account) }
+      .with_fallback { nil }
+      .with_threshold(1)
+      .with_cool_off_time(5.minutes.seconds)
+      .with_error_handler { |error, handle| error.is_a?(HTTP::Error) ? handle.call(error) : raise(error) }
+
+    account = account_stoplight.run
+
+    if account.nil?
+      @signature_verification_failure_reason = "Public key not found for key #{signature_params['keyId']}"
       @signed_request_account = nil
+      return
     end
+
+    return account unless verify_signature(account, signature, compare_signed_string).nil?
+
+    @signature_verification_failure_reason = "Verification failed for #{account.username}@#{account.domain} #{account.uri}"
+    @signed_request_account = nil
   end
 
   def request_body
@@ -85,6 +88,15 @@ module SignatureVerification
 
   private
 
+  def verify_signature(account, signature, compare_signed_string)
+    if account.keypair.public_key.verify(OpenSSL::Digest::SHA256.new, signature, compare_signed_string)
+      @signed_request_account = account
+      @signed_request_account
+    end
+  rescue OpenSSL::PKey::RSAError
+    nil
+  end
+
   def build_signed_string(signed_headers)
     signed_headers = 'date' if signed_headers.blank?
 
@@ -131,4 +143,9 @@ module SignatureVerification
       account
     end
   end
+
+  def account_refresh_key(account)
+    return if account.local? || !account.activitypub?
+    ActivityPub::FetchRemoteAccountService.new.call(account.uri, only_key: true)
+  end
 end
diff --git a/app/controllers/remote_interaction_controller.rb b/app/controllers/remote_interaction_controller.rb
index 6861f3f21..d7197d434 100644
--- a/app/controllers/remote_interaction_controller.rb
+++ b/app/controllers/remote_interaction_controller.rb
@@ -5,6 +5,7 @@ class RemoteInteractionController < ApplicationController
 
   layout 'modal'
 
+  before_action :set_interaction_type
   before_action :set_status
   before_action :set_body_classes
   before_action :set_pack
@@ -50,4 +51,8 @@ class RemoteInteractionController < ApplicationController
   def set_pack
     use_pack 'modal'
   end
+
+  def set_interaction_type
+    @interaction_type = %w(reply reblog favourite).include?(params[:type]) ? params[:type] : 'reply'
+  end
 end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 8807cc784..97beb587f 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -6,8 +6,9 @@ module Admin::FilterHelper
   INVITE_FILTER        = %i(available expired).freeze
   CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
   TAGS_FILTERS         = %i(hidden).freeze
+  INSTANCES_FILTERS    = %i(limited).freeze
 
-  FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS
+  FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS
 
   def filter_link_to(text, link_to_params, link_class_params = link_to_params)
     new_url = filtered_url_for(link_to_params)
diff --git a/app/javascript/flavours/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js
index 80f20b8ad..072c601e0 100644
--- a/app/javascript/flavours/glitch/components/account.js
+++ b/app/javascript/flavours/glitch/components/account.js
@@ -67,10 +67,10 @@ export default class Account extends ImmutablePureComponent {
 
     if (hidden) {
       return (
-        <div>
+        <Fragment>
           {account.get('display_name')}
           {account.get('username')}
-        </div>
+        </Fragment>
       );
     }
 
diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index 10afeb2eb..d0226bbbb 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -71,6 +71,10 @@ class Item extends React.PureComponent {
     const { index, onClick } = this.props;
 
     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      if (this.hoverToPlay()) {
+        e.target.pause();
+        e.target.currentTime = 0;
+      }
       e.preventDefault();
       onClick(index);
     }
diff --git a/app/javascript/flavours/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js
index 743fe779a..1e1604d5c 100644
--- a/app/javascript/flavours/glitch/features/status/components/card.js
+++ b/app/javascript/flavours/glitch/features/status/components/card.js
@@ -195,6 +195,12 @@ export default class Card extends React.PureComponent {
           {thumbnail}
         </div>
       );
+    } else {
+      embed = (
+        <div className='status-card__image'>
+          <i className='fa fa-file-text' />
+        </div>
+      );
     }
 
     return (
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index 996f8f3d1..342c5265e 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -12,6 +12,17 @@ function main() {
   const Rellax = require('rellax');
   const createHistory = require('history').createBrowserHistory;
 
+  const scrollToDetailedStatus = () => {
+    const history = createHistory();
+    const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status');
+    const location = history.location;
+
+    if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) {
+      detailedStatuses[0].scrollIntoView();
+      history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true });
+    }
+  };
+
   ready(() => {
     const locale = document.documentElement.lang;
 
@@ -54,8 +65,14 @@ function main() {
 
           ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
           document.body.appendChild(content);
+          scrollToDetailedStatus();
         })
-        .catch(error => console.error(error));
+        .catch(error => {
+          console.error(error);
+          scrollToDetailedStatus();
+        });
+    } else {
+      scrollToDetailedStatus();
     }
 
     const parallaxComponents = document.querySelectorAll('.parallax');
@@ -63,15 +80,6 @@ function main() {
     if (parallaxComponents.length > 0 ) {
       new Rellax('.parallax', { speed: -1 });
     }
-
-    const history = createHistory();
-    const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status');
-    const location = history.location;
-
-    if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) {
-      detailedStatuses[0].scrollIntoView();
-      history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true });
-    }
   });
 }
 
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 8b111a936..e7124a2c0 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -151,6 +151,20 @@ $no-columns-breakpoint: 600px;
       font-weight: 500;
     }
 
+    .directory__tag a {
+      box-shadow: none;
+    }
+
+    .directory__tag h4 {
+      font-size: 18px;
+      font-weight: 700;
+      color: $primary-text-color;
+      text-transform: none;
+      padding-bottom: 0;
+      margin-bottom: 0;
+      border-bottom: none;
+    }
+
     & > p {
       font-size: 14px;
       line-height: 18px;
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 38ead06cf..9d2757065 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -740,6 +740,15 @@ a.status-card {
   flex: 0 0 100px;
   background: lighten($ui-base-color, 8%);
   position: relative;
+
+  & > .fa {
+    font-size: 21px;
+    position: absolute;
+    transform-origin: 50% 50%;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
 }
 
 .status-card.horizontal {
diff --git a/app/javascript/flavours/glitch/styles/dashboard.scss b/app/javascript/flavours/glitch/styles/dashboard.scss
index 1f96e7368..e4564f062 100644
--- a/app/javascript/flavours/glitch/styles/dashboard.scss
+++ b/app/javascript/flavours/glitch/styles/dashboard.scss
@@ -39,6 +39,7 @@
     color: $primary-text-color;
     font-family: $font-display, sans-serif;
     margin-bottom: 20px;
+    line-height: 30px;
   }
 
   &__text {
diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js
index 2bcea8b67..206030c00 100644
--- a/app/javascript/mastodon/components/account.js
+++ b/app/javascript/mastodon/components/account.js
@@ -68,10 +68,10 @@ class Account extends ImmutablePureComponent {
 
     if (hidden) {
       return (
-        <div>
+        <Fragment>
           {account.get('display_name')}
           {account.get('username')}
-        </div>
+        </Fragment>
       );
     }
 
diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js
index ed0e4ff1b..c507920d0 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/mastodon/components/media_gallery.js
@@ -51,6 +51,10 @@ class Item extends React.PureComponent {
     const { index, onClick } = this.props;
 
     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      if (this.hoverToPlay()) {
+        e.target.pause();
+        e.target.currentTime = 0;
+      }
       e.preventDefault();
       onClick(index);
     }
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index becd44ec0..0995a1490 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -5,7 +5,7 @@ import IconButton from './icon_button';
 import DropdownMenuContainer from '../containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me } from '../initial_state';
+import { me, isStaff } from '../initial_state';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -30,6 +30,8 @@ const messages = defineMessages({
   pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },
   unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
+  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
+  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
 });
 
 const obfuscatedCount = count => {
@@ -182,6 +184,11 @@ class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+      if (isStaff) {
+        menu.push(null);
+        menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
+        menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+      }
     }
 
     if (status.get('visibility') === 'direct') {
diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js
index e6ae1a2fd..8ed4c917a 100644
--- a/app/javascript/mastodon/features/account/components/action_bar.js
+++ b/app/javascript/mastodon/features/account/components/action_bar.js
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
 import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
 import { NavLink } from 'react-router-dom';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { me } from '../../../initial_state';
+import { me, isStaff  } from '../../../initial_state';
 import { shortNumberFormat } from '../../../utils/numbers';
 
 const messages = defineMessages({
@@ -35,6 +35,7 @@ const messages = defineMessages({
   endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
   unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
   add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
+  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
 });
 
 export default @injectIntl
@@ -151,6 +152,11 @@ class ActionBar extends React.PureComponent {
       }
     }
 
+    if (account.get('id') !== me && isStaff) {
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
+    }
+
     return (
       <div>
         {extraInfo}
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index feecfd0e4..709a3aa96 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -32,6 +32,7 @@ const messages = defineMessages({
   personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },
   security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
   menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
+  profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' },
 });
 
 const mapStateToProps = state => ({
@@ -87,10 +88,29 @@ class GettingStarted extends ImmutablePureComponent {
         <ColumnSubheading key={i++} text={intl.formatMessage(messages.discover)} />,
         <ColumnLink key={i++} icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />,
         <ColumnLink key={i++} icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />,
+      );
+
+      height += 34 + 48*2;
+
+      if (profile_directory) {
+        navItems.push(
+          <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} href='/explore' />
+        );
+
+        height += 48;
+      }
+
+      navItems.push(
         <ColumnSubheading key={i++} text={intl.formatMessage(messages.personal)} />
       );
 
-      height += 34*2 + 48*2;
+      height += 34;
+    } else if (profile_directory) {
+      navItems.push(
+        <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} href='/explore' />
+      );
+
+      height += 48;
     }
 
     navItems.push(
@@ -136,7 +156,6 @@ class GettingStarted extends ImmutablePureComponent {
 
           <div className='getting-started__footer'>
             <ul>
-              {profile_directory && <li><a href='/explore' target='_blank'><FormattedMessage id='getting_started.directory' defaultMessage='Profile directory' /></a> · </li>}
               {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
               {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>}
               <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 3b30d33b2..d3b725283 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -4,7 +4,7 @@ import IconButton from '../../../components/icon_button';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
-import { me } from '../../../initial_state';
+import { me, isStaff } from '../../../initial_state';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -26,6 +26,8 @@ const messages = defineMessages({
   pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },
   unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
+  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
+  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
 });
 
 export default @injectIntl
@@ -145,6 +147,11 @@ class ActionBar extends React.PureComponent {
       menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+      if (isStaff) {
+        menu.push(null);
+        menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
+        menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+      }
     }
 
     const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js
index 235d209b8..8491299ef 100644
--- a/app/javascript/mastodon/features/status/components/card.js
+++ b/app/javascript/mastodon/features/status/components/card.js
@@ -195,6 +195,12 @@ export default class Card extends React.PureComponent {
           {thumbnail}
         </div>
       );
+    } else {
+      embed = (
+        <div className='status-card__image'>
+          <i className='fa fa-file-text' />
+        </div>
+      );
     }
 
     return (
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 1f99c508b..6068246ae 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -17,5 +17,6 @@ export const invitesEnabled = getMeta('invites_enabled');
 export const version = getMeta('version');
 export const mascot = getMeta('mascot');
 export const profile_directory = getMeta('profile_directory');
+export const isStaff = getMeta('is_staff');
 
 export default initialState;
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 3781f394e..f558a6ddc 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "التبويقات",
   "search_results.total": "{count, number} {count, plural, one {result} و {results}}",
   "standalone.public_title": "نظرة على ...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "إلغاء الترقية",
   "status.cannot_reblog": "تعذرت ترقية هذا المنشور",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index e38c45963..a9407e82d 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloquiar a @{name}",
   "status.cancel_reblog_private": "Dexar de compartir",
   "status.cannot_reblog": "Esti artículu nun pue compartise",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index b15e20813..a812f5cb1 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 97568c53a..6b911711e 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Autoritzar",
   "follow_request.reject": "Rebutjar",
   "getting_started.developers": "Desenvolupadors",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Directori de perfils",
   "getting_started.documentation": "Documentació",
   "getting_started.heading": "Començant",
   "getting_started.invite": "Convida gent",
@@ -149,23 +149,23 @@
   "home.column_settings.basic": "Bàsic",
   "home.column_settings.show_reblogs": "Mostrar impulsos",
   "home.column_settings.show_replies": "Mostrar respostes",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Següent",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Les publicacions públiques d'altres servidors del fedivers apareixeran a la línia de temps federada.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "Les publicacions de les persones que segueixes apareixeran a la línia de temps Inici. Pots seguir qualsevol persona de qualsevol servidor!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "Les publicacions públiques de les persones del teu mateix servidor apareixeran a la línia de temps local.",
+  "introduction.interactions.action": "Finalitza el tutorial!",
+  "introduction.interactions.favourite.headline": "Favorit",
+  "introduction.interactions.favourite.text": "Pots desar un toot per a més tard i deixar que l'autor sàpiga que t'ha agradat, marcant-lo com a favorit.",
+  "introduction.interactions.reblog.headline": "Impuls",
+  "introduction.interactions.reblog.text": "Pots compartir amb els teus seguidors els toots d'altres usuaris, impulsant-los.",
+  "introduction.interactions.reply.headline": "Respondre",
+  "introduction.interactions.reply.text": "Pots respondre als toots d'altres persones i als teus propis, que els unirà en una conversa.",
+  "introduction.welcome.action": "Som-hi!",
+  "introduction.welcome.headline": "Primers passos",
+  "introduction.welcome.text": "Benvingut al fedivers! En uns moments podràs emetre missatges i conversar amb els teus amics en una gran varietat de servidors. Però aquest servidor, {domain}, és especial: allotja el teu perfil així que recorda el seu nom.",
   "keyboard_shortcuts.back": "navegar enrera",
   "keyboard_shortcuts.blocked": "per obrir la llista d'usuaris bloquejats",
   "keyboard_shortcuts.boost": "impulsar",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "Estàs segur que vols esborrar permanenment totes les teves notificacions?",
   "notifications.column_settings.alert": "Notificacions d'escriptori",
   "notifications.column_settings.favourite": "Favorits:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
+  "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
+  "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nous seguidors:",
   "notifications.column_settings.mention": "Mencions:",
   "notifications.column_settings.push": "Push notificacions",
   "notifications.column_settings.reblog": "Impulsos:",
   "notifications.column_settings.show": "Mostrar en la columna",
   "notifications.column_settings.sound": "Reproduïr so",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Tots",
+  "notifications.filter.boosts": "Impulsos",
+  "notifications.filter.favourites": "Favorits",
+  "notifications.filter.follows": "Seguiments",
+  "notifications.filter.mentions": "Mencions",
   "notifications.group": "{count} notificacions",
   "privacy.change": "Ajusta l'estat de privacitat",
   "privacy.direct.long": "Publicar només per als usuaris esmentats",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, un {result} altres {results}}",
   "standalone.public_title": "Una mirada a l'interior ...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfer l'impuls",
   "status.cannot_reblog": "Aquesta publicació no pot ser retootejada",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 5d3204943..0277a513b 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Auturizà",
   "follow_request.reject": "Righjittà",
   "getting_started.developers": "Sviluppatori",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Annuariu di i prufili",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Per principià",
   "getting_started.invite": "Invità ghjente",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Statuti",
   "search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}",
   "standalone.public_title": "Una vista à l'internu...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bluccà @{name}",
   "status.cancel_reblog_private": "Ùn sparte più",
   "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu",
@@ -341,7 +343,7 @@
   "upload_area.title": "Drag & drop per caricà un fugliale",
   "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Discrive per i malvistosi",
-  "upload_form.focus": "Riquatrà",
+  "upload_form.focus": "Cambià a vista",
   "upload_form.undo": "Sguassà",
   "upload_progress.label": "Caricamentu...",
   "video.close": "Chjudà a video",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 9058f3b0a..31c21cce5 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -12,7 +12,7 @@
   "account.follow": "Sledovat",
   "account.followers": "Sledovatelé",
   "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
-  "account.follows": "Sleduje",
+  "account.follows": "Sledovaní",
   "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
   "account.follows_you": "Sleduje vás",
   "account.hide_reblogs": "Skrýt boosty od uživatele @{name}",
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Autorizovat",
   "follow_request.reject": "Odmítnout",
   "getting_started.developers": "Vývojáři",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Adresář profilů",
   "getting_started.documentation": "Dokumentace",
   "getting_started.heading": "Začínáme",
   "getting_started.invite": "Pozvat lidi",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Tooty",
   "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledku} other {výsledků}}",
   "standalone.public_title": "Nahlédněte dovnitř...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Zablokovat uživatele @{name}",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
@@ -341,7 +343,7 @@
   "upload_area.title": "Přetažením nahrajete",
   "upload_button.label": "Přidat média (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Popis pro zrakově postižené",
-  "upload_form.focus": "Vystřihnout",
+  "upload_form.focus": "Změnit náhled",
   "upload_form.undo": "Smazat",
   "upload_progress.label": "Nahrávám...",
   "video.close": "Zavřít video",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index e386e7ec0..a25497f78 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Tŵtiau",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Golwg tu fewn...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blocio @{name}",
   "status.cancel_reblog_private": "Dadfŵstio",
   "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 3f350d9f9..60315211a 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -149,7 +149,7 @@
   "home.column_settings.basic": "Grundlæggende",
   "home.column_settings.show_reblogs": "Vis fremhævelser",
   "home.column_settings.show_replies": "Vis svar",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Næste",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
   "introduction.federation.home.headline": "Home",
@@ -251,10 +251,10 @@
   "notifications.column_settings.reblog": "Fremhævelser:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Afspil lyd",
-  "notifications.filter.all": "All",
+  "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
+  "notifications.filter.favourites": "Favoritter",
+  "notifications.filter.follows": "Følger",
   "notifications.filter.mentions": "Mentions",
   "notifications.group": "{count} notifikationer",
   "privacy.change": "Ændre status privatliv",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Trut",
   "search_results.total": "{count, number} {count, plural, et {result} andre {results}}",
   "standalone.public_title": "Et kig indenfor...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloker @{name}",
   "status.cancel_reblog_private": "Fremhæv ikke længere",
   "status.cannot_reblog": "Denne post kan ikke fremhæves",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 73c779646..7d5f0348a 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Erlauben",
   "follow_request.reject": "Ablehnen",
   "getting_started.developers": "Entwickler",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Profilverzeichnis",
   "getting_started.documentation": "Dokumentation",
   "getting_started.heading": "Erste Schritte",
   "getting_started.invite": "Leute einladen",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Beiträge",
   "search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}",
   "standalone.public_title": "Ein kleiner Einblick …",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blockiere @{name}",
   "status.cancel_reblog_private": "Nicht mehr teilen",
   "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
@@ -341,7 +343,7 @@
   "upload_area.title": "Zum Hochladen hereinziehen",
   "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
-  "upload_form.focus": "Zuschneiden",
+  "upload_form.focus": "Thumbnail bearbeiten",
   "upload_form.undo": "Löschen",
   "upload_progress.label": "Wird hochgeladen …",
   "video.close": "Video schließen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index b31218081..b4181ea05 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -302,6 +302,14 @@
       {
         "defaultMessage": "Embed",
         "id": "status.embed"
+      },
+      {
+        "defaultMessage": "Open moderation interface for @{name}",
+        "id": "status.admin_account"
+      },
+      {
+        "defaultMessage": "Open this status in the moderation interface",
+        "id": "status.admin_status"
       }
     ],
     "path": "app/javascript/mastodon/components/status_action_bar.json"
@@ -595,6 +603,10 @@
         "id": "account.add_or_remove_from_list"
       },
       {
+        "defaultMessage": "Open moderation interface for @{name}",
+        "id": "status.admin_account"
+      },
+      {
         "defaultMessage": "Information below may reflect the user's profile incompletely.",
         "id": "account.disclaimer_full"
       },
@@ -1926,6 +1938,14 @@
       {
         "defaultMessage": "Embed",
         "id": "status.embed"
+      },
+      {
+        "defaultMessage": "Open moderation interface for @{name}",
+        "id": "status.admin_account"
+      },
+      {
+        "defaultMessage": "Open this status in the moderation interface",
+        "id": "status.admin_status"
       }
     ],
     "path": "app/javascript/mastodon/features/status/components/action_bar.json"
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 5aca43c28..7b4852271 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Ενέκρινε",
   "follow_request.reject": "Απέρριψε",
   "getting_started.developers": "Ανάπτυξη",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Κατάλογος λογαριασμών",
   "getting_started.documentation": "Τεκμηρίωση",
   "getting_started.heading": "Αφετηρία",
   "getting_started.invite": "Προσκάλεσε κόσμο",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Τουτ",
   "search_results.total": "{count, number} {count, plural, ένα {result} υπόλοιπα {results}}",
   "standalone.public_title": "Μια πρώτη γεύση...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Αποκλεισμός @{name}",
   "status.cancel_reblog_private": "Ακύρωσε την προώθηση",
   "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί",
@@ -341,7 +343,7 @@
   "upload_area.title": "Drag & drop για να ανεβάσεις",
   "upload_button.label": "Πρόσθεσε πολυμέσα (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
-  "upload_form.focus": "Περικοπή",
+  "upload_form.focus": "Αλλαγή προεπισκόπησης",
   "upload_form.undo": "Διαγραφή",
   "upload_progress.label": "Ανεβαίνει...",
   "video.close": "Κλείσε το βίντεο",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 87a894657..3bb157aeb 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -297,6 +297,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 5332ab874..8be964a52 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Mesaĝoj",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
   "standalone.public_title": "Enrigardo…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloki @{name}",
   "status.cancel_reblog_private": "Eksdiskonigi",
   "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index e3c267b40..4f73dbba2 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "standalone.public_title": "Un pequeño vistazo...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Des-impulsar",
   "status.cannot_reblog": "Este toot no puede retootearse",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index b882ae2a7..0602fbf9e 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Baimendu",
   "follow_request.reject": "Ukatu",
   "getting_started.developers": "Garatzaileak",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Profil-direktorioa",
   "getting_started.documentation": "Dokumentazioa",
   "getting_started.heading": "Menua",
   "getting_started.invite": "Gonbidatu jendea",
@@ -149,23 +149,23 @@
   "home.column_settings.basic": "Oinarrizkoa",
   "home.column_settings.show_reblogs": "Erakutsi bultzadak",
   "home.column_settings.show_replies": "Erakutsi erantzunak",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Hurrengoa",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Fedibertsoko beste zerbitzarietako bidalketa publikoak federatutako denbora-lerroan agertuko dira.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "Jarraitzen dituzun horien mezuak zure hasierako jarioan agertuko dira. Edozein zerbitzariko edonor jarraitu dezakezu!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "Zure zerbitzari berean dauden horien mezu publikoak denbora-lerro lokalean agertuko dira.",
+  "introduction.interactions.action": "Amaitu tutoriala!",
+  "introduction.interactions.favourite.headline": "Gogokoa",
+  "introduction.interactions.favourite.text": "Toot bat geroko gorde dezakezu, eta egileari gustukoa duzula jakinarazi, hau gogoko bihurtuz.",
+  "introduction.interactions.reblog.headline": "Bultzada",
+  "introduction.interactions.reblog.text": "Beste batzuen mezuak partekatu ditzakezu zure jarraitzaileekin hauei bultzada emanez.",
+  "introduction.interactions.reply.headline": "Erantzun",
+  "introduction.interactions.reply.text": "Besteen mezuei eta zure mezuei ere erantzun diezaiekezu, eta elkarrizketa batean lotuta agertuko dira.",
+  "introduction.welcome.action": "Goazen!",
+  "introduction.welcome.headline": "Lehen urratsak",
+  "introduction.welcome.text": "Ongi etorri fedibertsora! Hemendik gutxira hainbat zerbitzarietan zehar mezuak zabaldu eta lagunekin hitz egin ahal izango duzu. Baina zerbitzari hau hainbat zerbitzarietan zehar. berezia da, hau da zure profila ostatatzen duena, ez ahaztu bere izena.",
   "keyboard_shortcuts.back": "atzera nabigatzeko",
   "keyboard_shortcuts.blocked": "blokeatutako erabiltzaileen zerrenda irekitzeko",
   "keyboard_shortcuts.boost": "bultzada ematea",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
   "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
   "notifications.column_settings.favourite": "Gogokoak:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak",
+  "notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra",
+  "notifications.column_settings.filter_bar.show": "Erakutsi",
   "notifications.column_settings.follow": "Jarraitzaile berriak:",
   "notifications.column_settings.mention": "Aipamenak:",
   "notifications.column_settings.push": "Push jakinarazpenak",
   "notifications.column_settings.reblog": "Bultzadak:",
   "notifications.column_settings.show": "Erakutsi zutabean",
   "notifications.column_settings.sound": "Jo soinua",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Denak",
+  "notifications.filter.boosts": "Bultzadak",
+  "notifications.filter.favourites": "Gogokoak",
+  "notifications.filter.follows": "Jarraipenak",
+  "notifications.filter.mentions": "Aipamenak",
   "notifications.group": "{count} jakinarazpen",
   "privacy.change": "Doitu mezuaren pribatutasuna",
   "privacy.direct.long": "Bidali aipatutako erabiltzaileei besterik ez",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toot-ak",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Begiradatxo bat...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Kendu bultzada",
   "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman",
@@ -341,7 +343,7 @@
   "upload_area.title": "Arrastatu eta jaregin igotzeko",
   "upload_button.label": "Gehitu multimedia  (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
-  "upload_form.focus": "Moztu",
+  "upload_form.focus": "Aldatu aurrebista",
   "upload_form.undo": "Ezabatu",
   "upload_progress.label": "Igotzen...",
   "video.close": "Itxi bideoa",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index e2790d8b6..b11d88d87 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "بوق‌ها",
   "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
   "standalone.public_title": "نگاهی به کاربران این سرور...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "مسدودسازی @{name}",
   "status.cancel_reblog_private": "حذف بازبوق",
   "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 84638af35..c8d258672 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Tuuttaukset",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Kurkistus sisälle...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Estä @{name}",
   "status.cancel_reblog_private": "Peru buustaus",
   "status.cannot_reblog": "Tätä julkaisua ei voi buustata",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index c0bd047ce..35e41d7bb 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
   "getting_started.developers": "Développeurs",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Annuaire des profils",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Pour commencer",
   "getting_started.invite": "Inviter des gens",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Pouets",
   "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
   "standalone.public_title": "Un aperçu …",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Dé-booster",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 3ffa8ac32..23bbed74d 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count,plural,one {result} outros {results}}",
   "standalone.public_title": "Ollada dentro...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Non promover",
   "status.cannot_reblog": "Esta mensaxe non pode ser promovida",
@@ -341,7 +343,7 @@
   "upload_area.title": "Arrastre e solte para subir",
   "upload_button.label": "Engadir medios (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Describa para deficientes visuais",
-  "upload_form.focus": "Recortar",
+  "upload_form.focus": "Cambiar vista previa",
   "upload_form.undo": "Eliminar",
   "upload_progress.label": "Subindo...",
   "video.close": "Pechar video",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index d0fd75e5f..e27e7f09e 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}",
   "standalone.public_title": "הצצה פנימה...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "לא ניתן להדהד הודעה זו",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index b5685a9a0..71dd5319e 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ovaj post ne može biti boostan",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index b87dcd597..c2842aea7 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Betekintés...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ezen státusz nem rebloggolható",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 2fb96cbf3..691994887 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Այս պահին…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Արգելափակել @{name}֊ին",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Այս թութը չի կարող տարածվել",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 81fdbc711..eed61af70 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {hasil} other {hasil}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index e51b074ae..b26fa6c4a 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index b1208f382..1f52d3724 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Autorizza",
   "follow_request.reject": "Rifiuta",
   "getting_started.developers": "Sviluppatori",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Directory del profilo",
   "getting_started.documentation": "Documentazione",
   "getting_started.heading": "Come iniziare",
   "getting_started.invite": "Invita qualcuno",
@@ -149,23 +149,23 @@
   "home.column_settings.basic": "Semplice",
   "home.column_settings.show_reblogs": "Mostra post condivisi",
   "home.column_settings.show_replies": "Mostra risposte",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Avanti",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "I post pubblici provenienti da altri server del fediverse saranno mostrati nella timeline federata.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "I post scritti da persone che segui saranno mostrati nella timeline home. Puoi seguire chiunque su qualunque server!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "I post pubblici scritti da persone sul tuo stesso server saranno mostrati nella timeline locale.",
+  "introduction.interactions.action": "Finisci il tutorial!",
+  "introduction.interactions.favourite.headline": "Apprezza",
+  "introduction.interactions.favourite.text": "Puoi salvare un toot e tenerlo per dopo, e far sapere all'autore che ti è piaciuto, segnandolo come apprezzato.",
+  "introduction.interactions.reblog.headline": "Condividi",
+  "introduction.interactions.reblog.text": "Con la condivisione puoi segnalare i toot di altre persone ai tuoi seguaci .",
+  "introduction.interactions.reply.headline": "Rispondi",
+  "introduction.interactions.reply.text": "Puoi rispondere ai toot, sia a quelli di altri sia ai tuoi, e i toot saranno collegati a formare una conversazione.",
+  "introduction.welcome.action": "Andiamo!",
+  "introduction.welcome.headline": "Primi passi",
+  "introduction.welcome.text": "Benvenuto/a nel fediverse! Tra poco potrai inviare messaggi e parlare con i tuoi amici su una grande varietà di server. Ma questo server, {domain}, è speciale: ospita il tuo profilo, quindi ricordati il suo nome.",
   "keyboard_shortcuts.back": "per tornare indietro",
   "keyboard_shortcuts.blocked": "per aprire l'elenco degli utenti bloccati",
   "keyboard_shortcuts.boost": "per condividere",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?",
   "notifications.column_settings.alert": "Notifiche desktop",
   "notifications.column_settings.favourite": "Apprezzati:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie",
+  "notifications.column_settings.filter_bar.category": "Filtro rapido",
+  "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nuovi seguaci:",
   "notifications.column_settings.mention": "Menzioni:",
   "notifications.column_settings.push": "Notifiche push",
   "notifications.column_settings.reblog": "Post condivisi:",
   "notifications.column_settings.show": "Mostra in colonna",
   "notifications.column_settings.sound": "Riproduci suono",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Tutti",
+  "notifications.filter.boosts": "Condivisioni",
+  "notifications.filter.favourites": "Apprezzati",
+  "notifications.filter.follows": "Seguaci",
+  "notifications.filter.mentions": "Menzioni",
   "notifications.group": "{count} notifiche",
   "privacy.change": "Modifica privacy del post",
   "privacy.direct.long": "Invia solo a utenti menzionati",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toot",
   "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}",
   "standalone.public_title": "Un'occhiata all'interno...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Annulla condivisione",
   "status.cannot_reblog": "Questo post non può essere condiviso",
@@ -341,7 +343,7 @@
   "upload_area.title": "Trascina per caricare",
   "upload_button.label": "Aggiungi file multimediale",
   "upload_form.description": "Descrizione per utenti con disabilità visive",
-  "upload_form.focus": "Rifila",
+  "upload_form.focus": "Modifica anteprima",
   "upload_form.undo": "Cancella",
   "upload_progress.label": "Sto caricando...",
   "video.close": "Chiudi video",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 103c1a5de..7ddd95f60 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -297,6 +297,8 @@
   "search_results.statuses": "トゥート",
   "search_results.total": "{count, number}件の結果",
   "standalone.public_title": "今こんな話をしています...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name}さんをブロック",
   "status.cancel_reblog_private": "ブースト解除",
   "status.cannot_reblog": "この投稿はブーストできません",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 8a019a476..93a11027a 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "ტუტები",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "შიდა ხედი...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "დაბლოკე @{name}",
   "status.cancel_reblog_private": "ბუსტის მოშორება",
   "status.cannot_reblog": "ეს პოსტი ვერ დაიბუსტება",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 834e037a7..0d707afb1 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "허가",
   "follow_request.reject": "거부",
   "getting_started.developers": "개발자",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "프로필 디렉터리",
   "getting_started.documentation": "문서",
   "getting_started.heading": "시작",
   "getting_started.invite": "초대",
@@ -292,6 +292,8 @@
   "search_results.statuses": "툿",
   "search_results.total": "{count, number}건의 결과",
   "standalone.public_title": "지금 이런 이야기를 하고 있습니다…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name} 차단",
   "status.cancel_reblog_private": "부스트 취소",
   "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
@@ -341,7 +343,7 @@
   "upload_area.title": "드래그 & 드롭으로 업로드",
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "시각장애인을 위한 설명",
-  "upload_form.focus": "크롭",
+  "upload_form.focus": "미리보기 변경",
   "upload_form.undo": "삭제",
   "upload_progress.label": "업로드 중...",
   "video.close": "동영상 닫기",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
new file mode 100644
index 000000000..0d510d011
--- /dev/null
+++ b/app/javascript/mastodon/locales/lv.json
@@ -0,0 +1,358 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Hide everything from {domain}",
+  "account.blocked": "Blocked",
+  "account.direct": "Direct message @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.view_full_profile": "View full profile",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "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",
+  "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",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media Only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "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}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish tutorial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.info": "About this instance",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.group": "{count} notifications",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_toggle": "Click to view",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.focus": "Crop",
+  "upload_form.undo": "Delete",
+  "upload_progress.label": "Uploading...",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 9e613ce59..0d510d011 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index d8189d45f..e5f7b0bdf 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Goedkeuren",
   "follow_request.reject": "Afkeuren",
   "getting_started.developers": "Ontwikkelaars",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Gebruikersgids",
   "getting_started.documentation": "Documentatie",
   "getting_started.heading": "Aan de slag",
   "getting_started.invite": "Mensen uitnodigen",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
   "standalone.public_title": "Een kijkje binnenin...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blokkeer @{name}",
   "status.cancel_reblog_private": "Niet langer boosten",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
@@ -341,7 +343,7 @@
   "upload_area.title": "Hierin slepen om te uploaden",
   "upload_button.label": "Media toevoegen (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
-  "upload_form.focus": "Bijsnijden",
+  "upload_form.focus": "Voorvertoning aanpassen",
   "upload_form.undo": "Verwijderen",
   "upload_progress.label": "Uploaden...",
   "video.close": "Video sluiten",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 7ffdd78a0..fa08e8d73 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
   "standalone.public_title": "En titt inni...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Denne posten kan ikke fremheves",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 8dca0d729..87fbf54c3 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Acceptar",
   "follow_request.reject": "Regetar",
   "getting_started.developers": "Desvelopaires",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Annuari de perfils",
   "getting_started.documentation": "Documentacion",
   "getting_started.heading": "Per començar",
   "getting_started.invite": "Convidar de monde",
@@ -242,9 +242,9 @@
   "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
   "notifications.column_settings.alert": "Notificacions localas",
   "notifications.column_settings.favourite": "Favorits :",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Mostrar totas las categorias",
+  "notifications.column_settings.filter_bar.category": "Barra de recèrca rapida",
+  "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Nòus seguidors :",
   "notifications.column_settings.mention": "Mencions :",
   "notifications.column_settings.push": "Notificacions",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Tuts",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
   "standalone.public_title": "Una ulhada dedins…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blocar @{name}",
   "status.cancel_reblog_private": "Quitar de partejar",
   "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 92133f812..6a1b8a0c6 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -297,6 +297,8 @@
   "search_results.statuses": "Wpisy",
   "search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}",
   "standalone.public_title": "Spojrzenie w głąb…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Zablokuj @{name}",
   "status.cancel_reblog_private": "Cofnij podbicie",
   "status.cannot_reblog": "Ten wpis nie może zostać podbity",
@@ -346,7 +348,7 @@
   "upload_area.title": "Przeciągnij i upuść aby wysłać",
   "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
-  "upload_form.focus": "Przytnij",
+  "upload_form.focus": "Dopasuj podgląd",
   "upload_form.undo": "Usuń",
   "upload_progress.label": "Wysyłanie...",
   "video.close": "Zamknij film",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 0efcad486..b0555bd0c 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Desenvolvedores",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Diretório de perfis",
   "getting_started.documentation": "Documentação",
   "getting_started.heading": "Primeiros passos",
   "getting_started.invite": "Convide pessoas",
@@ -149,23 +149,23 @@
   "home.column_settings.basic": "Básico",
   "home.column_settings.show_reblogs": "Mostrar compartilhamentos",
   "home.column_settings.show_replies": "Mostrar as respostas",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Próximo",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Posts públicos de outros servidores do fediverso vão aparecer na timeline global.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "Posts de pessoas que você segue vão aparecer na sua página inicial. Você pode seguir pessoas de qualquer servidor!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "Posts públicos de pessoas no mesmo servidor que você vão aparecer na timeline local.",
+  "introduction.interactions.action": "Finalizar o tutorial!",
+  "introduction.interactions.favourite.headline": "Favoritos",
+  "introduction.interactions.favourite.text": "Você pode salvar um toot pra mais tarde, e deixar a pessoa que postou saber que você gostou, favoritando-o.",
+  "introduction.interactions.reblog.headline": "Compartilhamento",
+  "introduction.interactions.reblog.text": "Você pode mostrar toots de outras pessoas aos seus seguidores compartilhando.",
+  "introduction.interactions.reply.headline": "Responder",
+  "introduction.interactions.reply.text": "Você pode responder a toots de outras pessoas e aos seus, e isso vai uni-los em uma conversa.",
+  "introduction.welcome.action": "Vamos!",
+  "introduction.welcome.headline": "Primeiros passos",
+  "introduction.welcome.text": "Boas vindas ao fediverso! Em alguns momentos, você vai poder transmitir mensagens e falar com pessoas amigas através de uma variedade de servidores. Mas esse servidor, {domain}, é especial—é onde o seu perfil está hospedado, então lembre do nome.",
   "keyboard_shortcuts.back": "para navegar de volta",
   "keyboard_shortcuts.blocked": "para abrir a lista de usuários bloqueados",
   "keyboard_shortcuts.boost": "para compartilhar",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "Você tem certeza de que quer limpar todas as suas notificações permanentemente?",
   "notifications.column_settings.alert": "Notificações no computador",
   "notifications.column_settings.favourite": "Favoritos:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
+  "notifications.column_settings.filter_bar.category": "Barra de filtro rápido",
+  "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Novos seguidores:",
   "notifications.column_settings.mention": "Menções:",
   "notifications.column_settings.push": "Enviar notificações",
   "notifications.column_settings.reblog": "Compartilhamento:",
   "notifications.column_settings.show": "Mostrar nas colunas",
   "notifications.column_settings.sound": "Reproduzir som",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Tudo",
+  "notifications.filter.boosts": "Compartilhamentos",
+  "notifications.filter.favourites": "Favoritos",
+  "notifications.filter.follows": "Seguidores",
+  "notifications.filter.mentions": "Menções",
   "notifications.group": "{count} notificações",
   "privacy.change": "Ajustar a privacidade da mensagem",
   "privacy.direct.long": "Apenas para usuários mencionados",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "standalone.public_title": "Dê uma espiada...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfazer compartilhamento",
   "status.cannot_reblog": "Esta postagem não pode ser compartilhada",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index 049a8901a..d4126704a 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "standalone.public_title": "Espreitar lá dentro...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Este post não pode ser partilhado",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 211f2e660..f213f8ea3 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -1,23 +1,23 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Adaugă sau Elimină din liste",
   "account.badges.bot": "Bot",
   "account.block": "Blochează @{name}",
   "account.block_domain": "Ascunde tot de la {domain}",
   "account.blocked": "Blocat",
   "account.direct": "Mesaj direct @{name}",
-  "account.disclaimer_full": "Informațiile de mai jos pot reflecta profilul incomplet al utilizatorului.",
+  "account.disclaimer_full": "Informațiile de mai jos pot reflecta profilul utilizatorului incomplet.",
   "account.domain_blocked": "Domeniu ascuns",
   "account.edit_profile": "Editează profilul",
   "account.endorse": "Redistribuie pe profil",
   "account.follow": "Urmărește",
   "account.followers": "Urmăritori",
-  "account.followers.empty": "Nimeni nu urmărește acest utilizator incă.",
+  "account.followers.empty": "Acest utilizator nu are încă urmăritori.",
   "account.follows": "Urmărește",
   "account.follows.empty": "Acest utilizator nu urmărește pe nimeni incă.",
   "account.follows_you": "Te urmărește",
   "account.hide_reblogs": "Ascunde redistribuirile de la @{name}",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.link_verified_on": "Deținerea acestui link a fost verificată la {date}",
+  "account.locked_info": "Acest profil este privat. Această persoană gestioneaz manual cine o urmărește.",
   "account.media": "Media",
   "account.mention": "Menționează @{name}",
   "account.moved_to": "{name} a fost mutat la:",
@@ -27,22 +27,22 @@
   "account.posts": "Postări",
   "account.posts_with_replies": "Postări și replici",
   "account.report": "Raportează @{name}",
-  "account.requested": "Așteaptă aprobare. Apasă pentru a anula cererea de urmărire",
+  "account.requested": "Se așteaptă aprobarea. Apasă pentru a anula cererea de urmărire",
   "account.share": "Distribuie profilul lui @{name}",
   "account.show_reblogs": "Arată redistribuirile de la @{name}",
   "account.unblock": "Deblochează @{name}",
   "account.unblock_domain": "Arată {domain}",
   "account.unendorse": "Nu promova pe profil",
   "account.unfollow": "Nu mai urmări",
-  "account.unmute": "Pornește notificările @{name}",
-  "account.unmute_notifications": "Pornește notificările de la @{name}",
+  "account.unmute": "Activează notificările de la @{name}",
+  "account.unmute_notifications": "Activează notificările de la @{name}",
   "account.view_full_profile": "Vezi profilul complet",
   "alert.unexpected.message": "A apărut o eroare neașteptată.",
   "alert.unexpected.title": "Hopa!",
-  "boost_modal.combo": "Poți apăsa {combo} pentru a sări peste asta data viitoare",
+  "boost_modal.combo": "Poți apăsa {combo} pentru a omite asta data viitoare",
   "bundle_column_error.body": "Ceva nu a funcționat la încărcarea acestui component.",
   "bundle_column_error.retry": "Încearcă din nou",
-  "bundle_column_error.title": "Eoare de rețea",
+  "bundle_column_error.title": "Eroare de rețea",
   "bundle_modal_error.close": "Închide",
   "bundle_modal_error.message": "Ceva nu a funcționat în timupul încărcării acestui component.",
   "bundle_modal_error.retry": "Încearcă din nou",
@@ -70,16 +70,16 @@
   "compose_form.direct_message_warning": "Această postare va fi trimisă doar utilizatorilor menționați.",
   "compose_form.direct_message_warning_learn_more": "Află mai multe",
   "compose_form.hashtag_warning": "Această postare nu va fi listată sub nici un hastag. Doar postările publice pot fi găsite dupa un hastag.",
-  "compose_form.lock_disclaimer": "Contul tău nu este {locked}. Toată lumea te poate urmări pentru a vedea postările doar pentru urmăritori.",
+  "compose_form.lock_disclaimer": "Contul tău nu este {locked}. Oricine te poate urmări fără aprobarea ta și vedea toate postările tale.",
   "compose_form.lock_disclaimer.lock": "privat",
   "compose_form.placeholder": "La ce te gândești?",
   "compose_form.publish": "Postează",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Conținutul media este marcat ca sensibil",
   "compose_form.sensitive.unmarked": "Conținutul media nu este marcat ca sensibil",
-  "compose_form.spoiler.marked": "Textul este ascuns sub advertizare",
+  "compose_form.spoiler.marked": "Textul este ascuns sub o avertizare",
   "compose_form.spoiler.unmarked": "Textul nu este ascuns",
-  "compose_form.spoiler_placeholder": "Scrie adveritzarea aici",
+  "compose_form.spoiler_placeholder": "Scrie averitzarea aici",
   "confirmation_modal.cancel": "Anulează",
   "confirmations.block.confirm": "Blochează",
   "confirmations.block.message": "Ești sigur că vrei să blochezi {name}?",
@@ -88,13 +88,13 @@
   "confirmations.delete_list.confirm": "Șterge",
   "confirmations.delete_list.message": "Ești sigur că vrei să ștergi permanent această listă?",
   "confirmations.domain_block.confirm": "Ascunde tot domeniul",
-  "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi complet {domain}? În cele mai multe cazuri raportarea sau oprirea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea nici un conținut de la acest domeniu in nici un flux public sau în notificările tale. Urmăritorii tăi de la acele domenii vor fi retrași.",
+  "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi complet {domain}? În cele mai multe cazuri raportarea sau oprirea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea nici un conținut de la acest domeniu in nici un flux public sau în notificările tale. Urmăritorii tăi de la acele domenii vor fi eliminați.",
   "confirmations.mute.confirm": "Oprește",
   "confirmations.mute.message": "Ești sigur că vrei să oprești {name}?",
   "confirmations.redraft.confirm": "Șterge și salvează ca ciornă",
   "confirmations.redraft.message": "Ești sigur că vrei să faci asta? Tot ce ține de această postare, inclusiv răspunsurile vor fi deconectate.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.reply.confirm": "Răspunde",
+  "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va șterge. Ești sigur că vrei să continui?",
   "confirmations.unfollow.confirm": "Nu mai urmări",
   "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?",
   "embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.",
@@ -113,15 +113,15 @@
   "emoji_button.search_results": "Rezultatele căutării",
   "emoji_button.symbols": "Simboluri",
   "emoji_button.travel": "Călătorii si Locuri",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "Nici o postare aici!",
   "empty_column.blocks": "Nu ai blocat nici un utilizator incă.",
   "empty_column.community": "Fluxul local este gol. Scrie ceva public pentru a împinge bila la vale!",
-  "empty_column.direct": "Nu ai nici un mesaj direct incă. Când trimiți sau primești unul, vor fi afișate aici.",
+  "empty_column.direct": "Nu ai nici un mesaj direct incă. Când trimiți sau primești unul, va fi afișat aici.",
   "empty_column.domain_blocks": "Nu sunt domenii ascunse incă.",
   "empty_column.favourited_statuses": "Nu ai nici o postare favorită încă. Când vei avea, vor fi afișate aici.",
   "empty_column.favourites": "Nimeni nu are această postare adăugată la favorite. Când cineva o va face va fi afișat aici.",
   "empty_column.follow_requests": "Nu ai încă nici o cerere de urmărire. Când vei primi una, va fi afișată aici.",
-  "empty_column.hashtag": "Acest hastag nu a fost folosit încă nicăieri.",
+  "empty_column.hashtag": "Acest hastag nu a fost folosit încă.",
   "empty_column.home": "Fluxul tău este gol. Vizitează {public} sau fă o căutare pentru a începe să cunoști oameni noi.",
   "empty_column.home.public_timeline": "fluxul public",
   "empty_column.list": "Nu este nimic încă în această listă. Când membrii acestei liste vor începe să posteze, va apărea aici.",
@@ -132,77 +132,77 @@
   "follow_request.authorize": "Autorizează",
   "follow_request.reject": "Respinge",
   "getting_started.developers": "Dezvoltatori",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Directorul profilului",
   "getting_started.documentation": "Documentație",
   "getting_started.heading": "Începe",
-  "getting_started.invite": "Invită oameni",
+  "getting_started.invite": "Invită prieteni",
   "getting_started.open_source_notice": "Mastodon este o rețea de socializare de tip open source. Puteți contribuii la dezvoltarea ei sau să semnalați erorile pe GitHub la {github}.",
   "getting_started.security": "Securitate",
-  "getting_started.terms": "Termenii de Utilizare",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "getting_started.terms": "Termeni de Utilizare",
+  "hashtag.column_header.tag_mode.all": "și {additional}",
+  "hashtag.column_header.tag_mode.any": "sau {additional}",
+  "hashtag.column_header.tag_mode.none": "fără {additional}",
+  "hashtag.column_settings.tag_mode.all": "Toate acestea",
+  "hashtag.column_settings.tag_mode.any": "Oricare din acestea",
+  "hashtag.column_settings.tag_mode.none": "Niciuna din aceastea",
+  "hashtag.column_settings.tag_toggle": "Adaugă etichete adiționale pentru această coloană",
   "home.column_settings.basic": "De bază",
   "home.column_settings.show_reblogs": "Arată redistribuirile",
   "home.column_settings.show_replies": "Arată răspunsurile",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.action": "Următorul",
+  "introduction.federation.federated.headline": "Federalizat",
+  "introduction.federation.federated.text": "Postările publice de pe alte servere din rețea vor apărea in fluxul global.",
+  "introduction.federation.home.headline": "Acasă",
+  "introduction.federation.home.text": "Postările de la persoanele pe care le urmărești vor apărea in fluxul tău \"Acasă\". Poți urmări pe orice de pe orice server!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "Postările publice de la persoanele de pe acest server vor apărea în fluxul local.",
+  "introduction.interactions.action": "Încheie ghidul!",
+  "introduction.interactions.favourite.headline": "Favorite",
+  "introduction.interactions.favourite.text": "Poți salva o postare pentru a fi citită mai târziu și poți lăsa autorul să știe că iți place adăugândo la favorite.",
+  "introduction.interactions.reblog.headline": "Redistribuie",
+  "introduction.interactions.reblog.text": "Poți împărtăși postările altora cu urmăritorii tăi redistribuindule.",
+  "introduction.interactions.reply.headline": "Răspunde",
+  "introduction.interactions.reply.text": "Poți răspunde la postările tale și alte altora, care se vor lărgii în discuții.",
+  "introduction.welcome.action": "Să începem!",
+  "introduction.welcome.headline": "Primii pași",
+  "introduction.welcome.text": "Bun Venit in federație! In câteva momente, vei putea să transmiți mesaje și să participi la discuții cu oameni noi intr-o varietate foarte largă de servere din întreaga lume. Dar în special acest server, {domain},găzduiește profilul tău, deci reține numele acestuia.",
   "keyboard_shortcuts.back": "navighează inapoi",
   "keyboard_shortcuts.blocked": "să deschidă lista utilizatorilor blocați",
   "keyboard_shortcuts.boost": "să redistribuie",
   "keyboard_shortcuts.column": "să focuzeze o postare in una dintre coloane",
   "keyboard_shortcuts.compose": "sa focuzeze zona de compunere",
   "keyboard_shortcuts.description": "Descriere",
-  "keyboard_shortcuts.direct": "sa deschida coloane de mesaje directe",
-  "keyboard_shortcuts.down": "sa fie mutata jos in lista",
-  "keyboard_shortcuts.enter": "sa deschisa status",
-  "keyboard_shortcuts.favourite": "sa adauge la favorite",
-  "keyboard_shortcuts.favourites": "sa deschida lista cu favorite",
-  "keyboard_shortcuts.federated": "sa deschida fluxul global",
-  "keyboard_shortcuts.heading": "Comenzi din tastatură",
-  "keyboard_shortcuts.home": "sa deschida fluxul principal",
+  "keyboard_shortcuts.direct": "să deschidă coloana de mesaje directe",
+  "keyboard_shortcuts.down": "să fie mutată jos in lista",
+  "keyboard_shortcuts.enter": "să deschidă un status",
+  "keyboard_shortcuts.favourite": "să adauge la favorite",
+  "keyboard_shortcuts.favourites": "să deschidă lista cu favorite",
+  "keyboard_shortcuts.federated": "să deschidă fluxul global",
+  "keyboard_shortcuts.heading": "Comenzi rapide",
+  "keyboard_shortcuts.home": "să deschidă fluxul Acasă",
   "keyboard_shortcuts.hotkey": "Prescurtări",
-  "keyboard_shortcuts.legend": "sa afiseze aceasta legenda",
-  "keyboard_shortcuts.local": "sa deschida fluxul local",
-  "keyboard_shortcuts.mention": "sa mentioneze autorul",
-  "keyboard_shortcuts.muted": "sa deschida lista utilizatorilor opriti",
-  "keyboard_shortcuts.my_profile": "sa deschida profilul tau",
-  "keyboard_shortcuts.notifications": "sa deschida coloana cu notificari",
-  "keyboard_shortcuts.pinned": "sa deschida lista postarilor fixate",
-  "keyboard_shortcuts.profile": "sa deschida porfilul autorului",
-  "keyboard_shortcuts.reply": "sa raspunda",
-  "keyboard_shortcuts.requests": "sa deschida lista cu cereri de urmarire",
-  "keyboard_shortcuts.search": "sa focuseze cautarea",
-  "keyboard_shortcuts.start": "sa deschida coloana \"Incepere\"",
-  "keyboard_shortcuts.toggle_hidden": "sa arate/ascunda textul in spatele CW",
-  "keyboard_shortcuts.toot": "sa inceapa o noua postare",
-  "keyboard_shortcuts.unfocus": "sa dezactiveze compunerea/cautarea",
-  "keyboard_shortcuts.up": "sa mute mai sus in lista",
+  "keyboard_shortcuts.legend": "să afișeze această legendă",
+  "keyboard_shortcuts.local": "să deschidă fluxul local",
+  "keyboard_shortcuts.mention": "să menționeze autorul",
+  "keyboard_shortcuts.muted": "să deschidă lista utilizatorilor opriți",
+  "keyboard_shortcuts.my_profile": "să deschidă profilul tău",
+  "keyboard_shortcuts.notifications": "să deschidă coloana cu notificări",
+  "keyboard_shortcuts.pinned": "să deschidă lista postărilor fixate",
+  "keyboard_shortcuts.profile": "să deschidă porfilul autorului",
+  "keyboard_shortcuts.reply": "să răspundă",
+  "keyboard_shortcuts.requests": "să deschidă lista cu cereri de urmărire",
+  "keyboard_shortcuts.search": "să focuseze căutarea",
+  "keyboard_shortcuts.start": "să deschidă coloana \"Începere\"",
+  "keyboard_shortcuts.toggle_hidden": "să arate/ascundă textul in spatele CW",
+  "keyboard_shortcuts.toot": "să înceapă o postare nouă",
+  "keyboard_shortcuts.unfocus": "să dezactiveze zona de compunere/căutare",
+  "keyboard_shortcuts.up": "să mute mai sus în listă",
   "lightbox.close": "Închide",
   "lightbox.next": "Următorul",
   "lightbox.previous": "Precedentul",
   "lists.account.add": "Adaugă în listă",
   "lists.account.remove": "Elimină din listă",
-  "lists.delete": "Șterge listă",
+  "lists.delete": "Șterge lista",
   "lists.edit": "Editează lista",
   "lists.new.create": "Adaugă listă",
   "lists.new.title_placeholder": "Titlu pentru noua listă",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "Ești sigur că vrei să ștergi toate notificările?",
   "notifications.column_settings.alert": "Notificări pe desktop",
   "notifications.column_settings.favourite": "Favorite:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Afișează toate categoriile",
+  "notifications.column_settings.filter_bar.category": "Bară de filtrare rapidă",
+  "notifications.column_settings.filter_bar.show": "Arată",
   "notifications.column_settings.follow": "Noi urmăritori:",
   "notifications.column_settings.mention": "Mențiuni:",
   "notifications.column_settings.push": "Notificări push",
   "notifications.column_settings.reblog": "Redistribuite:",
   "notifications.column_settings.show": "Arată în coloană",
   "notifications.column_settings.sound": "Redă sunet",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Toate",
+  "notifications.filter.boosts": "Redistribuiri",
+  "notifications.filter.favourites": "Favorite",
+  "notifications.filter.follows": "Urmărește",
+  "notifications.filter.mentions": "Menționări",
   "notifications.group": "{count} notificări",
   "privacy.change": "Cine vede asta",
   "privacy.direct.long": "Postează doar pentru utilizatorii menționați",
@@ -291,7 +291,9 @@
   "search_results.hashtags": "Hashtaguri",
   "search_results.statuses": "Postări",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Se întâmplă acum",
+  "standalone.public_title": "Se întâmplă acum...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blochează @{name}",
   "status.cancel_reblog_private": "Nedistribuit",
   "status.cannot_reblog": "Această postare nu poate fi redistribuită",
@@ -310,10 +312,10 @@
   "status.open": "Extinde acest status",
   "status.pin": "Fixează pe profil",
   "status.pinned": "Postare fixată",
-  "status.read_more": "Read more",
+  "status.read_more": "Citește mai mult",
   "status.reblog": "Redistribuie",
   "status.reblog_private": "Redistribuie către audiența originală",
-  "status.reblogged_by": "{name} redistribuit",
+  "status.reblogged_by": "{name} a redistribuit",
   "status.reblogs.empty": "Nimeni nu a redistribuit această postare până acum. Când cineva o va face, va apărea aici.",
   "status.redraft": "Șterge și adaugă la ciorne",
   "status.reply": "Răspunde",
@@ -326,11 +328,11 @@
   "status.show_less_all": "Arată mai puțin pentru toți",
   "status.show_more": "Arată mai mult",
   "status.show_more_all": "Arată mai mult pentru toți",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "Arată topicul",
   "status.unmute_conversation": "Repornește conversația",
   "status.unpin": "Eliberează din profil",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "Omite sugestia",
+  "suggestions.header": "Ai putea fi interesat de…",
   "tabs_bar.federated_timeline": "Global",
   "tabs_bar.home": "Acasă",
   "tabs_bar.local_timeline": "Local",
@@ -341,7 +343,7 @@
   "upload_area.title": "Trage și eliberează pentru a încărca",
   "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere",
-  "upload_form.focus": "Taie",
+  "upload_form.focus": "Schimbă previzualizarea",
   "upload_form.undo": "Șterge",
   "upload_progress.label": "Se Încarcă...",
   "video.close": "Închide video",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 0d10c663a..cb6010898 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Посты",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}",
   "standalone.public_title": "Прямо сейчас",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Заблокировать @{name}",
   "status.cancel_reblog_private": "Не продвигать",
   "status.cannot_reblog": "Этот статус не может быть продвинут",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index b8a74fadb..d874ed0aa 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -33,11 +33,11 @@
   "account.unblock": "Odblokuj @{name}",
   "account.unblock_domain": "Prestaň skrývať {domain}",
   "account.unendorse": "Nezobrazuj na profile",
-  "account.unfollow": "Prestať nasledovať",
-  "account.unmute": "Prestať ignorovať @{name}",
-  "account.unmute_notifications": "Odtĺmiť notifikácie od @{name}",
+  "account.unfollow": "Prestaň následovať",
+  "account.unmute": "Prestaň ignorovať @{name}",
+  "account.unmute_notifications": "Odtĺm oboznámenia od @{name}",
   "account.view_full_profile": "Pozri celý profil",
-  "alert.unexpected.message": "Vyskytla sa neočakávaná chyba.",
+  "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
   "bundle_column_error.body": "Pri načítaní tohto prvku nastala nejaká chyba.",
@@ -127,12 +127,12 @@
   "empty_column.list": "Tento zoznam je ešte prázdny. Keď ale členovia tohoto zoznamu napíšu nové správy, tak tie sa objavia priamo tu.",
   "empty_column.lists": "Nemáš ešte žiadne zoznamy. Keď nejaký vytvoríš, bude zobrazený práve tu.",
   "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.",
-  "empty_column.notifications": "Nemáš ešte žiadne oznámenia. Zapoj sa s niekym do debaty a komunikuj s ostatnými aby diskusia mohla začať.",
-  "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne alebo začnite sledovať užívateľov z iných Mastodon serverov, aby tu tak niečo pribudlo",
+  "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.",
+  "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných Mastodon serverov, aby tu niečo pribudlo",
   "follow_request.authorize": "Povoľ prístup",
   "follow_request.reject": "Odmietni",
   "getting_started.developers": "Vývojári",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Databáza profilov",
   "getting_started.documentation": "Dokumentácia",
   "getting_started.heading": "Začni tu",
   "getting_started.invite": "Pozvať ľudí",
@@ -292,6 +292,8 @@
   "search_results.statuses": "Hlášky",
   "search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}",
   "standalone.public_title": "Náhľad dovnútra...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blokovať @{name}",
   "status.cancel_reblog_private": "Nezdieľaj",
   "status.cannot_reblog": "Tento príspevok nemôže byť re-tootnutý",
@@ -341,7 +343,7 @@
   "upload_area.title": "Pretiahni a pusť pre nahratie",
   "upload_button.label": "Pridať médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Opis pre slabo vidiacich",
-  "upload_form.focus": "Vystrihni",
+  "upload_form.focus": "Pozmeň náhľad",
   "upload_form.undo": "Vymaž",
   "upload_progress.label": "Nahráva sa...",
   "video.close": "Zavrieť video",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 8b7b4586a..cabad737d 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Tuti",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 310456ca1..c8513dbe1 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {rezultat} few {rezultata} other {rezultata}}",
   "standalone.public_title": "Pogled iznutra...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ovaj status ne može da se podrži",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 01f215540..6e0ac6eca 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Трубе",
   "search_results.total": "{count, number} {count, plural, one {резултат} few {резултата} other {резултата}}",
   "standalone.public_title": "Поглед изнутра...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Блокирај @{name}",
   "status.cancel_reblog_private": "Уклони подршку",
   "status.cannot_reblog": "Овај статус не може да се подржи",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 82fef145e..47ce8497a 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, ett {result} andra {results}}",
   "standalone.public_title": "En titt inuti...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Ta bort knuff",
   "status.cannot_reblog": "Detta inlägg kan inte knuffas",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 9e613ce59..0d510d011 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 2df54b6d8..7306ec001 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "జాబితాల నుండి చేర్చు లేదా తీసివేయి",
   "account.badges.bot": "బాట్",
   "account.block": "@{name} ను బ్లాక్ చేయి",
   "account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు",
@@ -17,7 +17,7 @@
   "account.follows_you": "మిమ్మల్ని అనుసరిస్తున్నారు",
   "account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు",
   "account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.",
   "account.media": "మీడియా",
   "account.mention": "@{name}ను ప్రస్తావించు",
   "account.moved_to": "{name} ఇక్కడికి మారారు:",
@@ -113,7 +113,7 @@
   "emoji_button.search_results": "శోధన ఫలితాలు",
   "emoji_button.symbols": "చిహ్నాలు",
   "emoji_button.travel": "ప్రయాణం & ప్రదేశాలు",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "ఇక్కడ ఏ టూట్లూ లేవు!No toots here!",
   "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.",
   "empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!",
   "empty_column.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.",
@@ -132,40 +132,40 @@
   "follow_request.authorize": "అనుమతించు",
   "follow_request.reject": "తిరస్కరించు",
   "getting_started.developers": "డెవలపర్లు",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "ప్రొఫైల్ డైరెక్టరీProfile directory",
   "getting_started.documentation": "డాక్యుమెంటేషన్",
   "getting_started.heading": "మొదలుపెడదాం",
   "getting_started.invite": "వ్యక్తులను ఆహ్వానించండి",
   "getting_started.open_source_notice": "మాస్టొడొన్ ఓపెన్ సోర్స్ సాఫ్ట్వేర్. మీరు {github} వద్ద GitHub పై సమస్యలను నివేదించవచ్చు లేదా తోడ్పడచ్చు.",
   "getting_started.security": "భద్రత",
   "getting_started.terms": "సేవా నిబంధనలు",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_header.tag_mode.all": "మరియు {additional}",
+  "hashtag.column_header.tag_mode.any": "లేదా {additional}",
+  "hashtag.column_header.tag_mode.none": "{additional} లేకుండా",
+  "hashtag.column_settings.tag_mode.all": "ఇవన్నీAll of these",
+  "hashtag.column_settings.tag_mode.any": "వీటిలో ఏవైనా",
+  "hashtag.column_settings.tag_mode.none": "ఇవేవీ కావు",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "ప్రాథమిక",
   "home.column_settings.show_reblogs": "బూస్ట్ లను చూపించు",
   "home.column_settings.show_replies": "ప్రత్యుత్తరాలను చూపించు",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "తరువాత",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "ఫెడివర్స్ లోని ఇతర సర్వర్లకు చెందిన పబ్లిక్ టూట్లు ఫెడరేటెడ్ టైంలైన్ లో కనిపిస్తాయి.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "మీరు అనుసరిస్తున్న ఖాతాల టూట్లు హోం ఫీడ్ లో కనిపిస్తాయి. ఏ సర్వర్లో ఎవరినైనా మీరు అనుసరించవచ్చు!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "ఈ సర్వరుకు చెందిన ఖాతాల పబ్లిక్ టూట్లు లోకల్ టైంలైన్ లో కనిపిస్తాయి.",
+  "introduction.interactions.action": "బోధనను ముగించు!",
+  "introduction.interactions.favourite.headline": "ఇష్టం",
+  "introduction.interactions.favourite.text": "మీరు ఏదైనా టూట్‌ను భవిష్యత్తు కోసం దాచుకోవచ్చు మరియు మీకు ఆ టూట్ నచ్చినందని తెలియజేయడం కోసం \"ఇష్టం\" ను నొక్కి రచయితకు తెలియజేయవచ్చు.",
+  "introduction.interactions.reblog.headline": "బూస్ట్",
+  "introduction.interactions.reblog.text": "వేరే వ్యక్తుల టూట్లను బూస్ట్ చేయడం ద్వారా ఆ టూట్‌ను మీ అనుచరులతో పంచుకోవచ్చు.",
+  "introduction.interactions.reply.headline": "ప్రత్యుత్తరం",
+  "introduction.interactions.reply.text": "మీరు ఇతర వ్యక్తుల టూట్లకు, మీ స్వంత టూత్లకు ప్రత్యుత్తరం ఇవ్వడం వల్ల గొలుసు చర్చ ప్రారంభమవుతుంది.",
+  "introduction.welcome.action": "ఇక ప్రారంభించు!",
+  "introduction.welcome.headline": "మొదటి మెట్లు",
+  "introduction.welcome.text": "ఫెడివర్స్ కు స్వాగతం! మరి కొంతసేపట్లో మీరు సందేశాలను ప్రసారం చేయవచ్చు మరియు వేర్వేరు సర్వర్లలో వున్న మీ స్నేహితులతో మాట్లాడవచ్చు. కానీ ఈ సర్వరు, {domain}, ప్రత్యేకమైనది - ఇది మీ ప్రొఫైలును హోస్టు చేస్తుంది, కాబట్టి ఈ సర్వరు పేరును గుర్తుంచుకోండి.",
   "keyboard_shortcuts.back": "వెనక్కి తిరిగి వెళ్ళడానికి",
   "keyboard_shortcuts.blocked": "బ్లాక్ చేయబడిన వినియోగదారుల జాబితాను తెరవడానికి",
   "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి",
@@ -242,20 +242,20 @@
   "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?",
   "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు",
   "notifications.column_settings.favourite": "ఇష్టపడినవి:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "అన్ని విభాగాలను చూపించు",
+  "notifications.column_settings.filter_bar.category": "క్విక్ ఫిల్టర్ బార్",
+  "notifications.column_settings.filter_bar.show": "చూపించు",
   "notifications.column_settings.follow": "క్రొత్త అనుచరులు:",
   "notifications.column_settings.mention": "ప్రస్తావనలు:",
   "notifications.column_settings.push": "పుష్ ప్రకటనలు",
   "notifications.column_settings.reblog": "బూస్ట్ లు:",
   "notifications.column_settings.show": "నిలువు వరుసలో చూపు",
   "notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "అన్నీ",
+  "notifications.filter.boosts": "బూస్ట్లు",
+  "notifications.filter.favourites": "ఇష్టాలు",
+  "notifications.filter.follows": "అనుసరిస్తున్నవి",
+  "notifications.filter.mentions": "పేర్కొన్నవి",
   "notifications.group": "{count} ప్రకటనలు",
   "privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి",
   "privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి",
@@ -292,6 +292,8 @@
   "search_results.statuses": "టూట్లు",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "లోపలికి ఒక చూపు...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name} ను బ్లాక్ చేయి",
   "status.cancel_reblog_private": "బూస్ట్ను తొలగించు",
   "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు",
@@ -326,7 +328,7 @@
   "status.show_less_all": "అన్నిటికీ తక్కువ చూపించు",
   "status.show_more": "ఇంకా చూపించు",
   "status.show_more_all": "అన్నిటికీ ఇంకా చూపించు",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "గొలుసును చూపించు",
   "status.unmute_conversation": "సంభాషణను అన్మ్యూట్ చేయి",
   "status.unpin": "ప్రొఫైల్ నుండి పీకివేయు",
   "suggestions.dismiss": "సూచనను రద్దు చేయి",
@@ -341,7 +343,7 @@
   "upload_area.title": "అప్లోడ్ చేయడానికి డ్రాగ్ & డ్రాప్ చేయండి",
   "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి",
-  "upload_form.focus": "కత్తిరించు",
+  "upload_form.focus": "ప్రివ్యూను మార్చు",
   "upload_form.undo": "తొలగించు",
   "upload_progress.label": "అప్లోడ్ అవుతోంది...",
   "video.close": "వీడియోని మూసివేయి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 92bb05e7c..2683284f4 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 134285953..5d8fc229e 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Bu gönderi boost edilemez",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 752112588..606dda89f 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}",
   "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Цей допис не може бути передмухнутий",
diff --git a/app/javascript/mastodon/locales/whitelist_lv.json b/app/javascript/mastodon/locales/whitelist_lv.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_lv.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 54aa84681..dfa261d6e 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "嘟文",
   "search_results.total": "共 {count, number} 个结果",
   "standalone.public_title": "大家都在干啥?",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "屏蔽 @{name}",
   "status.cancel_reblog_private": "取消转嘟",
   "status.cannot_reblog": "无法转嘟这条嘟文",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 927cf9578..e57aa6d96 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "文章",
   "search_results.total": "{count, number} 項結果",
   "standalone.public_title": "站點一瞥…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "封鎖 @{name}",
   "status.cancel_reblog_private": "取消轉推",
   "status.cannot_reblog": "這篇文章無法被轉推",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index e5be85ac5..0cbe5da5a 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -292,6 +292,8 @@
   "search_results.statuses": "嘟文",
   "search_results.total": "{count, number} 項結果",
   "standalone.public_title": "站點一瞥…",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
   "status.block": "封鎖 @{name}",
   "status.cancel_reblog_private": "取消轉嘟",
   "status.cannot_reblog": "這篇嘟文無法被轉嘟",
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 47c4bf75c..196d2d02f 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -16,6 +16,17 @@ function main() {
   const Rellax = require('rellax');
   const createHistory = require('history').createBrowserHistory;
 
+  const scrollToDetailedStatus = () => {
+    const history = createHistory();
+    const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status');
+    const location = history.location;
+
+    if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) {
+      detailedStatuses[0].scrollIntoView();
+      history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true });
+    }
+  };
+
   ready(() => {
     const locale = document.documentElement.lang;
 
@@ -59,8 +70,14 @@ function main() {
 
           ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
           document.body.appendChild(content);
+          scrollToDetailedStatus();
         })
-        .catch(error => console.error(error));
+        .catch(error => {
+          console.error(error);
+          scrollToDetailedStatus();
+        });
+    } else {
+      scrollToDetailedStatus();
     }
 
     const parallaxComponents = document.querySelectorAll('.parallax');
@@ -68,15 +85,6 @@ function main() {
     if (parallaxComponents.length > 0 ) {
       new Rellax('.parallax', { speed: -1 });
     }
-
-    const history = createHistory();
-    const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status');
-    const location = history.location;
-
-    if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) {
-      detailedStatuses[0].scrollIntoView();
-      history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true });
-    }
   });
 }
 
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 8b111a936..e7124a2c0 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -151,6 +151,20 @@ $no-columns-breakpoint: 600px;
       font-weight: 500;
     }
 
+    .directory__tag a {
+      box-shadow: none;
+    }
+
+    .directory__tag h4 {
+      font-size: 18px;
+      font-weight: 700;
+      color: $primary-text-color;
+      text-transform: none;
+      padding-bottom: 0;
+      margin-bottom: 0;
+      border-bottom: none;
+    }
+
     & > p {
       font-size: 14px;
       line-height: 18px;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index da66ccd95..8c1115e76 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -2587,6 +2587,15 @@ a.status-card {
   flex: 0 0 100px;
   background: lighten($ui-base-color, 8%);
   position: relative;
+
+  & > .fa {
+    font-size: 21px;
+    position: absolute;
+    transform-origin: 50% 50%;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
 }
 
 .status-card.horizontal {
@@ -4046,6 +4055,7 @@ a.status-card.compact:hover {
     color: $highlight-text-color;
   }
 
+  .status__content,
   .status__content p {
     color: $inverted-text-color;
   }
diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss
index 1f96e7368..e4564f062 100644
--- a/app/javascript/styles/mastodon/dashboard.scss
+++ b/app/javascript/styles/mastodon/dashboard.scss
@@ -39,6 +39,7 @@
     color: $primary-text-color;
     font-family: $font-display, sans-serif;
     margin-bottom: 20px;
+    line-height: 30px;
   }
 
   &__text {
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 0a729011f..87318fb1c 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -50,6 +50,8 @@ class ActivityPub::Activity
         ActivityPub::Activity::Add
       when 'Remove'
         ActivityPub::Activity::Remove
+      when 'Move'
+        ActivityPub::Activity::Move
       end
     end
   end
diff --git a/app/lib/activitypub/activity/follow.rb b/app/lib/activitypub/activity/follow.rb
index 5e703dc61..1e805c0d1 100644
--- a/app/lib/activitypub/activity/follow.rb
+++ b/app/lib/activitypub/activity/follow.rb
@@ -6,7 +6,7 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
 
     return if target_account.nil? || !target_account.local? || delete_arrived_first?(@json['id']) || @account.requested?(target_account)
 
-    if target_account.blocking?(@account) || target_account.domain_blocking?(@account.domain)
+    if target_account.blocking?(@account) || target_account.domain_blocking?(@account.domain) || target_account.moved?
       reject_follow_request!(target_account)
       return
     end
diff --git a/app/lib/activitypub/activity/move.rb b/app/lib/activitypub/activity/move.rb
new file mode 100644
index 000000000..d7a5f595c
--- /dev/null
+++ b/app/lib/activitypub/activity/move.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+class ActivityPub::Activity::Move < ActivityPub::Activity
+  PROCESSING_COOLDOWN = 7.days.seconds
+
+  def perform
+    return if origin_account.uri != object_uri || processed?
+
+    mark_as_processing!
+
+    target_account = ActivityPub::FetchRemoteAccountService.new.call(target_uri)
+
+    return if target_account.nil? || !target_account.also_known_as.include?(origin_account.uri)
+
+    # In case for some reason we didn't have a redirect for the profile already, set it
+    origin_account.update(moved_to_account: target_account) if origin_account.moved_to_account_id.nil?
+
+    # Initiate a re-follow for each follower
+    origin_account.followers.local.select(:id).find_in_batches do |follower_accounts|
+      UnfollowFollowWorker.push_bulk(follower_accounts.map(&:id)) do |follower_account_id|
+        [follower_account_id, origin_account.id, target_account.id]
+      end
+    end
+  end
+
+  private
+
+  def origin_account
+    @account
+  end
+
+  def target_uri
+    value_or_id(@json['target'])
+  end
+
+  def processed?
+    redis.exists("move_in_progress:#{@account.id}")
+  end
+
+  def mark_as_processing!
+    redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true)
+  end
+end
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index d35cae889..99f4d9305 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -10,6 +10,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
         'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers',
         'sensitive'                 => 'as:sensitive',
         'movedTo'                   => { '@id' => 'as:movedTo', '@type' => '@id' },
+        'alsoKnownAs'               => { '@id' => 'as:alsoKnownAs', '@type' => '@id' },
         'Hashtag'                   => 'as:Hashtag',
         'ostatus'                   => 'http://ostatus.org#',
         'atomUri'                   => 'ostatus:atomUri',
diff --git a/app/models/account.rb b/app/models/account.rb
index 722e47d65..1ee63c738 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -44,6 +44,7 @@
 #  fields                  :jsonb
 #  actor_type              :string
 #  discoverable            :boolean
+#  also_known_as           :string           is an Array
 #
 
 class Account < ApplicationRecord
@@ -78,7 +79,7 @@ class Account < ApplicationRecord
   validates_with UniqueUsernameValidator, if: -> { local? && will_save_change_to_username? }
   validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? }
   validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? }
-  validate :note_length_does_not_exceed_length_limit, if: -> { local? && will_save_change_to_note? }
+  validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? }
   validates :fields, length: { maximum: MAX_FIELDS }, if: -> { local? && will_save_change_to_fields? }
 
   scope :remote, -> { where.not(domain: nil) }
@@ -232,6 +233,10 @@ class Account < ApplicationRecord
     end
   end
 
+  def also_known_as
+    self[:also_known_as] || []
+  end
+
   def fields
     (self[:fields] || []).map { |f| Field.new(self, f) }
   end
@@ -483,22 +488,6 @@ class Account < ApplicationRecord
     self.public_key  = keypair.public_key.to_pem
   end
 
-  YAML_START = "---\r\n"
-  YAML_END = "\r\n...\r\n"
-
-  def note_length_does_not_exceed_length_limit
-    note_without_metadata = note
-    if note.start_with? YAML_START
-      idx = note.index YAML_END
-      unless idx.nil?
-        note_without_metadata = note[(idx + YAML_END.length) .. -1]
-      end
-    end
-    if note_without_metadata.mb_chars.grapheme_length > MAX_NOTE_LENGTH
-      errors.add(:note, "can't be longer than 500 graphemes")
-    end
-  end
-
   def normalize_domain
     return if local?
 
diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb
index de7f3d525..4e730451a 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -15,6 +15,7 @@ module AccountAssociations
     has_many :mentions, inverse_of: :account, dependent: :destroy
     has_many :notifications, inverse_of: :account, dependent: :destroy
     has_many :conversations, class_name: 'AccountConversation', dependent: :destroy, inverse_of: :account
+    has_many :scheduled_statuses, inverse_of: :account, dependent: :destroy
 
     # Pinned statuses
     has_many :status_pins, inverse_of: :account, dependent: :destroy
diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb
index 6b7237e89..7e3bbde09 100644
--- a/app/models/concerns/account_finder_concern.rb
+++ b/app/models/concerns/account_finder_concern.rb
@@ -12,6 +12,10 @@ module AccountFinderConcern
       find_remote(username, domain) || raise(ActiveRecord::RecordNotFound)
     end
 
+    def representative
+      find_local(Setting.site_contact_username.gsub(/\A@/, '')) || Account.local.find_by(suspended: false)
+    end
+
     def find_local(username)
       find_remote(username, nil)
     end
diff --git a/app/models/instance.rb b/app/models/instance.rb
index 6d5c9c2ab..7448d465c 100644
--- a/app/models/instance.rb
+++ b/app/models/instance.rb
@@ -3,10 +3,23 @@
 class Instance
   include ActiveModel::Model
 
-  attr_accessor :domain, :accounts_count
+  attr_accessor :domain, :accounts_count, :domain_block
 
-  def initialize(account)
-    @domain = account.domain
-    @accounts_count = account.accounts_count
+  def initialize(resource)
+    @domain         = resource.domain
+    @accounts_count = resource.accounts_count
+    @domain_block   = resource.is_a?(DomainBlock) ? resource : DomainBlock.find_by(domain: domain)
+  end
+
+  def cached_sample_accounts
+    Rails.cache.fetch("#{cache_key}/sample_accounts", expires_in: 12.hours) { Account.where(domain: domain).searchable.joins(:account_stat).popular.limit(3) }
+  end
+
+  def to_param
+    domain
+  end
+
+  def cache_key
+    domain
   end
 end
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
index 5073cf1fa..3483d8cd6 100644
--- a/app/models/instance_filter.rb
+++ b/app/models/instance_filter.rb
@@ -8,21 +8,10 @@ class InstanceFilter
   end
 
   def results
-    scope = Account.remote.by_domain_accounts
-    params.each do |key, value|
-      scope.merge!(scope_for(key, value)) if value.present?
-    end
-    scope
-  end
-
-  private
-
-  def scope_for(key, value)
-    case key.to_s
-    when 'domain_name'
-      Account.matches_domain(value)
+    if params[:limited].present?
+      DomainBlock.order(id: :desc)
     else
-      raise "Unknown filter: #{key}"
+      Account.remote.by_domain_accounts
     end
   end
 end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index a034b55fd..601b14223 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -3,20 +3,21 @@
 #
 # Table name: media_attachments
 #
-#  id                :bigint(8)        not null, primary key
-#  status_id         :bigint(8)
-#  file_file_name    :string
-#  file_content_type :string
-#  file_file_size    :integer
-#  file_updated_at   :datetime
-#  remote_url        :string           default(""), not null
-#  created_at        :datetime         not null
-#  updated_at        :datetime         not null
-#  shortcode         :string
-#  type              :integer          default("image"), not null
-#  file_meta         :json
-#  account_id        :bigint(8)
-#  description       :text
+#  id                  :bigint(8)        not null, primary key
+#  status_id           :bigint(8)
+#  file_file_name      :string
+#  file_content_type   :string
+#  file_file_size      :integer
+#  file_updated_at     :datetime
+#  remote_url          :string           default(""), not null
+#  created_at          :datetime         not null
+#  updated_at          :datetime         not null
+#  shortcode           :string
+#  type                :integer          default("image"), not null
+#  file_meta           :json
+#  account_id          :bigint(8)
+#  description         :text
+#  scheduled_status_id :bigint(8)
 #
 
 class MediaAttachment < ApplicationRecord
@@ -94,8 +95,9 @@ class MediaAttachment < ApplicationRecord
   IMAGE_LIMIT = 8.megabytes
   VIDEO_LIMIT = 40.megabytes
 
-  belongs_to :account, inverse_of: :media_attachments, optional: true
-  belongs_to :status,  inverse_of: :media_attachments, optional: true
+  belongs_to :account,          inverse_of: :media_attachments, optional: true
+  belongs_to :status,           inverse_of: :media_attachments, optional: true
+  belongs_to :scheduled_status, inverse_of: :media_attachments, optional: true
 
   has_attached_file :file,
                     styles: ->(f) { file_styles f },
@@ -112,8 +114,8 @@ class MediaAttachment < ApplicationRecord
   validates :account, presence: true
   validates :description, length: { maximum: 420 }, if: :local?
 
-  scope :attached,   -> { where.not(status_id: nil) }
-  scope :unattached, -> { where(status_id: nil) }
+  scope :attached,   -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) }
+  scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) }
   scope :local,      -> { where(remote_url: '') }
   scope :remote,     -> { where.not(remote_url: '') }
 
diff --git a/app/models/relay.rb b/app/models/relay.rb
index 75cb060b2..7478c110d 100644
--- a/app/models/relay.rb
+++ b/app/models/relay.rb
@@ -68,7 +68,7 @@ class Relay < ApplicationRecord
   end
 
   def some_local_account
-    @some_local_account ||= Account.local.find_by(suspended: false)
+    @some_local_account ||= Account.representative
   end
 
   def ensure_disabled
diff --git a/app/models/scheduled_status.rb b/app/models/scheduled_status.rb
new file mode 100644
index 000000000..27f0cbd28
--- /dev/null
+++ b/app/models/scheduled_status.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: scheduled_statuses
+#
+#  id           :bigint(8)        not null, primary key
+#  account_id   :bigint(8)
+#  scheduled_at :datetime
+#  params       :jsonb
+#
+
+class ScheduledStatus < ApplicationRecord
+  include Paginable
+
+  TOTAL_LIMIT = 300
+  DAILY_LIMIT = 25
+
+  belongs_to :account, inverse_of: :scheduled_statuses
+  has_many :media_attachments, inverse_of: :scheduled_status, dependent: :nullify
+
+  validate :validate_future_date
+  validate :validate_total_limit
+  validate :validate_daily_limit
+
+  private
+
+  def validate_future_date
+    errors.add(:scheduled_at, I18n.t('scheduled_statuses.too_soon')) if scheduled_at.present? && scheduled_at <= Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET
+  end
+
+  def validate_total_limit
+    errors.add(:base, I18n.t('scheduled_statuses.over_total_limit', limit: TOTAL_LIMIT)) if account.scheduled_statuses.count >= TOTAL_LIMIT
+  end
+
+  def validate_daily_limit
+    errors.add(:base, I18n.t('scheduled_statuses.over_daily_limit', limit: DAILY_LIMIT)) if account.scheduled_statuses.where('scheduled_at::date = ?::date', scheduled_at).count >= DAILY_LIMIT
+  end
+end
diff --git a/app/policies/instance_policy.rb b/app/policies/instance_policy.rb
index d1956e2de..a73823556 100644
--- a/app/policies/instance_policy.rb
+++ b/app/policies/instance_policy.rb
@@ -5,7 +5,7 @@ class InstancePolicy < ApplicationPolicy
     admin?
   end
 
-  def resubscribe?
+  def show?
     admin?
   end
 end
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index 72c30dc73..6746c1782 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -14,6 +14,7 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
   has_many :virtual_attachments, key: :attachment
 
   attribute :moved_to, if: :moved?
+  attribute :also_known_as, if: :also_known_as?
 
   class EndpointsSerializer < ActiveModel::Serializer
     include RoutingHelper
@@ -116,6 +117,10 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
     ActivityPub::TagManager.instance.uri_for(object.moved_to_account)
   end
 
+  def also_known_as?
+    !object.also_known_as.empty?
+  end
+
   class CustomEmojiSerializer < ActivityPub::EmojiSerializer
   end
 
diff --git a/app/serializers/rest/scheduled_status_serializer.rb b/app/serializers/rest/scheduled_status_serializer.rb
new file mode 100644
index 000000000..5d6311b87
--- /dev/null
+++ b/app/serializers/rest/scheduled_status_serializer.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class REST::ScheduledStatusSerializer < ActiveModel::Serializer
+  attributes :id, :scheduled_at, :params
+
+  has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
+
+  def id
+    object.id.to_s
+  end
+
+  def params
+    object.params.without(:application_id)
+  end
+end
diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb
index 8430d12d5..3c2044941 100644
--- a/app/services/activitypub/fetch_remote_account_service.rb
+++ b/app/services/activitypub/fetch_remote_account_service.rb
@@ -5,8 +5,8 @@ class ActivityPub::FetchRemoteAccountService < BaseService
 
   SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze
 
-  # Does a WebFinger roundtrip on each call
-  def call(uri, id: true, prefetched_body: nil, break_on_redirect: false)
+  # Does a WebFinger roundtrip on each call, unless `only_key` is true
+  def call(uri, id: true, prefetched_body: nil, break_on_redirect: false, only_key: false)
     return ActivityPub::TagManager.instance.uri_to_resource(uri, Account) if ActivityPub::TagManager.instance.local_uri?(uri)
 
     @json = if prefetched_body.nil?
@@ -21,9 +21,9 @@ class ActivityPub::FetchRemoteAccountService < BaseService
     @username = @json['preferredUsername']
     @domain   = Addressable::URI.parse(@uri).normalized_host
 
-    return unless verified_webfinger?
+    return unless only_key || verified_webfinger?
 
-    ActivityPub::ProcessAccountService.new.call(@username, @domain, @json)
+    ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key)
   rescue Oj::ParseError
     nil
   end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 5c865dae2..d6c791b44 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -33,8 +33,10 @@ class ActivityPub::ProcessAccountService < BaseService
 
     after_protocol_change! if protocol_changed?
     after_key_change! if key_changed? && !@options[:signed_with_known_key]
-    check_featured_collection! if @account.featured_collection_url.present?
-    check_links! unless @account.fields.empty?
+    unless @options[:only_key]
+      check_featured_collection! if @account.featured_collection_url.present?
+      check_links! unless @account.fields.empty?
+    end
 
     @account
   rescue Oj::ParseError
@@ -54,11 +56,11 @@ class ActivityPub::ProcessAccountService < BaseService
   end
 
   def update_account
-    @account.last_webfingered_at = Time.now.utc
+    @account.last_webfingered_at = Time.now.utc unless @options[:only_key]
     @account.protocol            = :activitypub
 
     set_immediate_attributes!
-    set_fetchable_attributes!
+    set_fetchable_attributes! unless @options[:only_keys]
 
     @account.save_with_optional_media!
   end
@@ -75,6 +77,7 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.note                    = @json['summary'] || ''
     @account.locked                  = @json['manuallyApprovesFollowers'] || false
     @account.fields                  = property_values || {}
+    @account.also_known_as           = as_array(@json['alsoKnownAs'] || []).map { |item| value_or_id(item) }
     @account.actor_type              = actor_type
   end
 
diff --git a/app/services/app_sign_up_service.rb b/app/services/app_sign_up_service.rb
index 1878587e8..d621cc462 100644
--- a/app/services/app_sign_up_service.rb
+++ b/app/services/app_sign_up_service.rb
@@ -4,7 +4,7 @@ class AppSignUpService < BaseService
   def call(app, params)
     return unless allowed_registrations?
 
-    user_params    = params.slice(:email, :password, :agreement)
+    user_params    = params.slice(:email, :password, :agreement, :locale)
     account_params = params.slice(:username)
     user           = User.create!(user_params.merge(created_by_application: app, password_confirmation: user_params[:password], account_attributes: account_params))
 
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index 24b3e1f70..9d36a1449 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -10,7 +10,7 @@ class FollowService < BaseService
     target_account = ResolveAccountService.new.call(target_account, skip_webfinger: true)
 
     raise ActiveRecord::RecordNotFound if target_account.nil? || target_account.id == source_account.id || target_account.suspended?
-    raise Mastodon::NotPermittedError  if target_account.blocking?(source_account) || source_account.blocking?(target_account)
+    raise Mastodon::NotPermittedError  if target_account.blocking?(source_account) || source_account.blocking?(target_account) || target_account.moved?
 
     if source_account.following?(target_account)
       # We're already following this account, but we'll call follow! again to
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 28ecc848d..2ca92dc50 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -1,77 +1,101 @@
 # frozen_string_literal: true
 
 class PostStatusService < BaseService
+  MIN_SCHEDULE_OFFSET = 5.minutes.freeze
+
   # Post a text status update, fetch and notify remote users mentioned
   # @param [Account] account Account from which to post
-  # @param [String] text Message
-  # @param [Status] in_reply_to Optional status to reply to
   # @param [Hash] options
+  # @option [String] :text Message
+  # @option [Status] :thread Optional status to reply to
   # @option [Boolean] :sensitive
   # @option [String] :visibility
   # @option [String] :spoiler_text
+  # @option [String] :language
+  # @option [String] :scheduled_at
   # @option [Enumerable] :media_ids Optional array of media IDs to attach
   # @option [Doorkeeper::Application] :application
   # @option [String] :idempotency Optional idempotency key
   # @return [Status]
-  def call(account, text, in_reply_to = nil, **options)
-    if options[:idempotency].present?
-      existing_id = redis.get("idempotency:status:#{account.id}:#{options[:idempotency]}")
-      return Status.find(existing_id) if existing_id
+  def call(account, options = {})
+    @account     = account
+    @options     = options
+    @text        = @options[:text] || ''
+    @in_reply_to = @options[:thread]
+
+    return idempotency_duplicate if idempotency_given? && idempotency_duplicate?
+
+    validate_media!
+    preprocess_attributes!
+
+    if scheduled?
+      schedule_status!
+    else
+      process_status!
+      postprocess_status!
+      bump_potential_friendship!
     end
 
-    media  = validate_media!(options[:media_ids])
-    status = nil
-    if text.blank? && options[:spoiler_text].present?
-     text = '.'
-     text = media.find(&:video?) ? '📹' : '🖼' if media.size > 0
+    redis.setex(idempotency_key, 3_600, @status.id) if idempotency_given?
+
+    @status
+  end
+
+  private
+
+  def preprocess_attributes!
+    if @text.blank? && @options[:spoiler_text].present?
+     @text = '.'
+     @text = @media.find(&:video?) ? '📹' : '🖼' if @media.size > 0
     end
+    @visibility   = @options[:visibility] || @account.user&.setting_default_privacy
+    @visibility   = :unlisted if @visibility == :public && @account.silenced
+    @scheduled_at = @options[:scheduled_at]&.to_datetime
+    @scheduled_at = nil if scheduled_in_the_past?
+  end
 
-    visibility = options[:visibility] || account.user&.setting_default_privacy
-    visibility = :unlisted if visibility == :public && account.silenced
+  def process_status!
+    # The following transaction block is needed to wrap the UPDATEs to
+    # the media attachments when the status is created
 
     ApplicationRecord.transaction do
-      status = account.statuses.create!(text: text,
-                                        media_attachments: media || [],
-                                        thread: in_reply_to,
-                                        sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]) || options[:spoiler_text].present?,
-                                        spoiler_text: options[:spoiler_text] || '',
-                                        visibility: visibility,
-                                        language: language_from_option(options[:language]) || account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(text, account),
-                                        application: options[:application])
+      @status = @account.statuses.create!(status_attributes)
     end
 
-    process_hashtags_service.call(status)
-    process_mentions_service.call(status)
+    process_hashtags_service.call(@status)
+    process_mentions_service.call(@status)
+  end
 
-    LinkCrawlWorker.perform_async(status.id) unless status.spoiler_text?
-    DistributionWorker.perform_async(status.id)
+  def schedule_status!
+    if @account.statuses.build(status_attributes).valid?
+      # The following transaction block is needed to wrap the UPDATEs to
+      # the media attachments when the scheduled status is created
 
-    unless status.local_only?
-      Pubsubhubbub::DistributionWorker.perform_async(status.stream_entry.id)
-      ActivityPub::DistributionWorker.perform_async(status.id)
+      ApplicationRecord.transaction do
+        @status = @account.scheduled_statuses.create!(scheduled_status_attributes)
+      end
+    else
+      raise ActiveRecord::RecordInvalid
     end
+  end
 
-    if options[:idempotency].present?
-      redis.setex("idempotency:status:#{account.id}:#{options[:idempotency]}", 3_600, status.id)
+  def postprocess_status!
+    LinkCrawlWorker.perform_async(@status.id) unless @status.spoiler_text?
+    DistributionWorker.perform_async(@status.id)
+    unless @status.local_only?
+      Pubsubhubbub::DistributionWorker.perform_async(@status.stream_entry.id)
+      ActivityPub::DistributionWorker.perform_async(@status.id)
     end
-
-    bump_potential_friendship(account, status)
-
-    status
   end
 
-  private
-
-  def validate_media!(media_ids)
-    return if media_ids.blank? || !media_ids.is_a?(Enumerable)
+  def validate_media!
+    return if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable)
 
-    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if media_ids.size > 4
+    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4
 
-    media = MediaAttachment.where(status_id: nil).where(id: media_ids.take(4).map(&:to_i))
+    @media = MediaAttachment.where(status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i))
 
-    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media.size > 1 && media.find(&:video?)
-
-    media
+    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:video?)
   end
 
   def language_from_option(str)
@@ -90,10 +114,68 @@ class PostStatusService < BaseService
     Redis.current
   end
 
-  def bump_potential_friendship(account, status)
-    return if !status.reply? || account.id == status.in_reply_to_account_id
+  def scheduled?
+    @scheduled_at.present?
+  end
+
+  def idempotency_key
+    "idempotency:status:#{@account.id}:#{@options[:idempotency]}"
+  end
+
+  def idempotency_given?
+    @options[:idempotency].present?
+  end
+
+  def idempotency_duplicate
+    if scheduled?
+      @account.schedule_statuses.find(@idempotency_duplicate)
+    else
+      @account.statuses.find(@idempotency_duplicate)
+    end
+  end
+
+  def idempotency_duplicate?
+    @idempotency_duplicate = redis.get(idempotency_key)
+  end
+
+  def scheduled_in_the_past?
+    @scheduled_at.present? && @scheduled_at <= Time.now.utc + MIN_SCHEDULE_OFFSET
+  end
+
+  def bump_potential_friendship!
+    return if !@status.reply? || @account.id == @status.in_reply_to_account_id
     ActivityTracker.increment('activity:interactions')
-    return if account.following?(status.in_reply_to_account_id)
-    PotentialFriendshipTracker.record(account.id, status.in_reply_to_account_id, :reply)
+    return if @account.following?(@status.in_reply_to_account_id)
+    PotentialFriendshipTracker.record(@account.id, @status.in_reply_to_account_id, :reply)
+  end
+
+  def status_attributes
+    {
+      text: @text,
+      media_attachments: @media || [],
+      thread: @in_reply_to,
+      sensitive: (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?,
+      spoiler_text: @options[:spoiler_text] || '',
+      visibility: @visibility,
+      language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
+      application: @options[:application],
+    }
+  end
+
+  def scheduled_status_attributes
+    {
+      scheduled_at: @scheduled_at,
+      media_attachments: @media || [],
+      params: scheduled_options,
+    }
+  end
+
+  def scheduled_options
+    @options.tap do |options_hash|
+      options_hash[:in_reply_to_id] = options_hash.delete(:thread)&.id
+      options_hash[:application_id] = options_hash.delete(:application)&.id
+      options_hash[:scheduled_at]   = nil
+      options_hash[:idempotency]    = nil
+    end
   end
 end
diff --git a/app/services/report_service.rb b/app/services/report_service.rb
index 057d05ab9..1bcc1c0d5 100644
--- a/app/services/report_service.rb
+++ b/app/services/report_service.rb
@@ -52,6 +52,6 @@ class ReportService < BaseService
   end
 
   def some_local_account
-    @some_local_account ||= Account.local.where(suspended: false).first
+    @some_local_account ||= Account.representative
   end
 end
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 6ab6b2901..1bc2314de 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -20,6 +20,7 @@ class SuspendAccountService < BaseService
     owned_lists
     passive_relationships
     report_notes
+    scheduled_statuses
     status_pins
     stream_entries
     subscriptions
diff --git a/app/validators/note_length_validator.rb b/app/validators/note_length_validator.rb
new file mode 100644
index 000000000..5ff6df6df
--- /dev/null
+++ b/app/validators/note_length_validator.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class NoteLengthValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    record.errors.add(attribute, I18n.t('statuses.over_character_limit', max: options[:maximum])) if too_long?(value)
+  end
+
+  private
+
+  def too_long?(value)
+    countable_text(value).mb_chars.grapheme_length > options[:maximum]
+  end
+
+  def countable_text(value)
+    return '' if value.nil?
+
+    value.dup.tap do |new_text|
+      new_text.gsub!(FetchLinkCardService::URL_PATTERN, 'x' * 23)
+      new_text.gsub!(Account::MENTION_RE, '@\2')
+    end
+  end
+end
diff --git a/app/validators/unreserved_username_validator.rb b/app/validators/unreserved_username_validator.rb
index c2311a89a..634ceb06e 100644
--- a/app/validators/unreserved_username_validator.rb
+++ b/app/validators/unreserved_username_validator.rb
@@ -2,20 +2,22 @@
 
 class UnreservedUsernameValidator < ActiveModel::Validator
   def validate(account)
-    return if account.username.nil?
-    account.errors.add(:username, I18n.t('accounts.reserved_username')) if reserved_username?(account.username)
+    @username = account.username
+    return if @username.nil?
+
+    account.errors.add(:username, I18n.t('accounts.reserved_username')) if reserved_username?
   end
 
   private
 
-  def pam_controlled?(value)
+  def pam_controlled?
     return false unless Devise.pam_authentication && Devise.pam_controlled_service
-    Rpam2.account(Devise.pam_controlled_service, value).present?
+    Rpam2.account(Devise.pam_controlled_service, @username).present?
   end
 
-  def reserved_username?(value)
-    return true if pam_controlled?(value)
+  def reserved_username?
+    return true if pam_controlled?
     return false unless Setting.reserved_usernames
-    Setting.reserved_usernames.include?(value.downcase)
+    Setting.reserved_usernames.include?(@username.downcase)
   end
 end
diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb
index f39560d90..d95a03fbf 100644
--- a/app/validators/url_validator.rb
+++ b/app/validators/url_validator.rb
@@ -8,7 +8,7 @@ class UrlValidator < ActiveModel::EachValidator
   private
 
   def compliant?(url)
-    parsed_url = Addressable::URI.parse(url).normalize
-    !parsed_url.nil? && %w(http https).include?(parsed_url.scheme) && parsed_url.host
+    parsed_url = Addressable::URI.parse(url)
+    parsed_url && %w(http https).include?(parsed_url.scheme) && parsed_url.host
   end
 end
diff --git a/app/views/admin/domain_blocks/_domain_block.html.haml b/app/views/admin/domain_blocks/_domain_block.html.haml
deleted file mode 100644
index 7bfea3574..000000000
--- a/app/views/admin/domain_blocks/_domain_block.html.haml
+++ /dev/null
@@ -1,13 +0,0 @@
-%tr
-  %td
-    %samp= domain_block.domain
-  %td.severity
-    = t("admin.domain_blocks.severities.#{domain_block.severity}")
-  %td.reject_media
-    - if domain_block.reject_media? || domain_block.suspend?
-      %i.fa.fa-check
-  %td.reject_reports
-    - if domain_block.reject_reports? || domain_block.suspend?
-      %i.fa.fa-check
-  %td
-    = table_link_to 'undo', t('admin.domain_blocks.undo'), admin_domain_block_path(domain_block)
diff --git a/app/views/admin/domain_blocks/index.html.haml b/app/views/admin/domain_blocks/index.html.haml
deleted file mode 100644
index 4c5221c42..000000000
--- a/app/views/admin/domain_blocks/index.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- content_for :page_title do
-  = t('admin.domain_blocks.title')
-
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('admin.domain_blocks.domain')
-        %th= t('admin.domain_blocks.severity')
-        %th= t('admin.domain_blocks.reject_media')
-        %th= t('admin.domain_blocks.reject_reports')
-        %th
-    %tbody
-      = render @domain_blocks
-
-= paginate @domain_blocks
-= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
diff --git a/app/views/admin/followers/index.html.haml b/app/views/admin/followers/index.html.haml
index 31b321bac..25f1f290f 100644
--- a/app/views/admin/followers/index.html.haml
+++ b/app/views/admin/followers/index.html.haml
@@ -23,6 +23,6 @@
         %th= t('admin.accounts.most_recent_activity')
         %th
     %tbody
-      = render partial: 'admin/accounts/account', collection: @followers.map(&:account)
+      = render partial: 'admin/accounts/account', collection: @followers
 
 = paginate @followers
diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml
deleted file mode 100644
index e36ebae47..000000000
--- a/app/views/admin/instances/_instance.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-%tr
-  %td
-    = link_to instance.domain, admin_accounts_path(by_domain: instance.domain)
-  %td.count
-    = instance.accounts_count
-  %td
-    = table_link_to 'paper-plane-o', t('admin.accounts.resubscribe'), resubscribe_admin_instances_url(by_domain: instance.domain), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index 3314ce077..ce35b5db4 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -1,23 +1,39 @@
 - content_for :page_title do
   = t('admin.instances.title')
 
-= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
-  .fields-group
-    - %i(domain_name).each do |key|
-      .input.string.optional
-        = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}")
+.filters
+  .filter-subset
+    %strong= t('admin.instances.moderation.title')
+    %ul
+      %li= filter_link_to t('admin.instances.moderation.all'), limited: nil
+      %li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
 
-    .actions
-      %button= t('admin.instances.search')
-      = link_to t('admin.instances.reset'), admin_instances_path, class: 'button negative'
+  %div{ style: 'flex: 1 1 auto; text-align: right' }
+    = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
 
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('admin.instances.domain_name')
-        %th= t('admin.instances.account_count')
-    %tbody
-      = render @instances
+%hr.spacer/
+
+- @instances.each do |instance|
+  .directory__tag
+    = link_to admin_instance_path(instance) do
+      %h4
+        = instance.domain
+        %small
+          = t('admin.instances.known_accounts', count: instance.accounts_count)
+
+          - if instance.domain_block
+            - if !instance.domain_block.noop?
+              &bull;
+              = t("admin.domain_blocks.severity.#{instance.domain_block.severity}")
+            - if instance.domain_block.reject_media?
+              &bull;
+              = t('admin.domain_blocks.rejecting_media')
+            - if instance.domain_block.reject_reports?
+              &bull;
+              = t('admin.domain_blocks.rejecting_reports')
+
+      .avatar-stack
+        - instance.cached_sample_accounts.each do |account|
+          = image_tag current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar'
 
 = paginate paginated_instances
diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml
new file mode 100644
index 000000000..c7992a490
--- /dev/null
+++ b/app/views/admin/instances/show.html.haml
@@ -0,0 +1,44 @@
+- content_for :page_title do
+  = @instance.domain
+
+.dashboard__counters
+  %div
+    %div
+      .dashboard__counters__num= number_with_delimiter @following_count
+      .dashboard__counters__label= t 'admin.instances.total_followed_by_them'
+  %div
+    %div
+      .dashboard__counters__num= number_with_delimiter @followers_count
+      .dashboard__counters__label= t 'admin.instances.total_followed_by_us'
+  %div
+    %div
+      .dashboard__counters__num= number_to_human_size @media_storage
+      .dashboard__counters__label= t 'admin.instances.total_storage'
+  %div
+    %div
+      .dashboard__counters__num= number_with_delimiter @blocks_count
+      .dashboard__counters__label= t 'admin.instances.total_blocked_by_us'
+  %div
+    %div
+      .dashboard__counters__num= number_with_delimiter @reports_count
+      .dashboard__counters__label= t 'admin.instances.total_reported'
+  %div
+    %div
+      .dashboard__counters__num
+        - if @available
+          = fa_icon 'check'
+        - else
+          = fa_icon 'times'
+      .dashboard__counters__label= t 'admin.instances.delivery_available'
+
+%hr.spacer/
+
+%div{ style: 'overflow: hidden' }
+  %div{ style: 'float: left' }
+    = link_to t('admin.accounts.title'), admin_accounts_path(remote: '1', by_domain: @instance.domain), class: 'button'
+
+  %div{ style: 'float: right' }
+    - if @domain_block
+      = link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@domain_block), class: 'button'
+    - else
+      = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button'
diff --git a/app/views/remote_follow/new.html.haml b/app/views/remote_follow/new.html.haml
index 9b679015f..5cf6977ba 100644
--- a/app/views/remote_follow/new.html.haml
+++ b/app/views/remote_follow/new.html.haml
@@ -16,4 +16,6 @@
     .actions
       = f.button :button, t('remote_follow.proceed'), type: :submit
 
-    %p.hint.subtle-hint= t('remote_follow.no_account_html', sign_up_path: open_registrations? ? new_user_registration_path : 'https://joinmastodon.org/#getting-started')
+    %p.hint.subtle-hint
+      = t('remote_follow.reason_html', instance: site_hostname)
+      = t('remote_follow.no_account_html', sign_up_path: open_registrations? ? new_user_registration_path : 'https://joinmastodon.org/#getting-started')
diff --git a/app/views/remote_interaction/new.html.haml b/app/views/remote_interaction/new.html.haml
index 7357546b6..a0b106814 100644
--- a/app/views/remote_interaction/new.html.haml
+++ b/app/views/remote_interaction/new.html.haml
@@ -1,6 +1,6 @@
 .form-container
   .follow-prompt
-    %h2= t('remote_interaction.prompt')
+    %h2= t("remote_interaction.#{@interaction_type}.prompt")
 
     .public-layout
       .activity-stream.activity-stream--highlighted
@@ -9,9 +9,13 @@
   = simple_form_for @remote_follow, as: :remote_follow, url: remote_interaction_path(@status) do |f|
     = render 'shared/error_messages', object: @remote_follow
 
+    = hidden_field_tag :type, @interaction_type
+
     = f.input :acct, placeholder: t('remote_follow.acct'), input_html: { autocapitalize: 'none', autocorrect: 'off' }
 
     .actions
-      = f.button :button, t('remote_interaction.proceed'), type: :submit
+      = f.button :button, t("remote_interaction.#{@interaction_type}.proceed"), type: :submit
 
-    %p.hint.subtle-hint= t('remote_follow.no_account_html', sign_up_path: open_registrations? ? new_user_registration_path : 'https://joinmastodon.org/#getting-started')
+    %p.hint.subtle-hint
+      = t('remote_follow.reason_html', instance: site_hostname)
+      = t('remote_follow.no_account_html', sign_up_path: open_registrations? ? new_user_registration_path : 'https://joinmastodon.org/#getting-started')
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index 447667c5a..9298ecbb0 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -28,8 +28,8 @@
       = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description
     - else
       = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
-  - elsif status.preview_cards.first
-    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_cards.first, serializer: REST::PreviewCardSerializer).as_json
+  - elsif status.preview_card
+    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   .detailed-status__meta
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
@@ -43,7 +43,7 @@
       - else
         = link_to status.application.name, status.application.website, class: 'detailed-status__application', target: '_blank', rel: 'noopener'
       ·
-    = link_to remote_interaction_path(status), class: 'modal-button detailed-status__link' do
+    = link_to remote_interaction_path(status, type: :reply), class: 'modal-button detailed-status__link' do
       - if status.in_reply_to_id.nil?
         = fa_icon('reply')
       - else
@@ -58,12 +58,12 @@
       %span.detailed-status__link<
         = fa_icon('lock')
     - else
-      = link_to remote_interaction_path(status), class: 'modal-button detailed-status__link' do
+      = link_to remote_interaction_path(status, type: :reblog), class: 'modal-button detailed-status__link' do
         = fa_icon('retweet')
         %span.detailed-status__reblogs>= number_to_human status.reblogs_count, strip_insignificant_zeros: true
         = " "
     ·
-    = link_to remote_interaction_path(status), class: 'modal-button detailed-status__link' do
+    = link_to remote_interaction_path(status, type: :favourite), class: 'modal-button detailed-status__link' do
       = fa_icon('star')
       %span.detailed-status__favorites>= number_to_human status.favourites_count, strip_insignificant_zeros: true
       = " "
diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml
index 3a4dacc06..1d44be791 100644
--- a/app/views/stream_entries/_simple_status.html.haml
+++ b/app/views/stream_entries/_simple_status.html.haml
@@ -27,27 +27,29 @@
     .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }<
       = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 
-  - unless status.media_attachments.empty?
+  - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
       = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
     - else
       = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
+  - elsif status.preview_card
+    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   .status__action-bar
     .status__action-bar__counter
-      = link_to remote_interaction_path(status), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
+      = link_to remote_interaction_path(status, type: :reply), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
         - if status.in_reply_to_id.nil?
           = fa_icon 'reply fw'
         - else
           = fa_icon 'reply-all fw'
       .status__action-bar__counter__label= obscured_counter status.replies_count
-    = link_to remote_interaction_path(status), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
+    = link_to remote_interaction_path(status, type: :reblog), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
       - if status.public_visibility? || status.unlisted_visibility?
         = fa_icon 'retweet fw'
       - elsif status.private_visibility?
         = fa_icon 'lock fw'
       - else
         = fa_icon 'envelope fw'
-    = link_to remote_interaction_path(status), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
+    = link_to remote_interaction_path(status, type: :favourite), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
       = fa_icon 'star fw'
diff --git a/app/workers/publish_scheduled_status_worker.rb b/app/workers/publish_scheduled_status_worker.rb
new file mode 100644
index 000000000..641fcc61c
--- /dev/null
+++ b/app/workers/publish_scheduled_status_worker.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class PublishScheduledStatusWorker
+  include Sidekiq::Worker
+
+  def perform(scheduled_status_id)
+    scheduled_status = ScheduledStatus.find(scheduled_status_id)
+    scheduled_status.destroy!
+
+    PostStatusService.new.call(
+      scheduled_status.account,
+      options_with_objects(scheduled_status.params.with_indifferent_access)
+    )
+  rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid
+    true
+  end
+
+  def options_with_objects(options)
+    options.tap do |options_hash|
+      options_hash[:application] = Doorkeeper::Application.find(options_hash.delete(:application_id)) if options[:application_id]
+      options_hash[:thread]      = Status.find(options_hash.delete(:in_reply_to_id)) if options_hash[:in_reply_to_id]
+    end
+  end
+end
diff --git a/app/workers/scheduler/scheduled_statuses_scheduler.rb b/app/workers/scheduler/scheduled_statuses_scheduler.rb
new file mode 100644
index 000000000..1772a246b
--- /dev/null
+++ b/app/workers/scheduler/scheduled_statuses_scheduler.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Scheduler::ScheduledStatusesScheduler
+  include Sidekiq::Worker
+
+  sidekiq_options unique: :until_executed, retry: 0
+
+  def perform
+    due_statuses.find_each do |scheduled_status|
+      PublishScheduledStatusWorker.perform_at(scheduled_status.scheduled_at, scheduled_status.id)
+    end
+  end
+
+  private
+
+  def due_statuses
+    ScheduledStatus.where('scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
+  end
+end
diff --git a/app/workers/unfollow_follow_worker.rb b/app/workers/unfollow_follow_worker.rb
new file mode 100644
index 000000000..50d3bf034
--- /dev/null
+++ b/app/workers/unfollow_follow_worker.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class UnfollowFollowWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: 'pull'
+
+  def perform(follower_account_id, old_target_account_id, new_target_account_id)
+    follower_account   = Account.find(follower_account_id)
+    old_target_account = Account.find(old_target_account_id)
+    new_target_account = Account.find(new_target_account_id)
+
+    FollowService.new.call(follower_account, new_target_account)
+    UnfollowService.new.call(follower_account, old_target_account)
+  rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
+    true
+  end
+end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index df0205879..4bbf8b827 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -25,7 +25,7 @@ if ENV['S3_ENABLED'] == 'true'
     s3_protocol: s3_protocol,
     s3_host_name: s3_hostname,
     s3_headers: {
-      'Cache-Control' => 'max-age=315576000',
+      'Cache-Control' => 'public, max-age=315576000, immutable',
     },
     s3_permissions: ENV.fetch('S3_PERMISSION') { 'public-read' },
     s3_region: s3_region,
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 49ee567f3..07bcfbf12 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -86,6 +86,8 @@ ar:
       moderator: مُشرِف
     unfollow: إلغاء المتابعة
   admin:
+    account_actions:
+      action: تنفيذ الاجراء
     account_moderation_notes:
       create: إترك ملاحظة
       created_msg: تم إنشاء ملاحظة الإشراف بنجاح !
@@ -107,7 +109,7 @@ ar:
       confirming: التأكد
       demote: إنزال الرُتبة الوظيفية
       disable: تعطيل
-      disable_two_factor_authentication: تعطيل 2FA
+      disable_two_factor_authentication: تعطيل المصادقة بخطوتين
       disabled: معطَّل
       display_name: عرض الإسم
       domain: النطاق
@@ -130,7 +132,7 @@ ar:
         title: الموقع
       login_status: وضع الدخول
       media_attachments: الوسائط المرفقة
-      memorialize: تحول إلى صفحة للذاكرة
+      memorialize: تحويل الحساب إلى صفحة ذكرى
       moderation:
         active: نشِط
         all: الكل
@@ -143,7 +145,7 @@ ar:
       no_limits_imposed: مِن دون حدود مشروطة
       not_subscribed: غير مشترك
       outbox_url: رابط صندوق الصادر
-      perform_full_suspension: تعطيل
+      perform_full_suspension: تعليق الحساب
       profile_url: رابط الملف الشخصي
       promote: ترقية
       protocol: البروتوكول
@@ -158,8 +160,8 @@ ar:
         success: تم إرسال رسالة التأكيد بنجاح!
       reset: إعادة التعيين
       reset_password: إعادة ضبط كلمة السر
-      resubscribe: اشترك مرة أخرى
-      role: التصريحات
+      resubscribe: إعادة الإشتراك
+      role: الصلاحيات
       roles:
         admin: مدير
         moderator: مشرف
@@ -170,8 +172,8 @@ ar:
       shared_inbox_url: رابط الصندوق المُشترَك للبريد الوارد
       show:
         created_reports: البلاغات التي أنشأها هذا الحساب
-        targeted_reports: التقريرات التي أُنشِأت ضد هذا الحساب
-      silence: سكتهم
+        targeted_reports: الشكاوي التي أُنشِأت ضد هذا الحساب
+      silence: كتم
       silenced: تم كتمه
       statuses: المنشورات
       subscribe: اشترك
@@ -204,9 +206,9 @@ ar:
         memorialize_account: لقد قام %{name} بتحويل حساب %{target} إلى صفحة تذكارية
         promote_user: "%{name} قام بترقية المستخدم %{target}"
         remove_avatar_user: تمت إزالة %{name} الصورة الرمزية %{target}
-        reopen_report: تمت إعادة فتح التقرير %{name} %{target}
+        reopen_report: تمت إعادة فتح الشكوى %{name} %{target}
         reset_password_user: "%{name} لقد قام بإعادة تعيين الكلمة السرية الخاصة بـ %{target}"
-        resolve_report: قام %{name} بحل التقرير %{target}
+        resolve_report: قام %{name} بحل الشكوى %{target}
         silence_account: لقد قام %{name} بكتم حساب %{target}
         suspend_account: لقد قام %{name} بتعليق حساب %{target}
         unassigned_report: "%{name} تقرير غير معتمد %{target}"
@@ -251,7 +253,7 @@ ar:
       feature_relay: المُرحّل الفديرالي
       features: الميّزات
       hidden_service: الفيديرالية مع الخدمات الخفية
-      open_reports: فتح التقريرات
+      open_reports: فتح الشكاوي
       recent_users: أحدث المستخدِمين
       search: البحث النصي الكامل
       single_user_mode: وضع المستخدِم الأوحد
@@ -280,11 +282,6 @@ ar:
       reject_media: رفض ملفات الوسائط
       reject_media_hint: يزيل ملفات الوسائط المخزنة محليًا ويرفض تنزيل أي ملفات في المستقبل. غير ذي صلة للتعليق
       reject_reports: رفض التقارير
-      severities:
-        noop: لا شيء
-        silence: إخفاء أو كتم
-        suspend: تعليق
-      severity: الشدة
       show:
         affected_accounts:
           few: "%{count} حسابات معنية في قاعدة البيانات"
@@ -298,7 +295,6 @@ ar:
           suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق
         title: رفع حظر النطاق عن %{domain}
         undo: إلغاء
-      title: حظر النطاقات
       undo: إلغاء
     email_domain_blocks:
       add_new: إضافة
@@ -310,11 +306,9 @@ ar:
         create: إضافة نطاق
         title: إضافة نطاق بريد جديد إلى اللائحة السوداء
       title: القائمة السوداء للبريد الإلكتروني
+    followers:
+      back_to_account: العودة إلى الحساب
     instances:
-      account_count: الحسابات المعروفة
-      domain_name: النطاق
-      reset: إعادة تعيين
-      search: البحث
       title: مثيلات الخوادم المعروفة
     invites:
       deactivate_all: تعطيلها كافة
@@ -339,10 +333,8 @@ ar:
       status: الحالة
       title: المُرحّلات
     report_notes:
-      created_msg: |-
-        41/5000
-        تم إنشاء ملاحظة التقرير بنجاح!
-      destroyed_msg: تم حذف ملاحظة التقرير بنجاح!
+      created_msg: تم إنشاء ملاحظة الشكوى بنجاح!
+      destroyed_msg: تم حذف ملاحظة الشكوى بنجاح!
     reports:
       account:
         note: ملحوظة
@@ -354,7 +346,7 @@ ar:
       comment:
         none: لا شيء
       created_at: ذكرت
-      mark_as_resolved: إعتبار التقرير كمحلول
+      mark_as_resolved: إعتبار الشكوى كمحلولة
       mark_as_unresolved: علام كغير محلولة
       notes:
         create: اضف ملاحظة
@@ -362,14 +354,14 @@ ar:
         create_and_unresolve: إعادة فتح مع ملاحظة
         delete: حذف
         placeholder: قم بوصف الإجراءات التي تم اتخاذها أو أي تحديثات أخرى ذات علاقة …
-      reopen: إعادة فتح التقرير
-      report: 'التقرير #%{id}'
+      reopen: إعادة فتح الشكوى
+      report: 'الشكوى #%{id}'
       reported_account: حساب مُبلّغ عنه
       reported_by: أبلغ عنه من طرف
       resolved: معالجة
       resolved_msg: تم حل تقرير بنجاح!
       status: الحالة
-      title: التقارير
+      title: الشكاوي
       unassign: إلغاء تعيين
       unresolved: غير معالجة
       updated_at: محدث
@@ -441,15 +433,15 @@ ar:
       back_to_account: العودة إلى صفحة الحساب
       batch:
         delete: حذف
-        nsfw_off: ضع علامة انها غير حساسة
-        nsfw_on: ضع علامة انها حساسة
+        nsfw_off: تعيينه كمنشور غير حساس
+        nsfw_on: تعيينه كمنشور حساس
       failed_to_execute: خطأ في التفعيل
       media:
         title: الوسائط
-      no_media: لا يوجد وسائط
+      no_media: لا تحتوي على وسائط
       no_status_selected: لم يطرأ أي تغيير على أي منشور بما أنه لم يتم اختيار أي واحد
       title: منشورات الحساب
-      with_media: بالوسائط
+      with_media: تحتوي على وسائط
     subscriptions:
       callback_url: عاود الاتصال بالعنوان
       confirmed: مؤكَّد
@@ -466,6 +458,12 @@ ar:
       unhide: إظهاره في سجل حسابات المستخدمين
       visible: ظاهر
     title: الإدارة
+    warning_presets:
+      add_new: إضافة واحد جديد
+      delete: حذف
+      edit: تعديل
+      edit_preset: تعديل نموذج التحذير
+      title: إدارة نماذج التحذير
   admin_mailer:
     new_report:
       body: قام %{reporter} بالإبلاغ عن %{target}
@@ -650,7 +648,7 @@ ar:
     prompt: توليد و مشاركة روابط للسماح للآخَرين بالنفاذ إلى مثيل الخادوم هذا
     table:
       expires_at: تنتهي مدة صلاحيتها في
-      uses: يستخدِم
+      uses: عدد الاستخدامات
     title: دعوة أشخاص
   lists:
     errors:
@@ -709,7 +707,7 @@ ar:
         units:
           billion: B
           million: M
-          quadrillion: Q
+          quadrillion: كواد
           thousand: ألف
           trillion: T
           unit: ''
@@ -730,9 +728,6 @@ ar:
     no_account_html: أليس عندك حساب بعدُ ؟ يُمْكنك <a href='%{sign_up_path}' target='_blank'>التسجيل مِن هنا</a>
     proceed: أكمل المتابعة
     prompt: 'إنك  بصدد متابعة :'
-  remote_interaction:
-    proceed: إبدأ التفاعل
-    prompt: 'تريد التفاعُل مع هذا التبويق:'
   remote_unfollow:
     error: خطأ
     title: العنوان
@@ -871,6 +866,14 @@ ar:
       explanation: لقد قمت بطلب نسخة كاملة لحسابك على ماستدون. إنها متوفرة الآن للتنزيل !
       subject: نسخة بيانات حسابك جاهزة للتنزيل
       title: المغادرة بأرشيف الحساب
+    warning:
+      review_server_policies: مراجعة شروط السيرفر
+      subject:
+        disable: تم تجميد حسابك %{acct}
+      title:
+        disable: الحساب مُجمَّد
+        none: تحذير
+        suspend: الحساب مُعلَّق
     welcome:
       edit_profile_action: تهيئة الملف الشخصي
       edit_profile_step: يُمكنك·كي تخصيص ملفك الشخصي عن طريق تحميل صورة رمزية ورأسية و بتعديل  إسمك·كي العلني وأكثر. و إن أردت·تي معاينة المتابِعين و المتابعات الجُدد قبيل السماح لهم·ن بمتابَعتك فيمكنك·كي تأمين حسابك·كي.
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index c18c398eb..78ad796a0 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -96,8 +96,6 @@ ast:
     email_domain_blocks:
       domain: Dominiu
     instances:
-      account_count: Cuentes conocíes
-      domain_name: Dominiu
       title: Instancies conocíes
     invites:
       filter:
@@ -268,9 +266,6 @@ ast:
     no_account_html: "¿Nun tienes una cuenta? Pues <a href='%{sign_up_path}' target='_blank'>rexistrate equí</a>"
     proceed: Siguir
     prompt: 'Vas siguir a:'
-  remote_interaction:
-    proceed: Interactuar
-    prompt: 'Quies interactuar con esti toot:'
   remote_unfollow:
     error: Fallu
   sessions:
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 518f3f781..6c258361c 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -70,6 +70,9 @@ ca:
       moderator: Moderador
     unfollow: Deixa de seguir
   admin:
+    account_actions:
+      action: Realitzar acció
+      title: Fer l'acció de moderació a %{acct}
     account_moderation_notes:
       create: Crea nota
       created_msg: La nota de moderació s'ha creat correctament!
@@ -102,8 +105,10 @@ ca:
       enabled: Habilitat
       feed_url: URL del canal
       followers: Seguidors
+      followers_local: "(%{local} locals)"
       followers_url: URL dels seguidors
       follows: Segueix
+      header: Capçalera
       inbox_url: URL de la safata d'entrada
       ip: IP
       location:
@@ -134,6 +139,7 @@ ca:
       push_subscription_expires: La subscripció PuSH expira
       redownload: Actualitza l'avatar
       remove_avatar: Eliminar avatar
+      remove_header: Treu la capçalera
       resend_confirmation:
         already_confirmed: Este usuario ya está confirmado
         send: Reenviar el correu electrònic de confirmació
@@ -170,6 +176,7 @@ ca:
         assigned_to_self_report: "%{name} han assignat l'informe %{target} a ells mateixos"
         change_email_user: "%{name} ha canviat l'adreça de correu electrònic del usuari %{target}"
         confirm_user: "%{name} ha confirmat l'adreça de correu electrònic de l'usuari %{target}"
+        create_account_warning: "%{name} ha enviat un avís a %{target}"
         create_custom_emoji: "%{name} ha pujat un nou emoji %{target}"
         create_domain_block: "%{name} ha blocat el domini %{target}"
         create_email_domain_block: "%{name} ha afegit a la llista negra el domini del correu electrònic %{target}"
@@ -263,11 +270,6 @@ ca:
       reject_media_hint: Elimina els fitxers multimèdia emmagatzemats localment i impedeix baixar-ne cap en el futur. Irrellevant en les suspensions
       reject_reports: Rebutja informes
       reject_reports_hint: Ignora tots els informes procedents d'aquest domini. No és rellevant per a les suspensions
-      severities:
-        noop: Cap
-        silence: Silenci
-        suspend: Suspensió
-      severity: Severitat
       show:
         affected_accounts:
           one: Un compte afectat en la base de dades
@@ -277,7 +279,6 @@ ca:
           suspend: Desfés la suspensió de tots els comptes d'aquest domini
         title: Desfés el bloqueig de domini de %{domain}
         undo: Desfés
-      title: Bloquejos de domini
       undo: Desfés
     email_domain_blocks:
       add_new: Afegeix
@@ -289,11 +290,10 @@ ca:
         create: Afegeix un domini
         title: Nova adreça de correu en la llista negra
       title: Llista negra de correus electrònics
+    followers:
+      back_to_account: Tornar al compte
+      title: Seguidors de %{acct}
     instances:
-      account_count: Comptes coneguts
-      domain_name: Domini
-      reset: Restableix
-      search: Cerca
       title: Instàncies conegudes
     invites:
       deactivate_all: Desactiva-ho tot
@@ -447,6 +447,12 @@ ca:
       unhide: Mostra en el directori
       visible: Visible
     title: Administració
+    warning_presets:
+      add_new: Afegir nou
+      delete: Esborra
+      edit: Edita
+      edit_preset: Edita l'avís predeterminat
+      title: Gestiona les configuracions predefinides dels avisos
   admin_mailer:
     new_report:
       body: "%{reporter} ha informat de %{target}"
@@ -702,9 +708,6 @@ ca:
     no_account_html: No tens cap compte? Pots <a href='%{sign_up_path}' target='_blank'>registrar-te aquí</a>
     proceed: Comença a seguir
     prompt: 'Seguiràs a:'
-  remote_interaction:
-    proceed: Procedeix a interactuar
-    prompt: 'Vols interactuar amb aquest toot:'
   remote_unfollow:
     error: Error
     title: Títol
@@ -909,6 +912,22 @@ ca:
       explanation: Has sol·licitat una copia completa del teu compte Mastodon. Ara ja està a punt per descàrrega!
       subject: El teu arxiu està preparat per a descàrrega
       title: Recollida del arxiu
+    warning:
+      explanation:
+        disable: Mentre el teu compte estigui congelat les dades romandran intactes però no pots dur a terme cap acció fins que no estigui desbloquejat.
+        silence: Mentre el teu compte estigui limitat només les persones que ja et segueixen veuen les teves dades en aquest servidor i pots ser exclòs de diverses llistes públiques. No obstant això, d'altres encara poden seguir-te manualment.
+        suspend: El teu compte s'ha suspès i tots els teus toots i fitxers multimèdia penjats s'han eliminat irreversiblement d'aquest servidor i dels servidors on tenies seguidors.
+      review_server_policies: Revisa les polítiques del servidor
+      subject:
+        disable: S'ha congelat el teu compte %{acct}
+        none: Avís per a %{acct}
+        silence: El teu compte %{acct} ha estat limitat
+        suspend: S'ha suspès el teu compte %{acct}
+      title:
+        disable: Compte congelat
+        none: Avís
+        silence: Compte limitat
+        suspend: Compte suspès
     welcome:
       edit_profile_action: Configurar perfil
       edit_profile_step: Pots personalitzar el teu perfil penjant un avatar, un encapçalament, canviant el teu nom de visualització i molt més. Si prefereixes revisar els seguidors nous abans de que et puguin seguir, pots blocar el teu compte.
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 47c094f43..c2de9e4c6 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -70,6 +70,9 @@ co:
       moderator: Muderatore
     unfollow: Ùn siguità più
   admin:
+    account_actions:
+      action: Realizà un'azzione
+      title: Realizà un'azzione di muderazione nant'à %{acct}
     account_moderation_notes:
       create: Creà
       created_msg: Nota di muderazione creata!
@@ -102,6 +105,7 @@ co:
       enabled: Attivatu
       feed_url: URL di u flussu
       followers: Abbunati
+      followers_local: "(%{local} lucali)"
       followers_url: URL di l’abbunati
       follows: Abbunamenti
       header: Intistatura
@@ -172,6 +176,7 @@ co:
         assigned_to_self_report: "%{name} s’hè assignatu u signalamentu %{target}"
         change_email_user: "%{name} hà cambiatu l’indirizzu e-mail di %{target}"
         confirm_user: "%{name} hà cunfirmatu l’indirizzu e-mail di %{target}"
+        create_account_warning: "%{name} hà mandatu un'avertimentu à %{target}"
         create_custom_emoji: "%{name} hà caricatu una nov’emoji %{target}"
         create_domain_block: "%{name} hà bluccatu u duminiu %{target}"
         create_email_domain_block: "%{name} hà messu u duminiu e-mail %{target} nant’a lista nera"
@@ -265,11 +270,6 @@ co:
       reject_media_hint: Sguassa tutti i media caricati è ricusa caricamenti futuri. Inutile per una suspensione
       reject_reports: Righjittà i rapporti
       reject_reports_hint: Ignurà tutti i signalamenti chì venenu d'issu duminiu. Senz'oghjettu pè e suspensione
-      severities:
-        noop: Nisuna
-        silence: Silenzà
-        suspend: Suspende
-      severity: Severità
       show:
         affected_accounts:
           one: Un contu tuccatu indè a database
@@ -279,7 +279,6 @@ co:
           suspend: Ùn suspende più i conti nant’à stu duminiu
         title: Ùn bluccà più u duminiu %{domain}
         undo: Annullà
-      title: Blucchimi di duminiu
       undo: Annullà
     email_domain_blocks:
       add_new: Aghjustà
@@ -291,11 +290,10 @@ co:
         create: Creà un blucchime
         title: Nova iscrizzione nant’a lista nera e-mail
       title: Lista nera e-mail
+    followers:
+      back_to_account: Rivene à u Contu
+      title: Abbunati à %{acct}
     instances:
-      account_count: Conti cunnisciuti
-      domain_name: Duminiu
-      reset: Riinizializà
-      search: Cercà
       title: Istanze cunnisciute
     invites:
       deactivate_all: Disattivà tuttu
@@ -449,6 +447,12 @@ co:
       unhide: Mustrà in l'annuariu
       visible: Visibile
     title: Amministrazione
+    warning_presets:
+      add_new: Aghjustà nova
+      delete: Sguassà
+      edit: Cambià
+      edit_preset: Cambià a preselezzione d'avertimentu
+      title: Amministrà e preselezzione d'avertimentu
   admin_mailer:
     new_report:
       body: "%{reporter} hà palisatu %{target}"
@@ -704,9 +708,6 @@ co:
     no_account_html: Ùn avete micca un contu? Pudete <a href='%{sign_up_path}' target='_blank'>arregistravi quì</a>
     proceed: Cuntinuà per siguità
     prompt: 'Avete da siguità:'
-  remote_interaction:
-    proceed: Cunfirmà l'interazzione
-    prompt: 'Vulete interagisce cù u statutu:'
   remote_unfollow:
     error: Errore
     title: Titulu
@@ -801,7 +802,7 @@ co:
       unlisted_long: Tuttu u mondu pò vede, mà micca indè e linee pubbliche
   stream_entries:
     pinned: Statutu puntarulatu
-    reblogged: spartutu
+    reblogged: hà spartutu
     sensitive_content: Cuntenutu sensibile
   terms:
     body_html: |
@@ -915,6 +916,22 @@ co:
       explanation: Avete dumandatu un’archiviu cumpletu di u vostru contu Mastodon. Avà hè prontu per scaricà!
       subject: U vostru archiviu hè prontu à scaricà
       title: Archiviu prontu
+    warning:
+      explanation:
+        disable: Quandu u vostru contu hè ghjacciatu, i vostri dati stannu intatti, mà ùn pudete fà nunda fin'à ch'ellu sia sbluccatu.
+        silence: Quandu u vostru contu hè limitatu, solu quelli chì sò digià abbunati à u vostru contu viderenu i vostri statuti nant'à quessu servore, è puderete esse esclusu·a di parechje liste pubbliche. Però, altri conti puderenu sempre seguitavi.
+        suspend: U vostru contu hè statu suspesu, è tutti i vo statuti è fugliali media caricati sò stati sguassati di manera irreversibile di stu servore, è di i servori induve aviate abbunati.
+      review_server_policies: Leghje e pulitiche di u servore
+      subject:
+        disable: U vostru contu %{acct} hè statu ghjacciatu
+        none: Avertimentu pè %{acct}
+        silence: U vostru contu %{acct} hè statu limitatu
+        suspend: U vostru contu %{acct} hè statu suspesu
+      title:
+        disable: Contu ghjacciatu
+        none: Avertimentu
+        silence: Contu limitatu
+        suspend: Contu suspesu
     welcome:
       edit_profile_action: Cunfigurazione di u prufile
       edit_profile_step: Pudete persunalizà u vostru prufile cù un ritrattu di prufile o di cuprendula, un nome pubblicu persunalizatu, etc. Pudete ancu rende u contu privatu per duvè cunfirmà ogni dumanda d’abbunamentu.
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index f7b1fbef0..8f3143fc6 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -74,6 +74,9 @@ cs:
       moderator: Moderátor
     unfollow: Přestat sledovat
   admin:
+    account_actions:
+      action: Vykonat akci
+      title: Vykonat moderační akci pro účet %{acct}
     account_moderation_notes:
       create: Zanechat poznámku
       created_msg: Poznámka moderátora byla úspěšně vytvořena!
@@ -106,6 +109,7 @@ cs:
       enabled: Povoleno
       feed_url: URL proudu
       followers: Sledovatelé
+      followers_local: "(%{local} místních)"
       followers_url: URL sledovatelů
       follows: Sledovaní
       header: Hlavička
@@ -123,7 +127,7 @@ cs:
         active: Aktivní
         all: Vše
         silenced: Utišen/a
-        suspended: Suspendován/a
+        suspended: Pozastaven/a
         title: Moderace
       moderation_notes: Moderační poznámky
       most_recent_activity: Nejnovější aktivita
@@ -131,7 +135,7 @@ cs:
       no_limits_imposed: Nejsou nastavena žádná omezení
       not_subscribed: Neodebírá
       outbox_url: URL odchozích zpráv
-      perform_full_suspension: Suspendovat
+      perform_full_suspension: Pozastavit
       profile_url: URL profilu
       promote: Povýšit
       protocol: Protokol
@@ -157,17 +161,17 @@ cs:
       search: Hledat
       shared_inbox_url: URL sdílené schránky
       show:
-        created_reports: Nahlášení vytvořené z tohoto účtu
-        targeted_reports: Nahlášení vytvořena o tomto účtu
+        created_reports: Nahlášení vytvořená z tohoto účtu
+        targeted_reports: Nahlášení vytvořená o tomto účtu
       silence: Utišit
       silenced: Utišen/a
       statuses: Příspěvky
       subscribe: Odebírat
-      suspended: Suspendován/a
+      suspended: Pozastaven/a
       title: Účty
       unconfirmed_email: Nepotvrzený e-mail
       undo_silenced: Zrušit utišení
-      undo_suspension: Zrušit suspenzaci
+      undo_suspension: Zrušit pozastavení
       unsubscribe: Přestat odebírat
       username: Uživatelské jméno
       web: Web
@@ -176,6 +180,7 @@ cs:
         assigned_to_self_report: "%{name} přidělil/a hlášení %{target} sobě"
         change_email_user: "%{name} změnil/a e-mailovou adresu uživatele %{target}"
         confirm_user: "%{name} potvrdil/a e-mailovou adresu uživatele %{target}"
+        create_account_warning: "%{name} poslal/a varování uživateli %{target}"
         create_custom_emoji: "%{name} nahrál/a nové emoji %{target}"
         create_domain_block: "%{name} zablokoval/a doménu %{target}"
         create_email_domain_block: "%{name} přidal/a e-mailovou doménu %{target} na černou listinu"
@@ -196,10 +201,10 @@ cs:
         reset_password_user: "%{name} resetoval/a heslo uživatele %{target}"
         resolve_report: "%{name} vyřešil/a nahlášení %{target}"
         silence_account: "%{name} utišil/a účet uživatele %{target}"
-        suspend_account: "%{name} suspendoval/a účet uživatele %{target}"
+        suspend_account: "%{name} pozastavil/a účet uživatele %{target}"
         unassigned_report: "%{name} odebral/a nahlášení %{target}"
         unsilence_account: "%{name} odtišil/a účet uživatele %{target}"
-        unsuspend_account: "%{name} zrušil/a suspenzaci účtu uživatele %{target}"
+        unsuspend_account: "%{name} zrušil/a pozastavení účtu uživatele %{target}"
         update_custom_emoji: "%{name} aktualizoval/a emoji %{target}"
         update_status: "%{name} aktualizoval/a příspěvek uživatele %{target}"
       deleted_status: "(smazaný příspěvek)"
@@ -233,7 +238,7 @@ cs:
       backlog: opožděné úlohy
       config: Konfigurace
       feature_deletions: Smazání účtů
-      feature_invites: Pozvánky
+      feature_invites: Odkazy pozvánek
       feature_profile_directory: Adresář profilů
       feature_registrations: Registrace
       feature_relay: Federovací most
@@ -260,20 +265,15 @@ cs:
         create: Vytvořit blokaci
         hint: Blokace domény nezakáže vytváření účtových záznamů v databázi, ale bude na tyto účty zpětně a automaticky aplikovat specifické metody moderace.
         severity:
-          desc_html: Funkce <strong>Utišit</strong> zneviditelní příspěvky z účtu komukoliv, kdo jej nesleduje. Funkce <strong>Suspendovat</strong> odstraní všechen obsah, média a profilová data účtu. Pro pouhé odmítnutí mediálních souborů použijte funkci <strong>Žádné</strong>.
+          desc_html: Funkce <strong>Utišit</strong> zneviditelní příspěvky z účtu komukoliv, kdo jej nesleduje. Funkce <strong>Pozastavit</strong> odstraní všechen obsah, média a profilová data účtu. Pro pouhé odmítnutí mediálních souborů použijte funkci <strong>Žádné</strong>.
           noop: Žádné
           silence: Utišit
-          suspend: Suspendovat
+          suspend: Pozastavit
         title: Nová doménová blokace
       reject_media: Odmítat mediální soubory
-      reject_media_hint: Odstraní lokálně uložené soubory a odmítne jejich stažení v budoucnosti. Irelevantní pro suspenzace
+      reject_media_hint: Odstraní lokálně uložené soubory a odmítne jejich stažení v budoucnosti. Nepodstatné pro pozastavení
       reject_reports: Odmítnout nahlášení
       reject_reports_hint: Ignorovat všechna nahlášení pocházející z této domény. Nepodstatné pro suspenzace
-      severities:
-        noop: Žádné
-        silence: Utišit
-        suspend: Suspendovat
-      severity: Přísnost
       show:
         affected_accounts:
           few: "%{count} účty v databázi byly ovlivněny"
@@ -281,10 +281,9 @@ cs:
           other: "%{count} účtů v databázi bylo ovlivněno"
         retroactive:
           silence: Odtišit všechny existující účty z této domény
-          suspend: Zrušit suspenzaci všech existujících účtů z této domény
+          suspend: Zrušit pozastavení všech existujících účtů z této domény
         title: Zrušit blokaci domény %{domain}
         undo: Odvolat
-      title: Doménové blokace
       undo: Odvolat
     email_domain_blocks:
       add_new: Přidat nový
@@ -296,11 +295,10 @@ cs:
         create: Přidat doménu
         title: Nový e-mail pro zablokování
       title: Černá listina e-mailů
+    followers:
+      back_to_account: Zpět na účet
+      title: Sledovatelé uživatele %{acct}
     instances:
-      account_count: Známé účty
-      domain_name: Doména
-      reset: Resetovat
-      search: Hledat
       title: Známé instance
     invites:
       deactivate_all: Deaktivovat vše
@@ -454,6 +452,12 @@ cs:
       unhide: Zobrazit v adresáři
       visible: Viditelné
     title: Administrace
+    warning_presets:
+      add_new: Přidat nové
+      delete: Smazat
+      edit: Upravit
+      edit_preset: Upravit přednastavení pro varování
+      title: Spravovat přednastavení pro varování
   admin_mailer:
     new_report:
       body: "%{reporter} nahlásil/a uživatele %{target}"
@@ -657,7 +661,7 @@ cs:
       body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since}
       mention: "%{name} vás zmínil/a v:"
       new_followers_summary:
-        few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Skvělé!
+        few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Hurá!
         one: Navíc jste získal/a jednoho nového sledovatele, zatímco jste byl/a pryč! Hurá!
         other: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Úžasné!
       subject:
@@ -714,9 +718,6 @@ cs:
     no_account_html: Ještě nemáte účet? Můžete se <a href='%{sign_up_path}' target='_blank'>registrovat zde</a>
     proceed: Pokračovat ke sledování
     prompt: 'Budete sledovat:'
-  remote_interaction:
-    proceed: Pokračovat k interakci
-    prompt: 'Chcete interagovat s tímto tootem:'
   remote_unfollow:
     error: Chyba
     title: Nadpis
@@ -928,6 +929,22 @@ cs:
       explanation: Vyžádal/a jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
       subject: Váš archiv je připraven ke stažení
       title: Stažení archivu
+    warning:
+      explanation:
+        disable: Zatímco je váš účet zmražen, zůstávají data vašeho účtu nedotčená, ale nemůžete vykonávat žádné akce, dokud nebude odemčen.
+        silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučen/a z různých veřejných výpisů. Ostatní vás však pořád mohou manuálně sledovat.
+        suspend: Váš účet byl pozastaven a všechny vaše tooty a vaše nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měl/a sledovatele.
+      review_server_policies: Posoudit politiku serveru
+      subject:
+        disable: Váš účet %{acct} byl zmražen
+        none: Varování pro uživatele %{acct}
+        silence: Váš účet %{acct} byl omezen
+        suspend: Váš účet %{acct} byl pozastaven
+      title:
+        disable: Účet zmražen
+        none: Varování
+        silence: Účet omezen
+        suspend: Účet pozastaven
     welcome:
       edit_profile_action: Nastavit profil
       edit_profile_step: Můžete si přizpůsobit svůj profil nahráním avataru a obrázku na hlavičce, změnou zobrazovaného jména a dalších. Chcete-li posoudit nové sledovatele předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index af37278e2..40cb1cac0 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -252,11 +252,6 @@ cy:
       reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau
       reject_reports: Gwrthod adroddiadau
       reject_reports_hint: Anwybyddu'r holl adroddiadau sy'n dod o'r parth hwn. Amherthnasol i ataliadau
-      severities:
-        noop: Dim
-        silence: Tawelu
-        suspend: Atal
-      severity: Difrifoldeb
       show:
         affected_accounts: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio"
         retroactive:
@@ -264,7 +259,6 @@ cy:
           suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli
         title: Dadwneud blocio parth ar gyfer %{domain}
         undo: Dadwneud
-      title: Blociau parth
       undo: Dadwneud
     email_domain_blocks:
       add_new: Ychwanegu
@@ -277,10 +271,6 @@ cy:
         title: Cofnod newydd yng nghosbrestr e-byst
       title: Cosbrestr e-bost
     instances:
-      account_count: Cyfrifau hysbys
-      domain_name: Parth
-      reset: Ailosod
-      search: Chwilio
       title: Achosion hysbys
     invites:
       deactivate_all: Diffodd pob un
@@ -660,9 +650,6 @@ cy:
     no_account_html: Heb gyfrif? Mae modd i chi <a href='%{sign_up_path}' target='_blank'>gofrestru yma</a>
     proceed: Ymlaen i ddilyn
     prompt: 'Yr ydych am ddilyn:'
-  remote_interaction:
-    proceed: Ymlaen i ryngweithio
-    prompt: 'Rydych eisiau rhyngweithio a''r tŵt hwn:'
   remote_unfollow:
     error: Gwall
     title: Teitl
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 074a774f0..ca4ff32da 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -69,6 +69,8 @@ da:
       moderator: Moderator
     unfollow: Følg ikke længere
   admin:
+    account_actions:
+      action: Udfør handling
     account_moderation_notes:
       create: Læg en note
       created_msg: Moderator notat succesfuldt oprettet!
@@ -257,11 +259,6 @@ da:
       reject_media: Afvis medie filer
       reject_media_hint: Fjerner lokalt lagrede multimedie filer og nægter at hente nogen i fremtiden. Irrelevant for udelukkelser
       reject_reports: Afvis anmeldelser
-      severities:
-        noop: Ingen
-        silence: Dæmp
-        suspend: Udeluk
-      severity: Alvorlighed
       show:
         affected_accounts:
           one: En konto i databasen påvirket
@@ -271,7 +268,6 @@ da:
           suspend: Fjern udelukkelsen af alle eksisterende konti fra dette domæne
         title: Annuller domæne blokeringen for domænet %{domain}
         undo: Fortryd
-      title: Domæne blokeringer
       undo: Fortryd
     email_domain_blocks:
       add_new: Tilføj ny
@@ -283,11 +279,9 @@ da:
         create: Tilføj domæne
         title: Ny email blokade opslag
       title: Email sortliste
+    followers:
+      back_to_account: Tilbage til konto
     instances:
-      account_count: Kendte konti
-      domain_name: Domæne
-      reset: Nulstil
-      search: Søg
       title: Kendte instanser
     invites:
       deactivate_all: Deaktiver alle
@@ -426,6 +420,9 @@ da:
       last_delivery: Sidste levering
       title: Websub
       topic: Emne
+    tags:
+      accounts: Kontoer
+      hidden: Skjult
     title: Administration
   admin_mailer:
     new_report:
@@ -675,9 +672,6 @@ da:
     no_account_html: Har du ikke en konto? Du kan <a href='%{sign_up_path}' target='_blank'>oprette dig her</a>
     proceed: Fortsæt for at følge
     prompt: 'Du er ved at følge:'
-  remote_interaction:
-    proceed: Fortsæt for at interagere
-    prompt: 'Du ønsker at interagere med dette trut:'
   remote_unfollow:
     error: Fejl
     title: Titel
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 18d157e4f..c90101805 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -70,6 +70,9 @@ de:
       moderator: Moderator
     unfollow: Entfolgen
   admin:
+    account_actions:
+      action: Aktion ausführen
+      title: Moderationsaktion auf %{acct} ausführen
     account_moderation_notes:
       create: Notiz erstellen
       created_msg: Moderationsnotiz erfolgreich erstellt!
@@ -102,6 +105,7 @@ de:
       enabled: Freigegeben
       feed_url: Feed-URL
       followers: Folger
+      followers_local: "(%{local} lokal)"
       followers_url: URL des Folgenden
       follows: Folgt
       header: Header
@@ -172,6 +176,7 @@ de:
         assigned_to_self_report: "%{name} hat sich die Meldung %{target} selbst zugewiesen"
         change_email_user: "%{name} hat die E-Mail-Adresse des Nutzers %{target} geändert"
         confirm_user: "%{name} hat die E-Mail-Adresse von %{target} bestätigt"
+        create_account_warning: "%{name} hat eine Warnung an %{target} gesendet"
         create_custom_emoji: "%{name} hat neues Emoji %{target} hochgeladen"
         create_domain_block: "%{name} hat die Domain %{target} blockiert"
         create_email_domain_block: "%{name} hat die E-Mail-Domain %{target} geblacklistet"
@@ -265,11 +270,6 @@ de:
       reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant
       reject_reports: Meldungen ablehnen
       reject_reports_hint: Ignoriere alle Meldungen von dieser Domain. Irrelevant für Sperrungen
-      severities:
-        noop: Kein
-        silence: Stummschaltung
-        suspend: Sperren
-      severity: Schweregrad
       show:
         affected_accounts:
           one: Ein Konto in der Datenbank betroffen
@@ -279,7 +279,6 @@ de:
           suspend: Alle existierenden Konten dieser Domain entsperren
         title: Domain-Blockade für %{domain} zurücknehmen
         undo: Zurücknehmen
-      title: Domain-Blockaden
       undo: Zurücknehmen
     email_domain_blocks:
       add_new: Neue hinzufügen
@@ -291,11 +290,10 @@ de:
         create: Blockade erstellen
         title: Neue E-Mail-Domain-Blockade
       title: E-Mail-Domain-Blockade
+    followers:
+      back_to_account: Zurück zum Account
+      title: "%{acct}'s Follower"
     instances:
-      account_count: Bekannte Konten
-      domain_name: Domain
-      reset: Zurücksetzen
-      search: Suchen
       title: Bekannte Instanzen
     invites:
       deactivate_all: Alle deaktivieren
@@ -449,6 +447,12 @@ de:
       unhide: Zeige in Verzeichnis
       visible: Sichtbar
     title: Administration
+    warning_presets:
+      add_new: Neu hinzufügen
+      delete: Löschen
+      edit: Bearbeiten
+      edit_preset: Warnungsvorlage bearbeiten
+      title: Warnungsvorlagen verwalten
   admin_mailer:
     new_report:
       body: "%{reporter} hat %{target} gemeldet"
@@ -704,9 +708,6 @@ de:
     no_account_html: Noch keinen Account? Du kannst dich <a href='%{sign_up_path}' target='_blank'>hier anmelden</a>
     proceed: Weiter
     prompt: 'Du wirst dieser Person folgen:'
-  remote_interaction:
-    proceed: Fortfahren zum Interagieren
-    prompt: 'Du wirst mit diesem Beitrag interagieren:'
   remote_unfollow:
     error: Fehler
     title: Titel
@@ -916,6 +917,22 @@ de:
       explanation: Du hast ein vollständiges Backup von deinem Mastodon-Account angefragt. Es kann jetzt heruntergeladen werden!
       subject: Dein Archiv ist bereit zum Download
       title: Archiv-Download
+    warning:
+      explanation:
+        disable: Solange dein Account eingefroren ist sind deine Benutzerdaten intakt, aber du kannst nichts tun bis dein Account entsperrt wurde.
+        silence: Solange dein Account limitiert ist können nur Leute, die dir bereits folgen deine Beiträge auf dem Server sehen und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen.
+        suspend: Dein Account wurde gesperrt und alle deine Beiträge und hochgeladenen Medien wurden unwiderruflich vom Server und anderen Servern wo du Follower hattest gelöscht.
+      review_server_policies: Serverrichtlinien ansehen
+      subject:
+        disable: Dein Account %{acct} wurde eingefroren
+        none: Warnung für %{acct}
+        silence: Dein Account %{acct} wurde limitiert
+        suspend: Dein Account %{acct} wurde gesperrt
+      title:
+        disable: Account eingefroren
+        none: Warnung
+        silence: Account limitiert
+        suspend: Account gesperrt
     welcome:
       edit_profile_action: Profil einstellen
       edit_profile_step: Du kannst dein Profil anpassen, indem du einen Avatar oder ein Titelbild hochlädst oder deinen Anzeigenamen änderst und mehr. Wenn du deine Follower vorher überprüfen möchtest, bevor sie dir folgen können, dann kannst du dein Profil sperren.
diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml
index e004bc963..927eeee5a 100644
--- a/config/locales/devise.ar.yml
+++ b/config/locales/devise.ar.yml
@@ -18,6 +18,7 @@ ar:
     mailer:
       confirmation_instructions:
         action: للتحقق من عنوان البريد الإلكتروني
+        action_with_app: تأكيد ثم العودة إلى %{app}
         explanation: لقد قمت بإنشاء حساب على %{host} بواسطة عنوان البريد الإلكتروني الحالي. إنك على بعد خطوات قليلة من تفعليه. إن لم تكن من طلب ذلك، يرجى ألّا تولي إهتماما بهذه الرسالة.
         extra_html: ندعوك إلى الإطلاع على <a href="%{terms_path}">القواعد الخاصة بمثيل الخادوم هذا</a> and <a href="%{policy_path}">و شروط الخدمة الخاصة بنا</a>.
         subject: 'ماستدون : تعليمات التأكيد لمثيل الخادوم  %{instance}'
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index 4c17f3378..c41a218e1 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -18,6 +18,7 @@ ca:
     mailer:
       confirmation_instructions:
         action: Verifica l'adreça de correu
+        action_with_app: Confirma i torna a %{app}
         explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic.
         extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles de la instància</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>.
         subject: 'Mastodon: Instruccions de confirmació %{instance}'
diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml
index 2471f857b..108a4ef11 100644
--- a/config/locales/devise.co.yml
+++ b/config/locales/devise.co.yml
@@ -18,6 +18,7 @@ co:
     mailer:
       confirmation_instructions:
         action: Verificà l’indirizzu email
+        action_with_app: Cunfirmà è rivene à %{app}
         explanation: Avete creatu un contu nant’à %{host} cù st’indirizzu email. Pudete attivallu cù un clic, o ignurà quessu missaghji s’ellu un era micca voi.
         extra_html: Pensate à leghje <a href="%{terms_path}">e regule di l’istanza</a> è <a href="%{policy_path}">i termini d’usu</a>.
         subject: 'Mastodon: Istruzzione di cunfirmazione per %{instance}'
@@ -55,7 +56,7 @@ co:
       updated: A vostra chjave d’accessu hè stata cambiata, è site cunnettatu·a.
       updated_not_active: A vostra chjave d’accessu hè stata cambiata.
     registrations:
-      destroyed: U vostru contu hè statu sguassatu. Avvedeci!
+      destroyed: Avvedeci! U vostru contu hè statu sguassatu. Speremu di vi rivede da prestu.
       signed_up: Benvinutu! Site cunnettatu·a.
       signed_up_but_inactive: Site arregistratu·a, mà ùn pudete micca cunnettavi perchè u vostru contu deve esse attivatu.
       signed_up_but_locked: Site arregistratu·a, mà ùn pudete micca cunnettavi perchè u vostru contu hè chjosu.
diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml
index f63d4d210..850ff1fe8 100644
--- a/config/locales/devise.cs.yml
+++ b/config/locales/devise.cs.yml
@@ -18,6 +18,7 @@ cs:
     mailer:
       confirmation_instructions:
         action: Potvrdit e-mailovou adresu
+        action_with_app: Potvrdit a navrátit se do %{app}
         explanation: S touto e-mailovou adresou jste si vytvořil/a účet na %{host}. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyl/a vy, ignorujte této e-mail.
         extra_html: Prosím podívejte se také na <a href="%{terms_path}">pravidla této instance</a> a <a href="%{policy_path}">naše podmínky používání</a>.
         subject: 'Mastodon: Potvrzovací instrukce pro %{instance}'
diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml
index b201b7ca8..56ae5183b 100644
--- a/config/locales/devise.da.yml
+++ b/config/locales/devise.da.yml
@@ -18,6 +18,7 @@ da:
     mailer:
       confirmation_instructions:
         action: Bekræft email adresse
+        action_with_app: Bekræft og vend tilbage til %{app}
         explanation: Du har oprettet en konto på %{host} med denne email adresse. Du er et klik fra at aktivere din konto. Hvis du ikke har oprettet dig, ignorer venligst denne email.
         extra_html: Tjek også <a href="%{terms_path}">reglerne for instansen</a> og <a href="%{policy_path}">vores betingelser</a>.
         subject: 'Mastodon: Bekræftelses instrukser for %{instance}'
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index 0d33af6f1..fc41c9db5 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -18,6 +18,7 @@ de:
     mailer:
       confirmation_instructions:
         action: E-Mail-Adresse verifizieren
+        action_with_app: Bestätigen und zu %{app} zurückkehren
         explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nun einen Klick entfernt vor der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren.
         extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln dieser Instanz</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>.
         subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}'
diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml
index 523d1fb88..e9725d96b 100644
--- a/config/locales/devise.el.yml
+++ b/config/locales/devise.el.yml
@@ -18,6 +18,7 @@ el:
     mailer:
       confirmation_instructions:
         action: Επιβεβαίωσε διεύθυνση email
+        action_with_app: Επιβεβαίωση και επιστροφή στο %{app}
         explanation: Δημιούργησες έναν λογαριασμό στο %{host} με αυτή τη διεύθυνση email. Με ένα κλικ θα τον ενεργοποιήσεις. Αν δεν το έκανες εσύ, παρακαλούμε αγνόησε αυτό το email.
         extra_html: Παρακαλούμε να διαβάσεις <a href="%{terms_path}">του κανόνες αυτού του κόμβου</a> και <a href="%{policy_path}">τους όρους χρήσης της υπηρεσίας μας</a>.
         subject: 'Mastodon: Οδηγίες επιβεβαίωσης για %{instance}'
diff --git a/config/locales/devise.eu.yml b/config/locales/devise.eu.yml
index 8905822a7..9893f5ba3 100644
--- a/config/locales/devise.eu.yml
+++ b/config/locales/devise.eu.yml
@@ -18,6 +18,7 @@ eu:
     mailer:
       confirmation_instructions:
         action: Baieztatu e-mail helbidea
+        action_with_app: Berretsi eta itzuli %{app} aplikaziora
         explanation: Kontu bat sortu duzu %{host} ostalarian e-mail helbide honekin. Aktibatzeko klik bat falta zaizu. Ez baduzu zuk sortu, ez egin ezer e-mail honekin.
         extra_html: Egiaztatu <a href="%{terms_path}">instantziaren arauak</a> eta <a href="%{policy_path}">zerbitzuaren erabilera baldintzak</a>.
         subject: 'Mastodon: %{instance} instantziaren argibideak baieztapenerako'
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index 5098de2d9..718b4056e 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -18,6 +18,7 @@ fr:
     mailer:
       confirmation_instructions:
         action: Vérifier l’adresse courriel
+        action_with_app: Confirmer et retourner à %{app}
         explanation: Vous avez créé un compte sur %{host} avec cette adresse courriel. Vous êtes à un clic de l’activer. Si ce n’était pas vous, veuillez ignorer ce courriel.
         extra_html: Merci de consultez également <a href="%{terms_path}">les règles de l’instance</a> et <a href="%{policy_path}">nos conditions d’utilisation</a>.
         subject: Merci de confirmer votre inscription sur %{instance}
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index a8fe6a2a5..9f60747a6 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -18,6 +18,7 @@ gl:
     mailer:
       confirmation_instructions:
         action: Validar enderezo de correo-e
+        action_with_app: Confirmar e voltar a %{app}
         explanation: Creou unha conta en %{host} con este enderezo de correo. Está a punto de activalo, si non foi vostede quen fixo a petición, por favor ignore este correo.
         extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas da instancia</a> e <a href="%{policy_path}">os termos do servizo</a>.
         subject: 'Mastodon: Instruccións de confirmación para %{instance}'
diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml
index 0c5d8963c..30266e46b 100644
--- a/config/locales/devise.it.yml
+++ b/config/locales/devise.it.yml
@@ -18,6 +18,7 @@ it:
     mailer:
       confirmation_instructions:
         action: Verifica indirizzo email
+        action_with_app: Conferma e torna a %{app}
         explanation: Hai creato un account su %{host} con questo indirizzo email. Sei lonatno solo un clic dall'attivarlo. Se non sei stato tu, per favore ignora questa email.
         extra_html: Per favore controlla<a href="%{terms_path}">le regole dell'istanza</a> e <a href="%{policy_path}">i nostri termini di servizio</a>.
         subject: 'Mastodon: Istruzioni di conferma per %{instance}'
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index 9df0c7332..cae76d493 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -18,6 +18,7 @@ ja:
     mailer:
       confirmation_instructions:
         action: メールアドレスの確認
+        action_with_app: 確認し %{app} に戻る
         explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
         extra_html: また <a href="%{terms_path}">インスタンスのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。
         subject: 'Mastodon: メールアドレスの確認 %{instance}'
diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml
index 8400fb2d4..a768d3c1d 100644
--- a/config/locales/devise.nl.yml
+++ b/config/locales/devise.nl.yml
@@ -19,6 +19,7 @@ nl:
     mailer:
       confirmation_instructions:
         action: E-mailadres verifiëren
+        action_with_app: Bevestigen en naar %{app} teruggaan
         explanation: Je hebt een account op %{host} aangemaakt en met één klik kun je deze activeren. Wanneer jij dit account niet hebt aangemaakt, mag je deze e-mail negeren.
         extra_html: Bekijk ook de <a href="%{terms_path}">regels van de Mastodonserver</a> en <a href="%{policy_path}">onze gebruiksvoorwaarden</a>.
         subject: 'Mastodon: E-mail bevestigen voor %{instance}'
diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml
index 20a373462..99809b858 100644
--- a/config/locales/devise.oc.yml
+++ b/config/locales/devise.oc.yml
@@ -18,6 +18,7 @@ oc:
     mailer:
       confirmation_instructions:
         action: Verificar l’adreça de corrièl
+        action_with_app: Confirmar e tornar a %{app}
         explanation: Venètz de crear un compte sus %{host} amb aquesta adreça de corrièl. Vos manca pas qu’un clic per l’activar. S’èra pas vosautre mercés de far pas cas a aqueste messatge.
         extra_html: Pensatz tanben de gaitar <a href="%{terms_path}">las règlas de l’instància</a> e <a href="%{policy_path}">nòstres tèrmes e condicions d’utilizacion</a>.
         subject: 'Mastodon : consignas de confirmacion per %{instance}'
diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml
index 54bae2925..7902274a3 100644
--- a/config/locales/devise.pl.yml
+++ b/config/locales/devise.pl.yml
@@ -18,6 +18,7 @@ pl:
     mailer:
       confirmation_instructions:
         action: Zweryfikuj adres e-mail
+        action_with_app: Potwierdź i wróć do %{app}
         explanation: Utworzyłeś(-aś) konto na %{host} podając ten adres e-mail. Jedno kliknięcie dzieli Cię od aktywacji tego konta. Jeżeli to nie Ty, zignoruj ten e-mail.
         extra_html: Przeczytaj też <a href="%{terms_path}">regulamin instancji</a> i <a href="%{policy_path}">nasze zasady użytkowania</a>.
         subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail na %{instance}'
diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml
index 051329c20..ede004892 100644
--- a/config/locales/devise.pt-BR.yml
+++ b/config/locales/devise.pt-BR.yml
@@ -18,6 +18,7 @@ pt-BR:
     mailer:
       confirmation_instructions:
         action: Verificar endereço de e-mail
+        action_with_app: Confirmar e voltar para %{app}
         explanation: Você criou uma conta em %{host} com esse endereço de e-mail. Você está a um clique de ativá-la. Se não foi você, por favor ignore esse e-mail.
         extra_html: Por favor confira também <a href="%{terms_path}">as regras da instância</a> e <a href="%{policy_path}">nossos termos de serviço</a>.
         subject: 'Mastodon: Instruções de confirmação para %{instance}'
diff --git a/config/locales/devise.ru.yml b/config/locales/devise.ru.yml
index f80f7ad05..2186066c9 100644
--- a/config/locales/devise.ru.yml
+++ b/config/locales/devise.ru.yml
@@ -24,7 +24,7 @@ ru:
         title: Подтвердите e-mail адрес
       email_changed:
         explanation: 'E-mail адрес Вашей учётной записи будет изменён на:'
-        extra: Если Вы не меняли адрес e-mail, возможно кто-то получил доступ к Вашей учётной записи. Пожалуйста, срочно смените пароль или свяжитесь с администратором узла, если у Вас нет доступа к учётной записи
+        extra: Если Вы не меняли адрес e-mail, возможно кто-то получил доступ к Вашей учётной записи. Пожалуйста, срочно смените пароль или свяжитесь с администратором узла, если у Вас нет доступа к учётной записи.
         subject: 'Mastodon: Адрес e-mail изменён'
         title: Новый адрес e-mail
       password_change:
diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml
index a32fbe03b..73deb35b4 100644
--- a/config/locales/devise.sk.yml
+++ b/config/locales/devise.sk.yml
@@ -18,6 +18,7 @@ sk:
     mailer:
       confirmation_instructions:
         action: Potvŕď emailovú adresu
+        action_with_app: Potvrď a vráť sa na %{app}
         explanation: S touto emailovou adresou si si vytvoril/a účet na %{host}. Si iba jeden klik od jeho aktivácie. Pokiaľ si to ale nebol/a ty, prosím ignoruj tento email.
         extra_html: Prosím pozri sa aj na <a href="%{terms_path}"> pravidlá tohto servera,</a> a <a href="%{policy_path}"> naše užívaťeľské podiemky</a>.
         subject: 'Mastodon: Potvrdzovacie inštrukcie pre %{instance}'
@@ -29,7 +30,7 @@ sk:
         title: Nová emailová adresa
       password_change:
         explanation: Heslo k tvojmu účtu bolo zmenené.
-        extra: Pokiaľ si nezmenil/a svoje heslo, je pravdepodobné že niekto iný získal prístup k tvojmu účtu. Naliehavo preto prosím zmeň svoje heslo, alebo kontaktuj administrátora tohto serveru pokiaľ si vymknutý/á zo svojho účtu.
+        extra: Ak si heslo nezmenil/a, je pravdepodobné že niekto iný získal prístup k tvojmu účtu. Naliehavo preto prosím zmeň svoje heslo, alebo kontaktuj administrátora tohto serveru pokiaľ si vymknutý/á zo svojho účtu.
         subject: 'Mastodon: Heslo bolo zmenené'
         title: Heslo bolo zmenené
       reconfirmation_instructions:
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index b9e9bc034..352b31895 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -72,7 +72,7 @@ cs:
       index:
         application: Aplikace
         created_at: Autorizováno
-        date_format: "%d. %m. %Y %H:%M:%S"
+        date_format: "%d.%m.%Y %H:%M:%S"
         scopes: Rozsahy
         title: Vaše autorizované aplikace
     errors:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 9f2da4c73..71acb47ea 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -70,6 +70,9 @@ el:
       moderator: Μεσολαβητής
     unfollow: Διακοπή παρακολούθησης
   admin:
+    account_actions:
+      action: Εκτέλεση ενέργειας
+      title: Εκτέλεση ενέργειας διαχείρισης στο %{acct}
     account_moderation_notes:
       create: Άφησε σημείωση
       created_msg: Επιτυχής δημιουργία σημειώματος μεσολάβησης!
@@ -102,6 +105,7 @@ el:
       enabled: Ενεργοποιημένο
       feed_url: URL ροής
       followers: Ακόλουθοι
+      followers_local: "(%{local} τοπικοί)"
       followers_url: URL ακολούθων
       follows: Ακολουθεί
       header: Επικεφαλίδα
@@ -172,6 +176,7 @@ el:
         assigned_to_self_report: Ο/Η %{name} ανάθεσε την καταγγελία %{target} στον εαυτό του/της
         change_email_user: Ο/Η %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
         confirm_user: Ο/Η %{name} επιβεβαίωσε τη διεύθυνση email του χρήστη %{target}
+        create_account_warning: Ο/Η %{name} έστειλε προειδοποίηση προς %{target}
         create_custom_emoji: Ο/Η %{name} ανέβασε νέο emoji %{target}
         create_domain_block: Ο/Η %{name} μπλόκαρε τον τομέα %{target}
         create_email_domain_block: Ο/Η %{name} έβαλε τον τομέα email %{target} σε μαύρη λίστα
@@ -265,11 +270,6 @@ el:
       reject_media_hint: Αφαιρεί τα τοπικά αποθηκευμένα αρχεία πολυμέσων και αποτρέπει τη λήψη άλλων στο μέλλον. Δεν έχει σημασία για τις αναστολές
       reject_reports: Απόρριψη καταγγελιών
       reject_reports_hint: Αγνόηση όσων καταγγελιών προέρχονται από αυτό τον τομέα. Δεν σχετίζεται με τις παύσεις
-      severities:
-        noop: Κανένα
-        silence: Αποσιώπηση
-        suspend: Αναστολή
-      severity: Βαρύτητα
       show:
         affected_accounts:
           one: Επηρεάζεται ένας λογαριασμός στη βάση δεδομένων
@@ -279,7 +279,6 @@ el:
           suspend: Αναίρεση αναστολής όλων των λογαριασμών του τομέα
         title: Αναίρεση αποκλεισμού για τον τομέα %{domain}
         undo: Αναίρεση
-      title: Αποκλεισμένοι τομείς
       undo: Αναίρεση
     email_domain_blocks:
       add_new: Πρόσθεση νέου
@@ -291,11 +290,10 @@ el:
         create: Πρόσθεση τομέα
         title: Νέα εγγραφή email στη μαύρη λίστα
       title: Μαύρη λίστα email
+    followers:
+      back_to_account: Επιστροφή στον λογαριασμό
+      title: Ακόλουθοι του/της %{acct}
     instances:
-      account_count: Γνωστοί λογαριασμοί
-      domain_name: Τομέας
-      reset: Επαναφορά
-      search: Αναζήτηση
       title: Γνωστοί κόμβοι
     invites:
       deactivate_all: Απενεργοποίηση όλων
@@ -449,6 +447,12 @@ el:
       unhide: Εμφάνιση σε κατάλογο
       visible: Εμφανείς
     title: Διαχείριση
+    warning_presets:
+      add_new: Πρόσθεση νέου
+      delete: Διαγραφή
+      edit: Ενημέρωση
+      edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης
+      title: Διαχείριση προκαθορισμένων προειδοποιήσεων
   admin_mailer:
     new_report:
       body: Ο/Η %{reporter} κατήγγειλε τον/την %{target}
@@ -703,9 +707,6 @@ el:
     no_account_html: Δεν έχεις λογαριασμό; Μπορείς <a href='%{sign_up_path}' target='_blank'>να γραφτείς εδώ</a>
     proceed: Συνέχισε για να ακολουθήσεις
     prompt: 'Θα ακολουθήσεις:'
-  remote_interaction:
-    proceed: Συνέχισε για να αλληλεπιδράσεις
-    prompt: 'Θέλεις να αλληλεπιδράσεις με αυτό το τουτ:'
   remote_unfollow:
     error: Σφάλμα
     title: Τίτλος
@@ -914,6 +915,22 @@ el:
       explanation: Ζήτησες ένα εφεδρικό αντίγραφο του λογαριασμού σου στο Mastodon. Είναι έτοιμο για κατέβασμα!
       subject: Το εφεδρικό αντίγραφό σου είναι έτοιμο για κατέβασμα
       title: Λήψη εφεδρικού αρχείου
+    warning:
+      explanation:
+        disable: Όσο ο λογαριασμός σου είναι παγωμένος, τα στοιχεία του παραμένουν άθικτα αλλά δεν μπορείς να κανείς καμία ενέργεια μέχρι να ξεκλειδωθείς.
+        silence: Όσο ο λογαριασμός σου είναι περιορισμένος, μόνο όσοι σε ακολουθούν ήδη θα βλέπουν τα τουτ σου σε αυτό τον κόμβο ενώ μπορεί να εξαιρεθείς από διάφορες δημόσιες απαριθμήσεις. Πάντως, θα μπορούν να σε ακολουθήσουν χειροκίνητα.
+        suspend: Ο λογαριασμός σου αναστάλθηκε μόνιμα, όλα τα τουτ και τα ανεβασμένα πολυμέσα σου διαγράφηκαν αμετάκλητα από αυτόν τον κόμβο και σε όσους άλλους είχες ακόλουθους.
+      review_server_policies: Αναθεώρηση πολιτικής του κόμβου
+      subject:
+        disable: Ο λογαριασμός σου %{acct} έχει παγώσει
+        none: Προειδοποίηση προς %{acct}
+        silence: Ο λογαριασμός σου %{acct} έχει περιοριστεί
+        suspend: Ο λογαριασμός σου %{acct} έχει ανασταλεί
+      title:
+        disable: Παγωμένος λογαριασμός
+        none: Προειδοποίηση
+        silence: Περιορισμένος λογαριασμός
+        suspend: Ανασταλμένος λογαριασμός
     welcome:
       edit_profile_action: Στήσιμο προφίλ
       edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα εμφάνισης & επικεφαλίδας, αλλάζοντας το εμφανιζόμενο όνομά σου και άλλα. Αν θες να ελέγχεις τους νέου σου ακόλουθους πριν αυτοί σε ακολουθήσουν, μπορείς να κλειδώσεις το λογαριασμό σου.
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 8395c59fe..006937a5c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -256,7 +256,7 @@ en:
       week_users_active: active this week
       week_users_new: users this week
     domain_blocks:
-      add_new: Add new
+      add_new: Add new domain block
       created_msg: Domain block is now being processed
       destroyed_msg: Domain block has been undone
       domain: Domain
@@ -273,11 +273,11 @@ en:
       reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions
       reject_reports: Reject reports
       reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions
-      severities:
-        noop: None
-        silence: Silence
-        suspend: Suspend
-      severity: Severity
+      rejecting_media: rejecting media files
+      rejecting_reports: rejecting reports
+      severity:
+        silence: silenced
+        suspend: suspended
       show:
         affected_accounts:
           one: One account in the database affected
@@ -287,8 +287,7 @@ en:
           suspend: Unsuspend all existing accounts from this domain
         title: Undo domain block for %{domain}
         undo: Undo
-      title: Domain blocks
-      undo: Undo
+      undo: Undo domain block
     email_domain_blocks:
       add_new: Add new
       created_msg: Successfully added e-mail domain to blacklist
@@ -303,11 +302,20 @@ en:
       back_to_account: Back To Account
       title: "%{acct}'s Followers"
     instances:
-      account_count: Known accounts
-      domain_name: Domain
-      reset: Reset
-      search: Search
-      title: Known instances
+      delivery_available: Delivery is available
+      known_accounts:
+        one: "%{count} known account"
+        other: "%{count} known accounts"
+      moderation:
+        all: All
+        limited: Limited
+        title: Moderation
+      title: Federation
+      total_blocked_by_us: Blocked by us
+      total_followed_by_them: Followed by them
+      total_followed_by_us: Followed by us
+      total_reported: Reports about them
+      total_storage: Media attachments
     invites:
       deactivate_all: Deactivate all
       filter:
@@ -575,7 +583,9 @@ en:
       size: Size
     blocks: You block
     csv: CSV
+    domain_blocks: Domain blocks
     follows: You follow
+    lists: Lists
     mutes: You mute
     storage: Media storage
   filters:
@@ -725,13 +735,25 @@ en:
     no_account_html: Don't have an account? You can <a href='%{sign_up_path}' target='_blank'>sign up here</a>
     proceed: Proceed to follow
     prompt: 'You are going to follow:'
+    reason_html: "<strong>Why is this step necessary?</strong> <code>%{instance}</code> might not be the server where you are registered, so we need to redirect you to your home server first."
   remote_interaction:
-    proceed: Proceed to interact
-    prompt: 'You want to interact with this toot:'
+    favourite:
+      proceed: Proceed to favourite
+      prompt: 'You want to favourite this toot:'
+    reblog:
+      proceed: Proceed to boost
+      prompt: 'You want to boost this toot:'
+    reply:
+      proceed: Proceed to reply
+      prompt: 'You want to reply to this toot:'
   remote_unfollow:
     error: Error
     title: Title
     unfollowed: Unfollowed
+  scheduled_statuses:
+    over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day
+    over_total_limit: You have exceeded the limit of %{limit} scheduled toots
+    too_soon: The scheduled date must be in the future
   sessions:
     activity: Last activity
     browser: Browser
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 8e30ed679..b7dd7ca8b 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -261,11 +261,6 @@ eo:
         title: Nova domajna blokado
       reject_media: Malakcepti aŭdovidajn dosierojn
       reject_media_hint: Forigas aŭdovidaĵojn loke konservitajn kaj rifuzas alŝuti ajnan estonte. Senzorge pri haltigoj
-      severities:
-        noop: Nenio
-        silence: Kaŝi
-        suspend: Haltigi
-      severity: Severeco
       show:
         affected_accounts:
           one: Unu konto en la datumbazo esta influita
@@ -275,7 +270,6 @@ eo:
           suspend: Malhaltigi ĉiujn kontojn, kiuj ekzistas en ĉi tiu domajno
         title: Malfari domajnan blokadon por %{domain}
         undo: Malfari
-      title: Domajnaj blokadoj
       undo: Malfari
     email_domain_blocks:
       add_new: Aldoni novan
@@ -288,10 +282,6 @@ eo:
         title: Nova blokado de retadresa domajno
       title: Nigra listo de retadresaj domajnoj
     instances:
-      account_count: Konataj kontoj
-      domain_name: Domajno
-      reset: Restarigi
-      search: Serĉi
       title: Konataj nodoj
     invites:
       deactivate_all: Malaktivigi ĉion
@@ -696,9 +686,6 @@ eo:
     no_account_html: Ĉu vi ne havas konton? Vi povas <a href='%{sign_up_path}' target='_blank'>registriĝi tie</a>
     proceed: Daŭrigi por eksekvi
     prompt: 'Vi eksekvos:'
-  remote_interaction:
-    proceed: Efektivigi la interagon
-    prompt: 'Vi volas interagi kun ĉi tiu mesaĝo:'
   remote_unfollow:
     error: Eraro
     title: Titolo
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 404dfbb7c..6ebf1a78f 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -260,11 +260,6 @@ es:
       reject_media_hint: Remueve localmente archivos multimedia almacenados para descargar cualquiera en el futuro. Irrelevante para suspensiones
       reject_reports: Rechazar informes
       reject_reports_hint: Ignore todos los reportes de este dominio. Irrelevante para suspensiones
-      severities:
-        noop: Ninguno
-        silence: Silenciar
-        suspend: Suspender
-      severity: Severidad
       show:
         affected_accounts:
           one: Una cuenta en la base de datos afectada
@@ -274,7 +269,6 @@ es:
           suspend: Des-suspender todas las cuentas existentes de este dominio
         title: Deshacer bloque de dominio para %{domain}
         undo: Deshacer
-      title: Bloques de Dominio
       undo: Deshacer
     email_domain_blocks:
       add_new: Añadir nuevo
@@ -287,10 +281,6 @@ es:
         title: Nueva entrada en la lista negra de correo
       title: Lista negra de correo
     instances:
-      account_count: Cuentas conocidas
-      domain_name: Dominio
-      reset: Reiniciar
-      search: Buscar
       title: Instancias conocidas
     invites:
       deactivate_all: Desactivar todos
@@ -681,9 +671,6 @@ es:
     no_account_html: "¿No tienes una cuenta? Puedes <a href='%{sign_up_path}' target='_blank'>registrarte aqui</a>"
     proceed: Proceder a seguir
     prompt: 'Vas a seguir a:'
-  remote_interaction:
-    proceed: Proceder para interactuar
-    prompt: 'Quieres interactuar con este toot:'
   remote_unfollow:
     error: Error
     title: Título
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 819e22b26..73a60e771 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -70,6 +70,9 @@ eu:
       moderator: Moderatzailea
     unfollow: Utzi jarraitzeari
   admin:
+    account_actions:
+      action: Burutu ekintza
+      title: Burutu moderazio ekintza %{acct} kontuan
     account_moderation_notes:
       create: Sortu oharra
       created_msg: Moderazio oharra ongi sortu da!
@@ -102,8 +105,10 @@ eu:
       enabled: Gaituta
       feed_url: Jarioaren URL-a
       followers: Jarraitzaileak
+      followers_local: "(%{local} lokala)"
       followers_url: Jarraitzaileen URL-a
       follows: Jarraitzen du
+      header: Goiburua
       inbox_url: Sarrera ontziaren URL-a
       ip: IP
       location:
@@ -134,6 +139,7 @@ eu:
       push_subscription_expires: Push harpidetzaren iraugitzea
       redownload: Freskatu abatarra
       remove_avatar: Kendu abatarra
+      remove_header: Kendu goiburua
       resend_confirmation:
         already_confirmed: Erabiltzaile hau berretsita dago
         send: Birbidali baieztapen e-maila
@@ -170,6 +176,7 @@ eu:
         assigned_to_self_report: "%{name}(e)k %{target} salaketa bere buruari esleitu dio"
         change_email_user: "%{name}(e)k %{target}(r)en e-mail helbidea aldatu du"
         confirm_user: "%{name}(e)k %{target}(r)en e-mail helbidea berretsi du"
+        create_account_warning: "%{name}-k abisua bidali dio %{target}-ri"
         create_custom_emoji: "%{name}(e)k emoji berria kargatu du %{target}"
         create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du"
         create_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda beltzean sartu du"
@@ -228,6 +235,7 @@ eu:
       config: Konfigurazioa
       feature_deletions: Kontu ezabaketak
       feature_invites: Gonbidapen estekak
+      feature_profile_directory: Profil-direktorioa
       feature_registrations: Izen emateak
       feature_relay: Federazio haria
       features: Ezaugarriak
@@ -262,11 +270,6 @@ eu:
       reject_media_hint: Lokalki gordetako multimedia fitxategiak ezabatzen ditu eta etorkizunean fitxategi berriak deskargatzeari uko egingo dio. Ez du garrantzirik kanporaketetan
       reject_reports: Errefusatu salaketak
       reject_reports_hint: Ezikusi domeinu honetatik jasotako salaketak. Kanporatzeentzako garrantzirik gabekoa
-      severities:
-        noop: Bat ere ez
-        silence: Isilarazi
-        suspend: Kanporatu
-      severity: Larritasuna
       show:
         affected_accounts:
           one: Datu-baseko kontu bati eragiten dio
@@ -276,7 +279,6 @@ eu:
           suspend: Kendu kanporatzeko agindua domeinu honetako kontu guztiei
         title: Desegin %{domain} domeinuko blokeoa
         undo: Desegin
-      title: Domeinuen blokeoak
       undo: Desegin
     email_domain_blocks:
       add_new: Gehitu berria
@@ -288,11 +290,10 @@ eu:
         create: Gehitu domeinua
         title: Sarrera berria e-mail zerrenda beltzean
       title: E-mail zerrenda beltza
+    followers:
+      back_to_account: Itzuli kontura
+      title: "%{acct} kontuaren jarraitzaileak"
     instances:
-      account_count: Kontu ezagunak
-      domain_name: Domeinua
-      reset: Berrezarri
-      search: Bilatu
       title: Instantzia ezagunak
     invites:
       deactivate_all: Desgaitu guztiak
@@ -375,6 +376,9 @@ eu:
       preview_sensitive_media:
         desc_html: Beste webguneetako esteken aurrebistak iruditxoa izango du multimedia hunkigarri gisa markatzen bada ere
         title: Erakutsi multimedia hunkigarria OpenGraph aurrebistetan
+      profile_directory:
+        desc_html: Baimendu erabiltzaileak aurkigarriak izatea
+        title: Gaitu profil-direktorioa
       registrations:
         closed_message:
           desc_html: Azaleko orrian bistaratua izen ematea ixten denean. HTML etiketak erabili ditzakezu
@@ -443,6 +447,12 @@ eu:
       unhide: Erakutsi direktorioan
       visible: Ikusgai
     title: Administrazioa
+    warning_presets:
+      add_new: Gehitu berria
+      delete: Ezabatu
+      edit: Editatu
+      edit_preset: Editatu abisu aurre-ezarpena
+      title: Kudeatu abisu aurre-ezarpenak
   admin_mailer:
     new_report:
       body: "%{reporter}(e)k %{target} salatu du"
@@ -698,9 +708,6 @@ eu:
     no_account_html: Ez duzu konturik? <a href='%{sign_up_path}' target='_blank'>Izena eman</a> dezakezu
     proceed: Ekin jarraitzeari
     prompt: 'Hau jarraituko duzu:'
-  remote_interaction:
-    proceed: Jarraitu interakziora
-    prompt: 'Toot honekin interakzioa nahi duzu:'
   remote_unfollow:
     error: Errorea
     title: Izenburua
@@ -909,6 +916,19 @@ eu:
       explanation: Zure Mastodon kontuaren babes-kopia osoa eskatu duzu. Deskargatzeko prest dago!
       subject: Zure artxiboa deskargatzeko prest dago
       title: Artxiboa jasotzea
+    warning:
+      explanation:
+        disable: Zure kontua izoztuta dagoen bitartean, zure kontua bere horretan dirau, baina ezin duzu ekintzarik burutu desblokeatzen den arte.
+        silence: Zure kontua murriztua dagoen bitartean, jada zu jarraitzen zaituztenak besterik ez dituzte zure Toot-ak ikusiko zerbitzari honetan, eta agian zerrenda publikoetatik kenduko zaizu. Hala ere besteek oraindik zu jarraitu zaitzakete.
+      review_server_policies: Berrikusi zerbitzariko politikak
+      subject:
+        disable: Zure  %{acct} kontua izoztu da
+        none: "%{acct} konturako abisua"
+        silence: Zure  %{acct} kontua murriztu da
+      title:
+        disable: Kontu izoztua
+        none: Abisua
+        silence: Kontu murriztua
     welcome:
       edit_profile_action: Ezarri profila
       edit_profile_step: Pertsonalizatu profila abatar bat igoz, goiburu bat, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik gainbegiratu nahi badituzu, kontua giltzaperatu dezakezu.
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index d8f89a91b..e7dd86025 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -260,11 +260,6 @@ fa:
       reject_media_hint: تصویرهای ذخیره‌شده در این‌جا را پاک می‌کند و جلوی دریافت تصویرها را در آینده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها
       reject_reports: نپذیرفتن گزارش‌ها
       reject_reports_hint: گزارش‌هایی را که از این دامین می‌آید نادیده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها
-      severities:
-        noop: هیچ
-        silence: بی‌صداکردن
-        suspend: معلق‌کردن
-      severity: شدت
       show:
         affected_accounts:
           one: روی یک حساب در پایگاه داده تأثیر گذاشت
@@ -274,7 +269,6 @@ fa:
           suspend: معلق‌شدن همهٔ حساب‌های این دامین را لغو کن
         title: واگردانی مسدودسازی دامنه برای %{domain}
         undo: واگردانی
-      title: دامین‌های مسدودشده
       undo: واگردانی
     email_domain_blocks:
       add_new: افزودن تازه
@@ -287,10 +281,6 @@ fa:
         title: مسدودسازی دامین ایمیل تازه
       title: مسدودسازی دامین‌های ایمیل
     instances:
-      account_count: حساب‌های شناخته‌شده
-      domain_name: دامین
-      reset: بازنشانی
-      search: جستجو
       title: سرورهای شناخته‌شده
     invites:
       deactivate_all: غیرفعال‌کردن همه
@@ -681,9 +671,6 @@ fa:
     no_account_html: هنوز عضو نیستید؟ <a href='%{sign_up_path}' target='_blank'>این‌جا می‌توانید حساب باز کنید</a>
     proceed: درخواست پیگیری
     prompt: 'شما قرار است این حساب را پیگیری کنید:'
-  remote_interaction:
-    proceed: ادامهٔ برهم‌کنش
-    prompt: 'شما می‌خواهید دربارهٔ این بوق کاری کنید:'
   remote_unfollow:
     error: خطا
     title: عنوان
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index b48635e21..e7b8b18ae 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -211,11 +211,6 @@ fi:
         title: Uusi verkkotunnuksen esto
       reject_media: Hylkää mediatiedostot
       reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei merkitystä jäähyn kohdalla
-      severities:
-        noop: Ei mitään
-        silence: Hiljennys
-        suspend: Jäähy
-      severity: Vakavuus
       show:
         affected_accounts:
           one: Vaikuttaa yhteen tiliin tietokannassa
@@ -225,7 +220,6 @@ fi:
           suspend: Peru kaikkien tässä verkkotunnuksessa jo olemassa olevien tilien jäähy
         title: Peru verkkotunnuksen %{domain} esto
         undo: Peru
-      title: Verkkotunnusten estot
       undo: Peru
     email_domain_blocks:
       add_new: Lisää uusi
@@ -238,10 +232,6 @@ fi:
         title: Uusi sähköpostiestolistan merkintä
       title: Sähköpostiestolista
     instances:
-      account_count: Tiedossa olevat tilit
-      domain_name: Verkkotunnus
-      reset: Palauta
-      search: Hae
       title: Tiedossa olevat instanssit
     invites:
       filter:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index b38e9f8e4..d0c7289c8 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -70,6 +70,9 @@ fr:
       moderator: Modérateur·trice
     unfollow: Ne plus suivre
   admin:
+    account_actions:
+      action: Effectuer une action
+      title: Effectuer une action de modération sur %{acct}
     account_moderation_notes:
       create: Laisser un commentaire
       created_msg: Note de modération créée avec succès !
@@ -102,6 +105,7 @@ fr:
       enabled: Activé
       feed_url: URL du flux
       followers: Abonné⋅e⋅s
+      followers_local: "(%{local} local)"
       followers_url: URL des abonné·e·s
       follows: Abonnements
       header: Entête
@@ -172,6 +176,7 @@ fr:
         assigned_to_self_report: "%{name} s’est assigné·e le signalement de %{target}"
         change_email_user: "%{name} a modifié l’adresse de courriel de l’utilisateur·rice %{target}"
         confirm_user: "%{name} adresse courriel confirmée de l’utilisateur·ice %{target}"
+        create_account_warning: "%{name} a envoyé une attention à %{target}"
         create_custom_emoji: "%{name} a importé de nouveaux émojis %{target}"
         create_domain_block: "%{name} a bloqué le domaine %{target}"
         create_email_domain_block: "%{name} a mis le domaine du courriel %{target} sur liste noire"
@@ -265,11 +270,6 @@ fr:
       reject_media_hint: Supprime localement les fichiers média stockés et refuse d’en télécharger ultérieurement. Ne concerne pas les suspensions
       reject_reports: Rapports de rejet
       reject_reports_hint: Ignorez tous les rapports provenant de ce domaine. Sans objet pour les suspensions
-      severities:
-        noop: Aucune
-        silence: Masquer
-        suspend: Suspendre
-      severity: Séverité
       show:
         affected_accounts:
           one: Un compte affecté dans la base de données
@@ -279,7 +279,6 @@ fr:
           suspend: Annuler la suspension sur tous les comptes existants pour ce domaine
         title: Annuler le blocage de domaine pour %{domain}
         undo: Annuler
-      title: Blocage de domaines
       undo: Annuler
     email_domain_blocks:
       add_new: Ajouter
@@ -291,11 +290,10 @@ fr:
         create: Créer le blocage
         title: Nouveau blocage de domaine de courriel
       title: Blocage de domaines de courriel
+    followers:
+      back_to_account: Retour au compte
+      title: Abonné⋅e⋅s de %{acct}
     instances:
-      account_count: Comptes connus
-      domain_name: Domaine
-      reset: Réinitialiser
-      search: Rechercher
       title: Instances connues
     invites:
       deactivate_all: Tout désactiver
@@ -449,6 +447,12 @@ fr:
       unhide: Afficher dans l'annuaire
       visible: Visible
     title: Administration
+    warning_presets:
+      add_new: Ajouter un nouveau
+      delete: Effacer
+      edit: Éditer
+      edit_preset: Éditer la présélection d'attention
+      title: Gérer les présélections d'attention
   admin_mailer:
     new_report:
       body: "%{reporter} a signalé %{target}"
@@ -704,9 +708,6 @@ fr:
     no_account_html: Vous n’avez pas de compte ? Vous pouvez <a href='%{sign_up_path}' target='_blank'>vous inscrire ici</a>
     proceed: Confirmer l’abonnement
     prompt: 'Vous allez suivre :'
-  remote_interaction:
-    proceed: Confirmer l’interaction
-    prompt: 'Vous désirez interagir avec ce pouet :'
   remote_unfollow:
     error: Erreur
     title: Titre
@@ -915,6 +916,22 @@ fr:
       explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. Elle est maintenant prête à être téléchargée !
       subject: Votre archive est prête à être téléchargée
       title: Récupération de l’archive
+    warning:
+      explanation:
+        disable: Lorsque votre compte est gelé, les données de votre compte demeurent intactes, mais vous ne pouvez effectuer aucune action jusqu'à ce qu'il soit débloqué.
+        silence: Lorsque votre compte est limité, seulement les utilisateurs qui vous suivent déjà verront vos pouets sur ce serveur, et vous pourriez être exclu de plusieurs listes publiques. Néanmoins, d'autres utilisateurs peuvent vous suivre manuellement.
+        suspend: Votre compte a été suspendu, et tous vos pouets et vos fichiers multimédia téléversés ont été supprimés irréversiblement de ce serveur, et des serveurs où vous aviez des abonné⋅e⋅s.
+      review_server_policies: Passer en revue les politiques du serveur
+      subject:
+        disable: Votre compte %{acct} a été gelé
+        none: Avertissement pour %{acct}
+        silence: Votre compte %{acct} a été limité
+        suspend: Votre compte %{acct} a été suspendu
+      title:
+        disable: Compte gelé
+        none: Avertissement
+        silence: Compte limité
+        suspend: Compte suspendu
     welcome:
       edit_profile_action: Configuration du profil
       edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant un avatar, une image d’en-tête, en changeant votre pseudo et plus encore. Si vous souhaitez examiner les nouveaux·lles abonné·e·s avant qu’il·elle·s ne soient autorisé·e·s à vous suivre, vous pouvez verrouiller votre compte.
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 30e475f98..91cf01d46 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -70,6 +70,9 @@ gl:
       moderator: Mod
     unfollow: Deixar de seguir
   admin:
+    account_actions:
+      action: Realizar acción
+      title: Realizar acción de moderación sobre %{acct}
     account_moderation_notes:
       create: Deixar nota
       created_msg: Nota a moderación creada con éxito!
@@ -102,6 +105,7 @@ gl:
       enabled: Habilitado
       feed_url: URL fonte
       followers: Seguidoras
+      followers_local: "(local %{local})"
       followers_url: URL das seguidoras
       follows: Segue
       header: Cabeceira
@@ -172,6 +176,7 @@ gl:
         assigned_to_self_report: "%{name} asignou o informe %{target} a ela misma"
         change_email_user: "%{name} cambiou o enderezo de correo-e da usuaria %{target}"
         confirm_user: "%{name} comfirmou o enderezo de correo da usuaria %{target}"
+        create_account_warning: "%{name} enviou un aviso sobre %{target}"
         create_custom_emoji: "%{name} subeu un novo emoji %{target}"
         create_domain_block: "%{name} bloqueou o dominio %{target}"
         create_email_domain_block: "%{name} engadeu a lista negra o dominio de correo %{target}"
@@ -226,7 +231,7 @@ gl:
       updated_msg: Actualizouse correctamente o emoji!
       upload: Subir
     dashboard:
-      backlog: backlogged jobs
+      backlog: traballos respaldados
       config: Axustes
       feature_deletions: Borrado de contas
       feature_invites: Ligazóns de convite
@@ -265,11 +270,6 @@ gl:
       reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións
       reject_reports: Rexeitar informes
       reject_reports_hint: Ignorar todos os informes procedentes de este dominio. Irrelevante para as suspensións
-      severities:
-        noop: Ningún
-        silence: Silenciar
-        suspend: Suspender
-      severity: Severidade
       show:
         affected_accounts:
           one: Afectoulle a unha conta na base de datos
@@ -279,7 +279,6 @@ gl:
           suspend: Non suspender todas as contas existentes de este dominio
         title: Desfacer o bloqueo de dominio para %{domain}
         undo: Desfacer
-      title: Bloqueos de domino
       undo: Desfacer
     email_domain_blocks:
       add_new: Engadir novo
@@ -291,11 +290,10 @@ gl:
         create: Engadir dominio
         title: Nova entrada la lista negra de e-mail
       title: Lista negra de E-mail
+    followers:
+      back_to_account: Voltar a Conta
+      title: Seguidoras de %{acct}
     instances:
-      account_count: Contas coñecidas
-      domain_name: Dominio
-      reset: Restablecer
-      search: Buscar
       title: Instancias coñecidas
     invites:
       deactivate_all: Desactivar todo
@@ -449,6 +447,12 @@ gl:
       unhide: Mostrar en directorio
       visible: Visible
     title: Administración
+    warning_presets:
+      add_new: Engadir novo
+      delete: Eliminar
+      edit: Editar
+      edit_preset: Editar aviso preestablecido
+      title: Xestionar avisos preestablecidos
   admin_mailer:
     new_report:
       body: "%{reporter} informou sobre %{target}"
@@ -704,9 +708,6 @@ gl:
     no_account_html: Non ten unha conta? Pode <a href='%{sign_up_path}' target='_blank'>rexistrarse aquí</a>
     proceed: Proceda para seguir
     prompt: 'Vostede vai seguir:'
-  remote_interaction:
-    proceed: Proceda para interactuar
-    prompt: 'Vostede quere interactuar con este toot:'
   remote_unfollow:
     error: Fallo
     title: Título
@@ -914,6 +915,22 @@ gl:
       explanation: Solicitou un respaldo completo da súa conta de Mastodon. Xa está listo para descargar!
       subject: O seu ficheiro xa está listo para descargar
       title: Leve o ficheiro
+    warning:
+      explanation:
+        disable: Cando a súa conta está conxelada, os datos permanecen intactos, pero non pode levar a fin accións ate que se desbloquea.
+        silence: Mentras a conta está limitada, só a xente que actualmente a segue verá os seus toots en este servidor, e vostede podería estar excluída de varias listas públicas. Porén, outras persoas poderíana seguila de xeito manual.
+        suspend: A súa conta foi suspendida, e todos os seus toots e medios subidos foron eliminados de este servidor de xeito irreversible, e dos servidores onde tivese seguidoras.
+      review_server_policies: Revisar políticas do servidor
+      subject:
+        disable: A súa conta %{acct} foi conxelada
+        none: Aviso para %{acct}
+        silence: A súa conta %{acct} foi limitada
+        suspend: A súa conta %{acct} foi suspendida
+      title:
+        disable: Conta conxelada
+        none: Aviso
+        silence: Conta limitada
+        suspend: Conta suspendida
     welcome:
       edit_profile_action: Configurar perfil
       edit_profile_step: Vostede pode persoalizar o seu perfil subindo un avatar, cabeceira, cambiar o seu nome público e aínda máis. Si restrinxe a súa conta pode revisar a conta das personas que solicitan seguilas antes de permitirlles o acceso aos seus toots.
diff --git a/config/locales/he.yml b/config/locales/he.yml
index f45afe3a1..bc92ed908 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -156,10 +156,6 @@ he:
         title: חסימת שרת חדשה
       reject_media: חסימת קבצי מדיה
       reject_media_hint: מסירה קבצי מדיה השמורים מקומית ומונעת מהורדת קבצים נוספים בעתיד. לא רלוונטי להשעיות
-      severities:
-        silence: השתקה
-        suspend: השעייה
-      severity: חוּמרה
       show:
         affected_accounts:
           one: חשבון אחד במסד הנתונים מושפע
@@ -169,11 +165,8 @@ he:
           suspend: הסרת השעייה מכל החשבונות על שרת זה
         title: ביטול חסימת שרת עבור %{domain}
         undo: ביטול
-      title: חסימת שרתים
       undo: ביטול
     instances:
-      account_count: חשבונות מוכרים
-      domain_name: שם מתחם
       title: שרתים מוכרים
     reports:
       are_you_sure: 100% על בטוח?
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 4fa74228d..79363b9ee 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -195,11 +195,6 @@ hu:
         title: Új domain-tiltás
       reject_media: Médiafájlok elutasítása
       reject_media_hint: Eltávolítja a helyben tárolt médiafájlokat és a továbbiakban letiltja az új médiafájlok letöltését. Felfüggesztett fiókok esetében irreleváns opció
-      severities:
-        noop: Egyik sem
-        silence: Némítás
-        suspend: Felfüggesztés
-      severity: Súlyosság
       show:
         affected_accounts:
           one: Összesen egy fiók érintett az adatbázisban
@@ -209,7 +204,6 @@ hu:
           suspend: Minden felhasználó felfüggesztésének feloldása ezen a domainen
         title: "%{domain} domain tiltásának feloldása"
         undo: Visszavonás
-      title: Tiltott domainek
       undo: Visszavonás
     email_domain_blocks:
       add_new: Új hozzáadása
@@ -222,10 +216,6 @@ hu:
         title: Új e-mail feketelista bejegyzés
       title: E-mail feketelista
     instances:
-      account_count: Nyilvántartott fiókok
-      domain_name: Domain
-      reset: Visszaállítás
-      search: Keresés
       title: Nyilvántartott instanciák
     invites:
       filter:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 5cc928823..ae38b3f7d 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -85,10 +85,6 @@ id:
         title: Pemblokiran domain baru
       reject_media: Tolak berkas media
       reject_media_hint: Hapus file media yang tersimpan dan menolak semua unduhan nantinya. Tidak terpengaruh dengan suspen
-      severities:
-        silence: Diamkan
-        suspend: Suspen
-      severity: Keparahan
       show:
         affected_accounts:
           one: Satu akun di dalam database terpengaruh
@@ -98,10 +94,7 @@ id:
           suspend: Hapus suspen terhadap akun pada domain ini
         title: Hapus pemblokiran domain %{domain}
         undo: Undo
-      title: Pemblokiran Domain
     instances:
-      account_count: Akun yang diketahui
-      domain_name: Domain
       title: Server yang diketahui
     reports:
       comment:
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 358ce4ca9..73c981a98 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -75,10 +75,6 @@ io:
         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:
-        silence: Silence
-        suspend: Suspend
-      severity: Severity
       show:
         affected_accounts:
           one: One account in the database affected
@@ -88,11 +84,8 @@ io:
           suspend: Unsuspend all existing accounts from this domain
         title: Undo domain block for %{domain}
         undo: Undo
-      title: Domain Blocks
       undo: Undo
     instances:
-      account_count: Known accounts
-      domain_name: Domain
       title: Known Instances
     reports:
       comment:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index cc23b8cf7..339dadaf4 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -260,11 +260,6 @@ it:
       reject_media_hint: Rimuovi i file media salvati in locale e blocca i download futuri. Irrilevante per le sospensioni
       reject_reports: Respingi rapporti
       reject_reports_hint: Ignora tutti i rapporti provenienti da questo dominio. Irrilevante per sospensioni
-      severities:
-        noop: Nessuno
-        silence: Silenzia
-        suspend: Sospendi
-      severity: Severità
       show:
         affected_accounts:
           one: Interessato un solo account nel database
@@ -274,7 +269,6 @@ it:
           suspend: Annulla la sospensione di tutti gli account esistenti da questo dominio
         title: Annulla il blocco del dominio per %{domain}
         undo: Annulla
-      title: Blocchi dominio
       undo: Annulla
     email_domain_blocks:
       add_new: Aggiungi nuovo
@@ -287,10 +281,6 @@ it:
         title: Nuova voce della lista nera delle email
       title: Lista nera email
     instances:
-      account_count: Accounts conosciuti
-      domain_name: Dominio
-      reset: Reimposta
-      search: Cerca
       title: Istanze conosciute
     invites:
       deactivate_all: Disattiva tutto
@@ -660,9 +650,6 @@ it:
     no_account_html: Non hai un account? Puoi <a href='%{sign_up_path}' target='_blank'>iscriverti qui</a>
     proceed: Conferma
     prompt: 'Stai per seguire:'
-  remote_interaction:
-    proceed: Continua per interagire
-    prompt: 'Vuoi interagire con questo toot:'
   remote_unfollow:
     error: Errore
     title: Titolo
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index c7096e6f2..1ab2d5445 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -70,6 +70,9 @@ ja:
       moderator: Mod
     unfollow: フォロー解除
   admin:
+    account_actions:
+      action: アクションを実行
+      title: "%{acct}さんに対してアクションを実行"
     account_moderation_notes:
       create: 書き込む
       created_msg: モデレーションメモを書き込みました!
@@ -102,6 +105,7 @@ ja:
       enabled: 有効
       feed_url: フィードURL
       followers: フォロワー数
+      followers_local: "(%{local} ローカル)"
       followers_url: Followers URL
       follows: フォロー数
       header: ヘッダー
@@ -172,6 +176,7 @@ ja:
         assigned_to_self_report: "%{name} さんがレポート %{target} を自身の担当に割り当てました"
         change_email_user: "%{name} さんが %{target} さんのメールアドレスを変更しました"
         confirm_user: "%{name} さんが %{target} さんのメールアドレスを確認済みにしました"
+        create_account_warning: "%{name} さんが %{target} さんに警告メールを送信しました"
         create_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を追加しました"
         create_domain_block: "%{name} さんがドメイン %{target} をブロックしました"
         create_email_domain_block: "%{name} さんがドメイン %{target} をメールアドレス用ブラックリストに追加しました"
@@ -256,7 +261,7 @@ ja:
         create: ブロックを作成
         hint: ドメインブロックはデータベース中のアカウント項目の作成を妨げませんが、遡って自動的に指定されたモデレーションをそれらのアカウントに適用します。
         severity:
-          desc_html: "<strong>サイレンス</strong>はアカウントのトゥートをフォローしていない人から隠します。<strong>停止</strong>はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。メディアファイルの拒否は<strong>なし</strong>を使います。"
+          desc_html: "<strong>サイレンス</strong>はアカウントのトゥートをフォローしていない人から隠します。<strong>停止</strong>はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。メディアファイルを拒否したいだけの場合は<strong>なし</strong>を使います。"
           noop: なし
           silence: サイレンス
           suspend: 停止
@@ -265,11 +270,6 @@ ja:
       reject_media_hint: ローカルに保存されたメディアファイルを削除し、今後のダウンロードを拒否します。停止とは無関係です
       reject_reports: レポートを拒否
       reject_reports_hint: このドメインからのレポートをすべて無視します。停止とは無関係です
-      severities:
-        noop: なし
-        silence: サイレンス
-        suspend: 停止
-      severity: 深刻度
       show:
         affected_accounts:
           one: データベース中の一つのアカウントに影響します
@@ -279,7 +279,6 @@ ja:
           suspend: このドメインからの存在するすべてのアカウントの停止を戻す
         title: "%{domain}のドメインブロックを戻す"
         undo: 元に戻す
-      title: ドメインブロック
       undo: 元に戻す
     email_domain_blocks:
       add_new: 新規追加
@@ -291,11 +290,10 @@ ja:
         create: ドメインを追加
         title: メールアドレス用ブラックリスト新規追加
       title: メールブラックリスト
+    followers:
+      back_to_account: 戻る
+      title: "%{acct}さんのフォロワー"
     instances:
-      account_count: 既知のアカウント数
-      domain_name: ドメイン名
-      reset: リセット
-      search: 検索
       title: 既知のインスタンス
     invites:
       deactivate_all: すべて無効化
@@ -449,6 +447,12 @@ ja:
       unhide: ディレクトリに表示する
       visible: 表示
     title: 管理
+    warning_presets:
+      add_new: 追加
+      delete: 削除
+      edit: 編集
+      edit_preset: プリセット警告文を編集
+      title: プリセット警告文を管理
   admin_mailer:
     new_report:
       body: "%{reporter} が %{target} を通報しました"
@@ -704,9 +708,6 @@ ja:
     no_account_html: アカウントをお持ちではないですか?<a href='%{sign_up_path}' target='_blank'>こちら</a>からサインアップできます
     proceed: フォローする
     prompt: 'フォローしようとしています:'
-  remote_interaction:
-    proceed: 進む
-    prompt: 'このトゥートに返信しようとしています:'
   remote_unfollow:
     error: エラー
     title: タイトル
@@ -915,6 +916,22 @@ ja:
       explanation: Mastodonアカウントのアーカイブを受け付けました。今すぐダウンロードできます!
       subject: アーカイブの準備ができました
       title: アーカイブの取り出し
+    warning:
+      explanation:
+        disable: アカウントが凍結されている間、データはそのまま残りますが、凍結が解除されるまでは何の操作もできません。
+        silence: あなたのアカウントは制限されていますが、あなたをフォローしているユーザーのみ、このサーバー上の投稿を見ることができます。そしてあなたは様々な公開リストから除外されるかもしれません。ただし、他のユーザーは手動であなたをフォローすることができます。
+        suspend: あなたのアカウントは停止されています。あなたの投稿とアップロードされたメディアファイルは、このサーバーとあなたのフォロワーが参加していたサーバーから完全に削除されました。
+      review_server_policies: サーバーのポリシーを確認
+      subject:
+        disable: あなたのアカウント %{acct} は凍結されています
+        none: "%{acct} に対する警告"
+        silence: あなたのアカウント %{acct} はサイレンスにされています
+        suspend: あなたのアカウント %{acct} は停止されています
+      title:
+        disable: アカウントが凍結されました
+        none: 警告
+        silence: アカウントがサイレンスにされました
+        suspend: アカウントが停止されました
     welcome:
       edit_profile_action: プロフィールを設定
       edit_profile_step: アバター画像やヘッダー画像をアップロードしたり、表示名やその他プロフィールを変更しカスタマイズすることができます。新しいフォロワーからのフォローを許可する前に検討したい場合、アカウントを承認制にすることができます。
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 21e01c8c9..056942ecd 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -244,11 +244,6 @@ ka:
         title: ახალი დომენის ბლოკი
       reject_media: მედია ფაილების უარყოფა
       reject_media_hint: შლის ლოკალურად შენახულ მედია ფაილებს და უარყოფს სამომავლო გადმოტვირთებს. შეუსაბამო შეჩერებებისთვის
-      severities:
-        noop: არც ერთი
-        silence: გაჩუმება
-        suspend: შეჩერება
-      severity: სიმძიმე
       show:
         affected_accounts:
           one: გავლენა იქონია მონაცემთა ბაზაში ერთ ანგარიშზე
@@ -258,7 +253,6 @@ ka:
           suspend: ამ დომენში ყველა არსებულ ანგარიშზე შეჩერების მოშორება
         title: უკუაქციეთ დომენის ბლოკი %{domain} დომენზე
         undo: უკუქცევა
-      title: დომენის ბლოკები
       undo: უკუქცევა
     email_domain_blocks:
       add_new: ახლის დამატება
@@ -271,10 +265,6 @@ ka:
         title: ელ-ფოსტის ახალი შენატანი შავ სიაში
       title: ელ-ფოსტის შავი სია
     instances:
-      account_count: ცნობილი ანგარიშები
-      domain_name: დომენი
-      reset: გადატვირთვა
-      search: ძებნა
       title: ცნობილი ინსტანციები
     invites:
       deactivate_all: ყველას დეაქტივაცია
@@ -651,9 +641,6 @@ ka:
     no_account_html: არ გაქვთ ანგარიში? შეგიძლიათ <a href='%{sign_up_path}' target='_blank'>დარეგისტრირდეთ აქ</a>
     proceed: გააგრძელეთ გასაყოლად
     prompt: 'თქვენ გაჰყვებით:'
-  remote_interaction:
-    proceed: გააგრძელეთ ურთიერთქმედება
-    prompt: 'თქვენ გსურთ ურთიერთქმედება ამ ტუტთან:'
   remote_unfollow:
     error: შეცდომა
     title: სათაური
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 9ac1cd6b9..a15066d19 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -70,6 +70,9 @@ ko:
       moderator: 모더레이터
     unfollow: 팔로우 해제
   admin:
+    account_actions:
+      action: 조치 취하기
+      title: "%{acct} 계정에 조정 취하기"
     account_moderation_notes:
       create: 모더레이션 노트 작성하기
       created_msg: 모더레이션 기록이 성공적으로 작성되었습니다!
@@ -102,6 +105,7 @@ ko:
       enabled: 활성화된
       feed_url: 피드 URL
       followers: 팔로워 수
+      followers_local: "(%{local} 로컬)"
       followers_url: 팔로워 URL
       follows: 팔로잉 수
       header: 헤더
@@ -172,6 +176,7 @@ ko:
         assigned_to_self_report: "%{name}이 리포트 %{target}을 자신에게 할당했습니다"
         change_email_user: "%{name}이 %{target}의 이메일 주소를 변경했습니다"
         confirm_user: "%{name}이 %{target}의 이메일 주소를 컨펌했습니다"
+        create_account_warning: "%{name}가 %{target}에게 경고 보냄"
         create_custom_emoji: "%{name}이 새로운 에모지 %{target}를 추가했습니다"
         create_domain_block: "%{name}이 도메인 %{target}를 차단했습니다"
         create_email_domain_block: "%{name}이 이메일 도메인 %{target}를 차단했습니다"
@@ -267,11 +272,6 @@ ko:
       reject_media_hint: 로컬에 저장된 미디어 파일을 삭제하고, 이후로도 다운로드를 거부합니다. 정지와는 관계 없습니다
       reject_reports: 신고 거부
       reject_reports_hint: 이 도메인으로부터의 모든 신고를 무시합니다. 정지와는 무관합니다
-      severities:
-        noop: 없음
-        silence: 침묵
-        suspend: 정지
-      severity: 심각도
       show:
         affected_accounts:
           one: 데이터베이스 중 1개의 계정에 영향을 끼칩니다
@@ -281,7 +281,6 @@ ko:
           suspend: 이 도메인에 존재하는 모든 계정의 계정 정지를 해제
         title: "%{domain}의 도메인 차단을 해제"
         undo: 실행 취소
-      title: 도메인 차단
       undo: 실행 취소
     email_domain_blocks:
       add_new: 새로 추가
@@ -293,11 +292,10 @@ ko:
         create: 차단 규칙 생성
         title: 새 이메일 도메인 차단
       title: Email 도메인 차단
+    followers:
+      back_to_account: 계정으로 돌아가기
+      title: "%{acct}의 팔로워"
     instances:
-      account_count: 알려진 계정의 수
-      domain_name: 도메인 이름
-      reset: 리셋
-      search: 검색
       title: 알려진 인스턴스들
     invites:
       deactivate_all: 전부 비활성화
@@ -451,6 +449,12 @@ ko:
       unhide: 디렉토리에 표시
       visible: 보여짐
     title: 관리
+    warning_presets:
+      add_new: 새로 추가
+      delete: 삭제
+      edit: 편집
+      edit_preset: 경고 틀 수정
+      title: 경고 틀 관리
   admin_mailer:
     new_report:
       body: "%{reporter} 가 %{target} 를 신고했습니다"
@@ -706,9 +710,6 @@ ko:
     no_account_html: 계정이 없나요? <a href='%{sign_up_path}' target='_blank'>여기에서 가입 할 수 있습니다</a>
     proceed: 팔로우 하기
     prompt: '팔로우 하려 하고 있습니다:'
-  remote_interaction:
-    proceed: 진행
-    prompt: '이 게시물에 상호작용하려 하고 있습니다:'
   remote_unfollow:
     error: 에러
     title: 타이틀
@@ -917,6 +918,22 @@ ko:
       explanation: 당신이 요청한 계정의 풀 백업이 이제 다운로드 가능합니다!
       subject: 당신의 아카이브를 다운로드 가능합니다
       title: 아카이브 테이크 아웃
+    warning:
+      explanation:
+        disable: 당신의 계정이 동결 된 동안 당신의 계정은 유지 됩니다. 하지만 잠금이 풀릴 때까지 당신은 아무 것도 할 수 없습니다.
+        silence: 당신의 계정이 제한 된 동안엔 당신의 팔로워 이외엔 툿을 받아 볼 수 없고 공개 리스팅에서 제외 됩니다. 하지만 다른 사람들은 여전히 당신을 팔로우 가능합니다.
+        suspend: 당신의 계정은 정지 되었으며, 모든 툿과 업로드 한 미디어가 서버에서 삭제 되어 되돌릴 수 없습니다.
+      review_server_policies: 서버 정책 검토하기
+      subject:
+        disable: 당신의 계정 %{acct}가 동결 되었습니다
+        none: "%{acct}에게의 경고"
+        silence: 당신의 계정 %{acct}가 제한 되었습니다
+        suspend: 당신의 계정 %{acct}가 정지 되었습니다
+      title:
+        disable: 계정 동결 됨
+        none: 경고
+        silence: 계정 제한 됨
+        suspend: 계정 정지 됨
     welcome:
       edit_profile_action: 프로필 설정
       edit_profile_step: 아바타, 헤더를 업로드하고, 사람들에게 표시 될 이름을 바꾸는 것으로 당신의 프로필을 커스텀 할 수 있습니다. 사람들이 당신을 팔로우 하기 전에 리뷰를 거치게 하고 싶다면 계정을 잠그면 됩니다.
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/config/locales/lv.yml
@@ -0,0 +1 @@
+{}
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index 7c6148e3b..e3c901eff 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -260,11 +260,6 @@ ms:
       reject_media_hint: Buang fail media yang disimpan di sini dan menolak sebarang muat turun pada masa depan. Tidak berkaitan dengan penggantungan
       reject_reports: Tolak laporan
       reject_reports_hint: Abaikan semua laporan daripada domain ini. Tidak dikira untuk penggantungan
-      severities:
-        noop: Tiada
-        silence: Senyapkan
-        suspend: Gantungkan
-      severity: Tahap teruk
       show:
         affected_accounts:
           one: Satu akaun dalam pangkalan data menerima kesan
@@ -274,7 +269,6 @@ ms:
           suspend: Buang penggantungan semua akaun sedia ada daripada domain ini
         title: Buang sekatan domain %{domain}
         undo: Buang
-      title: Sekatan domain
       undo: Buang
     email_domain_blocks:
       add_new: Tambah
@@ -287,10 +281,6 @@ ms:
         title: Entri senarai hitam emel baru
       title: Senarai hitam emel
     instances:
-      account_count: Akaun diketahui
-      domain_name: Domain
-      reset: Set semula
-      search: Cari
       title: Tika diketahui
     invites:
       deactivate_all: Nyahaktifkan semua
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 84d8099bc..a40467b92 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -70,6 +70,9 @@ nl:
       moderator: Moderator
     unfollow: Ontvolgen
   admin:
+    account_actions:
+      action: Actie uitvoeren
+      title: Moderatieactie op %{acct} uitvoeren
     account_moderation_notes:
       create: Laat een opmerking achter
       created_msg: Aanmaken van opmerking voor moderatoren geslaagd!
@@ -102,6 +105,7 @@ nl:
       enabled: Ingeschakeld
       feed_url: Feed-URL
       followers: Volgers
+      followers_local: "(%{local} lokaal)"
       followers_url: Volgers-URL
       follows: Volgt
       header: Omslagfoto
@@ -172,6 +176,7 @@ nl:
         assigned_to_self_report: "%{name} heeft rapportage %{target} aan zichzelf toegewezen"
         change_email_user: "%{name} veranderde het e-mailadres van gebruiker %{target}"
         confirm_user: E-mailadres van gebruiker %{target} is door %{name} bevestigd
+        create_account_warning: "%{name} verzond een waarschuwing naar %{target}"
         create_custom_emoji: Nieuwe emoji %{target} is door %{name} geüpload
         create_domain_block: Domein %{target} is door %{name} geblokkeerd
         create_email_domain_block: E-maildomein %{target} is door %{name} op de zwarte lijst geplaatst
@@ -265,11 +270,6 @@ nl:
       reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen
       reject_reports: Rapportages weigeren
       reject_reports_hint: Alle rapportages die vanaf dit domein komen negeren. Irrelevant voor opgeschorte domeinen
-      severities:
-        noop: Geen
-        silence: Negeren
-        suspend: Opschorten
-      severity: Zwaarte
       show:
         affected_accounts:
           one: Eén account in de database aangepast
@@ -279,7 +279,6 @@ nl:
           suspend: Alle opgeschorte accounts van dit domein niet langer opschorten
         title: Domeinblokkade voor %{domain} ongedaan maken
         undo: Ongedaan maken
-      title: Domeinblokkades
       undo: Ongedaan maken
     email_domain_blocks:
       add_new: Nieuwe toevoegen
@@ -291,11 +290,10 @@ nl:
         create: Blokkeren
         title: Nieuw e-maildomein blokkeren
       title: E-maildomeinen blokkeren
+    followers:
+      back_to_account: Terug naar account
+      title: Volgers van %{acct}
     instances:
-      account_count: Bekende accounts
-      domain_name: Domein
-      reset: Opnieuw
-      search: Zoeken
       title: Bekende servers
     invites:
       deactivate_all: Alles deactiveren
@@ -449,6 +447,12 @@ nl:
       unhide: In gebruikersgids tonen
       visible: Zichtbaar
     title: Beheer
+    warning_presets:
+      add_new: Nieuwe toevoegen
+      delete: Verwijderen
+      edit: Bewerken
+      edit_preset: Voorinstelling van waarschuwing bewerken
+      title: Voorinstellingen van waarschuwingen beheren
   admin_mailer:
     new_report:
       body: "%{reporter} heeft %{target} gerapporteerd"
@@ -704,9 +708,6 @@ nl:
     no_account_html: Heb je geen account? Je kunt er <a href='%{sign_up_path}' target='_blank'>hier een registreren</a>
     proceed: Ga verder om te volgen
     prompt: 'Jij gaat volgen:'
-  remote_interaction:
-    proceed: Ga de interactie aan
-    prompt: 'Jij wilt de interactie aangaan met deze toot:'
   remote_unfollow:
     error: Fout
     title: Titel
@@ -911,6 +912,18 @@ nl:
       explanation: Je hebt een volledige back-up van jouw Mastodon-account opgevraagd. Het staat nu klaar om te worden gedownload!
       subject: Jouw archief staat klaar om te worden gedownload
       title: Archief ophalen
+    warning:
+      review_server_policies: Serverbeleid bekijken
+      subject:
+        disable: Jouw account %{acct} is bevroren
+        none: Waarschuwing voor %{acct}
+        silence: Jouw account %{acct} is nu beperkt
+        suspend: Jouw account %{acct} is opgeschort
+      title:
+        disable: Account bevroren
+        none: Waarschuwing
+        silence: Account beperkt
+        suspend: Account opgeschort
     welcome:
       edit_profile_action: Profiel instellen
       edit_profile_step: Je kunt jouw profiel aanpassen door een avatar (profielfoto) en omslagfoto te uploaden, jouw weergavenaam in te stellen en iets over jezelf te vertellen. Wanneer je nieuwe volgers eerst wilt goedkeuren, kun je jouw account besloten maken.
diff --git a/config/locales/no.yml b/config/locales/no.yml
index a446fa1f6..cf8f77b4c 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -195,11 +195,6 @@
         title: Ny domeneblokkering
       reject_media: Avvis mediefiler
       reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger
-      severities:
-        noop: Ingen
-        silence: Målbind
-        suspend: Utvis
-      severity: Alvorlighet
       show:
         affected_accounts:
           one: En konto i databasen påvirket
@@ -209,7 +204,6 @@
           suspend: Avutvis alle eksisterende kontoer fra dette domenet
         title: Angre domeneblokkering for %{domain}
         undo: Angre
-      title: Domeneblokkeringer
       undo: Angre
     email_domain_blocks:
       add_new: Lag ny
@@ -222,10 +216,6 @@
         title: Ny blokkeringsoppføring av e-postdomene
       title: Blokkering av e-postdomene
     instances:
-      account_count: Kjente kontoer
-      domain_name: Domene
-      reset: Tilbakestill
-      search: Søk
       title: Kjente instanser
     invites:
       filter:
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 707877542..27eee4f50 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -70,6 +70,9 @@ oc:
       moderator: Moderador
     unfollow: Quitar de sègre
   admin:
+    account_actions:
+      action: Realizar una accion
+      title: Realizar una accion de moderacion sus %{acct}
     account_moderation_notes:
       create: Crear una nòta
       created_msg: Nòta de moderacion ben creada !
@@ -102,6 +105,7 @@ oc:
       enabled: Activat
       feed_url: Flux URL
       followers: Seguidors
+      followers_local: "(%{local} local)"
       followers_url: URL dels seguidors
       follows: Abonaments
       header: Bandièra
@@ -172,6 +176,7 @@ oc:
         assigned_to_self_report: "%{name} s’assignèt lo rapòrt %{target}"
         change_email_user: "%{name} cambièt l’adreça de corrièl de %{target}"
         confirm_user: "%{name} confirmèt l’adreça a %{target}"
+        create_account_warning: "%{name} mandèt un avertiment a %{target}"
         create_custom_emoji: "%{name} mandèt un nòu emoji %{target}"
         create_domain_block: "%{name} bloquèt lo domeni %{target}"
         create_email_domain_block: "%{name} botèt a la lista nègra lo domeni de corrièl %{target}"
@@ -265,11 +270,6 @@ oc:
       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
       reject_reports: Regetar los senhalaments
       reject_reports_hint: Ignorar totes los senhalaments que venon d’aqueste domeni. Pas pertiment per las suspensions
-      severities:
-        noop: Cap
-        silence: Silenci
-        suspend: Suspendre
-      severity: Severitat
       show:
         affected_accounts:
           one: Un compte de la basa de donadas tocat
@@ -279,7 +279,6 @@ oc:
           suspend: Levar la suspension de totes los comptes d’aqueste domeni
         title: Restablir lo blocatge de domeni de %{domain}
         undo: Restablir
-      title: Blòc de domeni
       undo: Restablir
     email_domain_blocks:
       add_new: Ajustar
@@ -291,11 +290,10 @@ oc:
         create: Crear un blocatge
         title: Nòu blocatge de domeni de corrièl
       title: Blocatge de domeni de corrièl
+    followers:
+      back_to_account: Tornar al compte
+      title: Seguidors de %{acct}
     instances:
-      account_count: Comptes coneguts
-      domain_name: Domeni
-      reset: Reïnicializar
-      search: Cercar
       title: Instàncias conegudas
     invites:
       deactivate_all: O desactivar tot
@@ -449,6 +447,12 @@ oc:
       unhide: Aparéisser dins l’annuari
       visible: Visible
     title: Administracion
+    warning_presets:
+      add_new: N’ajustar un nòu
+      delete: Escafar
+      edit: Modificar
+      edit_preset: Modificar lo tèxt predefinit d’avertiment
+      title: Gerir los tèxtes predefinits
   admin_mailer:
     new_report:
       body: "%{reporter} a senhalat %{target}"
@@ -760,9 +764,6 @@ oc:
     no_account_html: Avètz pas cap de compte ? Podètz <a href='%{sign_up_path}' target='_blank'>vos marcar aquí</a>
     proceed: Clicatz per sègre
     prompt: 'Sètz per sègre :'
-  remote_interaction:
-    proceed: Confirmar l’interaccion
-    prompt: 'Volètz interagir amb aqueste tut :'
   remote_unfollow:
     error: Error
     title: Títol
@@ -969,6 +970,22 @@ oc:
       explanation: Avètz demandat una salvagarda complèta de vòstre compte Mastodon. Es prèsta per telecargament !
       subject: Vòstre archiu es prèst per telecargament
       title: Archiu per emportar
+    warning:
+      explanation:
+        disable: Quand vòstre compte es gelat, las donadas d’aqueste demòran senceras, mas podètz pas realizar cap d’accion fins que siá desblocat.
+        silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantunas listas publicas. Pasmens, d’autres vos pòdon sègre manualament.
+        suspend: Vòstre compte es suspendut e totes vòstres tuts e fichièrs enviats son estats suprimits sens retorn possible d’aqueste servidor e los de vòstres seguidors.
+      review_server_policies: Repassar las politicas del servidor
+      subject:
+        disable: Vòstre compte %{acct} es gelat
+        none: Avertiment per %{acct}
+        silence: Vòstre compte %{acct} es limitat
+        suspend: Vòstre compte %{acct} es suspendut
+      title:
+        disable: Compte gelat
+        none: Avertiment
+        silence: Compte limitat
+        suspend: Compte suspendut
     welcome:
       edit_profile_action: Configuracion del perfil
       edit_profile_step: Podètz personalizar lo perfil en mandar un avatard, cambiar l’escais-nom e mai. Se volètz repassar las demandas d’abonaments abans que los nòus seguidors pòscan veire vòstre perfil, podètz clavar vòstre compte.
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 41a54a8c1..223d68ac3 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -78,6 +78,9 @@ pl:
       moderator: Moderator
     unfollow: Przestań śledzić
   admin:
+    account_actions:
+      action: Wykonaj działanie
+      title: Wykonaj działanie moderacyjne na %{acct}
     account_moderation_notes:
       create: Pozostaw notatkę
       created_msg: Pomyślnie dodano notatkę moderacyjną!
@@ -97,6 +100,7 @@ pl:
       confirm: Potwierdź
       confirmed: Potwierdzono
       confirming: Potwierdzanie
+      deleted: Usunięto
       demote: Degraduj
       disable: Dezaktywuj
       disable_two_factor_authentication: Wyłącz uwierzytelnianie dwuetapowe
@@ -110,10 +114,13 @@ pl:
       enabled: Aktywowano
       feed_url: Adres kanału
       followers: Śledzący
+      followers_local: "(%{local} lokalnych)"
       followers_url: Adres śledzących
       follows: Śledzeni
       inbox_url: Adres skrzynki
+      invited_by: Zaproszony(-a) przez
       ip: Adres IP
+      joined: Dołączył(-a)
       location:
         all: Wszystkie
         local: Lokalne
@@ -140,7 +147,7 @@ pl:
       protocol: Protokół
       public: Publiczne
       push_subscription_expires: Subskrypcja PuSH wygasa
-      redownload: Odśwież awatar
+      redownload: Odśwież profil
       remove_avatar: Usun awatar
       resend_confirmation:
         already_confirmed: To konto zostało już potwierdzone
@@ -172,12 +179,14 @@ pl:
       undo_suspension: Cofnij zawieszenie
       unsubscribe: Przestań subskrybować
       username: Nazwa użytkownika
+      warn: Ostrzeż
       web: Sieć
     action_logs:
       actions:
         assigned_to_self_report: "%{name} przypisał(a) sobie zgłoszenie %{target}"
         change_email_user: "%{name} zmienił(a) adres e-mail użytkownika %{target}"
         confirm_user: "%{name} potwierdził(a) adres e-mail użytkownika %{target}"
+        create_account_warning: "%{name} wysłał(a) ostrzeżenie do %{target}"
         create_custom_emoji: "%{name} dodał(a) nowe emoji %{target}"
         create_domain_block: "%{name} zablokował(a) domenę %{target}"
         create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę"
@@ -271,11 +280,6 @@ pl:
       reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu
       reject_reports: Odrzucaj zgłoszenia
       reject_reports_hint: Zgłoszenia z tej instancji będą ignorowane. Nieprzydatne przy zawieszeniu
-      severities:
-        noop: Nic nie rób
-        silence: Wycisz
-        suspend: Zawieś
-      severity: Priorytet
       show:
         affected_accounts: Dotyczy %{count} kont w bazie danych
         retroactive:
@@ -283,7 +287,6 @@ pl:
           suspend: Odwołaj zawieszenie wszystkich kont w tej domenie
         title: Odwołaj blokadę dla domeny %{domain}
         undo: Cofnij
-      title: Zablokowane domeny
       undo: Cofnij
     email_domain_blocks:
       add_new: Dodaj nową
@@ -295,11 +298,10 @@ pl:
         create: Utwórz blokadę
         title: Nowa blokada domeny e-mail
       title: Blokowanie domen e-mail
+    followers:
+      back_to_account: Wróć do konta
+      title: Śledzący %{acct}
     instances:
-      account_count: Znane konta
-      domain_name: Domena
-      reset: Przywróć
-      search: Szukaj
       title: Znane instancje
     invites:
       deactivate_all: Unieważnij wszystkie
@@ -453,6 +455,12 @@ pl:
       unhide: Pokazuj w katalogu
       visible: Widoczne
     title: Administracja
+    warning_presets:
+      add_new: Dodaj nowy
+      delete: Usuń
+      edit: Edytuj
+      edit_preset: Edytuj szablon ostrzeżenia
+      title: Zarządzaj szablonami ostrzeżeń
   admin_mailer:
     new_report:
       body: Użytkownik %{reporter} zgłosił(a) %{target}
@@ -716,9 +724,6 @@ pl:
     no_account_html: Nie masz konta? Możesz <a href='%{sign_up_path}' target='_blank'>zarejestrować się tutaj</a>
     proceed: Śledź
     prompt: 'Zamierzasz śledzić:'
-  remote_interaction:
-    proceed: Przejdź do interakcji
-    prompt: 'Chcesz dokonać interakcji z tym wpisem:'
   remote_unfollow:
     error: Błąd
     title: Tytuł
@@ -926,6 +931,22 @@ pl:
       explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ona dostępna do pobrania!
       subject: Twoje archiwum jest gotowe do pobrania
       title: Odbiór archiwum
+    warning:
+      explanation:
+        disable: Kiedy Twoje konto jest wyłączone, Twoje dane pozostają na serwerze, ale nie możesz wykonywać żadnych działań, zanim zostanie odblokowane.
+        silence: Kiedy Twoje konto jest ograniczone, tylko osoby które je śledzą będą widzieć Twoje wpisy. Może ono też przestać być widoczne na publicznych listach. Inni wciąż mogą zacząć Cię śledzić.
+        suspend: Twoje konto zostało zawieszone i wszystkie Twoje wpisy wraz z zawartością multimedialną zostały nieodwracalnie usunięte z tego serwera i serwerów, których użytkownicy śledzili Cię.
+      review_server_policies: Przejrzyj zasady serwera
+      subject:
+        disable: Twoje konto %{acct} zostało wyłączone
+        none: Ostrzeżenie dla %{acct}
+        silence: Twoje konto %{acct} zostało ograniczone
+        suspend: Twoje konto %{acct} zostało zawieszone
+      title:
+        disable: Konto wyłączone
+        none: Ostrzeżenie
+        silence: Konto ograniczone
+        suspend: Konto zawieszone
     welcome:
       edit_profile_action: Skonfiguruj profil
       edit_profile_step: Możesz dostować profil wysyłając awatar, obraz nagłówka, zmieniając wyświetlaną nazwę i wiele więcej. Jeżeli chcesz, możesz zablokować konto, aby kontrolować, kto może Cię śledzić.
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index dff73e990..a9781bf1e 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -70,6 +70,9 @@ pt-BR:
       moderator: Moderador
     unfollow: Deixar de seguir
   admin:
+    account_actions:
+      action: Tomar uma ação
+      title: Realizar uma ação de moderação em %{acct}
     account_moderation_notes:
       create: Criar uma advertência
       created_msg: Nota de moderação criada com sucesso!
@@ -102,8 +105,10 @@ pt-BR:
       enabled: Ativado
       feed_url: URL do feed
       followers: Seguidores
+      followers_local: "(%{local} local)"
       followers_url: URL de seguidores
       follows: Segue
+      header: Cabeçalho
       inbox_url: URL da caixa de entrada
       ip: IP
       location:
@@ -134,6 +139,7 @@ pt-BR:
       push_subscription_expires: Inscrição PuSH expira
       redownload: Atualizar avatar
       remove_avatar: Remover avatar
+      remove_header: Remover cabeçalho
       resend_confirmation:
         already_confirmed: Este usuário já está confirmado
         send: Re-enviar o e-mail de confirmação
@@ -170,6 +176,7 @@ pt-BR:
         assigned_to_self_report: "%{name} designou a denúncia %{target} para si"
         change_email_user: "%{name} mudou o endereço de e-mail do usuário %{target}"
         confirm_user: "%{name} confirmou o endereço de e-mail do usuário %{target}"
+        create_account_warning: "%{name} enviou um aviso para %{target}"
         create_custom_emoji: "%{name} enviou o emoji novo %{target}"
         create_domain_block: "%{name} bloqueou o domínio %{target}"
         create_email_domain_block: "%{name} colocou o domínio de e-mail %{target} na lista negra"
@@ -263,11 +270,6 @@ pt-BR:
       reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões
       reject_reports: Rejeitar denúncias
       reject_reports_hint: Ignorar todas as denúncias vindas deste domíno. Irrelevante para suspensões
-      severities:
-        noop: Nenhum
-        silence: Silêncio
-        suspend: Suspensão
-      severity: Rigidez
       show:
         affected_accounts:
           one: Uma conta no banco de dados foi afetada
@@ -277,7 +279,6 @@ pt-BR:
           suspend: Retirar suspensão de todas as contas neste domínio
         title: Retirar bloqueio de domínio de %{domain}
         undo: Retirar
-      title: Bloqueios de domínio
       undo: Retirar
     email_domain_blocks:
       add_new: Adicionar novo
@@ -289,11 +290,10 @@ pt-BR:
         create: Adicionar domínio
         title: Novo bloqueio de domínio de e-mail
       title: Bloqueio de Domínio de E-mail
+    followers:
+      back_to_account: Voltar para a conta
+      title: Pessoas que seguem %{acct}
     instances:
-      account_count: Contas conhecidas
-      domain_name: Domínio
-      reset: Resetar
-      search: Buscar
       title: Instâncias conhecidas
     invites:
       deactivate_all: Desativar todos
@@ -447,6 +447,12 @@ pt-BR:
       unhide: Mostrar no diretório
       visible: Visível
     title: Administração
+    warning_presets:
+      add_new: Adicionar um novo
+      delete: Excluir
+      edit: Editar
+      edit_preset: Editar o aviso pré-definido
+      title: Gerenciar os avisos pré-definidos
   admin_mailer:
     new_report:
       body: "%{reporter} denunciou %{target}"
@@ -702,9 +708,6 @@ pt-BR:
     no_account_html: Não tem uma conta? Você pode <a href='%{sign_up_path}' target='_blank'>cadastrar-se aqui</a>
     proceed: Prosseguir para seguir
     prompt: 'Você irá seguir:'
-  remote_interaction:
-    proceed: Continue para interagir
-    prompt: 'Você quer interagir com este toot:'
   remote_unfollow:
     error: Erro
     title: Título
@@ -909,6 +912,22 @@ pt-BR:
       explanation: Você pediu um backup completo da sua conta no Mastodon. E agora está pronto para ser baixado!
       subject: Seu arquivo está pronto para ser baixado
       title: Baixar arquivo
+    warning:
+      explanation:
+        disable: Enquanto sua conta está congelada, seus dados estão intactos, mas você não pode realizar nenhuma ação até que sua conta seja desbloqueada.
+        silence: Enquanto sua conta está limitada, somente pessoas que já estão seguindo você poderão ver seus toots nesse servidor, e você pode ser excluído de diversas listagens públicas. No entanto, outros ainda podem seguir você manualmente.
+        suspend: Sua conta está suspensa e todos os seus toots e mídias foram irreversivelmente removidas desse servidor e de servidores onde você tinha seguidores.
+      review_server_policies: Revisar as políticas do servidor
+      subject:
+        disable: Sua conta %{acct} foi congelada
+        none: Aviso para %{acct}
+        silence: Sua conta %{acct} foi limitada
+        suspend: Sua conta %{acct} foi suspensa
+      title:
+        disable: Conta congelada
+        none: Aviso
+        silence: Conta limitada
+        suspend: Conta suspensa
     welcome:
       edit_profile_action: Configurar perfil
       edit_profile_step: Você pode customizar o seu perfil enviando um avatar, uma imagem de topo, mudando seu nome de exibição, dentre outros. Se você gostaria de aprovar novos seguidores antes que eles possam seguir você, você pode trancar a sua conta.
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index a67223069..037582f34 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -195,11 +195,6 @@ pt:
         title: Novo bloqueio de domínio
       reject_media: Rejeitar ficheiros de media
       reject_media_hint: Remove localmente arquivos armazenados e rejeita fazer guardar novos no futuro. Irrelevante na suspensão
-      severities:
-        noop: Nenhum
-        silence: Silenciar
-        suspend: Suspender
-      severity: Severidade
       show:
         affected_accounts:
           one: Uma conta na base de dados afectada
@@ -209,7 +204,6 @@ pt:
           suspend: Não suspender todas as contas existentes nesse domínio
         title: Remover o bloqueio de domínio de %{domain}
         undo: Anular
-      title: Bloqueio de domínio
       undo: Anular
     email_domain_blocks:
       add_new: Adicionar novo
@@ -222,10 +216,6 @@ pt:
         title: Novo bloqueio de domínio de email
       title: Bloqueio de Domínio de Email
     instances:
-      account_count: Contas conhecidas
-      domain_name: Domínio
-      reset: Restaurar
-      search: Pesquisar
       title: Instâncias conhecidas
     invites:
       filter:
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 3a104e1d0..60a38b7c6 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -1,7 +1,119 @@
 ---
 ro:
+  about:
+    hosted_on: Mastodon găzduit de %{domain}
   accounts:
     posts:
       few: Toots
       one: Toot
       other: Toots
+  auth:
+    agreement_html: Prin apăsarea butonului Înscriere de mai jos ești deacord cu <a href="%{rules_path}">regulile acestei instanțe</a> și <a href="%{terms_path}">termenii de utilizare al acestui serviciu</a>.
+    change_password: Parolă
+    confirm_email: Confirmă email
+    delete_account: Șterge contul
+    delete_account_html: Dacă vrei să ștergi acest cont <a href="%{path}">poți începe aici</a>. Va trebui să confirmi această acțiune.
+    didnt_get_confirmation: Nu ai primit instrucțiunile de confirmare?
+    forgot_password: Ai uitat parola?
+    invalid_reset_password_token: Această cerere este invalidă sau a expirat. Încearcă resetarea parolei din nou.
+    login: Conectare
+    logout: Deconectare
+    migrate_account: Transfer către un alt cont
+    migrate_account_html: Dacă dorești să redirecționezi acest cont către un altul, poți <a href="%{path}">configura asta aici</a>.
+    or: sau
+    or_log_in_with: Sau conectează-te cu
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Înregistrare
+    register_elsewhere: Înregistrează-te pe un alt server
+    resend_confirmation: Retrimite instrucțiunile de confirmare
+    reset_password: Resetare parolă
+    security: Securitate
+    set_new_password: Setează o nouă parolă
+  authorize_follow:
+    already_following: Urmărești deja acest cont
+    error: Din păcate a apărut o eroare
+    follow: Urmărește
+    follow_request: 'Ai trimis o cerere de urmărire către:'
+    following: 'Gata! De acum urmărești:'
+    post_follow:
+      close: Sau, poți închide această fereastră.
+      return: Arată profilul utilizatorului
+      web: Mergi la web
+    title: Urmărește %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}o"
+      about_x_months: "%{count}l"
+      about_x_years: "%{count}ani"
+      almost_x_years: "%{count}ani"
+      half_a_minute: Chiar acum
+      less_than_x_minutes: "%{count}l"
+      less_than_x_seconds: Chiar acum
+      over_x_years: "%{count}ani"
+      x_days: "%{count}z"
+      x_minutes: "%{count}m"
+      x_months: "%{count}l"
+      x_seconds: "%{count}s"
+  deletes:
+    bad_password_msg: Bună încercare, hackere! Parolă incorectă
+    confirm_password: Introdu parola curentă pentru a-ți verifica identitatea
+    description_html: Această acțiune este <strong>permanentă și ireversibilă,</strong> elimină conținutul și dezactivează contul tău. Acest username va rămâne permanent rezervat pentru a evita furtul de identitate.
+    proceed: Șterge contul
+    success_msg: Contul tău a fost șterg. Nu mai poate fi recuperat :D
+    warning_html: Doar ștergerea conținutului de pe acest server este garantată. Conținutul tău care a fost redistribuit în alte instațe e posibil să lase urme. Serverele deconecate sau care nu mai sunt abonate la actualizările contului tău nu își vor mai actualiza baza de date.
+  directories:
+    explanation: Descoperă utilizatori în funcție de interesele lor
+    explore_mastodon: Explorează %{title}
+    people:
+      few: "%{count} persoană"
+      one: "%{count} persoană"
+      other: "%{count} oameni"
+  errors:
+    '403': Nu ai permisiunea să vizitezi această pagină.
+    '404': Pagina pe care o cauți nu există.
+    '410': Pagina pe care o cauți nu mai există.
+    '422':
+      content: Verificarea securității a eșuat. Ai blocat cookiurile?
+      title: Verificarea securității a eșuat
+    '429': Strangulat
+    '500':
+      content: Ne pare rău, dar ceva a funcționat greșit. Încercați din nou!?
+      title: Această pagină nu este corectă
+    noscript_html: Pentru a utiliza o aplicație web Mastodon, te rog activează JavaScript. Alternativ, încearcă una din <a href="%{apps_path}">aplicațiile native</a> Mastodon pentru platforma ta.
+  exports:
+    archive_takeout:
+      date: Data
+      download: Descarcă arhiva contului tău
+      hint_html: Poți solicita arhiva<strong>postărilor și conținutul media</strong> a contului tău. Datele furnizate sunt în formatul ActivityPub. Poți solicita cate o arhivă la 7 zile.
+      in_progress: Pregătim arhiva ta...
+      request: Cere arhiva ta
+      size: Dimensiune
+    blocks: Blocați
+    csv: CSV
+    follows: Tu urmărești
+    mutes: Opriți
+    storage: Depozitare media
+  filters:
+    contexts:
+      home: Fluxul Acasă
+      notifications: Notificări
+      public: Fluxul public
+      thread: Conversații
+    edit:
+      title: Editează filtru
+    errors:
+      invalid_context: Lipsa conținut sau acesta este invalid
+      invalid_irreversible: Filtrarea ireversibilă funcționează dor cu context din fluxul Acasă și notificări
+    index:
+      delete: Șterge
+      title: Filtre
+    new:
+      title: Adaugă un filtru nou
+  followers:
+    domain: Domeniu
+    explanation_html: Dacă vrei să fi sigur de confidențialitatea statusurilor tale, ar trebui să fi conștient de cine te urmărește. <strong>Statusurile tale private sunt livrate către toate instanțele unde ai urmăritori</strong>. Este recomandabil să verifici și să ștergi urmăritorii în care nu ai încredere că îți vor respecta intimitatea.
+    followers_count: Numărul de urmăritori
+    lock_link: Privează contul tău
+    purge: Elimină de la urmăritori
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 3b81c9ebc..3e37391a8 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -260,11 +260,6 @@ ru:
         title: Новая доменная блокировка
       reject_media: Запретить медиаконтент
       reject_media_hint: Удаляет локально хранимый медиаконтент и запрещает его загрузку в будущем. Не имеет значения в случае блокировки
-      severities:
-        noop: Ничего
-        silence: Глушение
-        suspend: Блокировка
-      severity: Строгость
       show:
         affected_accounts:
           few: Влияет на %{count} аккаунта в базе данных
@@ -276,7 +271,6 @@ ru:
           suspend: Снять блокировку со всех существующих аккаунтов этого домена
         title: Снять блокировку с домена %{domain}
         undo: Отменить
-      title: Доменные блокировки
       undo: Отменить
     email_domain_blocks:
       add_new: Добавить новую
@@ -289,10 +283,6 @@ ru:
         title: Новая доменная блокировка еmail
       title: Доменная блокировка email
     instances:
-      account_count: Известных аккаунтов
-      domain_name: Домен
-      reset: Сбросить
-      search: Поиск
       title: Известные узлы
     invites:
       deactivate_all: Отключить все
@@ -683,9 +673,6 @@ ru:
     no_account_html: Нет учётной записи? Вы можете <a href='%{sign_up_path}' target='_blank'>зарегистрироваться здесь</a>
     proceed: Продолжить подписку
     prompt: 'Вы хотите подписаться на:'
-  remote_interaction:
-    proceed: Продолжить
-    prompt: 'Вы собираетесь взаимодействовать со статусом:'
   remote_unfollow:
     error: Ошибка
     title: Заголовок
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index ae05d9e7f..ad94a9d5d 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -2,6 +2,10 @@
 ar:
   simple_form:
     hints:
+      account_warning_preset:
+        text: بإمكانك استخدام نفس القواعد التي نجدها في التبويقات كعناوين الروابط والوسوم والإشارات
+      admin_account_action:
+        send_email_notification: سوف يتلقى المستخدم رسالة تُفسِّر ما حدث على حسابه
       defaults:
         autofollow: سوف يتابعك تلقائيًا الأشخاص الذين يقومون بالتسجيل من خلال الدعوة
         avatar: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px
@@ -37,6 +41,15 @@ ar:
         fields:
           name: التسمية
           value: المحتوى
+      admin_account_action:
+        send_email_notification: إشعار المستخدِم عبر البريد الإلكتروني
+        text: تحذير مخصص
+        type: الإجراء
+        types:
+          disable: تعطيل
+          none: لا تفعل شيئا
+          silence: كتم
+          suspend: تعليق و حذف كافة بيانات الحساب
       defaults:
         autofollow: إرسال دعوة لمتابعة حسابك
         avatar: الصورة الرمزية
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index ef12bb6a7..4c2b1636d 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -2,6 +2,13 @@
 ca:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Pots utilitzar totes les sintaxi com ara URL, etiquetes i mencions
+      admin_account_action:
+        send_email_notification: L'usuari rebrà una explicació del que ha passat amb el seu compte
+        text_html: Opcional. Pots utilitzar tota la sintaxi. Pots <a href="%{path}">afegir configuracions predefinides d'avís</a> per a estalviar temps
+        type_html: Tria què fer amb <strong>%{acct}</strong>
+        warning_preset_id: Opcional. Encara pots afegir text personalitzat al final de la configuració predefinida
       defaults:
         autofollow: Les persones que es registrin a través de la invitació et seguiran automàticament
         avatar: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px
@@ -40,6 +47,18 @@ ca:
         fields:
           name: Etiqueta
           value: Contingut
+      account_warning_preset:
+        text: Text predefinit
+      admin_account_action:
+        send_email_notification: Notifica l'usuari per correu electrònic
+        text: Avís personalitzat
+        type: Acció
+        types:
+          disable: Inhabilita
+          none: No fer res
+          silence: Silenci
+          suspend: Suspèn i elimina irreversiblement les dades del compte
+        warning_preset_id: Utilitza una configuració predefinida d'avís
       defaults:
         autofollow: Convida a seguir el teu compte
         avatar: Avatar
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index b8ad23b32..2fb035556 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -2,6 +2,13 @@
 co:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Pudete utilizà a sintassa di i statuti, per esempiu l'URL, hashtag, minzione
+      admin_account_action:
+        send_email_notification: L'utilizatore hà da riceve una spiegazione di cio chì hè accadutu à u so contu
+        text_html: In uzzione. Pudete utilizà a sintassa di i statuti. Pudete ancu <a href="%{path}">aghjustà preselezzione d'avertimentu</a> per piglià tempu
+        type_html: Sceglie chì fà cù <strong>%{acct}</strong>
+        warning_preset_id: In uzzione. Pudete sempre aghjustà un testu persunalizatu à a fine di a preselezzione
       defaults:
         autofollow: Quelli·e chì s'arregistranu cù l'invitazione saranu autumaticamente abbunati·e à voi
         avatar: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px
@@ -40,6 +47,18 @@ co:
         fields:
           name: Label
           value: Cuntinutu
+      account_warning_preset:
+        text: Testu preselezziunatu
+      admin_account_action:
+        send_email_notification: Nutificà l'utilizatore cù un'e-mail
+        text: Avertimentu persunalizatu
+        type: Azzione
+        types:
+          disable: Disattivà
+          none: Ùn fà nunda
+          silence: Silenzà
+          suspend: Suspende è sguassà i dati di u contu di manera irreversibile
+        warning_preset_id: Utilizà un'avertimentu preselezziunatu
       defaults:
         autofollow: Invità à siguità u vostru contu
         avatar: Ritrattu di prufile
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 1e58f4253..0e255e4dc 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -2,6 +2,13 @@
 cs:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky
+      admin_account_action:
+        send_email_notification: Uživatel obdrží vysvětlení toho, co se stalo s jeho účtem
+        text_html: Volitelné. Můžete používat syntaxi tootů. Pro ušetření času si můžete <a href="%{path}">přidat přednastavení pro varování</a>
+        type_html: Vyberte, co chcete udělat s účtem <strong>%{acct}</strong>
+        warning_preset_id: Volitelné. Můžete stále vložit na konec přednastavení vlastní text
       defaults:
         autofollow: Lidé, kteří se zaregistrují přes pozvání, vás budou automaticky sledovat
         avatar: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px
@@ -40,8 +47,20 @@ cs:
         fields:
           name: Označení
           value: Obsah
+      account_warning_preset:
+        text: Text přednastavení
+      admin_account_action:
+        send_email_notification: Informovat uživatele e-mailem
+        text: Vlastní varování
+        type: Akce
+        types:
+          disable: Deaktivovat
+          none: Nic nedělat
+          silence: Utišit
+          suspend: Pozastavit a nenávratně smazat data účtu
+        warning_preset_id: Použít přednastavení pro varování
       defaults:
-        autofollow: Pozvěte ke sledování vašeho účtu
+        autofollow: Pozvat ke sledování vašeho účtu
         avatar: Avatar
         bot: Tohle je účet robota
         chosen_languages: Filtrovat jazyky
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 29a4b7651..f73dbac96 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -2,6 +2,8 @@
 da:
   simple_form:
     hints:
+      admin_account_action:
+        type_html: Vælg hvad du vil gøre med <strong>%{acct}</strong>
       defaults:
         autofollow: Folk der har oprettet sig gennem invitationen vil automatisk følge dig
         avatar: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px
@@ -24,6 +26,7 @@ da:
         setting_hide_network: Hvem du følger og hvem der følger dig vil ikke blive vist på din profil
         setting_noindex: Påvirker din offentlige profil og status sider
         setting_theme: Påvirker hvordan Mastodon ser ud når du er logget ind via en hvilken som helst enhed.
+        username: Dit brugernavn vil være unikt på %{domain}
         whole_word: Når nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet
       imports:
         data: CSV fil eksporteret fra en anden Mastodon instans
@@ -36,6 +39,11 @@ da:
         fields:
           name: Etiket
           value: Indhold
+      admin_account_action:
+        type: Handling
+        types:
+          disable: Deaktiver
+          none: Gør intet
       defaults:
         autofollow: Inviter til at følge din konto
         avatar: Profilbillede
@@ -67,7 +75,11 @@ da:
         setting_default_privacy: Privatliv
         setting_default_sensitive: Marker altid medier som værende følsomt
         setting_delete_modal: Vis bekræftelses dialog før du sletter et trut
+        setting_display_media: Visning af medier
         setting_display_media_default: Standard
+        setting_display_media_hide_all: Skjul alle
+        setting_display_media_show_all: Vis alle
+        setting_expand_spoilers: Udvid altid trut der er markeret med indholdsadvarsler
         setting_hide_network: Skjul dit netværk
         setting_noindex: Frameld dig søgemaskiners indeksering
         setting_reduce_motion: Reducer animationers bevægelse
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 8b9ca1b17..6d0a9196f 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -2,6 +2,13 @@
 de:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Du kannst Toot-Syntax benutzen, wie zum Beispiel URLs, Hashtags und Erwähnungen
+      admin_account_action:
+        send_email_notification: Der Benutzer erhält eine Erklärung, was mit seinem Account geschehen ist
+        text_html: Optional. Du kannst Toot-Syntax benutzen. Du kannst <a href="%{path}">Warnungsvorlagen</a> benutzen um Zeit zu sparen
+        type_html: Wähle aus, was du mit <strong>%{acct}</strong> machen möchtest
+        warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen
       defaults:
         autofollow: Leute die sich über deine Einladung registrieren werden dir automatisch folgen
         avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert
@@ -40,6 +47,18 @@ de:
         fields:
           name: Bezeichnung
           value: Inhalt
+      account_warning_preset:
+        text: Vorlagentext
+      admin_account_action:
+        send_email_notification: Benachrichtige den Nutzer per E-Mail
+        text: Eigene Warnung
+        type: Aktion
+        types:
+          disable: Deaktivieren
+          none: Nichts tun
+          silence: Stummschalten
+          suspend: Deaktivieren und unwiderruflich Benutzerdaten löschen
+        warning_preset_id: Benutze eine Warnungsvorlage
       defaults:
         autofollow: Einladen, um deinen Account zu folgen
         avatar: Profilbild
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 599b2b5c7..fecddd11f 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -2,6 +2,13 @@
 el:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Μπορεις να χρησιμοποιήσεις συντακτικό ενός τουτ όπως διευθύνσεις URL, ταμπέλες και αναφορές
+      admin_account_action:
+        send_email_notification: Ο χρήστης θα λάβει μια εξήγηση του τι συνέβη με τον λογαριασμό του
+        text_html: Προαιρετικό. Μπορείς να χρησιμοποιήσεις συντακτικό ενός τουτ. Μπορείς να <a href="%{path}">ορίσεις προκαθορισμένες προειδοποιήσεις</a> για να γλυτώσεις χρόνο
+        type_html: Διάλεξε τι θα κανείς με τον  <strong>%{acct}</strong>
+        warning_preset_id: Προαιρετικό. Μπορείς να προσθέσεις επιπλέον κείμενο μετά το προκαθορισμένο κείμενο
       defaults:
         autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα
         avatar: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px
@@ -40,6 +47,18 @@ el:
         fields:
           name: Ταμπέλα
           value: Περιεχόμενο
+      account_warning_preset:
+        text: Προκαθορισμένο κείμενο
+      admin_account_action:
+        send_email_notification: Ενημέρωση χρήστη μέσω email
+        text: Προσαρμοσμένη προειδοποίηση
+        type: Ενέργεια
+        types:
+          disable: Απενεργοποίηση
+          none: Καμία ενέργεια
+          silence: Αποσιώπηση
+          suspend: Αναστολή και αμετάκλητη διαγραφή στοιχείων λογαριασμού
+        warning_preset_id: Χρήση προκαθορισμένης προειδοποίησης
       defaults:
         autofollow: Προσκάλεσε για να ακολουθήσουν το λογαριασμό σου
         avatar: Αβατάρ
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 9537df88d..0ffc22b53 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -2,6 +2,13 @@
 eu:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Toot sintaxia erabili dezakezu, URLak, traolak eta aipamenak
+      admin_account_action:
+        send_email_notification: Erabiltzaileak bere kontuarekin gertatutakoaren azalpen bat jasoko du
+        text_html: Aukerakoa. Toot sintaxia erabili dezakezu. <a href="%{path}">Abisu aurre-ezarpenak</a> gehitu ditzakezu denbora aurrezteko
+        type_html: Erabaki zer egin <strong>%{acct}</strong> kontuarekin
+        warning_preset_id: Aukerakoa. Zure testua gehitu dezakezu aurre-ezarpenaren ostean
       defaults:
         autofollow: Gonbidapena erabiliz izena ematen dutenek automatikoki jarraituko dizute
         avatar: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px neurrira eskalatuko da
@@ -40,6 +47,17 @@ eu:
         fields:
           name: Etiketa
           value: Edukia
+      account_warning_preset:
+        text: Aurrez ezarritako testua
+      admin_account_action:
+        send_email_notification: Jakinarazi erabiltzaileari e-mail bidez
+        text: Abisu pertsonalizatua
+        type: Ekintza
+        types:
+          disable: Desaktibatu
+          none: Ez egin ezer
+          silence: Isiltarazi
+        warning_preset_id: Erabili aurre-ezarritako abisu bat
       defaults:
         autofollow: Gonbidatu zure kontua jarraitzera
         avatar: Abatarra
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 4637dc0a3..21f81ecc2 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -2,6 +2,13 @@
 fr:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Vous pouvez utiliser la syntaxe des pouets, comme les URLs, les hashtags et les mentions
+      admin_account_action:
+        send_email_notification: L'utilisateur recevra une explication de ce qu'il s'est passé avec son compte
+        text_html: Optionnel. Vous pouvez utilisez la syntaxe des pouets. Vous pouvez <a href="%{path}">ajouter des présélections d'attention</a> pour économiser du temps
+        type_html: Choisir que faire avec <strong>%{acct}</strong>
+        warning_preset_id: Optionnel. Vous pouvez toujours ajouter un texte personnalisé à la fin de le présélection
       defaults:
         autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement
         avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px
@@ -40,6 +47,18 @@ fr:
         fields:
           name: Étiquette
           value: Contenu
+      account_warning_preset:
+        text: Texte de présélection
+      admin_account_action:
+        send_email_notification: Notifier l'utilisateur par courriel
+        text: Attention personnalisée
+        type: Action
+        types:
+          disable: Désactiver
+          none: Ne rien faire
+          silence: Silence
+          suspend: Suspendre et effacer les données du compte de manière irréversible
+        warning_preset_id: Utiliser une présélection d'attention
       defaults:
         autofollow: Invitation à suivre votre compte
         avatar: Image de profil
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 35bf5e017..d5e0ef574 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -2,6 +2,13 @@
 gl:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Vostede pode utilizar dar formato ao toot, como URLs, etiquetas e mencións
+      admin_account_action:
+        send_email_notification: A usuaria recibirá unha explicación sobre o que lle aconteceu a súa conta
+        text_html: Optativo. Pode utilizar formato no toot. Pode <a href="%{path}">engadir avisos preestablecidos</a> para aforrar tempo
+        type_html: Escolla que facer con <strong>%{acct}</strong>
+        warning_preset_id: Optativo. Poderá engadir texto personalizado ao final do preestablecido
       defaults:
         autofollow: As persoas que se conectaron a través de un convite seguirana automáticamente a vostede
         avatar: PNG, GIF ou JPG.  Máximo %{size}. Será reducida a %{dimensions}px
@@ -40,6 +47,18 @@ gl:
         fields:
           name: Etiqueta
           value: Contido
+      account_warning_preset:
+        text: Texto preestablecido
+      admin_account_action:
+        send_email_notification: Notificar a usuaria por correo-e
+        text: Aviso personalizado
+        type: Acción
+        types:
+          disable: Desactivar
+          none: Non facer nada
+          silence: Acalar
+          suspend: Suspender e eliminar irreversiblemente datos da conta
+        warning_preset_id: Utilizar un aviso preestablecido
       defaults:
         autofollow: Convide a seguir a súa conta
         avatar: Avatar
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index 591b3ab0a..dd43898d2 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -2,6 +2,13 @@
 it:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Puoi usare la sintassi dei toot, come URL, hashtag e menzioni
+      admin_account_action:
+        send_email_notification: L'utente riceverà una spiegazione di ciò che è successo con suo account
+        text_html: Opzionale. Puoi usare la sintassi dei toot. Puoi <a href="%{path}">aggiungere avvisi preimpostati</a> per risparmiare tempo
+        type_html: Decidi cosa fare con <strong>%{acct}</strong>
+        warning_preset_id: Opzionale. Puoi aggiungere un testo personalizzato alla fine di quello preimpostato
       defaults:
         autofollow: Le persone che si iscrivono attraverso l'invito ti seguiranno automaticamente
         avatar: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px
@@ -40,6 +47,18 @@ it:
         fields:
           name: Etichetta
           value: Contenuto
+      account_warning_preset:
+        text: Testo preimpostato
+      admin_account_action:
+        send_email_notification: Informa l'utente via email
+        text: Avviso personalizzato
+        type: Azione
+        types:
+          disable: Disabilita
+          none: Non fare nulla
+          silence: Silenzia
+          suspend: Sospendi e cancella i dati dell'account in modo irreversibile
+        warning_preset_id: Usa un avviso preimpostato
       defaults:
         autofollow: Invita a seguire il tuo account
         avatar: Avatar
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index b64974ffd..9419331e4 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -2,6 +2,13 @@
 ja:
   simple_form:
     hints:
+      account_warning_preset:
+        text: URL、ハッシュタグ、メンションなど、投稿に用いる構文が使用できます
+      admin_account_action:
+        send_email_notification: ユーザーは自分のアカウントに何が起こったのか説明を受け取ります
+        text_html: オプションです。投稿に用いる構文を使うことができます。簡略化のため<a href="%{path}">プリセット警告文を追加</a>することができます
+        type_html: "<strong>%{acct}</strong>さんに対し、何を行うか選択してください"
+        warning_preset_id: オプションです。プリセット警告文の末尾に任意の文字列を追加することができます
       defaults:
         autofollow: 招待から登録した人が自動的にあなたをフォローするようになります
         avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます"
@@ -40,6 +47,18 @@ ja:
         fields:
           name: ラベル
           value: 内容
+      account_warning_preset:
+        text: プリセット警告文
+      admin_account_action:
+        send_email_notification: メールでユーザーに通知
+        text: カスタム警告文
+        type: アクション
+        types:
+          disable: 無効化
+          none: 何もしない
+          silence: サイレンス
+          suspend: 停止しアカウントのデータを恒久的に削除する
+        warning_preset_id: プリセット警告文を使用
       defaults:
         autofollow: 招待から参加後、あなたをフォロー
         avatar: アイコン
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 02583b5bc..fd0a1940e 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -2,6 +2,13 @@
 ko:
   simple_form:
     hints:
+      account_warning_preset:
+        text: URL, 해시태그, 멘션과 같은 툿 문법을 사용할 수 있습니다
+      admin_account_action:
+        send_email_notification: 유저는 어떤 일이 일어났는 지에 대한 설명을 받게 됩니다
+        text_html: 선택사항. 툿 문법을 사용할 수 있습니다. <a href="%{path}">경고 틀을 추가</a>하여 시간을 절약할 수 있습니다
+        type_html: "<strong>%{acct}</strong>에 대해 취할 행동 선택"
+        warning_preset_id: 선택사항. 틀의 마지막에 임의의 텍스트를 추가 할 수 있습니다
       defaults:
         autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다
         avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 될 것임
@@ -40,6 +47,18 @@ ko:
         fields:
           name: 라벨
           value: 내용
+      account_warning_preset:
+        text: 프리셋 텍스트
+      admin_account_action:
+        send_email_notification: 이메일로 유저에게 알리기
+        text: 커스텀 경고
+        type: 조치
+        types:
+          disable: 비활성화
+          none: 아무 것도 하지 않기
+          silence: 침묵
+          suspend: 정지하고 되돌릴 수 없는 데이터 삭제
+        warning_preset_id: 경고 틀 사용하기
       defaults:
         autofollow: 초대를 통한 팔로우
         avatar: 아바타
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 972b98339..ce56f613a 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -40,6 +40,17 @@ nl:
         fields:
           name: Label
           value: Inhoud
+      account_warning_preset:
+        text: Tekst van voorinstelling
+      admin_account_action:
+        send_email_notification: Meld dit per e-mail aan de gebruiker
+        text: Aangepaste waarschuwing
+        type: Actie
+        types:
+          disable: Uitschakelen
+          none: Niets doen
+          silence: Negeren
+        warning_preset_id: Gebruik een voorinstelling van een waarschuwing
       defaults:
         autofollow: Uitnodigen om jouw account te volgen
         avatar: Avatar
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index 8260d81e0..6ded448e9 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -2,6 +2,13 @@
 oc:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Podètz utilizar la sintaxi dels tuts, coma las URL, las etiquetas e las mencions
+      admin_account_action:
+        send_email_notification: L’utilizaire recebrà una explicacion de çò qu’arribèt a son compte
+        text_html: Opcional. Podètz utilizar la sintaxi dels tuts. Podètz <a href="%{path}">ajustar un avertiment personalizat</a> per estalviar de temps
+        type_html: Causir de qué far amb <strong>%{acct}</strong>
+        warning_preset_id: Opcional. Podètz ajustar un tèxt personalizat a a fin de çò predefinit
       defaults:
         autofollow: Lo monde que se marcan gràcia a l’invitacion vos segràn automaticament
         avatar: PNG, GIF o JPG. Maximum %{size}. Serà retalhat en %{dimensions}px
@@ -40,6 +47,18 @@ oc:
         fields:
           name: Nom
           value: Contengut
+      account_warning_preset:
+        text: Tèxt predefinit
+      admin_account_action:
+        send_email_notification: Avisar l’utilizaire per corrièl
+        text: Avertiment personalizat
+        type: Accions
+        types:
+          disable: Desactivar
+          none: Far pas res
+          silence: Metre en silence
+          suspend: Suspendre e escafar per de bon las donadas del compte
+        warning_preset_id: Utilizar un avertiment predefinit
       defaults:
         autofollow: Convidar a sègre vòstre compte
         avatar: Avatar
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 1a15c5942..227d9144e 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -2,6 +2,13 @@
 pl:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Możesz korzystać ze składni której używasz we wpisach, takiej jak adresy URL, hashtagi i wspomnienia
+      admin_account_action:
+        send_email_notification: Użytkownik otrzyma informację, co stało się z jego kontem
+        text_html: Możesz używać składni której używasz we wpisach. Możesz <a href="%{path}">dodać szablon ostrzeżenia</a> aby zaoszczędzić czas
+        type_html: Wybierz co chcesz zrobić z <strong>%{acct}</strong>
+        warning_preset_id: Nieobowiązkowe. Możesz dodać niestandardowy tekst do końcowki szablonu
       defaults:
         autofollow: Osoby, które zarejestrują się z Twojego zaproszenia automatycznie zaczną Cię śledzić
         avatar: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px
@@ -35,6 +42,18 @@ pl:
         fields:
           name: Nazwa
           value: Zawartość
+      account_warning_preset:
+        text: Tekst szablonu
+      admin_account_action:
+        send_email_notification: Powiadom użytkownika mailem
+        text: Niestandardowe ostrzeżenie
+        type: Działanie
+        types:
+          disable: Wyłącz
+          none: Nie rób niczego
+          silence: Wycisz
+          suspend: Zawieś i nieodwracalnie usuń dane konta
+        warning_preset_id: Użyj szablonu ostrzeżenia
       defaults:
         autofollow: Zapraszaj do śledzenia swojego konta
         avatar: Awatar
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 3d4e7414d..664c07a46 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -2,6 +2,13 @@
 pt-BR:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Você pode usar a sintaxe de um toot, como URLs, hashtags e menções
+      admin_account_action:
+        send_email_notification: O usuário vai receber uma explicação do que aconteceu com a sua conta
+        text_html: Opcional. Você pode usar a sintaxe de toots. Você pode <a href="%{path}">adicionar avisos pré-definidos</a> para ganhar tempo.
+        type_html: Escolha o que fazer com <strong>%{acct}</strong>
+        warning_preset_id: Opcional. Você ainda pode adicionar texto customizado no fim do texto pré-definido
       defaults:
         autofollow: Pessoas que se cadastrarem através de seu convite te seguirão automaticamente
         avatar: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px
@@ -40,6 +47,18 @@ pt-BR:
         fields:
           name: Rótulo
           value: Conteúdo
+      account_warning_preset:
+        text: Texto pré-definido
+      admin_account_action:
+        send_email_notification: Notificar o usuário por e-mail
+        text: Aviso customizado
+        type: Ação
+        types:
+          disable: Desabilitar
+          none: Não fazer nada
+          silence: Silenciar
+          suspend: Suspender e excluir irreversivelmente dados da conta
+        warning_preset_id: Usar um aviso pré-definido
       defaults:
         autofollow: Convite para seguir a sua conta
         avatar: Avatar
diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml
index fcccd1a10..757b87204 100644
--- a/config/locales/simple_form.ro.yml
+++ b/config/locales/simple_form.ro.yml
@@ -2,24 +2,39 @@
 ro:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Poți utiliza sintaxe precum URL, hastag sau menționări
+      admin_account_action:
+        send_email_notification: Utilizatorul va primi o explicație cu privire la ceea ce sa întâmplat cu contul lui
+        text_html: Opțional. Poți utiliza sintaxe. Poți <a href="%{path}">adăuga avertismente predefinite</a> pentru a salva timp
+        type_html: Alege ce se întâmplă cu <strong>%{acct}</strong>
+        warning_preset_id: Opțional. Poți adăuga text personalizat la sfârșitul presetului
       defaults:
         autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat
         avatar: PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px
         bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat
         context: Contextele în care filtrul trebuie aplicat
         digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență
+        discoverable_html: <a href="%{path}" target="_blank">Directorul</a> permite utilizatorilor să găsească conturi după interese și activități. Necesită minim %{min_followers} urmăritori
+        email: Vei primi un e-mail de confirmare
         fields: Poti afișa pană la maxim 4 adrese sub formă de tabel pe pofilul tău
         header: PNG, GIF sau JPG. Cel mult %{size}. Vor fi redimensionate la %{dimensions}px
         inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi
         irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters
         locale: Limba interfaței de utilizator, e-mailurile si notificările push
         locked: Necesită aprobare manuală a urmăritorilor
+        password: Utilizează cel puțin 8 caractere
         phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări
         scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia.
+        setting_aggregate_reblogs: Nu afișa redistribuirile noi pentru postările care au fost deja recent redistribuite (afectează doar noile redistribuiri primite)
         setting_default_language: Limba postărilor tale poate fi detectată automat, dar nu este întotdeauna precisă
+        setting_display_media_default: Ascunde conținutul media marcat ca sensibil (NSFW)
+        setting_display_media_hide_all: Întotdeauna ascunde tot conținutul media
+        setting_display_media_show_all: Întotdeauna afișează conținutul media marcat ca sensibil
         setting_hide_network: Pe cine urmărești și cine te urmărește nu vor fi afișați pe profilul tău
         setting_noindex: Afecteazâ profilul tău public și statusurile tale
         setting_theme: Afecteazâ modul în care arată interfața pe toate dispozitivele pe care ești conectat.
+        username: Numele tău de utilizator va fi unic pe %{domain}
         whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă
       imports:
         data: Fișierul CSV exportat de la o altă instanță
@@ -32,6 +47,18 @@ ro:
         fields:
           name: Etichetă
           value: Conținut
+      account_warning_preset:
+        text: Text presetat
+      admin_account_action:
+        send_email_notification: Notificați utilizatorul prin e-mail
+        text: Avertisment personalizat
+        type: Acțiune
+        types:
+          disable: Dezactivează
+          none: Nu fă nimic
+          silence: Liniște
+          suspend: Suspendă și șterge ireversibil datele contului
+        warning_preset_id: Utilizează un avertisment predefinit
       defaults:
         autofollow: Invită să te urmărească
         avatar: Fotografie de profil
@@ -42,6 +69,7 @@ ro:
         context: Contextele filtrului
         current_password: Parola actuală
         data: Data
+        discoverable: Listează acest cont in director
         display_name: Numele afișat
         email: Adresa de e-mail
         expires_in: Expiră după
@@ -63,6 +91,7 @@ ro:
         setting_default_privacy: Cine vede postările tale
         setting_default_sensitive: Întotdeauna marchează conținutul media ca sensibil
         setting_delete_modal: Arată dialogul de confirmare înainte de a șterge o postare
+        setting_display_media_default: Standard
         setting_hide_network: Ascunde rețeaua
         setting_noindex: Nu permite motoarelor de căutare să indexeze rețeaua ta
         setting_reduce_motion: Redu mișcarea în animații
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 63403fe03..48363ea19 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -2,6 +2,13 @@
 sk:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Môžeš používať rovnakú syntaxiu ako v rámci príspevkov, čiže URL, haštagy, a spomenutia
+      admin_account_action:
+        send_email_notification: Užívateľ dostane vysvetlenie ohľadom toho, čo sa stalo s ich účtom
+        text_html: Voliteľné. Môžeš používať rovnakú syntaxiu ako v príspevkoch. Môžeš pridať <a href="%{path}">varovné predlohy</a> a ušetriť tak čas
+        type_html: Vyber si, čo urobiť s účtom <strong>%{acct}</strong>
+        warning_preset_id: Voliteľné. Stále môžeš vložiť vlastný text na samý koniec predlohy
       defaults:
         autofollow: Ľudia ktorí sa zaregistrujú prostredníctvom pozvánky, ťa budú inheď následovať
         avatar: PNG, GIF alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px
@@ -40,6 +47,18 @@ sk:
         fields:
           name: Označenie
           value: Obsah
+      account_warning_preset:
+        text: Text predlohy
+      admin_account_action:
+        send_email_notification: Oznám užívateľovi cez email
+        text: Špecifické varovanie
+        type: Úkon
+        types:
+          disable: Deaktivuj
+          none: Neurob nič
+          silence: Utíšenie
+          suspend: Vylúč a nenávratne vymaž dáta na účte
+        warning_preset_id: Použi varovnú predlohu
       defaults:
         autofollow: Pozvi k následovaniu tvojho profilu
         avatar: Avatar
@@ -90,12 +109,12 @@ sk:
         username_or_email: Prezívka, alebo email
         whole_word: Celé slovo
       interactions:
-        must_be_follower: Blokovať oznámenia od užívateľov, ktorí ťa nesledujú
-        must_be_following: Blokovať oboznámenia ohľadom ľudí ktorých nesleduješ
-        must_be_following_dm: Blokovať súkromné správy od ľudí ktorých nesleduješ
+        must_be_follower: Blokuj oboznámenia ohľadom užívateľov, ktorí ťa nesledujú
+        must_be_following: Blokuj oboznámenia ohľadom ľudí ktorých nesleduješ
+        must_be_following_dm: Blokuj súkromné správy od ľudí ktorých nesleduješ
       notification_emails:
-        digest: Posielať súhrnné emaily
-        favourite: Poslať email ak niekto označí váš príspevok ako obľúbený
+        digest: Posielaj súhrnné emaily
+        favourite: Poslať email ak si niekto obľúbi tvoj príspevok
         follow: Poslať email, ak ťa niekto začne následovať
         follow_request: Zaslať email ak ti niekto pošle žiadosť o sledovanie
         mention: Poslať email ak ťa niekto spomenie v svojom príspevku
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 31f735e19..d038d5a06 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -74,6 +74,9 @@ sk:
       moderator: Moderátor
     unfollow: Prestaň sledovať
   admin:
+    account_actions:
+      action: Vykonaj
+      title: Vykonaj moderovací úkon voči %{acct}
     account_moderation_notes:
       create: Zanechaj poznámku
       created_msg: Poznámka moderátora bola úspešne vytvorená!
@@ -106,6 +109,7 @@ sk:
       enabled: Povolený
       feed_url: URL časovej osi
       followers: Sledujúci
+      followers_local: "(%{local} local)"
       followers_url: URL sledujúcich
       follows: Sledovania
       header: Hlavička
@@ -176,6 +180,7 @@ sk:
         assigned_to_self_report: "%{name}pridelil/a hlásenie užívateľa %{target}sebe"
         change_email_user: "%{name} zmenil/a emailovú adresu užívateľa %{target}"
         confirm_user: "%{name} potvrdil e-mailovú adresu používateľa %{target}"
+        create_account_warning: "%{name} poslal/a varovanie užívateľovi %{target}"
         create_custom_emoji: "%{name} nahral nový emoji %{target}"
         create_domain_block: "%{name} zablokoval doménu %{target}"
         create_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam zakázaných"
@@ -269,11 +274,6 @@ sk:
       reject_media_hint: Zmaže lokálne uložené súbory médií a odmietne ich sťahovanie v budúcnosti. Irelevantné pre suspendáciu
       reject_reports: Zamietni hlásenia
       reject_reports_hint: Ignoruj všetky hlásenia prichádzajúce z tejto domény. Nevplýva na blokovania
-      severities:
-        noop: Žiadne
-        silence: Stíšiť
-        suspend: Suspendovať
-      severity: Závažnosť
       show:
         affected_accounts:
           few: "%{count} účty v databáze ovplyvnených"
@@ -284,23 +284,21 @@ sk:
           suspend: Zrušiť suspendáciu všetkých existujúcich účtov z tejto domény
         title: Zrušiť blokovanie domény pre %{domain}
         undo: Vrátiť späť
-      title: Blokovanie domén
       undo: Späť
     email_domain_blocks:
-      add_new: Pridať nový
+      add_new: Pridaj nový
       created_msg: Emailová doména bola úspešne pridaná do zoznamu zakázaných
       delete: Zmazať
       destroyed_msg: Emailová doména bola úspešne vymazaná zo zoznamu zakázaných
       domain: Doména
       new:
-        create: Pridať doménu
+        create: Pridaj doménu
         title: Nový email na zablokovanie
       title: Blokované emailové adresy
+    followers:
+      back_to_account: Späť na účet
+      title: Následovatielia užívateľa %{acct}
     instances:
-      account_count: Známe účty
-      domain_name: Doména
-      reset: Resetovať
-      search: Hľadať
       title: Známe instancie
     invites:
       deactivate_all: Pozastaviť všetky
@@ -454,6 +452,12 @@ sk:
       unhide: Ukáž v databázi
       visible: Viditeľné
     title: Spravovanie
+    warning_presets:
+      add_new: Pridaj nové
+      delete: Vymaž
+      edit: Uprav
+      edit_preset: Uprav varovnú predlohu
+      title: Spravuj varovné predlohy
   admin_mailer:
     new_report:
       body: "%{reporter} nahlásil/a %{target}"
@@ -714,9 +718,6 @@ sk:
     no_account_html: Nemáš ešte účet? Môžeš sa <a href='%{sign_up_path}' target='_blank'>zaregistrovať tu</a>
     proceed: Začni následovať
     prompt: 'Budeš sledovať:'
-  remote_interaction:
-    proceed: Pokračuj k interakcii
-    prompt: 'Chceš narábať s týmto príspevkom:'
   remote_unfollow:
     error: Chyba
     title: Názov
@@ -824,6 +825,18 @@ sk:
 
       <ul>
       <li><em>Základné informácie o účte</em>: Ak sa na tomto serveri zaregistruješ, budeš môcť byť požiadaný/á zadať prezývku, emailovú adresu a heslo. Budeš tiež môcť zadať aj ďalšie profilové údaje, ako napríklad meno a životopis, a nahrať profilovú fotku aj obrázok v záhlaví. Tvoja prezývka, meno, životopis, profilová fotka a obrázok v záhlaví sú vždy zobrazené verejne.</li><li><em>Príspevky, sledovania a iné verejné informácie</em>:
+      Zoznam ľudí, ktorých sleduješ je zobrazený verejne, a to isté platí aj pre zoznam tvojích následovateľov. Keď pošleš správu, ukladá sa jej dátum a čas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovať mediálne prílohy, ako obrázky a videá. Verejné, a nezaradené príspevky sú verejne prístupné. Keď si pripneš príspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje príspevky sú takisto doručené tvojím sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho príspevku. Ak vymažeš príspevok, táto akcia bude takisto doručená tvojím sledovateľom. Vyzdvihnutie, alebo obľúbenie iného príspevku je vždy verejne viditeľné.</li>
+
+      <li><em>Priame príspevky, a príspevky iba pre sledovateľov</em>: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj vrámci iných serverov, a kópie príspevkov sú tam uložené.
+      V dobrej viere robíme všetko preto, aby bol prístup k tímto príspevkom vymedzený iba pre oprávnených používateľov, ale môže sa stať, že iné servery v tomto ohľade zlyhajú. Preto je dôležité prezrieť si a zhodnotiť, na aké servery patria tvoji následovatelia. V nastaveniach si môžeš zapnúť voľbu ručne povoľovať a odmietať nových následovateľov.
+      <em>Prosím maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosť vidieť dané príspevky a správy, ale aj že obdŕžitelia týchto správ si ich môzu odfotiť, skopírovať, alebo ich inak zdieľať. <em>Nezdieľaj žiadne nebezpečné, alebo ohrozujúce správy pomocou Mastodonu!</em></li>
+
+       <li><em>IPky a iné metadáta</em>: Keď sa prihlásiš, zaznamenáva sa IP adresa z ktorej si sa prihlásil/a, takisto ako aj názov tvojho prehliadača. Všetky zaznamenané sezóny sú pre teba dostupné na konktolu, alebo na zamietnutie prístupu v nastaveniach. Posledná použitá IP adresa je uložená až po dobu dvanástich mesiacov. Môžeme si tiež ponechať serverové záznamy, ktoré obsahujú IP adresu každej požiadavky na tento server.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">
     title: Podmienky užívania, a pravidlá súkromia pre %{instance}
   themes:
     default: Mastodon
@@ -853,6 +866,22 @@ sk:
       explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu. Táto záloha je teraz pripravená na stiahnutie!
       subject: Tvoj archív je pripravený na stiahnutie
       title: Odber archívu
+    warning:
+      explanation:
+        disable: Pokiaľ je tvoj účet zamrazený, tvoje dáta zostávajú nedoknuté, ale nemôžeš v rámci neho nič robiť, až kým nebude odomknutý.
+        silence: Kým je tvoj účet obmedzený, tvoje hlášky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne.
+        suspend: Tvoj účet bol vylúčený, a všetky tvoje hlášky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov.
+      review_server_policies: Prehodnoť pravidlá servera
+      subject:
+        disable: Tvoj účet %{acct} bol zamrazený
+        none: Varovanie pre %{acct}
+        silence: Tvoj účet %{acct} bol obmedzený
+        suspend: Tvoj účet %{acct} bol vylúčený
+      title:
+        disable: Účet bol zamrazený
+        none: Varovanie
+        silence: Účet bol obmedzený
+        suspend: Tvoj účet bol vylúčený
     welcome:
       edit_profile_action: Nastav profil
       edit_profile_step: Profil si môžeš prispôsobiť nahratím portrétu a hlavičky, môžeš upraviť svoje meno a viac. Pokiaľ chceš preverovať nových následovateľov predtým než ťa budú môcť sledovať, môžeš uzamknúť svoj účet.
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index f35d5f09e..594c58acc 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -130,8 +130,6 @@ sl:
       most_recent_activity: Zadnja aktivnost
       most_recent_ip: Zadnji IP
       promote: Spodbujanje
-  remote_interaction:
-    prompt: 'Želite interakcijo s tem trobom:'
   statuses:
     pin_errors:
       ownership: Trob nekoga drugega ne more biti pripet
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 62ad744f3..82739c9bb 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -195,11 +195,6 @@ sr-Latn:
         title: Novo blokiranje domena
       reject_media: Odbaci multimediju
       reject_media_hint: Uklanja lokalno uskladištene multimedijske fajlove i odbija da ih skida na dalje. Nebitno je za suspenziju
-      severities:
-        noop: Ništa
-        silence: Ućutkavanje
-        suspend: Suspenzija
-      severity: Oštrina
       show:
         affected_accounts:
           few: Utiče na %{count} naloga u bazi
@@ -211,7 +206,6 @@ sr-Latn:
           suspend: Ugasi suspenzije za sve postojeće naloge sa ovog domena
         title: Poništi blokadu domena za domen %{domain}
         undo: Poništi
-      title: Blokade domena
       undo: Poništi
     email_domain_blocks:
       add_new: Dodaj novuAdd new
@@ -224,10 +218,6 @@ sr-Latn:
         title: Nova stavka u crnoj listi e-pošti
       title: Crna lista adresa e-pošte
     instances:
-      account_count: Poznati nalozi
-      domain_name: Domen
-      reset: Resetuj
-      search: Pretraga
       title: Poznate instance
     invites:
       filter:
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 8dc869c8f..e78a9b817 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -268,11 +268,6 @@ sr:
       reject_media_hint: Уклања локално ускладиштене мултимедијске фајлове и одбија да их скида убудуће. Небитно је за суспензију
       reject_reports: Одбаци извештај
       reject_reports_hint: Игнориши све извештаје који долазе са овог домена. Небитно је за суспензије
-      severities:
-        noop: Ништа
-        silence: Ућуткавање
-        suspend: Суспензија
-      severity: Оштрина
       show:
         affected_accounts:
           few: Утиче на %{count} налога у бази
@@ -284,7 +279,6 @@ sr:
           suspend: Уклони суспензије за све постојеће налоге са овог домена
         title: Поништи блокаду домена за %{domain}
         undo: Поништи
-      title: Блокаде домена
       undo: Поништи
     email_domain_blocks:
       add_new: Додај нови
@@ -297,10 +291,6 @@ sr:
         title: Нова ставка е-поштe у црној листи
       title: Црна листа E-поште
     instances:
-      account_count: Познати налози
-      domain_name: Домен
-      reset: Ресетуј
-      search: Претрага
       title: Познате инстанце
     invites:
       deactivate_all: Деактивирај све
@@ -701,9 +691,6 @@ sr:
     no_account_html: Немате налог? Можете се <a href='%{sign_up_path}' target='_blank'>пријавити овде</a>
     proceed: Наставите да би сте запратили
     prompt: 'Запратићете:'
-  remote_interaction:
-    proceed: Наставите за интеракцију
-    prompt: 'Желите да интерактирате са овом трубом:'
   remote_unfollow:
     error: Грешка
     title: Наслов
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 79040b46c..aa5b3420d 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -213,11 +213,6 @@ sv:
         title: Nytt domänblock
       reject_media: Avvisa mediafiler
       reject_media_hint: Raderar lokalt lagrade mediefiler och förhindrar möjligheten att ladda ner något i framtiden. Irrelevant för suspensioner
-      severities:
-        noop: Ingen
-        silence: Tysta ner
-        suspend: Suspendera
-      severity: Svårighet
       show:
         affected_accounts:
           one: Ett konto i databasen drabbades
@@ -227,7 +222,6 @@ sv:
           suspend: Ta bort suspendering från alla befintliga konton på den här domänen
         title: Ångra domänblockering för %{domain}
         undo: Ångra
-      title: Domänblockering
       undo: Ångra
     email_domain_blocks:
       add_new: Lägg till ny
@@ -240,10 +234,6 @@ sv:
         title: Ny E-postdomänblocklistningsinmatning
       title: E-postdomänblock
     instances:
-      account_count: Kända konton
-      domain_name: Domän
-      reset: Återställa
-      search: Sök
       title: Kända instanser
     invites:
       filter:
diff --git a/config/locales/te.yml b/config/locales/te.yml
index bde34980a..39be5b687 100644
--- a/config/locales/te.yml
+++ b/config/locales/te.yml
@@ -1,7 +1,130 @@
 ---
 te:
   about:
+    about_hashtag_html: ఇవి <strong>#%{hashtag}</strong>తో ట్గాగ్ చేయబడిన పబ్లిక్ టూట్లు. ఫెడివర్స్ లో ఎక్కడ ఖాతావున్నా వీటిలో పాల్గొనవచ్చు.
+    about_mastodon_html: మాస్టొడాన్ అనేది ఒక సామాజిక మాధ్యమం. ఇది పూర్తిగా ఉచితం మరియు స్వేచ్ఛా సాఫ్టువేరు. ఈమెయిల్ లాగానే ఇది వికేంద్రీకరించబడినది.
     about_this: గురించి
     administered_by: 'నిర్వహణలో:'
+    api: API
+    apps: మొబైల్ యాప్స్
+    closed_registrations: ప్రస్తుతం ఈ ఇన్స్టెన్స్ లో రిజిస్టేషన్లు మూసివేయబడ్డాయి. అయితే, వేరే ఇన్స్టెన్స్ లో ఖాతా తెరచికూడా ఈ ఇన్స్టెన్స్ ను అక్కడినుండే యాక్సెస్ చేయవచ్చు.
     contact: సంప్రదించండి
+    contact_missing: ఇంకా సెట్ చేయలేదు
     contact_unavailable: వర్తించదు
+    documentation: పత్రీకరణ
+    extended_description_html: |
+      <h3>నియమాలకు ఒక మంచి ప్రదేశం</h3>
+      <p>మరింత విశదీకరణ ఇంకా సెట్ చేయబడలేదు.</p>
+    features:
+      humane_approach_body: వేరే సామాజిక మాధ్యమాల వైఫల్యాల నుండి నేర్చుకుని, నైతిక రూపకల్పనలతో సామాజిక మాధ్యమాల దుర్వినియోగంపై  మాస్టొడాన్ పోరాటం చేసే లక్ష్యంతో పనిచేస్తుంది.
+      humane_approach_title: మరింత మానవత్వంతో కూడిన విధానం
+      not_a_product_body: మాస్టొడాన్ వ్యాపార సంబంధిత మాధ్యమం కాదు. ఎటువంటి ప్రకటనలు, డేటా మైనింగ్, కంచెలు లేనిది. ఏ కేంద్ర అధికరమూ లేదు.
+      not_a_product_title: మీరొక వ్యక్తి, వస్తువు కాదు.
+      real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to.
+      real_conversation_title: నిజమైన సంభాషణలకోసం నిర్మించబడింది
+      within_reach_body: ఆండ్రాయిడ్, iOS మరియు ఇతర ప్లాట్ఫాంలకు వివిధరకాల యాప్స్ వున్నాయి. డెవలపర్ సహిత API వ్యవస్థే ఇందుకు మూలకారణం. ఇవి మీ స్ణేహితులతో అన్నివేళలా అందుబాటులో వుండడానికి సహాయపడతాయి.
+      within_reach_title: ఎల్లప్పుడూ అందుబాటులో
+    generic_description: "%{domain} అనేది నెట్వర్కులోని ఒక సర్వరు"
+    hosted_on: మాస్టొడాన్ %{domain} లో హోస్టు చేయబడింది
+    learn_more: మరింత తెలుసుకోండి
+    other_instances: ఇన్స్టాన్స్ ల జాబితా
+    privacy_policy: గోప్యత విధానము
+    source_code: సోర్సు కోడ్
+    status_count_after:
+      one: స్థితి
+      other: స్థితులు
+    status_count_before: ఎవరు రాశారు
+    terms: సేవా నిబంధనలు
+    user_count_after:
+      one: వినియోగదారు
+      other: వినియోగదారులు
+    user_count_before: హోం కు
+    what_is_mastodon: మాస్టొడాన్ అంటే ఏమిటి?
+  accounts:
+    choices_html: "%{name}'s ఎంపికలు:"
+    follow: అనుసరించు
+    followers:
+      one: అనుచరి
+      other: అనుచరులు
+    following: అనుసరిస్తున్నారు
+    joined: "%{date}న చేరారు"
+    last_active: చివరిగా క్రియాశీలకంగా వుంది
+    link_verified_on: ఈ లంకె యొక్క యాజమాన్యాన్ని చివరిగా పరిశీలించింది %{date}న
+    media: మీడియా
+    moved_html: "%{name} ఈ %{new_profile_link}కు మారారు:"
+    network_hidden: ఈ సమాచారం అందుబాటులో లేదు
+    nothing_here: ఇక్కడ ఏమీ లేదు!
+    people_followed_by: "%{name} అనుసరించే వ్యక్తులు"
+    people_who_follow: "%{name}ను అనుసరించే వ్యక్తులు"
+    pin_errors:
+      following: మీరు ధృవీకరించాలనుకుంటున్న వ్యక్తిని మీరిప్పటికే అనుసరిస్తూ వుండాలి
+    posts:
+      one: టూటు
+      other: టూట్లు
+    posts_tab_heading: టూట్లు
+    posts_with_replies: టూట్లు మరియు ప్రత్యుత్తరాలు
+    reserved_username: ఈ username రిజర్వ్ చేయబడింది
+    roles:
+      admin: నిర్వాహకులు
+      bot: బోట్
+      moderator: నియంత్రికుడు
+    unfollow: అనుసరించవద్దు
+  admin:
+    account_actions:
+      action: చర్య తీసుకో
+      title: "%{acct}పై మోడరేషన్ చర్యను తీసుకో"
+    account_moderation_notes:
+      create: ఏదైనా గమనికను వదులు
+      created_msg: మోడరేషన్ గమనిక విజయవంతంగా సృష్టించబడింది!
+      delete: తీసివేయి
+      destroyed_msg: మోడరేషన్ గమనిక విజయవంతంగా తొలగించబడింది!
+    accounts:
+      are_you_sure: ఖచ్ఛితమేగా?
+      avatar: అవతారం
+      by_domain: డొమైను
+      change_email:
+        changed_msg: ఖాతా యొక్క ఈమెయిల్ విజయవంతంగా మార్చబడింది!
+        current_email: ప్రస్తుత ఈమెయిల్
+        label: ఈమెయిల్ ను మార్చు
+        new_email: కొత్త ఈమెయిల్
+        submit: ఈమెయిల్ ను మార్చు
+        title: "%{username} యొక్క ఈమెయిల్ ను మార్చు"
+      confirm: ధృవీకరించు
+      confirmed: ధృవీకరించబడింది
+      confirming: ధృవీకరిస్తుంది
+      demote: స్థానం తగ్గించు
+      disable: అచేతనం చేయి
+      disable_two_factor_authentication: 2FAను అచేతనం చేయి
+      disabled: అచేతనం చేయబడింది
+      display_name: పేరును చూపు
+      domain: డొమైను
+      edit: మార్చు
+      email: ఈమెయిల్
+      email_status: ఈమెయిల్ స్థితి
+      enable: చేతనం
+      enabled: చేతనం చేయబడింది
+      feed_url: ఫీడ్ URL
+      followers: అనుచరులు
+      followers_local: "(%{local} local)"
+      followers_url: అనుచరుల URL
+      follows: అనుసరిస్తున్నారు
+      header: Header
+      inbox_url: ఇన్ బాక్స్ URL
+      ip: IP
+      location:
+        all: అన్నీ
+        local: లోకల్
+        remote: రిమోట్
+        title: లొకేషన్
+      login_status: లాగిన్ స్థితి
+      media_attachments: మీడియా అటాచ్మెంట్లు
+      memorialize: Turn into memoriam
+      moderation:
+        active: యాక్టివ్
+        all: అన్నీ
+        silenced: నిశ్శబ్ధం చేయబడింది
+        suspended: నిషేధించబడింది
+        title: మోడరేషన్
+      moderation_notes: మోడరేషన్ నోట్స్
+      most_recent_activity: ఇటీవల యాక్టివిటీ
+      most_recent_ip: ఇటీవలి IP
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 1a1ffae3b..5be8e02c0 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -84,10 +84,6 @@ th:
         title: การบล๊อกโดเมนใหม่
       reject_media: ไม่อนุมัติไฟล์สื่อ
       reject_media_hint: ลบไฟล์สื่อที่เก็บไว้ในเครื่อง และ ป้องกันการดาวน์โหลดในอนาคต. Irrelevant for suspensions
-      severities:
-        silence: ปิดเสียง
-        suspend: หยุดไว้
-      severity: Severity
       show:
         affected_accounts:
           one: มีผลต่อหนึ่งแอคเค๊าท์ในฐานข้อมูล
@@ -97,11 +93,8 @@ th:
           suspend: ยกเลิกการหยุดทุกแอคเค๊าท์จากโดเมน
         title: ยกเลิกการบล๊อกโดเมน %{domain}
         undo: ยกเลิก
-      title: บล๊อกโดเมน
       undo: ยกเลิก
     instances:
-      account_count: Known accounts
-      domain_name: ชื่อโดเมน
       title: Known Instances
     reports:
       comment:
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index aae1549f7..c38b73f2e 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -83,10 +83,6 @@ tr:
         title: Yeni domain bloğu
       reject_media: Ortam dosyalarını reddetme
       reject_media_hint: Yerel olarak depolanmış ortam dosyalarını ve gelecekte indirilecek olanları reddeder. Uzaklaştırma için uygun değildir
-      severities:
-        silence: Sustur
-        suspend: Uzaklaştır
-      severity: İşlem
       show:
         affected_accounts:
           one: Veritabanındaki bir hesap etkilendi
@@ -96,11 +92,8 @@ tr:
           suspend: Bu domaindeki tüm hesapların üzerindeki uzaklaştırma işlemini kaldır
         title: "%{domain} domain'i için yapılan işlemi geri al"
         undo: Geri al
-      title: Domain Blokları
       undo: Geri al
     instances:
-      account_count: Bilinen hesaplar
-      domain_name: Domain
       title: Bilinen Sunucular
     reports:
       comment:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index b3fc4cd36..9a63854b5 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -237,11 +237,6 @@ uk:
         title: Нове блокування домену
       reject_media: Заборонити медіаконтент
       reject_media_hint: Видаляє медіаконтент, збережений локально, і забороняє його завантаження у майбутньому. Не має значення у випадку блокування
-      severities:
-        noop: Нічого
-        silence: Глушення
-        suspend: Блокування
-      severity: Суворість
       show:
         affected_accounts:
           few: Впливає на %{count} акаунти у базі даних
@@ -253,7 +248,6 @@ uk:
           suspend: Зняти блокування з усіх існуючих акаунтів цього домену
         title: Зняти блокування з домена %{domain}
         undo: Відмінити
-      title: Доменні блокування
       undo: Відмінити
     email_domain_blocks:
       add_new: Додати
@@ -266,10 +260,6 @@ uk:
         title: Нове доменне блокування домену email
       title: Чорний список поштових доменів
     instances:
-      account_count: Відомі аккаунти
-      domain_name: Домен
-      reset: Скинути
-      search: Пошук
       title: Відомі інстанції
     invites:
       filter:
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index d03bf1217..e482e9c41 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -246,11 +246,6 @@ zh-CN:
         title: 添加域名屏蔽
       reject_media: 拒绝接收媒体文件
       reject_media_hint: 删除本地已缓存的媒体文件,并且不再接收来自该域名的任何媒体文件。此选项不影响封禁
-      severities:
-        noop: 无
-        silence: 自动隐藏
-        suspend: 自动封禁
-      severity: 屏蔽级别
       show:
         affected_accounts:
           one: 将会影响到数据库中的 1 个帐户
@@ -260,7 +255,6 @@ zh-CN:
           suspend: 对此域名的所有帐户解除封禁
         title: 撤销对 %{domain} 的域名屏蔽
         undo: 撤销
-      title: 域名屏蔽
       undo: 撤销
     email_domain_blocks:
       add_new: 添加新条目
@@ -273,10 +267,6 @@ zh-CN:
         title: 添加电子邮件域名屏蔽
       title: 电子邮件域名屏蔽
     instances:
-      account_count: 已知帐户
-      domain_name: 域名
-      reset: 重置
-      search: 搜索
       title: 已知实例
     invites:
       deactivate_all: 撤销所有邀请链接
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 35b774120..737ca000c 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -213,11 +213,6 @@ zh-HK:
         title: 新增域名阻隔
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關
-      severities:
-        noop: 無
-        silence: 自動靜音
-        suspend: 自動刪除
-      severity: 阻隔分級
       show:
         affected_accounts: 資料庫中有%{count}個用戶受影響
         retroactive:
@@ -225,7 +220,6 @@ zh-HK:
           suspend: 對此域名的所有用戶取消除名
         title: 撤銷 %{domain} 的域名阻隔
         undo: 撤銷
-      title: 域名阻隔
       undo: 撤銷
     email_domain_blocks:
       add_new: 加入新項目
@@ -238,10 +232,6 @@ zh-HK:
         title: 新增電郵網域阻隔
       title: 電郵網域阻隔
     instances:
-      account_count: 已知帳號
-      domain_name: 域名
-      reset: 重設
-      search: 搜索
       title: 已知服務站
     invites:
       filter:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 5e209d2ff..f4bda0f34 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -218,11 +218,6 @@ zh-TW:
         title: 新增封鎖網域
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地緩存的媒體檔案,並且不再接收來自該網域的任何媒體檔案。與自動封鎖無關
-      severities:
-        noop: 無
-        silence: 自動靜音
-        suspend: 自動封鎖
-      severity: 嚴重度
       show:
         affected_accounts: 資料庫中有%{count}個使用者受影響
         retroactive:
@@ -230,7 +225,6 @@ zh-TW:
           suspend: 對此網域的所有使用者取消封鎖
         title: 撤銷 %{domain} 的網域封鎖
         undo: 撤銷
-      title: 網域封鎖
       undo: 撤銷
     email_domain_blocks:
       add_new: 加入新項目
@@ -243,10 +237,6 @@ zh-TW:
         title: 新增E-mail封鎖
       title: E-mail封鎖
     instances:
-      account_count: 已知帳戶
-      domain_name: 網域
-      reset: 重設
-      search: 搜尋
       title: 已知站點
     invites:
       filter:
diff --git a/config/navigation.rb b/config/navigation.rb
index b90e44964..5b0b5c343 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -35,8 +35,7 @@ SimpleNavigation::Configuration.run do |navigation|
       admin.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts}
       admin.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path
       admin.item :tags, safe_join([fa_icon('tag fw'), t('admin.tags.title')]), admin_tags_path
-      admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url, highlights_on: %r{/admin/instances}, if: -> { current_user.admin? }
-      admin.item :domain_blocks, safe_join([fa_icon('lock fw'), t('admin.domain_blocks.title')]), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks}, if: -> { current_user.admin? }
+      admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url(limited: '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks}, if: -> { current_user.admin? }
       admin.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_url, highlights_on: %r{/admin/email_domain_blocks}, if: -> { current_user.admin? }
     end
 
diff --git a/config/routes.rb b/config/routes.rb
index cd0692817..976b25812 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -141,7 +141,7 @@ Rails.application.routes.draw do
     get '/dashboard', to: 'dashboard#index'
 
     resources :subscriptions, only: [:index]
-    resources :domain_blocks, only: [:index, :new, :create, :show, :destroy]
+    resources :domain_blocks, only: [:new, :create, :show, :destroy]
     resources :email_domain_blocks, only: [:index, :new, :create, :destroy]
     resources :action_logs, only: [:index]
     resources :warning_presets, except: [:new]
@@ -160,11 +160,7 @@ Rails.application.routes.draw do
       end
     end
 
-    resources :instances, only: [:index] do
-      collection do
-        post :resubscribe
-      end
-    end
+    resources :instances, only: [:index, :show], constraints: { id: /[^\/]+/ }
 
     resources :reports, only: [:index, :show] do
       member do
@@ -289,6 +285,7 @@ Rails.application.routes.draw do
       resources :streaming, only: [:index]
       resources :custom_emojis, only: [:index]
       resources :suggestions, only: [:index, :destroy]
+      resources :scheduled_statuses, only: [:index, :show, :update, :destroy]
 
       resources :conversations, only: [:index, :destroy] do
         member do
diff --git a/config/settings.yml b/config/settings.yml
index bd6578bd4..4f070240a 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -1,11 +1,6 @@
-# config/app.yml for rails-settings-cached
-#
-# This file contains default values, and does not need to be edited
-# when configuring an instance.  These settings may be changed by an
-# Administrator using the Web UI.
-#
-# For more information, see docs/Running-Mastodon/Administration-guide.md
-#
+# This file contains default values, and does not need to be edited. All
+# important settings can be changed from the admin interface.
+
 defaults: &defaults
   site_title: 'dev.glitch.social'
   site_short_description: ''
@@ -57,11 +52,14 @@ defaults: &defaults
     - root
     - webmaster
     - administrator
+    - mod
+    - moderator
   disallowed_hashtags: # space separated string or list of hashtags without the hash
   bootstrap_timeline_accounts: ''
   activity_api_enabled: true
   peers_api_enabled: true
   show_known_fediverse_at_about_page: true
+
 development:
   <<: *defaults
 
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index c44af5b6c..0ec1742ab 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -6,6 +6,9 @@
   - [mailers, 2]
   - [pull]
 :schedule:
+  scheduled_statuses_scheduler:
+    every: '5m'
+    class: Scheduler::ScheduledStatusesScheduler
   subscriptions_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
     class: Scheduler::SubscriptionsScheduler
diff --git a/db/migrate/20181207011115_downcase_custom_emoji_domains.rb b/db/migrate/20181207011115_downcase_custom_emoji_domains.rb
index c9db3800d..65f1fc8d9 100644
--- a/db/migrate/20181207011115_downcase_custom_emoji_domains.rb
+++ b/db/migrate/20181207011115_downcase_custom_emoji_domains.rb
@@ -1,7 +1,15 @@
 class DowncaseCustomEmojiDomains < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
-  def change
+  def up
+    duplicates = CustomEmoji.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM custom_emojis GROUP BY shortcode, lower(domain) HAVING count(*) > 1').to_hash
+
+    duplicates.each do |row|
+      CustomEmoji.where(id: row['ids'].split(',')[0...-1]).destroy_all
+    end
+
     CustomEmoji.in_batches.update_all('domain = lower(domain)')
   end
+
+  def down; end
 end
diff --git a/db/migrate/20181226021420_add_also_known_as_to_accounts.rb b/db/migrate/20181226021420_add_also_known_as_to_accounts.rb
new file mode 100644
index 000000000..1fd956680
--- /dev/null
+++ b/db/migrate/20181226021420_add_also_known_as_to_accounts.rb
@@ -0,0 +1,5 @@
+class AddAlsoKnownAsToAccounts < ActiveRecord::Migration[5.2]
+  def change
+    add_column :accounts, :also_known_as, :string, array: true
+  end
+end
diff --git a/db/migrate/20190103124649_create_scheduled_statuses.rb b/db/migrate/20190103124649_create_scheduled_statuses.rb
new file mode 100644
index 000000000..2b78073b8
--- /dev/null
+++ b/db/migrate/20190103124649_create_scheduled_statuses.rb
@@ -0,0 +1,9 @@
+class CreateScheduledStatuses < ActiveRecord::Migration[5.2]
+  def change
+    create_table :scheduled_statuses do |t|
+      t.belongs_to :account, foreign_key: { on_delete: :cascade }
+      t.datetime :scheduled_at, index: true
+      t.jsonb :params
+    end
+  end
+end
diff --git a/db/migrate/20190103124754_add_scheduled_status_id_to_media_attachments.rb b/db/migrate/20190103124754_add_scheduled_status_id_to_media_attachments.rb
new file mode 100644
index 000000000..6f6cf2351
--- /dev/null
+++ b/db/migrate/20190103124754_add_scheduled_status_id_to_media_attachments.rb
@@ -0,0 +1,8 @@
+class AddScheduledStatusIdToMediaAttachments < ActiveRecord::Migration[5.2]
+  disable_ddl_transaction!
+
+  def change
+    add_reference :media_attachments, :scheduled_status, foreign_key: { on_delete: :nullify }, index: false
+    add_index :media_attachments, :scheduled_status_id, algorithm: :concurrently
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 48ffea3dd..2836ff91f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2018_12_19_235220) do
+ActiveRecord::Schema.define(version: 2019_01_03_124754) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -134,6 +134,7 @@ ActiveRecord::Schema.define(version: 2018_12_19_235220) do
     t.jsonb "fields"
     t.string "actor_type"
     t.boolean "discoverable"
+    t.string "also_known_as", array: true
     t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
     t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
     t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
@@ -346,7 +347,9 @@ ActiveRecord::Schema.define(version: 2018_12_19_235220) do
     t.json "file_meta"
     t.bigint "account_id"
     t.text "description"
+    t.bigint "scheduled_status_id"
     t.index ["account_id"], name: "index_media_attachments_on_account_id"
+    t.index ["scheduled_status_id"], name: "index_media_attachments_on_scheduled_status_id"
     t.index ["shortcode"], name: "index_media_attachments_on_shortcode", unique: true
     t.index ["status_id"], name: "index_media_attachments_on_status_id"
   end
@@ -497,6 +500,14 @@ ActiveRecord::Schema.define(version: 2018_12_19_235220) do
     t.index ["target_account_id"], name: "index_reports_on_target_account_id"
   end
 
+  create_table "scheduled_statuses", force: :cascade do |t|
+    t.bigint "account_id"
+    t.datetime "scheduled_at"
+    t.jsonb "params"
+    t.index ["account_id"], name: "index_scheduled_statuses_on_account_id"
+    t.index ["scheduled_at"], name: "index_scheduled_statuses_on_scheduled_at"
+  end
+
   create_table "session_activations", force: :cascade do |t|
     t.string "session_id", null: false
     t.datetime "created_at", null: false
@@ -713,6 +724,7 @@ ActiveRecord::Schema.define(version: 2018_12_19_235220) do
   add_foreign_key "list_accounts", "lists", on_delete: :cascade
   add_foreign_key "lists", "accounts", on_delete: :cascade
   add_foreign_key "media_attachments", "accounts", name: "fk_96dd81e81b", on_delete: :nullify
+  add_foreign_key "media_attachments", "scheduled_statuses", on_delete: :nullify
   add_foreign_key "media_attachments", "statuses", on_delete: :nullify
   add_foreign_key "mentions", "accounts", name: "fk_970d43f9d1", on_delete: :cascade
   add_foreign_key "mentions", "statuses", on_delete: :cascade
@@ -731,6 +743,7 @@ ActiveRecord::Schema.define(version: 2018_12_19_235220) do
   add_foreign_key "reports", "accounts", column: "assigned_account_id", on_delete: :nullify
   add_foreign_key "reports", "accounts", column: "target_account_id", name: "fk_eb37af34f0", on_delete: :cascade
   add_foreign_key "reports", "accounts", name: "fk_4b81f7522c", on_delete: :cascade
+  add_foreign_key "scheduled_statuses", "accounts", on_delete: :cascade
   add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade
   add_foreign_key "session_activations", "users", name: "fk_e5fda67334", on_delete: :cascade
   add_foreign_key "status_pins", "accounts", name: "fk_d4cb435b62", on_delete: :cascade
diff --git a/db/seeds.rb b/db/seeds.rb
index 6adfeed8d..cf62ebf39 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -4,5 +4,5 @@ if Rails.env.development?
   domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain
   admin  = Account.where(username: 'admin').first_or_initialize(username: 'admin')
   admin.save(validate: false)
-  User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, admin: true, account: admin).save!
+  User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, admin: true, account: admin, agreement: true).save!
 end
diff --git a/docker-compose.yml b/docker-compose.yml
index bd18676f1..faa066149 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -88,14 +88,13 @@ services:
 ## http_proxy=http://privoxy:8118
 ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
 #  tor:
-#    build: https://github.com/usbsnowcrash/docker-tor.git
+#    image: sirboops/tor
 #    networks:
 #      - external_network
 #      - internal_network
 #
 #  privoxy:
-#    build: https://github.com/usbsnowcrash/docker-privoxy.git
-#    command: /opt/sbin/privoxy --no-daemon --user privoxy.privoxy /opt/config
+#    image: sirboops/privoxy
 #    volumes:
 #      - ./priv-config:/opt/config
 #    networks:
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 56e02cf6c..167a309ab 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,11 +9,11 @@ module Mastodon
     end
 
     def minor
-      6
+      7
     end
 
     def patch
-      5
+      0
     end
 
     def pre
@@ -21,7 +21,7 @@ module Mastodon
     end
 
     def flags
-      ''
+      'rc1'
     end
 
     def to_a
diff --git a/package.json b/package.json
index c2a1a30c2..92470572a 100644
--- a/package.json
+++ b/package.json
@@ -10,8 +10,8 @@
     "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack",
     "manage:translations": "node ./config/webpack/translationRunner.js",
     "start": "node ./streaming/index.js",
-    "test": "npm run test:lint && npm run test:jest",
-    "test:lint": "eslint -c .eslintrc.yml --ext=js app/javascript/ config/webpack/ streaming/",
+    "test": "${npm_execpath} run test:lint && ${npm_execpath} run test:jest",
+    "test:lint": "eslint --ext=js .",
     "test:jest": "cross-env NODE_ENV=test jest --coverage"
   },
   "repository": {
@@ -21,7 +21,8 @@
   "browserslist": [
     "last 2 versions",
     "IE >= 11",
-    "iOS >= 9"
+    "iOS >= 9",
+    "not dead"
   ],
   "private": true,
   "dependencies": {
@@ -103,7 +104,7 @@
     "react-notification": "^6.8.4",
     "react-overlays": "^0.8.3",
     "react-redux": "^6.0.0",
-    "react-redux-loading-bar": "^4.1.0",
+    "react-redux-loading-bar": "^4.0.8",
     "react-router-dom": "^4.1.1",
     "react-router-scroll-4": "^1.0.0-beta.1",
     "react-select": "^2.2.0",
diff --git a/postcss.config.js b/postcss.config.js
index 84701e4ad..1c820c318 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,13 +1,7 @@
-module.exports = {
+module.exports = ({ env }) => ({
   plugins: {
-    autoprefixer: {
-      browsers: [
-        'last 2 versions',
-        'IE >= 11',
-        'iOS >= 9',
-      ],
-    },
+    autoprefixer: {},
     'postcss-object-fit-images': {},
-    cssnano: {},
+    cssnano: env === 'production' ? {} : false,
   },
-};
+});
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index 79e7fea42..129bf8883 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -7,26 +7,6 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do
     sign_in Fabricate(:user, admin: true), scope: :user
   end
 
-  describe 'GET #index' do
-    around do |example|
-      default_per_page = DomainBlock.default_per_page
-      DomainBlock.paginates_per 1
-      example.run
-      DomainBlock.paginates_per default_per_page
-    end
-
-    it 'renders domain blocks' do
-      2.times { Fabricate(:domain_block) }
-
-      get :index, params: { page: 2 }
-
-      assigned = assigns(:domain_blocks)
-      expect(assigned.count).to eq 1
-      expect(assigned.klass).to be DomainBlock
-      expect(response).to have_http_status(200)
-    end
-  end
-
   describe 'GET #new' do
     it 'assigns a new domain block' do
       get :new
@@ -53,7 +33,7 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do
 
       expect(DomainBlockWorker).to have_received(:perform_async)
       expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg')
-      expect(response).to redirect_to(admin_domain_blocks_path)
+      expect(response).to redirect_to(admin_instances_path(limited: '1'))
     end
 
     it 'renders new when failed to save' do
@@ -76,7 +56,7 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do
 
       expect(service).to have_received(:call).with(domain_block, true)
       expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.destroyed_msg')
-      expect(response).to redirect_to(admin_domain_blocks_path)
+      expect(response).to redirect_to(admin_instances_path(limited: '1'))
     end
   end
 end
diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/controllers/api/v1/conversations_controller_spec.rb
index 2e9525855..070f65061 100644
--- a/spec/controllers/api/v1/conversations_controller_spec.rb
+++ b/spec/controllers/api/v1/conversations_controller_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Api::V1::ConversationsController, type: :controller do
     let(:scopes) { 'read:statuses' }
 
     before do
-      PostStatusService.new.call(other.account, 'Hey @alice', nil, visibility: 'direct')
+      PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct')
     end
 
     it 'returns http success' do
diff --git a/spec/controllers/api/v1/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb
index f01fcd942..4e3037208 100644
--- a/spec/controllers/api/v1/media_controller_spec.rb
+++ b/spec/controllers/api/v1/media_controller_spec.rb
@@ -84,19 +84,17 @@ RSpec.describe Api::V1::MediaController, type: :controller do
         post :create, params: { file: fixture_file_upload('files/attachment.webm', 'video/webm') }
       end
 
-      xit 'returns http success' do
+      it do
+        # returns http success
         expect(response).to have_http_status(200)
-      end
 
-      xit 'creates a media attachment' do
+        # creates a media attachment
         expect(MediaAttachment.first).to_not be_nil
-      end
 
-      xit 'uploads a file' do
+        # uploads a file
         expect(MediaAttachment.first).to have_attached_file(:file)
-      end
 
-      xit 'returns media ID in JSON' do
+        # returns media ID in JSON
         expect(body_as_json[:id]).to eq MediaAttachment.first.id.to_s
       end
     end
diff --git a/spec/controllers/api/v1/notifications_controller_spec.rb b/spec/controllers/api/v1/notifications_controller_spec.rb
index 9f679cb8a..d0f82e79f 100644
--- a/spec/controllers/api/v1/notifications_controller_spec.rb
+++ b/spec/controllers/api/v1/notifications_controller_spec.rb
@@ -50,9 +50,9 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do
     let(:scopes) { 'read:notifications' }
 
     before do
-      first_status = PostStatusService.new.call(user.account, 'Test')
+      first_status = PostStatusService.new.call(user.account, text: 'Test')
       @reblog_of_first_status = ReblogService.new.call(other.account, first_status)
-      mentioning_status = PostStatusService.new.call(other.account, 'Hello @alice')
+      mentioning_status = PostStatusService.new.call(other.account, text: 'Hello @alice')
       @mention_from_status = mentioning_status.mentions.first
       @favourite = FavouriteService.new.call(other.account, first_status)
       @follow = FollowService.new.call(other.account, 'alice')
diff --git a/spec/controllers/api/v1/timelines/home_controller_spec.rb b/spec/controllers/api/v1/timelines/home_controller_spec.rb
index 63d624c35..e953e4649 100644
--- a/spec/controllers/api/v1/timelines/home_controller_spec.rb
+++ b/spec/controllers/api/v1/timelines/home_controller_spec.rb
@@ -17,7 +17,7 @@ describe Api::V1::Timelines::HomeController do
     describe 'GET #show' do
       before do
         follow = Fabricate(:follow, account: user.account)
-        PostStatusService.new.call(follow.target_account, 'New status for user home timeline.')
+        PostStatusService.new.call(follow.target_account, text: 'New status for user home timeline.')
       end
 
       it 'returns http success' do
diff --git a/spec/controllers/api/v1/timelines/list_controller_spec.rb b/spec/controllers/api/v1/timelines/list_controller_spec.rb
index 93a2be6e6..45e4bf34c 100644
--- a/spec/controllers/api/v1/timelines/list_controller_spec.rb
+++ b/spec/controllers/api/v1/timelines/list_controller_spec.rb
@@ -19,7 +19,7 @@ describe Api::V1::Timelines::ListController do
       before do
         follow = Fabricate(:follow, account: user.account)
         list.accounts << follow.target_account
-        PostStatusService.new.call(follow.target_account, 'New status for user home timeline.')
+        PostStatusService.new.call(follow.target_account, text: 'New status for user home timeline.')
       end
 
       it 'returns http success' do
diff --git a/spec/controllers/api/v1/timelines/public_controller_spec.rb b/spec/controllers/api/v1/timelines/public_controller_spec.rb
index a0f778cdc..737aedba6 100644
--- a/spec/controllers/api/v1/timelines/public_controller_spec.rb
+++ b/spec/controllers/api/v1/timelines/public_controller_spec.rb
@@ -16,7 +16,7 @@ describe Api::V1::Timelines::PublicController do
 
     describe 'GET #show' do
       before do
-        PostStatusService.new.call(user.account, 'New status from user for federated public timeline.')
+        PostStatusService.new.call(user.account, text: 'New status from user for federated public timeline.')
       end
 
       it 'returns http success' do
@@ -29,7 +29,7 @@ describe Api::V1::Timelines::PublicController do
 
     describe 'GET #show with local only' do
       before do
-        PostStatusService.new.call(user.account, 'New status from user for local public timeline.')
+        PostStatusService.new.call(user.account, text: 'New status from user for local public timeline.')
       end
 
       it 'returns http success' do
diff --git a/spec/controllers/api/v1/timelines/tag_controller_spec.rb b/spec/controllers/api/v1/timelines/tag_controller_spec.rb
index 472779f54..f71ca2a39 100644
--- a/spec/controllers/api/v1/timelines/tag_controller_spec.rb
+++ b/spec/controllers/api/v1/timelines/tag_controller_spec.rb
@@ -16,7 +16,7 @@ describe Api::V1::Timelines::TagController do
 
     describe 'GET #show' do
       before do
-        PostStatusService.new.call(user.account, 'It is a #test')
+        PostStatusService.new.call(user.account, text: 'It is a #test')
       end
 
       it 'returns http success' do
diff --git a/spec/fabricators/scheduled_status_fabricator.rb b/spec/fabricators/scheduled_status_fabricator.rb
new file mode 100644
index 000000000..52384d137
--- /dev/null
+++ b/spec/fabricators/scheduled_status_fabricator.rb
@@ -0,0 +1,4 @@
+Fabricator(:scheduled_status) do
+  account
+  scheduled_at { 20.hours.from_now }
+end
diff --git a/spec/helpers/jsonld_helper_spec.rb b/spec/helpers/jsonld_helper_spec.rb
index a5ab249c2..883a88b14 100644
--- a/spec/helpers/jsonld_helper_spec.rb
+++ b/spec/helpers/jsonld_helper_spec.rb
@@ -22,11 +22,35 @@ describe JsonLdHelper do
   end
 
   describe '#first_of_value' do
-    pending
+    context 'value.is_a?(Array)' do
+      it 'returns value.first' do
+        value = ['a']
+        expect(helper.first_of_value(value)).to be 'a'
+      end
+    end
+
+    context '!value.is_a?(Array)' do
+      it 'returns value' do
+        value = 'a'
+        expect(helper.first_of_value(value)).to be 'a'
+      end
+    end
   end
 
   describe '#supported_context?' do
-    pending
+    context "!json.nil? && equals_or_includes?(json['@context'], ActivityPub::TagManager::CONTEXT)" do
+      it 'returns true' do
+        json = { '@context' => ActivityPub::TagManager::CONTEXT }.as_json
+        expect(helper.supported_context?(json)).to be true
+      end
+    end
+
+    context 'else' do
+      it 'returns false' do
+        json = nil
+        expect(helper.supported_context?(json)).to be false
+      end
+    end
   end
 
   describe '#fetch_resource' do
diff --git a/spec/lib/activitypub/activity/move_spec.rb b/spec/lib/activitypub/activity/move_spec.rb
new file mode 100644
index 000000000..3574f273a
--- /dev/null
+++ b/spec/lib/activitypub/activity/move_spec.rb
@@ -0,0 +1,52 @@
+require 'rails_helper'
+
+RSpec.describe ActivityPub::Activity::Move do
+  let(:follower)    { Fabricate(:account) }
+  let(:old_account) { Fabricate(:account) }
+  let(:new_account) { Fabricate(:account) }
+
+  before do
+    follower.follow!(old_account)
+
+    old_account.update!(uri: 'https://example.org/alice', domain: 'example.org', protocol: :activitypub, inbox_url: 'https://example.org/inbox')
+    new_account.update!(uri: 'https://example.com/alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'https://example.com/inbox', also_known_as: [old_account.uri])
+
+    stub_request(:post, 'https://example.org/inbox').to_return(status: 200)
+    stub_request(:post, 'https://example.com/inbox').to_return(status: 200)
+
+    service_stub = double
+    allow(ActivityPub::FetchRemoteAccountService).to receive(:new).and_return(service_stub)
+    allow(service_stub).to receive(:call).and_return(new_account)
+  end
+
+  let(:json) do
+    {
+      '@context': 'https://www.w3.org/ns/activitystreams',
+      id: 'foo',
+      type: 'Move',
+      actor: old_account.uri,
+      object: old_account.uri,
+      target: new_account.uri,
+    }.with_indifferent_access
+  end
+
+  describe '#perform' do
+    subject { described_class.new(json, old_account) }
+
+    before do
+      subject.perform
+    end
+
+    it 'sets moved account on old account' do
+      expect(old_account.reload.moved_to_account_id).to eq new_account.id
+    end
+
+    it 'makes followers unfollow old account' do
+      expect(follower.following?(old_account)).to be false
+    end
+
+    it 'makes followers follow-request the new account' do
+      expect(follower.requested?(new_account)).to be true
+    end
+  end
+end
diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb
index a56158f12..df92094d1 100644
--- a/spec/lib/feed_manager_spec.rb
+++ b/spec/lib/feed_manager_spec.rb
@@ -108,21 +108,21 @@ RSpec.describe FeedManager do
 
       it 'returns false for status by followee mentioning another account' do
         bob.follow!(alice)
-        status = PostStatusService.new.call(alice, 'Hey @jeff')
+        status = PostStatusService.new.call(alice, text: 'Hey @jeff')
         expect(FeedManager.instance.filter?(:home, status, bob.id)).to be false
       end
 
       it 'returns true for status by followee mentioning blocked account' do
         bob.block!(jeff)
         bob.follow!(alice)
-        status = PostStatusService.new.call(alice, 'Hey @jeff')
+        status = PostStatusService.new.call(alice, text: 'Hey @jeff')
         expect(FeedManager.instance.filter?(:home, status, bob.id)).to be true
       end
 
       it 'returns true for status by followee mentioning muted account' do
         bob.mute!(jeff)
         bob.follow!(alice)
-        status = PostStatusService.new.call(alice, 'Hey @jeff')
+        status = PostStatusService.new.call(alice, text: 'Hey @jeff')
         expect(FeedManager.instance.filter?(:home, status, bob.id)).to be true
       end
 
@@ -162,7 +162,7 @@ RSpec.describe FeedManager do
     context 'for mentions feed' do
       it 'returns true for status that mentions blocked account' do
         bob.block!(jeff)
-        status = PostStatusService.new.call(alice, 'Hey @jeff')
+        status = PostStatusService.new.call(alice, text: 'Hey @jeff')
         expect(FeedManager.instance.filter?(:mentions, status, bob.id)).to be true
       end
 
diff --git a/spec/models/account_warning_preset_spec.rb b/spec/models/account_warning_preset_spec.rb
deleted file mode 100644
index a859a305f..000000000
--- a/spec/models/account_warning_preset_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe AccountWarningPreset, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
-end
diff --git a/spec/models/account_warning_spec.rb b/spec/models/account_warning_spec.rb
deleted file mode 100644
index 5286f9177..000000000
--- a/spec/models/account_warning_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe AccountWarning, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
-end
diff --git a/spec/models/scheduled_status_spec.rb b/spec/models/scheduled_status_spec.rb
new file mode 100644
index 000000000..f8c9d8b81
--- /dev/null
+++ b/spec/models/scheduled_status_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe ScheduledStatus, type: :model do
+end
diff --git a/spec/policies/instance_policy_spec.rb b/spec/policies/instance_policy_spec.rb
index fbfddd72f..77a3bde3f 100644
--- a/spec/policies/instance_policy_spec.rb
+++ b/spec/policies/instance_policy_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe InstancePolicy do
   let(:admin)   { Fabricate(:user, admin: true).account }
   let(:john)    { Fabricate(:user).account }
 
-  permissions :index?, :resubscribe? do
+  permissions :index? do
     context 'admin' do
       it 'permits' do
         expect(subject).to permit(admin, Instance)
diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb
index c66214555..e53623449 100644
--- a/spec/services/batched_remove_status_service_spec.rb
+++ b/spec/services/batched_remove_status_service_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe BatchedRemoveStatusService, type: :service do
   let!(:jeff)   { Fabricate(:user).account }
   let!(:hank)   { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
 
-  let(:status1) { PostStatusService.new.call(alice, 'Hello @bob@example.com') }
-  let(:status2) { PostStatusService.new.call(alice, 'Another status') }
+  let(:status1) { PostStatusService.new.call(alice, text: 'Hello @bob@example.com') }
+  let(:status2) { PostStatusService.new.call(alice, text: 'Another status') }
 
   before do
     allow(Redis.current).to receive_messages(publish: nil)
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 8f3552224..3774fed6f 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe PostStatusService, type: :service do
     account = Fabricate(:account)
     text = "test status update"
 
-    status = subject.call(account, text)
+    status = subject.call(account, text: text)
 
     expect(status).to be_persisted
     expect(status.text).to eq text
@@ -18,20 +18,31 @@ RSpec.describe PostStatusService, type: :service do
     account = Fabricate(:account)
     text = "test status update"
 
-    status = subject.call(account, text, in_reply_to_status)
+    status = subject.call(account, text: text, thread: in_reply_to_status)
 
     expect(status).to be_persisted
     expect(status.text).to eq text
     expect(status.thread).to eq in_reply_to_status
   end
 
+  it 'schedules a status' do
+    account = Fabricate(:account)
+    future  = Time.now.utc + 2.hours
+
+    status = subject.call(account, text: 'Hi future!', scheduled_at: future)
+
+    expect(status).to be_a ScheduledStatus
+    expect(status.scheduled_at).to eq future
+    expect(status.params['text']).to eq 'Hi future!'
+  end
+
   it 'creates response to the original status of boost' do
     boosted_status = Fabricate(:status)
     in_reply_to_status = Fabricate(:status, reblog: boosted_status)
     account = Fabricate(:account)
     text = "test status update"
 
-    status = subject.call(account, text, in_reply_to_status)
+    status = subject.call(account, text: text, thread: in_reply_to_status)
 
     expect(status).to be_persisted
     expect(status.text).to eq text
@@ -69,7 +80,7 @@ RSpec.describe PostStatusService, type: :service do
   end
 
   it 'creates a status with limited visibility for silenced users' do
-    status = subject.call(Fabricate(:account, silenced: true), 'test', nil, visibility: :public)
+    status = subject.call(Fabricate(:account, silenced: true), text: 'test', visibility: :public)
 
     expect(status).to be_persisted
     expect(status.visibility).to eq "unlisted"
@@ -88,7 +99,7 @@ RSpec.describe PostStatusService, type: :service do
     account = Fabricate(:account)
     text = 'This is an English text.'
 
-    status = subject.call(account, text)
+    status = subject.call(account, text: text)
 
     expect(status.language).to eq 'en'
   end
@@ -99,7 +110,7 @@ RSpec.describe PostStatusService, type: :service do
     allow(ProcessMentionsService).to receive(:new).and_return(mention_service)
     account = Fabricate(:account)
 
-    status = subject.call(account, "test status update")
+    status = subject.call(account, text: "test status update")
 
     expect(ProcessMentionsService).to have_received(:new)
     expect(mention_service).to have_received(:call).with(status)
@@ -111,7 +122,7 @@ RSpec.describe PostStatusService, type: :service do
     allow(ProcessHashtagsService).to receive(:new).and_return(hashtags_service)
     account = Fabricate(:account)
 
-    status = subject.call(account, "test status update")
+    status = subject.call(account, text: "test status update")
 
     expect(ProcessHashtagsService).to have_received(:new)
     expect(hashtags_service).to have_received(:call).with(status)
@@ -124,7 +135,7 @@ RSpec.describe PostStatusService, type: :service do
 
     account = Fabricate(:account)
 
-    status = subject.call(account, "test status update")
+    status = subject.call(account, text: "test status update")
 
     expect(DistributionWorker).to have_received(:perform_async).with(status.id)
     expect(Pubsubhubbub::DistributionWorker).to have_received(:perform_async).with(status.stream_entry.id)
@@ -135,7 +146,7 @@ RSpec.describe PostStatusService, type: :service do
     allow(LinkCrawlWorker).to receive(:perform_async)
     account = Fabricate(:account)
 
-    status = subject.call(account, "test status update")
+    status = subject.call(account, text: "test status update")
 
     expect(LinkCrawlWorker).to have_received(:perform_async).with(status.id)
   end
@@ -146,8 +157,7 @@ RSpec.describe PostStatusService, type: :service do
 
     status = subject.call(
       account,
-      "test status update",
-      nil,
+      text: "test status update",
       media_ids: [media.id],
     )
 
@@ -160,8 +170,7 @@ RSpec.describe PostStatusService, type: :service do
     expect do
       subject.call(
         account,
-        "test status update",
-        nil,
+        text: "test status update",
         media_ids: [
           Fabricate(:media_attachment, account: account),
           Fabricate(:media_attachment, account: account),
@@ -182,8 +191,7 @@ RSpec.describe PostStatusService, type: :service do
     expect do
       subject.call(
         account,
-        "test status update",
-        nil,
+        text: "test status update",
         media_ids: [
           Fabricate(:media_attachment, type: :video, account: account),
           Fabricate(:media_attachment, type: :image, account: account),
@@ -197,12 +205,12 @@ RSpec.describe PostStatusService, type: :service do
 
   it 'returns existing status when used twice with idempotency key' do
     account = Fabricate(:account)
-    status1 = subject.call(account, 'test', nil, idempotency: 'meepmeep')
-    status2 = subject.call(account, 'test', nil, idempotency: 'meepmeep')
+    status1 = subject.call(account, text: 'test', idempotency: 'meepmeep')
+    status2 = subject.call(account, text: 'test', idempotency: 'meepmeep')
     expect(status2.id).to eq status1.id
   end
 
   def create_status_with_options(**options)
-    subject.call(Fabricate(:account), 'test', nil, options)
+    subject.call(Fabricate(:account), options.merge(text: 'test'))
   end
 end
diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb
index 2134f51fd..7bba83a60 100644
--- a/spec/services/remove_status_service_spec.rb
+++ b/spec/services/remove_status_service_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe RemoveStatusService, type: :service do
     jeff.follow!(alice)
     hank.follow!(alice)
 
-    @status = PostStatusService.new.call(alice, 'Hello @bob@example.com')
+    @status = PostStatusService.new.call(alice, text: 'Hello @bob@example.com')
     Fabricate(:status, account: bill, reblog: @status, uri: 'hoge')
     subject.call(@status)
   end
diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb
index dd7561587..27a85af7c 100644
--- a/spec/services/resolve_account_service_spec.rb
+++ b/spec/services/resolve_account_service_spec.rb
@@ -119,8 +119,6 @@ RSpec.describe ResolveAccountService, type: :service do
         expect(account.actor_type).to eq 'Person'
       end
     end
-
-    pending
   end
 
   it 'processes one remote account at a time using locks' do
diff --git a/spec/validators/unreserved_username_validator_spec.rb b/spec/validators/unreserved_username_validator_spec.rb
new file mode 100644
index 000000000..0187941b0
--- /dev/null
+++ b/spec/validators/unreserved_username_validator_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UnreservedUsernameValidator, type: :validator do
+  describe '#validate' do
+    before do
+      allow(validator).to receive(:reserved_username?) { reserved_username }
+      validator.validate(account)
+    end
+
+    let(:validator) { described_class.new }
+    let(:account)   { double(username: username, errors: errors) }
+    let(:errors )   { double(add: nil) }
+
+    context '@username.nil?' do
+      let(:username)  { nil }
+
+      it 'not calls errors.add' do
+        expect(errors).not_to have_received(:add).with(:username, any_args)
+      end
+    end
+
+    context '!@username.nil?' do
+      let(:username)  { '' }
+
+      context 'reserved_username?' do
+        let(:reserved_username) { true }
+
+        it 'calls erros.add' do
+          expect(errors).to have_received(:add).with(:username, I18n.t('accounts.reserved_username'))
+        end
+      end
+
+      context '!reserved_username?' do
+        let(:reserved_username) { false }
+
+        it 'not calls erros.add' do
+          expect(errors).not_to have_received(:add).with(:username, any_args)
+        end
+      end
+    end
+  end
+end
diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb
new file mode 100644
index 000000000..e8d0e6494
--- /dev/null
+++ b/spec/validators/url_validator_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UrlValidator, type: :validator do
+  describe '#validate_each' do
+    before do
+      allow(validator).to receive(:compliant?).with(value) { compliant }
+      validator.validate_each(record, attribute, value)
+    end
+
+    let(:validator) { described_class.new(attributes: [attribute]) }
+    let(:record)    { double(errors: errors) }
+    let(:errors)    { double(add: nil) }
+    let(:value)     { '' }
+    let(:attribute) { :foo }
+
+    context 'unless compliant?' do
+      let(:compliant) { false }
+
+      it 'calls errors.add' do
+        expect(errors).to have_received(:add).with(attribute, I18n.t('applications.invalid_url'))
+      end
+    end
+
+    context 'if compliant?' do
+      let(:compliant) { true }
+
+      it 'not calls errors.add' do
+        expect(errors).not_to have_received(:add).with(attribute, any_args)
+      end
+    end
+  end
+end
diff --git a/spec/workers/publish_scheduled_status_worker_spec.rb b/spec/workers/publish_scheduled_status_worker_spec.rb
new file mode 100644
index 000000000..f8547e6fe
--- /dev/null
+++ b/spec/workers/publish_scheduled_status_worker_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe PublishScheduledStatusWorker do
+  subject { described_class.new }
+
+  let(:scheduled_status) { Fabricate(:scheduled_status, params: { text: 'Hello world, future!' }) }
+
+  describe 'perform' do
+    before do
+      subject.perform(scheduled_status.id)
+    end
+
+    it 'creates a status' do
+      expect(scheduled_status.account.statuses.first.text).to eq 'Hello world, future!'
+    end
+
+    it 'removes the scheduled status' do
+      expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil
+    end
+  end
+end
diff --git a/vendor/assets/javascripts/.keep b/vendor/.keep
index e69de29bb..e69de29bb 100644
--- a/vendor/assets/javascripts/.keep
+++ b/vendor/.keep
diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep
deleted file mode 100644
index e69de29bb..000000000
--- a/vendor/assets/stylesheets/.keep
+++ /dev/null
diff --git a/yarn.lock b/yarn.lock
index 9d50fe8c7..e66cbe2f6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7632,10 +7632,10 @@ react-overlays@^0.8.3:
     react-transition-group "^2.2.0"
     warning "^3.0.0"
 
-react-redux-loading-bar@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-4.1.0.tgz#3ca460569d979450d9d1dc992328efa449c10a7a"
-  integrity sha512-9L51ZvPqnlPs97j44FZLio6maQ/2BMP8xXFPArDWxByyLyGYs2fXpSZw+Lby9qr8Px3SsH9dylfC8HfQrmc/Mw==
+react-redux-loading-bar@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-4.0.8.tgz#e84d59d1517b79f53b0f39c8ddb40682af648c1b"
+  integrity sha512-BpR1tlYrYKFtGhxa7nAKc0dpcV33ZgXJ/jKNLpDDaxu2/cCxbkWQt9YlWT+VLw1x/7qyNYY4DH48bZdtmciSpg==
   dependencies:
     prop-types "^15.6.2"
     react-lifecycles-compat "^3.0.2"