about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.ruby-version2
-rw-r--r--.travis.yml6
-rw-r--r--Dockerfile3
-rw-r--r--Gemfile4
-rw-r--r--Gemfile.lock8
-rw-r--r--app/controllers/api/v1/timelines/home_controller.rb10
-rw-r--r--app/controllers/concerns/user_tracking_concern.rb2
-rw-r--r--app/helpers/instance_helper.rb2
-rw-r--r--app/javascript/flavours/glitch/actions/timelines.js13
-rw-r--r--app/javascript/flavours/glitch/components/missing_indicator.js9
-rw-r--r--app/javascript/flavours/glitch/components/status_list.js21
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/index.js37
-rw-r--r--app/javascript/flavours/glitch/features/list_timeline/index.js8
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/status_list_container.js1
-rw-r--r--app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg1
-rw-r--r--app/javascript/flavours/glitch/images/elephant_ui_working.svg1
-rw-r--r--app/javascript/flavours/glitch/reducers/timelines.js7
-rw-r--r--app/javascript/flavours/glitch/styles/components/drawer.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss18
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss95
-rw-r--r--app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss53
-rw-r--r--app/javascript/flavours/glitch/styles/modal.scss4
-rw-r--r--app/javascript/images/clippy_frame.pngbin0 -> 378 bytes
-rw-r--r--app/javascript/images/clippy_wave.gifbin0 -> 8897 bytes
-rw-r--r--app/javascript/images/elephant-friend-1.pngbin144967 -> 0 bytes
-rw-r--r--app/javascript/images/elephant-friend.pngbin24466 -> 0 bytes
-rw-r--r--app/javascript/images/elephant_ui_disappointed.svg1
-rw-r--r--app/javascript/images/elephant_ui_greeting.svg1
-rw-r--r--app/javascript/images/elephant_ui_plane.svg1
-rw-r--r--app/javascript/images/elephant_ui_working.svg1
-rw-r--r--app/javascript/images/icon_done.svg4
-rw-r--r--app/javascript/images/icon_follow_requests.pngbin0 -> 561 bytes
-rw-r--r--app/javascript/images/icon_keyboard_shortcuts.pngbin0 -> 384 bytes
-rw-r--r--app/javascript/images/icon_lists.pngbin0 -> 437 bytes
-rw-r--r--app/javascript/images/mailer/icon_cached.pngbin0 -> 754 bytes
-rw-r--r--app/javascript/images/mailer/icon_done.pngbin0 -> 279 bytes
-rw-r--r--app/javascript/images/mailer/icon_email.pngbin0 -> 520 bytes
-rw-r--r--app/javascript/images/mailer/icon_grade.pngbin0 -> 541 bytes
-rw-r--r--app/javascript/images/mailer/icon_lock_open.pngbin0 -> 550 bytes
-rw-r--r--app/javascript/images/mailer/icon_person_add.pngbin0 -> 512 bytes
-rw-r--r--app/javascript/images/mailer/icon_reply.pngbin0 -> 391 bytes
-rw-r--r--app/javascript/images/mailer/logo_full.pngbin0 -> 3052 bytes
-rw-r--r--app/javascript/images/mailer/logo_transparent.pngbin0 -> 627 bytes
-rw-r--r--app/javascript/images/mastodon-not-found.pngbin19560 -> 0 bytes
-rw-r--r--app/javascript/images/mastodon-ui.pngbin32449 -> 0 bytes
-rw-r--r--app/javascript/images/wave-compose-standalone.pngbin5921 -> 0 bytes
-rw-r--r--app/javascript/images/wave-drawer.pngbin3269 -> 0 bytes
-rw-r--r--app/javascript/images/wave-modal.pngbin5200 -> 0 bytes
-rw-r--r--app/javascript/mastodon/actions/timelines.js13
-rw-r--r--app/javascript/mastodon/components/missing_indicator.js9
-rw-r--r--app/javascript/mastodon/components/status_list.js21
-rw-r--r--app/javascript/mastodon/features/home_timeline/index.js37
-rw-r--r--app/javascript/mastodon/features/list_timeline/index.js8
-rw-r--r--app/javascript/mastodon/features/ui/components/onboarding_modal.js70
-rw-r--r--app/javascript/mastodon/features/ui/containers/status_list_container.js1
-rw-r--r--app/javascript/mastodon/locales/en.json3
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json4
-rw-r--r--app/javascript/mastodon/locales/sk.json4
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json6
-rw-r--r--app/javascript/mastodon/reducers/timelines.js7
-rw-r--r--app/javascript/styles/application.scss3
-rw-r--r--app/javascript/styles/mailer.scss78
-rw-r--r--app/javascript/styles/mastodon/components.scss189
-rw-r--r--app/javascript/styles/mastodon/modal.scss4
-rw-r--r--app/javascript/styles/win95.scss156
-rw-r--r--app/lib/activitypub/activity.rb5
-rw-r--r--app/mailers/user_mailer.rb11
-rw-r--r--app/models/account.rb2
-rw-r--r--app/models/account_domain_block.rb2
-rw-r--r--app/models/admin/action_log.rb4
-rw-r--r--app/models/block.rb4
-rw-r--r--app/models/conversation_mute.rb4
-rw-r--r--app/models/favourite.rb4
-rw-r--r--app/models/follow.rb5
-rw-r--r--app/models/follow_request.rb4
-rw-r--r--app/models/import.rb2
-rw-r--r--app/models/invite.rb2
-rw-r--r--app/models/list.rb2
-rw-r--r--app/models/list_account.rb6
-rw-r--r--app/models/media_attachment.rb4
-rw-r--r--app/models/mention.rb4
-rw-r--r--app/models/mute.rb4
-rw-r--r--app/models/notification.rb18
-rw-r--r--app/models/report.rb2
-rw-r--r--app/models/session_activation.rb6
-rw-r--r--app/models/status.rb12
-rw-r--r--app/models/status_pin.rb4
-rw-r--r--app/models/subscription.rb2
-rw-r--r--app/models/user.rb5
-rw-r--r--app/services/notify_service.rb2
-rw-r--r--app/services/precompute_feed_service.rb1
-rw-r--r--app/views/layouts/mailer.html.haml9
-rw-r--r--app/views/layouts/mailer.text.erb2
-rw-r--r--app/views/notification_mailer/favourite.html.haml2
-rw-r--r--app/views/notification_mailer/follow.html.haml2
-rw-r--r--app/views/notification_mailer/follow_request.html.haml2
-rw-r--r--app/views/notification_mailer/mention.html.haml2
-rw-r--r--app/views/notification_mailer/reblog.html.haml2
-rw-r--r--app/views/user_mailer/confirmation_instructions.ar.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.ca.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.en.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.es.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.fa.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.fi.text.erb5
-rw-r--r--app/views/user_mailer/confirmation_instructions.fr.text.erb14
-rw-r--r--app/views/user_mailer/confirmation_instructions.he.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.html.haml2
-rw-r--r--app/views/user_mailer/confirmation_instructions.id.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.it.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.ja.text.erb11
-rw-r--r--app/views/user_mailer/confirmation_instructions.ko.text.erb10
-rw-r--r--app/views/user_mailer/confirmation_instructions.nl.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.no.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.oc.text.erb14
-rw-r--r--app/views/user_mailer/confirmation_instructions.pl.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.pt-BR.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.ru.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.sr.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.sv.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.text.erb12
-rw-r--r--app/views/user_mailer/confirmation_instructions.tr.text.erb13
-rw-r--r--app/views/user_mailer/confirmation_instructions.zh-cn.text.erb10
-rw-r--r--app/views/user_mailer/email_changed.en.text.erb13
-rw-r--r--app/views/user_mailer/email_changed.html.haml2
-rw-r--r--app/views/user_mailer/email_changed.ja.text.erb11
-rw-r--r--app/views/user_mailer/email_changed.oc.text.erb13
-rw-r--r--app/views/user_mailer/email_changed.pl.text.erb13
-rw-r--r--app/views/user_mailer/email_changed.text.erb9
-rw-r--r--app/views/user_mailer/email_changed.zh-cn.text.erb11
-rw-r--r--app/views/user_mailer/password_change.ar.text.erb3
-rw-r--r--app/views/user_mailer/password_change.ca.text.erb3
-rw-r--r--app/views/user_mailer/password_change.en.text.erb3
-rw-r--r--app/views/user_mailer/password_change.es.text.erb3
-rw-r--r--app/views/user_mailer/password_change.fa.text.erb3
-rw-r--r--app/views/user_mailer/password_change.fi.text.erb3
-rw-r--r--app/views/user_mailer/password_change.fr.text.erb3
-rw-r--r--app/views/user_mailer/password_change.he.text.erb3
-rw-r--r--app/views/user_mailer/password_change.html.haml2
-rw-r--r--app/views/user_mailer/password_change.id.text.erb3
-rw-r--r--app/views/user_mailer/password_change.it.text.erb3
-rw-r--r--app/views/user_mailer/password_change.ja.text.erb3
-rw-r--r--app/views/user_mailer/password_change.nl.text.erb3
-rw-r--r--app/views/user_mailer/password_change.no.text.erb3
-rw-r--r--app/views/user_mailer/password_change.oc.text.erb3
-rw-r--r--app/views/user_mailer/password_change.pl.text.erb3
-rw-r--r--app/views/user_mailer/password_change.pt-BR.text.erb3
-rw-r--r--app/views/user_mailer/password_change.ru.text.erb3
-rw-r--r--app/views/user_mailer/password_change.sr-Latn.text.erb3
-rw-r--r--app/views/user_mailer/password_change.sr.text.erb3
-rw-r--r--app/views/user_mailer/password_change.sv.text.erb3
-rw-r--r--app/views/user_mailer/password_change.text.erb7
-rw-r--r--app/views/user_mailer/password_change.th.text.erb3
-rw-r--r--app/views/user_mailer/password_change.tr.text.erb8
-rw-r--r--app/views/user_mailer/password_change.zh-cn.text.erb3
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.en.text.erb12
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.html.haml2
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.ja.text.erb10
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.oc.text.erb12
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.pl.text.erb12
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.text.erb9
-rw-r--r--app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb10
-rw-r--r--app/views/user_mailer/reset_password_instructions.ar.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.ca.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.en.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.es.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.fa.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.fi.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.fr.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.he.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.html.haml2
-rw-r--r--app/views/user_mailer/reset_password_instructions.id.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.it.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.ja.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.nl.text.erb9
-rw-r--r--app/views/user_mailer/reset_password_instructions.no.text.erb9
-rw-r--r--app/views/user_mailer/reset_password_instructions.oc.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.pl.text.erb9
-rw-r--r--app/views/user_mailer/reset_password_instructions.pt-BR.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.ru.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.sr.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.sv.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.text.erb9
-rw-r--r--app/views/user_mailer/reset_password_instructions.th.text.erb8
-rw-r--r--app/views/user_mailer/reset_password_instructions.tr.text.erb13
-rw-r--r--app/views/user_mailer/reset_password_instructions.zh-cn.text.erb8
-rw-r--r--app/views/user_mailer/welcome.html.haml146
-rw-r--r--app/views/user_mailer/welcome.text.erb30
-rw-r--r--app/workers/activitypub/delivery_worker.rb2
-rw-r--r--app/workers/regeneration_worker.rb2
-rw-r--r--config/application.rb3
-rw-r--r--config/locales/ar.yml1
-rw-r--r--config/locales/bg.yml1
-rw-r--r--config/locales/ca.yml13
-rw-r--r--config/locales/de.yml1
-rw-r--r--config/locales/devise.ca.yml21
-rw-r--r--config/locales/devise.gl.yml4
-rw-r--r--config/locales/devise.ja.yml17
-rw-r--r--config/locales/devise.nl.yml4
-rw-r--r--config/locales/devise.pl.yml19
-rw-r--r--config/locales/devise.pt-BR.yml4
-rw-r--r--config/locales/devise.zh-CN.yml6
-rw-r--r--config/locales/doorkeeper.pl.yml2
-rw-r--r--config/locales/en.yml20
-rw-r--r--config/locales/eo.yml1
-rw-r--r--config/locales/es.yml1
-rw-r--r--config/locales/fa.yml1
-rw-r--r--config/locales/fi.yml1
-rw-r--r--config/locales/fr.yml1
-rw-r--r--config/locales/gl.yml8
-rw-r--r--config/locales/he.yml1
-rw-r--r--config/locales/hr.yml1
-rw-r--r--config/locales/hu.yml2
-rw-r--r--config/locales/id.yml1
-rw-r--r--config/locales/io.yml1
-rw-r--r--config/locales/it.yml1
-rw-r--r--config/locales/ja.yml17
-rw-r--r--config/locales/ko.yml1
-rw-r--r--config/locales/nl.yml13
-rw-r--r--config/locales/no.yml1
-rw-r--r--config/locales/oc.yml1
-rw-r--r--config/locales/pl.yml47
-rw-r--r--config/locales/pt-BR.yml13
-rw-r--r--config/locales/pt.yml1
-rw-r--r--config/locales/ru.yml9
-rw-r--r--config/locales/simple_form.ca.yml2
-rw-r--r--config/locales/simple_form.fr.yml2
-rw-r--r--config/locales/simple_form.ja.yml2
-rw-r--r--config/locales/simple_form.pl.yml10
-rw-r--r--config/locales/simple_form.sk.yml4
-rw-r--r--config/locales/sk.yml94
-rw-r--r--config/locales/sr-Latn.yml1
-rw-r--r--config/locales/sr.yml1
-rw-r--r--config/locales/sv.yml1
-rw-r--r--config/locales/th.yml1
-rw-r--r--config/locales/tr.yml1
-rw-r--r--config/locales/uk.yml1
-rw-r--r--config/locales/zh-CN.yml22
-rw-r--r--config/locales/zh-HK.yml1
-rw-r--r--config/locales/zh-TW.yml1
-rw-r--r--config/webpack/configuration.js2
-rw-r--r--lib/mastodon/premailer_webpack_strategy.rb3
-rw-r--r--lib/mastodon/version.rb6
-rw-r--r--lib/tasks/mastodon.rake9
-rw-r--r--spec/controllers/concerns/user_tracking_concern_spec.rb46
-rw-r--r--spec/mailers/previews/user_mailer_preview.rb5
-rw-r--r--spec/mailers/user_mailer_spec.rb10
-rw-r--r--spec/services/notify_service_spec.rb11
249 files changed, 1423 insertions, 1012 deletions
diff --git a/.ruby-version b/.ruby-version
index 8e8299dcc..437459cd9 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.4.2
+2.5.0
diff --git a/.travis.yml b/.travis.yml
index 59d495c43..496315558 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -40,20 +40,20 @@ addons:
     - yarn
 
 rvm:
-  - 2.3.4
   - 2.4.2
+  - 2.5.0
 
 services:
   - redis-server
 
 install:
+  - gem update --system
   - nvm install
   - bundle install --path=vendor/bundle --without development production --retry=3 --jobs=16
   - yarn install
 
 before_script:
-  - bundle exec rake parallel:create parallel:load_schema parallel:prepare
-  - bundle exec rails assets:precompile
+  - ./bin/rails parallel:create parallel:load_schema parallel:prepare assets:precompile
   - ln -s /usr/bin/x86_64-linux-gnu-g++-6 "$HOME/g++"
 
 script:
diff --git a/Dockerfile b/Dockerfile
index d455116da..6d8465ddc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ruby:2.4.2-alpine3.6
+FROM ruby:2.5.0-alpine3.7
 
 LABEL maintainer="https://github.com/tootsuite/mastodon" \
       description="A GNU Social-compatible microblogging server"
@@ -40,6 +40,7 @@ RUN apk -U upgrade \
     protobuf \
     su-exec \
     tini \
+    tzdata \
  && update-ca-certificates \
  && mkdir -p /tmp/src /opt \
  && wget -O yarn.tar.gz "https://github.com/yarnpkg/yarn/releases/download/v$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
diff --git a/Gemfile b/Gemfile
index 268bf3ad8..dc72851b3 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 source 'https://rubygems.org'
-ruby '>= 2.3.0', '< 2.5.0'
+ruby '>= 2.3.0', '< 2.6.0'
 
 gem 'pkg-config', '~> 1.2'
 
@@ -29,7 +29,7 @@ gem 'browser'
 gem 'charlock_holmes', '~> 0.7.5'
 gem 'iso-639'
 gem 'cld3', '~> 3.2.0'
-gem 'devise', '~> 4.3'
+gem 'devise', '~> 4.4'
 gem 'devise-two-factor', '~> 3.0'
 gem 'doorkeeper', '~> 4.2'
 gem 'fast_blank', '~> 1.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index cede4aaf7..87298fc77 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -110,7 +110,7 @@ GEM
       activesupport
     charlock_holmes (0.7.5)
     chunky_png (1.3.8)
-    cld3 (3.2.1)
+    cld3 (3.2.2)
       ffi (>= 1.1.0, < 1.10.0)
     climate_control (0.2.0)
     cocaine (0.5.8)
@@ -125,7 +125,7 @@ GEM
     css_parser (1.6.0)
       addressable
     debug_inspector (0.0.3)
-    devise (4.3.0)
+    devise (4.4.0)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
       railties (>= 4.1.0, < 5.2)
@@ -569,7 +569,7 @@ DEPENDENCIES
   charlock_holmes (~> 0.7.5)
   cld3 (~> 3.2.0)
   climate_control (~> 0.2)
-  devise (~> 4.3)
+  devise (~> 4.4)
   devise-two-factor (~> 3.0)
   doorkeeper (~> 4.2)
   dotenv-rails (~> 2.2)
@@ -651,7 +651,7 @@ DEPENDENCIES
   webpush
 
 RUBY VERSION
-   ruby 2.4.2p198
+   ruby 2.5.0p0
 
 BUNDLED WITH
    1.16.1
diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb
index db6cd8568..bbbcf7f90 100644
--- a/app/controllers/api/v1/timelines/home_controller.rb
+++ b/app/controllers/api/v1/timelines/home_controller.rb
@@ -9,7 +9,11 @@ class Api::V1::Timelines::HomeController < Api::BaseController
 
   def show
     @statuses = load_statuses
-    render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+
+    render json: @statuses,
+           each_serializer: REST::StatusSerializer,
+           relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id),
+           status: regeneration_in_progress? ? 206 : 200
   end
 
   private
@@ -57,4 +61,8 @@ class Api::V1::Timelines::HomeController < Api::BaseController
   def pagination_since_id
     @statuses.first.id
   end
+
+  def regeneration_in_progress?
+    Redis.current.exists("account:#{current_account.id}:regeneration")
+  end
 end
diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb
index 1e3132941..a2510e55f 100644
--- a/app/controllers/concerns/user_tracking_concern.rb
+++ b/app/controllers/concerns/user_tracking_concern.rb
@@ -32,7 +32,7 @@ module UserTrackingConcern
   end
 
   def regenerate_feed!
-    Redis.current.setnx("account:#{current_user.account_id}:regeneration", true) == 1 && Redis.current.expire("account:#{current_user.account_id}:regeneration", 3_600 * 24)
+    Redis.current.setnx("account:#{current_user.account_id}:regeneration", true) && Redis.current.expire("account:#{current_user.account_id}:regeneration", 1.day.seconds)
     RegenerationWorker.perform_async(current_user.account_id)
   end
 end
diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb
index 70027cca9..22a19c52b 100644
--- a/app/helpers/instance_helper.rb
+++ b/app/helpers/instance_helper.rb
@@ -6,6 +6,6 @@ module InstanceHelper
   end
 
   def site_hostname
-    Rails.configuration.x.local_domain
+    @site_hostname ||= Addressable::URI.parse("//#{Rails.configuration.x.local_domain}").display_uri.host
   end
 end
diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js
index 9a5b2e6da..3a9d64084 100644
--- a/app/javascript/flavours/glitch/actions/timelines.js
+++ b/app/javascript/flavours/glitch/actions/timelines.js
@@ -19,13 +19,14 @@ export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
 
 export const TIMELINE_CONTEXT_UPDATE = 'CONTEXT_UPDATE';
 
-export function refreshTimelineSuccess(timeline, statuses, skipLoading, next) {
+export function refreshTimelineSuccess(timeline, statuses, skipLoading, next, partial) {
   return {
     type: TIMELINE_REFRESH_SUCCESS,
     timeline,
     statuses,
     skipLoading,
     next,
+    partial,
   };
 };
 
@@ -88,7 +89,7 @@ export function refreshTimeline(timelineId, path, params = {}) {
   return function (dispatch, getState) {
     const timeline = getState().getIn(['timelines', timelineId], ImmutableMap());
 
-    if (timeline.get('isLoading') || timeline.get('online')) {
+    if (timeline.get('isLoading') || (timeline.get('online') && !timeline.get('isPartial'))) {
       return;
     }
 
@@ -104,8 +105,12 @@ export function refreshTimeline(timelineId, path, params = {}) {
     dispatch(refreshTimelineRequest(timelineId, skipLoading));
 
     api(getState).get(path, { params }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(refreshTimelineSuccess(timelineId, response.data, skipLoading, next ? next.uri : null));
+      if (response.status === 206) {
+        dispatch(refreshTimelineSuccess(timelineId, [], skipLoading, null, true));
+      } else {
+        const next = getLinks(response).refs.find(link => link.rel === 'next');
+        dispatch(refreshTimelineSuccess(timelineId, response.data, skipLoading, next ? next.uri : null, false));
+      }
     }).catch(error => {
       dispatch(refreshTimelineFail(timelineId, error, skipLoading));
     });
diff --git a/app/javascript/flavours/glitch/components/missing_indicator.js b/app/javascript/flavours/glitch/components/missing_indicator.js
index 87df7f61c..70d8c3b98 100644
--- a/app/javascript/flavours/glitch/components/missing_indicator.js
+++ b/app/javascript/flavours/glitch/components/missing_indicator.js
@@ -2,9 +2,14 @@ import React from 'react';
 import { FormattedMessage } from 'react-intl';
 
 const MissingIndicator = () => (
-  <div className='missing-indicator'>
+  <div className='regeneration-indicator missing-indicator'>
     <div>
-      <FormattedMessage id='missing_indicator.label' defaultMessage='Not found' />
+      <div className='regeneration-indicator__figure' />
+
+      <div className='regeneration-indicator__label'>
+        <FormattedMessage id='missing_indicator.label' tagName='strong' defaultMessage='Not found' />
+        <FormattedMessage id='missing_indicator.sublabel' defaultMessage='This resource could not be found' />
+      </div>
     </div>
   </div>
 );
diff --git a/app/javascript/flavours/glitch/components/status_list.js b/app/javascript/flavours/glitch/components/status_list.js
index f190ba6ab..f253f0fdc 100644
--- a/app/javascript/flavours/glitch/components/status_list.js
+++ b/app/javascript/flavours/glitch/components/status_list.js
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
 import StatusContainer from 'flavours/glitch/containers/status_container';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import ScrollableList from './scrollable_list';
+import { FormattedMessage } from 'react-intl';
 
 export default class StatusList extends ImmutablePureComponent {
 
@@ -16,6 +17,7 @@ export default class StatusList extends ImmutablePureComponent {
     trackScroll: PropTypes.bool,
     shouldUpdateScroll: PropTypes.func,
     isLoading: PropTypes.bool,
+    isPartial: PropTypes.bool,
     hasMore: PropTypes.bool,
     prepend: PropTypes.node,
     emptyMessage: PropTypes.node,
@@ -48,8 +50,23 @@ export default class StatusList extends ImmutablePureComponent {
   }
 
   render () {
-    const { statusIds, ...other } = this.props;
-    const { isLoading } = other;
+    const { statusIds, ...other }  = this.props;
+    const { isLoading, isPartial } = other;
+
+    if (isPartial) {
+      return (
+        <div className='regeneration-indicator'>
+          <div>
+            <div className='regeneration-indicator__figure' />
+
+            <div className='regeneration-indicator__label'>
+              <FormattedMessage id='regeneration_indicator.label' tagName='strong' defaultMessage='Loading&hellip;' />
+              <FormattedMessage id='regeneration_indicator.sublabel' defaultMessage='Your home feed is being prepared!' />
+            </div>
+          </div>
+        </div>
+      );
+    }
 
     const scrollableContent = (isLoading || statusIds.size > 0) ? (
       statusIds.map((statusId) => (
diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js
index 2dfec6bbe..c20c0244a 100644
--- a/app/javascript/flavours/glitch/features/home_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/index.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
+import { expandHomeTimeline, refreshHomeTimeline } from 'flavours/glitch/actions/timelines';
 import PropTypes from 'prop-types';
 import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
 import Column from 'flavours/glitch/components/column';
@@ -16,6 +16,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
+  isPartial: state.getIn(['timelines', 'home', 'isPartial'], false),
 });
 
 @connect(mapStateToProps)
@@ -26,6 +27,7 @@ export default class HomeTimeline extends React.PureComponent {
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     hasUnread: PropTypes.bool,
+    isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
@@ -57,6 +59,39 @@ export default class HomeTimeline extends React.PureComponent {
     this.props.dispatch(expandHomeTimeline());
   }
 
+  componentDidMount () {
+    this._checkIfReloadNeeded(false, this.props.isPartial);
+  }
+
+  componentDidUpdate (prevProps) {
+    this._checkIfReloadNeeded(prevProps.isPartial, this.props.isPartial);
+  }
+
+  componentWillUnmount () {
+    this._stopPolling();
+  }
+
+  _checkIfReloadNeeded (wasPartial, isPartial) {
+    const { dispatch } = this.props;
+
+    if (wasPartial === isPartial) {
+      return;
+    } else if (!wasPartial && isPartial) {
+      this.polling = setInterval(() => {
+        dispatch(refreshHomeTimeline());
+      }, 3000);
+    } else if (wasPartial && !isPartial) {
+      this._stopPolling();
+    }
+  }
+
+  _stopPolling () {
+    if (this.polling) {
+      clearInterval(this.polling);
+      this.polling = null;
+    }
+  }
+
   render () {
     const { intl, hasUnread, columnId, multiColumn } = this.props;
     const pinned = !!columnId;
diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.js b/app/javascript/flavours/glitch/features/list_timeline/index.js
index c6a89a920..f9476d92d 100644
--- a/app/javascript/flavours/glitch/features/list_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/list_timeline/index.js
@@ -120,13 +120,17 @@ export default class ListTimeline extends React.PureComponent {
     if (typeof list === 'undefined') {
       return (
         <Column>
-          <LoadingIndicator />
+          <div className='scrollable'>
+            <LoadingIndicator />
+          </div>
         </Column>
       );
     } else if (list === false) {
       return (
         <Column>
-          <MissingIndicator />
+          <div className='scrollable'>
+            <MissingIndicator />
+          </div>
         </Column>
       );
     }
diff --git a/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
index eca85b8e6..f85a2eeb8 100644
--- a/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
@@ -51,6 +51,7 @@ const makeMapStateToProps = () => {
   const mapStateToProps = (state, { timelineId }) => ({
     statusIds: getStatusIds(state, { type: timelineId }),
     isLoading: state.getIn(['timelines', timelineId, 'isLoading'], true),
+    isPartial: state.getIn(['timelines', timelineId, 'isPartial'], false),
     hasMore: !!state.getIn(['timelines', timelineId, 'next']),
   });
 
diff --git a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg b/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg
new file mode 100644
index 000000000..580c15a13
--- /dev/null
+++ b/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg>
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/images/elephant_ui_working.svg b/app/javascript/flavours/glitch/images/elephant_ui_working.svg
new file mode 100644
index 000000000..8ba475db0
--- /dev/null
+++ b/app/javascript/flavours/glitch/images/elephant_ui_working.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg>
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js
index 679e1601e..c4ae2bc97 100644
--- a/app/javascript/flavours/glitch/reducers/timelines.js
+++ b/app/javascript/flavours/glitch/reducers/timelines.js
@@ -30,7 +30,7 @@ const initialTimeline = ImmutableMap({
   items: ImmutableList(),
 });
 
-const normalizeTimeline = (state, timeline, statuses, next) => {
+const normalizeTimeline = (state, timeline, statuses, next, isPartial) => {
   const oldIds    = state.getIn([timeline, 'items'], ImmutableList());
   const ids       = ImmutableList(statuses.map(status => status.get('id'))).filter(newId => !oldIds.includes(newId));
   const wasLoaded = state.getIn([timeline, 'loaded']);
@@ -40,7 +40,8 @@ const normalizeTimeline = (state, timeline, statuses, next) => {
     mMap.set('loaded', true);
     mMap.set('isLoading', false);
     if (!hadNext) mMap.set('next', next);
-    mMap.set('items', wasLoaded ? ids.concat(oldIds) : ids);
+    mMap.set('items', wasLoaded ? ids.concat(oldIds) : oldIds.concat(ids));
+    mMap.set('isPartial', isPartial);
   }));
 };
 
@@ -125,7 +126,7 @@ export default function timelines(state = initialState, action) {
   case TIMELINE_EXPAND_FAIL:
     return state.update(action.timeline, initialTimeline, map => map.set('isLoading', false));
   case TIMELINE_REFRESH_SUCCESS:
-    return normalizeTimeline(state, action.timeline, fromJS(action.statuses), action.next);
+    return normalizeTimeline(state, action.timeline, fromJS(action.statuses), action.next, action.partial);
   case TIMELINE_EXPAND_SUCCESS:
     return appendNormalizedTimeline(state, action.timeline, fromJS(action.statuses), action.next);
   case TIMELINE_UPDATE:
diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index 11ac0a37f..0ed8c392a 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -296,7 +296,7 @@
   position: absolute;
   top: 0;
   left: 0;
-  background: lighten($ui-base-color, 13%) url('~images/wave-drawer.png') no-repeat bottom / 100% auto;
+  background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
   box-sizing: border-box;
   padding: 0;
   display: flex;
@@ -311,7 +311,7 @@
   }
 
   > .mastodon {
-    background: url('~images/mastodon-ui.png') no-repeat left bottom / contain;
+    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
     flex: 1;
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 8f051f7a0..8f06209c6 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -838,21 +838,10 @@
 }
 
 .missing-indicator {
-  text-align: center;
-  font-size: 16px;
-  font-weight: 500;
-  color: lighten($ui-base-color, 16%);
-  background: $ui-base-color;
-  cursor: default;
-  display: flex;
-  flex: 1 1 auto;
-  align-items: center;
-  justify-content: center;
+  padding-top: 20px + 48px;
 
-  & > div {
-    background: url('~images/mastodon-not-found.png') no-repeat center -50px;
-    padding-top: 210px;
-    width: 100%;
+  .regeneration-indicator__figure {
+    background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg');
   }
 }
 
@@ -1162,6 +1151,7 @@ noscript {
 @import 'metadata';
 @import 'composer';
 @import 'columns';
+@import 'regeneration_indicator';
 @import 'search';
 @import 'emoji';
 @import 'doodle';
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index c12f56828..1ac399fa1 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -77,13 +77,12 @@
   height: 80vh;
   width: 80vw;
   max-width: 520px;
-  max-height: 420px;
+  max-height: 470px;
 
   .react-swipeable-view-container > div {
     width: 100%;
     height: 100%;
     box-sizing: border-box;
-    padding: 25px;
     display: none;
     flex-direction: column;
     align-items: center;
@@ -156,23 +155,32 @@
   .onboarding-modal__nav,
   .error-modal__nav {
     color: darken($ui-secondary-color, 34%);
-    background-color: transparent;
     border: 0;
     font-size: 14px;
     font-weight: 500;
-    padding: 0;
+    padding: 10px 25px;
     line-height: inherit;
     height: auto;
+    margin: -10px;
+    border-radius: 4px;
+    background-color: transparent;
 
     &:hover,
     &:focus,
     &:active {
       color: darken($ui-secondary-color, 38%);
+      background-color: darken($ui-secondary-color, 16%);
     }
 
     &.onboarding-modal__done,
     &.onboarding-modal__next {
-      color: $ui-highlight-color;
+      color: $ui-base-color;
+
+      &:hover,
+      &:focus,
+      &:active {
+        color: darken($ui-base-color, 4%);
+      }
     }
   }
 }
@@ -208,6 +216,8 @@
 
 .onboarding-modal__page__wrapper {
   pointer-events: none;
+  padding: 25px;
+  padding-bottom: 0;
 
   &.onboarding-modal__page__wrapper--active {
     pointer-events: auto;
@@ -235,6 +245,10 @@
     }
   }
 
+  .navigation-bar a {
+    color: inherit;
+  }
+
   p {
     font-size: 16px;
     color: lighten($ui-base-color, 8%);
@@ -262,29 +276,56 @@
   }
 }
 
-.onboarding-modal__page-one {
-  display: flex;
-  align-items: center;
+.onboarding-modal__page__wrapper-0 {
+  background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px;
+  height: 100%;
+  padding: 0;
 }
 
-.onboarding-modal__page-one__elephant-friend {
-  background: url('~images/elephant-friend-1.png') no-repeat center center / contain;
-  width: 155px;
-  height: 193px;
-  margin-right: 15px;
+.onboarding-modal__page-one {
+  &__lead {
+    padding: 65px;
+    padding-top: 45px;
+    padding-bottom: 0;
+    margin-bottom: 10px;
+
+    h1 {
+      font-size: 26px;
+      line-height: 36px;
+      margin-bottom: 8px;
+    }
+
+    p {
+      margin-bottom: 0;
+    }
+  }
+
+  &__extra {
+    padding-right: 65px;
+    padding-left: 185px;
+    text-align: center;
+  }
 }
 
-@media screen and (max-width: 400px) {
-  .onboarding-modal__page-one {
-    flex-direction: column;
-    align-items: normal;
+.display-case {
+  text-align: center;
+  font-size: 15px;
+  margin-bottom: 15px;
+
+  &__label {
+    font-weight: 500;
+    color: $ui-base-color;
+    margin-bottom: 5px;
+    text-transform: uppercase;
+    font-size: 12px;
   }
 
-  .onboarding-modal__page-one__elephant-friend {
-    width: 100%;
-    height: 30vh;
-    max-height: 160px;
-    margin-bottom: 5vh;
+  &__case {
+    background: $ui-base-color;
+    color: $ui-secondary-color;
+    font-weight: 500;
+    padding: 10px;
+    border-radius: 4px;
   }
 }
 
@@ -374,16 +415,6 @@
   }
 }
 
-.onboarding-modal__image {
-  border-radius: 8px;
-  width: 70vw;
-  max-width: 450px;
-  max-height: auto;
-  display: block;
-  margin: auto;
-  margin-bottom: 20px;
-}
-
 .onboard-sliders {
   display: inline-block;
   max-width: 30px;
diff --git a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss
new file mode 100644
index 000000000..9c1873cdf
--- /dev/null
+++ b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss
@@ -0,0 +1,53 @@
+.regeneration-indicator {
+  text-align: center;
+  font-size: 16px;
+  font-weight: 500;
+  color: lighten($ui-base-color, 16%);
+  background: $ui-base-color;
+  cursor: default;
+  display: flex;
+  flex: 1 1 auto;
+  align-items: center;
+  justify-content: center;
+  padding: 20px;
+
+  & > div {
+    width: 100%;
+    background: transparent;
+    padding-top: 0;
+  }
+
+  &__figure {
+    background: url('~flavours/glitch/images/elephant_ui_working.svg') no-repeat center 0;
+    width: 100%;
+    height: 160px;
+    background-size: contain;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
+
+  &.missing-indicator {
+    padding-top: 20px + 48px;
+
+    .regeneration-indicator__figure {
+      background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg');
+    }
+  }
+
+  &__label {
+    margin-top: 200px;
+
+    strong {
+      display: block;
+      margin-bottom: 10px;
+      color: lighten($ui-base-color, 34%);
+    }
+
+    span {
+      font-size: 15px;
+      font-weight: 400;
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss
index a17476ccb..ceb79bbb9 100644
--- a/app/javascript/flavours/glitch/styles/modal.scss
+++ b/app/javascript/flavours/glitch/styles/modal.scss
@@ -1,5 +1,5 @@
 .modal-layout {
-  background: $ui-base-color url('~images/wave-modal.png') repeat-x bottom fixed;
+  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}"/></svg>') repeat-x bottom fixed;
   display: flex;
   flex-direction: column;
   height: 100vh;
@@ -15,6 +15,6 @@
   > * {
     flex: 1;
     max-height: 235px;
-    background: url('~images/mastodon-ui.png') no-repeat left bottom / contain;
+    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
   }
 }
diff --git a/app/javascript/images/clippy_frame.png b/app/javascript/images/clippy_frame.png
new file mode 100644
index 000000000..7f2cd6a59
--- /dev/null
+++ b/app/javascript/images/clippy_frame.png
Binary files differdiff --git a/app/javascript/images/clippy_wave.gif b/app/javascript/images/clippy_wave.gif
new file mode 100644
index 000000000..4d2e38a3d
--- /dev/null
+++ b/app/javascript/images/clippy_wave.gif
Binary files differdiff --git a/app/javascript/images/elephant-friend-1.png b/app/javascript/images/elephant-friend-1.png
deleted file mode 100644
index 2b2383330..000000000
--- a/app/javascript/images/elephant-friend-1.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/elephant-friend.png b/app/javascript/images/elephant-friend.png
deleted file mode 100644
index 3c5145ba9..000000000
--- a/app/javascript/images/elephant-friend.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/elephant_ui_disappointed.svg b/app/javascript/images/elephant_ui_disappointed.svg
new file mode 100644
index 000000000..580c15a13
--- /dev/null
+++ b/app/javascript/images/elephant_ui_disappointed.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_greeting.svg b/app/javascript/images/elephant_ui_greeting.svg
new file mode 100644
index 000000000..f3eb4b142
--- /dev/null
+++ b/app/javascript/images/elephant_ui_greeting.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="266.89999" width="463.97818" viewBox="0 0 463.97818 266.89999"><g transform="translate(-184 -205.1)"><defs><path id="a" d="M184 151h494.79999v321H184z"/></defs><clipPath id="b"><use height="100%" width="100%" xlink:href="#a" overflow="visible"/></clipPath><path clip-path="url(#b)" d="M525.7 478c-.5 0-.9-.2-1.2-.6-.3-.4-.4-.9-.2-1.3.2-.6 20-65 22-72 .2-.7.5-1.4.9-2.1.1-.4.3-.8.6-1.1l.3-.3c8.2-11.9 29.8-12.9 36.2-12.9 2.4 0 5 .1 7.6.3 13.6.9 25.2 3.7 33.6 8 6.4 3.3 10.7 7.4 12.2 11.8.1.2.2.4.2.6.2.6.3 1.3.4 1.9.6 5.4-1 13.6-2 18.5-1 5-11.9 47.7-12 48.1-.2.7-.8 1.1-1.5 1.1h-97.1z"/></g><g transform="translate(-184 -205.1)"><defs><path id="c" d="M184 151h494.79999v321H184z"/></defs><clipPath id="d"><use height="100%" width="100%" xlink:href="#c" overflow="visible"/></clipPath><path clip-path="url(#d)" d="M414.9 482.9c-.6 0-1.2-.4-1.4-.9H295.2l-81.3.8c-.6 0-1.1-.3-1.3-.8h-33.9c-.8 0-1.5-.7-1.5-1.5v-168c0-.3.1-.7.3-.9l2.9-3.8c-1.4-3-5.5-12.9-2.1-21.9-.2-.4-.3-.8-.5-1.2-1.9-5-2.6-10.8-2.3-17.1 0-1.1.1-2.2.3-3.3l.4-3.1.4-2.1c.5-3.2 1.3-6 2.2-8.4 2-5.4 5.5-10.4 10-14.3 4.1-3.6 9.1-6.5 15-8.6 7.6-2.7 16.2-4.1 25.5-4.1 2.4 0 5 .1 7.5.3 2.1-3.2 4.6-5.8 7.3-7.8 1.6-1.3 3.3-2.3 4.9-3.1 1.6-.8 3.5-1.7 5.4-2.2 2.9-.9 6.2-1.4 9.6-1.4.6 0 1.3 0 1.9.1 3.6.2 7.1 1 10.5 2.4 4.4-3.1 9.4-5.2 14.6-6.2 2.3-.4 4.7-.7 7.1-.7 3.3 0 6.5.4 9.6 1.3 2.8.8 5.5 1.8 7.8 3 2.5 1.3 4.8 2.9 6.9 4.7 3.9 3.3 7.2 7.6 9.5 12.5 7.9.2 15.5 3.2 21.7 8.3 3.2 2.7 5.9 5.9 7.9 9.4 2.1 3.6 3.5 7.5 4.2 11.5.7 3.7.7 7.8.2 12.2-.6 5-1.5 8.6-3 11.9-.8 1.8-1.9 3.5-3.3 5.3-1.4 1.6-2.6 2.9-3.9 4 25.8 10.3 47.4 26.8 62.7 48 8.3 11.3 16 24.7 22.9 39.7 7.1-5.1 14.6-12.5 23.2-23.3 22.7-28.1 60.2-50.7 89-53.6 4.5-.4 9-.7 13.3-.7 18.2 0 30.4 3.9 34.1 5.3 1.8-3.1 7.3-11.3 15.7-11.3 1.5 0 3 .3 4.5.8 4.6 1.5 7.8 4.3 9.4 8.2 1.5 3.5 1.3 7.4.7 10.5 1-.3 2.1-.5 3.4-.5 3.3 0 6.4 1.4 9.2 4.2 3.8 3.8 5.2 10.5 3.4 16.5-1.5 4.9-6.3 13.7-22.2 17-5.9 1.2-11.5 1.8-16.7 1.8-11.1 0-17.2-2.8-18.9-3.8-3.9.6-37.3 6.7-56.4 42.2-3.7 6.9-8.6 15.8-14 24.3 2.8 6.9 3.5 16 2.2 26.3-2.5 18.9-10 40-10.1 40.2-.2.6-.8 1-1.4 1l-94.8.9z"/></g><g transform="translate(-184 -205.1)"><defs><path id="e" d="M184 151h494.79999v321H184z"/></defs><clipPath id="f"><use height="100%" width="100%" xlink:href="#e" overflow="visible"/></clipPath><g clip-path="url(#f)"><path d="M414.9 481.4c-8.2-22.8-2.2-33.8 10.8-38.8s27 0 40 24c0 0 7-5 11-25s10-38 27-38c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9z" fill="#ebded8" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M415.1 480.7c-6.4-18.1-4.1-29.8 7-35.9 6.6 4 12.9 11.4 18.7 22.1l.3.5.5-.3c.2-.2 5.6-4.2 9.7-18.8 4.9 4.2 9.6 10.5 14 18.6l-3.7-3.4-.8-1.9c.3-.2 12.4.2 16.4-19.8 2.4-11.8 5.7-24.7 12.7-31.8 4.9 6.5 6.7 17.6 5 30.7-2.3 17.4-8.9 36.7-9.9 39.4l-69.9.6z" class="st4" fill="#fff"/><path d="M469.8 480.5H178.7v-168l3.5-4.5c61-42 180-46.3 235 30" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.2 338c-55.6-75.9-174-72-235-30l-3.5 4.5v168h291.1S458.9 395 417.2 338z" class="st6" fill="#fccf84"/><path d="M416.8 338.3c-6.4-8.7-13.8-16.6-22-23.5-8.2-6.9-17.3-12.8-26.9-17.7-19.2-9.8-40.4-15.4-61.8-17.4-21.4-2-43.2-.7-64.3 4-10.5 2.3-20.9 5.5-30.8 9.6-10 4.1-19.6 9.1-28.5 15.1l.1-.1-3.5 4.5.1-.3v168l-.5-.5h291.1l-.5.6c-1.8-12.6-4.4-25.1-7.4-37.5-3.1-12.4-6.6-24.6-10.9-36.7-4.2-12-9-23.9-14.7-35.3-2.8-5.7-5.9-11.3-9.1-16.8-3.2-5.5-6.7-10.8-10.4-16zm.8-.6c3.8 5.2 7.3 10.5 10.6 16 3.2 5.5 6.4 11.1 9.2 16.9 5.7 11.5 10.6 23.3 14.9 35.4 4.3 12.1 7.9 24.3 11 36.8 3.1 12.4 5.8 24.9 7.7 37.6.1.7-.4 1.3-1.1 1.4h-.2l-291-.8c-.3 0-.5-.2-.5-.5v-168c0-.1 0-.2.1-.3l3.5-4.5.1-.1c9-6.1 18.6-11.1 28.6-15.2s20.4-7.3 31-9.6c21.1-4.7 43-6.1 64.6-4 21.5 2.1 42.8 7.7 62.2 17.5 9.7 4.9 18.8 10.9 27.1 17.8s15.8 14.9 22.2 23.6z"/><path d="M182.3 479.7V323.5s42.9-30 87.3 15.6 79.6 126 148 110.2c56.4-13-17 21.8-17 21.8l-218.3 8.6z" class="st7" fill="#b88671"/><path d="M179.2 312.7l3.3-4.3c16.5-11.3 37.2-19.9 60.1-24.9l79.2.8c1 .5 9.3 4.6 9 10.1-.2 3.6-4.5 9.2-23.3 15-40.8 12.5-119.2 21.1-126.2 21.8l-2.1-18.5z" class="st7" fill="#b88671"/><path d="M181.1 283.7c-6.4 10.6 1.1 24.3 1.1 24.3l11.7-7.5-12.8-16.8z" fill="#a6725c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M646.4 325.7c-.2.2-.4.5-.6.8-4.6 8.1-16.2 13.7-32.9 13.7s-25.8-8.1-25.8-8.1c-65.8 3.5-80.5 51.6-124.5 93.1-44 41.5-131.1 34.9-220.8 17l-7.5 8.8 4.5 29.4s221.6-.5 230.5-.5c-1.6-12.3-2.6-16.4-2.6-16.4 31.7-17.9 49.4-44.9 65.1-74.1 21-39 58-43 58-43s11 7 35 2c17.1-3.5 22.5-14.3 21.6-22.7z" class="st7" fill="#b88671"/><path d="M241.8 392.5c-3.8 0-7-3.1-7.1-6.9l-.2-28c0-3.8 3.1-7 6.9-7.1 3.8 0 7 3.1 7.1 6.9l.2 28c.1 3.9-3 7.1-6.9 7.1zm157.5 0c-3.8.1-7.1-3-7.2-6.8l-.7-28c-.1-3.8 3-7.1 6.8-7.2 3.8-.1 7.1 3 7.2 6.8l.7 28c.1 3.9-2.9 7.1-6.8 7.2z"/><path d="M213.9 482.3c-.4 0-.8-.3-.9-.7-7.6-21.1-3.9-34.2 11.4-40.1 3.1-1.2 6.3-1.8 9.3-1.8 11.5 0 22 8.5 31.3 25.1 1.9-2 6.7-8.4 9.8-23.6 4-20.2 10.2-38.8 28-38.8 4.1 0 7.8 1.8 10.8 5.1 5.8 6.6 8.1 18.7 6.2 33-2.5 18.8-10 39.9-10.1 40.1-.1.4-.5.7-.9.7-.1.1-94.9 1-94.9 1z" class="st4" fill="#fff"/><path d="M302.7 403.5c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9c-8.2-22.8-2.2-33.8 10.8-38.8 2.9-1.1 5.9-1.8 9-1.8 10.3 0 21 7.2 31 25.8 0 0 7-5 11-25s10-38 27-38m0-2c-18.5 0-24.8 19-29 39.6-2.6 12.9-6.4 19.3-8.6 22.1-9.3-16.2-19.9-24.4-31.5-24.4-3.2 0-6.4.6-9.7 1.9-7.5 2.9-12.4 7.6-14.5 14-2.4 7-1.5 16 2.6 27.4.3.8 1 1.3 1.9 1.3l94.8-.9c.8 0 1.6-.5 1.9-1.3.1-.2 7.6-21.3 10.1-40.3 1.9-14.6-.5-26.9-6.5-33.8-3.2-3.7-7.1-5.6-11.5-5.6z"/><path d="M282.8 480.7c7.3-7 11.4-16.5 13.5-23.5 2.1-6.9 6.8-29.2 7.8-36.6.4-3.1 1.9-10.4 6.8-10.4 1 0 2.7.5 3.9 1.1 4.2 6.7 5.4 17 3.7 29.7-2.3 17.4-8.9 36.7-9.9 39.4l-25.8.3zm-69.3.1c-7.1-20-3.6-32.6 10.6-38.1.5-.2.9-.3 1.3-.5-1.5 1.3-2.6 3.2-3.4 5.3-2.4 6.3-.9 15.2 4 24.3 2 3.6 4 6.6 6.1 8.9l-18.6.1z" class="st9" fill="#ebded8"/><path d="M264.8 465.8c-4 4-7 5-7 5" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M525.7 476.5s20-65 22-72 15-17 44-15 44 12 45 21c.6 5.1-1 13-2 18s-12 48-12 48h-97z" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M550.8 475.7l18-59.1c2.3.6 13.2 3.2 27.4 3.2 5.1 0 10.1-.3 14.9-1 16.8-2.2 21.9-3.9 25.1-8.9v.3c.6 5.1-1 13.1-2 17.8-.9 4.7-10.8 43.3-11.9 47.6h-71.5v.1z" class="st7" fill="#b88671"/><path d="M548.9 401.8c-2.2 2.7 4.8 11.7 23.8 15.7s44 1 53-1 10.6-7.9 10.6-7.9m-49 11.1c-.6 10.8 3.4 14.8 7.4 14.8s8.5-6.6 8.3-15.1m-2.4 10.6c1.1 5.5 6.1 5.5 9.1 4.5s6-5 5-16m-.7 10.9c1.6 4.1 5.9 4.1 8.7 3.2 3-1 6-5 5-16" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M355.3 266.5c-2.1-17.9-8.8-23.1-21.6-26.6.5 5.9-.4 9.5-.7 10.7-.6 2.4-1.6 4.2-3.1 4.2-1 0-1.9-.7-2.2-1.8-.2-.7-.4-1.6-.6-2.8-.4-2.1-1-5.3-2.5-10.3-3.6-12.7-15.3-18.4-25.3-18.4-3.7 0-7.5 1.1-10.4 2.5 12.1 15.4 3.5 31.3 1.6 34.5-3.1 5.3-8.9 6-9.1 6l-.8.1c-1.2.1-1.7-.6-.9-1.2.8-.6 1.9-1.6 2.3-2.9.9-4 1.5-11.4-1.7-21.6-3.2-10-14.4-17.3-26.6-17.3-5.5 0-11 1.5-15.7 4.4l-.1.1h-.2c-2.6-.2-5.3-.3-7.9-.3-27.4 0-46.3 11.5-50.5 30.8-5.5 24.8 2.8 41.9 24.7 49.5 20.8 7.3 45.4 8.4 52.5 8.6h3.4c15.5 0 40.5-3.2 58.7-9 10.6-3.4 20.5-8.5 24.2-10.4.9-.5 1.5-.8 1.6-.8 2.6-1.5 2.3-1.3 4.1-2.6 4.3-4.7 8-15.2 6.8-25.4z" class="st12" fill="#a6725c"/><path d="M288.7 261c3.5-4.6 5.7-10.2 6.1-16.3 1-13.4-6.7-26-18.3-31.1" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M331.4 227.9c2.5 5.9 3.3 12.4 2.5 18.7 0 .1-.1.1-.1.1-.1 0-.1-.1-.1-.1.6-6.3-.5-12.6-3.2-18.3-.1-.3 0-.5.2-.7.3-.1.6 0 .7.3z"/><path d="M237.9 226.2c-4.1 7.2-3.8 14.9-5 20.8-.8 3.7-5.7 14.4-12.7 19.3" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M367.7 358.5c0 16 18 30 40 30s37-8 58-34 58-50 88-53 48 5 48 5 7-15 19-11 10 16 8 20c0 0 7-5 14 2s6 26-18 31-35-2-35-2-37 4-58 43-42 72-101 88" class="st6" fill="#fccf84"/><path d="M368.2 358.5c.1 2.8.7 5.6 1.8 8.2.3.6.6 1.3 1 1.9l.5.9.6.9c.4.6.8 1.2 1.2 1.7l1.4 1.6c.4.6 1 1 1.5 1.5l1.5 1.5c1.1.9 2.1 1.8 3.4 2.6l1.8 1.2 1.9 1c1.2.7 2.5 1.3 3.8 1.9 5.2 2.3 10.9 3.4 16.5 3.7 5.7.2 11.4-.2 17-1.4 5.5-1.2 10.8-3.4 15.6-6.4 4.9-3 9.3-6.6 13.4-10.5 1-1 2.1-2 3.1-3l3-3.1c1.9-2.2 3.9-4.3 5.7-6.5 1.8-2.2 3.8-4.4 5.7-6.7.9-1.1 2-2.1 3-3.2s2-2.2 3.1-3.2c8.3-8.2 17.4-15.7 27.3-22 9.8-6.3 20.2-11.9 31.3-15.7 2.7-1 5.6-1.8 8.4-2.6 1.4-.4 2.9-.6 4.3-1l2.2-.5 2.2-.3c1.5-.2 2.9-.5 4.4-.6l4.4-.3c2.9-.1 5.8-.2 8.8-.2 5.8.1 11.7.5 17.5 1.5 2.9.5 5.8 1 8.6 1.8 2.8.7 5.6 1.6 8.4 2.7l-.7.2c1.9-3.7 4.4-7 7.9-9.5 1.7-1.2 3.7-2.1 5.8-2.4 2.1-.3 4.3 0 6.2.7 2 .7 3.8 1.7 5.4 3.1 1.6 1.4 2.7 3.3 3.4 5.2.7 2 .9 4.1.7 6.2-.1 2.1-.6 4.1-1.5 6.1l-.7-.6c1.8-1.1 3.8-1.7 5.9-1.8 2.1 0 4.2.5 5.9 1.6 1.8 1.1 3.3 2.5 4.4 4.2l.8 1.3.6 1.4c.2.5.3 1 .4 1.5.1.5.3 1 .3 1.5.6 4-.2 8.2-2.2 11.8-2 3.5-5.1 6.3-8.6 8.3-3.5 2-7.4 3.2-11.2 4.1-3.9.8-7.8 1.4-11.8 1.6-4 .2-8 .2-11.9-.3-2-.3-3.9-.6-5.9-1.2-1.9-.6-3.8-1.2-5.6-2.2l.3.1c-4.3.6-8.6 1.9-12.8 3.4-4.1 1.5-8.2 3.4-12 5.6-7.7 4.3-14.6 10-20.5 16.6-2.9 3.3-5.6 6.8-8 10.5-2.4 3.7-4.4 7.6-6.6 11.5-4.3 7.8-8.7 15.6-13.5 23.1-4.9 7.5-10.3 14.6-16.4 21.2l-2.3 2.4c-.8.8-1.5 1.6-2.4 2.4l-4.9 4.6c-3.5 2.9-6.9 5.8-10.6 8.3l-2.7 2c-.9.6-1.9 1.2-2.9 1.8-1.9 1.2-3.8 2.4-5.8 3.5-4 2.1-7.9 4.3-12.1 6l-3.1 1.4-1.5.7c-.5.2-1 .4-1.6.6l-6.3 2.3c-2.1.8-4.2 1.4-6.4 2.1l-6.4 2c-.5.1-1-.1-1.1-.6-.1-.5.1-1 .6-1.1l6.4-1.9c2.1-.7 4.3-1.2 6.3-2l6.2-2.3c.5-.2 1-.4 1.6-.6l1.5-.7 3-1.3c4.1-1.7 8-3.8 11.9-5.8 1.9-1.1 3.8-2.3 5.7-3.4.9-.6 1.9-1.1 2.8-1.8l2.7-1.9c3.7-2.5 7.1-5.3 10.5-8.1l4.9-4.5c.8-.7 1.6-1.6 2.3-2.4l2.3-2.4c6-6.5 11.4-13.6 16.3-21s9.3-15.1 13.6-22.9c2.1-3.9 4.2-7.9 6.7-11.6 2.5-3.7 5.2-7.3 8.2-10.6 6-6.6 13.1-12.3 20.9-16.7 3.9-2.2 8-4.1 12.2-5.6 4.2-1.5 8.5-2.8 13-3.4.1 0 .2 0 .3.1 1.6.9 3.5 1.6 5.4 2.1 1.9.5 3.8.9 5.7 1.1 3.9.5 7.8.6 11.7.3 7.8-.7 15.8-1.8 22.6-5.6 3.3-2 6.3-4.6 8.2-8 2-3.3 2.7-7.3 2.1-11.1 0-.5-.2-.9-.3-1.4-.1-.5-.2-.9-.4-1.4l-.5-1.3-.7-1.2c-1-1.6-2.5-2.9-4.1-3.9-1.6-1-3.5-1.5-5.4-1.5-1.9 0-3.8.6-5.3 1.6-.2.2-.5.1-.7-.2-.1-.1-.1-.3 0-.5.8-1.7 1.3-3.7 1.4-5.7.1-2-.1-4-.7-5.8-.6-1.8-1.7-3.5-3.1-4.8-1.5-1.3-3.2-2.2-5.1-2.9-.9-.3-1.9-.6-2.8-.7-1-.1-1.9-.1-2.9 0-1.9.3-3.7 1.1-5.4 2.2-3.2 2.3-5.7 5.6-7.5 9.1-.1.2-.4.4-.6.2-2.6-1.1-5.4-1.9-8.2-2.6-2.8-.7-5.6-1.3-8.5-1.7-5.7-.9-11.5-1.3-17.3-1.3-5.8 0-11.6.2-17.3 1.1l-2.1.3-2.1.5c-1.4.3-2.8.6-4.2 1-2.8.8-5.6 1.5-8.3 2.6-10.9 3.8-21.2 9.3-30.9 15.6-9.7 6.3-18.7 13.7-26.9 21.9-1.1 1-2 2.1-3 3.1-1 1.1-2 2.1-2.9 3.2-1.9 2.2-3.8 4.4-5.6 6.7-1.8 2.3-3.8 4.4-5.7 6.6l-3 3.2c-1 1.1-2.1 2.1-3.1 3.1-4.2 4-8.7 7.8-13.7 10.8-5 3.1-10.5 5.4-16.2 6.6-5.7 1.2-11.6 1.6-17.5 1.4-5.8-.3-11.7-1.6-17-4-1.3-.6-2.7-1.2-3.9-2l-1.9-1.1-1.8-1.3-.9-.6c-.3-.2-.6-.5-.9-.7l-1.7-1.4-1.6-1.6c-.5-.5-1-1-1.5-1.6l-1.4-1.7c-.4-.6-.8-1.2-1.2-1.9l-.6-.9-.5-1c-.3-.7-.7-1.3-1-2-1.1-2.8-1.7-5.7-1.8-8.7 0-.3.2-.5.5-.5-.4 0-.1.2-.1.5z"/><linearGradient gradientTransform="matrix(1 0 0 -1 0 1080)" y2="628.47382" x2="501.4595" y1="761.37598" x1="522.04169" gradientUnits="userSpaceOnUse" id="g"><stop offset="0" stop-color="#e5b77e"/><stop offset="1" stop-color="#b88671"/></linearGradient><path d="M408.5 480c-13.2-1.7-24.4-9.7-33.3-23.7 39.6-3.4 68.1-12.2 87.7-30.7 12.5-11.8 22.6-24 32.3-35.8 24.1-29.3 45-54.6 91.7-57.2 1.3 1.1 10.5 8.1 26 8.1 15.7 0 28-5 33.1-13.5v.8c0 .3 0 .6-.1 1v.2c0 .3-.1.5-.1.8l-.1.3c0 .3-.1.6-.2.9v.1c-.1.4-.2.7-.3 1l-.1.2c-.1.3-.2.6-.3.8l-.1.3c-.1.3-.3.7-.4 1l-.1.1c-.2.4-.3.6-.5.9l-.2.3c-.2.3-.3.6-.5.8l-.1.2c-.2.3-.4.6-.7 1l-.1.2c-.2.3-.4.6-.6.8l-.2.3-.9.9-.1.1-.8.8-.3.3c-.3.2-.6.5-.9.7l-.2.2c-.4.3-.7.6-1.1.8l-.3.2c-.3.2-.6.4-1 .6l-.4.2c-.4.3-.9.5-1.4.7l-.1.1c-.4.2-.9.4-1.4.6l-.4.2c-.4.2-.8.3-1.3.5l-.3.1c-.5.2-1.1.4-1.7.6l-.4.1c-.5.1-.9.3-1.4.4l-.5.1c-.6.2-1.3.3-1.9.5-5.7 1.2-11.1 1.8-16.2 1.8-12.4 0-18.4-3.7-18.4-3.7l-.1-.1h-.2c-.4 0-37.5 4.5-58.4 43.3-.6 1.1-1.2 2.2-1.7 3.2l-2.4 4.3c-.6 1.1-1.2 2.1-1.8 3.2l-.1.1c-.6 1.1-1.2 2-1.7 3l-.6 1c-.4.7-1.9 3.2-1.9 3.2-.6 1-1.1 1.9-1.7 2.9l-.4.6c-.5.9-1.1 1.7-1.6 2.6l-.7 1.1c-.4.7-.9 1.3-1.3 2l-.7 1.1c-.6.9-1.2 1.8-1.8 2.6l-.5.8c-.5.8-1.1 1.5-1.6 2.3-.2.3-.8 1.1-.8 1.1-.4.6-.9 1.2-1.3 1.8l-.8 1.1c-.6.8-1.2 1.6-1.9 2.4l-.7.9c-.5.7-1.1 1.4-1.7 2-.3.3-.9 1.1-.9 1.1-.5.6-1 1.1-1.4 1.7 0 0-.7.8-.9 1.1-.7.7-1.4 1.5-2 2.2l-.9.9-1.8 1.8-.9.9-.2.2c-.5.5-1 1-1.6 1.5l-.1.1c-.3.3-.6.6-1 .9-.8.7-1.5 1.4-2.3 2.1-.3.3-.6.5-.9.8l-.2.2c-.6.5-1.3 1.1-1.9 1.6-.4.3-.8.6-1.2 1-.6.5-1.2.9-1.8 1.4l-.2.2c-.3.3-.6.5-1 .7-.9.7-1.8 1.3-2.7 2-.3.2-.5.4-.8.5l-.4.3c-.7.5-1.4 1-2.2 1.5-.4.3-.8.5-1.2.8-.7.4-1.3.9-2 1.3l-.3.2c-.4.2-.7.5-1.1.7-1.1.6-2.1 1.3-3.2 1.9-11.1 6.3-23.5 11.2-37.8 15.1-.1.1-4.5 2.1-11.1 3h-11v-.2z" fill="url(#g)"/><path d="M570 334.7c4.9-.8 6.4-3.3 9.2-3.8 3.2-.6 5.4 0 7.7 1.8 2.3 1.7 2.2 4.4 2.2 4.4l-7 2.8-12.1-5.2z" class="st11" fill="#e0b37d"/><path d="M236.6 421c-.6 7.7-9.4 8.9-21.8 8.9s-20.8-.8-21.4-8.5c-.6-7.7 8-11.2 21.4-11.2 13.3-.1 22.4 3.1 21.8 10.8z" class="st12" fill="#a6725c"/><path d="M590.4 423.3c-.5 2.8 3.2 3.7 5.6 3.7 2.4 0 3.9-1.3 4-3 .2-1.7-1.2-2.7-3.6-2.7-2.4 0-5.6-.3-6 2zm18.7-2.3c-1.4.1-3.2.1-4.4.6 0 1.4-.1 2.8-.4 4.2 1.2.9 3.2 1.1 4.7 1 2.4-.1 3.8-1.5 3.8-3.3.1-1.8-1.3-2.7-3.7-2.5zm12.8-1.3c-1.4.2-3.1.3-4.3.8.1 1.4 0 2.8-.2 4.2 1.3.8 3.3.9 4.8.7 2.4-.3 3.7-1.8 3.6-3.5-.1-1.7-1.5-2.5-3.9-2.2z" class="st6" fill="#fccf84"/><path d="M269.2 314.5c6.5-1 13-1.5 19.5-2.4 6.5-.9 12.9-2 19.2-3.5 6.3-1.5 12.6-3.4 18.6-5.9 3-1.2 6-2.5 8.9-3.9 1.5-.7 2.9-1.4 4.4-2.2 1.5-.7 2.8-1.5 4.4-2.2h-.1c3.3-2 6.6-4.1 9.6-6.6 1.5-1.2 2.8-2.6 4.1-4.1 1.2-1.5 2.2-3.1 3-4.8 1.6-3.5 2.3-7.3 2.8-11.2.5-3.9.5-7.7-.1-11.5-.7-3.8-2-7.5-3.9-10.8-1.9-3.3-4.4-6.3-7.4-8.8-5.9-5-13.5-7.9-21.2-8h-.3l-.1-.3c-2.2-4.8-5.4-9.2-9.4-12.7-2-1.7-4.2-3.2-6.6-4.5-2.3-1.2-4.8-2.2-7.4-2.9-5.1-1.4-10.6-1.6-15.8-.6-5.2 1-10.2 3.2-14.5 6.4l-.2.2-.3-.1c-3.3-1.5-6.9-2.4-10.6-2.6-3.6-.2-7.3.2-10.8 1.3-1.8.5-3.4 1.3-5.1 2.1-1.6.9-3.2 1.8-4.6 3-2.9 2.2-5.3 5-7.3 8.1l-.2.3h-.3c-11.1-.9-22.5 0-33 3.7-5.2 1.9-10.2 4.5-14.4 8.1-4.2 3.6-7.5 8.3-9.4 13.4-1 2.6-1.6 5.3-2.1 8l-.4 2.1-.3 2.1c-.2 1.4-.4 2.8-.4 4.2-.3 5.5.2 11.2 2.1 16.4.9 2.6 2.3 5 3.8 7.4.4.6.9 1.1 1.3 1.6s.8 1.1 1.4 1.6c1 1 1.9 2 3 2.9 4.2 3.6 9.2 6.2 14.4 8.4-5.4-1.6-10.6-4.1-15-7.7-1.1-.9-2.1-1.9-3.1-2.9-.5-.5-.9-1.1-1.4-1.6-.4-.6-.9-1.1-1.3-1.7-1.6-2.4-3-4.8-3.9-7.6-2-5.4-2.6-11.1-2.3-16.8 0-1.4.2-2.8.4-4.2l.2-2.1.4-2.1c.5-2.8 1.1-5.6 2.1-8.2 2-5.3 5.4-10.1 9.7-13.9 4.3-3.8 9.4-6.5 14.7-8.4 10.7-3.8 22.3-4.6 33.5-3.6l-.5.2c2-3.2 4.5-6.1 7.5-8.3 1.5-1.2 3.1-2.1 4.7-3.1 1.7-.8 3.4-1.6 5.2-2.1 3.6-1.2 7.4-1.5 11.2-1.3 3.8.2 7.5 1.1 10.9 2.6l-.5.1c4.4-3.2 9.5-5.5 14.9-6.5s11-.9 16.2.6c2.6.7 5.2 1.7 7.6 3 2.4 1.3 4.7 2.8 6.8 4.6 4.2 3.5 7.4 8.1 9.7 13l-.5-.3c8 0 15.9 3 22 8.1 3 2.6 5.7 5.6 7.7 9.1s3.4 7.3 4.1 11.2c.7 3.9.7 8 .2 11.9-.5 3.9-1.2 7.9-2.9 11.6-.8 1.8-1.9 3.5-3.2 5.1-1.3 1.5-2.7 3-4.2 4.2-3 2.6-6.4 4.7-9.8 6.7h-.1c-1.4.7-2.9 1.5-4.3 2.2-1.5.7-2.9 1.5-4.4 2.2-3 1.4-6 2.7-9 3.9-6.1 2.5-12.4 4.4-18.8 5.9s-12.9 2.6-19.4 3.5c-6.3.5-12.9 1.2-19.4 1zm341.8-5.8c2.4.4 4.8.9 7.1 1.7 2.3.7 4.6 1.8 6.7 2.9 2.2 1.1 4.2 2.5 6.1 4.1 1.9 1.5 3.7 3.3 5.1 5.2v.2h-.1c-1.9-1.6-3.7-3.2-5.6-4.6-1.9-1.5-4-2.7-6-3.9-2.1-1.2-4.3-2.2-6.5-3-2.2-.9-4.5-1.6-6.9-2.3-.1 0-.1-.1-.1-.1l.2-.2z"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="h" d="M184 151h494.79999v321H184z"/></defs><clipPath id="i"><use height="100%" width="100%" xlink:href="#h" overflow="visible"/></clipPath><g clip-path="url(#i)"><path d="M270.6 223.8c1-.7 2.1-1.3 3.2-1.7 1.1-.4 2.3-.8 3.5-1 1.2-.2 2.4-.4 3.6-.4 1.2 0 2.4 0 3.6.2-2.4.3-4.7.6-7.1 1.1-1.2.2-2.3.5-3.5.8-1 .3-2.1.7-3.3 1z" class="st15" fill="#fce79c"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="j" d="M184 151h494.79999v321H184z"/></defs><clipPath id="k"><use height="100%" width="100%" xlink:href="#j" overflow="visible"/></clipPath><g clip-path="url(#k)"><path d="M317 225.4c1.7-.9 3.6-1.4 5.5-1.4 1 0 1.9.1 2.8.3.9.2 1.8.5 2.6 1.1-1.9-.2-3.7-.3-5.5-.3-.9 0-1.8 0-2.7.1l-2.7.2z" class="st15" fill="#fce79c"/></g></g></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_plane.svg b/app/javascript/images/elephant_ui_plane.svg
new file mode 100644
index 000000000..a2624d170
--- /dev/null
+++ b/app/javascript/images/elephant_ui_plane.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 292.85862 204.49997" width="292.85861" height="204.49997"><g transform="translate(-395.89999 -820.4)"><defs><path id="a" d="M395.89999 745.09998H690.5v279.79999H395.89999z"/></defs><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath><path class="st53" d="M339.3 1028.6c1.5-3.2 14.4-31.3 27.4-58.8-6-9.3-2-17 1.5-23.7 1.9-3.7 3.8-7.1 3.6-10.4-.8-22 8.1-38.3 22.8-41.6 2.8-.6 5.2-.9 7.5-.9 3 0 5.6.5 8.1 1.6 1.4-1.3 2.8-2.6 4.2-3.8-2.8-2.6-4.3-5.5-4.5-8.8-.3-4.5 2.2-9.5 6.8-13.7 5.3-4.8 16.5-12.9 31.7-12.9.9 0 1.7 0 2.6.1-.4-.9-1-2-2.1-2.9-2.1-1.6-1.9-3.2-1.6-4 .7-2.1 3.6-3.2 8.1-3.2 3.9 0 9.7 1.2 14 4.4.3-.7.7-1.3 1.3-1.7.5-.3 1.3-.5 2.2-.5 3.4 0 10.6 2.7 15.5 9.9 3.6 5.3 3.6 10.8.1 16 18.3 4.7 30.1 15.6 39.5 24.4 2.5 2.4 5 4.6 7.3 6.5 10.7 8.9 21.4 13.2 32.7 13.2.9 0 1.8 0 2.7-.1 2-13.5-4.1-25.5-10-35.7-6.2-10.7-6.4-12.1-4.9-13.9l.1-.1c.6-.7 1.3-1 2.1-1.1h.3c1.7 0 4.5 1 13 8.7 9.9 9 16.9 22.2 19.2 36.5 8.9-4.9 15.2-12.5 17.1-20.3 2-8.6.5-16.8-4.2-22.7l-13.1 6.1-7-16.9-15.6 3.2 7.2-19.5h.1l-.2-.5 4.6-11.1 65.7 11.9c3.1.6 3.9 2.7 3.6 4.5l-.2 1-.4-.1c-.3.4-.6.7-1 .9-.7.3-7.5 3.6-21 9.9 2.1 2.9 2.2 6.1.4 9.4-1.1 1.9-2.5 6.2.4 13.3 3.7 8.9 3.5 29.2-8.3 46.2-8.1 11.7-18.3 23-37.6 26.6-3 4.6-6.5 9-10.2 12.6-7.8 7.6-24 15.3-42.3 15.3-5.3 0-10.7-.6-15.9-1.9-7.6 12.9-10.5 26.2-10.6 32.1-.2 11 .9 16.1.9 16.2l.4 1.8-164.9.8.9-2.3z" clip-path="url(#b)"/><path class="st53" d="M339.8 1028.8c.1-.3 13.9-30.1 27.5-59.1-6.1-9.2-2.1-16.8 1.4-23.5 2-3.7 3.8-7.3 3.7-10.6-.8-21.7 8-37.9 22.4-41 2.7-.6 5.1-.9 7.4-.9 3 0 5.7.5 8.2 1.7 1.6-1.6 3.2-3 4.9-4.4-3-2.6-4.6-5.5-4.8-8.8-.3-4.4 2.1-9.2 6.6-13.3 5.3-4.8 16.4-12.8 31.4-12.8 1.1 0 2.2 0 3.3.1-.3-1.1-1-2.7-2.5-3.8-1.8-1.4-1.7-2.8-1.5-3.4.6-1.8 3.4-2.9 7.6-2.9 4.4 0 10.3 1.5 14.3 4.8.1-.9.6-1.7 1.3-2.1.4-.3 1.1-.4 1.9-.4 3.3 0 10.3 2.6 15.1 9.7 3.6 5.3 3.5 10.9-.3 16.1 18.6 4.6 30.5 15.6 40 24.4 2.6 2.4 5 4.6 7.3 6.5 10.8 8.9 21.6 13.3 33.1 13.3 1 0 2.1 0 3.1-.1 2.2-13.9-4-26.1-10-36.4-6.3-10.9-6.2-11.8-5-13.3l.1-.1c.2-.2.7-.9 1.8-.9h.2c1.5 0 4.2 1 12.7 8.6 10 9.1 17 22.5 19.2 36.9 9.3-5 16-12.8 17.9-20.9 2.1-8.9.4-17.4-4.5-23.4l-13 6.1-6.9-16.8-15.1 3.1 6.8-18.4h.6l-.5-1 4.4-10.6 65.3 11.8c3.5.7 3.3 3.2 3.2 3.9l-.1.5h-.2c-.2.4-.6.8-1 1-.7.3-7.9 3.7-21.6 10.2.1.1.2.2.3.4 2 2.7 2.2 5.8.4 8.9-1.1 2-2.6 6.4.4 13.7 3.6 8.8 3.4 28.8-8.2 45.7-8.1 11.7-18.2 22.9-37.5 26.4-3 4.7-6.5 9.1-10.3 12.7-7.8 7.5-23.7 15.1-42 15.1-5.4 0-10.9-.7-16.1-2-7.7 13.1-10.7 26.7-10.9 32.7-.2 11.1.9 16.2.9 16.3l.3 1.2-163.5.8.5-1.7z" clip-path="url(#b)"/><path d="M577.5 843.7l-1-2.1 3.9-9.4 64.5 11.6c2.4.5 2.5 2 2.4 2.8" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M584.2 856.7l6.9 16.6s53.7-25.1 55.5-26c.9-.5 1.5-2.2-1-2.3-2.5-.1-69.6-1.4-69.6-1.4l-5.9 16 14.1-2.9z" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-width="1.70000005" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M585.1 857l58.9-11.2 1.4-.5h.4c.8 0 .7.3.8.6.1.3-.1.6-.4.8L587 861.5l-1.9-4.5z" clip-path="url(#b)" fill="#d1d3d4"/><path class="st57" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M584.20001 856.70001l61.79999-11.5"/><path class="st58" d="M388.5 927.9c20-40 49.9-56.3 83.4-54.9 33.6 1.4 48.8 21.7 62.4 32.9 13.6 11.2 27.5 15.6 43.4 12.5 15.9-3.1 28.5-14.6 31.2-26.1 2.7-11.5-1-20.7-6.1-25.8-5.1-5.1-1.4-8.1 4.1-6.8 5.4 1.4 8.1 3.4 8.1 3.4s7.8-6.4 9.8-3.7c2 2.7 1.7 5.4.3 7.8-1.4 2.4-2.7 7.1.3 14.6 3.1 7.5 4.1 27.1-8.1 44.8-12.2 17.6-26.5 30.1-62.1 26.5-38.5-3.9-54.6 44.2-54.9 59-.2 11.5.9 16.5.9 16.5l-160.7.8c.2-.1 33.4-72.4 48-101.5z" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M399.4 989.3c-6.1 0-9.9-4.3-10-4.3l-.2-.2-.3.1c-3.1 1-6.1 1.5-9 1.5-6.1 0-11.4-2.2-15.6-6.5 1.4-3 2.9-6.1 4.3-9.1.1.1.1.2.2.3 6.1 8 12.7 9.7 17 9.7 3.2 0 5.6-.9 6.6-1.3.7 1.3 3 4.7 7.5 4.7 1.2 0 2.5-.3 3.9-.8 6.7-2.5 15.7-13.1 18.3-22.1 3.2 5.7-2.8 18.3-13.8 25.3-3 1.7-6 2.7-8.9 2.7zm24.5-78.1c-5.7-11.1-10.8-14.2-12.4-14.9 15.7-15.3 34.7-23 56.6-23 1.3 0 2.5 0 3.8.1 2.1.1 4.2.3 6.4.5 1.5 2.7-.4 5.6-.8 6.3-3 .8-11.2 6.5-18.5 11.6-1.9 1.3-3.7 2.6-5.3 3.7-5.3 3.7-13.6 4.2-18 4.2-1.8 0-2.9-.1-2.9-.1h-.3l-8.6 11.6zm95.3 49c4.2-7.1 12.6-15.2 28.3-15.2 3.5 0 7.2.4 11 1.2 3.4.7 7 1.1 10.6 1.1 15.9 0 29.8-7.9 34.8-12.5 6.5-6 10.5-9.8 12-12.4 1.4-2.4 3.2-2.8 4.7-2 .1.1-.7 1.1-.6 1.1-.9 1.7-1.9 3.3-3 4.8-11.5 16.6-23.9 26.9-50 26.9-3.6 0-7.5-.2-11.6-.6-1.5-.2-3-.2-4.4-.2-9.4 0-18.1 3.2-25.9 9.4l-5.9-1.6z" clip-path="url(#b)" fill="#38434f"/><path class="st58" d="M427.4 920.5c-9.1-24.2-19-27.9-32.4-25-13.4 3-22.4 18-21.6 40 .4 10.2-15.5 20.5-4.3 35s23.5 8 23.5 8 3 7.1 11 4.1 16.7-13.5 18.5-21.6" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M417.2 934.2c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.4 11.7-14.2 19c.6 15.3-10.2 22.8 0 29.7 10.1 6.9 23.7-2.8 28.5-11.3 4.8-8.5 4-11.8 4-11.8z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M392.6 978.6c6.3-3.9 9.1-7.5 9.1-7.5m15.5-36.9c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.6 11.7-14.2 19" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.5 891.4c-9.8-6.9-6.2-16 .3-21.8 6.5-5.8 19-14 35.2-12.2 0 0-.2-3.5-3.1-5.8s-.5-4.5 5.5-4.5 12.9 2.6 15.8 6.9c0 0-1.4-3.2.4-4.4 1.8-1.2 10.2 1 15.6 9s1.1 14.9-5.2 19.9c-6.3 5-36.2 11.6-48.8 10.9" clip-path="url(#b)" fill="#53606c"/><g class="st53" clip-path="url(#b)"><path class="st36" d="M459.5 878.7c-11.1.6-22.1 3.3-32.9 6.1-4.1 1.1-8.2 2.2-12.4 2-.4 0-.8-.1-1.3-.1 1 1.6 2.5 3.2 4.6 4.7l15.6-2.1c11.3.7 37-4.7 46.4-9.4-6.5-1.1-13.3-1.5-20-1.2z" fill="#38434f"/></g><path class="st59" d="M417.5 890.8c-3.5-2.5-5.3-5.5-5.5-8.8-.2-3.2 1.2-6.7 4-9.9-.4 1.6-.2 3.2.5 4.7 1.2 2.5 3.6 4 6.3 4 2.1 0 4.3-.9 6.3-2.6 7.2-6 19.4-10.4 29.1-10.4 1.9 0 3.7.2 5.3.5 7.7 1.6 12.3 3.7 13.8 6.7.8 1.6.8 3.3 0 5.4-10.1 4.3-31.2 8.6-42.1 8.6-.7 0-1.4 0-2.1-.1-1.4-.1-2.8-.1-4-.1-7.5-.1-10.6 1.4-11.6 2z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M471.2 854c2.2 3.4 1.1 6.7 1.1 6.7" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M489.6 967.9c34.6 23.5 68.7 8.7 80.2-2.4 11.4-11.1 20.8-28.5 20-45.9-.8-17.4-8.5-32.9-19.5-42.8-10.7-9.6-12.4-8.7-13.2-7.7-.8 1-1.4 1.1 5 12.2s13.4 24.6 9.5 40.2c-3.9 15.6-15.6 29.9-29.6 34-14 4-21.6-1.4-26.1-3.2 0 0 1 4-3.4 4.3-4.3.3-11.1-2.9-11.1-2.9s2.7 3 .1 5-5.9-.9-5.9-.9 2.5 2.2 1.5 3.3c-1 1.1-2.3.8-4.2-.6 0 0 3.2 3.6 1 5.5s-4.3 1.9-4.3 1.9z" clip-path="url(#b)" fill="#b3becd" stroke="#000" stroke-width="1.60000002" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M528.6 979.9c-13.1 0-25.8-3.9-37.6-11.7.9-.2 2.1-.7 3.3-1.8 1.4-1.3 1-3 .3-4.3.4.1.8.2 1.1.2.7 0 1.3-.3 1.8-.8.3-.3.4-.6.4-1 0-.3-.1-.6-.2-.9.6.2 1.2.4 1.9.4.9 0 1.7-.3 2.4-.8.3-.2.5-.5.7-.8 12.6 6.2 22.6 9.1 31.5 9.1 7.8 0 14.7-2.3 21.1-6.9 16.8-12.3 21.3-21.3 24.6-27.9l.3-.6c2.3-4.5 4.2-6.5 6.4-6.5.9 0 1.7.3 2.7.9-1.4 13.6-8.7 28-19.6 38.6-7.9 7.4-23.4 14.8-41.1 14.8z" clip-path="url(#b)" fill="#92a1b5"/><path class="st57" d="M489.6 967.9c-3.9.1-6.7-.9-6.7-.9" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M484 908.3c-2.2.9-2.1 3.2.1 6.7 2.1 3.5 4.5 7.9 5.9 10.3 1.4 2.4 2.6 3.5 4 2.8 1.4-.6 1.8-2 .4-4.9-1.4-2.9-5.8-11-7.2-12.7-1.6-1.7-2.4-2.5-3.2-2.2z" clip-path="url(#b)" fill="#38434f" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st57" d="M525.9 907.8c2.5-3.7 4.8-5.2 4.8-5.2m3.8 11.9c1.5-3.1 3.7-5.6 3.7-5.6m11.9 13.3c1-3.9 2.7-5.6 2.7-5.6m10.7 9c.6-4.6.9-6.6.9-6.6" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path class="st49" d="M504.9 862.2c.8-.4 1.5-.8 2.2-1.1" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M519.8 856.2c13.6-3.5 22.1.5 28.2 3.3 5.3 2.4 11.6 4.7 17.6 5.3" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.5286,13.5857"/><path class="st49" d="M572.4 864.5c.8-.2 1.6-.4 2.4-.7" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g><g class="st53" clip-path="url(#b)"><path d="M491.2 946.7c-4.1 1.1-6.1 1.8-10 3.5-2.1.9-4.6.1-5.6-1.9s0-4.6 2.3-5.6c4.3-1.9 6.6-2.7 11.2-3.9 2.4-.6 4.8.8 5.3 2.9.4 2.2-1 4.4-3.2 5z" fill="#505762"/></g><path class="st57" d="M515.8 952.3c-.2-2.3-1.7-3.3-1.7-3.3" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path d="M454.5 887.5c-3.5.7-7.1 1.3-10.6 1.7-3.6.4-7.2.8-10.8.6-.3 0-.5-.2-.5-.5s.2-.5.5-.5c3.5.2 7.1-.1 10.6-.4 3.5-.4 7.1-.9 10.6-1.6.2 0 .4.1.4.3.1.2 0 .4-.2.4z"/></g><g class="st53" clip-path="url(#b)"><path d="M417.2 891.8c-2.2-1.6-4.3-3.6-5.4-6.2l-.4-1-.2-1-.1-.5v-.5c0-.4-.1-.7-.1-1.1 0-1.4.2-2.8.7-4.1.9-2.6 2.6-4.9 4.4-6.9 1.9-2 4-3.6 6.2-5.2s4.6-2.9 7-4.1c2.4-1.2 5-2.2 7.6-2.9 5.2-1.5 10.7-1.9 16.1-1.4l-.6.5c-.2-1.3-.7-2.7-1.4-3.8-.4-.6-.8-1.1-1.4-1.5-.5-.5-1.2-1-1.5-1.9-.1-.2-.1-.5-.1-.7.1-.2.1-.5.2-.7.2-.4.6-.7.9-.9.7-.5 1.4-.7 2.2-.9 1.5-.3 3-.4 4.4-.4 2.9.1 5.9.7 8.6 1.8 2.7 1.1 5.3 2.8 7.1 5.3l-.9.5c-.3-.7-.5-1.3-.5-2.1-.1-.7 0-1.5.4-2.3.3-.3.5-.7 1-.8.2-.1.4-.1.6-.2.2 0 .4-.1.6-.1.7 0 1.4.1 2.1.2 1.4.3 2.6.8 3.9 1.4 1.2.6 2.4 1.3 3.5 2.1 2.2 1.6 4.1 3.6 5.6 5.9.7 1.2 1.4 2.4 1.8 3.7.3.6.4 1.3.5 2 .1.3.1.7.1 1v1c-.1 2.8-1.3 5.5-3 7.6-1.7 2.2-3.6 4-5.9 5.6-2.4 1.4-4.9 2.3-7.4 3.2-2.5.8-5.1 1.5-7.8 1.9 1.2-.5 2.5-.9 3.7-1.4l3.7-1.3c2.5-.9 5-1.8 7.2-3.2 2.1-1.5 4-3.3 5.6-5.4 1.5-2.1 2.6-4.5 2.7-7 .1-2.5-.8-5-2.2-7.1-1.4-2.2-3.2-4.1-5.3-5.6-2.1-1.5-4.4-2.8-6.9-3.4-.6-.1-1.2-.2-1.8-.2-.6 0-1 .1-1.3.5-.5.8-.2 2.3.2 3.4.1.3 0 .5-.3.6-.2.1-.4 0-.6-.2-1.6-2.3-4-3.8-6.6-4.9-2.6-1.1-5.4-1.7-8.2-1.7-1.4 0-2.8.1-4.2.4-.7.2-1.3.4-1.8.7-.5.4-.8.8-.7 1.3.1.5.6.9 1.2 1.4.6.5 1.1 1.1 1.5 1.7.9 1.3 1.4 2.7 1.6 4.3 0 .3-.2.5-.4.5h-.1c-5.3-.5-10.7-.1-15.8 1.4-2.5.7-5 1.7-7.4 2.8-2.4 1.2-4.7 2.5-6.8 4.1-2.2 1.5-4.3 3.2-6.1 5.1-1.8 1.9-3.4 4.1-4.2 6.5-.4 1.2-.6 2.5-.7 3.8 0 .3.1.6.1 1v.5l.1.5.2.9.4.9c1 2.4 2.9 4.3 5 5.8.2.2.3.5.1.7-.2.2-.4.3-.7.1z"/></g><g class="st53" clip-path="url(#b)"><path class="st36" d="M615.1 863.2c2 1.2 2.3 1.8 2.3 1.8" fill="#38434f"/><path d="M615.3 862.9l1.2.9c.2.2.4.3.6.5.2.2.3.4.5.6 0 .1 0 .2-.1.2h-.2l-.5-.5c-.2-.1-.4-.3-.6-.4-.4-.3-.8-.5-1.3-.7-.2-.1-.2-.3-.1-.5s.2-.2.5-.1c-.1 0-.1 0 0 0z"/></g></g></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_working.svg b/app/javascript/images/elephant_ui_working.svg
new file mode 100644
index 000000000..8ba475db0
--- /dev/null
+++ b/app/javascript/images/elephant_ui_working.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_done.svg b/app/javascript/images/icon_done.svg
new file mode 100644
index 000000000..446af14d9
--- /dev/null
+++ b/app/javascript/images/icon_done.svg
@@ -0,0 +1,4 @@
+<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
+    <path d="M0 0h24v24H0z" fill="none"/>
+    <path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/>
+</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_follow_requests.png b/app/javascript/images/icon_follow_requests.png
new file mode 100644
index 000000000..4123e2a69
--- /dev/null
+++ b/app/javascript/images/icon_follow_requests.png
Binary files differdiff --git a/app/javascript/images/icon_keyboard_shortcuts.png b/app/javascript/images/icon_keyboard_shortcuts.png
new file mode 100644
index 000000000..d66f3939e
--- /dev/null
+++ b/app/javascript/images/icon_keyboard_shortcuts.png
Binary files differdiff --git a/app/javascript/images/icon_lists.png b/app/javascript/images/icon_lists.png
new file mode 100644
index 000000000..3828946e8
--- /dev/null
+++ b/app/javascript/images/icon_lists.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_cached.png b/app/javascript/images/mailer/icon_cached.png
new file mode 100644
index 000000000..e62c064c8
--- /dev/null
+++ b/app/javascript/images/mailer/icon_cached.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_done.png b/app/javascript/images/mailer/icon_done.png
new file mode 100644
index 000000000..0d2ef0cb8
--- /dev/null
+++ b/app/javascript/images/mailer/icon_done.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_email.png b/app/javascript/images/mailer/icon_email.png
new file mode 100644
index 000000000..aae9d2bb9
--- /dev/null
+++ b/app/javascript/images/mailer/icon_email.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_grade.png b/app/javascript/images/mailer/icon_grade.png
new file mode 100644
index 000000000..895b57d0a
--- /dev/null
+++ b/app/javascript/images/mailer/icon_grade.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_lock_open.png b/app/javascript/images/mailer/icon_lock_open.png
new file mode 100644
index 000000000..9f62eadc2
--- /dev/null
+++ b/app/javascript/images/mailer/icon_lock_open.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_person_add.png b/app/javascript/images/mailer/icon_person_add.png
new file mode 100644
index 000000000..3453060ae
--- /dev/null
+++ b/app/javascript/images/mailer/icon_person_add.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_reply.png b/app/javascript/images/mailer/icon_reply.png
new file mode 100644
index 000000000..8bce4955c
--- /dev/null
+++ b/app/javascript/images/mailer/icon_reply.png
Binary files differdiff --git a/app/javascript/images/mailer/logo_full.png b/app/javascript/images/mailer/logo_full.png
new file mode 100644
index 000000000..1c4f33287
--- /dev/null
+++ b/app/javascript/images/mailer/logo_full.png
Binary files differdiff --git a/app/javascript/images/mailer/logo_transparent.png b/app/javascript/images/mailer/logo_transparent.png
new file mode 100644
index 000000000..8fda4f67f
--- /dev/null
+++ b/app/javascript/images/mailer/logo_transparent.png
Binary files differdiff --git a/app/javascript/images/mastodon-not-found.png b/app/javascript/images/mastodon-not-found.png
deleted file mode 100644
index 76108d41f..000000000
--- a/app/javascript/images/mastodon-not-found.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/mastodon-ui.png b/app/javascript/images/mastodon-ui.png
deleted file mode 100644
index a1fb642a0..000000000
--- a/app/javascript/images/mastodon-ui.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/wave-compose-standalone.png b/app/javascript/images/wave-compose-standalone.png
deleted file mode 100644
index 287ee639b..000000000
--- a/app/javascript/images/wave-compose-standalone.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/wave-drawer.png b/app/javascript/images/wave-drawer.png
deleted file mode 100644
index ca9f9e1d8..000000000
--- a/app/javascript/images/wave-drawer.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/wave-modal.png b/app/javascript/images/wave-modal.png
deleted file mode 100644
index 88818a6d7..000000000
--- a/app/javascript/images/wave-modal.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js
index f8843d1d9..df6a36379 100644
--- a/app/javascript/mastodon/actions/timelines.js
+++ b/app/javascript/mastodon/actions/timelines.js
@@ -19,13 +19,14 @@ export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
 
 export const TIMELINE_CONTEXT_UPDATE = 'CONTEXT_UPDATE';
 
-export function refreshTimelineSuccess(timeline, statuses, skipLoading, next) {
+export function refreshTimelineSuccess(timeline, statuses, skipLoading, next, partial) {
   return {
     type: TIMELINE_REFRESH_SUCCESS,
     timeline,
     statuses,
     skipLoading,
     next,
+    partial,
   };
 };
 
@@ -88,7 +89,7 @@ export function refreshTimeline(timelineId, path, params = {}) {
   return function (dispatch, getState) {
     const timeline = getState().getIn(['timelines', timelineId], ImmutableMap());
 
-    if (timeline.get('isLoading') || timeline.get('online')) {
+    if (timeline.get('isLoading') || (timeline.get('online') && !timeline.get('isPartial'))) {
       return;
     }
 
@@ -104,8 +105,12 @@ export function refreshTimeline(timelineId, path, params = {}) {
     dispatch(refreshTimelineRequest(timelineId, skipLoading));
 
     api(getState).get(path, { params }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(refreshTimelineSuccess(timelineId, response.data, skipLoading, next ? next.uri : null));
+      if (response.status === 206) {
+        dispatch(refreshTimelineSuccess(timelineId, [], skipLoading, null, true));
+      } else {
+        const next = getLinks(response).refs.find(link => link.rel === 'next');
+        dispatch(refreshTimelineSuccess(timelineId, response.data, skipLoading, next ? next.uri : null, false));
+      }
     }).catch(error => {
       dispatch(refreshTimelineFail(timelineId, error, skipLoading));
     });
diff --git a/app/javascript/mastodon/components/missing_indicator.js b/app/javascript/mastodon/components/missing_indicator.js
index 87df7f61c..70d8c3b98 100644
--- a/app/javascript/mastodon/components/missing_indicator.js
+++ b/app/javascript/mastodon/components/missing_indicator.js
@@ -2,9 +2,14 @@ import React from 'react';
 import { FormattedMessage } from 'react-intl';
 
 const MissingIndicator = () => (
-  <div className='missing-indicator'>
+  <div className='regeneration-indicator missing-indicator'>
     <div>
-      <FormattedMessage id='missing_indicator.label' defaultMessage='Not found' />
+      <div className='regeneration-indicator__figure' />
+
+      <div className='regeneration-indicator__label'>
+        <FormattedMessage id='missing_indicator.label' tagName='strong' defaultMessage='Not found' />
+        <FormattedMessage id='missing_indicator.sublabel' defaultMessage='This resource could not be found' />
+      </div>
     </div>
   </div>
 );
diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js
index 58a7b228a..5acaf714e 100644
--- a/app/javascript/mastodon/components/status_list.js
+++ b/app/javascript/mastodon/components/status_list.js
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
 import StatusContainer from '../containers/status_container';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import ScrollableList from './scrollable_list';
+import { FormattedMessage } from 'react-intl';
 
 export default class StatusList extends ImmutablePureComponent {
 
@@ -16,6 +17,7 @@ export default class StatusList extends ImmutablePureComponent {
     trackScroll: PropTypes.bool,
     shouldUpdateScroll: PropTypes.func,
     isLoading: PropTypes.bool,
+    isPartial: PropTypes.bool,
     hasMore: PropTypes.bool,
     prepend: PropTypes.node,
     emptyMessage: PropTypes.node,
@@ -48,8 +50,23 @@ export default class StatusList extends ImmutablePureComponent {
   }
 
   render () {
-    const { statusIds, ...other } = this.props;
-    const { isLoading } = other;
+    const { statusIds, ...other }  = this.props;
+    const { isLoading, isPartial } = other;
+
+    if (isPartial) {
+      return (
+        <div className='regeneration-indicator'>
+          <div>
+            <div className='regeneration-indicator__figure' />
+
+            <div className='regeneration-indicator__label'>
+              <FormattedMessage id='regeneration_indicator.label' tagName='strong' defaultMessage='Loading&hellip;' />
+              <FormattedMessage id='regeneration_indicator.sublabel' defaultMessage='Your home feed is being prepared!' />
+            </div>
+          </div>
+        </div>
+      );
+    }
 
     const scrollableContent = (isLoading || statusIds.size > 0) ? (
       statusIds.map((statusId) => (
diff --git a/app/javascript/mastodon/features/home_timeline/index.js b/app/javascript/mastodon/features/home_timeline/index.js
index a4bc60fac..31f5a3c8b 100644
--- a/app/javascript/mastodon/features/home_timeline/index.js
+++ b/app/javascript/mastodon/features/home_timeline/index.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { expandHomeTimeline } from '../../actions/timelines';
+import { expandHomeTimeline, refreshHomeTimeline } from '../../actions/timelines';
 import PropTypes from 'prop-types';
 import StatusListContainer from '../ui/containers/status_list_container';
 import Column from '../../components/column';
@@ -16,6 +16,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
+  isPartial: state.getIn(['timelines', 'home', 'isPartial'], false),
 });
 
 @connect(mapStateToProps)
@@ -26,6 +27,7 @@ export default class HomeTimeline extends React.PureComponent {
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     hasUnread: PropTypes.bool,
+    isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
@@ -57,6 +59,39 @@ export default class HomeTimeline extends React.PureComponent {
     this.props.dispatch(expandHomeTimeline());
   }
 
+  componentDidMount () {
+    this._checkIfReloadNeeded(false, this.props.isPartial);
+  }
+
+  componentDidUpdate (prevProps) {
+    this._checkIfReloadNeeded(prevProps.isPartial, this.props.isPartial);
+  }
+
+  componentWillUnmount () {
+    this._stopPolling();
+  }
+
+  _checkIfReloadNeeded (wasPartial, isPartial) {
+    const { dispatch } = this.props;
+
+    if (wasPartial === isPartial) {
+      return;
+    } else if (!wasPartial && isPartial) {
+      this.polling = setInterval(() => {
+        dispatch(refreshHomeTimeline());
+      }, 3000);
+    } else if (wasPartial && !isPartial) {
+      this._stopPolling();
+    }
+  }
+
+  _stopPolling () {
+    if (this.polling) {
+      clearInterval(this.polling);
+      this.polling = null;
+    }
+  }
+
   render () {
     const { intl, hasUnread, columnId, multiColumn } = this.props;
     const pinned = !!columnId;
diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js
index ae136e48f..3b97ac62a 100644
--- a/app/javascript/mastodon/features/list_timeline/index.js
+++ b/app/javascript/mastodon/features/list_timeline/index.js
@@ -120,13 +120,17 @@ export default class ListTimeline extends React.PureComponent {
     if (typeof list === 'undefined') {
       return (
         <Column>
-          <LoadingIndicator />
+          <div className='scrollable'>
+            <LoadingIndicator />
+          </div>
         </Column>
       );
     } else if (list === false) {
       return (
         <Column>
-          <MissingIndicator />
+          <div className='scrollable'>
+            <MissingIndicator />
+          </div>
         </Column>
       );
     }
diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
index 54673e223..9b713cf9e 100644
--- a/app/javascript/mastodon/features/ui/components/onboarding_modal.js
+++ b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
@@ -24,14 +24,23 @@ const messages = defineMessages({
 
 const PageOne = ({ acct, domain }) => (
   <div className='onboarding-modal__page onboarding-modal__page-one'>
-    <div style={{ flex: '0 0 auto' }}>
-      <div className='onboarding-modal__page-one__elephant-friend' />
-    </div>
-
-    <div>
+    <div className='onboarding-modal__page-one__lead'>
       <h1><FormattedMessage id='onboarding.page_one.welcome' defaultMessage='Welcome to Mastodon!' /></h1>
       <p><FormattedMessage id='onboarding.page_one.federation' defaultMessage='Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.' /></p>
-      <p><FormattedMessage id='onboarding.page_one.handle' defaultMessage='You are on {domain}, so your full handle is {handle}' values={{ domain, handle: <strong>@{acct}@{domain}</strong> }} /></p>
+    </div>
+
+    <div className='onboarding-modal__page-one__extra'>
+      <div className='display-case'>
+        <div className='display-case__label'>
+          <FormattedMessage id='onboarding.page_one.full_handle' defaultMessage='Your full handle' />
+        </div>
+
+        <div className='display-case__case'>
+          @{acct}@{domain}
+        </div>
+      </div>
+
+      <p><FormattedMessage id='onboarding.page_one.handle_hint' defaultMessage='This is what you would tell your friends to search for.' /></p>
     </div>
   </div>
 );
@@ -46,22 +55,23 @@ const PageTwo = ({ myAccount }) => (
     <div className='figure non-interactive'>
       <div className='pseudo-drawer'>
         <NavigationBar account={myAccount} />
+
+        <ComposeForm
+          text='Awoo! #introductions'
+          suggestions={ImmutableList()}
+          mentionedDomains={[]}
+          spoiler={false}
+          onChange={noop}
+          onSubmit={noop}
+          onPaste={noop}
+          onPickEmoji={noop}
+          onChangeSpoilerText={noop}
+          onClearSuggestions={noop}
+          onFetchSuggestions={noop}
+          onSuggestionSelected={noop}
+          showSearch
+        />
       </div>
-      <ComposeForm
-        text='Awoo! #introductions'
-        suggestions={ImmutableList()}
-        mentionedDomains={[]}
-        spoiler={false}
-        onChange={noop}
-        onSubmit={noop}
-        onPaste={noop}
-        onPickEmoji={noop}
-        onChangeSpoilerText={noop}
-        onClearSuggestions={noop}
-        onFetchSuggestions={noop}
-        onSuggestionSelected={noop}
-        showSearch
-      />
     </div>
 
     <p><FormattedMessage id='onboarding.page_two.compose' defaultMessage='Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.' /></p>
@@ -251,18 +261,12 @@ export default class OnboardingModal extends React.PureComponent {
     const hasMore = currentIndex < pages.length - 1;
 
     const nextOrDoneBtn = hasMore ? (
-      <button
-        onClick={this.handleNext}
-        className='onboarding-modal__nav onboarding-modal__next'
-      >
-        <FormattedMessage id='onboarding.next' defaultMessage='Next' />
+      <button onClick={this.handleNext} className='onboarding-modal__nav onboarding-modal__next shake-bottom'>
+        <FormattedMessage id='onboarding.next' defaultMessage='Next' /> <i className='fa fa-fw fa-chevron-right' />
       </button>
     ) : (
-      <button
-        onClick={this.handleClose}
-        className='onboarding-modal__nav onboarding-modal__done'
-      >
-        <FormattedMessage id='onboarding.done' defaultMessage='Done' />
+      <button onClick={this.handleClose} className='onboarding-modal__nav onboarding-modal__done shake-bottom'>
+        <FormattedMessage id='onboarding.done' defaultMessage='Done' /> <i className='fa fa-fw fa-check' />
       </button>
     );
 
@@ -270,9 +274,10 @@ export default class OnboardingModal extends React.PureComponent {
       <div className='modal-root__modal onboarding-modal'>
         <ReactSwipeableViews index={currentIndex} onChangeIndex={this.handleSwipe} className='onboarding-modal__pager'>
           {pages.map((page, i) => {
-            const className = classNames('onboarding-modal__page__wrapper', {
+            const className = classNames('onboarding-modal__page__wrapper', `onboarding-modal__page__wrapper-${i}`, {
               'onboarding-modal__page__wrapper--active': i === currentIndex,
             });
+
             return (
               <div key={i} className={className}>{page}</div>
             );
@@ -294,6 +299,7 @@ export default class OnboardingModal extends React.PureComponent {
               const className = classNames('onboarding-modal__dot', {
                 active: i === currentIndex,
               });
+
               return (
                 <div
                   key={`dot-${i}`}
diff --git a/app/javascript/mastodon/features/ui/containers/status_list_container.js b/app/javascript/mastodon/features/ui/containers/status_list_container.js
index a0aec4403..59b53d823 100644
--- a/app/javascript/mastodon/features/ui/containers/status_list_container.js
+++ b/app/javascript/mastodon/features/ui/containers/status_list_container.js
@@ -47,6 +47,7 @@ const makeMapStateToProps = () => {
   const mapStateToProps = (state, { timelineId }) => ({
     statusIds: getStatusIds(state, { type: timelineId }),
     isLoading: state.getIn(['timelines', timelineId, 'isLoading'], true),
+    isPartial: state.getIn(['timelines', timelineId, 'isPartial'], false),
     hasMore: !!state.getIn(['timelines', timelineId, 'next']),
   });
 
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index b1dbaa698..ac25a57a2 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -181,7 +181,8 @@
   "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
   "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
   "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
-  "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
+  "onboarding.page_one.full_handle": "Your full handle",
+  "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.",
   "onboarding.page_one.welcome": "Welcome to Mastodon!",
   "onboarding.page_six.admin": "Your instance's admin is {admin}.",
   "onboarding.page_six.almost_done": "Almost done...",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 947c6fb2b..381b80639 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -50,7 +50,7 @@
   "column_header.unpin": "Desafixar",
   "column_subheading.navigation": "Navegação",
   "column_subheading.settings": "Configurações",
-  "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.hashtag_warning": "Esse toot não será listado em nenhuma hashtag por ser não listado. Somente toots públicos podem ser pesquisados por hashtag.",
   "compose_form.lock_disclaimer": "A sua conta não está {locked}. Qualquer pessoa pode te seguir e visualizar postagens direcionadas a apenas seguidores.",
   "compose_form.lock_disclaimer.lock": "trancada",
   "compose_form.placeholder": "No que você está pensando?",
@@ -223,7 +223,7 @@
   "status.media_hidden": "Mídia escondida",
   "status.mention": "Mencionar @{name}",
   "status.more": "Mais",
-  "status.mute": "Mute @{name}",
+  "status.mute": "Silenciar @{name}",
   "status.mute_conversation": "Silenciar conversa",
   "status.open": "Expandir",
   "status.pin": "Fixar no perfil",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 41ebfbd0e..c38bfd3c6 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -195,8 +195,8 @@
   "privacy.private.short": "Iba sledujúci",
   "privacy.public.long": "Pošli všetkým",
   "privacy.public.short": "Verejne",
-  "privacy.unlisted.long": "Neposielať verejne",
-  "privacy.unlisted.short": "Nie je v zozname",
+  "privacy.unlisted.long": "Neposielať do verejných časových osí",
+  "privacy.unlisted.short": "Verejne mimo osí",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "now",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index b6435a260..a02211b8a 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -139,6 +139,7 @@
   "loading_indicator.label": "加载中……",
   "media_gallery.toggle_visible": "切换显示/隐藏",
   "missing_indicator.label": "找不到内容",
+  "missing_indicator.sublabel": "无法找到此资源",
   "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知",
   "navigation_bar.blocks": "被屏蔽的用户",
   "navigation_bar.community_timeline": "本站时间轴",
@@ -174,7 +175,8 @@
   "onboarding.page_four.home": "你的“主页”时间轴上显示的是你的关注对象所发布的嘟文。",
   "onboarding.page_four.notifications": "如果有人与你互动了,他们就会出现在“通知”栏中哦~",
   "onboarding.page_one.federation": "Mastodon 是由一系列独立的服务器共同打造的强大的社交网络,我们将这些各自独立而又相互连接的服务器叫做“实例”。",
-  "onboarding.page_one.handle": "你是在 {domain} 上注册的,所以你的完整用户地址是 {handle}。",
+  "onboarding.page_one.full_handle": "你的完整用户地址",
+  "onboarding.page_one.handle_hint": "你的朋友们需要这个才能通过搜索功能找到你。",
   "onboarding.page_one.welcome": "欢迎来到 Mastodon!",
   "onboarding.page_six.admin": "{admin} 是你所在服务器实例的管理员。",
   "onboarding.page_six.almost_done": "差不多了……",
@@ -197,6 +199,8 @@
   "privacy.public.short": "公开",
   "privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上",
   "privacy.unlisted.short": "不公开",
+  "regeneration_indicator.label": "加载中……",
+  "regeneration_indicator.sublabel": "你的主页时间轴正在准备中!",
   "relative_time.days": "{number}天",
   "relative_time.hours": "{number}时",
   "relative_time.just_now": "刚刚",
diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js
index 9984c3b5d..9a10bcc59 100644
--- a/app/javascript/mastodon/reducers/timelines.js
+++ b/app/javascript/mastodon/reducers/timelines.js
@@ -30,7 +30,7 @@ const initialTimeline = ImmutableMap({
   items: ImmutableList(),
 });
 
-const normalizeTimeline = (state, timeline, statuses, next) => {
+const normalizeTimeline = (state, timeline, statuses, next, isPartial) => {
   const oldIds    = state.getIn([timeline, 'items'], ImmutableList());
   const ids       = ImmutableList(statuses.map(status => status.get('id'))).filter(newId => !oldIds.includes(newId));
   const wasLoaded = state.getIn([timeline, 'loaded']);
@@ -40,7 +40,8 @@ const normalizeTimeline = (state, timeline, statuses, next) => {
     mMap.set('loaded', true);
     mMap.set('isLoading', false);
     if (!hadNext) mMap.set('next', next);
-    mMap.set('items', wasLoaded ? ids.concat(oldIds) : ids);
+    mMap.set('items', wasLoaded ? ids.concat(oldIds) : oldIds.concat(ids));
+    mMap.set('isPartial', isPartial);
   }));
 };
 
@@ -124,7 +125,7 @@ export default function timelines(state = initialState, action) {
   case TIMELINE_EXPAND_FAIL:
     return state.update(action.timeline, initialTimeline, map => map.set('isLoading', false));
   case TIMELINE_REFRESH_SUCCESS:
-    return normalizeTimeline(state, action.timeline, fromJS(action.statuses), action.next);
+    return normalizeTimeline(state, action.timeline, fromJS(action.statuses), action.next, action.partial);
   case TIMELINE_EXPAND_SUCCESS:
     return appendNormalizedTimeline(state, action.timeline, fromJS(action.statuses), action.next);
   case TIMELINE_UPDATE:
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index fd6665f65..300040173 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -6,7 +6,6 @@
 
 @import 'mastodon/reset';
 @import 'mastodon/basics';
-@import 'mastodon/modal';
 @import 'mastodon/containers';
 @import 'mastodon/lists';
 @import 'mastodon/footer';
@@ -15,7 +14,9 @@
 @import 'mastodon/forms';
 @import 'mastodon/accounts';
 @import 'mastodon/stream_entries';
+@import 'mastodon/boost';
 @import 'mastodon/components';
+@import 'mastodon/modal';
 @import 'mastodon/emoji_picker';
 @import 'mastodon/about';
 @import 'mastodon/tables';
diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss
index e6422b2ea..dbe070f9a 100644
--- a/app/javascript/styles/mailer.scss
+++ b/app/javascript/styles/mailer.scss
@@ -17,7 +17,7 @@ body {
   -ms-text-size-adjust: 100%;
 }
 
-.email_body {
+.email-body {
   td,
   div,
   a,
@@ -228,6 +228,19 @@ h3 {
   line-height: 25px;
 }
 
+h5 {
+  font-size: 16px;
+  line-height: 21px;
+  font-weight: 700;
+  color: lighten($ui-base-color, 34%);
+}
+
+.input-cell {
+  h5 {
+    margin-top: 4px;
+  }
+}
+
 .input {
   td {
     background: darken($ui-base-color, 8%);
@@ -356,6 +369,19 @@ h3 {
       font-weight: 500 !important;
     }
   }
+
+  &.button-small {
+    td {
+      border-radius: 4px;
+      font-size: 14px;
+      padding: 8px 16px;
+
+      a {
+        padding: 5px 16px !important;
+        line-height: 26px !important;
+      }
+    }
+  }
 }
 
 .button-default {
@@ -379,6 +405,14 @@ h3 {
   padding-right: 16px;
 }
 
+.padded-bottom {
+  padding-bottom: 32px;
+}
+
+.margin-bottom {
+  margin-bottom: 20px;
+}
+
 .hero-icon {
   width: 64px;
 
@@ -463,8 +497,50 @@ h3 {
   border-top: 1px solid lighten($ui-base-color, 8%);
 }
 
+ul {
+  padding-left: 15px;
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 16px;
+
+  li {
+    margin-bottom: 16px;
+    color: lighten($ui-base-color, 26%);
+
+    span {
+      color: $ui-primary-color;
+    }
+  }
+}
+
 @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) {
   body {
     min-height: 1024px !important;
   }
 }
+
+@media (max-width: 697px) {
+  .email-container,
+  .col-1,
+  .col-2,
+  .col-3,
+  .col-4,
+  .col-5,
+  .col-6 {
+    width: 100% !important;
+    max-width: none !important;
+  }
+
+  .email-start {
+    padding-top: 16px !important;
+  }
+
+  .email-end {
+    padding-bottom: 16px !important;
+  }
+
+  .padded {
+    padding-left: 0 !important;
+    padding-right: 0 !important;
+  }
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 71bffdaa6..75e37237b 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1419,6 +1419,10 @@
     color: $primary-text-color;
   }
 
+  a {
+    color: inherit;
+  }
+
   .permalink {
     text-decoration: none;
   }
@@ -1762,7 +1766,7 @@
   position: absolute;
   top: 0;
   left: 0;
-  background: lighten($ui-base-color, 13%) url('~images/wave-drawer.png') no-repeat bottom / 100% auto;
+  background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
   box-sizing: border-box;
   padding: 0;
   display: flex;
@@ -1777,7 +1781,7 @@
   }
 
   > .mastodon {
-    background: url('~images/mastodon-ui.png') no-repeat left bottom / contain;
+    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
     flex: 1;
   }
 }
@@ -2154,10 +2158,7 @@
   }
 }
 
-@import 'boost';
-
 .no-reduce-motion button.icon-button i.fa-retweet {
-
   background-position: 0 0;
   height: 19px;
   transition: background-position 0.9s steps(10);
@@ -2303,7 +2304,7 @@
   }
 }
 
-.missing-indicator {
+.regeneration-indicator {
   text-align: center;
   font-size: 16px;
   font-weight: 500;
@@ -2314,11 +2315,46 @@
   flex: 1 1 auto;
   align-items: center;
   justify-content: center;
+  padding: 20px;
 
   & > div {
-    background: url('~images/mastodon-not-found.png') no-repeat center -50px;
-    padding-top: 210px;
     width: 100%;
+    background: transparent;
+    padding-top: 0;
+  }
+
+  &__figure {
+    background: url('~images/elephant_ui_working.svg') no-repeat center 0;
+    width: 100%;
+    height: 160px;
+    background-size: contain;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
+
+  &.missing-indicator {
+    padding-top: 20px + 48px;
+
+    .regeneration-indicator__figure {
+      background-image: url('~images/elephant_ui_disappointed.svg');
+    }
+  }
+
+  &__label {
+    margin-top: 200px;
+
+    strong {
+      display: block;
+      margin-bottom: 10px;
+      color: lighten($ui-base-color, 34%);
+    }
+
+    span {
+      font-size: 15px;
+      font-weight: 400;
+    }
   }
 }
 
@@ -2728,6 +2764,7 @@
   flex: 1 1 auto;
   align-items: center;
   justify-content: center;
+
   @supports(display: grid) { // hack to fix Chrome <57
     contain: strict;
   }
@@ -2749,7 +2786,6 @@
 @keyframes heartbeat {
   from {
     transform: scale(1);
-    transform-origin: center center;
     animation-timing-function: ease-out;
   }
 
@@ -2774,10 +2810,48 @@
   }
 }
 
-.pulse-loading {
+.no-reduce-motion .pulse-loading {
+  transform-origin: center center;
   animation: heartbeat 1.5s ease-in-out infinite both;
 }
 
+@keyframes shake-bottom {
+  0%,
+  100% {
+    transform: rotate(0deg);
+    transform-origin: 50% 100%;
+  }
+
+  10% {
+    transform: rotate(2deg);
+  }
+
+  20%,
+  40%,
+  60% {
+    transform: rotate(-4deg);
+  }
+
+  30%,
+  50%,
+  70% {
+    transform: rotate(4deg);
+  }
+
+  80% {
+    transform: rotate(-2deg);
+  }
+
+  90% {
+    transform: rotate(2deg);
+  }
+}
+
+.no-reduce-motion .shake-bottom {
+  transform-origin: 50% 100%;
+  animation: shake-bottom 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) 2s 2 both;
+}
+
 .emoji-picker-dropdown__menu {
   background: $simple-background-color;
   position: absolute;
@@ -3283,13 +3357,12 @@
   height: 80vh;
   width: 80vw;
   max-width: 520px;
-  max-height: 420px;
+  max-height: 470px;
 
   .react-swipeable-view-container > div {
     width: 100%;
     height: 100%;
     box-sizing: border-box;
-    padding: 25px;
     display: none;
     flex-direction: column;
     align-items: center;
@@ -3362,23 +3435,32 @@
   .onboarding-modal__nav,
   .error-modal__nav {
     color: darken($ui-secondary-color, 34%);
-    background-color: transparent;
     border: 0;
     font-size: 14px;
     font-weight: 500;
-    padding: 0;
+    padding: 10px 25px;
     line-height: inherit;
     height: auto;
+    margin: -10px;
+    border-radius: 4px;
+    background-color: transparent;
 
     &:hover,
     &:focus,
     &:active {
       color: darken($ui-secondary-color, 38%);
+      background-color: darken($ui-secondary-color, 16%);
     }
 
     &.onboarding-modal__done,
     &.onboarding-modal__next {
-      color: $ui-highlight-color;
+      color: $ui-base-color;
+
+      &:hover,
+      &:focus,
+      &:active {
+        color: darken($ui-base-color, 4%);
+      }
     }
   }
 }
@@ -3414,6 +3496,8 @@
 
 .onboarding-modal__page__wrapper {
   pointer-events: none;
+  padding: 25px;
+  padding-bottom: 0;
 
   &.onboarding-modal__page__wrapper--active {
     pointer-events: auto;
@@ -3441,6 +3525,10 @@
     }
   }
 
+  .navigation-bar a {
+    color: inherit;
+  }
+
   p {
     font-size: 16px;
     color: lighten($ui-base-color, 8%);
@@ -3468,29 +3556,56 @@
   }
 }
 
-.onboarding-modal__page-one {
-  display: flex;
-  align-items: center;
+.onboarding-modal__page__wrapper-0 {
+  background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px;
+  height: 100%;
+  padding: 0;
 }
 
-.onboarding-modal__page-one__elephant-friend {
-  background: url('~images/elephant-friend-1.png') no-repeat center center / contain;
-  width: 155px;
-  height: 193px;
-  margin-right: 15px;
+.onboarding-modal__page-one {
+  &__lead {
+    padding: 65px;
+    padding-top: 45px;
+    padding-bottom: 0;
+    margin-bottom: 10px;
+
+    h1 {
+      font-size: 26px;
+      line-height: 36px;
+      margin-bottom: 8px;
+    }
+
+    p {
+      margin-bottom: 0;
+    }
+  }
+
+  &__extra {
+    padding-right: 65px;
+    padding-left: 185px;
+    text-align: center;
+  }
 }
 
-@media screen and (max-width: 400px) {
-  .onboarding-modal__page-one {
-    flex-direction: column;
-    align-items: normal;
+.display-case {
+  text-align: center;
+  font-size: 15px;
+  margin-bottom: 15px;
+
+  &__label {
+    font-weight: 500;
+    color: $ui-base-color;
+    margin-bottom: 5px;
+    text-transform: uppercase;
+    font-size: 12px;
   }
 
-  .onboarding-modal__page-one__elephant-friend {
-    width: 100%;
-    height: 30vh;
-    max-height: 160px;
-    margin-bottom: 5vh;
+  &__case {
+    background: $ui-base-color;
+    color: $ui-secondary-color;
+    font-weight: 500;
+    padding: 10px;
+    border-radius: 4px;
   }
 }
 
@@ -3580,16 +3695,6 @@
   }
 }
 
-.onboarding-modal__image {
-  border-radius: 8px;
-  width: 70vw;
-  max-width: 450px;
-  max-height: auto;
-  display: block;
-  margin: auto;
-  margin-bottom: 20px;
-}
-
 .onboard-sliders {
   display: inline-block;
   max-width: 30px;
diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss
index a17476ccb..ceb79bbb9 100644
--- a/app/javascript/styles/mastodon/modal.scss
+++ b/app/javascript/styles/mastodon/modal.scss
@@ -1,5 +1,5 @@
 .modal-layout {
-  background: $ui-base-color url('~images/wave-modal.png') repeat-x bottom fixed;
+  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}"/></svg>') repeat-x bottom fixed;
   display: flex;
   flex-direction: column;
   height: 100vh;
@@ -15,6 +15,6 @@
   > * {
     flex: 1;
     max-height: 235px;
-    background: url('~images/mastodon-ui.png') no-repeat left bottom / contain;
+    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
   }
 }
diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss
index d683218b0..c1058af29 100644
--- a/app/javascript/styles/win95.scss
+++ b/app/javascript/styles/win95.scss
@@ -54,7 +54,6 @@ $ui-highlight-color: $win95-window-header;
   border-radius:0px;
 }
 
-
 @mixin win95-tab() {
   box-shadow: inset -1px 0px 0px #000000,
               inset 1px 0px 0px #ffffff,
@@ -122,7 +121,6 @@ $ui-highlight-color: $win95-window-header;
   vertical-align: middle;
 }
 
-
 /* main win95 style */
 
 body {
@@ -189,10 +187,31 @@ body.admin {
 .drawer .drawer__inner {
   overflow: visible;
   height:inherit;
+  background:$win95-bg;
+}
+
+.drawer:after {
+    display:block;
+    content: " ";
+
+    position:absolute;
+    bottom:15px;
+    left:15px;
+    width:132px;
+    height:117px;
+    background-image:url("~images/clippy_wave.gif"), url("~images/clippy_frame.png");
+    background-repeat:no-repeat;
+    background-position: 4px 20px, 0px 0px;
+    z-index:0;
 }
 
 .drawer__pager {
   overflow-y:auto;
+  z-index:1;
+}
+
+.privacy-dropdown__dropdown {
+  z-index:2;
 }
 
 .column {
@@ -219,6 +238,7 @@ body.admin {
   border-bottom-width:0px;
   color:white;
   font-weight:bold;
+  align-items:baseline;
 }
 
 .column-header__wrapper.active {
@@ -237,6 +257,11 @@ body.admin {
   color:white;
 }
 
+.column-header__buttons {
+  max-height: 20px;
+  margin-right:0px;
+}
+
 .column-header__button {
   background: $win95-bg;
   color: black;
@@ -246,6 +271,10 @@ body.admin {
   padding:0px 2px;
   margin-top:2px;
   @include win95-outset()
+
+  &:hover {
+    color: black;
+  }
 }
 
 .column-header__button.active, .column-header__button.active:hover {
@@ -308,6 +337,13 @@ body.admin {
   padding:4px;
 }
 
+.column-inline-form {
+  background-color: $win95-bg;
+  @include win95-border-outset();
+  border-bottom-width:0px;
+  border-top-width:0px;
+}
+
 .column-settings__section {
   color:black;
   font-weight:bold;
@@ -679,7 +715,6 @@ body.admin {
   font-weight:bold;
 }
 
-
 .drawer__header {
   background: $win95-bg;
   @include win95-border-outset()
@@ -820,12 +855,13 @@ body.admin {
   font-weight:bold;
 }
 
-.autosuggest-textarea__textarea, .spoiler-input__input {
+.compose-form .autosuggest-textarea__textarea,
+.compose-form .spoiler-input__input {
   border-radius:0px;
   @include win95-border-slight-inset();
 }
 
-.autosuggest-textarea__textarea {
+.compose-form .autosuggest-textarea__textarea {
   border-bottom:0px;
 }
 
@@ -840,13 +876,30 @@ body.admin {
   border-right:1px inset $win95-bg;
 }
 
+.compose-form .compose-form__buttons-wrapper {
+  background-color: $win95-bg;
+  border:2px groove $win95-bg;
+  margin-top:4px;
+  padding:4px 8px;
+}
+
 .compose-form__buttons {
   background-color:$win95-bg;
   border-radius:0px;
   box-shadow:unset;
-  border:2px groove $win95-bg;
-  margin-top:4px;
-  padding:4px 8px;
+}
+
+.compose-form__buttons-separator {
+  border-left: 2px groove $win95-bg;
+}
+
+.privacy-dropdown.active .privacy-dropdown__value.active,
+.advanced-options-dropdown.open .advanced-options-dropdown__value {
+  background: $win95-bg;
+}
+
+.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {
+  color: $win95-dark-grey;
 }
 
 .privacy-dropdown.active
@@ -860,7 +913,11 @@ body.admin {
   background:$win95-window-header;
 }
 
-.privacy-dropdown.active .privacy-dropdown__dropdown {
+.privacy-dropdown__dropdown,
+.privacy-dropdown.active .privacy-dropdown__dropdown,
+.advanced-options-dropdown__dropdown,
+.advanced-options-dropdown.open .advanced-options-dropdown__dropdown
+{
   box-shadow:unset;
   color:black;
   @include win95-outset()
@@ -934,6 +991,10 @@ body.admin {
   display:none;
 }
 
+.emoji-picker-dropdown__menu {
+  z-index:2;
+}
+
 .emoji-dialog.with-search {
   box-shadow:unset;
   border-radius:0px;
@@ -1026,31 +1087,43 @@ body.admin {
 .column-subheading {
   background-color:$win95-bg;
   color:black;
-  font-size:0px;
   border-bottom: 2px groove $win95-bg;
-  padding:0px;
-  margin:0px;
+  text-transform: none;
+  font-size: 16px;
 }
 
 .column-link {
   background-color:transparent;
-  background-size:32px 32px;
-  background-repeat:no-repeat;
-  background-position: 36px 50%;
   color:black;
-  padding-left:40px;
-
   &:hover {
     background-color: $win95-window-header;
+    color:white;
+  }
+}
+
+.getting-started__wrapper {
+  .column-subheading {
+    font-size:0px;
+    margin:0px;
+    padding:0px;
+  }
+
+  .column-link {
     background-size:32px 32px;
     background-repeat:no-repeat;
     background-position: 36px 50%;
-    color:white;
-  }
+    padding-left:40px;
+
+    &:hover {
+      background-size:32px 32px;
+      background-repeat:no-repeat;
+      background-position: 36px 50%;
+    }
 
-  i {
-    font-size: 0px;
-    width:32px;
+    i {
+      font-size: 0px;
+      width:32px;
+    }
   }
 }
 
@@ -1070,6 +1143,18 @@ body.admin {
   background-image: url("~images/icon_likes.png");
   &:hover { background-image: url("~images/icon_likes.png"); }
 }
+.column-link[href="/web/lists"] {
+  background-image: url("~images/icon_lists.png");
+  &:hover { background-image: url("~images/icon_lists.png"); }
+}
+.column-link[href="/web/follow_requests"] {
+  background-image: url("~images/icon_follow_requests.png");
+  &:hover { background-image: url("~images/icon_follow_requests.png"); }
+}
+.column-link[href="/web/keyboard-shortcuts"] {
+  background-image: url("~images/icon_keyboard_shortcuts.png");
+  &:hover { background-image: url("~images/icon_keyboard_shortcuts.png"); }
+}
 .column-link[href="/web/blocks"] {
   background-image: url("~images/icon_blocks.png");
   &:hover { background-image: url("~images/icon_blocks.png"); }
@@ -1124,6 +1209,14 @@ body.admin {
   background-color:$win95-bg;
 }
 
+.column .static-content.getting-started {
+  display:none;
+}
+
+.keyboard-shortcuts kbd {
+  background-color: $win95-bg;
+}
+
 .account__header {
   background-color:#7f7f7f;
 }
@@ -1132,6 +1225,23 @@ body.admin {
   color:white;
 }
 
+.account-authorize__wrapper {
+  border: 2px groove $win95-bg;
+  margin: 2px;
+  padding:2px;
+}
+
+.account--panel {
+  background-color: $win95-bg;
+  border:0px;
+  border-top: 2px groove $win95-bg;
+}
+
+.account-authorize .account__header__content {
+  color:black;
+  margin:10px;
+}
+
 .account__action-bar__tab > span {
   color:black;
   font-weight:bold;
@@ -1307,7 +1417,6 @@ body.admin {
   background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=');
 }
 
-
 .admin-wrapper::before {
   position:absolute;
   top:0px;
@@ -1652,4 +1761,3 @@ a.table-action-link:hover,
   color:black;
   border-bottom: 0px solid transparent;
 }
-
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 820189d29..0f9e4f263 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -69,12 +69,13 @@ class ActivityPub::Activity
   def distribute(status)
     crawl_links(status)
 
+    notify_about_reblog(status) if reblog_of_local_account?(status)
+    notify_about_mentions(status)
+
     # Only continue if the status is supposed to have
     # arrived in real-time
     return unless @options[:override_timestamps]
 
-    notify_about_reblog(status) if reblog_of_local_account?(status)
-    notify_about_mentions(status)
     distribute_to_followers(status)
   end
 
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index a7efa73c1..4104f6cd2 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -54,4 +54,15 @@ class UserMailer < Devise::Mailer
       mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject')
     end
   end
+
+  def welcome(user)
+    @resource = user
+    @instance = Rails.configuration.x.local_domain
+
+    return if @resource.disabled?
+
+    I18n.with_locale(@resource.locale || I18n.default_locale) do
+      mail to: @resource.email, subject: I18n.t('user_mailer.welcome.subject')
+    end
+  end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index c75ea028e..6df9668d5 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -104,7 +104,7 @@ class Account < ApplicationRecord
   has_many :lists, through: :list_accounts
 
   # Account migrations
-  belongs_to :moved_to_account, class_name: 'Account'
+  belongs_to :moved_to_account, class_name: 'Account', optional: true
 
   scope :remote, -> { where.not(domain: nil) }
   scope :local, -> { where(domain: nil) }
diff --git a/app/models/account_domain_block.rb b/app/models/account_domain_block.rb
index 35810b6c2..abcc923b3 100644
--- a/app/models/account_domain_block.rb
+++ b/app/models/account_domain_block.rb
@@ -13,7 +13,7 @@
 class AccountDomainBlock < ApplicationRecord
   include Paginable
 
-  belongs_to :account, required: true
+  belongs_to :account
   validates :domain, presence: true, uniqueness: { scope: :account_id }
 
   after_create  :remove_blocking_cache
diff --git a/app/models/admin/action_log.rb b/app/models/admin/action_log.rb
index 4e950fbf7..c437c8ee8 100644
--- a/app/models/admin/action_log.rb
+++ b/app/models/admin/action_log.rb
@@ -16,8 +16,8 @@
 class Admin::ActionLog < ApplicationRecord
   serialize :recorded_changes
 
-  belongs_to :account, required: true
-  belongs_to :target, required: true, polymorphic: true
+  belongs_to :account
+  belongs_to :target, polymorphic: true
 
   default_scope -> { order('id desc') }
 
diff --git a/app/models/block.rb b/app/models/block.rb
index 284abfe4c..441e6bca3 100644
--- a/app/models/block.rb
+++ b/app/models/block.rb
@@ -13,8 +13,8 @@
 class Block < ApplicationRecord
   include Paginable
 
-  belongs_to :account, required: true
-  belongs_to :target_account, class_name: 'Account', required: true
+  belongs_to :account
+  belongs_to :target_account, class_name: 'Account'
 
   validates :account_id, uniqueness: { scope: :target_account_id }
 
diff --git a/app/models/conversation_mute.rb b/app/models/conversation_mute.rb
index 248cdfe6e..272eb81af 100644
--- a/app/models/conversation_mute.rb
+++ b/app/models/conversation_mute.rb
@@ -9,6 +9,6 @@
 #
 
 class ConversationMute < ApplicationRecord
-  belongs_to :account, required: true
-  belongs_to :conversation, required: true
+  belongs_to :account
+  belongs_to :conversation
 end
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
index c38838f2a..2b1271f31 100644
--- a/app/models/favourite.rb
+++ b/app/models/favourite.rb
@@ -13,8 +13,8 @@
 class Favourite < ApplicationRecord
   include Paginable
 
-  belongs_to :account, inverse_of: :favourites, required: true
-  belongs_to :status,  inverse_of: :favourites, counter_cache: true, required: true
+  belongs_to :account, inverse_of: :favourites
+  belongs_to :status,  inverse_of: :favourites, counter_cache: true
 
   has_one :notification, as: :activity, dependent: :destroy
 
diff --git a/app/models/follow.rb b/app/models/follow.rb
index 3fb665afc..f953b8e3e 100644
--- a/app/models/follow.rb
+++ b/app/models/follow.rb
@@ -14,12 +14,11 @@
 class Follow < ApplicationRecord
   include Paginable
 
-  belongs_to :account, counter_cache: :following_count, required: true
+  belongs_to :account, counter_cache: :following_count
 
   belongs_to :target_account,
              class_name: 'Account',
-             counter_cache: :followers_count,
-             required: true
+             counter_cache: :followers_count
 
   has_one :notification, as: :activity, dependent: :destroy
 
diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb
index ebf6959ce..bd6c4a0b9 100644
--- a/app/models/follow_request.rb
+++ b/app/models/follow_request.rb
@@ -14,8 +14,8 @@
 class FollowRequest < ApplicationRecord
   include Paginable
 
-  belongs_to :account, required: true
-  belongs_to :target_account, class_name: 'Account', required: true
+  belongs_to :account
+  belongs_to :target_account, class_name: 'Account'
 
   has_one :notification, as: :activity, dependent: :destroy
 
diff --git a/app/models/import.rb b/app/models/import.rb
index 091fb3044..ba88435bf 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -20,7 +20,7 @@ class Import < ApplicationRecord
 
   self.inheritance_column = false
 
-  belongs_to :account, required: true
+  belongs_to :account
 
   enum type: [:following, :blocking, :muting]
 
diff --git a/app/models/invite.rb b/app/models/invite.rb
index 6907c1f1d..b87a3b722 100644
--- a/app/models/invite.rb
+++ b/app/models/invite.rb
@@ -14,7 +14,7 @@
 #
 
 class Invite < ApplicationRecord
-  belongs_to :user, required: true
+  belongs_to :user
   has_many :users, inverse_of: :invite
 
   scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) }
diff --git a/app/models/list.rb b/app/models/list.rb
index be85c3b87..a2ec7e84a 100644
--- a/app/models/list.rb
+++ b/app/models/list.rb
@@ -15,7 +15,7 @@ class List < ApplicationRecord
 
   PER_ACCOUNT_LIMIT = 50
 
-  belongs_to :account
+  belongs_to :account, optional: true
 
   has_many :list_accounts, inverse_of: :list, dependent: :destroy
   has_many :accounts, through: :list_accounts
diff --git a/app/models/list_account.rb b/app/models/list_account.rb
index 253932590..da46cf032 100644
--- a/app/models/list_account.rb
+++ b/app/models/list_account.rb
@@ -10,9 +10,9 @@
 #
 
 class ListAccount < ApplicationRecord
-  belongs_to :list, required: true
-  belongs_to :account, required: true
-  belongs_to :follow, required: true
+  belongs_to :list
+  belongs_to :account
+  belongs_to :follow
 
   validates :account_id, uniqueness: { scope: :list_id }
 
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 368ccef3a..25b7fd085 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -62,8 +62,8 @@ class MediaAttachment < ApplicationRecord
     },
   }.freeze
 
-  belongs_to :account, inverse_of: :media_attachments
-  belongs_to :status,  inverse_of: :media_attachments
+  belongs_to :account, inverse_of: :media_attachments, optional: true
+  belongs_to :status,  inverse_of: :media_attachments, optional: true
 
   has_attached_file :file,
                     styles: ->(f) { file_styles f },
diff --git a/app/models/mention.rb b/app/models/mention.rb
index 14533e6a9..f864bf8e1 100644
--- a/app/models/mention.rb
+++ b/app/models/mention.rb
@@ -11,8 +11,8 @@
 #
 
 class Mention < ApplicationRecord
-  belongs_to :account, inverse_of: :mentions, required: true
-  belongs_to :status, required: true
+  belongs_to :account, inverse_of: :mentions
+  belongs_to :status
 
   has_one :notification, as: :activity, dependent: :destroy
 
diff --git a/app/models/mute.rb b/app/models/mute.rb
index ca984641a..da4787179 100644
--- a/app/models/mute.rb
+++ b/app/models/mute.rb
@@ -14,8 +14,8 @@
 class Mute < ApplicationRecord
   include Paginable
 
-  belongs_to :account, required: true
-  belongs_to :target_account, class_name: 'Account', required: true
+  belongs_to :account
+  belongs_to :target_account, class_name: 'Account'
 
   validates :account_id, uniqueness: { scope: :target_account_id }
 
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 976963528..733f89cf7 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -26,15 +26,15 @@ class Notification < ApplicationRecord
 
   STATUS_INCLUDES = [:account, :application, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :application, :media_attachments, :tags, mentions: :account]].freeze
 
-  belongs_to :account
-  belongs_to :from_account, class_name: 'Account'
-  belongs_to :activity, polymorphic: true
-
-  belongs_to :mention,        foreign_type: 'Mention',       foreign_key: 'activity_id'
-  belongs_to :status,         foreign_type: 'Status',        foreign_key: 'activity_id'
-  belongs_to :follow,         foreign_type: 'Follow',        foreign_key: 'activity_id'
-  belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id'
-  belongs_to :favourite,      foreign_type: 'Favourite',     foreign_key: 'activity_id'
+  belongs_to :account, optional: true
+  belongs_to :from_account, class_name: 'Account', optional: true
+  belongs_to :activity, polymorphic: true, optional: true
+
+  belongs_to :mention,        foreign_type: 'Mention',       foreign_key: 'activity_id', optional: true
+  belongs_to :status,         foreign_type: 'Status',        foreign_key: 'activity_id', optional: true
+  belongs_to :follow,         foreign_type: 'Follow',        foreign_key: 'activity_id', optional: true
+  belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id', optional: true
+  belongs_to :favourite,      foreign_type: 'Favourite',     foreign_key: 'activity_id', optional: true
 
   validates :account_id, uniqueness: { scope: [:activity_type, :activity_id] }
   validates :activity_type, inclusion: { in: TYPE_CLASS_MAP.values }
diff --git a/app/models/report.rb b/app/models/report.rb
index c36f8db0a..f55fb6d3e 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -17,7 +17,7 @@
 class Report < ApplicationRecord
   belongs_to :account
   belongs_to :target_account, class_name: 'Account'
-  belongs_to :action_taken_by_account, class_name: 'Account'
+  belongs_to :action_taken_by_account, class_name: 'Account', optional: true
 
   scope :unresolved, -> { where(action_taken: false) }
   scope :resolved,   -> { where(action_taken: true) }
diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb
index 1d4ebca02..d364f03df 100644
--- a/app/models/session_activation.rb
+++ b/app/models/session_activation.rb
@@ -15,9 +15,9 @@
 #
 
 class SessionActivation < ApplicationRecord
-  belongs_to :user, inverse_of: :session_activations, required: true
-  belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy
-  belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy
+  belongs_to :user, inverse_of: :session_activations
+  belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy, optional: true
+  belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy, optional: true
 
   delegate :token,
            to: :access_token,
diff --git a/app/models/status.rb b/app/models/status.rb
index cb18b0705..e927fb9dd 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -34,14 +34,14 @@ class Status < ApplicationRecord
 
   enum visibility: [:public, :unlisted, :private, :direct], _suffix: :visibility
 
-  belongs_to :application, class_name: 'Doorkeeper::Application'
+  belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
 
-  belongs_to :account, inverse_of: :statuses, counter_cache: true, required: true
-  belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account'
-  belongs_to :conversation
+  belongs_to :account, inverse_of: :statuses, counter_cache: true
+  belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account', optional: true
+  belongs_to :conversation, optional: true
 
-  belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies
-  belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count
+  belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
+  belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count, optional: true
 
   has_many :favourites, inverse_of: :status, dependent: :destroy
   has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy
diff --git a/app/models/status_pin.rb b/app/models/status_pin.rb
index a72c19750..d3a98d8bd 100644
--- a/app/models/status_pin.rb
+++ b/app/models/status_pin.rb
@@ -11,8 +11,8 @@
 #
 
 class StatusPin < ApplicationRecord
-  belongs_to :account, required: true
-  belongs_to :status, required: true
+  belongs_to :account
+  belongs_to :status
 
   validates_with StatusPinValidator
 end
diff --git a/app/models/subscription.rb b/app/models/subscription.rb
index 7f2eeab91..ea1173160 100644
--- a/app/models/subscription.rb
+++ b/app/models/subscription.rb
@@ -19,7 +19,7 @@ class Subscription < ApplicationRecord
   MIN_EXPIRATION = 1.day.to_i
   MAX_EXPIRATION = 30.days.to_i
 
-  belongs_to :account, required: true
+  belongs_to :account
 
   validates :callback_url, presence: true
   validates :callback_url, uniqueness: { scope: :account_id }
diff --git a/app/models/user.rb b/app/models/user.rb
index 65ecb33cd..3cf9900bd 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -50,8 +50,8 @@ class User < ApplicationRecord
   devise :registerable, :recoverable, :rememberable, :trackable, :validatable,
          :confirmable
 
-  belongs_to :account, inverse_of: :user, required: true
-  belongs_to :invite, counter_cache: :uses
+  belongs_to :account, inverse_of: :user
+  belongs_to :invite, counter_cache: :uses, optional: true
   accepts_nested_attributes_for :account
 
   has_many :applications, class_name: 'Doorkeeper::Application', as: :owner
@@ -223,5 +223,6 @@ class User < ApplicationRecord
   def update_statistics!
     BootstrapTimelineWorker.perform_async(account_id)
     ActivityTracker.increment('activity:accounts:local')
+    UserMailer.welcome(self).deliver_later
   end
 end
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index d5960c3ad..ba086449c 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -54,7 +54,7 @@ class NotifyService < BaseService
   end
 
   def response_to_recipient?
-    @notification.target_status.in_reply_to_account_id == @recipient.id
+    @notification.target_status.in_reply_to_account_id == @recipient.id && @notification.target_status.thread&.direct_visibility?
   end
 
   def optional_non_following_and_direct?
diff --git a/app/services/precompute_feed_service.rb b/app/services/precompute_feed_service.rb
index 36aabaa00..4f771ff72 100644
--- a/app/services/precompute_feed_service.rb
+++ b/app/services/precompute_feed_service.rb
@@ -3,5 +3,6 @@
 class PrecomputeFeedService < BaseService
   def call(account)
     FeedManager.instance.populate_feed(account)
+    Redis.current.del("account:#{account.id}:regeneration")
   end
 end
diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml
index 85029ec76..ad15754d5 100644
--- a/app/views/layouts/mailer.html.haml
+++ b/app/views/layouts/mailer.html.haml
@@ -24,7 +24,7 @@
                               %tr
                                 %td.column-cell
                                   = link_to root_url do
-                                    = image_tag full_pack_url('logo_full.svg'), alt: 'Mastodon', height: 34, class: 'logo'
+                                    = image_tag full_pack_url('logo_full.png'), alt: 'Mastodon', height: 34, class: 'logo'
 
     = yield
 
@@ -41,15 +41,12 @@
                   %tr
                     %td.blank-cell.footer
                       .email-row
-                        .col-4
+                        .col-6
                           %table.column{ cellspacing: 0, cellpadding: 0 }
                             %tbody
                               %td.column-cell
                                 %p= t 'about.hosted_on', domain: site_hostname
                                 %p= link_to t('application_mailer.notification_preferences'), settings_notifications_url
-                        .col-2
-                          %table.column{ cellspacing: 0, cellpadding: 0 }
-                            %tbody
                               %td.column-cell.text-right
                                 = link_to root_url do
-                                  = image_tag full_pack_url('logo_transparent.svg'), alt: 'Mastodon', height: 24
+                                  = image_tag full_pack_url('logo_transparent.png'), alt: 'Mastodon', height: 24
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
index cdb284de8..87b0b2929 100644
--- a/app/views/layouts/mailer.text.erb
+++ b/app/views/layouts/mailer.text.erb
@@ -1,5 +1,5 @@
 <%= yield %>
 ---
 
-<%= t('application_mailer.signature', instance: site_hostname) %>
+<%= t 'about.hosted_on', domain: site_hostname %>
 <%= t('application_mailer.settings', link: settings_preferences_url) %>
diff --git a/app/views/notification_mailer/favourite.html.haml b/app/views/notification_mailer/favourite.html.haml
index f26b08b18..7d1b494d0 100644
--- a/app/views/notification_mailer/favourite.html.haml
+++ b/app/views/notification_mailer/favourite.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_grade.svg'), alt:''
+                                      = image_tag full_pack_url('icon_grade.png'), alt:''
 
                               %h1= t 'notification_mailer.favourite.title'
                               %p.lead= t('notification_mailer.favourite.body', name: @account.acct)
diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml
index 1290e2bc4..31a2b7445 100644
--- a/app/views/notification_mailer/follow.html.haml
+++ b/app/views/notification_mailer/follow.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_person_add.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_person_add.png'), alt: ''
 
                               %h1= t 'notification_mailer.follow.title'
                               %p.lead= t('notification_mailer.follow.body', name: @account.acct)
diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml
index 41efeafaf..44f1911c4 100644
--- a/app/views/notification_mailer/follow_request.html.haml
+++ b/app/views/notification_mailer/follow_request.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_person_add.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_person_add.png'), alt: ''
 
                               %h1= t 'notification_mailer.follow_request.title'
                               %p.lead= t('notification_mailer.follow_request.body', name: @account.acct)
diff --git a/app/views/notification_mailer/mention.html.haml b/app/views/notification_mailer/mention.html.haml
index 619c580ce..479fed41c 100644
--- a/app/views/notification_mailer/mention.html.haml
+++ b/app/views/notification_mailer/mention.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_reply.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_reply.png'), alt: ''
 
                               %h1= t 'notification_mailer.mention.title'
                               %p.lead= t('notification_mailer.mention.body', name: @status.account.acct)
diff --git a/app/views/notification_mailer/reblog.html.haml b/app/views/notification_mailer/reblog.html.haml
index 61c6ee6be..85b202cf9 100644
--- a/app/views/notification_mailer/reblog.html.haml
+++ b/app/views/notification_mailer/reblog.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_cached.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_cached.png'), alt: ''
 
                               %h1= t 'notification_mailer.reblog.title'
                               %p.lead= t('notification_mailer.reblog.body', name: @account.acct)
diff --git a/app/views/user_mailer/confirmation_instructions.ar.text.erb b/app/views/user_mailer/confirmation_instructions.ar.text.erb
deleted file mode 100644
index 087c6a9ae..000000000
--- a/app/views/user_mailer/confirmation_instructions.ar.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-مرحبا <%= @resource.email %> !
-
-لقد قمت بإنشاء حساب على <%= @instance %>.
-
-لتأكيد التسجيل يرجى النقر على الرابط التالي :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-يرجى الإطلاع على شروط الإستخدام <%= terms_url %>
-
-مع أجمل التحيات،
-
-فريق <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.ca.text.erb b/app/views/user_mailer/confirmation_instructions.ca.text.erb
deleted file mode 100644
index 77cc589e6..000000000
--- a/app/views/user_mailer/confirmation_instructions.ca.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Benvingut <%= @resource.email %> !
-
-Acabes de crear un compte a <%= @instance %>.
-
-Per confirmar la subscripció, si us plua fes clic en el següent vincle :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Si us plau també fes un cop d'ull als nostres termes i condicions <%= terms_url %>
-
-Sincerament,
-
-L'equip <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.en.text.erb b/app/views/user_mailer/confirmation_instructions.en.text.erb
deleted file mode 100644
index 0419adef0..000000000
--- a/app/views/user_mailer/confirmation_instructions.en.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Welcome <%= @resource.email %> !
-
-You just created an account on <%= @instance %>.
-
-To confirm your inscription, please click on the following link :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Please also check out our terms and conditions <%= terms_url %>
-
-Sincerely,
-
-The <%= @instance %> team
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.es.text.erb b/app/views/user_mailer/confirmation_instructions.es.text.erb
deleted file mode 100644
index e9d83b3f8..000000000
--- a/app/views/user_mailer/confirmation_instructions.es.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-¡Bienvenido, <%= @resource.email %>!
-
-Acabas de crear una cuenta en <%= @instance %>.
-
-Para confirmar tu registro, por favor ingresa al siguiente enlace:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Por favor, también revisa nuestros términos y condiciones <%= terms_url %>
-
-Sinceramente,
-
-El equipo de <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.fa.text.erb b/app/views/user_mailer/confirmation_instructions.fa.text.erb
deleted file mode 100644
index 76727b3be..000000000
--- a/app/views/user_mailer/confirmation_instructions.fa.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-خوش آمدید <%= @resource.email %> !
-
-شما الان در <%= @instance %> حساب باز کردید.
-
-برای تأیید عضویت، لطفاً روی پیوند زیر کلیک کنید:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-لطفاً همچنین شرایط و مقررات استفادهٔ ما را هم بخوانید <%= terms_url %>
-
-با احترام،
-
-گردانندگان سرور <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.fi.text.erb b/app/views/user_mailer/confirmation_instructions.fi.text.erb
deleted file mode 100644
index 796913abb..000000000
--- a/app/views/user_mailer/confirmation_instructions.fi.text.erb
+++ /dev/null
@@ -1,5 +0,0 @@
-Tervetuloa <%= @resource.email %>!
-
-Voit vahvistaa Mastodon tilisi klikkaamalla alla olevaa linkkiä:
-
-<%= confirmation_url(@resource, confirmation_token: @token) %>
diff --git a/app/views/user_mailer/confirmation_instructions.fr.text.erb b/app/views/user_mailer/confirmation_instructions.fr.text.erb
deleted file mode 100644
index 7730715f8..000000000
--- a/app/views/user_mailer/confirmation_instructions.fr.text.erb
+++ /dev/null
@@ -1,14 +0,0 @@
-Bonjour <%= @resource.email %> !
-
-Vous venez de vous créer un compte sur <%= @instance %> et nous vous en remercions.
-
-Pour confirmer votre inscription, merci de cliquer sur le lien suivant :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Après votre première connexion, vous pourrez accéder à la documentation de l’outil.
-
-Pour rappel, nos conditions d’utilisation sont indiquées ici <%= terms_url %>
-
-Amicalement,
-
-L’équipe <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.he.text.erb b/app/views/user_mailer/confirmation_instructions.he.text.erb
deleted file mode 100644
index 8e37fc641..000000000
--- a/app/views/user_mailer/confirmation_instructions.he.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-שלום <%= @resource.email %> !
-
-הרגע יצרת חשבון בקהילה <%= @instance %>.
-
-כדי לוודא את הרשמתך, יש ללחוץ על הקישורית הבאה :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-יש לעבור גם על תנאי השימוש <%= terms_url %>
-
-בתודה מראש,
-
-צוות ניהול <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.html.haml b/app/views/user_mailer/confirmation_instructions.html.haml
index 0f999bcbc..1f088a16f 100644
--- a/app/views/user_mailer/confirmation_instructions.html.haml
+++ b/app/views/user_mailer/confirmation_instructions.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_email.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_email.png'), alt: ''
 
                               %h1= t 'devise.mailer.confirmation_instructions.title'
 
diff --git a/app/views/user_mailer/confirmation_instructions.id.text.erb b/app/views/user_mailer/confirmation_instructions.id.text.erb
deleted file mode 100644
index 0486c3c5c..000000000
--- a/app/views/user_mailer/confirmation_instructions.id.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Selamat datang <%= @resource.email %> !
-
-Anda baru saja membuat akun di <%= @instance %>.
-
-Untuk mengkonfirmasi, silakan klik link berikut ini :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Silakan cek <%= terms_url %> kami
-
-Hormat kami,
-
-Tim <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.it.text.erb b/app/views/user_mailer/confirmation_instructions.it.text.erb
deleted file mode 100644
index ce9411173..000000000
--- a/app/views/user_mailer/confirmation_instructions.it.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Benvenuto <%= @resource.email %> !
-
-Hai appena creato un account su <%= @instance %>.
-
-er confermare la tua iscrizione, fai clic sul seguente link :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Per piacere leggi anche i nostri termini e condizioni <%= terms_url %>
-
-Sinceramente,
-
-Il team <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.ja.text.erb b/app/views/user_mailer/confirmation_instructions.ja.text.erb
deleted file mode 100644
index 99868ba8a..000000000
--- a/app/views/user_mailer/confirmation_instructions.ja.text.erb
+++ /dev/null
@@ -1,11 +0,0 @@
-ようこそ<%= @resource.email %>さん
-
-<%= @instance %>にアカウントが作成されました。
-
-以下のリンクをクリックしてMastodonアカウントのメールアドレスを確認してください。
-
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-また、インスタンスの<%= link_to '利用規約', terms_url %>についてもご確認ください。
-
-<%= @instance %> チーム
diff --git a/app/views/user_mailer/confirmation_instructions.ko.text.erb b/app/views/user_mailer/confirmation_instructions.ko.text.erb
deleted file mode 100644
index c46400f07..000000000
--- a/app/views/user_mailer/confirmation_instructions.ko.text.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-안녕하세요 <%= @resource.email %> 님!
-
-<%= @instance %>에 새로 계정을 만들었습니다.
-
-아래 링크를 눌러 회원가입을 완료 하세요.
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-약관도 확인 바랍니다. <%= terms_url %>
-
-<%= @instance %> 드림
diff --git a/app/views/user_mailer/confirmation_instructions.nl.text.erb b/app/views/user_mailer/confirmation_instructions.nl.text.erb
deleted file mode 100644
index 3c14896b3..000000000
--- a/app/views/user_mailer/confirmation_instructions.nl.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Welkom <%= @resource.email %> !
-
-Je hebt zojuist een account aangemaakt op <%= @instance %>.
-
-Klik op de volgende link om jouw registratie te bevestigen :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Lees ook onze gebruikersvoorwaarden op <%= terms_url %>
-
-Vriendelijke groet,
-
-De beheerder(s) van <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.no.text.erb b/app/views/user_mailer/confirmation_instructions.no.text.erb
deleted file mode 100644
index 3739c99d4..000000000
--- a/app/views/user_mailer/confirmation_instructions.no.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Velkommen <%= @resource.email %> !
-
-Du har akkurat opprettet en konto på <%= @instance %>.
-
-For å bekrefte innskriving i manntallet vennligst trykk på følgende lenke :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Vennligst også les våre brukervilkår <%= terms_url %>
-
-Med vennlig hilsen,
-
-Gjengen bak <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.oc.text.erb b/app/views/user_mailer/confirmation_instructions.oc.text.erb
deleted file mode 100644
index fe04fe3d0..000000000
--- a/app/views/user_mailer/confirmation_instructions.oc.text.erb
+++ /dev/null
@@ -1,14 +0,0 @@
-Bonjorn <%= @resource.email %> !
-
-Venètz de vos crear un compte sus <%= @instance %> e vos mercegem :)
-
-er confirmar vòstra inscripcion, mercés de clicar sul ligam seguent : 
-<%= link_to 'Confirmar mon compte', confirmation_url(@resource, confirmation_token: @token) %>
-
-Aprèp vòstra primièra connexion, poiretz accedir a la documentacion de l’aisina.
-
-Pensatz tanben de gaitar nòstres <%= link_to 'tèrmes e condicions d\'utilizacion', terms_url %>.
-
-Amistosament,
-
-La còla <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.pl.text.erb b/app/views/user_mailer/confirmation_instructions.pl.text.erb
deleted file mode 100644
index f20082e16..000000000
--- a/app/views/user_mailer/confirmation_instructions.pl.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Witaj, <%= @resource.email %>!
-
-Właśnie utworzyłeś konto na instancji <%= @instance %>.
-
-Aby aktywować konto, odwiedź poniższy link:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Pamiętaj przeczytać nasz regulamin i zasady użytkowania: <%= terms_url %>
-
-Z pozdrowieniami,
-
-Zespół <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb b/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb
deleted file mode 100644
index 578f7acb5..000000000
--- a/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Boas vindas, <%= @resource.email %>!
-
-Você acabou de criar uma conta na instância <%= @instance %>.
-
-Para confirmar o seu cadastro, por favor clique no link a seguir:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Por favor, leia também os nossos termos e condições de uso <%= terms_url %>
-
-Atenciosamente,
-
-A equipe da instância <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.ru.text.erb b/app/views/user_mailer/confirmation_instructions.ru.text.erb
deleted file mode 100644
index 884f75401..000000000
--- a/app/views/user_mailer/confirmation_instructions.ru.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Добро пожаловать, <%= @resource.email %> !
-
-Вы только что завели аккаунт на <%= @instance %>.
-
-Чтобы подтвердить создание аккаунта, пожалуйста, перейдите по этой ссылке:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Также просим Вас прочитать об условиях использования аккаунта здесь: <%= terms_url %>
-
-Искренне Ваши,
-
-Команда <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb b/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb
deleted file mode 100644
index 60fe9db0d..000000000
--- a/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Dobrodošao <%= @resource.email %> !
-
-Upravo ste napravili nalog na instanci <%= @instance %>.
-
-Da potvrdite Vašu registraciju, molimo Vas kliknite na sledeći link:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Takođe pogledajte i pravila i uslove korišćenja <%= terms_url %>
-
-S poštovanjem,
-
-<%= @instance %> tim
diff --git a/app/views/user_mailer/confirmation_instructions.sr.text.erb b/app/views/user_mailer/confirmation_instructions.sr.text.erb
deleted file mode 100644
index e7cb7e188..000000000
--- a/app/views/user_mailer/confirmation_instructions.sr.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Добродошао <%= @resource.email %> !
-
-Управо сте направили налог на инстанци <%= @instance %>.
-
-Да потврдите Вашу регистрацију, молимо Вас кликните на следећи линк:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Такође погледајте и правила и услове коришћења <%= terms_url %>
-
-С поштовањем,
-
-<%= @instance %> тим
diff --git a/app/views/user_mailer/confirmation_instructions.sv.text.erb b/app/views/user_mailer/confirmation_instructions.sv.text.erb
deleted file mode 100644
index 64ffb9799..000000000
--- a/app/views/user_mailer/confirmation_instructions.sv.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Välkommen <%= @resource.email %> !
-
-Du har precis skapat ett konto på <%= @instance %>.
-
-För att bekräfta din inskrift, vänligen klicka på följande länk :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Vänligen läs även våra användarvillkor <%= terms_url %>
-
-Vänliga hälsningar,
-
-Teamet på <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.text.erb b/app/views/user_mailer/confirmation_instructions.text.erb
new file mode 100644
index 000000000..e01eecb27
--- /dev/null
+++ b/app/views/user_mailer/confirmation_instructions.text.erb
@@ -0,0 +1,12 @@
+<%= t 'devise.mailer.confirmation_instructions.title' %>
+
+===
+
+<%= t 'devise.mailer.confirmation_instructions.explanation', host: site_hostname %>
+
+=> <%= confirmation_url(@resource, confirmation_token: @token) %>
+
+<%= strip_tags(t('devise.mailer.confirmation_instructions.extra_html', terms_path: about_more_url, policy_path: terms_url)) %>
+
+=> <%= about_more_url %>
+=> <%= terms_url %>
diff --git a/app/views/user_mailer/confirmation_instructions.tr.text.erb b/app/views/user_mailer/confirmation_instructions.tr.text.erb
deleted file mode 100644
index 01b1c69e2..000000000
--- a/app/views/user_mailer/confirmation_instructions.tr.text.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-Aramıza hoşgeldin <%= @resource.email %>
-
-Bu sunucumuzda yeni bir hesap oluşturduğunu görüyoruz: <%= @instance %>.
-
-Siz olduğunuzu teyit edebilmemiz için lütfen aşağıdaki linke tıklayınız:
-
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Ayrıca kullanım şartları ve koşulları sayfamızı inceleyebilirsin <%= terms_url %>
-
-En içten dileklerimizle,
-
-<%= @instance %> ekibi
diff --git a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb b/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb
deleted file mode 100644
index 25d901f16..000000000
--- a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-<%= @resource.email %>,你好呀!
-
-你刚刚在 <%= @instance %> 创建了一个帐户呢。
-
-点击下面的链接来完成注册啦:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-记得读一读我们的使用条款哦:<%= terms_url %>
-
-来自 <%= @instance %> 管理团队
\ No newline at end of file
diff --git a/app/views/user_mailer/email_changed.en.text.erb b/app/views/user_mailer/email_changed.en.text.erb
deleted file mode 100644
index 971972461..000000000
--- a/app/views/user_mailer/email_changed.en.text.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-Hello <%= @resource.email %>!
-
-<% if @resource&.unconfirmed_email? %>
-We're contacting you to notify you that the email you use on <%= @instance %> is being changed to <%= @resource.unconfirmed_email %>.
-<% else %>
-We're contacting you to notify you that the email you use on <%= @instance %> has been changed to <%= @resource.email %>.
-<% end %>
-
-If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account.
-
-Sincerely,
-
-The <%= @instance %> team
diff --git a/app/views/user_mailer/email_changed.html.haml b/app/views/user_mailer/email_changed.html.haml
index 45dc06650..7e82f23e4 100644
--- a/app/views/user_mailer/email_changed.html.haml
+++ b/app/views/user_mailer/email_changed.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_email.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_email.png'), alt: ''
 
                               %h1= t 'devise.mailer.email_changed.title'
                               %p.lead= t 'devise.mailer.email_changed.explanation'
diff --git a/app/views/user_mailer/email_changed.ja.text.erb b/app/views/user_mailer/email_changed.ja.text.erb
deleted file mode 100644
index 33ee6d10b..000000000
--- a/app/views/user_mailer/email_changed.ja.text.erb
+++ /dev/null
@@ -1,11 +0,0 @@
-Hello <%= @resource.email %>!
-
-<% if @resource&.unconfirmed_email? %>
-<%= @instance %>で使っているメールアドレスが<%= @resource.unconfirmed_email %>に変更されようとしています。
-<% else %>
-<%= @instance %>で使っているメールアドレスが<%= @resource.email %>に変更されました。
-<% end %>
-
-メールアドレスを変更した覚えがない場合、誰かがあなたのアカウントにアクセスしたおそれがあります。すぐにパスワードを変更するか、アカウントにアクセスできない場合はインスタンスの管理者に連絡してください。
-
-<%= @instance %>チームより
diff --git a/app/views/user_mailer/email_changed.oc.text.erb b/app/views/user_mailer/email_changed.oc.text.erb
deleted file mode 100644
index 2305ef834..000000000
--- a/app/views/user_mailer/email_changed.oc.text.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-Bonjorn <%= @resource.email %> !
-
-<% if @resource&.unconfirmed_email? %>
-Vos contactem per vos senhalar que l’adreça qu’utilizatz per <%= @instance %> es cambiada per aquesta d’aquí <%= @resource.unconfirmed_email %>.
-<% else %>
-Vos contactem per vos senhalar que l’adreça qu’utilizatz per <%= @instance %> es cambiada per aquesta d’aquí <%= @resource.email %>.
-<% end %>
-
-S’avètz pas demandat aqueste cambiament d’adreça, poiriá arribar que qualqu’un mai aguèsse agut accès a vòstre compte. Mercés de cambiar sulpic vòstre senhal o de contactar vòstre administrator d’instància se l’accès a vòstre compte vos es barrat.
-
-Amistosament,
-
-La còla <%= @instance %>
diff --git a/app/views/user_mailer/email_changed.pl.text.erb b/app/views/user_mailer/email_changed.pl.text.erb
deleted file mode 100644
index 134a79e95..000000000
--- a/app/views/user_mailer/email_changed.pl.text.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-Witaj, <%= @resource.email %>!
-
-<% if @resource&.unconfirmed_email? %>
-Informujemy, że e-mail używany przez Ciebie na <%= @instance %> został zmieniony na <%= @resource.unconfirmed_email %>.
-<% else %>
-Informujemy, że e-mail używany przez Ciebie na <%= @instance %> został zmieniony na <%= @resource.email %>.
-<% end %>
-
-Jeżeli to nie Ty, prawdopodobnie ktoś uzyskał dostęp do Twojego konta. Zalecana jest natychmiastowa zmiana hasła lub skontaktowanie się z administratorem, jeżeli nie masz dostępu do swojego konta.
-
-Z pozdrowieniami,
-
-Zespół <%= @instance %>
diff --git a/app/views/user_mailer/email_changed.text.erb b/app/views/user_mailer/email_changed.text.erb
new file mode 100644
index 000000000..2b58415f5
--- /dev/null
+++ b/app/views/user_mailer/email_changed.text.erb
@@ -0,0 +1,9 @@
+<%= t 'devise.mailer.email_changed.title' %>
+
+===
+
+<%= t 'devise.mailer.email_changed.explanation' %>
+
+<%= @resource.unconfirmed_email %>
+
+<%= t 'devise.mailer.email_changed.extra' %>
diff --git a/app/views/user_mailer/email_changed.zh-cn.text.erb b/app/views/user_mailer/email_changed.zh-cn.text.erb
deleted file mode 100644
index d59ac58c4..000000000
--- a/app/views/user_mailer/email_changed.zh-cn.text.erb
+++ /dev/null
@@ -1,11 +0,0 @@
-<%= @resource.email %>,你好呀!
-
-<% if @resource&.unconfirmed_email? %>
-我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址即将变更为 <%= @resource.unconfirmed_email %>。
-<% else %>
-我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址已经变更为 <%= @resource.unconfirmed_email %>。
-<% end %>
-
-如果你并没有请求更改你的电子邮件地址,则他人很有可能已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系实例的管理员请求协助。
-
-来自 <%= @instance %> 管理团队
diff --git a/app/views/user_mailer/password_change.ar.text.erb b/app/views/user_mailer/password_change.ar.text.erb
deleted file mode 100644
index ae0161f31..000000000
--- a/app/views/user_mailer/password_change.ar.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-صباح الخير <%= @resource.email %> !
-
-نود أن نخبرك أنه قد تم تعديل كلمة مرور ماستدون الخاصة بك بنجاح.
diff --git a/app/views/user_mailer/password_change.ca.text.erb b/app/views/user_mailer/password_change.ca.text.erb
deleted file mode 100644
index c2fdfc82c..000000000
--- a/app/views/user_mailer/password_change.ca.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hola <%= @resource.email %>!
-
-Aquest correu es per a notificar-te que la teva contrasenya a mastodont.cat ha canviat.
diff --git a/app/views/user_mailer/password_change.en.text.erb b/app/views/user_mailer/password_change.en.text.erb
deleted file mode 100644
index 3ae461c97..000000000
--- a/app/views/user_mailer/password_change.en.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hello <%= @resource.email %>!
-
-We're contacting you to notify you that your password on <%= @instance %> has been changed.
diff --git a/app/views/user_mailer/password_change.es.text.erb b/app/views/user_mailer/password_change.es.text.erb
deleted file mode 100644
index 192faf9ad..000000000
--- a/app/views/user_mailer/password_change.es.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-¡Hola, <%= @resource.email %>!
-
-Te contactamos para notificarte que tu contraseña en <%= @instance %> ha sido modificada.
\ No newline at end of file
diff --git a/app/views/user_mailer/password_change.fa.text.erb b/app/views/user_mailer/password_change.fa.text.erb
deleted file mode 100644
index 0c2995958..000000000
--- a/app/views/user_mailer/password_change.fa.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-سلام <%= @resource.email %>!
-
-این پیغام برای این است که به شما بگوییم رمز شما در ماستدون تغییر کرده است.
diff --git a/app/views/user_mailer/password_change.fi.text.erb b/app/views/user_mailer/password_change.fi.text.erb
deleted file mode 100644
index d90c3fdeb..000000000
--- a/app/views/user_mailer/password_change.fi.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hei <%= @resource.email %>!
-
-Lähetämme tämän viestin ilmoittaaksemme että salasanasi on vaihdettu.
diff --git a/app/views/user_mailer/password_change.fr.text.erb b/app/views/user_mailer/password_change.fr.text.erb
deleted file mode 100644
index f068f1cd6..000000000
--- a/app/views/user_mailer/password_change.fr.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Bonjour <%= @resource.email %> !
-
-Nous vous contactons pour vous informer que votre mot de passe sur Mastodon a bien été modifié.
diff --git a/app/views/user_mailer/password_change.he.text.erb b/app/views/user_mailer/password_change.he.text.erb
deleted file mode 100644
index 1f601c6b2..000000000
--- a/app/views/user_mailer/password_change.he.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-שלום <%= @resource.email %>!
-
-רצינו להודיע לך שסיסמתך במסטודון אצלנו הוחלפה.
diff --git a/app/views/user_mailer/password_change.html.haml b/app/views/user_mailer/password_change.html.haml
index 2e9377dff..26314a217 100644
--- a/app/views/user_mailer/password_change.html.haml
+++ b/app/views/user_mailer/password_change.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_lock_open.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_lock_open.png'), alt: ''
 
                               %h1= t 'devise.mailer.password_change.title'
                               %p.lead= t 'devise.mailer.password_change.explanation'
diff --git a/app/views/user_mailer/password_change.id.text.erb b/app/views/user_mailer/password_change.id.text.erb
deleted file mode 100644
index 1a67fd407..000000000
--- a/app/views/user_mailer/password_change.id.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hai <%= @resource.email %>!
-
-Kami menghubungi anda untuk memberitahu bahwa kata sandi anda di Mastodon telah diubah.
diff --git a/app/views/user_mailer/password_change.it.text.erb b/app/views/user_mailer/password_change.it.text.erb
deleted file mode 100644
index ea187670e..000000000
--- a/app/views/user_mailer/password_change.it.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Ciao <%= @resource.email %>!
-
-Ti stiamo contattando per avvisarti che la tua password su Mastodon è stata cambiata.
diff --git a/app/views/user_mailer/password_change.ja.text.erb b/app/views/user_mailer/password_change.ja.text.erb
deleted file mode 100644
index aa29b9b2b..000000000
--- a/app/views/user_mailer/password_change.ja.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-こんにちは<%= @resource.email %>さん
-
-Mastodonアカウントのパスワードが変更されました。
diff --git a/app/views/user_mailer/password_change.nl.text.erb b/app/views/user_mailer/password_change.nl.text.erb
deleted file mode 100644
index 33accd99c..000000000
--- a/app/views/user_mailer/password_change.nl.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hallo <%= @resource.email %>!
-
-Hierbij laten we jou weten dat jouw wachtwoord op Mastodon is veranderd.
diff --git a/app/views/user_mailer/password_change.no.text.erb b/app/views/user_mailer/password_change.no.text.erb
deleted file mode 100644
index 1707976c1..000000000
--- a/app/views/user_mailer/password_change.no.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hei <%= @resource.email %>!
-
-Ditt Mastodon-passord har blitt endret.
diff --git a/app/views/user_mailer/password_change.oc.text.erb b/app/views/user_mailer/password_change.oc.text.erb
deleted file mode 100644
index 9fe9116d9..000000000
--- a/app/views/user_mailer/password_change.oc.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Bonjorn <%= @resource.email %> !
-
-Vos contactem per vos avisar qu’avèm ben cambiat vòstre senhal Mastodon.
diff --git a/app/views/user_mailer/password_change.pl.text.erb b/app/views/user_mailer/password_change.pl.text.erb
deleted file mode 100644
index bd2efee0f..000000000
--- a/app/views/user_mailer/password_change.pl.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Witaj, <%= @resource.email %>!
-
-Informujemy, że ostatnio zmieniono Twoje hasło na <%= @instance %>.
diff --git a/app/views/user_mailer/password_change.pt-BR.text.erb b/app/views/user_mailer/password_change.pt-BR.text.erb
deleted file mode 100644
index eb7368ba9..000000000
--- a/app/views/user_mailer/password_change.pt-BR.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Olá, <%= @resource.email %>!
-
-Estamos te contatando para te notificar que a sua senha na instância <%= @instance %> foi modificada.
diff --git a/app/views/user_mailer/password_change.ru.text.erb b/app/views/user_mailer/password_change.ru.text.erb
deleted file mode 100644
index 6a3556dae..000000000
--- a/app/views/user_mailer/password_change.ru.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Здравствуйте, <%= @resource.email %>!
-
-Мы пишем, чтобы оповестить Вас о смене пароля на Вашем аккаунте Mastodon.
diff --git a/app/views/user_mailer/password_change.sr-Latn.text.erb b/app/views/user_mailer/password_change.sr-Latn.text.erb
deleted file mode 100644
index 6e0666d8d..000000000
--- a/app/views/user_mailer/password_change.sr-Latn.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Zdravo <%= @resource.email %>!
-
-Želimo samo da Vas obavestimo da je Vaša lozinka na Mastodont instanci <%= @instance %> promenjena.
diff --git a/app/views/user_mailer/password_change.sr.text.erb b/app/views/user_mailer/password_change.sr.text.erb
deleted file mode 100644
index 9082201c0..000000000
--- a/app/views/user_mailer/password_change.sr.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Здраво <%= @resource.email %>!
-
-Желимо само да Вас обавестимо да је Ваша лозинка на Мастодонт инстанци <%= @instance %> промењена.
diff --git a/app/views/user_mailer/password_change.sv.text.erb b/app/views/user_mailer/password_change.sv.text.erb
deleted file mode 100644
index b6df73226..000000000
--- a/app/views/user_mailer/password_change.sv.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-Hej <%= @resource.email %>!
-
-Vi kontaktar dig för att meddela dig att ditt lösenord på <%= @instance %> har blivit ändrat.
diff --git a/app/views/user_mailer/password_change.text.erb b/app/views/user_mailer/password_change.text.erb
new file mode 100644
index 000000000..77a37894e
--- /dev/null
+++ b/app/views/user_mailer/password_change.text.erb
@@ -0,0 +1,7 @@
+<%= t 'devise.mailer.password_change.title' %>
+
+===
+
+<%= t 'devise.mailer.password_change.explanation' %>
+
+<%= t 'devise.mailer.password_change.extra' %>
diff --git a/app/views/user_mailer/password_change.th.text.erb b/app/views/user_mailer/password_change.th.text.erb
deleted file mode 100644
index 0d28a207c..000000000
--- a/app/views/user_mailer/password_change.th.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-สวัสดี <%= @resource.email %>!
-
-เราติดต่อมาเพื่อแจ้งให้คุณทราบว่า พาสเวิร์ดของคุณถูกเปลี่ยนแล้ว
diff --git a/app/views/user_mailer/password_change.tr.text.erb b/app/views/user_mailer/password_change.tr.text.erb
deleted file mode 100644
index 873c5f962..000000000
--- a/app/views/user_mailer/password_change.tr.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Merhaba <%= @resource.email %>!
-
-<%= @instance %>'deki parolanızın değiştirildiğini hatırlatmak isteriz.
-
-En içten dileklerimizle,
-
-<%= @instance %> ekibi
-
diff --git a/app/views/user_mailer/password_change.zh-cn.text.erb b/app/views/user_mailer/password_change.zh-cn.text.erb
deleted file mode 100644
index dbc065173..000000000
--- a/app/views/user_mailer/password_change.zh-cn.text.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-<%= @resource.email %>,你好呀!
-
-提醒一下,你在 <%= @instance %> 上的密码被更改了哦。
diff --git a/app/views/user_mailer/reconfirmation_instructions.en.text.erb b/app/views/user_mailer/reconfirmation_instructions.en.text.erb
deleted file mode 100644
index c1c735b3a..000000000
--- a/app/views/user_mailer/reconfirmation_instructions.en.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Hello <%= @resource.unconfirmed_email %>!
-
-You requested a change to the email address you use on <%= @instance %>.
-
-To confirm your new email, please click on the following link:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Please also check out our terms and conditions <%= terms_url %>
-
-Sincerely,
-
-The <%= @instance %> team
diff --git a/app/views/user_mailer/reconfirmation_instructions.html.haml b/app/views/user_mailer/reconfirmation_instructions.html.haml
index 3ae226093..e3be8e295 100644
--- a/app/views/user_mailer/reconfirmation_instructions.html.haml
+++ b/app/views/user_mailer/reconfirmation_instructions.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_email.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_email.png'), alt: ''
 
                               %h1= t 'devise.mailer.reconfirmation_instructions.title'
                               %p.lead= t 'devise.mailer.reconfirmation_instructions.explanation'
diff --git a/app/views/user_mailer/reconfirmation_instructions.ja.text.erb b/app/views/user_mailer/reconfirmation_instructions.ja.text.erb
deleted file mode 100644
index 5326e4512..000000000
--- a/app/views/user_mailer/reconfirmation_instructions.ja.text.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-こんにちは<%= @resource.unconfirmed_email %>さん
-
-<%= @instance %>で使っているメールアドレスの変更をあなたがリクエストしました。
-
-新しいメールアドレスを確認するには次のリンクをクリックしてください:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-また利用規約もご確認ください <%= terms_url %>
-
-<%= @instance %>チームより
diff --git a/app/views/user_mailer/reconfirmation_instructions.oc.text.erb b/app/views/user_mailer/reconfirmation_instructions.oc.text.erb
deleted file mode 100644
index 6f174bb3e..000000000
--- a/app/views/user_mailer/reconfirmation_instructions.oc.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Bonjorn <%= @resource.unconfirmed_email %> !
-
-Avètz demandat a cambiar vòstra adreça de corrièl qu’utilizatz per <%= @instance %>.
-
-Per confirmar vòstra novèla adreça, mercés de clicar lo ligam seguent :
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Mercés tanben de gaitar nòstres <%= link_to 'terms and conditions', terms_url %>.
-
-Amistosament,
-
-La còla <%= @instance %>
diff --git a/app/views/user_mailer/reconfirmation_instructions.pl.text.erb b/app/views/user_mailer/reconfirmation_instructions.pl.text.erb
deleted file mode 100644
index 032718f81..000000000
--- a/app/views/user_mailer/reconfirmation_instructions.pl.text.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-Witaj, <%= @resource.unconfirmed_email %>!
-
-Dokonano próby zmiany adresu e-mail, którego używasz na <%= @instance %>.
-
-Aby potwierdzić posiadanie tego adresu e-mail, kliknij na poniższy odnośnik:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-Pamiętaj o przeczytaniu naszych zasad użytkowania: <%= terms_url %>
-
-Z pozdrowieniami,
-
-Zespół <%= @instance %>
diff --git a/app/views/user_mailer/reconfirmation_instructions.text.erb b/app/views/user_mailer/reconfirmation_instructions.text.erb
new file mode 100644
index 000000000..b5e530251
--- /dev/null
+++ b/app/views/user_mailer/reconfirmation_instructions.text.erb
@@ -0,0 +1,9 @@
+<%= t 'devise.mailer.reconfirmation_instructions.title' %>
+
+===
+
+<%= t 'devise.mailer.reconfirmation_instructions.explanation' %>
+
+=> <%= confirmation_url(@resource, confirmation_token: @token) %>
+
+<%= t 'devise.mailer.reconfirmation_instructions.extra' %>
diff --git a/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb b/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb
deleted file mode 100644
index 977d78137..000000000
--- a/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-<%= @resource.email %>,你好呀!
-
-你正在更改你在 <%= @instance %> 使用的电子邮件地址。
-
-点击下面的链接以确认操作:
-<%= confirmation_url(@resource, confirmation_token: @token) %>
-
-记得读一读我们的使用条款哦:<%= terms_url %>
-
-来自 <%= @instance %> 管理团队
diff --git a/app/views/user_mailer/reset_password_instructions.ar.text.erb b/app/views/user_mailer/reset_password_instructions.ar.text.erb
deleted file mode 100644
index 0dfc85a36..000000000
--- a/app/views/user_mailer/reset_password_instructions.ar.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-صباح الخير <%= @resource.email %>!
-
-لقد طلب أحدهم رابط تعديل كلمة مرور ماستدون الخاصة بك. يمكنك المتابعة و مواصلة التعديل على الرابط التالي.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-يمكنك تجاهل هذه الرسالة إن لم تكن من طلب ذلك.
-لن يتم تعديل كلمة المرور الخاصة بك و ستبقى نفسها إلا إذا قمت بالضغط على الرابط أعلاه.
diff --git a/app/views/user_mailer/reset_password_instructions.ca.text.erb b/app/views/user_mailer/reset_password_instructions.ca.text.erb
deleted file mode 100644
index ca4c494c3..000000000
--- a/app/views/user_mailer/reset_password_instructions.ca.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hola <%= @resource.email %>!
-
-Algú ha sol·licitat un enllaç per canviar la contrasenya a mastodont.cat. Això es pot fer a través del següent enllaç.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Si no has sol·licitat aquest canvi, si us plau, ignora aquest correu.
-La teva contrasenya no canviarà fins que accedeix a l'enllaç de dalt per crear-ne una de nova.
diff --git a/app/views/user_mailer/reset_password_instructions.en.text.erb b/app/views/user_mailer/reset_password_instructions.en.text.erb
deleted file mode 100644
index 7ed22dc2c..000000000
--- a/app/views/user_mailer/reset_password_instructions.en.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hello <%= @resource.email %>!
-
-Someone has requested a link to change your password on <%= @instance %>. You can do this through the link below.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-If you didn't request this, please ignore this email.
-Your password won't change until you access the link above and create a new one.
diff --git a/app/views/user_mailer/reset_password_instructions.es.text.erb b/app/views/user_mailer/reset_password_instructions.es.text.erb
deleted file mode 100644
index 8abafcc99..000000000
--- a/app/views/user_mailer/reset_password_instructions.es.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-¡Hola, <%= @resource.email %>!
-
-Alguien pidió un enlace para cambiar tu contraseña en <%= @instance %>. Puedes hacer esto con el siguiente enlace.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Si no fuiste tú, por favor ignora este mensaje.
-Tu contraseña no cambiará hasta que ingreses al enlace y crees una nueva.
diff --git a/app/views/user_mailer/reset_password_instructions.fa.text.erb b/app/views/user_mailer/reset_password_instructions.fa.text.erb
deleted file mode 100644
index 0b01ba906..000000000
--- a/app/views/user_mailer/reset_password_instructions.fa.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-سلام <%= @resource.email %>!
-
-یک نفر درخواست کرده تا رمز شما در ماستدون عوض شود. برای این کار روی پیوند زیر کلیک کنید.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-اگر شما چنین درخواستی نداده‌اید، لطفاً این ایمیل را نادیده بگیرید.
-تا وقتی که شما پیوند بالا را نبینید و رمز تازه‌ای نسازید، رمز شما عوض نخواهد شد.
diff --git a/app/views/user_mailer/reset_password_instructions.fi.text.erb b/app/views/user_mailer/reset_password_instructions.fi.text.erb
deleted file mode 100644
index c826d5fc8..000000000
--- a/app/views/user_mailer/reset_password_instructions.fi.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hei <%= @resource.email %>!
-
-Joku on pyytänyt salasanvaihto Mastodonissa. Voit tehdä sen allaolevassa linkissä.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Jos et pyytänyt vaihtoa, poista tämä viesti.
-Salasanaasi ei vaihdeta ennen kuin menet ylläolevaan linkkiin ja luot uuden.
diff --git a/app/views/user_mailer/reset_password_instructions.fr.text.erb b/app/views/user_mailer/reset_password_instructions.fr.text.erb
deleted file mode 100644
index 07fa3644a..000000000
--- a/app/views/user_mailer/reset_password_instructions.fr.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Bonjour <%= @resource.email %> !
-
-Quelqu’un a demandé à réinitialiser votre mot de passe sur Mastodon. Vous pouvez effectuer la réinitialisation en cliquant sur le lien ci-dessous.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Si vous n’êtes pas à l’origine de cette demande, vous pouvez ignorer ce message.
-Votre mot de passe ne sera pas modifié tant que vous n’accéderez pas au lien ci-dessus et n’en choisirez pas un nouveau.
diff --git a/app/views/user_mailer/reset_password_instructions.he.text.erb b/app/views/user_mailer/reset_password_instructions.he.text.erb
deleted file mode 100644
index 63c96c06b..000000000
--- a/app/views/user_mailer/reset_password_instructions.he.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-שלום <%= @resource.email %>!
-
-מישהו ביקש לינק להחלפת סיסמתך במסטודון. באפשרותך לעשות זאת ע"י בלחיצה על הקישורית שבהמשך.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-אם בקשה זו לא הגיעה ממך, אפשר להתעלם מההודעה.
-סיסמתך לא תוחלף לפני שהקישורית תיפתח בדפדפן וסיסמא חדשה תוכנס.
diff --git a/app/views/user_mailer/reset_password_instructions.html.haml b/app/views/user_mailer/reset_password_instructions.html.haml
index c0e6775d4..5d9ce6a75 100644
--- a/app/views/user_mailer/reset_password_instructions.html.haml
+++ b/app/views/user_mailer/reset_password_instructions.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('icon_lock_open.svg'), alt: ''
+                                      = image_tag full_pack_url('icon_lock_open.png'), alt: ''
 
                               %h1= t 'devise.mailer.reset_password_instructions.title'
                               %p.lead= t 'devise.mailer.reset_password_instructions.explanation'
diff --git a/app/views/user_mailer/reset_password_instructions.id.text.erb b/app/views/user_mailer/reset_password_instructions.id.text.erb
deleted file mode 100644
index cd7cfc373..000000000
--- a/app/views/user_mailer/reset_password_instructions.id.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hai <%= @resource.email %>!
-
-Seseorang telah melakukan permintaan link untuk merubah kata sandi anda di Mastodon. Anda bisa melakukan ini melalui link dibawah ini.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Jika anda tidak memintanya, mohon abaikan email ini.
-Password anda tidak akan diubah kecuali anda mengakses link di atas dan menggantinya.
diff --git a/app/views/user_mailer/reset_password_instructions.it.text.erb b/app/views/user_mailer/reset_password_instructions.it.text.erb
deleted file mode 100644
index 1de485c2e..000000000
--- a/app/views/user_mailer/reset_password_instructions.it.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Ciao <%= @resource.email %>!
-
-Qualcuno ha richiesto un link per cambiare la tua password su Mastodon. Lo puoi fare tramite il link qui sotto.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Se non l'hai richiesto tu, ignora questa email.
-La tua password non verrà cambiata finché non accedi al link qui sopra e ne crei una nuova.
diff --git a/app/views/user_mailer/reset_password_instructions.ja.text.erb b/app/views/user_mailer/reset_password_instructions.ja.text.erb
deleted file mode 100644
index 9ed607b58..000000000
--- a/app/views/user_mailer/reset_password_instructions.ja.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-こんにちは<%= @resource.email %>さん
-
-Mastodonアカウントのパスワードの変更がリクエストされました。以下のリンクをクリックして操作を完了できます。
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-このメールに身に覚えのない場合は無視してください。
-上記のリンクにアクセスし、変更をしない限りパスワードは変更されません。
diff --git a/app/views/user_mailer/reset_password_instructions.nl.text.erb b/app/views/user_mailer/reset_password_instructions.nl.text.erb
deleted file mode 100644
index eda133db2..000000000
--- a/app/views/user_mailer/reset_password_instructions.nl.text.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-Hallo <%= @resource.email %>!
-
-Er heeft iemand een nieuw wachtwoord aangevraagd voor Mastodon. Je kan op de link hieronder klikken om jouw wachtwo
-ord te veranderen.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Je kan deze e-mail negeren wanneer jij dit niet hebt aangevraagd.
-Jouw wachtwoord blijft onveranderd wanneer je niet op bovenstaande link klikt.
diff --git a/app/views/user_mailer/reset_password_instructions.no.text.erb b/app/views/user_mailer/reset_password_instructions.no.text.erb
deleted file mode 100644
index 387dc7c3e..000000000
--- a/app/views/user_mailer/reset_password_instructions.no.text.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Hei <%= @resource.email %>!
-
-Noen har forespurt en lenke til å bytte passord på din Mastodon-bruker. Du kan gjøre det ved å følge lenken under.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Hvis du ikke vil endre ditt passord kan du ignorere denne epost.
-Passordet ditt blir ikke endret før du følger lenken over og endrer det.
diff --git a/app/views/user_mailer/reset_password_instructions.oc.text.erb b/app/views/user_mailer/reset_password_instructions.oc.text.erb
deleted file mode 100644
index 5a5219589..000000000
--- a/app/views/user_mailer/reset_password_instructions.oc.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Bonjorn <%= @resource.email %> !
-
-Qualqu’un a demandat la reïnicializacion de vòstre senhal per Mastodon. Podètz realizar la reïnicializacion en clicant sul ligam çai-jos.</p>
-
-<%= link_to 'Modificar mon senhal', edit_password_url(@resource, reset_password_token: @token) %>
-
-S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl.
-Vòstre senhal cambiarà pas se clicatz pas sul ligam e que ne causissètz pas un novèl.
diff --git a/app/views/user_mailer/reset_password_instructions.pl.text.erb b/app/views/user_mailer/reset_password_instructions.pl.text.erb
deleted file mode 100644
index 2b34afc48..000000000
--- a/app/views/user_mailer/reset_password_instructions.pl.text.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-Witaj, <%= @resource.email %>!
-
-Ktoś próbował zmienić Twoje hasło na <%= @instance %>. Możesz zrobić to klikając w 
-poniższy link.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Jeżeli to nie Ty, zignoruj ten e-mail.
-Twoje hasło nie zostanie zmienione, dopóki nie użyjesz linku z podobnej wiadomości.
diff --git a/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb b/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb
deleted file mode 100644
index 2abff0c0d..000000000
--- a/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Olá, <%= @resource.email %>!
-
-Alguém solicitou um link para mudar a sua senha na instância <%= @instance %>. Você pode fazer isso através do link abaixo:
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Se você não solicitou isso, por favor ignore este e-mail.
-A senha não será modificada até que você acesse o link acima e crie uma nova.
diff --git a/app/views/user_mailer/reset_password_instructions.ru.text.erb b/app/views/user_mailer/reset_password_instructions.ru.text.erb
deleted file mode 100644
index 4ede067ab..000000000
--- a/app/views/user_mailer/reset_password_instructions.ru.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Здравствуйте, <%= @resource.email %>!
-
-Кто-то отправил запрос о сбросе пароля для Вашего аккаунта Mastodon. Вы можете использовать для этого следующую ссылку:
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Если Вы не запрашивали сброс пароля, пожалуйста, проигнорируйте это сообщение.
-Ваш пароль не будет изменен, пока вы не проследуете по вышеприведенной ссылке и не создадите новый.
diff --git a/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb b/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb
deleted file mode 100644
index 31707dee1..000000000
--- a/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Zdravo <%= @resource.email %>!
-
-Neko je zatražio link za promenu lozinke na instanci <%= @instance %>. Ovo možete uraditi preko linka ispod.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Ignorišite ovu poruku, ako niste Vi bili ti koji ste zatražili promenu lozinke.
-Lozinka se neće promeniti sve dok ne kliknete link iznad i ne napravite novu lozinku.
diff --git a/app/views/user_mailer/reset_password_instructions.sr.text.erb b/app/views/user_mailer/reset_password_instructions.sr.text.erb
deleted file mode 100644
index 86ea32b05..000000000
--- a/app/views/user_mailer/reset_password_instructions.sr.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Здраво <%= @resource.email %>!
-
-Неко је затражио линк за промену лозинке на инстанци <%= @instance %>. Ово можете урадити преко линка испод.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Игноришите ову поруку, ако нисте Ви били ти који сте затражили промену лозинке.
-Лозинка се неће променити све док не кликнете линк изнад и не направите нову лозинку.
diff --git a/app/views/user_mailer/reset_password_instructions.sv.text.erb b/app/views/user_mailer/reset_password_instructions.sv.text.erb
deleted file mode 100644
index 946426119..000000000
--- a/app/views/user_mailer/reset_password_instructions.sv.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hej <%= @resource.email %>!
-
-Någon har begärt en länk för att ändra ditt lösenord på <%= @instance %>. Du kan göra det genom länken nedan.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Om du inte begärt detta, ignorerar du det här e-postmeddelandet.
-Ditt lösenord ändras inte förrän du öppnar länken ovan och skapar ett nytt.
diff --git a/app/views/user_mailer/reset_password_instructions.text.erb b/app/views/user_mailer/reset_password_instructions.text.erb
new file mode 100644
index 000000000..4fbef16ee
--- /dev/null
+++ b/app/views/user_mailer/reset_password_instructions.text.erb
@@ -0,0 +1,9 @@
+<%= t 'devise.mailer.reset_password_instructions.title' %>
+
+===
+
+<%= t 'devise.mailer.reset_password_instructions.explanation' %>
+
+=> <%= edit_password_url(@resource, reset_password_token: @token) %>
+
+<%= t 'devise.mailer.reset_password_instructions.extra' %>
diff --git a/app/views/user_mailer/reset_password_instructions.th.text.erb b/app/views/user_mailer/reset_password_instructions.th.text.erb
deleted file mode 100644
index fe73b0165..000000000
--- a/app/views/user_mailer/reset_password_instructions.th.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-Hello <%= @resource.email %>!
-
-Someone has requested a link to change your password on Mastodon. You can do this through the link below.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-If you didn't request this, please ignore this email.
-Your password won't change until you access the link above and create a new one.
diff --git a/app/views/user_mailer/reset_password_instructions.tr.text.erb b/app/views/user_mailer/reset_password_instructions.tr.text.erb
deleted file mode 100644
index a0b84b9a4..000000000
--- a/app/views/user_mailer/reset_password_instructions.tr.text.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-Merhaba <%= @resource.email %>
-
-Biri <%= @instance %> üzerinden sizin hesabınız için parola değişim isteği gönderdi. Aşağıdaki linke tıklayarak bunu gerçekleştirebilirsiniz.
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-Eğer bu isteği siz göndermediyseniz, lütfen bu e-postayı görmezden geliniz.
-Siz bu linke tıklayıp yeni bir parola girene kadar parolanız değişmeyecektir.
-
-En içten dileklerimizle,
-
-<%= @instance %> ekibi
-
diff --git a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb b/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb
deleted file mode 100644
index f7cd88847..000000000
--- a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-<%= @resource.email %>,你好呀!
-
-有人想修改你在 <%= @instance %> 上的密码呢。如果你确实想修改密码的话,点击下面的链接吧:
-
-<%= edit_password_url(@resource, reset_password_token: @token) %>
-
-如果你不想修改密码的话,还请忽略这封邮件哦。
-在你点击上面的链接并修改密码前,你的密码是不会改变的。
diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml
new file mode 100644
index 000000000..d734da67d
--- /dev/null
+++ b/app/views/user_mailer/welcome.html.haml
@@ -0,0 +1,146 @@
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.hero
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center.padded
+                              %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td
+                                      = image_tag full_pack_url('icon_done.png'), alt: ''
+
+                              %h1= t 'user_mailer.welcome.title', name: @resource.account.username
+                              %p.lead= t 'user_mailer.welcome.explanation'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start
+                  .email-row
+                    .col-3
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.input-cell.text-center.padded-bottom
+                              %h5= t 'user_mailer.welcome.full_handle'
+                              %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td= "@#{@resource.account.username}@#{@instance}"
+                    .col-3
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell
+                              %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start.border-top
+                  .email-row
+                    .col-4
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              = t 'user_mailer.welcome.edit_profile_step'
+                    .col-2
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td.button-primary
+                                      = link_to settings_profile_url do
+                                        %span= t 'user_mailer.welcome.edit_profile_action'
+              %tr
+                %td.content-cell
+                  .email-row
+                    .col-4
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              = t 'user_mailer.welcome.review_preferences_step'
+                    .col-2
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td.button-primary
+                                      = link_to settings_preferences_url do
+                                        %span= t 'user_mailer.welcome.review_preferences_action'
+              %tr
+                %td.content-cell.padded-bottom
+                  .email-row
+                    .col-4
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              = t 'user_mailer.welcome.final_step'
+                    .col-2
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td.button-primary
+                                      = link_to web_url do
+                                        %span= t 'user_mailer.welcome.final_action'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.border-top
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.padded
+                              %h5= t 'user_mailer.welcome.tips'
+                              %ul
+                                %li
+                                  %span= t 'user_mailer.welcome.tip_mobile_webapp'
+                                %li
+                                  %span= t 'user_mailer.welcome.tip_bridge_html', bridge_url: 'https://bridge.joinmastodon.org'
+                                %li
+                                  %span= t 'user_mailer.welcome.tip_following'
+                                %li
+                                  %span= t 'user_mailer.welcome.tip_local_timeline', instance: @instance
+                                %li
+                                  %span= t 'user_mailer.welcome.tip_federated_timeline'
diff --git a/app/views/user_mailer/welcome.text.erb b/app/views/user_mailer/welcome.text.erb
new file mode 100644
index 000000000..5bd0cab2a
--- /dev/null
+++ b/app/views/user_mailer/welcome.text.erb
@@ -0,0 +1,30 @@
+<%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %>
+
+===
+
+<%= t 'user_mailer.welcome.full_handle' %> (<%= "@#{@resource.account.username}@#{@instance}" %>)
+<%= t 'user_mailer.welcome.full_handle_hint', instance: @instance %>
+
+---
+
+<%= t 'user_mailer.welcome.edit_profile_step' %>
+
+=> <%= settings_profile_url %>
+
+<%= t 'user_mailer.welcome.review_preferences_step' %>
+
+=> <%= settings_preferences_url %>
+
+<%= t 'user_mailer.welcome.final_step' %>
+
+=> <%= web_url %>
+
+---
+
+<%= t 'user_mailer.welcome.tips' %>
+
+* <%= t 'user_mailer.welcome.tip_mobile_webapp' %>
+* <%= strip_tags(t('user_mailer.welcome.tip_bridge_html')) %> (https://bridge.joinmastodon.org)
+* <%= t 'user_mailer.welcome.tip_following' %>
+* <%= t 'user_mailer.welcome.tip_local_timeline', instance: @instance %>
+* <%= t 'user_mailer.welcome.tip_federated_timeline' %>
diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb
index ae86e3dd2..4763856ac 100644
--- a/app/workers/activitypub/delivery_worker.rb
+++ b/app/workers/activitypub/delivery_worker.rb
@@ -3,7 +3,7 @@
 class ActivityPub::DeliveryWorker
   include Sidekiq::Worker
 
-  sidekiq_options queue: 'push', retry: 8, dead: false
+  sidekiq_options queue: 'push', retry: 16, dead: false
 
   HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
 
diff --git a/app/workers/regeneration_worker.rb b/app/workers/regeneration_worker.rb
index 8cee21ae1..5c6a040bd 100644
--- a/app/workers/regeneration_worker.rb
+++ b/app/workers/regeneration_worker.rb
@@ -3,7 +3,7 @@
 class RegenerationWorker
   include Sidekiq::Worker
 
-  sidekiq_options queue: 'pull', backtrace: true, unique: :until_executed
+  sidekiq_options unique: :until_executed
 
   def perform(account_id, _ = :home)
     account = Account.find(account_id)
diff --git a/config/application.rb b/config/application.rb
index c1bf3cef2..ef97dbc06 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -19,6 +19,9 @@ require_relative '../lib/mastodon/redis_config'
 
 module Mastodon
   class Application < Rails::Application
+    # Initialize configuration defaults for originally generated Rails version.
+    config.load_defaults 5.1
+
     # Settings in config/environments/* take precedence over those specified here.
     # Application configuration should go into files in config/initializers
     # -- all .rb files in that directory are automatically loaded.
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 82e8e998a..eadeaef3e 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -140,7 +140,6 @@ ar:
   application_mailer:
     salutation: "%{name}،"
     settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}'
-    signature: إشعارات ماستدون من %{instance}
     view: 'View:'
   applications:
     created: تم إنشاء التطبيق بنجاح
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 13d0394a3..56a904895 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -26,7 +26,6 @@ bg:
     unfollow: Не следвай
   application_mailer:
     settings: 'Промяна на предпочитанията за e-mail: %{link}'
-    signature: Mastodon известия от %{instance}
     view: 'Преглед:'
   applications:
     invalid_url: Предоставеният URL е невалиден
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 5fd5b3f6d..1092da38d 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -265,12 +265,18 @@ ca:
       unresolved: No resolt
       view: Visualització
     settings:
+      activity_api_enabled:
+        desc_html: Compte d'estatus publicats localment, usuaris actius i registres nous en cubs setmanals
+        title: Publica estadístiques agregades sobre l'activitat de l'usuari
       bootstrap_timeline_accounts:
         desc_html: Separa diversos noms d'usuari amb comes. Només funcionaran els comptes locals i desbloquejats. El valor predeterminat quan està buit és tots els administradors locals..
         title: El seguiment per defecte per als nous usuaris
       contact_information:
         email: Introdueix una adreça de correu electrònic pùblica
         username: Introdueix un nom d'usuari
+      peers_api_enabled:
+        desc_html: Els noms de domini que ha trobat aquesta instància al fediverse
+        title: Publica la llista d'instàncies descobertes
       registrations:
         closed_message:
           desc_html: Apareix en la primera pàgina quan es tanquen els registres<br>Pots utilitzar etiquetes HTML
@@ -334,7 +340,6 @@ ca:
   application_mailer:
     salutation: "%{name},"
     settings: 'Canvia les preferències de correu: %{link}'
-    signature: Notificacions de Mastodon des de %{instance}
     view: 'Vista:'
   applications:
     created: L'aplicació s'ha creat correctament
@@ -345,7 +350,7 @@ ca:
     warning: Aneu amb compte amb aquestes dades. No ho compartiu mai amb ningú!
     your_token: El token d'accés
   auth:
-    agreement_html: En inscriure't, acceptes <a href="%{rules_path}">els nostres termes del servei</a> i <a href="%{terms_path}">la nostra política de privadesa</a>.
+    agreement_html: En inscriure't, acceptes seguir <a href="%{rules_path}">els nostres termes del servei</a> i <a href="%{terms_path}">la nostra política de privadesa</a>.
     change_password: Canvia la contrasenya
     delete_account: Esborra el compte
     delete_account_html: Si vols esborrar el teu compte pots <a href="%{path}">fer-ho aquí</a>. Se't demanarà confirmació.
@@ -546,12 +551,14 @@ ca:
       blackberry: Blackberry
       chrome: Chrome
       edge: Microsoft Edge
+      electron: Electron
       firefox: Firefox
       generic: Navegador desconegut
       ie: Internet Explorer
       micro_messenger: MicroMessenger
       nokia: Nokia S40 Ovi Browser
       opera: Opera
+      otter: Altre
       phantom_js: PhantomJS
       qq: QQ Browser
       safari: Safari
@@ -596,7 +603,7 @@ ca:
     open_in_web: Obre en la web
     over_character_limit: Límit de caràcters de %{max} superat
     pin_errors:
-      limit: S'han fixat massa toots
+      limit: Ja has fixat el màxim nombre de toots
       ownership: El toot d'algú altre no es pot fixar
       private: No es pot fixar el toot no públic
       reblog: No es pot fixar un impuls
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 39867e373..7d0cf6349 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -321,7 +321,6 @@ de:
   application_mailer:
     salutation: "%{name},"
     settings: 'E-Mail-Einstellungen ändern: %{link}'
-    signature: Mastodon-Benachrichtigungen von %{instance}
     view: 'Ansehen:'
   applications:
     created: Anwendung erstellt
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index fe95c402d..d88db17ca 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -17,11 +17,32 @@ ca:
       unconfirmed: Has de confirmar l'adreça de correu electrònic abans de continuar.
     mailer:
       confirmation_instructions:
+        action: Verificar l'adreça de correu
+        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ó'
+        title: Verifica l'adreça de correu
+      email_changed:
+        explanation: 'L''adreça de correu del teu compte s''està canviant a:'
+        extra: Si no has canviat el teu correu electrònic, és probable que algú hagi accedit al teu compte. Si us plau, canvia la contrasenya immediatament o posa't en contacte amb l'administrador de l'instància si no pots accedir al teu compte.
+        subject: 'Mastodon: s''ha canviat l''adreça electrònica'
+        title: Nova adreça de correu electrònic
       password_change:
+        explanation: S'ha canviat la contrasenya del teu compte.
+        extra: Si no has canviat el teu correu electrònic, és probable que algú hagi accedit al teu compte. Si us plau, canvia la contrasenya immediatament o posa't en contacte amb l'administrador de l'instància si no pots accedir al teu compte.
         subject: 'Mastodon: Contrasenya canviada'
+        title: Contrasenya canviada
+      reconfirmation_instructions:
+        explanation: Confirma la nova adreça per canviar el teu correu electrònic.
+        extra: Si no has iniciat aquest canvi, ignora aquest correu electrònic. L'adreça electrònica del compte de Mastodon no canviarà fins que accedeixis a l'enllaç de dalt.
+        subject: 'Mastodon: Confirma el correu electrònic per a %{instance}'
+        title: Verifica l'adreça de correu electrònic
       reset_password_instructions:
+        action: Canviar contrasenya
+        explanation: Has sol·licitat una contrasenya nova per al teu compte.
+        extra: Si no ho has sol·licitat, ignora aquest correu electrònic. La teva contrasenya no canviarà fins que accedeixis a l'enllaç de dalt i creis un de nou.
         subject: 'Mastodon: Instruccions per a reiniciar contrassenya'
+        title: Contrasenya restablerta
       unlock_instructions:
         subject: 'Mastodon: Instruccions per a desblocar'
     omniauth_callbacks:
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index 8a2b5d563..c0fc53834 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -18,8 +18,12 @@ gl:
     mailer:
       confirmation_instructions:
         subject: 'Mastodon: Instruccións de confirmación para %{instance}'
+      email_changed:
+        subject: 'Mastodon: email cambiado'
       password_change:
         subject: 'Mastodon: contrasinal cambiado'
+      reconfirmation_instructions:
+        subject: 'Mastodon: Confirme email para %{instance}'
       reset_password_instructions:
         subject: 'Mastodon: Instruccións para restablecer o contrasinal'
       unlock_instructions:
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index 118186877..1f6395479 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -17,15 +17,32 @@ ja:
       unconfirmed: 続行するにはメールアドレスを確認する必要があります。
     mailer:
       confirmation_instructions:
+        action: メールアドレスの確認
+        explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
+        extra_html: また <a href="%{terms_path}">インスタンスのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。
         subject: 'Mastodon: メールアドレスの確認'
+        title: メールアドレスの確認
       email_changed:
+        explanation: 'アカウントのメールアドレスは以下のように変更されます:'
+        extra: メールアドレスの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はインスタンス管理者に連絡してください。
         subject: 'Mastodon: メールアドレスの変更'
+        title: 新しいメールアドレス
       password_change:
+        explanation: パスワードが変更されました。
+        extra: パスワードの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はインスタンス管理者に連絡してください。
         subject: 'Mastodon: パスワードが変更されました'
+        title: パスワードの変更
       reconfirmation_instructions:
+        explanation: メールアドレスを変更するため新しいアドレスを確認してください。
+        extra: この変更に心当たりがない場合、このメールを無視してください。上記リンク先にアクセスするまでアカウントのメールアドレスは変更されません。
         subject: 'Mastodon: %{instance}のメールを確認する'
+        title: メールアドレスの確認
       reset_password_instructions:
+        action: パスワードの変更
+        explanation: あなたのアカウントに対しパスワードの再発行が要求されました。
+        extra: この要求に心当たりがない場合、このメールを無視してください。上記リンク先にアクセスし新しいものを作成するまでパスワードは変更されません。
         subject: 'Mastodon: パスワード再発行'
+        title: パスワード再発行
       unlock_instructions:
         subject: 'Mastodon: アカウントのロックの解除'
     omniauth_callbacks:
diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml
index 8c2c7b6a1..57e85a7b5 100644
--- a/config/locales/devise.nl.yml
+++ b/config/locales/devise.nl.yml
@@ -19,8 +19,12 @@ nl:
     mailer:
       confirmation_instructions:
         subject: 'Mastodon: E-mail bevestigen voor %{instance}'
+      email_changed:
+        subject: 'Mastodon: E-mailadres is veranderd'
       password_change:
         subject: 'Mastodon: Wachtwoord veranderd'
+      reconfirmation_instructions:
+        subject: 'Mastodon: Bevestig het e-mailadres voor %{instance}'
       reset_password_instructions:
         subject: 'Mastodon: Wachtwoord opnieuw instellen'
       unlock_instructions:
diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml
index 6a2960463..53a4f4552 100644
--- a/config/locales/devise.pl.yml
+++ b/config/locales/devise.pl.yml
@@ -17,15 +17,32 @@ pl:
       unconfirmed: Zweryfikuj adres e-mail, aby kontynuować.
     mailer:
       confirmation_instructions:
+        action: Zweryfikuj adres e-mail
+        explanation: Utworzyłeś 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'
+        title: Zweryfikuj adres e-mail
       email_changed:
+        explanation: 'Adres e-mail dla Twojego konta zostanie zmieniony na:'
+        extra: Jeżeli nie próbowałeś zmienić adresu e-mail, prawdopodobnie ktoś uzyskał dostęp do Twojego konta. Zmień natychmiastowo hasło lub skontaktuj się z administratorem isntancji, jeżeli nie masz dostępu do konta.
         subject: 'Mastodon: Zmieniono adres e-mail'
+        title: Nowy adres e-mail
       password_change:
+        explanation: Hasło do Twojego konta zostało zmienione.
+        extra: Jeżeli nie zmieniałeś hasła, prawdopodobnie ktoś uzyskał dostęp do Twojego konta. Zmień hasło natychmiastowo lub skontaktuj się z administratorem instancji, jeżeli nie masz dostępu do konta.
         subject: 'Mastodon: Zmieniono hasło'
+        title: Zmieniono hasło
       reconfirmation_instructions:
+        explanation: Potwierdź nowy adres aby zmienić e-mail.
+        extra: Jeżeli nie próbowałeś zmienić e-maila, zignoruj tą wiadomość. Adres e-mail przypisany do konta Mastodona nie ulegnie zmianie, jeżeli nie użyjesz powyższego odnośniku.
         subject: 'Mastodon: Potwierdź adres e-mail na &{instance}'
+        title: Zweryfikuj adres e-mail
       reset_password_instructions:
+        action: Zmień hasło
+        explanation: Próbowałeś uzyskać nowe hasło do swojego konta.
+        extra: Jeżeli to nie Ty, zignoruj tą wiadomość. Twoje hasło nie ulegnie zmianie, jeżeli nie wykorzystasz powyższego odnośnika i nie utworzysz nowego hasła.
         subject: 'Mastodon: Instrukcje ustawienia nowego hasła'
+        title: Przywracanie hasła
       unlock_instructions:
         subject: 'Mastodon: Instrukcje odblokowania konta'
     omniauth_callbacks:
@@ -38,7 +55,7 @@ pl:
       updated: Twoje hasło zostało zmienione. Jesteś zalogowany/a.
       updated_not_active: Twoje hasło zostało zmienione.
     registrations:
-      destroyed: Twoje konto zostało anulowane. Mamy jednak nadzieję, że do nas wrócisz. Do zobaczenia!
+      destroyed: Twoje konto zostało zawieszone. Mamy jednak nadzieję, że do nas wrócisz. Do zobaczenia!
       signed_up: Twoje konto zostało utworzone. Witamy!
       signed_up_but_inactive: Twoje konto zostało utworzone. Nie mogliśmy Cię jednak zalogować, ponieważ konto nie zostało jeszcze aktywowane.
       signed_up_but_locked: Twoje konto zostało utworzone. Nie mogliśmy Cię jednak zalogować, ponieważ konto jest zablokowane.
diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml
index 13736b3a3..eab86c802 100644
--- a/config/locales/devise.pt-BR.yml
+++ b/config/locales/devise.pt-BR.yml
@@ -18,8 +18,12 @@ pt-BR:
     mailer:
       confirmation_instructions:
         subject: 'Mastodon: Instruções de confirmação'
+      email_changed:
+        subject: 'Mastodon: Email alterado'
       password_change:
         subject: 'Mastodon: Senha modificada'
+      reconfirmation_instructions:
+        subject: 'Mastodon: Confirmar emai para %{instance}'
       reset_password_instructions:
         subject: 'Mastodon: Instruções para mudança de senha'
       unlock_instructions:
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
index dd6b48795..4ee021fcc 100644
--- a/config/locales/devise.zh-CN.yml
+++ b/config/locales/devise.zh-CN.yml
@@ -18,7 +18,7 @@ zh-CN:
     mailer:
       confirmation_instructions:
         action: 验证电子邮件地址
-        explanation: 你在 %{host} 上使用这个电子邮件地址创建了一个帐户。只需点击下面的按钮,即可完成激活。如果你并没有创建过帐户,请忽略此邮件。
+        explanation: 你在 %{host} 上使用这个电子邮件地址创建了一个帐户。只需点击下面的链接,即可完成激活。如果你并没有创建过帐户,请忽略此邮件。
         extra_html: 请记得阅读<a href="%{terms_path}">本实例的相关规定</a>和<a href="%{policy_path}">我们的使用条款</a>。
         subject: Mastodon:确认 %{instance} 帐户信息
         title: 验证电子邮件地址
@@ -33,13 +33,13 @@ zh-CN:
         subject: Mastodon:密码已被更改
         title: 密码已被重置
       reconfirmation_instructions:
-        explanation: 请确认你的新电子邮件地址以完成更改。
+        explanation: 点击下面的链接来确认你的新电子邮件地址。
         extra: 如果你并没有请求本次变更,请忽略此邮件。Mastodon 帐户的电子邮件地址只有在你点击上面的链接后才会更改。
         subject: Mastodon:确认 %{instance} 电子邮件地址
         title: 验证电子邮件地址
       reset_password_instructions:
         action: 更改密码
-        explanation: 你正在请求更改帐户的密码。
+        explanation: 点击下面的链接来更改帐户的密码。
         extra: 如果你并没有请求本次变更,请忽略此邮件。你的密码只有在你点击上面的链接并输入新密码后才会更改。
         subject: Mastodon:重置密码信息
         title: 重置密码
diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml
index 33f133c06..6c127b73b 100644
--- a/config/locales/doorkeeper.pl.yml
+++ b/config/locales/doorkeeper.pl.yml
@@ -83,7 +83,7 @@ pl:
         invalid_grant: Grant uwierzytelnienia jest niepoprawny, przeterminowany, unieważniony, nie pasuje do URI przekierowwania użytego w żądaniu uwierzytelnienia, lub został wystawiony przez innego klienta.
         invalid_redirect_uri: URI przekierowania jest nieprawidłowy.
         invalid_request: 'Żądanie jest nieprawidłowe: brakujący parametr, niewspierana wartość parametru, lub inny błąd.'
-        invalid_resource_owner: Dostarczone dane uwierzytelniające właściciela zasobu są niepoprawne, lub właściciel zasobu nie może zostać znaleziony.
+        invalid_resource_owner: Dostarczone dane uwierzytelniające właściciela zasobu są niepoprawne, lub właściciel zasobu nie może zostać znaleziony
         invalid_scope: Zakres żądania jest niepoprawny, nieznany, lub błędnie zbudowany.
         invalid_token:
           expired: Token dostępowy wygasł
diff --git a/config/locales/en.yml b/config/locales/en.yml
index bc1e98c56..7c3cd922b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -341,7 +341,6 @@ en:
     notification_preferences: Change e-mail preferences
     salutation: "%{name},"
     settings: 'Change e-mail preferences: %{link}'
-    signature: Mastodon notifications from %{instance}
     view: 'View:'
     view_profile: View Profile
     view_status: View status
@@ -734,6 +733,25 @@ en:
     recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. <strong>Keep the recovery codes safe</strong>. For example, you may print them and store them with other important documents.
     setup: Set up
     wrong_code: The entered code was invalid! Are server time and device time correct?
+  user_mailer:
+    welcome:
+      edit_profile_action: Setup profile
+      edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account.
+      explanation: Here are some tips to get you started
+      final_action: Start posting
+      final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.'
+      full_handle: Your full handle
+      full_handle_hint: This is what you would tell your friends so they can message or follow you from another instance.
+      review_preferences_action: Change preferences
+      review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay.
+      subject: Welcome to Mastodon
+      tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the <a href="%{bridge_url}">bridge app</a>. It only works if they also used the bridge app though!
+      tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete.
+      tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines.
+      tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours!
+      tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways!
+      tips: Tips
+      title: Welcome aboard, %{name}!
   users:
     invalid_email: The e-mail address is invalid
     invalid_otp_token: Invalid two-factor code
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 847299ac7..bc259957d 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -237,7 +237,6 @@ eo:
       subject: Nova raporto por %{instance} (#%{id})
   application_mailer:
     settings: 'Ŝanĝi la retpoŝt-mesaĝajn preferojn: %{link}'
-    signature: Sciigoj de Mastodon el %{instance}
     view: 'Vidi:'
   applications:
     created: Aplikaĵo sukcesa kreis
diff --git a/config/locales/es.yml b/config/locales/es.yml
index d9084787d..7ee2876a9 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -332,7 +332,6 @@ es:
   application_mailer:
     salutation: "%{name},"
     settings: 'Cambiar preferencias de correo: %{link}'
-    signature: Notificaciones de Mastodon desde %{instance}
     view: 'Vista:'
   applications:
     created: Aplicación creada exitosamente
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 94d4e7594..c498c592c 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -334,7 +334,6 @@ fa:
   application_mailer:
     salutation: "%{name}،"
     settings: 'تغییر تنظیمات ایمیل: %{link}'
-    signature: اعلان‌های ماستدون از %{instance}
     view: 'نمایش:'
   applications:
     created: برنامه با موفقیت ساخته شد
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 2da8427b8..f2ee28ba0 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -25,7 +25,6 @@ fi:
     unfollow: Lopeta seuraaminen
   application_mailer:
     settings: 'Muokkaa sähköpostiasetuksia: %{link}'
-    signature: Mastodon-ilmoituksia palvelimelta %{instance}
     view: 'Katso:'
   applications:
     invalid_url: Annettu URL on väärä
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index adcb11f18..09338fdfd 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -334,7 +334,6 @@ fr:
   application_mailer:
     salutation: "%{name},"
     settings: 'Changer les préférences courriel : %{link}'
-    signature: Notifications de Mastodon depuis %{instance}
     view: 'Voir :'
   applications:
     created: Application créée avec succès
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index ca72bf183..100e2954c 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -265,12 +265,18 @@ gl:
       unresolved: Non resolto
       view: Vista
     settings:
+      activity_api_enabled:
+        desc_html: Conta de estados publicados localmente, usuarias activas, e novos rexistros por semana
+        title: Publicar estatísticas agregadas sobre a actividade da usuaria
       bootstrap_timeline_accounts:
         desc_html: Separar múltiples nomes de usuaria con vírgulas. Só funcionarán as contas locais non bloqueadas. Si baldeiro, por omisión son todos os local admin.
         title: Seguimentos por omisión para novas usuarias
       contact_information:
         email: e-mail de traballo
         username: Nome de usuaria de contacto
+      peers_api_enabled:
+        desc_html: Nome de dominio que esta instancia atopou no fediverso
+        title: Publicar lista de instancias descubertas
       registrations:
         closed_message:
           desc_html: Mostrado na páxina de portada cando o rexistro está pechado. Pode utilizar etiquetas HTML
@@ -334,7 +340,6 @@ gl:
   application_mailer:
     salutation: "%{name},"
     settings: 'Mudar as preferencias de e-mail: %{link}'
-    signature: Notificacións Mastodon de %{instance}
     view: 'Vista:'
   applications:
     created: Creouse con éxito este aplicativo
@@ -509,6 +514,7 @@ gl:
           quadrillion: Q
           thousand: K
           trillion: T
+          unit: " "
   pagination:
     next: Seguinte
     prev: Previo
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 4b977ce1b..1f27dda7a 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -229,7 +229,6 @@ he:
     title: ניהול
   application_mailer:
     settings: 'שינוי הגדרות דוא"ל: %{link}'
-    signature: התראות מסטודון מקהילת %{instance}
     view: 'תצוגה:'
   applications:
     invalid_url: כתובת הקישורית אינה חוקית
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 581912420..a3c9aa436 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -26,7 +26,6 @@ hr:
     unfollow: Prestani slijediti
   application_mailer:
     settings: 'Promijeni e-mail postavke: %{link}'
-    signature: Mastodon notifikacije sa %{instance}
     view: 'Vidi:'
   applications:
     invalid_url: Uneseni link nije valjan
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 77551223f..586503a35 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -12,8 +12,6 @@ hu:
     people_who_follow: "%{name} követői"
     posts: Bejegyzések
     unfollow: Követés abbahagyása
-  application_mailer:
-    signature: "%{instance} Mastodon értesítései"
   auth:
     change_password: Jelszó változtatása
     didnt_get_confirmation: Nem kaptad meg a megerősítési lépéseket?
diff --git a/config/locales/id.yml b/config/locales/id.yml
index f3a6649d1..6e4d60fd8 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -151,7 +151,6 @@ id:
     title: Administrasi
   application_mailer:
     settings: 'Ubah pilihan email: %{link}'
-    signature: Notifikasi Mastodon dari %{instance}
     view: 'Tampilan:'
   applications:
     invalid_url: URL tidak sesuai
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 4114e5231..db8214768 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -149,7 +149,6 @@ io:
     title: Administration
   application_mailer:
     settings: 'Chanjar la retpost-mesajala preferi: %{link}'
-    signature: Savigi di Mastodon de %{instance}
     view: 'Vidar:'
   applications:
     invalid_url: La URL donita ne esas valida
diff --git a/config/locales/it.yml b/config/locales/it.yml
index ec0209bc1..6ab57d2fc 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -26,7 +26,6 @@ it:
     unfollow: Non seguire più
   application_mailer:
     settings: 'Cambia le impostazioni per le e-mail: %{link}'
-    signature: Notifiche Mastodon da %{instance}
     view: 'Guarda:'
   applications:
     invalid_url: L'URL fornito non è valido
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 44b89e859..141b5141a 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -338,10 +338,12 @@ ja:
       body: "%{reporter} が %{target} を通報しました"
       subject: "%{instance} の新しい通報 (#%{id})"
   application_mailer:
+    notification_preferences: メール設定の変更
     salutation: "%{name} さん"
     settings: 'メール設定の変更: %{link}'
-    signature: Mastodon %{instance} インスタンスからの通知
     view: 'リンク:'
+    view_profile: プロフィールを表示
+    view_status: トゥートを表示
   applications:
     created: アプリが作成されました
     destroyed: アプリが削除されました
@@ -491,29 +493,38 @@ ja:
     title: モデレーション
   notification_mailer:
     digest:
+      action: 全ての通知を表示
       body: "%{instance} での最後のログインからの出来事:"
       mention: "%{name} さんがあなたに返信しました:"
       new_followers_summary:
-        one: 新たなフォロワーを獲得しました!
-        other: "%{count} 人の新たなフォロワーを獲得しました!"
+        one: また、離れている間に新たなフォロワーを獲得しました!
+        other: また、離れている間に%{count} 人の新たなフォロワーを獲得しました!
       subject:
         one: "新しい1件の通知 \U0001F418"
         other: "新しい%{count}件の通知 \U0001F418"
+      title: 不在の間に…
     favourite:
       body: "%{name} さんにお気に入り登録された、あなたのトゥートがあります:"
       subject: "%{name} さんにお気に入りに登録されました"
+      title: 新たなお気に入り登録
     follow:
       body: "%{name} さんにフォローされています!"
       subject: "%{name} さんにフォローされています"
+      title: 新たなフォロワー
     follow_request:
+      action: フォローリクエストの管理
       body: "%{name} さんがあなたにフォローをリクエストしました"
       subject: "%{name} さんからのフォローリクエスト"
+      title: 新たなフォローリクエスト
     mention:
+      action: 返信
       body: "%{name} さんから返信がありました:"
       subject: "%{name} さんに返信されました"
+      title: 新たな返信
     reblog:
       body: "%{name} さんにブーストされた、あなたのトゥートがあります:"
       subject: "%{name} さんにブーストされました"
+      title: 新たなブースト
   number:
     human:
       decimal_units:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 997dc4856..b254636f3 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -340,7 +340,6 @@ ko:
   application_mailer:
     notification_preferences: 메일 설정 변경
     settings: '메일 설정을 변경: %{link}'
-    signature: Mastodon %{instance} 인스턴스로에서 알림
     view: 'View:'
     view_profile: 프로필 보기
     view_status: 게시물 보기
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index a0add9bfa..973dc65d1 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -265,12 +265,18 @@ nl:
       unresolved: Onopgelost
       view: Weergeven
     settings:
+      activity_api_enabled:
+        desc_html: Wekelijks overzicht van de hoeveelheid lokale toots, actieve gebruikers en nieuwe registraties
+        title: Statistieken over gebruikersactiviteit publiceren
       bootstrap_timeline_accounts:
         desc_html: Meerdere gebruikersnamen met komma's scheiden. Alleen lokale en niet opgeschorte accounts werken. Laat leeg voor alle lokale beheerders.
         title: Standaard te volgen accounts voor nieuwe gebruikers
       contact_information:
         email: Vul een openbaar gebruikt e-mailadres in
         username: Vul een gebruikersnaam in
+      peers_api_enabled:
+        desc_html: Domeinnamen die deze server in de fediverse is tegengekomen
+        title: Lijst van bekende servers publiceren
       registrations:
         closed_message:
           desc_html: Wordt op de voorpagina weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld<br>En ook hier kan je HTML gebruiken
@@ -334,7 +340,6 @@ nl:
   application_mailer:
     salutation: "%{name},"
     settings: 'E-mailvoorkeuren wijzigen: %{link}'
-    signature: Mastodon-meldingen van %{instance}
     view: 'Bekijk:'
   applications:
     created: Aanmaken toepassing geslaagd
@@ -476,11 +481,11 @@ nl:
     title: Moderatie
   notification_mailer:
     digest:
-      body: 'Hier is een korte samenvatting van wat je hebt gemist op %{instance} sinds jouw laatste bezoek op %{since}:'
+      body: Hier is een korte samenvatting van de berichten die je sinds jouw laatste bezoek op %{since} hebt gemist
       mention: "%{name} vermeldde jou in:"
       new_followers_summary:
-        one: Jij hebt een nieuwe volger! Hoera!
-        other: Jij hebt %{count} nieuwe volgers! Prachtig!
+        one: Je hebt trouwens sinds je weg was er ook een nieuwe volger bijgekregen! Hoera!
+        other: Je hebt trouwens sinds je weg was er ook %{count} nieuwe volgers bijgekregen! Fantastisch!
       subject:
         one: "1 nieuwe melding sinds jouw laatste bezoek \U0001F418"
         other: "%{count} nieuwe meldingen sinds jouw laatste bezoek \U0001F418"
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 57f8547fc..3b212932e 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -163,7 +163,6 @@
     title: Administrasjon
   application_mailer:
     settings: 'Endre foretrukne e-postinnstillinger: %{link}'
-    signature: Mastodon-notiser fra %{instance}
     view: 'Se:'
   applications:
     invalid_url: Den oppgitte URLen er ugyldig
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 40387de70..beb5d1f87 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -340,7 +340,6 @@ oc:
   application_mailer:
     salutation: "%{name},"
     settings: 'Cambiar las preferéncias de corrièl : %{link}'
-    signature: Notificacion de Mastodon sus %{instance}
     view: 'Veire :'
   applications:
     created: Aplicacion ben creada
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 8aa6d2731..949099a71 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -46,7 +46,7 @@ pl:
     posts: Wpisy
     posts_with_replies: Wpisy z odpowiedziami
     remote_follow: Śledź zdalnie
-    reserved_username: Ta nazwa użytkownika jest zarezerwowana.
+    reserved_username: Ta nazwa użytkownika jest zarezerwowana
     roles:
       admin: Administrator
       moderator: Moderator
@@ -183,7 +183,7 @@ pl:
       title: Niestandardowe emoji
       unlisted: Niewidoczne
       update_failed_msg: Nie udało się zaktualizować emoji
-      updated_msg: Pomyślnie zaktualizowano emoji
+      updated_msg: Pomyślnie zaktualizowano emoji!
       upload: Dodaj
     domain_blocks:
       add_new: Dodaj nową
@@ -194,7 +194,7 @@ pl:
         create: Utwórz blokadę
         hint: Blokada domen nie zabroni tworzenia wpisów kont w bazie danych, ale pozwoli na automatyczną moderację kont do nich należących.
         severity:
-          desc_html: "<strong>Wyciszenie</strong> uczyni wpisy użytkownika widoczne tylko dla osób, które go śledzą. <strong>Zawieszenie</strong> spowoduje usunięcie całej zawartości dodanej przez użytkownika."
+          desc_html: "<strong>Wyciszenie</strong> uczyni wpisy użytkownika widoczne tylko dla osób, które go śledzą. <strong>Zawieszenie</strong> spowoduje usunięcie całej zawartości dodanej przez użytkownika. Użyj <strong>Żadne</strong>, jeżeli chcesz jedynie odrzucać zawartość multimedialną."
           noop: Nic nie rób
           silence: Wycisz
           suspend: Zawieś
@@ -305,7 +305,7 @@ pl:
         title: Niestandardowe zasady użytkowania
       site_title: Nazwa instancji
       thumbnail:
-        desc_html: 'Używana w podglądzie przez OpenGraph i API. Zalecany rozmiar: 1200x630 pikseli.'
+        desc_html: 'Używana w podglądzie przez OpenGraph i API. Zalecany rozmiar: 1200x630 pikseli'
         title: Miniatura instancji
       timeline_preview:
         desc_html: Wyświetlaj publiczną oś czasu na stronie widocznej dla niezalogowanych
@@ -339,10 +339,11 @@ pl:
       body: Użytkownik %{reporter} zgłosił %{target}
       subject: Nowe zgłoszenie na %{instance} (#%{id})
   application_mailer:
+    notification_preferences: Zmień ustawienia e-maili
     salutation: "%{name},"
     settings: 'Zmień ustawienia powiadamiania: %{link}'
-    signature: Powiadomienie Mastodona z instancji %{instance}
     view: 'Zobacz:'
+    view_status: Wyświetl wpis
   applications:
     created: Pomyślnie utworzono aplikację
     destroyed: Pomyślnie usunięto aplikację
@@ -494,33 +495,42 @@ pl:
     title: Moderacja
   notification_mailer:
     digest:
-      body: 'Oto krótkie podsumowanie co Cię ominęło na %{instance} od Twojej ostatniej wizyty (%{since}):'
+      action: Wyświetl wszystkie powiadomienia
+      body: Oto krótkie podsumowanie wiadomości, które ominęły Cię od Twojej ostatniej wizyty (%{since})
       mention: "%{name} wspomniał o Tobie w:"
       new_followers_summary:
         few: "(%{count}) nowe osoby śledzą Cię!"
         many: "(%{count}) nowych osób Cię śledzi! Wspaniale!"
-        one: Śledzi Cię nowa osoba! Gratulacje!
-        other: "(%{count}) nowych osób Cię śledzi! Wspaniale!"
+        one: Dodatkowo, w czasie nieobecności zaczęła śledzić Cię jedna osoba Gratulacje!
+        other: Dodatkowo, zaczęło Cię śledzić %{count} nowych osób! Wspaniale!
       subject:
         few: "%{count} nowe powiadomienia od Twojej ostatniej wizyty \U0001F418"
         many: "%{count} nowych powiadomień od Twojej ostatniej wizyty \U0001F418"
         one: "1 nowe powiadomienie od Twojej ostatniej wizyty \U0001F418"
         other: "%{count} nowych powiadomień od Twojej ostatniej wizyty \U0001F418"
+      title: W trakcie Twojej nieobecności…
     favourite:
       body: 'Twój wpis został polubiony przez %{name}:'
       subject: "%{name} lubi Twój wpis"
+      title: Nowe polubienie
     follow:
       body: "%{name} Cię śledzi!"
       subject: "%{name} Cię śledzi"
+      title: Nowy śledzący
     follow_request:
+      action: Zarządzaj prośbami o możliwość śledzenia
       body: "%{name} poprosił o możliwość śledzenia Cię"
       subject: 'Prośba o możliwość śledzenia: %{name}'
+      title: Nowa prośba o możliwość śledzenia
     mention:
+      action: Odpowiedz
       body: "%{name} wspomniał o Tobie w:"
       subject: "%{name} wspomniał o Tobie"
+      title: Nowe wspomnienie o Tobie
     reblog:
       body: 'Twój wpis został podbity przez %{name}:'
       subject: Twój wpis został podbity przez %{name}
+      title: Nowe podbicie
   number:
     human:
       decimal_units:
@@ -568,12 +578,14 @@ pl:
       blackberry: Blackberry
       chrome: Chrome
       edge: Microsoft Edge
+      electron: Electron
       firefox: Firefox
       generic: nieznana przeglądarka
       ie: Internet Explorer
       micro_messenger: MicroMessenger
       nokia: Nokia S40 Ovi Browser
       opera: Opera
+      otter: Przeglądarka Otter
       phantom_js: PhantomJS
       qq: QQ Browser
       safari: Safari
@@ -727,6 +739,25 @@ pl:
     recovery_instructions_html: Jeżeli kiedykolwiek utracisz dostęp do telefonu, możesz wykorzystać jeden z kodów zapasowych, aby odzyskać dostęp do konta. <strong>Trzymaj je w bezpiecznym miejscu</strong>. Na przykład, wydrukuj je i przechowuj z ważnymi dokumentami.
     setup: Skonfiguruj
     wrong_code: Wprowadzony kod jest niepoprawny! Czy czas serwera i urządzenia jest poprawny?
+  user_mailer:
+    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ć.
+      explanation: Kilka wskazówek, które pomogą Ci rozpocząć
+      final_action: Zacznij pisać
+      final_step: 'Zacznij tworzyć! Nawet jeżeli nikt Cię nie śledzi, Twoje publiczne wiadomości będą widziane przez innych, na przykład na lokalnej osi czasu i w hashtagach. Możesz też utworzyć wpis wprowadzający używając hashtagu #introductions.'
+      full_handle: Twój pełny adres
+      full_handle_hint: Ten adres możesz podać znajomym, aby mogli skontaktować się z Tobą lub zacząć śledzić z innej instancji.
+      review_preferences_action: Zmień ustawienia
+      review_preferences_step: Upewnij się, że zmieniłeś ustawienia, takie jak maile, które chciałbyś otrzymywać lub domyślne opcje prywatności. Jeżeli nie masz choroby lokomocyjnej, możesz włączyć automatyczne odtwarzanie animacji GIF.
+      subject: Witaj w Mastodonie
+      tip_bridge_html: Jeżeli przybywasz z Twittera, możesz znaleźć znajomych na Mastodonie używając <a href="%{bridge_url}">aplikacji mostku</a>. Działa to tylko, jeżeli oni również z niej korzystali!
+      tip_federated_timeline: Oś czasu federacji przedstawia całą sieć Mastodona. Wyświetla tylko wpisy osób, które śledzą użytkownicy Twojej instancji, więc nie jest kompletna.
+      tip_following: Domyślnie śledzisz administratora/ów swojej instancji. Aby znaleźć więcej ciekawych ludzi, zajrzyj na lokalną i federalną oś czasu.
+      tip_local_timeline: Lokalna oś czasu przedstawia osoby z %{instance}. To Twoi najbliżsi sąsiedzi!
+      tip_mobile_webapp: Jeżeli Twoja przeglądarka pozwala na dodanie Mastodona na ekran główny, będziesz otrzymywać natychmiastowe powiadomienia. Działa to prawie jak natywna aplikacja!
+      tips: Wskazówki
+      title: Witaj na pokładzie, %{name}!
   users:
     invalid_email: Adres e-mail jest niepoprawny
     invalid_otp_token: Kod uwierzytelniający jest niepoprawny
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index d4bf72da3..c2830b754 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -265,12 +265,18 @@ pt-BR:
       unresolved: Não resolvido
       view: Visualizar
     settings:
+      activity_api_enabled:
+        desc_html: Contagem de status postados localmente, usuários ativos e novos cadastros filtrados semanalmente
+        title: Publicar estatísticas agregadas sobre atividade de usuários
       bootstrap_timeline_accounts:
         desc_html: Separe nomes de usuário através de vírgulas. Funciona apenas com contas locais e destrancadas. O padrão quando vazio são todos os administradores locais.
         title: Usuários a serem seguidos por padrão por novas contas
       contact_information:
         email: E-mail
         username: Contate usuário
+      peers_api_enabled:
+        desc_html: Nomes de domínio que essa instância encontrou no fediverso
+        title: Publicar lista de instâncias descobertas
       registrations:
         closed_message:
           desc_html: Exibido na página inicial quando cadastros estão fechados. Você pode usar tags HTML
@@ -285,7 +291,7 @@ pt-BR:
           desc_html: Permitir que qualquer um crie uma conta
           title: Cadastro aberto
       show_staff_badge:
-        desc_html: Mostrar uma insígnia de equipe na página de usuário
+        desc_html: Mostrar uma insígnia de Equipe na página de usuário
         title: Mostrar insígnia de equipe
       site_description:
         desc_html: Parágrafo introdutório na página inicial e em meta tags. Você pode usar tags HTML, em especial <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
@@ -334,7 +340,6 @@ pt-BR:
   application_mailer:
     salutation: "%{name},"
     settings: 'Mudar e-mail de preferência: %{link}'
-    signature: Notificações do Mastodon de %{instance}
     view: 'Visualizar:'
   applications:
     created: Aplicação criada com sucesso
@@ -345,7 +350,7 @@ pt-BR:
     warning: Tenha cuidado com estes dados. Nunca compartilhe com alguém!
     your_token: Seu token de acesso
   auth:
-    agreement_html: Cadastrando-se você concorda em seguir <a href="%{rules_path}">as regras da instância</a> e <a href="%{terms_path}">os nossos termos de serviço</a>.
+    agreement_html: Ao se cadastrar você concorda em seguir <a href="%{rules_path}">as regras da instância</a> e <a href="%{terms_path}">os nossos termos de serviço</a>.
     change_password: Segurança
     delete_account: Excluir conta
     delete_account_html: Se você deseja excluir a sua conta, você pode <a href="%{path}">prosseguir para cá</a>. Uma confirmação será requisitada.
@@ -596,7 +601,7 @@ pt-BR:
     open_in_web: Abrir na web
     over_character_limit: limite de caracteres de %{max} excedido
     pin_errors:
-      limit: Você já fixou o máximo de toots possíveis
+      limit: Você já fixou a quantidade máxima de toots
       ownership: Toots de outras pessoas não podem ser fixados
       private: Toot não-público não pode ser fixado
       reblog: Um compartilhamento não pode ser fixado
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index c0056af4f..618373b91 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -328,7 +328,6 @@ pt:
   application_mailer:
     salutation: "%{name},"
     settings: 'Alterar preferências de email: %{link}'
-    signature: notificações Mastodon do %{instance}
     view: 'Ver:'
   applications:
     created: Aplicação criada com sucesso
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 697a1aa27..842fd7d54 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -49,6 +49,7 @@ ru:
     reserved_username: Имя пользователя зарезервировано
     roles:
       admin: Администратор
+      moderator: Мод
     unfollow: Отписаться
   admin:
     account_moderation_notes:
@@ -71,6 +72,8 @@ ru:
       domain: Домен
       edit: Изменить
       email: E-mail
+      enable: Включить
+      enabled: Включен
       feed_url: URL фида
       followers: Подписчики
       followers_url: URL подписчиков
@@ -336,10 +339,11 @@ ru:
       body: "%{reporter} подал(а) жалобу на %{target}"
       subject: Новая жалоба, узел %{instance} (#%{id})
   application_mailer:
+    notification_preferences: Изменить настройки e-mail
     salutation: "%{name},"
     settings: 'Изменить настройки e-mail: %{link}'
-    signature: Уведомления Mastodon от %{instance}
     view: 'Просмотр:'
+    view_status: Просмотреть статус
   applications:
     created: Приложение успешно создано
     destroyed: Приложение успешно удалено
@@ -349,7 +353,7 @@ ru:
     warning: Будьте очень внимательны с этими данными. Не делитесь ими ни с кем!
     your_token: Ваш токен доступа
   auth:
-    agreement_html: Создавая аккаунт, вы соглашаетесь с <a href="%{rules_path}">нашими правилами поведения</a> и <a href="%{terms_path}">политикой конфиденциальности</a>.
+    agreement_html: Создавая аккаунт, вы соглашаетесь с <a href="%{rules_path}">правилами узла</a> и <a href="%{terms_path}">нашими условиями обслуживания</a>.
     change_password: Изменить пароль
     delete_account: Удалить аккаунт
     delete_account_html: Если Вы хотите удалить свой аккаунт, вы можете <a href="%{path}">перейти сюда</a>. У Вас будет запрошено подтверждение.
@@ -554,6 +558,7 @@ ru:
       blackberry: Blackberry
       chrome: Chrome
       edge: Microsoft Edge
+      electron: Electron
       firefox: Firefox
       generic: Неизвестный браузер
       ie: Internet Explorer
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 2ff3348f3..3d210b73c 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -4,7 +4,7 @@ ca:
     hints:
       defaults:
         avatar: PNG, GIF o JPG. Màxim 2MB. Serà escalat a 120x120px
-        digest: S'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència
+        digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència
         display_name:
           one: <span class="name-counter">1</span> càracter
           other: <span class="name-counter">%{count}</span> càracters
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 2397e5161..017aa4021 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -4,7 +4,7 @@ fr:
     hints:
       defaults:
         avatar: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à 120x120px
-        digest: Envoyé après une longue période d’inactivité et contient un résumé des notifications que vous avez reçues pendant votre absence
+        digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence
         display_name:
           one: <span class="name-counter">1</span> caractère restant
           other: <span class="name-counter">%{count}</span> caractères restants
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 361a5ada6..33b75e74a 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -4,7 +4,7 @@ ja:
     hints:
       defaults:
         avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます
-        digest: 長期間ログインしなかった際、その期間に受け取った返信の要約を受け取ることができます
+        digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます
         display_name: あと<span class="name-counter">%{count}</span>文字入力できます。
         header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます
         locked: フォロワーを手動で承認する必要があります
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index a97239669..dd987aab1 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -4,27 +4,27 @@ pl:
     hints:
       defaults:
         avatar: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 120x120px
-        digest: Wysyłane po długiej nieaktywności, zawiera podsumowanie wspomnień o Twoich profilu
+        digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią
         display_name:
           few: Pozostały <span class="name-counter">%{count}</span> znaki.
           many: Pozostało <span class="name-counter">%{count}</span> znaków
-          one: Pozostał <span class="name-counter">1</span> znak.
+          one: Pozostał <span class="name-counter">1</span> znak
           other: Pozostało <span class="name-counter">%{count}</span> znaków
         header: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 700x335px
         locked: Musisz akceptować prośby o śledzenie
         note:
           few: Pozostały <span class="name-counter">%{count}</span> znaki.
           many: Pozostało <span class="name-counter">%{count}</span> znaków
-          one: Pozostał <span class="name-counter">1</span> znak.
+          one: Pozostał <span class="name-counter">1</span> znak
           other: Pozostało <span class="name-counter">%{count}</span> znaków
         setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów
         setting_skin: Zmienia wygląd używanej odmiany Mastodona
       imports:
         data: Plik CSV wyeksportowany z innej instancji Mastodona
       sessions:
-        otp: Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych
+        otp: Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych.
       user:
-        filtered_languages: Wpisy w wybranych językach nie będą wyświetlać się na publicznych osiach czasu.
+        filtered_languages: Wpisy w wybranych językach nie będą wyświetlać się na publicznych osiach czasu
     labels:
       defaults:
         avatar: Awatar
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 25265c73a..45e4c2954 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -30,10 +30,12 @@ sk:
         data: Dáta
         display_name: Meno
         email: Emailová adresa
+        expires_in: Expirovať po
         filtered_languages: Filtrované jazyky
         header: Obrázok v hlavičke
         locale: Jazyk
         locked: Zamknúť účet
+        max_uses: Maximálny počet použití
         new_password: Nové heslo
         note: O vás
         otp_attempt: Dvoj-faktorový (2FA) kód
@@ -44,6 +46,7 @@ sk:
         setting_default_sensitive: Označiť každý obrázok/video/súbor ako chúlostivý
         setting_delete_modal: Zobrazovať potvrdzovacie okno pred zmazaním toot-u
         setting_noindex: Nezaradzovať vaše príspevky do indexácie pre vyhľadávanie
+        setting_reduce_motion: Redukovať pohyb v animáciách
         setting_system_font_ui: Použiť štandardný systémový font
         setting_theme: Vzhľad
         setting_unfollow_modal: Zobrazovať potvrdzovacie okno pred skončením sledovania iného používateľa
@@ -53,6 +56,7 @@ sk:
       interactions:
         must_be_follower: Blokovať notifikácie pod používateľov, ktorí vás nesledujú
         must_be_following: Blokovať notifikácie od ľudí ktorý vás nesledujú
+        must_be_following_dm: Blokovať priame 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ý
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index d3ae96dcd..4cf7d6f30 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -1,6 +1,7 @@
 ---
 sk:
   about:
+    about_hashtag_html: Toto sú verejné tooty otagované <strong>#%{tagom}</strong>. Ak máš účet niekde vo fediverse, môžeš ich používať.
     about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch. Jej zrojový kód je otvorený a je decentralizovaná podobne ako email.
     about_this: Info
     closed_registrations: Registrácie sú momentálne uzatvorené. Avšak, existujú ďalšie Mastodon inštancie kde si môžete založiť účet a získať prístup do tejto siete od nich.
@@ -38,6 +39,7 @@ sk:
     followers: Sledujúci
     following: Sleduje
     media: Médiá
+    moved_html: "%{name} účet bol presunutý na %{new_profile_link}:"
     nothing_here: Nič tu nie je!
     people_followed_by: Ľudia, ktorých %{name} sleduje
     people_who_follow: Ľudia sledujúci %{name}
@@ -47,17 +49,31 @@ sk:
     reserved_username: Prihlasovacie meno je rezervované
     roles:
       admin: Admin
+      moderator: Mod
     unfollow: Prestať sledovať
   admin:
+    account_moderation_notes:
+      account: Moderátor
+      create: Vytvoriť
+      created_at: Dátum
+      created_msg: Poznámka moderátora bola úspešne vytvorená!
+      delete: Zmazať
+      destroyed_msg: Poznámka moderátora bola úspešne zmazaná!
     accounts:
       are_you_sure: Ste si istý?
+      by_domain: Doména
       confirm: Potvrdiť
       confirmed: Potvrdený
+      demote: Degradovať
+      disable: Zablokovať
       disable_two_factor_authentication: Zakázať 2FA
+      disabled: Blokovaný
       display_name: Zobraziť meno
       domain: Doména
       edit: Upraviť
       email: Email
+      enable: Povoliť
+      enabled: Povolený
       feed_url: URL časovej osi
       followers: Sledujúci
       followers_url: URL sledujúcich
@@ -69,12 +85,15 @@ sk:
         local: Lokálne
         remote: Federované
         title: Lokácia
+      login_status: Status prihlásenia
       media_attachments: Prílohy
+      memorialize: Zmeniť na "Navždy budeme spomínať"
       moderation:
         all: Všetko
         silenced: Umlčané
         suspended: Suspendované
         title: Moderácia
+      moderation_notes: Moderátorské poznámky
       most_recent_activity: Posledná aktivita
       most_recent_ip: Posledná IP
       not_subscribed: Nezaregistrované
@@ -85,6 +104,7 @@ sk:
       outbox_url: URL poslaných
       perform_full_suspension: Suspendovať
       profile_url: URL profilu
+      promote: Povýšiť
       protocol: Protokol
       public: Verejná os
       push_subscription_expires: PuSH odoberanie expiruje
@@ -92,6 +112,12 @@ sk:
       reset: Reset
       reset_password: Obnoviť heslo
       resubscribe: Znovu odoberať
+      role: Oprávnenia
+      roles:
+        admin: Administrátor
+        moderator: Moderátor
+        staff: Člen
+        user: Používateľ
       salmon_url: Salmon URL
       search: Hľadať
       shared_inbox_url: URL zdieľanej schránky
@@ -108,17 +134,56 @@ sk:
       unsubscribe: Prestať odoberať
       username: Používateľske meno
       web: Web
+    action_logs:
+      actions:
+        confirm_user: "%{name} potvrdil e-mailovú adresu používateľa %{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"
+        demote_user: "%{name} degradoval používateľa %{target}"
+        destroy_domain_block: "%{name} povolil doménu %{target}"
+        destroy_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam povolených"
+        destroy_status: "%{name} zmazal status %{target}"
+        disable_2fa_user: "%{name} zakázal 2FA pre používateľa %{target}"
+        disable_custom_emoji: "%{name} zakázal emoji %{target}"
+        disable_user: "%{name} zakázal prihlásenie pre používateľa %{target}"
+        enable_custom_emoji: "%{name} povolil emoji %{target}"
+        enable_user: "%{name} povolil prihlásenie pre používateľa %{target}"
+        memorialize_account: '%{name} zmenil účet %{target} na stránku "Navždy budeme spomínať"'
+        promote_user: "%{name} povýšil používateľa %{target}"
+        reset_password_user: "%{name} resetoval heslo pre používateľa %{target}"
+        resolve_report: "%{name} zamietol nahlásenie %{target}"
+        silence_account: "%{name} stíšil účet %{target}"
+        suspend_account: "%{name} suspendoval účet používateľa %{target}"
+        unsilence_account: "%{name} zrušil stíšenie účtu používateľa %{target}"
+        unsuspend_account: "%{name} zrušil suspendáciu účtu používateľa %{target}"
+        update_custom_emoji: "%{name} aktualizoval emoji %{target}"
+        update_status: "%{name} aktualizoval status %{target}"
+      title: Audit log
     custom_emojis:
+      by_domain: Doména
+      copied_msg: Lokálna kópia emoji úspešne vytvorená
+      copy: Kopírovať
+      copy_failed_msg: Nebolo možné vytvoriť lokálnu kópiu tohto emoji
       created_msg: Emoji úspešne vytvorené!
       delete: Zmazať
       destroyed_msg: Emojo úspešne zničený!
+      disable: Zakázať
+      disabled_msg: Emoji bolo úspešne zakázané
       emoji: Emoji
+      enable: Povoliť
+      enabled_msg: Emoji bolo úspešne povolené
       image_hint: PNG do 50KB
+      listed: V zozname
       new:
-        title: Pridať vlastný emoji
+        title: Pridať nový vlastný emoji
+      overwrite: Prepísať
       shortcode: Skratka
       shortcode_hint: Aspoň 2 znaky, povolené sú alfanumerické alebo podčiarkovník
       title: Vlastné emoji
+      unlisted: Nie je na zozname
+      update_failed_msg: Nebolo možné aktualizovať toto emoji
+      updated_msg: Emoji bolo úspešne aktualizované!
       upload: Nahrať
     domain_blocks:
       add_new: Pridať nový
@@ -129,16 +194,43 @@ sk:
         create: Blokovať doménu
         hint: Blokovanie domény stále dovolí vytvárať nové účty v databáze, ale tieto budú automaticky moderované.
         severity:
+          desc_html: "<strong>Stíšenie</strong> urobí všetky príspevky účtu neviditeľné pre všetkých ktorý nesledujú tento účet. <strong>Suspendácia</strong> zmaže všetky príspevky, médiá a profilové informácie. Použi <strong>Nič</strong> ak chceš iba neprijímať súbory médií."
           noop: Nič
           silence: Stíšiť
           suspend: Suspendovať
         title: Nové blokovanie domény
       reject_media: Odmietať súbory s obrázkami alebo videami
+      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
       severities:
         noop: Nič
         silence: Stíšiť
         suspend: Suspendovať
       severity: Závažnosť
+      show:
+        affected_accounts:
+          one: Jeden účet v databáze ovplyvnený
+          other: "%{count} účtov v databáze ovplyvnených"
+        retroactive:
+          silence: Zrušiť stíšenie všetkých existujúcich účtov z tejto domény
+          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ý
+      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
+  auth:
+    login: Prihlásenie
   settings:
     authorized_apps: Autorizované aplikácie
     back: Naspäť na stránku
+  users:
+    invalid_email: Emailová adresa je neplatná
+    invalid_otp_token: Neplatný 2FA kód
+    signed_in_as: 'Prihlásený ako:'
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 964a82d64..ac80e81ec 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -336,7 +336,6 @@ sr-Latn:
   application_mailer:
     salutation: "%{name},"
     settings: 'Promeni podešavanja e-pošte: %{link}'
-    signature: Mastodont obaveštenje sa instance %{instance}
     view: 'Pogledaj:'
   applications:
     created: Aplikacija uspešno napravljena
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 57ccf2008..755396828 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -336,7 +336,6 @@ sr:
   application_mailer:
     salutation: "%{name},"
     settings: 'Промени подешавања е-поште: %{link}'
-    signature: Мастодонт обавештење са инстанце %{instance}
     view: 'Погледај:'
   applications:
     created: Апликација успешно направљена
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index ebb6d6595..b6595cb0d 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -272,7 +272,6 @@ sv:
   application_mailer:
     salutation: "%{name},"
     settings: 'Change e-mail preferences: %{link}'
-    signature: Mastodon meddelande från %{instance}
     view: 'Granska:'
   applications:
     created: Ansökan är framgångsrikt skapad
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 2db3aee8a..737b3aa95 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -153,7 +153,6 @@ th:
     title: แอดมิน
   application_mailer:
     settings: 'เปลี่ยนอีเมล์ preferences: %{link}'
-    signature: ฟอร์มการแจ้งเตือนแมสโทดอน %{instance}
     view: 'วิว:'
   applications:
     invalid_url: URL ที่ระบุไม่ถูกตั้ง
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 6aff78fa1..23b4d7a24 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -152,7 +152,6 @@ tr:
     title: Yönetim
   application_mailer:
     settings: 'E-mail tercihlerini değiştir: %{link}'
-    signature: "%{instance} sunucusundan Mastodon bildirimleri"
     view: 'Görüntüle:'
   applications:
     invalid_url: Verilen URL geçerli değil
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 995a682a7..0ddfa9190 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -143,7 +143,6 @@ uk:
     title: Адміністрування
   application_mailer:
     settings: 'Змінити налаштування email: %{link}'
-    signature: Сповіщення Mastodon від %{instance}
     view: 'Перегляд:'
   applications:
     invalid_url: Введена URL неправильна
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 14382331b..7deb241a1 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -339,7 +339,6 @@ zh-CN:
     notification_preferences: 更改电子邮件首选项
     salutation: "%{name}:"
     settings: 使用此链接更改你的电子邮件首选项:%{link}
-    signature: 这是一封来自 %{instance} 的 Mastodon 电子邮件通知。
     view: 点此链接查看详情:
     view_profile: 查看个人资料页
     view_status: 查看嘟文
@@ -592,7 +591,7 @@ zh-CN:
     back: 回到 Mastodon
     delete: 删除帐户
     development: 开发
-    edit_profile: 更改个人信息
+    edit_profile: 更改个人资料
     export: 导出
     followers: 已授权的关注者
     import: 导入
@@ -713,6 +712,25 @@ zh-CN:
     recovery_instructions_html: 如果你的手机无法使用,你可以使用下列任意一个恢复代码来重新获得对帐户的访问权。<strong>请妥善保管好你的恢复代码</strong>(例如,你可以将它们打印出来,然后和其他重要的文件放在一起)。
     setup: 设置
     wrong_code: 输入的认证码无效!请核对一下你的设备显示的时间,如果正确,你可能需要联系一下实例的管理员,让他们校准服务器的时间。
+  user_mailer:
+    welcome:
+      edit_profile_action: 设置个人资料
+      edit_profile_step: 你可以自定义你的个人资料,包括上传头像、横幅图片、更改昵称等等。如果你想在新的关注者关注你之前对他们进行审核,你也可以选择为你的帐户开启保护。
+      explanation: 下面是几个小贴士,希望它们能帮到你
+      final_action: 开始嘟嘟
+      final_step: '开始嘟嘟吧!即便你现在没有关注者,其他人仍然能在本站时间轴或者话题标签等地方看到你的公开嘟文。试着用 #introductions 这个话题标签介绍一下自己吧。'
+      full_handle: 你的完整用户地址
+      full_handle_hint: 你需要把这个告诉你的朋友们,这样他们就能从另一个实例向你发送信息或者关注你。
+      review_preferences_action: 更改首选项
+      review_preferences_step: 记得调整你的偏好设置,比如你想接收什么类型的邮件,或者你想把你的嘟文可见范围默认设置为什么级别。如果你没有晕动病的话,考虑一下启用“自动播放 GIF 动画”这个选项吧。
+      subject: 欢迎来到 Mastodon
+      tip_bridge_html: 如果你刚从 Twitter 来到这里,你可以在<a href="%{bridge_url}">桥梁站(bridge app)</a>上寻找你的朋友。当然,前提是他们也登录了桥梁站!
+      tip_federated_timeline: 跨站公共时间轴可以让你一窥更广阔的 Mastodon 网络。不过,由于它只显示你的邻居们所订阅的内容,所以并不是全部。
+      tip_following: 默认情况下,你会自动关注你所在实例的管理员。想结交更多有趣的人的话,记得多逛逛本站时间轴和跨站公共时间轴哦。
+      tip_local_timeline: 本站时间轴可以让你一窥 %{instance} 上的用户。他们就是离你最近的邻居!
+      tip_mobile_webapp: 如果你的移动设备浏览器允许你将 Mastodon 添加到主屏幕,你就能够接收推送消息。它就像本地应用一样好使!
+      tips: 小贴士
+      title: "%{name},欢迎你的加入!"
   users:
     invalid_email: 输入的电子邮件地址无效
     invalid_otp_token: 输入的双重认证代码无效
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 8ff6d1bf8..ed73b7244 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -152,7 +152,6 @@ zh-HK:
     title: 管理
   application_mailer:
     settings: 修改電郵設定︰%{link}
-    signature: 來自 %{instance} 的 Mastodon 通知
     view: 進入瀏覽︰
   applications:
     invalid_url: 所提供的網址不正確
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index e73dbf9cc..bd9f85840 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -123,7 +123,6 @@ zh-TW:
     title: 管理介面
   application_mailer:
     settings: 修改信箱設定︰ %{link}
-    signature: 來自 %{instance} 的 Mastodon 通知
     view: 進入瀏覽︰
   applications:
     invalid_url: 網址不正確
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index a38d9d11d..f6b4d4c61 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -73,7 +73,7 @@ function formatPublicPath(host = '', path = '') {
 
 const output = {
   path: resolve('public', settings.public_output_path),
-  publicPath: formatPublicPath(env.ASSET_HOST, settings.public_output_path),
+  publicPath: formatPublicPath(env.ASSET_HOST || env.LOCAL_DOMAIN, settings.public_output_path),
 };
 
 module.exports = {
diff --git a/lib/mastodon/premailer_webpack_strategy.rb b/lib/mastodon/premailer_webpack_strategy.rb
index 4ea3ce80c..84d83cc66 100644
--- a/lib/mastodon/premailer_webpack_strategy.rb
+++ b/lib/mastodon/premailer_webpack_strategy.rb
@@ -2,6 +2,9 @@
 
 module PremailerWebpackStrategy
   def load(url)
+    public_path_host = ENV['ASSET_HOST'] || ENV['LOCAL_DOMAIN']
+    url = url.gsub(/\A\/\/#{public_path_host}/, '')
+
     if Webpacker.dev_server.running?
       url = File.join("#{Webpacker.dev_server.protocol}://#{Webpacker.dev_server.host_with_port}", url)
       HTTP.get(url).to_s
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 5936b5fcf..098ab46ac 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,11 +9,11 @@ module Mastodon
     end
 
     def minor
-      1
+      2
     end
 
     def patch
-      3
+      0
     end
 
     def pre
@@ -21,7 +21,7 @@ module Mastodon
     end
 
     def flags
-      ''
+      'rc1'
     end
 
     def to_a
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index 38dbed982..486c035de 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -341,6 +341,15 @@ namespace :mastodon do
       LinkCrawlWorker.push_bulk status_ids
     end
 
+    desc 'Remove all home feed regeneration markers'
+    task remove_regeneration_markers: :environment do
+      keys = Redis.current.keys('account:*:regeneration')
+
+      Redis.current.pipelined do
+        keys.each { |key| Redis.current.del(key) }
+      end
+    end
+
     desc 'Check every known remote account and delete those that no longer exist in origin'
     task purge_removed_accounts: :environment do
       prepare_for_options!
diff --git a/spec/controllers/concerns/user_tracking_concern_spec.rb b/spec/controllers/concerns/user_tracking_concern_spec.rb
index 168d44ba6..1e5620221 100644
--- a/spec/controllers/concerns/user_tracking_concern_spec.rb
+++ b/spec/controllers/concerns/user_tracking_concern_spec.rb
@@ -43,15 +43,45 @@ describe ApplicationController, type: :controller do
       expect_updated_sign_in_at(user)
     end
 
-    it 'regenerates feed when sign in is older than two weeks' do
-      allow(RegenerationWorker).to receive(:perform_async)
-      user.update(current_sign_in_at: 3.weeks.ago)
-      sign_in user, scope: :user
-      get :show
+    describe 'feed regeneration' do
+      before do
+        alice = Fabricate(:account)
+        bob   = Fabricate(:account)
 
-      expect_updated_sign_in_at(user)
-      expect(Redis.current.get("account:#{user.account_id}:regeneration")).to eq 'true'
-      expect(RegenerationWorker).to have_received(:perform_async)
+        user.account.follow!(alice)
+        user.account.follow!(bob)
+
+        Fabricate(:status, account: alice, text: 'hello world')
+        Fabricate(:status, account: bob, text: 'yes hello')
+        Fabricate(:status, account: user.account, text: 'test')
+
+        user.update(last_sign_in_at: 'Tue, 04 Jul 2017 14:45:56 UTC +00:00', current_sign_in_at: 'Wed, 05 Jul 2017 22:10:52 UTC +00:00')
+
+        sign_in user, scope: :user
+      end
+
+      it 'sets a regeneration marker while regenerating' do
+        allow(RegenerationWorker).to receive(:perform_async)
+        get :show
+
+        expect_updated_sign_in_at(user)
+        expect(Redis.current.get("account:#{user.account_id}:regeneration")).to eq 'true'
+        expect(RegenerationWorker).to have_received(:perform_async)
+      end
+
+      it 'sets the regeneration marker to expire' do
+        allow(RegenerationWorker).to receive(:perform_async)
+        get :show
+        expect(Redis.current.ttl("account:#{user.account_id}:regeneration")).to be >= 0
+      end
+
+      it 'regenerates feed when sign in is older than two weeks' do
+        get :show
+
+        expect_updated_sign_in_at(user)
+        expect(Redis.current.zcard(FeedManager.instance.key(:home, user.account_id))).to eq 3
+        expect(Redis.current.get("account:#{user.account_id}:regeneration")).to be_nil
+      end
     end
 
     def expect_updated_sign_in_at(user)
diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb
index 6ed0090f4..8d2a9368d 100644
--- a/spec/mailers/previews/user_mailer_preview.rb
+++ b/spec/mailers/previews/user_mailer_preview.rb
@@ -29,4 +29,9 @@ class UserMailerPreview < ActionMailer::Preview
   def reset_password_instructions
     UserMailer.reset_password_instructions(User.first, 'spec')
   end
+
+  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/welcome
+  def welcome
+    UserMailer.welcome(User.first)
+  end
 end
diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb
index 9f17993e0..6b430b505 100644
--- a/spec/mailers/user_mailer_spec.rb
+++ b/spec/mailers/user_mailer_spec.rb
@@ -23,7 +23,7 @@ describe UserMailer, type: :mailer do
 
     it 'renders confirmation instructions' do
       receiver.update!(locale: nil)
-      expect(mail.body.encoded).to include receiver.email
+      expect(mail.body.encoded).to include I18n.t('devise.mailer.confirmation_instructions.title')
       expect(mail.body.encoded).to include 'spec'
       expect(mail.body.encoded).to include Rails.configuration.x.local_domain
     end
@@ -38,7 +38,7 @@ describe UserMailer, type: :mailer do
 
     it 'renders reconfirmation instructions' do
       receiver.update!(email: 'new-email@example.com', locale: nil)
-      expect(mail.body.encoded).to include 'new-email@example.com'
+      expect(mail.body.encoded).to include I18n.t('devise.mailer.reconfirmation_instructions.title')
       expect(mail.body.encoded).to include 'spec'
       expect(mail.body.encoded).to include Rails.configuration.x.local_domain
       expect(mail.subject).to eq I18n.t('devise.mailer.reconfirmation_instructions.subject',
@@ -52,7 +52,7 @@ describe UserMailer, type: :mailer do
 
     it 'renders reset password instructions' do
       receiver.update!(locale: nil)
-      expect(mail.body.encoded).to include receiver.email
+      expect(mail.body.encoded).to include I18n.t('devise.mailer.reset_password_instructions.title')
       expect(mail.body.encoded).to include 'spec'
     end
 
@@ -65,7 +65,7 @@ describe UserMailer, type: :mailer do
 
     it 'renders password change notification' do
       receiver.update!(locale: nil)
-      expect(mail.body.encoded).to include receiver.email
+      expect(mail.body.encoded).to include I18n.t('devise.mailer.password_change.title')
     end
 
     include_examples 'localized subject',
@@ -77,7 +77,7 @@ describe UserMailer, type: :mailer do
 
     it 'renders email change notification' do
       receiver.update!(locale: nil)
-      expect(mail.body.encoded).to include receiver.email
+      expect(mail.body.encoded).to include I18n.t('devise.mailer.email_changed.title')
     end
 
     include_examples 'localized subject',
diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb
index bb7601e76..1435ec917 100644
--- a/spec/services/notify_service_spec.rb
+++ b/spec/services/notify_service_spec.rb
@@ -82,10 +82,19 @@ RSpec.describe NotifyService do
         is_expected.to_not change(Notification, :count)
       end
 
-      context 'if the message chain initiated by recipient' do
+      context 'if the message chain initiated by recipient, but is not direct message' do
         let(:reply_to) { Fabricate(:status, account: recipient) }
         let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) }
 
+        it 'does not notify' do
+          is_expected.to_not change(Notification, :count)
+        end
+      end
+
+      context 'if the message chain initiated by recipient and is direct message' do
+        let(:reply_to) { Fabricate(:status, account: recipient, visibility: :direct) }
+        let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) }
+
         it 'does notify' do
           is_expected.to change(Notification, :count)
         end