diff --git a/.rubocop.yml b/.rubocop.yml
index 91f28fdb15f4025dc505cde0d167975adcdf8eff..02fd23ffd84a873ec6a2e10f02bed5366dfe26e7 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,4 +1,5 @@
 AllCops:
+  TargetRubyVersion: 2.3
   Exclude:
     - "bin/**/*"
     - "db/schema.rb"
@@ -152,7 +153,7 @@ Style/Documentation:
   Enabled: false 
 
 # This is just silly. Calling the argument `other` in all cases makes no sense.
-Style/OpMethod:
+Naming/BinaryOperatorParameterName:
   Enabled: false 
 
 # There are valid cases, for example debugging Cucumber steps,
@@ -167,13 +168,3 @@ Style/NumericPredicate:
 # Reset some HoundCI changes back to Rubocop defaults
 Layout/DotPosition:
   EnforcedStyle: leading
-
-### backward compatibility
-
-# only with ruby >= 2.3
-Style/FrozenStringLiteralComment:
-  Enabled: false
-
-# only with ruby >= 2.4
-Performance/RegexpMatch:
-  Enabled: false
diff --git a/.travis.yml b/.travis.yml
index e4b3101718550c23608ea208bca31f4fbbac7f53..9661014519bf661f1ace8ee45b0d7f27e096bccb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,8 @@
 language: ruby
 
 rvm:
-  - 2.4.1
-  - 2.3.4
+  - 2.4.2
+  - 2.3.5
 
 env:
   - DB=postgresql BUILD_TYPE=cucumber
diff --git a/Changelog.md b/Changelog.md
index c552f0b4f7e74d0e1582c57c518ab65c6cd78d39..9ebd9e5571f128d7c1433d996e122900653af857 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,56 @@
+# 0.7.1.0
+
+## Ensure account deletions are run
+
+There were some issues causing accounts deletions to not properly perform in some cases, see
+[#7631](https://github.com/diaspora/diaspora/issues/7631) and [#7639](https://github.com/diaspora/diaspora/pull/7639).
+To ensure these are reexecuted properly, please run `RAILS_ENV=production bin/rake migrations:run_account_deletions`
+after you've upgraded.
+
+## Refactor
+* Remove title from profile photo upload button [#7551](https://github.com/diaspora/diaspora/pull/7551)
+* Remove Internet Explorer workarounds [#7557](https://github.com/diaspora/diaspora/pull/7557)
+* Sort notifications by last interaction [#7568](https://github.com/diaspora/diaspora/pull/7568) [#7648](https://github.com/diaspora/diaspora/pull/7648)
+* Remove tiff support from photos [#7576](https://github.com/diaspora/diaspora/pull/7576)
+* Remove reference from reshares when original post is deleted [#7578](https://github.com/diaspora/diaspora/pull/7578)
+* Merge migrations from before 0.6.0.0 to CreateSchema [#7580](https://github.com/diaspora/diaspora/pull/7580)
+* Remove auto detection of languages with highlightjs [#7591](https://github.com/diaspora/diaspora/pull/7591)
+* Move enable/disable notification icon [#7592](https://github.com/diaspora/diaspora/pull/7592)
+* Use Bootstrap 3 progress-bar for polls [#7600](https://github.com/diaspora/diaspora/pull/7600)
+* Enable frozen string literals [#7595](https://github.com/diaspora/diaspora/pull/7595)
+* Remove `rails_admin_histories` table [#7597](https://github.com/diaspora/diaspora/pull/7597)
+* Optimize memory usage on profile export [#7627](https://github.com/diaspora/diaspora/pull/7627)
+* Limit the number of parallel exports [#7629](https://github.com/diaspora/diaspora/pull/7629)
+* Reduce memory usage for account deletion [#7639](https://github.com/diaspora/diaspora/pull/7639)
+
+## Bug fixes
+* Fix displaying polls with long answers [#7579](https://github.com/diaspora/diaspora/pull/7579)
+* Fix S3 support [#7566](https://github.com/diaspora/diaspora/pull/7566)
+* Fix mixed username and timestamp with LTR/RTL scripts [#7575](https://github.com/diaspora/diaspora/pull/7575)
+* Prevent users from zooming in IE Mobile [#7589](https://github.com/diaspora/diaspora/pull/7589)
+* Fix recipient prefill on contacts and profile page [#7599](https://github.com/diaspora/diaspora/pull/7599)
+* Display likes and reshares without login [#7583](https://github.com/diaspora/diaspora/pull/7583)
+* Fix invalid data in the database for user data export [#7614](https://github.com/diaspora/diaspora/pull/7614)
+* Fix local migration run without old private key [#7558](https://github.com/diaspora/diaspora/pull/7558)
+* Fix export not downloadable because the filename was resetted on access [#7622](https://github.com/diaspora/diaspora/pull/7622)
+* Delete invalid oEmbed caches with binary titles [#7620](https://github.com/diaspora/diaspora/pull/7620)
+* Delete invalid diaspora IDs from friendica [#7630](https://github.com/diaspora/diaspora/pull/7630)
+* Cleanup relayables where the signature is missing [#7637](https://github.com/diaspora/diaspora/pull/7637)
+* Avoid page to jump to top after a post deletion [#7638](https://github.com/diaspora/diaspora/pull/7638)
+* Handle duplicate account deletions [#7639](https://github.com/diaspora/diaspora/pull/7639)
+* Handle duplicate account migrations [#7641](https://github.com/diaspora/diaspora/pull/7641)
+* Handle bugs related to missing users [#7632](https://github.com/diaspora/diaspora/pull/7632)
+* Cleanup empty signatures [#7644](https://github.com/diaspora/diaspora/pull/7644)
+
+## Features
+* Ask for confirmation when leaving a submittable comment field [#7530](https://github.com/diaspora/diaspora/pull/7530)
+* Show users vote in polls [#7550](https://github.com/diaspora/diaspora/pull/7550)
+* Add explanation of ignore function to in-app help section [#7585](https://github.com/diaspora/diaspora/pull/7585)
+* Add camo information to NodeInfo [#7617](https://github.com/diaspora/diaspora/pull/7617)
+* Add support for `diaspora://` links [#7625](https://github.com/diaspora/diaspora/pull/7625)
+* Add support to relay likes for comments [#7625](https://github.com/diaspora/diaspora/pull/7625)
+* Implement RFC 7033 WebFinger [#7625](https://github.com/diaspora/diaspora/pull/7625)
+
 # 0.7.0.1
 
 Update nokogiri to fix [multiple libxml2 vulnerabilities](https://usn.ubuntu.com/usn/usn-3424-1/).
diff --git a/Gemfile b/Gemfile
index c7cc848d9dbf071018fb983f67d3d36417281747..8234f47be0766f525c49fae23d351013c9cbf8a4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,8 @@
+# frozen_string_literal: true
+
 source "https://rubygems.org"
 
-gem "rails", "5.1.3"
+gem "rails", "5.1.4"
 
 # Legacy Rails features, remove me!
 # responders (class level)
@@ -13,8 +15,8 @@ gem "unicorn-worker-killer", "0.4.4"
 
 # Federation
 
-gem "diaspora_federation-json_schema", "0.2.1"
-gem "diaspora_federation-rails", "0.2.1"
+gem "diaspora_federation-json_schema", "0.2.2"
+gem "diaspora_federation-rails", "0.2.2"
 
 # API and JSON
 
@@ -53,12 +55,12 @@ gem "rack-cors", "1.0.1", require: "rack/cors"
 
 # CSS
 
-gem "autoprefixer-rails",     "7.1.2.4"
+gem "autoprefixer-rails",     "7.1.4.1"
 gem "bootstrap-sass",         "3.3.7"
 gem "bootstrap-switch-rails", "3.3.3"
 gem "compass-rails",          "3.0.2"
 gem "sass-rails",             "5.0.6"
-gem "sprockets-rails",        "3.2.0"
+gem "sprockets-rails",        "3.2.1"
 
 # Database
 
@@ -70,12 +72,12 @@ group :postgresql, optional: true do
 end
 
 
-gem "activerecord-import", "0.19.1"
+gem "activerecord-import", "0.20.1"
 
 # File uploading
 
 gem "carrierwave", "1.1.0"
-gem "fog-aws",     "1.4.0"
+gem "fog-aws",     "1.4.1"
 gem "mini_magick", "4.8.0"
 
 # GUID generation
@@ -89,7 +91,7 @@ gem "entypo-rails", "3.0.0"
 
 gem "handlebars_assets", "0.23.2"
 gem "jquery-rails",      "4.3.1"
-gem "js-routes",         "1.3.3"
+gem "js-routes",         "1.4.1"
 gem "js_image_paths",    "0.1.1"
 
 source "https://rails-assets.org" do
@@ -97,7 +99,7 @@ source "https://rails-assets.org" do
   gem "rails-assets-jquery.ui",                           "1.11.4"
 
   gem "rails-assets-highlightjs",                         "9.12.0"
-  gem "rails-assets-markdown-it",                         "8.3.2"
+  gem "rails-assets-markdown-it",                         "8.4.0"
   gem "rails-assets-markdown-it-hashtag",                 "0.4.0"
   gem "rails-assets-markdown-it-diaspora-mention",        "1.2.0"
   gem "rails-assets-markdown-it-sanitizer",               "0.4.3"
@@ -113,7 +115,7 @@ source "https://rails-assets.org" do
   # jQuery plugins
 
   gem "rails-assets-autosize",                            "4.0.0"
-  gem "rails-assets-blueimp-gallery",                     "2.25.2"
+  gem "rails-assets-blueimp-gallery",                     "2.27.0"
   gem "rails-assets-jquery.are-you-sure",                 "1.9.0"
   gem "rails-assets-jquery-placeholder",                  "2.3.1"
   gem "rails-assets-jquery-textchange",                   "0.2.3"
@@ -131,7 +133,7 @@ gem "rails-i18n",           "5.0.4"
 gem "markerb",             "1.1.0"
 
 # Map
-gem "leaflet-rails",       "1.1.0"
+gem "leaflet-rails",       "1.2.0"
 
 # Parsing
 
@@ -147,7 +149,7 @@ gem "string-direction", "1.2.0"
 
 # Security Headers
 
-gem "secure_headers", "3.6.7"
+gem "secure_headers", "3.7.1"
 
 # Services
 
@@ -175,17 +177,17 @@ gem "acts-as-taggable-on", "5.0.0"
 
 # URIs and HTTP
 
-gem "addressable",        "2.5.1", require: "addressable/uri"
+gem "addressable",        "2.5.2", require: "addressable/uri"
 gem "faraday",            "0.11.0" # also update User-Agent in OpenID specs
-gem "faraday_middleware", "0.11.0.1"
+gem "faraday_middleware", "0.12.2"
 gem "faraday-cookie_jar", "0.0.6"
-gem "typhoeus",           "1.1.2"
+gem "typhoeus",           "1.3.0"
 
 # Views
 
 gem "gon",                     "6.1.0"
 gem "hamlit",                  "2.8.4"
-gem "mobile_fu",               "1.4.0", require: "mobile-fu"
+gem "mobile-fu",               "1.4.0"
 gem "rails-timeago",           "2.16.0"
 gem "will_paginate",           "3.1.6"
 
@@ -244,12 +246,12 @@ group :development do
 
   # Linters
   gem "haml_lint",      "0.26.0", require: false
-  gem "pronto",         "0.9.4", require: false
+  gem "pronto",         "0.9.5", require: false
   gem "pronto-eslint",  "0.9.1", require: false
   gem "pronto-haml",    "0.9.0", require: false
   gem "pronto-rubocop", "0.9.0", require: false
   gem "pronto-scss",    "0.9.1", require: false
-  gem "rubocop",        "0.49.1", require: false
+  gem "rubocop",        "0.50.0", require: false
 
   # Preloading environment
 
@@ -290,7 +292,7 @@ group :test do
   gem "timecop",            "0.9.1"
   gem "webmock",            "3.0.1", require: false
 
-  gem "diaspora_federation-test", "0.2.1"
+  gem "diaspora_federation-test", "0.2.2"
 
   # Coverage
   gem "coveralls", "0.8.21", require: false
@@ -304,7 +306,7 @@ group :development, :test do
   gem "cucumber-rails", "1.5.0", require: false
 
   # Jasmine (client side application tests (JS))
-  gem "jasmine",                   "2.7.0"
+  gem "jasmine",                   "2.8.0"
   gem "jasmine-jquery-rails",      "2.0.3"
   gem "rails-assets-jasmine-ajax", "3.3.1", source: "https://rails-assets.org"
   gem "sinon-rails",               "1.15.0"
diff --git a/Gemfile.lock b/Gemfile.lock
index b2365e6224829a495b054f3975dd1c4764177b86..625eff57fafe8f95449db6c57d68e8405a2b3513 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -2,25 +2,25 @@ GEM
   remote: https://rubygems.org/
   remote: https://rails-assets.org/
   specs:
-    actioncable (5.1.3)
-      actionpack (= 5.1.3)
+    actioncable (5.1.4)
+      actionpack (= 5.1.4)
       nio4r (~> 2.0)
       websocket-driver (~> 0.6.1)
-    actionmailer (5.1.3)
-      actionpack (= 5.1.3)
-      actionview (= 5.1.3)
-      activejob (= 5.1.3)
+    actionmailer (5.1.4)
+      actionpack (= 5.1.4)
+      actionview (= 5.1.4)
+      activejob (= 5.1.4)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (5.1.3)
-      actionview (= 5.1.3)
-      activesupport (= 5.1.3)
+    actionpack (5.1.4)
+      actionview (= 5.1.4)
+      activesupport (= 5.1.4)
       rack (~> 2.0)
-      rack-test (~> 0.6.3)
+      rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.0.2)
-    actionview (5.1.3)
-      activesupport (= 5.1.3)
+    actionview (5.1.4)
+      activesupport (= 5.1.4)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
@@ -28,18 +28,18 @@ GEM
     active_model_serializers (0.9.7)
       activemodel (>= 3.2)
       concurrent-ruby (~> 1.0)
-    activejob (5.1.3)
-      activesupport (= 5.1.3)
+    activejob (5.1.4)
+      activesupport (= 5.1.4)
       globalid (>= 0.3.6)
-    activemodel (5.1.3)
-      activesupport (= 5.1.3)
-    activerecord (5.1.3)
-      activemodel (= 5.1.3)
-      activesupport (= 5.1.3)
+    activemodel (5.1.4)
+      activesupport (= 5.1.4)
+    activerecord (5.1.4)
+      activemodel (= 5.1.4)
+      activesupport (= 5.1.4)
       arel (~> 8.0)
-    activerecord-import (0.19.1)
+    activerecord-import (0.20.1)
       activerecord (>= 3.2)
-    activesupport (5.1.3)
+    activesupport (5.1.4)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (~> 0.7)
       minitest (~> 5.1)
@@ -50,8 +50,8 @@ GEM
       activemodel (>= 3.0.0)
       activesupport (>= 3.0.0)
       rack (>= 1.1.0)
-    addressable (2.5.1)
-      public_suffix (~> 2.0, >= 2.0.2)
+    addressable (2.5.2)
+      public_suffix (>= 2.0.2, < 4.0)
     arel (8.0.0)
     asset_sync (2.2.0)
       activemodel (>= 4.1.0)
@@ -60,17 +60,17 @@ GEM
       unf
     ast (2.3.0)
     attr_required (1.0.1)
-    autoprefixer-rails (7.1.2.4)
+    autoprefixer-rails (7.1.4.1)
       execjs
     bcrypt (3.1.11)
-    bindata (2.4.0)
+    bindata (2.4.1)
     bootstrap-sass (3.3.7)
       autoprefixer-rails (>= 5.2.1)
       sass (>= 3.3.4)
     bootstrap-switch-rails (3.3.3)
     buftok (0.2.0)
     builder (3.2.3)
-    byebug (9.0.6)
+    byebug (9.1.0)
     capybara (2.15.1)
       addressable
       mini_mime (>= 0.1.3)
@@ -105,7 +105,7 @@ GEM
       timers (>= 4.1.1)
     chunky_png (1.3.8)
     cliver (0.3.2)
-    coderay (1.1.1)
+    coderay (1.1.2)
     compass (1.0.3)
       chunky_png (~> 1.2)
       compass-core (~> 1.0.2)
@@ -133,6 +133,7 @@ GEM
       tins (~> 1.6)
     crack (0.4.3)
       safe_yaml (~> 1.0.0)
+    crass (1.0.2)
     cucumber (2.4.0)
       builder (>= 2.1.2)
       cucumber-core (~> 1.5.0)
@@ -165,20 +166,20 @@ GEM
       devise
       rails (>= 3.0.4)
     diaspora-prosody-config (0.0.7)
-    diaspora_federation (0.2.1)
-      faraday (>= 0.9.0, < 0.13.0)
+    diaspora_federation (0.2.2)
+      faraday (>= 0.9.0, < 0.14.0)
       faraday_middleware (>= 0.10.0, < 0.13.0)
       nokogiri (~> 1.6, >= 1.6.8)
       typhoeus (~> 1.0)
       valid (~> 1.0)
-    diaspora_federation-json_schema (0.2.1)
-    diaspora_federation-rails (0.2.1)
+    diaspora_federation-json_schema (0.2.2)
+    diaspora_federation-rails (0.2.2)
       actionpack (>= 4.2, < 6)
-      diaspora_federation (= 0.2.1)
-    diaspora_federation-test (0.2.1)
-      diaspora_federation (= 0.2.1)
-      fabrication (~> 2.16.0)
-      uuid (~> 2.3.8)
+      diaspora_federation (= 0.2.2)
+    diaspora_federation-test (0.2.2)
+      diaspora_federation (= 0.2.2)
+      fabrication (~> 2.16)
+      uuid (~> 2.3, >= 2.3.8)
     diff-lcs (1.3)
     docile (1.1.5)
     domain_name (0.5.20170404)
@@ -195,7 +196,7 @@ GEM
       tzinfo
     ethon (0.10.1)
       ffi (>= 1.3.0)
-    excon (0.58.0)
+    excon (0.59.0)
     execjs (2.7.0)
     eye (0.9.2)
       celluloid (~> 0.17.3)
@@ -203,7 +204,7 @@ GEM
       sigar (~> 0.7.3)
       state_machines
       thor
-    fabrication (2.16.2)
+    fabrication (2.16.3)
     factory_girl (4.8.0)
       activesupport (>= 3.0.0)
     factory_girl_rails (4.8.0)
@@ -214,13 +215,13 @@ GEM
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    faraday_middleware (0.11.0.1)
+    faraday_middleware (0.12.2)
       faraday (>= 0.7.4, < 1.0)
     ffi (1.9.18)
     fixture_builder (0.5.0)
       activerecord (>= 2)
       activesupport (>= 2)
-    fog-aws (1.4.0)
+    fog-aws (1.4.1)
       fog-core (~> 1.38)
       fog-json (~> 1.0)
       fog-xml (~> 0.1)
@@ -272,7 +273,7 @@ GEM
     guard-rubocop (1.3.0)
       guard (~> 2.0)
       rubocop (~> 0.20)
-    haml (5.0.2)
+    haml (5.0.3)
       temple (>= 0.8.0)
       tilt
     haml_lint (0.26.0)
@@ -289,7 +290,7 @@ GEM
       execjs (~> 2.0)
       sprockets (>= 2.0.0)
       tilt (>= 1.2)
-    hashdiff (0.3.5)
+    hashdiff (0.3.6)
     hashie (3.5.6)
     hitimes (1.2.6)
     http (2.2.2)
@@ -302,7 +303,7 @@ GEM
     http-form_data (1.0.3)
     http_accept_language (2.1.1)
     http_parser.rb (0.6.0)
-    httparty (0.14.0)
+    httparty (0.15.6)
       multi_xml (>= 0.5.2)
     httpclient (2.8.3)
     i18n (0.8.6)
@@ -313,18 +314,18 @@ GEM
       i18n-inflector (~> 2.6)
       railties (>= 3.0.0)
     ipaddress (0.8.3)
-    jasmine (2.7.0)
-      jasmine-core (>= 2.7.0, < 3.0.0)
+    jasmine (2.8.0)
+      jasmine-core (>= 2.8.0, < 3.0.0)
       phantomjs
       rack (>= 1.2.1)
       rake
-    jasmine-core (2.7.0)
+    jasmine-core (2.8.0)
     jasmine-jquery-rails (2.0.3)
     jquery-rails (4.3.1)
       rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
-    js-routes (1.3.3)
+    js-routes (1.4.1)
       railties (>= 3.2)
       sprockets-rails
     js_image_paths (0.1.1)
@@ -346,7 +347,7 @@ GEM
       multi_json
     jwt (1.5.6)
     kgio (2.11.0)
-    leaflet-rails (1.1.0)
+    leaflet-rails (1.2.0)
       rails (>= 4.2.0)
     listen (3.1.5)
       rb-fsevent (~> 0.9, >= 0.9.4)
@@ -358,7 +359,8 @@ GEM
       multi_json (~> 1.10)
     logging-rails (0.6.0)
       logging (>= 1.8)
-    loofah (2.0.3)
+    loofah (2.1.1)
+      crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     lumberjack (1.0.12)
     macaddr (1.7.1)
@@ -376,10 +378,10 @@ GEM
     mini_mime (0.1.4)
     mini_portile2 (2.3.0)
     minitest (5.10.3)
-    mobile_fu (1.4.0)
+    mobile-fu (1.4.0)
       rack-mobile-detect
       rails
-    multi_json (1.12.1)
+    multi_json (1.12.2)
     multi_test (0.1.2)
     multi_xml (0.6.0)
     multipart-post (2.0.0)
@@ -445,9 +447,9 @@ GEM
       cliver (~> 0.3.1)
       websocket-driver (>= 0.2.0)
     powerpack (0.1.1)
-    pronto (0.9.4)
+    pronto (0.9.5)
       gitlab (~> 4.0, >= 4.0.0)
-      httparty (>= 0.13.7, < 0.15)
+      httparty (>= 0.13.7)
       octokit (~> 4.7, >= 4.7.0)
       rainbow (~> 2.1)
       rugged (~> 0.24, >= 0.23.0)
@@ -464,14 +466,13 @@ GEM
     pronto-scss (0.9.1)
       pronto (~> 0.9.0)
       scss_lint (~> 0.43, >= 0.43.0)
-    pry (0.10.4)
+    pry (0.11.0)
       coderay (~> 1.1.0)
       method_source (~> 0.8.1)
-      slop (~> 3.4)
-    pry-byebug (3.4.2)
-      byebug (~> 9.0)
+    pry-byebug (3.5.0)
+      byebug (~> 9.1)
       pry (~> 0.10)
-    public_suffix (2.0.5)
+    public_suffix (3.0.0)
     rack (2.0.3)
     rack-cors (1.0.1)
     rack-google-analytics (1.2.0)
@@ -491,24 +492,24 @@ GEM
     rack-rewrite (1.5.1)
     rack-ssl (1.4.1)
       rack
-    rack-test (0.6.3)
-      rack (>= 1.0)
-    rails (5.1.3)
-      actioncable (= 5.1.3)
-      actionmailer (= 5.1.3)
-      actionpack (= 5.1.3)
-      actionview (= 5.1.3)
-      activejob (= 5.1.3)
-      activemodel (= 5.1.3)
-      activerecord (= 5.1.3)
-      activesupport (= 5.1.3)
+    rack-test (0.7.0)
+      rack (>= 1.0, < 3)
+    rails (5.1.4)
+      actioncable (= 5.1.4)
+      actionmailer (= 5.1.4)
+      actionpack (= 5.1.4)
+      actionview (= 5.1.4)
+      activejob (= 5.1.4)
+      activemodel (= 5.1.4)
+      activerecord (= 5.1.4)
+      activesupport (= 5.1.4)
       bundler (>= 1.3.0)
-      railties (= 5.1.3)
+      railties (= 5.1.4)
       sprockets-rails (>= 2.0.0)
     rails-assets-autosize (4.0.0)
     rails-assets-backbone (1.3.3)
       rails-assets-underscore (>= 1.8.3)
-    rails-assets-blueimp-gallery (2.25.2)
+    rails-assets-blueimp-gallery (2.27.0)
     rails-assets-bootstrap (3.3.7)
       rails-assets-jquery (>= 1.9.1, < 4)
     rails-assets-bootstrap-markdown (2.10.0)
@@ -526,7 +527,7 @@ GEM
     rails-assets-favico.js (0.3.10)
     rails-assets-fine-uploader (5.13.0)
     rails-assets-highlightjs (9.12.0)
-    rails-assets-jasmine (2.7.0)
+    rails-assets-jasmine (2.8.0)
     rails-assets-jasmine-ajax (3.3.1)
       rails-assets-jasmine (~> 2)
     rails-assets-jquery (3.2.1)
@@ -543,7 +544,7 @@ GEM
     rails-assets-jquery.ui (1.11.4)
       rails-assets-jquery (>= 1.6)
     rails-assets-markdown-it--markdown-it-for-inline (0.1.1)
-    rails-assets-markdown-it (8.3.2)
+    rails-assets-markdown-it (8.4.0)
     rails-assets-markdown-it-diaspora-mention (1.2.0)
     rails-assets-markdown-it-hashtag (0.4.0)
     rails-assets-markdown-it-sanitizer (0.4.3)
@@ -566,16 +567,16 @@ GEM
     rails-timeago (2.16.0)
       actionpack (>= 3.1)
       activesupport (>= 3.1)
-    railties (5.1.3)
-      actionpack (= 5.1.3)
-      activesupport (= 5.1.3)
+    railties (5.1.4)
+      actionpack (= 5.1.4)
+      activesupport (= 5.1.4)
       method_source
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
     rainbow (2.2.2)
       rake
     raindrops (0.19.0)
-    rake (12.0.0)
+    rake (12.1.0)
     rb-fsevent (0.10.2)
     rb-inotify (0.9.10)
       ffi (>= 0.5.0, < 2)
@@ -607,15 +608,15 @@ GEM
       rspec-mocks (~> 3.6.0)
       rspec-support (~> 3.6.0)
     rspec-support (3.6.0)
-    rubocop (0.49.1)
+    rubocop (0.50.0)
       parallel (~> 1.10)
       parser (>= 2.3.3.1, < 3.0)
       powerpack (~> 0.1)
-      rainbow (>= 1.99.1, < 3.0)
+      rainbow (>= 2.2.2, < 3.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (~> 1.0, >= 1.0.1)
     ruby-oembed (0.12.0)
-    ruby-progressbar (1.8.1)
+    ruby-progressbar (1.8.3)
     ruby_dep (1.5.0)
     rubyzip (1.2.1)
     rufus-scheduler (3.4.2)
@@ -635,7 +636,7 @@ GEM
     scss_lint (0.54.0)
       rake (>= 0.9, < 13)
       sass (~> 3.4.20)
-    secure_headers (3.6.7)
+    secure_headers (3.7.1)
       useragent
     securecompare (1.0.0)
     shellany (0.0.1)
@@ -657,10 +658,9 @@ GEM
       docile (~> 1.1.0)
       json (>= 1.8, < 3)
       simplecov-html (~> 0.10.0)
-    simplecov-html (0.10.1)
+    simplecov-html (0.10.2)
     sinon-rails (1.15.0)
       railties (>= 3.1)
-    slop (3.6.0)
     spring (2.0.2)
       activesupport (>= 4.2)
     spring-commands-cucumber (1.0.1)
@@ -670,7 +670,7 @@ GEM
     sprockets (3.7.1)
       concurrent-ruby (~> 1.0)
       rack (> 1, < 3)
-    sprockets-rails (3.2.0)
+    sprockets-rails (3.2.1)
       actionpack (>= 4.0)
       activesupport (>= 4.0)
       sprockets (>= 3.0.0)
@@ -710,7 +710,7 @@ GEM
       simple_oauth (~> 0.3.1)
     twitter-text (1.14.7)
       unf (~> 0.1.0)
-    typhoeus (1.1.2)
+    typhoeus (1.3.0)
       ethon (>= 0.9.0)
     tzinfo (1.2.3)
       thread_safe (~> 0.1)
@@ -764,12 +764,12 @@ PLATFORMS
 
 DEPENDENCIES
   active_model_serializers (= 0.9.7)
-  activerecord-import (= 0.19.1)
+  activerecord-import (= 0.20.1)
   acts-as-taggable-on (= 5.0.0)
   acts_as_api (= 1.0.1)
-  addressable (= 2.5.1)
+  addressable (= 2.5.2)
   asset_sync (= 2.2.0)
-  autoprefixer-rails (= 7.1.2.4)
+  autoprefixer-rails (= 7.1.4.1)
   bootstrap-sass (= 3.3.7)
   bootstrap-switch-rails (= 3.3.3)
   capybara (= 2.15.1)
@@ -783,17 +783,17 @@ DEPENDENCIES
   devise (= 4.3.0)
   devise_lastseenable (= 0.0.6)
   diaspora-prosody-config (= 0.0.7)
-  diaspora_federation-json_schema (= 0.2.1)
-  diaspora_federation-rails (= 0.2.1)
-  diaspora_federation-test (= 0.2.1)
+  diaspora_federation-json_schema (= 0.2.2)
+  diaspora_federation-rails (= 0.2.2)
+  diaspora_federation-test (= 0.2.2)
   entypo-rails (= 3.0.0)
   eye (= 0.9.2)
   factory_girl_rails (= 4.8.0)
   faraday (= 0.11.0)
   faraday-cookie_jar (= 0.0.6)
-  faraday_middleware (= 0.11.0.1)
+  faraday_middleware (= 0.12.2)
   fixture_builder (= 0.5.0)
-  fog-aws (= 1.4.0)
+  fog-aws (= 1.4.1)
   fuubar (= 2.2.0)
   gon (= 6.1.0)
   guard (= 2.14.1)
@@ -805,20 +805,20 @@ DEPENDENCIES
   handlebars_assets (= 0.23.2)
   http_accept_language (= 2.1.1)
   i18n-inflector-rails (= 1.0.7)
-  jasmine (= 2.7.0)
+  jasmine (= 2.8.0)
   jasmine-jquery-rails (= 2.0.3)
   jquery-rails (= 4.3.1)
-  js-routes (= 1.3.3)
+  js-routes (= 1.4.1)
   js_image_paths (= 0.1.1)
   json (= 2.1.0)
   json-schema (= 2.8.0)
   json-schema-rspec (= 0.0.4)
-  leaflet-rails (= 1.1.0)
+  leaflet-rails (= 1.2.0)
   logging-rails (= 0.6.0)
   markerb (= 1.1.0)
   mini_magick (= 4.8.0)
   minitest
-  mobile_fu (= 1.4.0)
+  mobile-fu (= 1.4.0)
   mysql2 (= 0.4.9)
   nokogiri (= 1.8.1)
   omniauth (= 1.6.1)
@@ -830,7 +830,7 @@ DEPENDENCIES
   openid_connect (= 1.1.3)
   pg (= 0.21.0)
   poltergeist (= 1.16.0)
-  pronto (= 0.9.4)
+  pronto (= 0.9.5)
   pronto-eslint (= 0.9.1)
   pronto-haml (= 0.9.0)
   pronto-rubocop (= 0.9.0)
@@ -842,10 +842,10 @@ DEPENDENCIES
   rack-piwik (= 0.3.0)
   rack-rewrite (= 1.5.1)
   rack-ssl (= 1.4.1)
-  rails (= 5.1.3)
+  rails (= 5.1.4)
   rails-assets-autosize (= 4.0.0)!
   rails-assets-backbone (= 1.3.3)!
-  rails-assets-blueimp-gallery (= 2.25.2)!
+  rails-assets-blueimp-gallery (= 2.27.0)!
   rails-assets-bootstrap-markdown (= 2.10.0)!
   rails-assets-corejs-typeahead (= 1.1.1)!
   rails-assets-diaspora_jsxc (= 0.1.5.develop.7)!
@@ -857,7 +857,7 @@ DEPENDENCIES
   rails-assets-jquery-textchange (= 0.2.3)!
   rails-assets-jquery.are-you-sure (= 1.9.0)!
   rails-assets-jquery.ui (= 1.11.4)!
-  rails-assets-markdown-it (= 8.3.2)!
+  rails-assets-markdown-it (= 8.4.0)!
   rails-assets-markdown-it--markdown-it-for-inline (= 0.1.1)!
   rails-assets-markdown-it-diaspora-mention (= 1.2.0)!
   rails-assets-markdown-it-hashtag (= 0.4.0)!
@@ -874,11 +874,11 @@ DEPENDENCIES
   responders (= 2.4.0)
   rspec-json_expectations (~> 2.1)
   rspec-rails (= 3.6.1)
-  rubocop (= 0.49.1)
+  rubocop (= 0.50.0)
   ruby-oembed (= 0.12.0)
   rubyzip (= 1.2.1)
   sass-rails (= 5.0.6)
-  secure_headers (= 3.6.7)
+  secure_headers (= 3.7.1)
   shoulda-matchers (= 3.1.2)
   sidekiq (= 5.0.4)
   sidekiq-cron (= 0.6.3)
@@ -888,13 +888,13 @@ DEPENDENCIES
   spring (= 2.0.2)
   spring-commands-cucumber (= 1.0.1)
   spring-commands-rspec (= 1.0.4)
-  sprockets-rails (= 3.2.0)
+  sprockets-rails (= 3.2.1)
   string-direction (= 1.2.0)
   timecop (= 0.9.1)
   turbo_dev_assets (= 0.0.2)
   twitter (= 6.1.0)
   twitter-text (= 1.14.7)
-  typhoeus (= 1.1.2)
+  typhoeus (= 1.3.0)
   uglifier (= 3.2.0)
   unicorn (= 5.3.0)
   unicorn-worker-killer (= 0.4.4)
diff --git a/Guardfile b/Guardfile
index a06f2dc334fb832c4a79b3434fe86c59ede4c387..2ecb276edd50d742cda8cfa8a68e74f284d56033 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 guard :rspec, cmd: "bin/spring rspec", all_on_start: false, all_after_pass: false do
   watch(/^spec\/.+_spec\.rb$/)
   watch(/^lib\/(.+)\.rb$/)       {|m| "spec/lib/#{m[1]}_spec.rb" }
diff --git a/Rakefile b/Rakefile
index 2c022e0b0c821b53a2f7af157b21ca8b900ecdfe..55c48de34aa14dfce495f23ce57729cce682c2e4 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js
new file mode 100644
index 0000000000000000000000000000000000000000..2347fce1805bea7c8bb3e759ce3c08a535c4da07
--- /dev/null
+++ b/app/assets/config/manifest.js
@@ -0,0 +1,12 @@
+//= link contact-list.js
+//= link jquery3.js
+//= link jquery_ujs.js
+//= link main.js
+//= link jsxc.js
+//= link bookmarklet.js
+//= link mobile/bookmarklet.js
+//= link mobile/mobile.js
+//= link templates.js
+//= link error_pages.css
+//= link admin.css
+//= link rtl.css
diff --git a/app/assets/javascripts/app/helpers/handlebars-helpers.js b/app/assets/javascripts/app/helpers/handlebars-helpers.js
index 0a75ebbb629afb45c219eb6c937fd0e29915a389..a6ed3de0c897d337e46b198ec59d58966272d060 100644
--- a/app/assets/javascripts/app/helpers/handlebars-helpers.js
+++ b/app/assets/javascripts/app/helpers/handlebars-helpers.js
@@ -116,7 +116,7 @@ Handlebars.registerHelper("isCurrentProfilePage", function(id, diasporaHandle, o
 });
 
 Handlebars.registerHelper('aspectMembershipIndicator', function(contact,in_aspect) {
-  if(!app.aspect || !app.aspect.get('id')) return '<div class="aspect_membership_dropdown placeholder"></div>';
+  if(!app.aspect || !app.aspect.get('id')) return '<div class="aspect-membership-dropdown placeholder"></div>';
 
   var html = "<i class=\"entypo-";
   if( in_aspect === 'in_aspect' ) {
diff --git a/app/assets/javascripts/app/helpers/text_formatter.js b/app/assets/javascripts/app/helpers/text_formatter.js
index b8f46f7efa92b76932aa176dc3dc4a6f3b0287ab..3fc0514041a01b5762ad4cabd628f35dfeb3dd55 100644
--- a/app/assets/javascripts/app/helpers/text_formatter.js
+++ b/app/assets/javascripts/app/helpers/text_formatter.js
@@ -8,8 +8,7 @@
       breaks:      true,
       html:        true,
       linkify:     true,
-      typographer: true,
-      langPrefix:  ""
+      typographer: true
     });
 
     var inlinePlugin = window.markdownitForInline;
@@ -72,10 +71,6 @@
           } catch (__) {}
         }
 
-        try {
-          return hljs.highlightAuto(str).value;
-        } catch (__) {}
-
         return "";
       }
     });
diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js
index f9bd2db27a7de1396b7cdc1a531c4a27de066fe7..01edab46661dc32f6062e7d88834e0405a52b1dc 100644
--- a/app/assets/javascripts/app/pages/contacts.js
+++ b/app/assets/javascripts/app/pages/contacts.js
@@ -17,7 +17,7 @@ app.pages.Contacts = Backbone.View.extend({
     this.chatToggle = $("#chat_privilege_toggle i");
     this.stream = opts.stream;
     this.stream.render();
-    $("#people_stream.contacts .header i").tooltip({"placement": "bottom"});
+    $("#people-stream.contacts .header i").tooltip({"placement": "bottom"});
     $(document).on("ajax:success", "form.edit_aspect", this.updateAspectName);
     app.events.on("aspect:create", function(){ window.location.reload() });
     app.events.on("aspect_membership:create", this.addAspectMembership, this);
@@ -80,7 +80,10 @@ app.pages.Contacts = Backbone.View.extend({
 
   showMessageModal: function(){
     $("#conversationModal").on("modal:loaded", function() {
-      new app.views.ConversationsForm({prefill: gon.conversationPrefill});
+      var people = _.pluck(app.contacts.filter(function(contact) {
+        return contact.inAspect(app.aspect.get("id"));
+      }), "person");
+      new app.views.ConversationsForm({prefill: people});
     });
     app.helpers.showModal("#conversationModal");
   },
diff --git a/app/assets/javascripts/app/pages/getting_started.js b/app/assets/javascripts/app/pages/getting_started.js
index 4cf3044c4bb88e21d3692d1bec59288c0e5423fa..91fc2e1be5186c4e6e424e1e25d12d7e8ee66126 100644
--- a/app/assets/javascripts/app/pages/getting_started.js
+++ b/app/assets/javascripts/app/pages/getting_started.js
@@ -5,7 +5,7 @@ app.pages.GettingStarted = app.views.Base.extend({
   templateName: false,
 
   subviews: {
-    ".aspect_membership_dropdown": "aspectMembershipView"
+    ".aspect-membership-dropdown": "aspectMembershipView"
   },
 
   initialize: function(opts) {
diff --git a/app/assets/javascripts/app/pages/profile.js b/app/assets/javascripts/app/pages/profile.js
index a2b8143993001a37a995e935d4410e42eab59e63..f4eb21b4f146618999f5f4c4aa9733c99bddb2dc 100644
--- a/app/assets/javascripts/app/pages/profile.js
+++ b/app/assets/javascripts/app/pages/profile.js
@@ -11,7 +11,7 @@ app.pages.Profile = app.views.Base.extend({
   subviews: {
     "#profile": "sidebarView",
     ".profile_header": "headerView",
-    "#main_stream": "streamView"
+    "#main-stream": "streamView"
   },
 
   tooltipSelector: ".profile_button .profile-header-icon, .sharing_message_container",
diff --git a/app/assets/javascripts/app/pages/settings.js b/app/assets/javascripts/app/pages/settings.js
index d342260167a4bf6e7d4dddf56fd415cd491d8836..be522514fc36e88e4d5b9d7eac19ee0b2fff99c9 100644
--- a/app/assets/javascripts/app/pages/settings.js
+++ b/app/assets/javascripts/app/pages/settings.js
@@ -11,7 +11,7 @@ app.pages.Settings = Backbone.View.extend({
     new Diaspora.ProfilePhotoUploader();
 
     this.viewAspectSelector = new app.views.PublisherAspectSelector({
-      el: $(".aspect_dropdown"),
+      el: $(".aspect-dropdown"),
       form: $("#post-default-aspects")
     });
     $("#update_profile_form").areYouSure();
diff --git a/app/assets/javascripts/app/router.js b/app/assets/javascripts/app/router.js
index ab9e11a6980cb7f697ad068d3878d380dc993e33..905693b995bc91b11bd09885e492721a0a73fd39 100644
--- a/app/assets/javascripts/app/router.js
+++ b/app/assets/javascripts/app/router.js
@@ -220,7 +220,7 @@ app.Router = Backbone.Router.extend({
       app.page.setupAvatarFallback($(".main-stream-publisher"));
     }
 
-    $("#main_stream").html(app.page.render().el);
+    $("#main-stream").html(app.page.render().el);
     this._hideInactiveStreamLists();
   },
 
@@ -229,7 +229,7 @@ app.Router = Backbone.Router.extend({
   },
 
   renderAspectMembershipDropdowns: function($context) {
-    $context.find(".aspect_membership_dropdown.placeholder").each(function() {
+    $context.find(".aspect-membership-dropdown.placeholder").each(function() {
       var personId = $(this).data("personId");
       var view = new app.views.AspectMembership({person: app.contacts.findWhere({"person_id": personId}).person});
       $(this).html(view.render().$el);
diff --git a/app/assets/javascripts/app/views/aspect_membership_view.js b/app/assets/javascripts/app/views/aspect_membership_view.js
index 34ba8bd77e88a36e7229c1fe753293fb592464fb..2b46c2ed79d0f4cc4765930d281ea20b6fcbb0a7 100644
--- a/app/assets/javascripts/app/views/aspect_membership_view.js
+++ b/app/assets/javascripts/app/views/aspect_membership_view.js
@@ -9,7 +9,7 @@
  */
 app.views.AspectMembership = app.views.Base.extend({
   templateName: "aspect_membership_dropdown",
-  className: "btn-group aspect_dropdown aspect_membership_dropdown",
+  className: "btn-group aspect-dropdown aspect-membership-dropdown",
 
   subviews: {
     ".newAspectContainer": "aspectCreateView"
@@ -124,7 +124,7 @@ app.views.AspectMembership = app.views.Base.extend({
   // show an error flash msg
   _displayError: function(model, resp) {
     this._done();
-    this.dropdown.closest(".aspect_membership_dropdown").removeClass("open"); // close the dropdown
+    this.dropdown.closest(".aspect-membership-dropdown").removeClass("open"); // close the dropdown
     app.flashMessages.handleAjaxError(resp);
   },
 
@@ -144,7 +144,7 @@ app.views.AspectMembership = app.views.Base.extend({
 
     this.render();
     // we just removed the last aspect, inform the user with a flash message
-    // that he is no longer sharing with that person
+    // that they are no longer sharing with that person
     if (this.$el.find("li.selected").length === 0) {
       var msg = Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", { "name": this._name() });
       stopSharing = true;
diff --git a/app/assets/javascripts/app/views/comment_stream_view.js b/app/assets/javascripts/app/views/comment_stream_view.js
index 2a1b816129cb3b08d4f6ac39c9f21dd827d284cf..9c3706cedc189b7014620d6fcbcbafdc71fce3d9 100644
--- a/app/assets/javascripts/app/views/comment_stream_view.js
+++ b/app/assets/javascripts/app/views/comment_stream_view.js
@@ -7,7 +7,7 @@ app.views.CommentStream = app.views.Base.extend({
   className : "comment_stream",
 
   events: {
-    "keydown .comment_box": "keyDownOnCommentBox",
+    "keydown .comment-box": "keyDownOnCommentBox",
     "submit form": "createComment",
     "click .toggle_post_comments": "expandComments",
     "click form": "openForm"
@@ -26,17 +26,19 @@ app.views.CommentStream = app.views.Base.extend({
 
   postRenderTemplate : function() {
     this.model.comments.each(this.appendComment, this);
-    this.commentBox = this.$(".comment_box");
+    this.commentBox = this.$(".comment-box");
     this.commentSubmitButton = this.$("input[name='commit']");
     this.mentions = new app.views.CommentMention({el: this.$el, postId: this.model.get("id")});
 
-    this.mdEditor = new Diaspora.MarkdownEditor(this.$(".comment_box"), {
+    this.mdEditor = new Diaspora.MarkdownEditor(this.$(".comment-box"), {
       onPreview: function($mdInstance) {
         var renderedText = app.helpers.textFormatter($mdInstance.getContent(), this.mentions.getMentionedPeople());
         return "<div class='preview-content'>" + renderedText + "</div>";
       }.bind(this),
       onFocus: this.openForm.bind(this)
     });
+
+    this.$("form").areYouSure();
   },
 
   presenter: function(){
diff --git a/app/assets/javascripts/app/views/contact_view.js b/app/assets/javascripts/app/views/contact_view.js
index 1a0a676d60e0f5fc8a9ed5408da1677c57084088..c62eccfe9c9afa0a628adb03cb2b703b8d54dfdc 100644
--- a/app/assets/javascripts/app/views/contact_view.js
+++ b/app/assets/javascripts/app/views/contact_view.js
@@ -4,7 +4,7 @@ app.views.Contact = app.views.Base.extend({
   templateName: 'contact',
 
   subviews: {
-    ".aspect_membership_dropdown": "AspectMembershipView"
+    ".aspect-membership-dropdown": "AspectMembershipView"
   },
 
   events: {
diff --git a/app/assets/javascripts/app/views/content_view.js b/app/assets/javascripts/app/views/content_view.js
index 5a5a9e9af4d3e65740e0d69e87567c97491cde97..78367563b1abb8d987619e574240ce677f6093f5 100644
--- a/app/assets/javascripts/app/views/content_view.js
+++ b/app/assets/javascripts/app/views/content_view.js
@@ -80,7 +80,7 @@ app.views.Content = app.views.Base.extend({
       });
     });
 
-    var photoAttachments = this.$(".photo_attachments");
+    var photoAttachments = this.$(".photo-attachments");
     if(photoAttachments.length > 0) {
       new app.views.Gallery({ el: photoAttachments });
     }
@@ -93,7 +93,7 @@ app.views.StatusMessage = app.views.Content.extend({
 
 app.views.ExpandedStatusMessage = app.views.StatusMessage.extend({
   postRenderTemplate : function(){
-    var photoAttachments = this.$(".photo_attachments");
+    var photoAttachments = this.$(".photo-attachments");
     if(photoAttachments.length > 0) {
       new app.views.Gallery({ el: photoAttachments });
     }
diff --git a/app/assets/javascripts/app/views/conversations_form_view.js b/app/assets/javascripts/app/views/conversations_form_view.js
index a28b6d42651ba52b4d5b8db98af9c478836ffcf6..a360f09175836442b6a7f9bfc525f25d9ae13d34 100644
--- a/app/assets/javascripts/app/views/conversations_form_view.js
+++ b/app/assets/javascripts/app/views/conversations_form_view.js
@@ -52,8 +52,13 @@ app.views.ConversationsForm = app.views.Base.extend({
     this.setupAvatarFallback(personEl);
   },
 
-  prefill: function(handles) {
-    handles.forEach(this.addRecipient.bind(this));
+  prefill: function(people) {
+    people.forEach(function(person) {
+      this.addRecipient(_.extend({
+        avatar: person.get("profile").avatar.small,
+        handle: person.get("diaspora_id")
+      }, person.attributes));
+    }, this);
   },
 
   updateContactIdsListInput: function() {
diff --git a/app/assets/javascripts/app/views/photos_view.js b/app/assets/javascripts/app/views/photos_view.js
index 8a31fc815279e17292cf2d016e6fd669d975fa0b..7390a357c679d2e2beb6f1fc46c650108160c294 100644
--- a/app/assets/javascripts/app/views/photos_view.js
+++ b/app/assets/javascripts/app/views/photos_view.js
@@ -15,7 +15,7 @@ app.views.Photos = app.views.InfScroll.extend({
   },
 
   postRenderTemplate: function(){
-    var photoAttachments = $("#main_stream > div");
+    var photoAttachments = $("#main-stream > div");
     if(photoAttachments.length > 0) {
       new app.views.Gallery({ el: photoAttachments });
     }
diff --git a/app/assets/javascripts/app/views/poll_view.js b/app/assets/javascripts/app/views/poll_view.js
index 751e47538876884608130477b36f0c181c5d1114..55710bfbae4edc63c9b31bf0b1e5ce2b5cd0534e 100644
--- a/app/assets/javascripts/app/views/poll_view.js
+++ b/app/assets/javascripts/app/views/poll_view.js
@@ -5,7 +5,7 @@ app.views.Poll = app.views.Base.extend({
 
   events: {
     "click .submit" : "clickSubmit",
-    "click .toggle_result" : "toggleResult"
+    "click .toggle-result": "toggleResult"
   },
 
   initialize: function() {
@@ -17,15 +17,22 @@ app.views.Poll = app.views.Base.extend({
     var isReshare = (this.model.get('post_type') === 'Reshare');
     var showForm = defaultPresenter.loggedIn &&
                    !isReshare &&
-                   !this.model.get('already_participated_in_poll');
+                   !this.model.get("poll_participation_answer_id");
     var originalPostLink = isReshare && this.model.get('root') ?
       '<a href="/posts/' + this.model.get('root').id + '" class="root_post_link">' + Diaspora.I18n.t('poll.original_post') + '</a>' :
       '';
+    var answerGiven = this.model.get("poll_participation_answer_id");
+
+    if (defaultPresenter.poll && defaultPresenter.poll.poll_answers) {
+      defaultPresenter.poll.poll_answers.forEach(function(answer) {
+        _.extend(answer, {isCurrentUserVote: answerGiven ? answer.id === answerGiven : false});
+      });
+    }
 
     return _.extend(defaultPresenter, {
       show_form: showForm,
       is_reshare: isReshare,
-      original_post_link: originalPostLink
+      originalPostLink: originalPostLink
     });
   },
 
@@ -48,7 +55,7 @@ app.views.Poll = app.views.Base.extend({
         percent = Math.round(answer.vote_count / participation_count * 100);
       }
 
-      var progressBar = _this.$(".poll_progress_bar[data-answerid="+answer.id+"]");
+      var progressBar = _this.$(".progress-bar[data-answerid=" + answer.id + "]");
 
       _this.setProgressBarData(progressBar, percent);
     });
@@ -61,8 +68,8 @@ app.views.Poll = app.views.Base.extend({
 
   pollButtons: function() {
     if(!this.poll || !this.poll.post_id) {
-      this.$('.submit').attr('disabled', true);
-      this.$('.toggle_result').attr('disabled', true);
+      this.$(".submit").attr("disabled", true);
+      this.$(".toggle-result").attr("disabled", true);
     }
   },
 
@@ -76,14 +83,14 @@ app.views.Poll = app.views.Base.extend({
     }
     this.toggleElements();
 
-    var toggle_result = this.$('.toggle_result');
+    var toggleResult = this.$(".toggle-result");
 
     if(!this.toggleMode) {
-      toggle_result.html(Diaspora.I18n.t("poll.close_result"));
+      toggleResult.html(Diaspora.I18n.t("poll.close_result"));
       this.toggleMode = 1;
     }
     else {
-      toggle_result.html(Diaspora.I18n.t("poll.show_result"));
+      toggleResult.html(Diaspora.I18n.t("poll.show_result"));
       this.toggleMode = 0;
     }
   },
diff --git a/app/assets/javascripts/app/views/post_controls_view.js b/app/assets/javascripts/app/views/post_controls_view.js
index 879d4d623b936e03fe455879c5ce8ae4d031fcc1..ed2f691c4e7f4402720ba2db4223a2bda85f3dc3 100644
--- a/app/assets/javascripts/app/views/post_controls_view.js
+++ b/app/assets/javascripts/app/views/post_controls_view.js
@@ -78,7 +78,8 @@ app.views.PostControls = app.views.Base.extend({
     }.bind(this));
   },
 
-  destroyModel: function() {
+  destroyModel: function(evt) {
+    if (evt) { evt.preventDefault(); }
     this.post.destroyModel();
   }
 });
diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js
index 1fb6e0e1d2c60cf39446177e763b74894f5c79da..f23ffc6801ffe68bd36c12fffa1fb55f5f039e2b 100644
--- a/app/assets/javascripts/app/views/profile_header_view.js
+++ b/app/assets/javascripts/app/views/profile_header_view.js
@@ -4,7 +4,7 @@ app.views.ProfileHeader = app.views.Base.extend({
   templateName: 'profile_header',
 
   subviews: {
-    ".aspect_membership_dropdown": "aspectMembershipView"
+    ".aspect-membership-dropdown": "aspectMembershipView"
   },
 
   events: {
@@ -81,8 +81,8 @@ app.views.ProfileHeader = app.views.Base.extend({
 
   showMessageModal: function(){
     $("#conversationModal").on("modal:loaded", function() {
-      new app.views.ConversationsForm({prefill: gon.conversationPrefill});
-    });
+      new app.views.ConversationsForm({prefill: [this.model]});
+    }.bind(this));
     app.helpers.showModal("#conversationModal");
   }
 });
diff --git a/app/assets/javascripts/app/views/publisher/uploader_view.js b/app/assets/javascripts/app/views/publisher/uploader_view.js
index 26541c7948a48ae87cd11a9385889b9e04668b0f..e03f6c9d1099602e98963db419bae6e35601d5c1 100644
--- a/app/assets/javascripts/app/views/publisher/uploader_view.js
+++ b/app/assets/javascripts/app/views/publisher/uploader_view.js
@@ -5,7 +5,7 @@
 // progress. Attaches previews of finished uploads to the publisher.
 
 app.views.PublisherUploader = Backbone.View.extend({
-  allowedExtensions: ["jpg", "jpeg", "png", "gif", "tif", "tiff"],
+  allowedExtensions: ["jpg", "jpeg", "png", "gif"],
   sizeLimit: 4194304,  // bytes
 
   initialize: function(opts) {
diff --git a/app/assets/javascripts/app/views/publisher_view.js b/app/assets/javascripts/app/views/publisher_view.js
index baffa26da18a07dab4ad0e4f4a48a4b5b5bec4b5..19eb9229681701518e23c5622a71620193606c04 100644
--- a/app/assets/javascripts/app/views/publisher_view.js
+++ b/app/assets/javascripts/app/views/publisher_view.js
@@ -36,7 +36,7 @@ app.views.Publisher = Backbone.View.extend({
 
     // init shortcut references to the various elements
     this.inputEl = this.$("#status_message_text");
-    this.wrapperEl = this.$("#publisher_textarea_wrapper");
+    this.wrapperEl = this.$("#publisher-textarea-wrapper");
     this.submitEl = this.$("input[type=submit], button#submit");
     this.photozoneEl = this.$("#photodropzone");
 
@@ -87,7 +87,7 @@ app.views.Publisher = Backbone.View.extend({
   },
 
   initSubviews: function() {
-    this.mention = new app.views.PublisherMention({ el: this.$("#publisher_textarea_wrapper") });
+    this.mention = new app.views.PublisherMention({ el: this.$("#publisher-textarea-wrapper") });
     if(this.prefillMention) {
       this.mention.prefillMention([this.prefillMention]);
     }
@@ -101,14 +101,14 @@ app.views.Publisher = Backbone.View.extend({
     });
 
     this.viewAspectSelector = new app.views.PublisherAspectSelector({
-      el: this.$(".public_toggle .aspect_dropdown"),
+      el: this.$(".public_toggle .aspect-dropdown"),
       form: form
     });
 
     this.viewGettingStarted = new app.views.PublisherGettingStarted({
       firstMessageEl:  this.inputEl,
-      visibilityEl: this.$(".public_toggle .aspect_dropdown > .dropdown-toggle"),
-      streamEl:     $("#main_stream")
+      visibilityEl: this.$(".public_toggle .aspect-dropdown > .dropdown-toggle"),
+      streamEl:     $("#main-stream")
     });
 
     this.viewUploader = new app.views.PublisherUploader({
@@ -129,7 +129,7 @@ app.views.Publisher = Backbone.View.extend({
       },
 
       onPostPreview: function() {
-        var photoAttachments = self.wrapperEl.find(".photo_attachments");
+        var photoAttachments = self.wrapperEl.find(".photo-attachments");
         if (photoAttachments.length > 0) {
           new app.views.Gallery({el: photoAttachments});
         }
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
index 65ea3df452fb5f3692319b626f43af0fc26075b2..c2c246186b5d0a2d9227e52722ee5db6db6e92ad 100644
--- a/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
@@ -26,8 +26,8 @@ app.views.SinglePostActions = app.views.Feedback.extend({
   },
 
   focusComment: function() {
-    $('.comment_stream .comment_box').focus();
-    $('html,body').animate({scrollTop: $('.comment_stream .comment_box').offset().top - ($('.comment_stream .comment_box').height() + 20)});
+    $('.comment_stream .comment-box').focus();
+    $('html,body').animate({scrollTop: $('.comment_stream .comment-box').offset().top - ($('.comment_stream .comment-box').height() + 20)});
     return false;
   },
 
diff --git a/app/assets/javascripts/app/views/stream_post_views.js b/app/assets/javascripts/app/views/stream_post_views.js
index c723d514b61ce5da5d1078b7a745071468cfe59a..c454462ac1bb9bfafb04cb2e0e42e8b997cd422b 100644
--- a/app/assets/javascripts/app/views/stream_post_views.js
+++ b/app/assets/javascripts/app/views/stream_post_views.js
@@ -88,7 +88,7 @@ app.views.StreamPost = app.views.Post.extend({
   focusCommentTextarea: function(evt){
     evt.preventDefault();
     this.$(".new-comment-form-wrapper").removeClass("hidden");
-    this.$(".comment_box").focus();
+    this.$(".comment-box").focus();
 
     return this;
   }
diff --git a/app/assets/javascripts/contact-list.js b/app/assets/javascripts/contact-list.js
index 87740a64aea55f782daee5a924ec35689728fc25..7f7ea524574ff11a937c75a170b1907626cf7d21 100644
--- a/app/assets/javascripts/contact-list.js
+++ b/app/assets/javascripts/contact-list.js
@@ -9,7 +9,7 @@ var List = {
   },
 
   handleSearchRefresh: function( data ) {
-    var streamEl = $("#people_stream.stream");
+    var streamEl = $("#people-stream.stream");
     var string = data.search_html || $("<p>", {
         text : Diaspora.I18n.t("people.not_found")
       });
@@ -18,7 +18,7 @@ var List = {
 
     if (data.contacts) {
       var contacts = new app.collections.Contacts(data.contacts);
-      $(".aspect_membership_dropdown.placeholder").each(function() {
+      $(".aspect-membership-dropdown.placeholder").each(function() {
         var personId = $(this).data("personId");
         var view = new app.views.AspectMembership({person: contacts.findWhere({"person_id": personId}).person});
         $(this).html(view.render().$el);
diff --git a/app/assets/javascripts/helpers/profile_photo_uploader.js b/app/assets/javascripts/helpers/profile_photo_uploader.js
index 1b50b5bcf365bec23c1841a576331d3761960240..059622ceaccbef50b605cf8fb804f96dde6bff66 100644
--- a/app/assets/javascripts/helpers/profile_photo_uploader.js
+++ b/app/assets/javascripts/helpers/profile_photo_uploader.js
@@ -78,6 +78,10 @@ Diaspora.ProfilePhotoUploader.prototype = {
             alert(errorReason);
           }
         }
+      },
+
+      text: {
+        fileInputTitle: ""
       }
     });
   }
diff --git a/app/assets/javascripts/ie.js b/app/assets/javascripts/ie.js
deleted file mode 100644
index 1c1d5387df770c089a4fa655afef40bde9e5f09e..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/ie.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
-
-document.createElement('header');
-document.createElement('footer');
-// @license-end
-
diff --git a/app/assets/javascripts/mobile/mobile_comments.js b/app/assets/javascripts/mobile/mobile_comments.js
index a10c60639b3c6c961dee42abecfe248aeb1b058b..78dbe5e15d9b75f2cd4f5e10745be6c35a007113 100644
--- a/app/assets/javascripts/mobile/mobile_comments.js
+++ b/app/assets/javascripts/mobile/mobile_comments.js
@@ -11,7 +11,7 @@
     initialize: function() {
       var self = this;
 
-      new Diaspora.MarkdownEditor(".comment_box");
+      new Diaspora.MarkdownEditor(".comment-box");
 
       this.stream().on("tap click", "a.show-comments", function(evt){
         evt.preventDefault();
@@ -43,7 +43,7 @@
     submitComment: function(evt){
       evt.preventDefault();
       var form = $(this);
-      var commentBox = form.find(".comment_box");
+      var commentBox = form.find(".comment-box");
       var commentText = $.trim(commentBox.val());
       if(!commentText){
         commentBox.focus();
@@ -169,7 +169,7 @@
 
     showCommentBox: function(link){
       var bottomBar = link.closest(".bottom-bar").first();
-      var textArea = bottomBar.find("textarea.comment_box").first()[0];
+      var textArea = bottomBar.find("textarea.comment-box").first()[0];
       bottomBar.find(".add-comment-switcher").removeClass("hidden");
       autosize(textArea);
     },
diff --git a/app/assets/javascripts/mobile/mobile_file_uploader.js b/app/assets/javascripts/mobile/mobile_file_uploader.js
index 3a33ef5ee6163edede3ae159a54fe06eb0973213..e7750babd971013c7e9bf2a42eb371940e641b77 100644
--- a/app/assets/javascripts/mobile/mobile_file_uploader.js
+++ b/app/assets/javascripts/mobile/mobile_file_uploader.js
@@ -19,7 +19,7 @@ function createUploader(){
       }
     },
     validation: {
-      allowedExtensions: ["jpg", "jpeg", "png", "gif", "tif", "tiff"],
+      allowedExtensions: ["jpg", "jpeg", "png", "gif"],
       sizeLimit: 4194304
     },
     button: document.getElementById("file-upload-publisher"),
@@ -33,7 +33,7 @@ function createUploader(){
         $("#fileInfo-publisher").text(fileName + " " + progress + "%");
       },
       onSubmit: function() {
-        $("#publisher_textarea_wrapper").addClass("with_attachments");
+        $("#publisher-textarea-wrapper").addClass("with_attachments");
         $("#photodropzone").append(
           "<li class='publisher_photo loading' style='position:relative;'>" +
           "<img alt='Ajax-loader2' src='" + ImagePaths.get("ajax-loader2.gif") + "' />" +
@@ -50,7 +50,7 @@ function createUploader(){
             url = responseJSON.data.photo.unprocessed_image.url,
             currentPlaceholder = $("li.loading").first();
 
-        $("#publisher_textarea_wrapper").addClass("with_attachments");
+        $("#publisher-textarea-wrapper").addClass("with_attachments");
         $("#new_status_message").append("<input type='hidden' value='" + id + "' name='photos[]' />");
 
         // replace image placeholders
@@ -76,7 +76,7 @@ function createUploader(){
               photo.fadeOut(400, function() {
                 photo.remove();
                 if ($(".publisher_photo").length === 0) {
-                  $("#publisher_textarea_wrapper").removeClass("with_attachments");
+                  $("#publisher-textarea-wrapper").removeClass("with_attachments");
                 }
               });
             }
diff --git a/app/assets/javascripts/osmlocator.js b/app/assets/javascripts/osmlocator.js
index 157230456f616168ba57b52b97a85e436eb0e21a..fdc2bf804a19a1ac2c019e3233f7b2d8219b7f33 100644
--- a/app/assets/javascripts/osmlocator.js
+++ b/app/assets/javascripts/osmlocator.js
@@ -5,12 +5,12 @@ OSM =  {};
 OSM.Locator = function(){
 
   var geolocalize = function(callback){
-    navigator.geolocation.getCurrentPosition(function(position) {       
+    navigator.geolocation.getCurrentPosition(function(position) {
       var lat=position.coords.latitude,
           lon=position.coords.longitude;
       $.getJSON("https://nominatim.openstreetmap.org/reverse?format=json&lat="+lat+"&lon="+lon+"&addressdetails=3", function(data){
         return callback(data.display_name, position.coords);
-      }); 
+      });
     },errorGettingPosition);
   };
 
diff --git a/app/assets/stylesheets/aspects.scss b/app/assets/stylesheets/aspects.scss
index 115e2bcfaa7818e14b890bef3bbc4314ee629842..2fcb3edd7df767b22d8f8358fbf159e61b771f01 100644
--- a/app/assets/stylesheets/aspects.scss
+++ b/app/assets/stylesheets/aspects.scss
@@ -1,4 +1,4 @@
-.aspect_dropdown {
+.aspect-dropdown {
 
   li {
     @include selectable-list;
diff --git a/app/assets/stylesheets/color_themes/_color_theme_override.scss b/app/assets/stylesheets/color_themes/_color_theme_override.scss
index 7655d08f993a150b2a73ee0bba3c9d18ef90b1b1..6f0bc62e35196e251c2b5d9f7a219b57e837e20e 100644
--- a/app/assets/stylesheets/color_themes/_color_theme_override.scss
+++ b/app/assets/stylesheets/color_themes/_color_theme_override.scss
@@ -1,12 +1,10 @@
 /* Raw CSS */
 body {
-  #publisher_textarea_wrapper > #button_container > span.markdownIndications > a {
+  #publisher-textarea-wrapper > #button_container > span.markdownIndications > a {
     color: fade-out($link-color, 0.4);
   }
 
   .left-navbar .hoverable:hover { background-color: $main-color-essence; }
 
-  .poll_form .progress .bar { background-color: $main-color-dark; }
-
   .badge { background-color: $brand-primary; }
 }
diff --git a/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss b/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss
index ec5e4ef46ceb2e13c6c31005f3c81d28ff14b44f..0a97910427ab94f1f088232d4bf60fae9269d4ba 100644
--- a/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss
+++ b/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss
@@ -3,7 +3,7 @@
 body {
   .publisher {
     form {
-      #publisher_textarea_wrapper { background-color: $gray; }
+      #publisher-textarea-wrapper { background-color: $gray; }
       .btn.btn-link.question_mark:hover .entypo-cog { color: $gray-light; }
     }
     .publisher-buttonbar .btn.btn-link:hover i { color: $gray-light; }
@@ -15,13 +15,14 @@ body {
   .md-input,
   .md-preview { background-color: $gray; }
 
-  .aspect_dropdown li a .text { color: $dropdown-link-color; }
+  .aspect-dropdown li a .text { color: $dropdown-link-color; }
 
   .info .tag { background-color: $gray-light; }
 
-  .poll_form .progress {
+  .poll-form .progress {
     background-color: $gray-dark;
-    .bar { background-color: $gray-light; }
+    .progress-bar { background-color: $gray-light; }
+    .users-vote { background-color: $brand-primary; }
   }
 
   .stream-element .collapsible {
@@ -60,7 +61,7 @@ body {
 
   #invitationsModal #email_invitation { border-top: 1px dashed $gray-light; }
 
-  #contacts_container #people_stream.contacts .stream-element.in_aspect {
+  #contacts_container #people-stream.contacts .stream-element.in_aspect {
     background-color: $state-success-bg;
     border-left: 3px solid darken($state-success-bg, 10%);
   }
diff --git a/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss b/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
index 1d218888a71123fe4b49cda4cf65b3d4595b3b5a..0b2a3dfaa855993b0ba2b212a197d25440b7be32 100644
--- a/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
+++ b/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
@@ -1,5 +1,5 @@
 body {
-  #main_stream .stream-element {
+  #main-stream .stream-element {
     border: 0;
     border-bottom: 1px solid $border-grey;
     margin-bottom: 10px;
diff --git a/app/assets/stylesheets/comments.scss b/app/assets/stylesheets/comments.scss
index 1c111d57f4bcdb782d0177eec1fcfada6a062ed9..a91414e94650f639dc0a3f91538750a9267b79cc 100644
--- a/app/assets/stylesheets/comments.scss
+++ b/app/assets/stylesheets/comments.scss
@@ -53,11 +53,11 @@
     }
     padding-left: 12px;
   }
-  .comment_box {
+  .comment-box {
     height: 35px;
     resize: none;
   }
-  textarea.comment_box:focus, textarea.comment_box:valid, textarea.comment_box:active {
+  textarea.comment-box:focus, textarea.comment-box:valid, textarea.comment-box:active {
     border-color: $border-dark-grey;
     box-shadow: none;
   }
diff --git a/app/assets/stylesheets/contacts.scss b/app/assets/stylesheets/contacts.scss
index 4d49d39ad43692695c0cc56c14f067a5a9e7a562..8a35dbe489d2f59aa02c7806dae191ccc4d7e867 100644
--- a/app/assets/stylesheets/contacts.scss
+++ b/app/assets/stylesheets/contacts.scss
@@ -21,7 +21,7 @@
 }
 
 #contacts_container {
-  #people_stream.contacts {
+  #people-stream.contacts {
     .header {
       #change_aspect_name { cursor: pointer; }
       #aspect_name_form {
diff --git a/app/assets/stylesheets/conversations.scss b/app/assets/stylesheets/conversations.scss
index f627e8059bbaab0c152a539737ca83f2a5c4b94a..ca4d61976b18fb142331d92cb510f466fb9abc85 100644
--- a/app/assets/stylesheets/conversations.scss
+++ b/app/assets/stylesheets/conversations.scss
@@ -65,7 +65,7 @@
 
     &:hover:not(.selected), &.selected {
       .subject,
-      .last_author,
+      .last-author,
       .last_message {
         color: $white;
       }
@@ -86,14 +86,14 @@
     &.unread { background-color: $background-grey; }
     &.selected { background-color: $brand-primary; }
 
-    .last_author, .last_message {
+    .last-author, .last_message {
       font-size: 12px;
       line-height: 15px;
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
     }
-    .last_author { color: $text-dark-grey; }
+    .last-author { color: $text-dark-grey; }
 
     .message-count, .unread-message-count {
       margin-left: 3px;
@@ -148,7 +148,7 @@
     }
   }
 
-  .stream_container .conversation-participants {
+  .stream-container .conversation-participants {
     margin-bottom: 20px;
 
     .hide_conversation, .delete_conversation {
diff --git a/app/assets/stylesheets/header.scss b/app/assets/stylesheets/header.scss
index 9bd9df45ab6111c1c4ce2f66e81002cf2dd2bdac..55fe8f924df308125c4aacca53c889ccea0e87aa 100644
--- a/app/assets/stylesheets/header.scss
+++ b/app/assets/stylesheets/header.scss
@@ -94,7 +94,7 @@
           margin-right: 10px;
           opacity: 1;
         }
-        & > .pull-right > .aspect_membership_dropdown { display: none; }
+        & > .pull-right > .aspect-membership-dropdown { display: none; }
       }
       .ajax-loader {
         border-bottom: 1px solid $border-grey;
diff --git a/app/assets/stylesheets/hovercard.scss b/app/assets/stylesheets/hovercard.scss
index 50867da4b259470667ebab18b67d2ef6dbb6df97..c664ee467a981f739a44789e7816fc6501464c10 100644
--- a/app/assets/stylesheets/hovercard.scss
+++ b/app/assets/stylesheets/hovercard.scss
@@ -65,7 +65,7 @@
     margin-bottom: 5px;
   }
 
-  .btn-group.aspect_membership_dropdown { margin: 0 !important; }
+  .btn-group.aspect-membership-dropdown { margin: 0 !important; }
 }
 
 #hovercard_container {
diff --git a/app/assets/stylesheets/interactions.scss b/app/assets/stylesheets/interactions.scss
index 211f27acd1522c3fb739b17c1c8820e2dcd34ae2..2f6ef48c7a26a22e9c9a1d11616c9e4d61f4864e 100644
--- a/app/assets/stylesheets/interactions.scss
+++ b/app/assets/stylesheets/interactions.scss
@@ -22,7 +22,7 @@
   }
 }
 
-.stream_container,
+.stream-container,
 .single-post-interactions {
   .control-icons {
     float: right;
diff --git a/app/assets/stylesheets/mobile/mobile.scss b/app/assets/stylesheets/mobile/mobile.scss
index dc9958164918edcade0cb90b387028f557311652..6447df013340c7c6371293659c99dd8fc23f1ae5 100644
--- a/app/assets/stylesheets/mobile/mobile.scss
+++ b/app/assets/stylesheets/mobile/mobile.scss
@@ -83,7 +83,7 @@ h3 {  margin-top: 0; }
 
   > .content, .reshare > .content { padding: 6px; }
   .info{ margin-top: 0; }
-  .photo_attachments{ margin-top: 6px; }
+  .photo-attachments{ margin-top: 6px; }
   .timeago{ font-weight: normal; }
 }
 
@@ -172,7 +172,7 @@ footer {
     padding: 0;
   }
 
-  .photo_attachments {
+  .photo-attachments {
     border-radius: 3px 3px 0 0;
 
     border: {
@@ -194,7 +194,7 @@ footer {
   }
 }
 
-.photo_attachments {
+.photo-attachments {
   position: relative;
   left: 0;
   top: 0;
@@ -206,7 +206,7 @@ footer {
     padding: 0; } }
 
 
-#main_stream {
+#main-stream {
   .from {
     white-space: nowrap;
     overflow: hidden;
@@ -486,7 +486,7 @@ select {
   margin-bottom: 5px;
 }
 
-.last_author {
+.last-author {
   position: relative;
   margin: 10px 10px 2px;
   float: right;
@@ -694,7 +694,7 @@ select#aspect_ids_ {
   .entypo-camera { margin-right: 0; }
 }
 
-#publisher_textarea_wrapper {
+#publisher-textarea-wrapper {
   border-radius: 2px;
   margin: 12px 0px;
   background: $framed-background;
diff --git a/app/assets/stylesheets/notifications.scss b/app/assets/stylesheets/notifications.scss
index d3ffa2f2b131f1139c346b0aaa7964604eb725fa..d75e1bdf782b08733b4fa4edf7ccc281c9a44250 100644
--- a/app/assets/stylesheets/notifications.scss
+++ b/app/assets/stylesheets/notifications.scss
@@ -96,6 +96,6 @@
       opacity: 0;
     }
 
-    .btn-group.aspect_membership_dropdown { margin: 5px 0; }
+    .btn-group.aspect-membership-dropdown { margin: 5px 0; }
   }
 }
diff --git a/app/assets/stylesheets/people.scss b/app/assets/stylesheets/people.scss
index 59e0b228537f5cab2a9d534aeec5106b24bf8209..65a9100ae57af1e5ed253ea6c93ea2cbbab1c368 100644
--- a/app/assets/stylesheets/people.scss
+++ b/app/assets/stylesheets/people.scss
@@ -5,7 +5,7 @@
   }
   #invitations-button { padding-left: 0; }
 }
-#people_stream {
+#people-stream {
   .media, .media-body {
     overflow: visible;
   }
@@ -20,7 +20,7 @@
       width: 50px;
       height: 50px;
     }
-    .btn-group.aspect_membership_dropdown { margin: 12px 0; }
+    .btn-group.aspect-membership-dropdown { margin: 12px 0; }
     .thats_you {
       line-height: 50px;
       margin-right: 10px;
diff --git a/app/assets/stylesheets/poll.scss b/app/assets/stylesheets/poll.scss
index e5d80527048e444119e71c720a7b02441a60f238..146d4f2fabed2736d77f0809da98c36a6a091469 100644
--- a/app/assets/stylesheets/poll.scss
+++ b/app/assets/stylesheets/poll.scss
@@ -1,4 +1,4 @@
-.poll_form {
+.poll-form {
   border-bottom: 1px solid $border-grey;
   border-top: 1px solid $border-grey;
   margin: 10px 0;
@@ -14,38 +14,33 @@
   }
 
   .progress {
-    background-image: none;
-    box-shadow: 0 0 0;
     height: 10px;
     margin-bottom: 5px;
+    clear: both;
 
-    .bar {
-      background: $border-dark-grey none;
-      color: $text-dark-grey;
-      height: 100%;
-      text-align: left;
-    }
+    .progress-bar { background-color: $border-dark-grey; }
+    .users-vote { background-color: $brand-primary; }
   }
 
   .submit[disabled] {
     color: $text-grey;
     cursor: default;
-
-    &:hover,
-    &:active {
-      background-image: none;
-    }
   }
 }
 
 .poll-content {
   margin-top: 5px;
 
+  .result-head {
+    margin-bottom: 5px;
+  }
+
   [type=radio],
   label {
     font-weight: normal;
     margin-bottom: 5px;
     vertical-align: middle;
+    display: inline;
   }
 
   [type=radio],
diff --git a/app/assets/stylesheets/post-content.scss b/app/assets/stylesheets/post-content.scss
index c58f567e1bfb97b9dc93fc618365f1b80aa5b707..8505a9a3fad47aa9c581ab78ba01a98fd35e79a3 100644
--- a/app/assets/stylesheets/post-content.scss
+++ b/app/assets/stylesheets/post-content.scss
@@ -1,7 +1,7 @@
 .message-content,
 .post-content {
   img { max-width: 100%; }
-  .photo_attachments {
+  .photo-attachments {
     margin-top: 7px;
     padding-bottom: 10px;
     text-align: center;
diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss
index cec99ef338595c3b8f948dc010dfa639c6612f27..85300a4912731b25e6e7ac461eb900041c8025fa 100644
--- a/app/assets/stylesheets/profile.scss
+++ b/app/assets/stylesheets/profile.scss
@@ -8,7 +8,7 @@
     margin-top: -20px;
     box-shadow: $card-shadow;
 
-    #edit_profile, #unblock_user_button, .aspect_dropdown {
+    #edit_profile, #unblock_user_button, .aspect-dropdown {
       margin-top: 15px;
     }
 
@@ -137,9 +137,9 @@
 
   }
 
-  .stream_container > .pagination { text-align: center; }
+  .stream-container > .pagination { text-align: center; }
 
-  #people_stream {
+  #people-stream {
     background-color: $white;
     box-shadow: $card-shadow;
   }
diff --git a/app/assets/stylesheets/publisher.scss b/app/assets/stylesheets/publisher.scss
index 93cd34d199264111088edb662dfa0cb3420f92bd..6db248519e865e1651dc4fd3f0d715f1a93f9ed4 100644
--- a/app/assets/stylesheets/publisher.scss
+++ b/app/assets/stylesheets/publisher.scss
@@ -14,7 +14,7 @@
       display: none !important;
     }
 
-    #publisher_textarea_wrapper { border: 1px solid $border-grey !important; }
+    #publisher-textarea-wrapper { border: 1px solid $border-grey !important; }
   }
 
   .container-fluid{ padding: 0; }
@@ -53,8 +53,8 @@
         .btn-toolbar {
           width: 100%;
           display: flex;
-          .btn, .aspect_dropdown{ flex-grow: 1; }
-          .aspect_dropdown .btn { width: 100%; }
+          .btn, .aspect-dropdown{ flex-grow: 1; }
+          .aspect-dropdown .btn { width: 100%; }
         }
         .btn-group:first-child { margin: 0; }
         .dropdown-menu.pull-right {
@@ -64,7 +64,7 @@
       }
     }
 
-    #publisher_textarea_wrapper {
+    #publisher-textarea-wrapper {
       background-color: white;
       border-radius: 3px;
       border: 1px solid $border-dark-grey;
@@ -183,7 +183,7 @@
     }
   }
 
-  .aspect_dropdown {
+  .aspect-dropdown {
     .radio {
       min-height: 0;
       padding-left: 0;
diff --git a/app/assets/stylesheets/stream.scss b/app/assets/stylesheets/stream.scss
index 56bc4d5a64af33c4f25e41bb2cdc09a9124bcce6..38f8139f752fc776929279e9f50f8024d0b66f89 100644
--- a/app/assets/stylesheets/stream.scss
+++ b/app/assets/stylesheets/stream.scss
@@ -1,4 +1,4 @@
-.stream_container {
+.stream-container {
   .stream-title {
     margin: 12px 0;
   }
diff --git a/app/assets/stylesheets/stream_element.scss b/app/assets/stylesheets/stream_element.scss
index 2ef09f3e097749bf25cb04c3804f053cbbf35cbf..a411c423e11ac4993755e5468255f167aaeab8e2 100644
--- a/app/assets/stylesheets/stream_element.scss
+++ b/app/assets/stylesheets/stream_element.scss
@@ -61,7 +61,7 @@
   }
 }
 
-#main_stream .stream-element {
+#main-stream .stream-element {
   margin-bottom: 20px;
   border: 1px solid $border-grey;
   box-shadow: $card-shadow;
@@ -90,6 +90,7 @@
     .author-name {
       font-weight: bold;
       margin-bottom: 4px;
+      unicode-bidi: isolate;
     }
     .feedback {
       margin-top: 5px;
diff --git a/app/assets/stylesheets/tag.scss b/app/assets/stylesheets/tag.scss
index 08a9c1ff45e5b922a454bd6d872150f1ade2f66a..99f2e8f79018832fe50c9951345e7982a1f3a42c 100644
--- a/app/assets/stylesheets/tag.scss
+++ b/app/assets/stylesheets/tag.scss
@@ -30,7 +30,7 @@ h1.tag {
         line-height: 1.1;
       }
 
-      .side_stream #people_stream {
+      .side_stream #people-stream {
         .name { display: block; }
         .name, .diaspora_handle {
           word-break: break-all;
diff --git a/app/assets/templates/comment-stream_tpl.jst.hbs b/app/assets/templates/comment-stream_tpl.jst.hbs
index 592cf408bca83023c65fc23c0ff3687785849d6f..9e0da98b74af3a90ddc973d79922eee1ef10ee29 100644
--- a/app/assets/templates/comment-stream_tpl.jst.hbs
+++ b/app/assets/templates/comment-stream_tpl.jst.hbs
@@ -28,7 +28,7 @@
       <form accept-charset="UTF-8" action="/posts/{{id}}/comments"
             class="new-comment" id="new-comment-on-{{id}}" method="post">
 
-        <textarea class="comment_box form-control mention-textarea"
+        <textarea class="comment-box form-control mention-textarea"
                   id="comment_text_on_{{id}}" name="text" rows="1" required placeholder="{{t "stream.comment"}}" />
         <div class="typeahead-mention-box-wrap">
           <input class="typeahead-mention-box hidden" type="text">
diff --git a/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs b/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
index 6fd047cc4e792b230195fded79fd70037e8bae16..b2ef4b382c93a9792f4adc11d5807a470f571ccf 100644
--- a/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
+++ b/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
@@ -24,6 +24,16 @@
     </a>
     <div class='answer hideable'>{{ post_notification_a }}</div>
   </div>
+  <div class='question opened collapsible'>
+    <a class='toggle' href='#'>
+      <h4>{{ ignore_user_q }}</h4>
+    </a>
+    <div class='answer hideable'>
+      <p>{{ ignore_user_a1 }}</p>
+      <p>{{ ignore_user_a2 }}</p>
+      <p>{{ ignore_user_a3 }}</p>
+    </div>
+  </div>
   <div class='question opened collapsible'>
     <a class='toggle' href='#'>
       <h4>{{ post_report_q }}</h4>
diff --git a/app/assets/templates/help_tpl.jst.hbs b/app/assets/templates/help_tpl.jst.hbs
index 7281a958dc2d8866d566c37ac575113bcc761361..b1cd4408ecf78efdf01b764542c8564ad04fd748 100644
--- a/app/assets/templates/help_tpl.jst.hbs
+++ b/app/assets/templates/help_tpl.jst.hbs
@@ -29,7 +29,7 @@
             <span class="section-selected">{{ title_pods }}</span>
           </li>
           <li>
-            <a href="#" class="section-unselected faq-link-posts-and-posting" data-section="posts_and_posting" data-items="hide_posts format_text insert_images">{{ title_posts_and_posting }}</a>
+            <a href="#" class="section-unselected faq-link-posts-and-posting" data-section="posts_and_posting" data-items="hide_posts ignore_user format_text insert_images">{{ title_posts_and_posting }}</a>
             <span class="section-selected">{{ title_posts_and_posting }}</span>
           </li>
           <li>
diff --git a/app/assets/templates/poll_tpl.jst.hbs b/app/assets/templates/poll_tpl.jst.hbs
index a1a9be576fb0115dd2b47663de203f6679645109..707ec7482ce7a463561bc3eb060252dd4996d6cb 100644
--- a/app/assets/templates/poll_tpl.jst.hbs
+++ b/app/assets/templates/poll_tpl.jst.hbs
@@ -1,8 +1,8 @@
 {{#if poll}}
-  <div class="poll_form">
-    <div class="poll_head">
+  <div class="poll-form">
+    <div class="poll-head">
       <strong>{{poll.question}}</strong>
-      <div class="poll_statistic pull-right">
+      <div class="poll-statistic pull-right">
         {{t "poll.count" count=poll.participation_count}}
       </div>
     </div>
@@ -12,14 +12,27 @@
       {{/if}}
       {{#poll.poll_answers}}
         <div class="result-row">
-          <input type="radio" name="vote" value="{{id}}"/>
-          <label>{{answer}}</label>
-          <div class="poll-result pull-right">
-            <span class="percentage"></span>
-            ({{t "poll.answer_count" count=vote_count}})
+          <div class="result-head">
+            <input type="radio" name="vote" value="{{id}}"/>
+            {{#if isCurrentUserVote}}
+              <label>
+                {{answer}}
+                <span class="label label-primary">{{t "poll.your_vote"}}</span>
+              </label>
+            {{else}}
+              <label>{{answer}}</label>
+            {{/if}}
+            <div class="poll-result pull-right">
+              <span class="percentage"></span>
+              ({{t "poll.answer_count" count=vote_count}})
+            </div>
           </div>
-          <div class="poll_progress_bar_wrapper progress">
-            <div class="poll_progress_bar bar" data-answerid="{{id}}" style="height: 100%"></div>
+          <div class="progress">
+            {{#if isCurrentUserVote}}
+              <div class="progress-bar users-vote" data-answerid="{{id}}" style="height: 100%"></div>
+            {{else}}
+              <div class="progress-bar" data-answerid="{{id}}" style="height: 100%"></div>
+            {{/if}}
           </div>
         </div>
       {{/poll.poll_answers}}
@@ -28,7 +41,7 @@
             {{#if preview}}
               <span>{{t "poll.show_result"}}</span>
             {{else}}
-              <a class="toggle_result" href="#">{{t "poll.show_result"}}</a>
+              <a class="toggle-result" href="#">{{t "poll.show_result"}}</a>
             {{/if}}
           </div>
           <input type="submit" class="submit pull-right btn btn-default" value="{{t "poll.vote"}}"/>
@@ -38,7 +51,7 @@
 
       {{#if is_reshare }}
         <div class="poll_footer">
-          {{{t "poll.go_to_original_post" original_post_link=original_post_link}}}
+          {{{t "poll.go_to_original_post" original_post_link=originalPostLink}}}
         </div>
       {{/if}}
     </div>
diff --git a/app/assets/templates/post-controls_tpl.jst.hbs b/app/assets/templates/post-controls_tpl.jst.hbs
index 560f366f46c1815a4400fbc7684b21acc81ca344..4e623839175e88941d375be22c046613dd925fa5 100644
--- a/app/assets/templates/post-controls_tpl.jst.hbs
+++ b/app/assets/templates/post-controls_tpl.jst.hbs
@@ -3,12 +3,6 @@
     <i class="entypo-trash"></i>
   </a>
 {{else}}
-  <a href="#" rel="nofollow" data-type="Post" class="post_report" title="{{t "report.name"}}">
-    <i class="entypo-warning"></i>
-  </a>
-  <a href="#" rel="nofollow" class="block_user" title="{{t "ignore"}}">
-    <i class="entypo-block"></i>
-  </a>
   {{#if participation}}
     <a href="#" rel="nofollow" class="destroy_participation" title="{{t "stream.disable_post_notifications"}}">
       <i class="entypo-bell"></i>
@@ -18,6 +12,12 @@
       <i class="entypo-bell"></i>
     </a>
   {{/if}}
+  <a href="#" rel="nofollow" data-type="Post" class="post_report" title="{{t "report.name"}}">
+    <i class="entypo-warning"></i>
+  </a>
+  <a href="#" rel="nofollow" class="block_user" title="{{t "ignore"}}">
+    <i class="entypo-block"></i>
+  </a>
   <a href="#" rel="nofollow" class="delete hide_post" title="{{t "stream.hide"}}">
     <i class="entypo-cross"></i>
   </a>
diff --git a/app/assets/templates/profile_header_tpl.jst.hbs b/app/assets/templates/profile_header_tpl.jst.hbs
index 4885810e5d4be838e2499ec6ad0598abfd5ff707..e6f94881f9b1cbe66d33e567d737da5c2254e4cd 100644
--- a/app/assets/templates/profile_header_tpl.jst.hbs
+++ b/app/assets/templates/profile_header_tpl.jst.hbs
@@ -33,7 +33,7 @@
         {{else}} {{#if is_blocked}}
           <a href="#" id="unblock_user_button" class="btn btn-danger">{{t 'people.stop_ignoring'}}</a>
         {{else}}
-          <div class="placeholder aspect_membership_dropdown"></div>
+          <div class="placeholder aspect-membership-dropdown"></div>
         {{/if}}{{/if}}
       </div>
     {{/if}}
diff --git a/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs
index d81f6a14b61a33607e046c1ad26585bbc394e742..f583895014c15a068b0a4ea4bde2456f9888beca 100644
--- a/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs
+++ b/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs
@@ -5,12 +5,6 @@
         <i class="entypo-trash"></i>
       </a>
     {{else}}
-      <a href="#" data-type="Post" class="post_report" title="{{t "report.name"}}">
-        <i class="entypo-warning"></i>
-      </a>
-      <a href="#" data-type="post" class="block_user" title="{{t "ignore"}}">
-        <i class="entypo-block"></i>
-      </a>
       {{#if participation}}
         <a href="#" data-type="nofollow" class="destroy_participation" title="{{t "stream.disable_post_notifications"}}">
           <i class="entypo-bell"></i>
@@ -20,6 +14,12 @@
           <i class="entypo-bell"></i>
         </a>
       {{/if}}
+      <a href="#" data-type="Post" class="post_report" title="{{t "report.name"}}">
+        <i class="entypo-warning"></i>
+      </a>
+      <a href="#" data-type="post" class="block_user" title="{{t "ignore"}}">
+        <i class="entypo-block"></i>
+      </a>
       <a href="#" data-type="post" class="hide_post" title="{{t "stream.hide"}}">
         <i class="entypo-cross"></i>
       </a>
diff --git a/app/assets/templates/status-message_tpl.jst.hbs b/app/assets/templates/status-message_tpl.jst.hbs
index 14ee8889aa7c91b5bfbe6751887a63e1ccea980b..6ca21236ea07f8a49bb63f9aa34a5c646ccb0551 100644
--- a/app/assets/templates/status-message_tpl.jst.hbs
+++ b/app/assets/templates/status-message_tpl.jst.hbs
@@ -23,7 +23,7 @@
 </div>
 
 {{#if largePhoto}}
-  <div class="photo_attachments nsfw-hidden">
+  <div class="photo-attachments nsfw-hidden">
     {{#with largePhoto}}
       <a href="{{sizes.large}}" class="stream-photo-link gallery-picture">
         <img src="{{sizes.large}}" class="stream-photo big_stream_photo">
diff --git a/app/controllers/admin/admin_controller.rb b/app/controllers/admin/admin_controller.rb
index 24f08cdf0281e538e87c069fcdda5d4c1bc55eef..8a5d0f599c39f209a07c95c11124cec296af4ac4 100644
--- a/app/controllers/admin/admin_controller.rb
+++ b/app/controllers/admin/admin_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Admin
   class AdminController < ApplicationController
     before_action :authenticate_user!
diff --git a/app/controllers/admin/pods_controller.rb b/app/controllers/admin/pods_controller.rb
index 309ee386101fff95b9927f59b0f243ba8ca47450..ed41d06699f5667f3af84afa75173b6d380e5c9b 100644
--- a/app/controllers/admin/pods_controller.rb
+++ b/app/controllers/admin/pods_controller.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 module Admin
   class PodsController < AdminController
     respond_to :html, :json, :mobile
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 2163c3630086715d81b34e938aa8af48b2bad175..376603b5133b9bb987008fa4f75ee87bc5703e93 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Admin
   class UsersController < AdminController
 
diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
index dc04103912e8c146a11ab9d9bc64315d21fcae10..f0fa8bb5c42580956be9d553de636b2304c89408 100644
--- a/app/controllers/admins_controller.rb
+++ b/app/controllers/admins_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AdminsController < Admin::AdminController
   include ApplicationHelper
 
diff --git a/app/controllers/api/openid_connect/authorizations_controller.rb b/app/controllers/api/openid_connect/authorizations_controller.rb
index 94f2680105d6461b0d7e1fc025641fb04025f3ff..bc35f11b957e1b11d7dc1e728d4d019c8c671f0b 100644
--- a/app/controllers/api/openid_connect/authorizations_controller.rb
+++ b/app/controllers/api/openid_connect/authorizations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class AuthorizationsController < ApplicationController
diff --git a/app/controllers/api/openid_connect/clients_controller.rb b/app/controllers/api/openid_connect/clients_controller.rb
index 210c77624c706a68b42909605d5370b12867e735..9bc6c2793d11bbb0fc6d08abe2577de00d749845 100644
--- a/app/controllers/api/openid_connect/clients_controller.rb
+++ b/app/controllers/api/openid_connect/clients_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class ClientsController < ApplicationController
diff --git a/app/controllers/api/openid_connect/discovery_controller.rb b/app/controllers/api/openid_connect/discovery_controller.rb
index f648e35662b7088b3f6759b047c127f43bbff907..ee93eb8403cca79666743fb77fd4a8c1704e3810 100644
--- a/app/controllers/api/openid_connect/discovery_controller.rb
+++ b/app/controllers/api/openid_connect/discovery_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/app/controllers/api/openid_connect/id_tokens_controller.rb b/app/controllers/api/openid_connect/id_tokens_controller.rb
index 26eb17bdebd261044e59133de3df9bc341627b35..6290948c0987795371089f841e2aeb8b9a18f580 100644
--- a/app/controllers/api/openid_connect/id_tokens_controller.rb
+++ b/app/controllers/api/openid_connect/id_tokens_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/app/controllers/api/openid_connect/token_endpoint_controller.rb b/app/controllers/api/openid_connect/token_endpoint_controller.rb
index 378f0086bf03b100085c6af524e9bfe2287d67dd..10dbbc437499c7217c1421986ceeb3a9a30dc2e4 100644
--- a/app/controllers/api/openid_connect/token_endpoint_controller.rb
+++ b/app/controllers/api/openid_connect/token_endpoint_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class TokenEndpointController < ApplicationController
diff --git a/app/controllers/api/openid_connect/user_applications_controller.rb b/app/controllers/api/openid_connect/user_applications_controller.rb
index f25603a52c0e8851ad324445abf072a2eb1cd562..7cad1fe49a3b8690676f99b76bc44ea9bffbffda 100644
--- a/app/controllers/api/openid_connect/user_applications_controller.rb
+++ b/app/controllers/api/openid_connect/user_applications_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class UserApplicationsController < ApplicationController
diff --git a/app/controllers/api/openid_connect/user_info_controller.rb b/app/controllers/api/openid_connect/user_info_controller.rb
index 666c2a48eea8f566076f50d4a6351c04a521695a..c6669ae4bd593164ac816da64b58d9a0f953bc07 100644
--- a/app/controllers/api/openid_connect/user_info_controller.rb
+++ b/app/controllers/api/openid_connect/user_info_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class UserInfoController < ApplicationController
diff --git a/app/controllers/api/v0/base_controller.rb b/app/controllers/api/v0/base_controller.rb
index 39d331215e1bed3cf3e43224235dc3e532adc994..77805a591e1629c01c21439c9a01927fb5a67796 100644
--- a/app/controllers/api/v0/base_controller.rb
+++ b/app/controllers/api/v0/base_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module V0
     class BaseController < ApplicationController
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 27e793c1b7045c2a342b8e80225fa77ee5135e7f..89411fb4e2c7256ced8fc8a5460110283be78d28 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/aspect_memberships_controller.rb b/app/controllers/aspect_memberships_controller.rb
index 2bfd0c933cf71816d558476120246a4e4b5ff9cf..69fb4098f042f8502ea4d576557fb40a7bf3d9f0 100644
--- a/app/controllers/aspect_memberships_controller.rb
+++ b/app/controllers/aspect_memberships_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb
index 73bdf8cd280956f240a9e45fb32be70eb1199e20..4e0344cc38c47f6c437fa7482d9e12ea63b54035 100644
--- a/app/controllers/aspects_controller.rb
+++ b/app/controllers/aspects_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/blocks_controller.rb b/app/controllers/blocks_controller.rb
index 7ad4f2e1c424af87f6c8c9e51fdcf95ea6e2d313..a9bcae865fefda0d96027ce283657564c8197f05 100644
--- a/app/controllers/blocks_controller.rb
+++ b/app/controllers/blocks_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class BlocksController < ApplicationController
   before_action :authenticate_user!
 
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index f9d4ad47d95176ceab20b3de8f1f859c38dee7ab..647d42e354b802dca2ae29cbae2fb873573d6b75 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -11,6 +13,10 @@ class CommentsController < ApplicationController
     head :not_found
   end
 
+  rescue_from Diaspora::NonPublic do
+    authenticate_user!
+  end
+
   def create
     begin
       comment = comment_service.create(params[:post_id], params[:text])
diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb
index ed5999f35701388655ff7fd5857f0bdc03ec9a15..f6205073453711226dae56031dc95fd3bac408ea 100644
--- a/app/controllers/contacts_controller.rb
+++ b/app/controllers/contacts_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/conversation_visibilities_controller.rb b/app/controllers/conversation_visibilities_controller.rb
index 6d40eb3cbfd30b59d5949246f0bfb8a4ccec876c..2e03f6712710a8265b37d1ec548380fa5048332c 100644
--- a/app/controllers/conversation_visibilities_controller.rb
+++ b/app/controllers/conversation_visibilities_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/conversations_controller.rb b/app/controllers/conversations_controller.rb
index 3f197765570b389a64918ebd1e80d32cbf2c4ef0..122a0fbe1162d3b0feb0edaa3f2417992ba2ccf8 100644
--- a/app/controllers/conversations_controller.rb
+++ b/app/controllers/conversations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ConversationsController < ApplicationController
   before_action :authenticate_user!
   respond_to :html, :mobile, :json, :js
@@ -103,12 +105,6 @@ class ConversationsController < ApplicationController
 
       render :layout => true
     else
-      if params[:contact_id]
-        gon.push conversation_prefill: [current_user.contacts.find(params[:contact_id]).person.as_json]
-      elsif params[:aspect_id]
-        gon.push conversation_prefill: current_user.aspects
-                                                   .find(params[:aspect_id]).contacts.map {|c| c.person.as_json }
-      end
       render :layout => false
     end
   end
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index 4799488ae52ad6d8dbe123e22a8e0789445fc21c..2e7e501f2c2eca5cba9e31a2a77b3137fc1fd022 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
 class HelpController < ApplicationController
 end
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index 74c2b6532019789a3976f5ec7e658cfdcd4e1699..feaddad147aac1d9b064856318ff208219e7053b 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/invitation_codes_controller.rb b/app/controllers/invitation_codes_controller.rb
index 0f4302953aa1cdf13c5fcdd6fd6e99d74c8afa2c..318df13288579d24aef2a6494f112aac766d39f0 100644
--- a/app/controllers/invitation_codes_controller.rb
+++ b/app/controllers/invitation_codes_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class InvitationCodesController < ApplicationController
   before_action :ensure_valid_invite_code
 
diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb
index 04927022cbb28c06ef26ff70366d2d9cd8c648ab..c6a5f516c7b8e5f572569f827e1ac4f66a28c24c 100644
--- a/app/controllers/invitations_controller.rb
+++ b/app/controllers/invitations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb
index 1827609512977e0022a0345b60e0d9cfd1f8699f..bdc43809f18040fbfe8dbf7814a891855e09e2f2 100644
--- a/app/controllers/likes_controller.rb
+++ b/app/controllers/likes_controller.rb
@@ -1,15 +1,21 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 class LikesController < ApplicationController
   include ApplicationHelper
-  before_action :authenticate_user!
+  before_action :authenticate_user!, except: :index
 
   respond_to :html,
              :mobile,
              :json
 
+  rescue_from Diaspora::NonPublic do
+    authenticate_user!
+  end
+
   def create
     like = like_service.create(params[:post_id])
   rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index a217aab8772d3b9f26ea652f135a0df9a8cc1a34..7a20863f5df1bce80999d9d2feef8205055acb31 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/node_info_controller.rb b/app/controllers/node_info_controller.rb
index aaf9b68d8836862d3f99a9c8d45370184da83765..cb831a595f9cd0be8f4c9819f87b601186f7c87b 100644
--- a/app/controllers/node_info_controller.rb
+++ b/app/controllers/node_info_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class NodeInfoController < ApplicationController
   def jrd
     render json: NodeInfo.jrd(CGI.unescape(node_info_url("123.123").sub("123.123", "%{version}")))
diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb
index 0d1714ea0ba010a0cc7c6a49a24b14ae04b9c8b9..736389a64ab4b4cddafb073cd4b36bdb84c612f2 100644
--- a/app/controllers/notifications_controller.rb
+++ b/app/controllers/notifications_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -32,13 +34,13 @@ class NotificationsController < ApplicationController
     @notifications = WillPaginate::Collection.create(page, per_page, Notification.where(conditions).count ) do |pager|
       result = Notification.where(conditions)
                            .includes(:target, :actors => :profile)
-                           .order('created_at desc')
+                           .order("updated_at desc")
                            .limit(pager.per_page)
                            .offset(pager.offset)
 
       pager.replace(result)
     end
-    @group_days = @notifications.group_by{|note| note.created_at.strftime('%Y-%m-%d')}
+    @group_days = @notifications.group_by {|note| note.updated_at.strftime("%Y-%m-%d") }
 
     @unread_notification_count = current_user.unread_notifications.count
 
diff --git a/app/controllers/participations_controller.rb b/app/controllers/participations_controller.rb
index 1cb9b7b40f2798bc0ae44fb01c41fdfc94585a79..e2d686e5ddd2dd8e3f7b72500e4f9615baff6214 100644
--- a/app/controllers/participations_controller.rb
+++ b/app/controllers/participations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ParticipationsController < ApplicationController
   before_action :authenticate_user!
 
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index f42a4d90850d06bd3c40479a3d0557c5427b5537..c47ff2ae2772ed79b8f49eb85370fe7f603fb9f5 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -187,7 +189,7 @@ class PeopleController < ApplicationController
   end
 
   def diaspora_id?(query)
-    !(query.nil? || query.lstrip.empty?) && Validation::Rule::DiasporaId.new.valid_value?(query)
+    !(query.nil? || query.lstrip.empty?) && Validation::Rule::DiasporaId.new.valid_value?(query.downcase).present?
   end
 
   # view this profile on the home pod, if you don't want to sign in...
diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb
index a95fdb42001d599fc3df14b29c5ed6ea8bcedf41..8ebc0908c01835e21c52695f71e33a9384682639 100644
--- a/app/controllers/photos_controller.rb
+++ b/app/controllers/photos_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/poll_participations_controller.rb b/app/controllers/poll_participations_controller.rb
index a8b874fca1662ba3c562201a11aef17fa7ba3bb6..555d5316811b4d86f46e7dd25ac0891c66fb841d 100644
--- a/app/controllers/poll_participations_controller.rb
+++ b/app/controllers/poll_participations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PollParticipationsController < ApplicationController
   before_action :authenticate_user!
 
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index 9d6b3258c56a0b9e934edf2bf9193782cc2061c9..0ec36f7364ba4774d8cac2194d80e15ff6e8047c 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -6,7 +8,7 @@ class PostsController < ApplicationController
   before_action :authenticate_user!, only: %i(destroy mentionable)
   before_action :set_format_if_malformed_from_status_net, only: :show
 
-  respond_to :html, :mobile, :json, :xml
+  respond_to :html, :mobile, :json
 
   rescue_from Diaspora::NonPublic do
     authenticate_user!
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index 9daa4640d1ece23179267b42c2f0f92e2016980b..83f8fd86b924814e5ef0f148a3bc29bb3f8a4307 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 561c52ea0945064f7b5d1a5d25959656ba92f8a7..1224160fd07b5fb306e179bb92736f4b142dcc0a 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb
index f51d2d043050e1aabcfb6b343ff0bf77a0a85bee..b6016e081d3b941695911fabe4182ff21a0ecf95 100644
--- a/app/controllers/report_controller.rb
+++ b/app/controllers/report_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/reshares_controller.rb b/app/controllers/reshares_controller.rb
index d38f49f6aae8ed34ccbf94eedd51dfb70dfe662e..d98487dbcec387e500952bfc24fd34363251ac8f 100644
--- a/app/controllers/reshares_controller.rb
+++ b/app/controllers/reshares_controller.rb
@@ -1,5 +1,7 @@
+# frozen_string_literal: true
+
 class ResharesController < ApplicationController
-  before_action :authenticate_user!
+  before_action :authenticate_user!, except: :index
   respond_to :json
 
   def create
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index e1f754a43d52db290805c13a48af0c9a20a003f1..0e47bcb03e898039f82e0a3ae50a8dfcbe60ba63 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class SearchController < ApplicationController
   before_action :authenticate_user!
 
diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb
index 68a1ba853d857fbbce594047f2c5780872698dbe..6cadc49c7d5b3fe6d7a294ebe8a42884b504b7ac 100644
--- a/app/controllers/services_controller.rb
+++ b/app/controllers/services_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 74fd1f81878a4f6e38f735f5b267f14c7bb98ead..0f3bd1c46d96eb0acfc4b6cf8a4e4bea40ae14dd 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/share_visibilities_controller.rb b/app/controllers/share_visibilities_controller.rb
index bf1ea1f109c9f408036e6ba723905e7a39c47240..1cc33c11b5532d33f8a5ea6e5fa9aec8b4616864 100644
--- a/app/controllers/share_visibilities_controller.rb
+++ b/app/controllers/share_visibilities_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/social_relay_controller.rb b/app/controllers/social_relay_controller.rb
index 28cf5065ac59ca076e355028c662144aa6416324..29cea8b4065d5c7a84fa3b3127f4901a315b4540 100644
--- a/app/controllers/social_relay_controller.rb
+++ b/app/controllers/social_relay_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class SocialRelayController < ApplicationController
   respond_to :json
 
diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb
index 58ae46536ea25b4f82ccc3a4005d017809699f1b..77a4bdf383f6fdbe0da7575201dc247464f49c6a 100644
--- a/app/controllers/status_messages_controller.rb
+++ b/app/controllers/status_messages_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/streams_controller.rb b/app/controllers/streams_controller.rb
index 18ec1837f4316894bb6225d0e8036cb6f90819dc..5e638e80de27ca2a46105545df856d5591fbf3e0 100644
--- a/app/controllers/streams_controller.rb
+++ b/app/controllers/streams_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/tag_followings_controller.rb b/app/controllers/tag_followings_controller.rb
index a82d16dd94b03e128fd67b5ff3952a66df49f54f..a6bedd11351401dcddd2944bab25b8151e531669 100644
--- a/app/controllers/tag_followings_controller.rb
+++ b/app/controllers/tag_followings_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index d201fd905f015b2f61c1f13bc7769d401057da14..5f59958014a756e358a8df0c86722d351cc635f6 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/terms_controller.rb b/app/controllers/terms_controller.rb
index bf2e5da286cef6da2ac1fa202c655f701761c1fa..d8fd057f94d29dd940572fab60bdb2c6c050abe9 100644
--- a/app/controllers/terms_controller.rb
+++ b/app/controllers/terms_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index e6dbb344973146be45b40b6422e68fd214db5941..1f10ebfc20b1e1ee1b59cf887072886f94197830 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/activity_streams_helper.rb b/app/helpers/activity_streams_helper.rb
index b08514404eb3c4b6c191d99e9a9c326713d1555d..c51d1c082556d4cf997cd9568e2691983b7aa4cd 100644
--- a/app/helpers/activity_streams_helper.rb
+++ b/app/helpers/activity_streams_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ActivityStreamsHelper
   def add_activitystreams_author(target, person)
     target.author do |author|
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index b46b272034d75981ed71b8c28bc26d909e3b44b7..f262b288a993fab9f574983e0f6d0e4e825fc14d 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -15,8 +17,9 @@ module ApplicationHelper
     return AppConfig.settings.changelog_url.get if AppConfig.settings.changelog_url.present?
 
     url = "https://github.com/diaspora/diaspora/blob/master/Changelog.md"
-    url.sub!('/master/', "/#{AppConfig.git_revision}/") if AppConfig.git_revision.present?
-    url
+    return url if AppConfig.git_revision.blank?
+
+    url.sub("/master/", "/#{AppConfig.git_revision}/")
   end
 
   def source_url
diff --git a/app/helpers/aspect_global_helper.rb b/app/helpers/aspect_global_helper.rb
index aa8e052c818f301f9a165108650d54e20d152467..49ce5bab4c45036ff02d95ff761d2e25e05a28ce 100644
--- a/app/helpers/aspect_global_helper.rb
+++ b/app/helpers/aspect_global_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/contacts_helper.rb b/app/helpers/contacts_helper.rb
index 3f25d326b3fe03d2faa30e6ba45b81f7d39870d0..0192e359ece3411c95a801d24f9ef8b5fca26813 100644
--- a/app/helpers/contacts_helper.rb
+++ b/app/helpers/contacts_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ContactsHelper
   def start_a_conversation_link(aspect, contacts_size)
     conv_opts = { class: "conversation_button contacts_button"}
diff --git a/app/helpers/conversations_helper.rb b/app/helpers/conversations_helper.rb
index 3c00a2b9dd81c2c377cc1c6e5857134310775fa0..beac7dc4f1fa9fe6a85a5bd86e88db2a9e963b76 100644
--- a/app/helpers/conversations_helper.rb
+++ b/app/helpers/conversations_helper.rb
@@ -1,9 +1,10 @@
+# frozen_string_literal: true
+
 module ConversationsHelper
   def conversation_class(conversation, unread_count, selected_conversation_id)
-    conv_class = unread_count > 0 ? "unread " : ""
-    if selected_conversation_id && conversation.id == selected_conversation_id
-      conv_class << "selected"
-    end
-    conv_class
+    conv_class = unread_count > 0 ? "unread" : ""
+    return conv_class unless selected_conversation_id && conversation.id == selected_conversation_id
+
+    "#{conv_class} selected"
   end
 end
diff --git a/app/helpers/error_messages_helper.rb b/app/helpers/error_messages_helper.rb
index 73b1cab9d6ee433fe8f6cd5e6cffefe8ae139779..b47a0b6677b41152de6bbbecb96f12bf8bebd025 100644
--- a/app/helpers/error_messages_helper.rb
+++ b/app/helpers/error_messages_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/getting_started_helper.rb b/app/helpers/getting_started_helper.rb
index fcb8fbc696dbea3a7c6d7263358601657d2a1e14..4db7f8e643b0ddce73b8703e80e5d0846c768e01 100644
--- a/app/helpers/getting_started_helper.rb
+++ b/app/helpers/getting_started_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/gon_helper.rb b/app/helpers/gon_helper.rb
index f4bb9689d0873adee09e8e3044215b4bf7e7c985..66d753c4657cf26200fe69b18b1224ead8153d3c 100644
--- a/app/helpers/gon_helper.rb
+++ b/app/helpers/gon_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module GonHelper
   def gon_load_contact(contact)
     Gon.preloads[:contacts] ||= []
diff --git a/app/helpers/interim_stream_hackiness_helper.rb b/app/helpers/interim_stream_hackiness_helper.rb
index 4283a8126d974cfa35e576fed2fd64347ae7c06c..888155b002806d6a21a28ff38a37ebdf85b82172 100644
--- a/app/helpers/interim_stream_hackiness_helper.rb
+++ b/app/helpers/interim_stream_hackiness_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module InterimStreamHackinessHelper
   def commenting_disabled?(post)
     return true unless user_signed_in?
diff --git a/app/helpers/invitation_codes_helper.rb b/app/helpers/invitation_codes_helper.rb
index 991cb826c5058ed32c1b3e9cd3c903c0e7b60f59..0f211a9cfca8f8928cfe728e836e1b51a3c9941e 100644
--- a/app/helpers/invitation_codes_helper.rb
+++ b/app/helpers/invitation_codes_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module InvitationCodesHelper
   def invite_hidden_tag(invite)
     if invite.present?
diff --git a/app/helpers/jsxc_helper.rb b/app/helpers/jsxc_helper.rb
index 9c07dcd6a7dc11492e88ba7156df43b3e7d18c52..d94597d5518b625ecd7ac22a60b8ddd3c2cf0edf 100644
--- a/app/helpers/jsxc_helper.rb
+++ b/app/helpers/jsxc_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module JsxcHelper
   def get_bosh_endpoint
     proto = AppConfig.chat.server.bosh.proto
diff --git a/app/helpers/language_helper.rb b/app/helpers/language_helper.rb
index 1b890ad34921b742de0e75e72786d8b53a724042..3c742c2f44ea05fc16106d6d3fa7a1db8808ed4f 100644
--- a/app/helpers/language_helper.rb
+++ b/app/helpers/language_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module LanguageHelper
   include ApplicationHelper
 
diff --git a/app/helpers/layout_helper.rb b/app/helpers/layout_helper.rb
index 23be964eccfc6a71350ed6498b71f70312d72b04..fc55d50bb098dbde6d822b02411a7220b83a39ed 100644
--- a/app/helpers/layout_helper.rb
+++ b/app/helpers/layout_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -50,21 +52,6 @@ module LayoutHelper
     stylesheet_link_tag "#{current_color_theme}/#{view}", media: "all"
   end
 
-  def old_browser_js_support
-    nonced_javascript_tag do
-      <<-JS.html_safe
-        if(Array.isArray === undefined) {
-          Array.isArray = function (arg) {
-            return Object.prototype.toString.call(arg) == '[object Array]';
-          };
-        }
-        if ((window.history) && (window.history.pushState === undefined)) {
-          window.history.pushState = function() { };
-        }
-      JS
-    end
-  end
-
   def flash_messages
     flash.map do |name, msg|
       klass = flash_class name
diff --git a/app/helpers/meta_data_helper.rb b/app/helpers/meta_data_helper.rb
index 7fbe86ab8507bcd8cb928b2a50694e28201bc3dc..03758ed6251efd9271ff044861bbc24b0a6cede3 100644
--- a/app/helpers/meta_data_helper.rb
+++ b/app/helpers/meta_data_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module MetaDataHelper
   include ActionView::Helpers::AssetUrlHelper
   include ActionView::Helpers::TagHelper
diff --git a/app/helpers/mobile_helper.rb b/app/helpers/mobile_helper.rb
index 6d8f008dcd55bd64f4767077468d187e54d60dab..bdc92d7e6a1f5876784a7a0f0a1afb0596ee692f 100644
--- a/app/helpers/mobile_helper.rb
+++ b/app/helpers/mobile_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module MobileHelper
   def mobile_reshare_icon(post)
     if (post.public? || reshare?(post)) && (user_signed_in? && post.author != current_user.person)
diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb
index a8c1a533ff45720d5b760ade62386424697a0350..15f04a327f0171373628f8ffda4f9ce7a486d2c2 100644
--- a/app/helpers/notifications_helper.rb
+++ b/app/helpers/notifications_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationsHelper
   include PeopleHelper
   include PostsHelper
diff --git a/app/helpers/notifier_helper.rb b/app/helpers/notifier_helper.rb
index 7cbb2c4dcb2ff2d4d616ffd8d870e6471da031c9..eaf1ff5972fd4e4e4118bd2e51348f2687a3cb24 100644
--- a/app/helpers/notifier_helper.rb
+++ b/app/helpers/notifier_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotifierHelper
 
   # @param post [Post] The post object.
diff --git a/app/helpers/o_embed_helper.rb b/app/helpers/o_embed_helper.rb
index f30f36bfee45cbd9e7279ae7243c17aa7903dcb5..10aead568961c4e7eb41e378ed2803a7c45f8022 100644
--- a/app/helpers/o_embed_helper.rb
+++ b/app/helpers/o_embed_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module OEmbedHelper
   def o_embed_html(cache)
     data = cache.data
diff --git a/app/helpers/open_graph_helper.rb b/app/helpers/open_graph_helper.rb
index b337616458c0caffc62c2066b23b958fe4602e08..ace0990c8f8721403edad5edbd13babd87113e55 100644
--- a/app/helpers/open_graph_helper.rb
+++ b/app/helpers/open_graph_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module OpenGraphHelper
   def og_html(cache)
     "<a href=\"#{cache.url}\" target=\"_blank\">" +
diff --git a/app/helpers/people_helper.rb b/app/helpers/people_helper.rb
index 18461351e5ea94c4e4c520d63dfe9f146a2cfb83..40c79bb43364f5275d8947edc8cf541bd397100f 100644
--- a/app/helpers/people_helper.rb
+++ b/app/helpers/people_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -24,11 +26,9 @@ module PeopleHelper
   end
 
   def person_link(person, opts={})
-    opts[:class] ||= ""
-    opts[:class] << " self" if defined?(user_signed_in?) && user_signed_in? && current_user.person == person
-    opts[:class] << " hovercardable" if defined?(user_signed_in?) && user_signed_in? && current_user.person != person
+    css_class = person_link_class(person, opts[:class])
     remote_or_hovercard_link = Rails.application.routes.url_helpers.person_path(person).html_safe
-    "<a data-hovercard='#{remote_or_hovercard_link}' href='#{remote_or_hovercard_link}' class='#{opts[:class]}'>"\
+    "<a data-hovercard='#{remote_or_hovercard_link}' href='#{remote_or_hovercard_link}' class='#{css_class}'>"\
       "#{html_escape_once(opts[:display_name] || person.name)}</a>"\
       .html_safe
   end
@@ -44,11 +44,9 @@ module PeopleHelper
     if opts[:to] == :photos
       link_to person_image_tag(person, opts[:size]), person_photos_path(person)
     else
-      opts[:class] ||= ""
-      opts[:class] << " self" if defined?(user_signed_in?) && user_signed_in? && current_user.person == person
-      opts[:class] << " hovercardable" if defined?(user_signed_in?) && user_signed_in? && current_user.person != person
+      css_class = person_link_class(person, opts[:class])
       remote_or_hovercard_link = Rails.application.routes.url_helpers.person_path(person).html_safe
-      "<a href='#{remote_or_hovercard_link}' class='#{opts[:class]}' #{ ("target=" + opts[:target]) if opts[:target]}>
+      "<a href='#{remote_or_hovercard_link}' class='#{css_class}' #{('target=' + opts[:target]) if opts[:target]}>
       #{person_image_tag(person, opts[:size])}
       </a>".html_safe
     end
@@ -77,4 +75,14 @@ module PeopleHelper
       return Rails.application.routes.url_helpers.person_path(person, opts)
     end
   end
+
+  private
+
+  def person_link_class(person, css_class)
+    return css_class unless defined?(user_signed_in?) && user_signed_in?
+
+    return "#{css_class} self" if current_user.person == person
+
+    "#{css_class} hovercardable"
+  end
 end
diff --git a/app/helpers/posts_helper.rb b/app/helpers/posts_helper.rb
index 59c12ded6bb6f9321fb652446c919ce6bc830cc2..c8eb3954eb64db002387672041441f5748589e64 100644
--- a/app/helpers/posts_helper.rb
+++ b/app/helpers/posts_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb
index 20351d62050178ef73d5d97fbaaa714885b296fb..76666c327e18c8387011b38149cb11ef91db9b3a 100644
--- a/app/helpers/profile_helper.rb
+++ b/app/helpers/profile_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/publisher_helper.rb b/app/helpers/publisher_helper.rb
index 472f29685b697df6149e76de13e5f11a07745aac..905d216c77c3721e58241f53ce16c0a28e6ee744 100644
--- a/app/helpers/publisher_helper.rb
+++ b/app/helpers/publisher_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/report_helper.rb b/app/helpers/report_helper.rb
index 248587d946bdd9eb32c8246c77a99cfa36a27ab0..9fbcb0a201d097cc8d10922105b050b475cd4932 100644
--- a/app/helpers/report_helper.rb
+++ b/app/helpers/report_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
index 9fbe7bd29b782445b020e2a976b8f546bce5906b..8a2c1247a3c3020bb2e654c1ea97688d435926fc 100644
--- a/app/helpers/services_helper.rb
+++ b/app/helpers/services_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ServicesHelper
   def contact_proxy(friend)
     friend.contact || contact_proxy_template.dup.tap {|c| c.person = friend.person }
diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb
index 716b12fed41f5d7da4b20d1e9fa96ac9b73fe585..5d2de6259d93bce7f6c9aa35b86cf691b05d00db 100644
--- a/app/helpers/sessions_helper.rb
+++ b/app/helpers/sessions_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module SessionsHelper
   def prefilled_username
     uri = Addressable::URI.parse(session["user_return_to"])
diff --git a/app/helpers/statistics_helper.rb b/app/helpers/statistics_helper.rb
index 1cbe5aff38a637edf568afa16dc767cede2db7c8..f3f73b117ebf4c2032a74b35346897c51fd8fe63 100644
--- a/app/helpers/statistics_helper.rb
+++ b/app/helpers/statistics_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/stream_helper.rb b/app/helpers/stream_helper.rb
index fc30a0457a653459b35b59d1388ea17f6131437c..cada31f8b7db5316792280cdb65273229c6de664 100644
--- a/app/helpers/stream_helper.rb
+++ b/app/helpers/stream_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb
index 28f46f71917e89f6e2133263547db3cef2140bcf..e6f7396204c21e4ff250d629e2f4a5f5ca7cac92 100644
--- a/app/helpers/tags_helper.rb
+++ b/app/helpers/tags_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module TagsHelper
   def looking_for_tag_link
     return if search_query.include?('@') || normalize_tag_name(search_query).blank?
diff --git a/app/helpers/user_applications_helper.rb b/app/helpers/user_applications_helper.rb
index 190c43580eb1ea2270cdf3f094cde6b8974574b0..8d301d851ec1f913d279f9e4f3797a2294f91e3a 100644
--- a/app/helpers/user_applications_helper.rb
+++ b/app/helpers/user_applications_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module UserApplicationsHelper
   def user_application_name(app)
     if app.name?
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 5d181ea9c70f2470990370179fd8336ca5a1ee70..3b71c0d6686c60ba357815253c14fc8732ee7fc4 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module UsersHelper
   def owner_image_tag(size=nil)
     person_image_tag(current_user.person, size)
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
index e5ed1ffd07db2727fa45d8f1ab268fd5410c4608..557a1481821ced61c8f00f22e10e9ca2870a955d 100644
--- a/app/mailers/application_mailer.rb
+++ b/app/mailers/application_mailer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ApplicationMailer < ActionMailer::Base
   default from: "\"#{AppConfig.settings.pod_name}\" <#{AppConfig.mail.sender_address}>"
 end
diff --git a/app/mailers/diaspora_devise_mailer.rb b/app/mailers/diaspora_devise_mailer.rb
index 069b488b5d52a2d9f801692f5acdf899ec1055e2..7538e3f4027a32330498c4e277eac7f006f02a99 100644
--- a/app/mailers/diaspora_devise_mailer.rb
+++ b/app/mailers/diaspora_devise_mailer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class DiasporaDeviseMailer < Devise::Mailer
   default from: "\"#{AppConfig.settings.pod_name}\" <#{AppConfig.mail.sender_address}>"
 
diff --git a/app/mailers/export_mailer.rb b/app/mailers/export_mailer.rb
index 5139be7349df56feb940cdc4d873b8dbed02d512..da4af5f30b5c585db6f0509ca342e1154a1a32bf 100644
--- a/app/mailers/export_mailer.rb
+++ b/app/mailers/export_mailer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ExportMailer < ApplicationMailer
   def export_complete_for(user)
     @user = user
diff --git a/app/mailers/maintenance.rb b/app/mailers/maintenance.rb
index 185b4f949d4bcdba170da22e892ca56811f05bc2..1ff5d4ac30cd77f96ac57feb2fec814a97b81b0f 100644
--- a/app/mailers/maintenance.rb
+++ b/app/mailers/maintenance.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Maintenance < ApplicationMailer
   def account_removal_warning(user)
     @user = user
diff --git a/app/mailers/notification_mailers/also_commented.rb b/app/mailers/notification_mailers/also_commented.rb
index c6c4da8dec864d4127f6b19992987587998c3605..ecab38febca36bf1b0e010548d8dd792e8fac5e3 100644
--- a/app/mailers/notification_mailers/also_commented.rb
+++ b/app/mailers/notification_mailers/also_commented.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class AlsoCommented < NotificationMailers::Base
     attr_accessor :comment
diff --git a/app/mailers/notification_mailers/base.rb b/app/mailers/notification_mailers/base.rb
index a8496df47700a1a4bbd8ef8beaf938b17e8ee291..8aa3d28c63f13b20b86b440fbdbb3fa30afecbb1 100644
--- a/app/mailers/notification_mailers/base.rb
+++ b/app/mailers/notification_mailers/base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class Base
     include Diaspora::Logging
@@ -52,7 +54,7 @@ module NotificationMailers
     def log_mail(recipient_id, sender_id, type)
       log_string = "event=mail mail_type=#{type} recipient_id=#{recipient_id} sender_id=#{sender_id} " \
                    " recipient_handle=#{@recipient.diaspora_handle}"
-      log_string << " sender_handle=#{@sender.diaspora_handle}" if sender_id.present?
+      log_string = "#{log_string} sender_handle=#{@sender.diaspora_handle}" if sender_id.present?
 
       logger.info log_string
     end
diff --git a/app/mailers/notification_mailers/comment_on_post.rb b/app/mailers/notification_mailers/comment_on_post.rb
index c9957e86fdc8f8937ab5017e3768def52fcae53b..34b8b8a30febb18efbac9fe34573cd83ec156261 100644
--- a/app/mailers/notification_mailers/comment_on_post.rb
+++ b/app/mailers/notification_mailers/comment_on_post.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class CommentOnPost < NotificationMailers::Base
     attr_accessor :comment
diff --git a/app/mailers/notification_mailers/confirm_email.rb b/app/mailers/notification_mailers/confirm_email.rb
index 3a6256f73109c54188e41cd008bbf4ea9bcf0f14..15e2b29b0447f9353978bc42bcc9826584da1232 100644
--- a/app/mailers/notification_mailers/confirm_email.rb
+++ b/app/mailers/notification_mailers/confirm_email.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class ConfirmEmail < NotificationMailers::Base
     def set_headers
diff --git a/app/mailers/notification_mailers/csrf_token_fail.rb b/app/mailers/notification_mailers/csrf_token_fail.rb
index 435f9d87bea7d5756cee1b76617a1e76ea6c272f..f97a9995d20a59ccbe5f56c4cc617a0a67d64224 100644
--- a/app/mailers/notification_mailers/csrf_token_fail.rb
+++ b/app/mailers/notification_mailers/csrf_token_fail.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class CsrfTokenFail < NotificationMailers::Base
     def set_headers
diff --git a/app/mailers/notification_mailers/liked.rb b/app/mailers/notification_mailers/liked.rb
index c9067bf74e36003a6933a54f7499e059d3c553c9..00fd55e3bfa84a8eca8f0cf50ae670263cef680c 100644
--- a/app/mailers/notification_mailers/liked.rb
+++ b/app/mailers/notification_mailers/liked.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class Liked < NotificationMailers::Base
     attr_accessor :like
diff --git a/app/mailers/notification_mailers/mentioned.rb b/app/mailers/notification_mailers/mentioned.rb
index e72c2074d950e74d789b328534f8adb62188f205..2342a04efde74464033990aea56fa2e9a9e08bad 100644
--- a/app/mailers/notification_mailers/mentioned.rb
+++ b/app/mailers/notification_mailers/mentioned.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class Mentioned < NotificationMailers::Base
     attr_accessor :post
diff --git a/app/mailers/notification_mailers/mentioned_in_comment.rb b/app/mailers/notification_mailers/mentioned_in_comment.rb
index 0e9a51bbae4d48927711e3166bc0867ee6990d27..056226ffda942ae6cf7acae3918558f3f151f9d1 100644
--- a/app/mailers/notification_mailers/mentioned_in_comment.rb
+++ b/app/mailers/notification_mailers/mentioned_in_comment.rb
@@ -1,8 +1,10 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class MentionedInComment < NotificationMailers::Base
     attr_reader :comment
 
-    def set_headers(target_id) # rubocop:disable Style/AccessorMethodName
+    def set_headers(target_id) # rubocop:disable Naming/AccessorMethodName
       @comment = Mention.find_by_id(target_id).mentions_container
 
       @headers[:in_reply_to] = @headers[:references] = "<#{@comment.parent.guid}@#{AppConfig.pod_uri.host}>"
diff --git a/app/mailers/notification_mailers/private_message.rb b/app/mailers/notification_mailers/private_message.rb
index 60a5013e8912af31e79a749c1fa3292aecdee257..7c3ac47dcd179fedbb95ba266907383c029806d2 100644
--- a/app/mailers/notification_mailers/private_message.rb
+++ b/app/mailers/notification_mailers/private_message.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class PrivateMessage < NotificationMailers::Base
     attr_accessor :message, :conversation, :participants
diff --git a/app/mailers/notification_mailers/reshared.rb b/app/mailers/notification_mailers/reshared.rb
index e98b986abcda9859ae66c3541d3f9441e3bd74da..1b30017a0abb220cf7fd853a7d6b2bb2d11b6a50 100644
--- a/app/mailers/notification_mailers/reshared.rb
+++ b/app/mailers/notification_mailers/reshared.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class Reshared < NotificationMailers::Base
     attr_accessor :reshare
diff --git a/app/mailers/notification_mailers/started_sharing.rb b/app/mailers/notification_mailers/started_sharing.rb
index bc4a8dd44dda59638939f00ecf615f5dc7073062..c66749c9c5d2758d19672e0e48d6cc50b7b0c445 100644
--- a/app/mailers/notification_mailers/started_sharing.rb
+++ b/app/mailers/notification_mailers/started_sharing.rb
@@ -1,6 +1,8 @@
+# frozen_string_literal: true
+
 module NotificationMailers
   class StartedSharing < NotificationMailers::Base
-    def set_headers(*_args) # rubocop:disable Style/AccessorMethodName
+    def set_headers(*_args) # rubocop:disable Naming/AccessorMethodName
       @headers[:subject] = I18n.t("notifier.started_sharing.subject", name: @sender.name)
     end
   end
diff --git a/app/mailers/notifier.rb b/app/mailers/notifier.rb
index 187c7b0ed89e0c7450e8c58e767b465f99432f23..47c3b71bf059628b3530030e1ee0dc9a4d621016 100644
--- a/app/mailers/notifier.rb
+++ b/app/mailers/notifier.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Notifier < ApplicationMailer
   helper :application
   helper :notifier
@@ -37,10 +39,8 @@ class Notifier < ApplicationMailer
     end
   end
 
-  def invite(email, message, inviter, invitation_code, locale)
+  def invite(email, inviter, invitation_code, locale)
     @inviter = inviter
-    @message = message
-    @locale = locale
     @invitation_code = invitation_code
 
     I18n.with_locale(locale) do
diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb
index 0ac76892fa26db37a9bc55ef1a68801a1c63b958..507e02600f40cceacfeb559c577835c4a0353b60 100644
--- a/app/mailers/report_mailer.rb
+++ b/app/mailers/report_mailer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ReportMailer < ApplicationMailer
   def self.new_report(report_id)
     report = Report.find_by_id(report_id)
diff --git a/app/models/account_deletion.rb b/app/models/account_deletion.rb
index b929279bba8a73a6f723824ce14ccfac948c8a0b..31b4683d8dee3e711283c3b95ea1802dfb8aeea3 100644
--- a/app/models/account_deletion.rb
+++ b/app/models/account_deletion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb
index 9d2f451d52f2b948cb87662275c1cc8028cab0f9..ced82ace7b2b9f954d7f2b07c1379b6f64e7c923 100644
--- a/app/models/account_migration.rb
+++ b/app/models/account_migration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AccountMigration < ApplicationRecord
   include Diaspora::Federated::Base
 
@@ -26,6 +28,7 @@ class AccountMigration < ApplicationRecord
   # executes a migration plan according to this AccountMigration object
   def perform!
     raise "already performed" if performed?
+    validate_sender if locally_initiated?
 
     ActiveRecord::Base.transaction do
       account_deleter.tombstone_person_and_profile
@@ -113,6 +116,10 @@ class AccountMigration < ApplicationRecord
     EphemeralUser.new(old_person.diaspora_handle, old_private_key)
   end
 
+  def validate_sender
+    sender # sender method raises exception when sender can't be instantiated
+  end
+
   def update_all_references
     update_person_references
     update_user_references if user_changed_id_locally?
diff --git a/app/models/acts_as_taggable_on-tag.rb b/app/models/acts_as_taggable_on-tag.rb
index 669a3f6180d6a40eeb1454f34e9f4e6f870aaef9..dc5ece4cc5d6147c3084e84da9e6a19979fe3caa 100644
--- a/app/models/acts_as_taggable_on-tag.rb
+++ b/app/models/acts_as_taggable_on-tag.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ActsAsTaggableOn
   class Tag
 
diff --git a/app/models/api/openid_connect/authorization.rb b/app/models/api/openid_connect/authorization.rb
index a57231552717ee99da1006f5733b520556ec7658..597c815f715a67cd2681ccc832617bd8def11676 100644
--- a/app/models/api/openid_connect/authorization.rb
+++ b/app/models/api/openid_connect/authorization.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Inspired by https://github.com/nov/openid_connect_sample/blob/master/app/models/authorization.rb
 
 module Api
diff --git a/app/models/api/openid_connect/o_auth_access_token.rb b/app/models/api/openid_connect/o_auth_access_token.rb
index e2089fff803a6e65493b1ace4c01b12b42958a1f..fb9f95f81eba9b64653cc2cda39789a6e7aa9e38 100644
--- a/app/models/api/openid_connect/o_auth_access_token.rb
+++ b/app/models/api/openid_connect/o_auth_access_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/app/models/api/openid_connect/o_auth_application.rb b/app/models/api/openid_connect/o_auth_application.rb
index acf2817e42d5f653c0495f75842d9ea5bf7ce517..ee53b6dafb77ce0e14be9152daa19498febebf10 100644
--- a/app/models/api/openid_connect/o_auth_application.rb
+++ b/app/models/api/openid_connect/o_auth_application.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/app/models/api/openid_connect/pairwise_pseudonymous_identifier.rb b/app/models/api/openid_connect/pairwise_pseudonymous_identifier.rb
index 520bc782c054db08e833e9557735dfde98c75eee..5fa3c7db18b9374da2ba7318d0dd7aa4e50f5963 100644
--- a/app/models/api/openid_connect/pairwise_pseudonymous_identifier.rb
+++ b/app/models/api/openid_connect/pairwise_pseudonymous_identifier.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/app/models/application_record.rb b/app/models/application_record.rb
index 10a4cba84df37181f4cf310fd85d8f0aaa5d90ba..71fbba5b32873f53ea6e713ea0219acda01a9286 100644
--- a/app/models/application_record.rb
+++ b/app/models/application_record.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ApplicationRecord < ActiveRecord::Base
   self.abstract_class = true
 end
diff --git a/app/models/aspect.rb b/app/models/aspect.rb
index 4f6054dce06a40e1ee977ba8928a30322a0a8e72..f4e33cfa704cb725d52740b083444ff9ce38ddb8 100644
--- a/app/models/aspect.rb
+++ b/app/models/aspect.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/aspect_membership.rb b/app/models/aspect_membership.rb
index 8901f16a268cf170588fcd567cc62fb117c855f1..87bc6c57451fc25efb88e7e52112964fead8c43a 100644
--- a/app/models/aspect_membership.rb
+++ b/app/models/aspect_membership.rb
@@ -1,18 +1,17 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 class AspectMembership < ApplicationRecord
-
   belongs_to :aspect
   belongs_to :contact
   has_one :user, :through => :contact
   has_one :person, :through => :contact
 
   before_destroy do
-    if self.contact && self.contact.aspects.size == 1
-      self.user.disconnect(self.contact)
-    end
+    user&.disconnect(contact) if contact&.aspects&.size == 1
     true
   end
 
diff --git a/app/models/aspect_visibility.rb b/app/models/aspect_visibility.rb
index be36323cb2569a602f6528a17aeba9143531e9ce..650bd84ffcfb7216d8be83acde5de8f30fab5160 100644
--- a/app/models/aspect_visibility.rb
+++ b/app/models/aspect_visibility.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/block.rb b/app/models/block.rb
index 57b470e58b95e057d4afabe58fae31ee457044a8..f0e79b22bb516c519573e4a5c1d132ccc8da9681 100644
--- a/app/models/block.rb
+++ b/app/models/block.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Block < ApplicationRecord
   belongs_to :person
   belongs_to :user
diff --git a/app/models/comment.rb b/app/models/comment.rb
index 4b6baa250ca10b1007db4ac696fdef241e9c54d3..a766566fca164515b030ac8ea4d2d9b8442a3bfd 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -12,6 +14,7 @@ class Comment < ApplicationRecord
   include Diaspora::Taggable
   include Diaspora::Likeable
   include Diaspora::MentionsContainer
+  include Reference::Source
 
   acts_as_taggable_on :tags
   extract_tags_from :text
@@ -45,7 +48,7 @@ class Comment < ApplicationRecord
 
   after_destroy do
     self.parent.update_comments_counter
-    participation = author.participations.where(target_id: post.id).first
+    participation = author.participations.find_by(target_id: post.id)
     participation.unparticipate! if participation.present?
   end
 
diff --git a/app/models/comment_signature.rb b/app/models/comment_signature.rb
index 9e7aa9270af46fd1e92ef1a7a4449d1a0f0d09d9..d05567636d5ea4849cc6a7eee4195e3f67b33b84 100644
--- a/app/models/comment_signature.rb
+++ b/app/models/comment_signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CommentSignature < ApplicationRecord
   include Diaspora::Signature
 
diff --git a/app/models/contact.rb b/app/models/contact.rb
index 666815d47178eb0e1172d4b1b98e18dd8279651e..2f3dd4e73b9d0b77bcde8025031978b4d6559811 100644
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/conversation.rb b/app/models/conversation.rb
index f597af0017754594dd607ef61e50d45bafaa4522..5197ebd7143e5262ac5593610107d4085ffb6dd0 100644
--- a/app/models/conversation.rb
+++ b/app/models/conversation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Conversation < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
@@ -38,10 +40,10 @@ class Conversation < ApplicationRecord
   end
 
   def set_read(user)
-    if visibility = self.conversation_visibilities.where(:person_id => user.person.id).first
-      visibility.unread = 0
-      visibility.save
-    end
+    visibility = conversation_visibilities.find_by(person_id: user.person.id)
+    return unless visibility
+    visibility.unread = 0
+    visibility.save
   end
 
   def participant_handles
@@ -57,7 +59,7 @@ class Conversation < ApplicationRecord
   def last_author
     return unless @last_author.present? || messages.size > 0
     @last_author_id ||= messages.pluck(:author_id).last
-    @last_author ||= Person.includes(:profile).where(id: @last_author_id).first
+    @last_author ||= Person.includes(:profile).find_by(id: @last_author_id)
   end
 
   def ordered_participants
diff --git a/app/models/conversation_visibility.rb b/app/models/conversation_visibility.rb
index 39e7e66cd971be0c1ecbcfda4613b4063219350e..8501a091799ecbb813dd296ee3a77081e90d9a6c 100644
--- a/app/models/conversation_visibility.rb
+++ b/app/models/conversation_visibility.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ConversationVisibility < ApplicationRecord
 
   belongs_to :conversation
diff --git a/app/models/invitation_code.rb b/app/models/invitation_code.rb
index 1dd5658712aab37af82600a5cf1ecbea939b7e18..428096756e07de4ce936f545b5fc3d145ce89adc 100644
--- a/app/models/invitation_code.rb
+++ b/app/models/invitation_code.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class InvitationCode < ApplicationRecord
   belongs_to :user
 
diff --git a/app/models/like.rb b/app/models/like.rb
index 828d5b8aadb25fe7c70876e0a5b0f5cb26b19f96..70f2745cfce13d1396bd5185530a10a623de2b32 100644
--- a/app/models/like.rb
+++ b/app/models/like.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -30,7 +32,7 @@ class Like < ApplicationRecord
 
   after_destroy do
     self.parent.update_likes_counter
-    participation = author.participations.where(target_id: target.id).first
+    participation = author.participations.find_by(target_id: target.id)
     participation.unparticipate! if participation.present?
   end
 
diff --git a/app/models/like_signature.rb b/app/models/like_signature.rb
index bc21533d47fb60278d5167107bbf6271b57b0292..c0ae04aa5e7dcfa2dcf246bc86fe1902d3cd529d 100644
--- a/app/models/like_signature.rb
+++ b/app/models/like_signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class LikeSignature < ApplicationRecord
   include Diaspora::Signature
 
diff --git a/app/models/location.rb b/app/models/location.rb
index 37132f147a1e9d95ca6424ede242168722dc0ae4..e559442713d64874ddb116abcd0af2b2321f963d 100644
--- a/app/models/location.rb
+++ b/app/models/location.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Location < ApplicationRecord
   before_validation :split_coords, on: :create
   validates_presence_of :lat, :lng
diff --git a/app/models/mention.rb b/app/models/mention.rb
index c5bb859e5835b3750f2673563f1416be44d0eaec..f882e727c5a35f65558c4650b065b3abd93c38a2 100644
--- a/app/models/mention.rb
+++ b/app/models/mention.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/message.rb b/app/models/message.rb
index 95992e6896d89c6c8cbef2a860d68edee78ba956..e0c738d00022b94f66c061b02a297515a8817b12 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -1,8 +1,12 @@
+# frozen_string_literal: true
+
 class Message < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
   include Diaspora::Fields::Author
 
+  include Reference::Source
+
   belongs_to :conversation, touch: true
 
   delegate :name, to: :author, prefix: true
@@ -15,10 +19,10 @@ class Message < ApplicationRecord
   end
 
   def increase_unread(user)
-    if vis = ConversationVisibility.where(:conversation_id => self.conversation_id, :person_id => user.person.id).first
-      vis.unread += 1
-      vis.save
-    end
+    vis = ConversationVisibility.find_by(conversation_id: conversation_id, person_id: user.person.id)
+    return unless vis
+    vis.unread += 1
+    vis.save
   end
 
   def message
diff --git a/app/models/notification.rb b/app/models/notification.rb
index f1adf5325d3df5584383f8e2c890dfdacacb55d8..3f8fe719e8e4a63f0fb90c06b9a5ba8da80210d4 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -1,10 +1,12 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 #
 class Notification < ApplicationRecord
   belongs_to :recipient, class_name: "User"
-  has_many :notification_actors, dependent: :destroy
+  has_many :notification_actors, dependent: :delete_all
   has_many :actors, class_name: "Person", through: :notification_actors, source: :person
   belongs_to :target, polymorphic: true
 
diff --git a/app/models/notification_actor.rb b/app/models/notification_actor.rb
index beaeefbb65509f9979ebb4b407bf3240b663b464..9b1f30796dfbb54dbdefed1c7f141f4be542c161 100644
--- a/app/models/notification_actor.rb
+++ b/app/models/notification_actor.rb
@@ -1,10 +1,10 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 class NotificationActor < ApplicationRecord
-
   belongs_to :notification
   belongs_to :person
-
 end
diff --git a/app/models/notifications/also_commented.rb b/app/models/notifications/also_commented.rb
index cc28c047c4e18b14ea6f32292c486ac01b471e21..35ca33eaeffe8f3fdb0f72aa3408e9b7341d78c8 100644
--- a/app/models/notifications/also_commented.rb
+++ b/app/models/notifications/also_commented.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class AlsoCommented < Notification
     include Notifications::Commented
diff --git a/app/models/notifications/comment_on_post.rb b/app/models/notifications/comment_on_post.rb
index ee3320e39ffcef1eb9fd1e343fc35491f4412c50..002ea5beb01e96587d560d5f16ac6fe1f8cd1c07 100644
--- a/app/models/notifications/comment_on_post.rb
+++ b/app/models/notifications/comment_on_post.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class CommentOnPost < Notification
     include Notifications::Commented
diff --git a/app/models/notifications/commented.rb b/app/models/notifications/commented.rb
index e5b1b7d482047a8fc695170dbe3698580c0d8b70..5754ac76ae53670c043d98280413409ebb48f412 100644
--- a/app/models/notifications/commented.rb
+++ b/app/models/notifications/commented.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   module Commented
     extend ActiveSupport::Concern
diff --git a/app/models/notifications/liked.rb b/app/models/notifications/liked.rb
index 00b33113a5deee2a5d87d9ee148dc48f78ee1bbd..b7033a890e18cacef541e37f1934e4227a8b2e97 100644
--- a/app/models/notifications/liked.rb
+++ b/app/models/notifications/liked.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class Liked < Notification
     def mail_job
diff --git a/app/models/notifications/mentioned.rb b/app/models/notifications/mentioned.rb
index b128791bb12c084f449a7f01b12d12af3414b72a..d49b384d76884074875c52f8f1331f16d149f3a6 100644
--- a/app/models/notifications/mentioned.rb
+++ b/app/models/notifications/mentioned.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   module Mentioned
     extend ActiveSupport::Concern
diff --git a/app/models/notifications/mentioned_in_comment.rb b/app/models/notifications/mentioned_in_comment.rb
index 35ef9b61abaddd3c49a4d7f88375e5f3548ee8f9..844ffe76e60393d49e6444e25ec4bc1584fe8341 100644
--- a/app/models/notifications/mentioned_in_comment.rb
+++ b/app/models/notifications/mentioned_in_comment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class MentionedInComment < Notification
     include Notifications::Mentioned
diff --git a/app/models/notifications/mentioned_in_post.rb b/app/models/notifications/mentioned_in_post.rb
index 35ec36c45d2afc19bd596d9ef3d9deb55b147710..e14d23d64f3582958b733ebbe7a22c9ac3c8d1d3 100644
--- a/app/models/notifications/mentioned_in_post.rb
+++ b/app/models/notifications/mentioned_in_post.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class MentionedInPost < Notification
     include Notifications::Mentioned
diff --git a/app/models/notifications/private_message.rb b/app/models/notifications/private_message.rb
index 89bf0d5fdb99460fad2b4dfe17fcaa5cc6fb7771..db2216808fbf9d818412c832efae735cdfff5bbd 100644
--- a/app/models/notifications/private_message.rb
+++ b/app/models/notifications/private_message.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class PrivateMessage < Notification
     def mail_job
diff --git a/app/models/notifications/reshared.rb b/app/models/notifications/reshared.rb
index 0b438a483eb9204dc8ad45b6975105df38691714..6ad766209413f178b23eb6dd00a4571fb267d44a 100644
--- a/app/models/notifications/reshared.rb
+++ b/app/models/notifications/reshared.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class Reshared < Notification
     def mail_job
diff --git a/app/models/notifications/started_sharing.rb b/app/models/notifications/started_sharing.rb
index dfe6dfd55944a9236968efc535e790e2caca52bc..acf0a3703f79566d537365cbee3c552cc78973d6 100644
--- a/app/models/notifications/started_sharing.rb
+++ b/app/models/notifications/started_sharing.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Notifications
   class StartedSharing < Notification
     def mail_job
diff --git a/app/models/o_embed_cache.rb b/app/models/o_embed_cache.rb
index 30967d1bdd631fc90cebe3678bc11627ffdaed8b..a6ca9e7d4ec7271204ff2f56e37fce0fdeafd7fd 100644
--- a/app/models/o_embed_cache.rb
+++ b/app/models/o_embed_cache.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class OEmbedCache < ApplicationRecord
   serialize :data
   validates :data, :presence => true
diff --git a/app/models/open_graph_cache.rb b/app/models/open_graph_cache.rb
index 0aa0a2fe62c825f666d3e6f80c77fb4b6bbec33c..dc297f25b9e93ecc14540578d16f64b8e8811e7b 100644
--- a/app/models/open_graph_cache.rb
+++ b/app/models/open_graph_cache.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class OpenGraphCache < ApplicationRecord
   validates :title, :presence => true
   validates :ob_type, :presence => true
diff --git a/app/models/participation.rb b/app/models/participation.rb
index 4bdda1a92af37a0a0b1fbb9e5fdf7f8de26cba6f..575ad5c522d7cbe94b1c554cf674b0b30af4567e 100644
--- a/app/models/participation.rb
+++ b/app/models/participation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Participation < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
diff --git a/app/models/person.rb b/app/models/person.rb
index 87a0f02cfa18fb8128b990872c536ea4a99a58f2..8745a1179fd7badad27bcdd9ceec11ed050a21e3 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -102,7 +104,7 @@ class Person < ApplicationRecord
   # @param [String] search substring
   # @return [Person::ActiveRecord_Relation]
   scope :find_by_substring, ->(search_str) {
-    search_str.strip!
+    search_str = search_str.strip
     if search_str.blank? || search_str.size < 2
       none
     else
@@ -191,7 +193,7 @@ class Person < ApplicationRecord
 
   def self.find_from_guid_or_username(params)
     p = if params[:id].present?
-          Person.where(:guid => params[:id]).first
+          Person.find_by(guid: params[:id])
         elsif params[:username].present? && u = User.find_by_username(params[:username])
           u.person
         else
diff --git a/app/models/photo.rb b/app/models/photo.rb
index 7fa0c38712e51c3d0aaa4fbc4ddcc0b85b7aa4da..df16ecf4cfe00d598e1864c18ef24f330b616a1c 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2009, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/pod.rb b/app/models/pod.rb
index b88c76cde0c1b4a98d7d9f6c58582347d9ab18b1..c64bf4ce2c1966cce8c117a6efbd2d81bd8e3612 100644
--- a/app/models/pod.rb
+++ b/app/models/pod.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Pod < ApplicationRecord
   enum status: %i(
     unchecked
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 15589d601b37b0338ce20c54ce177877846c1522..40e07906260dc5f680b2f64911e8657ab6756560 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -1,10 +1,12 @@
+# frozen_string_literal: true
+
 class Poll < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
 
   belongs_to :status_message
-  has_many :poll_answers, -> { order 'id ASC' }
-  has_many :poll_participations
+  has_many :poll_answers, -> { order "id ASC" }, dependent: :destroy
+  has_many :poll_participations, dependent: :destroy
   has_one :author, through: :status_message
 
   #forward some requests to status message, because a poll is just attached to a status message and is not sharable itself
@@ -21,19 +23,19 @@ class Poll < ApplicationRecord
 
   def as_json(options={})
     {
-      :poll_id => self.id,
-      :post_id => self.status_message.id,
-      :question => self.question,
-      :poll_answers => self.poll_answers,
-      :participation_count => self.participation_count,
+      poll_id:             id,
+      post_id:             status_message.id,
+      question:            question,
+      poll_answers:        poll_answers,
+      participation_count: participation_count
     }
   end
 
-  def participation_count
-    poll_answers.sum("vote_count")
+  def participation_answer(user)
+    poll_participations.find_by(author_id: user.person.id)
   end
 
-  def already_participated?(user)
-    poll_participations.where(:author_id => user.person.id).present?
+  def participation_count
+    poll_answers.sum("vote_count")
   end
 end
diff --git a/app/models/poll_answer.rb b/app/models/poll_answer.rb
index d91c4e13a8dda82e9e5cb22b921a15eaf602ac82..0c05fdc39c1b22dc131303775b2abc7e05607b02 100644
--- a/app/models/poll_answer.rb
+++ b/app/models/poll_answer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PollAnswer < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
diff --git a/app/models/poll_participation.rb b/app/models/poll_participation.rb
index 24f99f9ef888c20bc96a26ab6a280f633ad458c0..6b2eb823fcdc9731a35f238fc89ed61f50450392 100644
--- a/app/models/poll_participation.rb
+++ b/app/models/poll_participation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PollParticipation < ApplicationRecord
   include Diaspora::Federated::Base
   include Diaspora::Fields::Guid
diff --git a/app/models/poll_participation_signature.rb b/app/models/poll_participation_signature.rb
index a32b8653ed6108a3a771ccb244ee9588b9d2b04a..535d145ce1e56de1f7c9a5195d70fb97d8f8d4c6 100644
--- a/app/models/poll_participation_signature.rb
+++ b/app/models/poll_participation_signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PollParticipationSignature < ApplicationRecord
   include Diaspora::Signature
 
diff --git a/app/models/post.rb b/app/models/post.rb
index 4a6c517441259d9c2fc46fc97a3ba5e2f56e002a..6c62cd137438cac3246a5c49d00ae4488101e7df 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -33,6 +35,10 @@ class Post < ApplicationRecord
     self.touch(:interacted_at)
   end
 
+  before_destroy do
+    reshares.update_all(root_guid: nil) # rubocop:disable Rails/SkipsModelValidations
+  end
+
   #scopes
   scope :includes_for_a_stream, -> {
     includes(:o_embed_cache,
@@ -120,12 +126,12 @@ class Post < ApplicationRecord
 
   def reshare_for(user)
     return unless user
-    reshares.where(:author_id => user.person.id).first
+    reshares.find_by(author_id: user.person.id)
   end
 
   def like_for(user)
     return unless user
-    likes.where(:author_id => user.person.id).first
+    likes.find_by(author_id: user.person.id)
   end
 
   #############
diff --git a/app/models/profile.rb b/app/models/profile.rb
index 949cf8f78864c635204870f58ceabbcb3f863a6d..45b74e2255ae13f6b6dee72247a94039f19a5f4c 100644
--- a/app/models/profile.rb
+++ b/app/models/profile.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/reference.rb b/app/models/reference.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8312ceb61ef450f81d08fa30173e3aa535ca5852
--- /dev/null
+++ b/app/models/reference.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class Reference < ApplicationRecord
+  belongs_to :source, polymorphic: true
+  belongs_to :target, polymorphic: true
+  validates :target_id, uniqueness: {scope: %i[target_type source_id source_type]}
+
+  module Source
+    extend ActiveSupport::Concern
+
+    included do
+      after_create :create_references
+      has_many :references, as: :source, dependent: :destroy
+    end
+
+    def create_references
+      text&.scan(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX)&.each do |author, type, guid|
+        class_name = DiasporaFederation::Entity.entity_class(type).to_s.rpartition("::").last
+        entity = Diaspora::Federation::Mappings.model_class_for(class_name).find_by(guid: guid)
+        references.find_or_create_by(target: entity) if entity.diaspora_handle == author
+      end
+    end
+  end
+
+  module Target
+    extend ActiveSupport::Concern
+
+    included do
+      has_many :referenced_by, as: :target, class_name: "Reference", dependent: :destroy
+    end
+  end
+end
diff --git a/app/models/report.rb b/app/models/report.rb
index 2f28cfc4c63a72089cb260f3f0fc42d6beeb3f3e..ab169e7f12ea02817280e3b5d3060dbda9d61a12 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Report < ApplicationRecord
   validates :user_id, presence: true
   validates :item_id, presence: true
diff --git a/app/models/reshare.rb b/app/models/reshare.rb
index bc6d8bfa1fbcc4ebac04874871839703d475bc65..ecbd6497167497c605f5a4922b7745341ccc9782 100644
--- a/app/models/reshare.rb
+++ b/app/models/reshare.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -5,8 +7,8 @@
 class Reshare < Post
   belongs_to :root, class_name: "Post", foreign_key: :root_guid, primary_key: :guid, optional: true
   validate :root_must_be_public
-  validates_presence_of :root, :on => :create
-  validates_uniqueness_of :root_guid, :scope => :author_id
+  validates :root, presence: true, on: :create, if: proc {|reshare| reshare.author.local? }
+  validates :root_guid, uniqueness: {scope: :author_id}, allow_nil: true
   delegate :author, to: :root, prefix: true
 
   before_validation do
diff --git a/app/models/role.rb b/app/models/role.rb
index 98601bb7b3f99ec776b94236172be7630ce427f5..199381d2861eaa55d29fec82eeaada1b8e3e6034 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # NOTE add the person object you want to attach role to...
 
 class Role < ApplicationRecord
diff --git a/app/models/service.rb b/app/models/service.rb
index 890fc02bc31cd78429df2882ae0b942b619b44d9..590ceed48c128425a52507645dcf6e53b9417630 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -24,7 +26,7 @@ class Service < ApplicationRecord
 
     def first_from_omniauth( auth_hash )
       @@auth = auth_hash
-      where( type: service_type, uid: options[:uid] ).first
+      find_by(type: service_type, uid: options[:uid])
     end
 
     def initialize_from_omniauth( auth_hash )
diff --git a/app/models/services/facebook.rb b/app/models/services/facebook.rb
index cb6c83aa6b79e2420e13b5e3908ce1e26d943e8c..6414a96fb09205bea4f9e6ae82a6c6c441651c1d 100644
--- a/app/models/services/facebook.rb
+++ b/app/models/services/facebook.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Services::Facebook < Service
   include Rails.application.routes.url_helpers
 
diff --git a/app/models/services/tumblr.rb b/app/models/services/tumblr.rb
index 675fe579932b3be86bd590c009e3bb1c10b940d8..59f93ef79a3ae54591c1c0578a4644c215027961 100644
--- a/app/models/services/tumblr.rb
+++ b/app/models/services/tumblr.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Services::Tumblr < Service
   MAX_CHARACTERS = 1000
 
@@ -35,12 +37,11 @@ class Services::Tumblr < Service
   end
 
   def tumblr_template(post, url)
-    html = ''
-    post.photos.each do |photo|
-      html << "![photo](#{photo.url(:scaled_full)})\n\n"
-    end
-    html << post.message.html(mentioned_people: [])
-    html << "\n\n[original post](#{url})"
+    photo_html = post.photos.map {|photo|
+      "![photo](#{photo.url(:scaled_full)})\n\n"
+    }.join
+
+    "#{photo_html}#{post.message.html(mentioned_people: [])}\n\n[original post](#{url})"
   end
 
   def post_opts(post)
diff --git a/app/models/services/twitter.rb b/app/models/services/twitter.rb
index 9e9b10863ba26b6040bd2964a9ba76708a8f2aac..b14791736a90116491be96e8e1ac6316911e8721 100644
--- a/app/models/services/twitter.rb
+++ b/app/models/services/twitter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Services::Twitter < Service
   include Rails.application.routes.url_helpers
 
diff --git a/app/models/services/wordpress.rb b/app/models/services/wordpress.rb
index 503c79507e9666577fc4e3521c23d91e73dcb0dd..6dd29f6a9eee1534b55bf3d43bc50bb23dac3bbe 100644
--- a/app/models/services/wordpress.rb
+++ b/app/models/services/wordpress.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Services
   class Wordpress < Service
     MAX_CHARACTERS = 1000
diff --git a/app/models/share_visibility.rb b/app/models/share_visibility.rb
index 18c920a539fefc5c0ae8d8df2ecc7c7debeab65c..6bb6f7de91afca188b7ebdb0fafcecdb67ee6790 100644
--- a/app/models/share_visibility.rb
+++ b/app/models/share_visibility.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/models/signature_order.rb b/app/models/signature_order.rb
index e65d0fae3750c1b1aaa99d7576b391fe3461d6e4..d9b94545cf688077a5a711d35e49f87f9c4bd14d 100644
--- a/app/models/signature_order.rb
+++ b/app/models/signature_order.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class SignatureOrder < ApplicationRecord
   validates :order, presence: true, uniqueness: true
 end
diff --git a/app/models/status_message.rb b/app/models/status_message.rb
index a0c9d727ba2a66b6758a5209db2d046458e2cec2..a44afca90a726c2af5ef324cbcaa3b750cd2a56c 100644
--- a/app/models/status_message.rb
+++ b/app/models/status_message.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -5,6 +7,9 @@
 class StatusMessage < Post
   include Diaspora::Taggable
 
+  include Reference::Source
+  include Reference::Target
+
   include PeopleHelper
 
   acts_as_taggable_on :tags
@@ -18,7 +23,7 @@ class StatusMessage < Post
   has_many :photos, :dependent => :destroy, :foreign_key => :status_message_guid, :primary_key => :guid
 
   has_one :location
-  has_one :poll, autosave: true
+  has_one :poll, autosave: true, dependent: :destroy
   has_many :poll_participations, through: :poll
 
   attr_accessor :oembed_url
diff --git a/app/models/tag_following.rb b/app/models/tag_following.rb
index bd1cb62d274884b9de2c516a6a30f81abc051d89..6a1647922b824c5a9eb26d5b5f67ea2b05e07a99 100644
--- a/app/models/tag_following.rb
+++ b/app/models/tag_following.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class TagFollowing < ApplicationRecord
   belongs_to :user
   belongs_to :tag, :class_name => "ActsAsTaggableOn::Tag"
diff --git a/app/models/user.rb b/app/models/user.rb
index d596dd9d4f0122cec4e906d9a479244fb82300db..ac16de68200b8035f1ac0ea610c83459c8501f1f 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -88,6 +90,10 @@ class User < ApplicationRecord
 
   after_save :remove_invalid_unconfirmed_emails
 
+  before_destroy do
+    raise "Never destroy users!"
+  end
+
   def self.all_sharing_with_person(person)
     User.joins(:contacts).where(:contacts => {:person_id => person.id})
   end
@@ -176,7 +182,7 @@ class User < ApplicationRecord
       if pref_hash[key] == 'true'
         self.user_preferences.find_or_create_by(email_type: key)
       else
-        block = self.user_preferences.where(:email_type => key).first
+        block = user_preferences.find_by(email_type: key)
         if block
           block.destroy
         end
@@ -289,9 +295,9 @@ class User < ApplicationRecord
   # @return [Like]
   def like_for(target)
     if target.likes.loaded?
-      return target.likes.detect{ |like| like.author_id == self.person.id }
+      target.likes.find {|like| like.author_id == person.id }
     else
-      return Like.where(:author_id => self.person.id, :target_type => target.class.base_class.to_s, :target_id => target.id).first
+      Like.find_by(author_id: person.id, target_type: target.class.base_class.to_s, target_id: target.id)
     end
   end
 
diff --git a/app/models/user/authentication_token.rb b/app/models/user/authentication_token.rb
index ca72950b44f4ac999268010564dfb698ee4cbccf..7cee047c5bed312ca4341df3f2251c61cc08a980 100644
--- a/app/models/user/authentication_token.rb
+++ b/app/models/user/authentication_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class User
   module AuthenticationToken
     extend ActiveSupport::Concern
diff --git a/app/models/user/connecting.rb b/app/models/user/connecting.rb
index 161fb429a088d0477cef87abb393852ff26bf555..4ddd46e3ed56e311376875c4284939ec7d421efc 100644
--- a/app/models/user/connecting.rb
+++ b/app/models/user/connecting.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -32,6 +34,7 @@ class User
       logger.info "event=disconnect user=#{diaspora_handle} target=#{contact.person.diaspora_handle}"
 
       if contact.person.local?
+        raise "FATAL: user entry is missing from the DB. Aborting" if contact.person.owner.nil?
         contact.person.owner.disconnected_by(contact.user.person)
       else
         ContactRetraction.for(contact).defer_dispatch(self)
diff --git a/app/models/user/querying.rb b/app/models/user/querying.rb
index f9ff0f001e0baf498500feae4b493681fe12a732..66dce96acc3ae293fe6c03cced3179674e2e1bd1 100644
--- a/app/models/user/querying.rb
+++ b/app/models/user/querying.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -28,7 +30,7 @@ module User::Querying
 
   def block_for(person)
     return nil unless person
-    self.blocks.where(person_id: person.id).first
+    blocks.find_by(person_id: person.id)
   end
 
   def aspects_with_shareable(base_class_name_or_class, shareable_id)
@@ -38,7 +40,7 @@ module User::Querying
   end
 
   def contact_for_person_id(person_id)
-    Contact.where(:user_id => self.id, :person_id => person_id).includes(:person => :profile).first
+    Contact.includes(person: :profile).find_by(user_id: id, person_id: person_id)
   end
 
   # @param [Person] person
diff --git a/app/models/user/social_actions.rb b/app/models/user/social_actions.rb
index a01789a3cb43ae33740d9baf631a922bb70e1d9d..7a5b41f0a57710dbd51401b0674103a77251a17f 100644
--- a/app/models/user/social_actions.rb
+++ b/app/models/user/social_actions.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module User::SocialActions
   def comment!(target, text, opts={})
     Comment::Generator.new(self, target, text).create!(opts).tap do
@@ -49,7 +51,7 @@ module User::SocialActions
 
   def update_or_create_participation!(target)
     return if target.author == person
-    participation = participations.where(target_id: target).first
+    participation = participations.find_by(target_id: target)
     if participation.present?
       participation.update!(count: participation.count.next)
     else
diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb
index 11ba7038deb9efbb6465706d90d8c7032e4a084a..ef29de6a1b6e3ead0692eb05e37eeb78bc8c6a87 100644
--- a/app/models/user_preference.rb
+++ b/app/models/user_preference.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class UserPreference < ApplicationRecord
   belongs_to :user
 
diff --git a/app/presenters/aspect_membership_presenter.rb b/app/presenters/aspect_membership_presenter.rb
index 28a96e38f203130c4aef55f03b0b62f6e26acd2b..6d19a9099003877fc15ba0367cdb2f93fb01c92c 100644
--- a/app/presenters/aspect_membership_presenter.rb
+++ b/app/presenters/aspect_membership_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AspectMembershipPresenter < BasePresenter
   def initialize(membership)
     @membership = membership
diff --git a/app/presenters/aspect_presenter.rb b/app/presenters/aspect_presenter.rb
index 881be4b3a100f50c342a6f5392f89522562488d9..5f2af2050fb1e1498cb9bab4637e87edb44aa4b7 100644
--- a/app/presenters/aspect_presenter.rb
+++ b/app/presenters/aspect_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AspectPresenter < BasePresenter
   def initialize(aspect)
     @aspect = aspect
diff --git a/app/presenters/avatar_presenter.rb b/app/presenters/avatar_presenter.rb
index c342769e894dc8423837df5548a3a08a05368929..c5ae32b011c99e3568e03679a6aa26f62424f233 100644
--- a/app/presenters/avatar_presenter.rb
+++ b/app/presenters/avatar_presenter.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 class AvatarPresenter < BasePresenter
   DEFAULT_IMAGE = ActionController::Base.helpers.image_path("user/default.png")
 
diff --git a/app/presenters/base_presenter.rb b/app/presenters/base_presenter.rb
index 3c79290e3cfb2cb02a543aa0182069805403ce3e..5a55d147f4ef4e1c64beba91e955798d725f3505 100644
--- a/app/presenters/base_presenter.rb
+++ b/app/presenters/base_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class BasePresenter
   attr_reader :current_user
   include Rails.application.routes.url_helpers
diff --git a/app/presenters/block_presenter.rb b/app/presenters/block_presenter.rb
index 937d057b6abdc393b3506c8963a73ad4f0b6f308..05af1f44adfc426261c322e95e1adbe47695868d 100644
--- a/app/presenters/block_presenter.rb
+++ b/app/presenters/block_presenter.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 class BlockPresenter < BasePresenter
   def base_hash
     { id: id }
diff --git a/app/presenters/comment_presenter.rb b/app/presenters/comment_presenter.rb
index f687ba7b87d43c8aabf527c0e9de6c155c069f0c..c77f64a341ae2f3e76af8aa3743a08f18359fbd8 100644
--- a/app/presenters/comment_presenter.rb
+++ b/app/presenters/comment_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CommentPresenter < BasePresenter
   def initialize(comment)
     @comment = comment
diff --git a/app/presenters/contact_presenter.rb b/app/presenters/contact_presenter.rb
index ae448bbe9d8795b916da16725ce55dc929b6411f..dba67bf20f1546f225f35f2400c0e8425ff5a006 100644
--- a/app/presenters/contact_presenter.rb
+++ b/app/presenters/contact_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ContactPresenter < BasePresenter
   def base_hash
     { id: id,
diff --git a/app/presenters/last_three_comments_decorator.rb b/app/presenters/last_three_comments_decorator.rb
index 04e1c91b344c197685631b5a3e192571d6105633..9812d11d57988d39cf39ccf2175bb0cba7457b2d 100644
--- a/app/presenters/last_three_comments_decorator.rb
+++ b/app/presenters/last_three_comments_decorator.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class LastThreeCommentsDecorator
   def initialize(presenter)
     @presenter = presenter
diff --git a/app/presenters/node_info_presenter.rb b/app/presenters/node_info_presenter.rb
index 1167ab5eacc727e163018502b38cda6450ef0b3b..e0c2c579b937aa15e8c6146ff0f199c6d54cfa61 100644
--- a/app/presenters/node_info_presenter.rb
+++ b/app/presenters/node_info_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class NodeInfoPresenter
   delegate :as_json, :content_type, to: :document
 
@@ -22,6 +24,7 @@ class NodeInfoPresenter
     doc.open_registrations       = open_registrations?
     doc.metadata["nodeName"]     = name
     doc.metadata["xmppChat"]     = chat_enabled?
+    doc.metadata["camo"]         = camo_config
     doc.metadata["adminAccount"] = admin_account
   end
 
@@ -71,6 +74,14 @@ class NodeInfoPresenter
     AppConfig.chat.enabled?
   end
 
+  def camo_config
+    {
+      markdown:   AppConfig.privacy.camo.proxy_markdown_images?,
+      opengraph:  AppConfig.privacy.camo.proxy_opengraph_thumbnails?,
+      remotePods: AppConfig.privacy.camo.proxy_remote_pod_images?
+    }
+  end
+
   def admin_account
     AppConfig.admins.account if AppConfig.admins.account?
   end
diff --git a/app/presenters/o_embed_presenter.rb b/app/presenters/o_embed_presenter.rb
index 4fe98761d5dd56d56464e852590aa8e5962b921e..5e8961460b19fc213f0dd5c1330a7b56c3c85dc9 100644
--- a/app/presenters/o_embed_presenter.rb
+++ b/app/presenters/o_embed_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class OEmbedPresenter
   include PostsHelper
 
diff --git a/app/presenters/person_presenter.rb b/app/presenters/person_presenter.rb
index 1c1cc88a062e0c5f4902adcbc34a2f23dbe37b87..bb415cbf766bd41185103bacc7520042ad2b8f02 100644
--- a/app/presenters/person_presenter.rb
+++ b/app/presenters/person_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PersonPresenter < BasePresenter
   def base_hash
     {
diff --git a/app/presenters/photo_presenter.rb b/app/presenters/photo_presenter.rb
index defed1d9b8542d6569948d22e423b5619e3cc4c0..b67168acedfd5212410db739d303f8422aea3d5b 100644
--- a/app/presenters/photo_presenter.rb
+++ b/app/presenters/photo_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PhotoPresenter < BasePresenter
   def base_hash
     { id: id,
diff --git a/app/presenters/pod_presenter.rb b/app/presenters/pod_presenter.rb
index 7f08b3770c410503089df39e0056c77eafa7a449..a29859dc76bfd0a778b345f1b192da0eb9aa2ed8 100644
--- a/app/presenters/pod_presenter.rb
+++ b/app/presenters/pod_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PodPresenter < BasePresenter
   def base_hash(*_arg)
     {
diff --git a/app/presenters/post_interaction_presenter.rb b/app/presenters/post_interaction_presenter.rb
index 12c999febb57bd0da85d16e30fe51625bc66d350..e27f24d3a29438879a1b7f90fb3a9114d9db3748 100644
--- a/app/presenters/post_interaction_presenter.rb
+++ b/app/presenters/post_interaction_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PostInteractionPresenter
   def initialize(post, current_user)
     @post = post
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index a1187fba9446b6537356cea1941e99b71c73711f..3aada8fab001e01b530b9bb4fa8c3be3a03f8e63 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PostPresenter < BasePresenter
   include PostsHelper
   include MetaDataHelper
@@ -67,7 +69,7 @@ class PostPresenter < BasePresenter
       title:                        title,
       location:                     @post.post_location,
       poll:                         @post.poll,
-      already_participated_in_poll: already_participated_in_poll,
+      poll_participation_answer_id: poll_participation_answer_id,
       participation:                participate?,
       interactions:                 build_interactions_json
     }
@@ -121,10 +123,8 @@ class PostPresenter < BasePresenter
     @post.reshare_for(current_user).try(:as_api_response, :backbone)
   end
 
-  def already_participated_in_poll
-    if @post.poll && user_signed_in?
-      @post.poll.already_participated?(current_user)
-    end
+  def poll_participation_answer_id
+    @post.poll&.participation_answer(current_user)&.poll_answer_id if user_signed_in?
   end
 
   def participate?
diff --git a/app/presenters/profile_presenter.rb b/app/presenters/profile_presenter.rb
index d4e38884d90e53cac1b87dfb3911c70a689aef3b..5ee690e4cce55f423ecc52e2a01b2c32480430b9 100644
--- a/app/presenters/profile_presenter.rb
+++ b/app/presenters/profile_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ProfilePresenter < BasePresenter
   include PeopleHelper
 
diff --git a/app/presenters/service_presenter.rb b/app/presenters/service_presenter.rb
index f44ad8eb7903c5f605532bca16f91055b64fc54d..6a39795c8901f8c2c32728a0ad6ac180c1565550 100644
--- a/app/presenters/service_presenter.rb
+++ b/app/presenters/service_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ServicePresenter < BasePresenter
   def initialize(service)
     @service = service
diff --git a/app/presenters/social_relay_presenter.rb b/app/presenters/social_relay_presenter.rb
index 43af94cd1081b63f4695e5051071854685b41883..5b6bf4746999ccd2eaeea7f0bc31cd165d76e9a8 100644
--- a/app/presenters/social_relay_presenter.rb
+++ b/app/presenters/social_relay_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class SocialRelayPresenter
   def as_json(*)
     {
diff --git a/app/presenters/tag_stream_presenter.rb b/app/presenters/tag_stream_presenter.rb
index 2a3dea229487d585953ca10de14959c07524491f..0f78f01e0cc8834c7f73fcb5ca072dcc04fcd355 100644
--- a/app/presenters/tag_stream_presenter.rb
+++ b/app/presenters/tag_stream_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class TagStreamPresenter < BasePresenter
   def title
     @presentable.display_tag_name
diff --git a/app/presenters/user_application_presenter.rb b/app/presenters/user_application_presenter.rb
index 0bc2ea9d4872d3fb7d47c49f88a77e2861733f80..ee0d170ea2b18ecb2ecdb04959d27ef665421380 100644
--- a/app/presenters/user_application_presenter.rb
+++ b/app/presenters/user_application_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class UserApplicationPresenter
   attr_reader :scopes
 
diff --git a/app/presenters/user_applications_presenter.rb b/app/presenters/user_applications_presenter.rb
index f04b97394032f4cb592f9e06d3eb600e94ff6f0c..18855cbbbf30057e85d961075807ff4943da76ae 100644
--- a/app/presenters/user_applications_presenter.rb
+++ b/app/presenters/user_applications_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class UserApplicationsPresenter
   def initialize(user)
     @user = user
diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb
index 076734d96431e78ec9df05495f1bca56b497a1e2..e9b2053a100526566159907c21491a1e3e300f1f 100644
--- a/app/presenters/user_presenter.rb
+++ b/app/presenters/user_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class UserPresenter
   attr_accessor :user, :aspects_ids
 
diff --git a/app/serializers/export/aspect_serializer.rb b/app/serializers/export/aspect_serializer.rb
index 5507e516a68904298fc514fed5f656aa95b050ff..ceeef754cab9cc4acd12cc39de1b7879b4b3ab96 100644
--- a/app/serializers/export/aspect_serializer.rb
+++ b/app/serializers/export/aspect_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Export
   class AspectSerializer < ActiveModel::Serializer
     attributes :name,
diff --git a/app/serializers/export/contact_serializer.rb b/app/serializers/export/contact_serializer.rb
index 871486777cc0ef67fc83b6974b3885d2dd7e20e5..d078e012231e2a84c6711c811dd6c96ae1c3d411 100644
--- a/app/serializers/export/contact_serializer.rb
+++ b/app/serializers/export/contact_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Export
   class ContactSerializer < ActiveModel::Serializer
     attributes :sharing,
diff --git a/app/serializers/export/others_data_serializer.rb b/app/serializers/export/others_data_serializer.rb
index 96a819c38bb35f2361b7fbd7ea008b1031c10f15..eff06a8067acd0bfbf6a25eb8064d153ebfe0bfe 100644
--- a/app/serializers/export/others_data_serializer.rb
+++ b/app/serializers/export/others_data_serializer.rb
@@ -1,34 +1,35 @@
+# frozen_string_literal: true
+
 module Export
   class OthersDataSerializer < ActiveModel::Serializer
     # Relayables of other people in the archive: comments, likes, participations, poll participations where author is
     # the archive owner
-    has_many :relayables, each_serializer: FederationEntitySerializer
-
-    # Parent posts of user's own relayables. We have to save metadata to use
-    # it in case when posts temporary unavailable on the target pod.
-    has_many :posts, each_serializer: FederationEntitySerializer
+    has_many :relayables, serializer: FlatMapArraySerializer, each_serializer: FederationEntitySerializer
 
-    # Authors of posts where we participated and authors are not in contacts
-    has_many :non_contact_authors, each_serializer: PersonMetadataSerializer
+    def initialize(user_id)
+      @user_id = user_id
+      super(object)
+    end
 
     private
 
+    def object
+      User.find(@user_id)
+    end
+
     def relayables
       %i[comments likes poll_participations].map {|relayable|
-        others_relayables.send(relayable)
-      }.sum
+        others_relayables.send(relayable).find_each(batch_size: 20)
+      }
     end
 
     def others_relayables
       @others_relayables ||= Diaspora::Exporter::OthersRelayables.new(object.person_id)
     end
 
-    def posts
-      @posts ||= Diaspora::Exporter::PostsWithActivity.new(object).query
-    end
-
-    def non_contact_authors
-      Diaspora::Exporter::NonContactAuthors.new(posts, object).query
+    # Avoid calling pointless #embedded_in_root_associations method
+    def serializable_data
+      {}
     end
   end
 end
diff --git a/app/serializers/export/own_post_serializer.rb b/app/serializers/export/own_post_serializer.rb
index 150ecd42780b3d94cf54e4e7f6c79cb5eada1b9e..2813253e547405eabb5d06c579d3449f631cbae0 100644
--- a/app/serializers/export/own_post_serializer.rb
+++ b/app/serializers/export/own_post_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Export
   # This is a serializer for the user's own posts
   class OwnPostSerializer < FederationEntitySerializer
@@ -27,7 +29,7 @@ module Export
     end
 
     def excluded_subscription_key
-      entity.public ? :subscribed_users_ids : :subscribed_pods_uris
+      object.public? ? :subscribed_users_ids : :subscribed_pods_uris
     end
   end
 end
diff --git a/app/serializers/export/own_relayables_serializer.rb b/app/serializers/export/own_relayables_serializer.rb
index a38f83ccf1e29aff2ea53f812143ff28d7091881..5f4033aa5e3933e1a0e19bcbc062f1dc61144fa5 100644
--- a/app/serializers/export/own_relayables_serializer.rb
+++ b/app/serializers/export/own_relayables_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Export
   # This is a serializer for the user's own relayables. We remove signature from the own relayables since it isn't
   # useful and takes space.
diff --git a/app/serializers/export/person_metadata_serializer.rb b/app/serializers/export/person_metadata_serializer.rb
deleted file mode 100644
index 911062e39e2140fd65db9f8a904b303144a5fbfc..0000000000000000000000000000000000000000
--- a/app/serializers/export/person_metadata_serializer.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-module Export
-  class PersonMetadataSerializer < ActiveModel::Serializer
-    attributes :guid,
-               :account_id,
-               :public_key
-
-    private
-
-    def account_id
-      object.diaspora_handle
-    end
-
-    def public_key
-      object.serialized_public_key
-    end
-  end
-end
diff --git a/app/serializers/export/user_serializer.rb b/app/serializers/export/user_serializer.rb
index 09f26d3bdb860cc823f29f6d924ecdfb8125a4cd..f1c4db5a3c99f90769e3dd10d8e2e335e49f30a8 100644
--- a/app/serializers/export/user_serializer.rb
+++ b/app/serializers/export/user_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Export
   class UserSerializer < ActiveModel::Serializer
     attributes :username,
@@ -16,12 +18,31 @@ module Export
     has_many   :followed_tags
     has_many   :post_subscriptions
 
-    has_many :relayables, each_serializer: Export::OwnRelayablesSerializer
+    has_many :relayables, serializer: FlatMapArraySerializer, each_serializer: Export::OwnRelayablesSerializer
+
+    def initialize(user_id, options={})
+      @user_id = user_id
+      super(object, options)
+    end
 
     private
 
+    def object
+      User.find(@user_id)
+    end
+
+    def posts
+      object.posts.find_each(batch_size: 20)
+    end
+
+    def contacts
+      object.contacts.find_each(batch_size: 100)
+    end
+
     def relayables
-      [*comments, *likes, *poll_participations]
+      [comments, likes, poll_participations].map {|relayable|
+        relayable.find_each(batch_size: 20)
+      }
     end
 
     %i[comments likes poll_participations].each {|collection|
@@ -45,5 +66,10 @@ module Export
     def post_subscriptions
       Post.subscribed_by(object).pluck(:guid)
     end
+
+    # Avoid calling pointless #embedded_in_root_associations method
+    def serializable_data
+      {}
+    end
   end
 end
diff --git a/app/serializers/federation_entity_serializer.rb b/app/serializers/federation_entity_serializer.rb
index 0458fc73b548832859914ee5ee7f7a10e05dd3db..22fa74afcd8330b7648a42aa3686cea547296c92 100644
--- a/app/serializers/federation_entity_serializer.rb
+++ b/app/serializers/federation_entity_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # This is an ActiveModel::Serializer based class which uses DiasporaFederation::Entity JSON serialization
 # features in order to serialize local DB objects. To determine a type of entity class to use the same routines
 # are used as for federation messages generation.
@@ -11,6 +13,6 @@ class FederationEntitySerializer < ActiveModel::Serializer
   end
 
   def entity
-    @entity ||= Diaspora::Federation::Entities.build(object)
+    Diaspora::Federation::Entities.build(object)
   end
 end
diff --git a/app/serializers/flat_map_array_serializer.rb b/app/serializers/flat_map_array_serializer.rb
new file mode 100644
index 0000000000000000000000000000000000000000..18f45cd8f0d4b84c29a831780daf259f7babefdd
--- /dev/null
+++ b/app/serializers/flat_map_array_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class FlatMapArraySerializer < ActiveModel::ArraySerializer
+  def serializable_object(options={})
+    @object.flat_map do |subarray|
+      subarray.map do |item|
+        serializer_for(item).serializable_object_with_notification(options)
+      end
+    end
+  end
+end
diff --git a/app/serializers/notification_serializer.rb b/app/serializers/notification_serializer.rb
index c873a9e70d2b28d901d808d221ba55226ba25397..f96a3c1644b268c5b9a4d24ea0ac8e6f1acac6e5 100644
--- a/app/serializers/notification_serializer.rb
+++ b/app/serializers/notification_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class NotificationSerializer < ActiveModel::Serializer
   attributes :id,
              :target_type,
diff --git a/app/serializers/serializer_post_processing.rb b/app/serializers/serializer_post_processing.rb
index ea865be8abf58e1c8c4a0b0e5c6ccae16557f01a..c737503f10c4cacc2b9f9279edce802a265c908d 100644
--- a/app/serializers/serializer_post_processing.rb
+++ b/app/serializers/serializer_post_processing.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # This module encapsulates knowledge about the way AMS works with the serializable object.
 # The main responsibility of this module is to allow changing resulting object just before the
 # JSON serialization happens.
diff --git a/app/serializers/user_info_serializer.rb b/app/serializers/user_info_serializer.rb
index 4ef29f3b7c69a7fa0a11682b6abe10166d10f7d5..7410d60cf3f65fbf1cb70bb349d7bc9410658a92 100644
--- a/app/serializers/user_info_serializer.rb
+++ b/app/serializers/user_info_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class UserInfoSerializer < ActiveModel::Serializer
   attributes :sub, :name, :nickname, :profile, :picture
 
diff --git a/app/services/comment_service.rb b/app/services/comment_service.rb
index 4ec3b8835ebdf6327296faf2d55584af20f1f696..4872d90680129df870794f93276aa765b12fad5f 100644
--- a/app/services/comment_service.rb
+++ b/app/services/comment_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CommentService
   def initialize(user=nil)
     @user = user
diff --git a/app/services/like_service.rb b/app/services/like_service.rb
index 41144047556f3f3b31250066f8aacbff2103abe6..b5623a048f307e8a6a3f7b73cba79deb9d6efeb2 100644
--- a/app/services/like_service.rb
+++ b/app/services/like_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class LikeService
   def initialize(user=nil)
     @user = user
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index b481f1b4c65a5a51a2676646e9d45783633d6b5d..92fd979e8fa4f087068028d1529d87e35c9ca028 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class NotificationService
   NOTIFICATION_TYPES = {
     Comment       => [Notifications::MentionedInComment, Notifications::CommentOnPost, Notifications::AlsoCommented],
diff --git a/app/services/post_service.rb b/app/services/post_service.rb
index 6d35a385d4cfc74d82300bca23cb1c607f813987..a16523125dec160a97d09c7ecde5f9c269ac9c92 100644
--- a/app/services/post_service.rb
+++ b/app/services/post_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PostService
   def initialize(user=nil)
     @user = user
diff --git a/app/services/reshare_service.rb b/app/services/reshare_service.rb
index 01d725647ca49476a7144fa15982b8f9298031d6..c4bd94ff60d3ee4dbf2db3192f768d33279b5b29 100644
--- a/app/services/reshare_service.rb
+++ b/app/services/reshare_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ReshareService
   def initialize(user=nil)
     @user = user
diff --git a/app/services/status_message_creation_service.rb b/app/services/status_message_creation_service.rb
index a262d2e54dad91e876253428cef4d1e3871f5bcd..a0601d07b8fedb8c84bd9bdc7d49f9dd95d34ef1 100644
--- a/app/services/status_message_creation_service.rb
+++ b/app/services/status_message_creation_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class StatusMessageCreationService
   include Rails.application.routes.url_helpers
 
diff --git a/app/uploaders/exported_photos.rb b/app/uploaders/exported_photos.rb
index 0e4465cdd265e2f04a3b39c125023b0312f0128c..b19c4edb1d65e2dea669fa9738eb789b72f1cb15 100644
--- a/app/uploaders/exported_photos.rb
+++ b/app/uploaders/exported_photos.rb
@@ -1,9 +1,10 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 class ExportedPhotos < SecureUploader
-
   def store_dir
     "uploads/users"
   end
@@ -11,7 +12,4 @@ class ExportedPhotos < SecureUploader
   def filename
     "#{model.username}_photos_#{secure_token}.zip" if original_filename.present?
   end
-
-
-
 end
diff --git a/app/uploaders/exported_user.rb b/app/uploaders/exported_user.rb
index f2d309c2beb499b54bcb41e2a390e0c21abf9b34..53201d9186f5f41537fd93bfd5ae45105937ea02 100644
--- a/app/uploaders/exported_user.rb
+++ b/app/uploaders/exported_user.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -12,6 +14,6 @@ class ExportedUser < SecureUploader
   end
 
   def filename
-    "#{model.username}_diaspora_data_#{secure_token}.json.gz"
+    "#{model.username}_diaspora_data_#{secure_token}.json.gz" if original_filename.present?
   end
 end
diff --git a/app/uploaders/processed_image.rb b/app/uploaders/processed_image.rb
index 226d4fd477618ab8682c57919c5e9c4faff6eb68..a9cae62169e6112cabe2ee9a0e4d0812a568f4de 100644
--- a/app/uploaders/processed_image.rb
+++ b/app/uploaders/processed_image.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -10,7 +12,7 @@ class ProcessedImage < CarrierWave::Uploader::Base
   end
 
   def extension_whitelist
-    %w[jpg jpeg png gif tiff]
+    %w[jpg jpeg png gif]
   end
 
   def filename
diff --git a/app/uploaders/secure_uploader.rb b/app/uploaders/secure_uploader.rb
index 08bbed1c733cf5b9534bc39f6736ac2617b3402f..d5e62e77b5e39df12632743dc3a38000f84caaf4 100644
--- a/app/uploaders/secure_uploader.rb
+++ b/app/uploaders/secure_uploader.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class SecureUploader < CarrierWave::Uploader::Base
   protected
   def secure_token(bytes = 16)
diff --git a/app/uploaders/unprocessed_image.rb b/app/uploaders/unprocessed_image.rb
index 10186dd9b1049028d91ecb64df83fc16ca05f4b1..b662f3b408304a5fba7dc030d96689bbbde0bf42 100644
--- a/app/uploaders/unprocessed_image.rb
+++ b/app/uploaders/unprocessed_image.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/views/aspect_memberships/_aspect_membership_dropdown.haml b/app/views/aspect_memberships/_aspect_membership_dropdown.haml
index 0274ba91dc8081697f7a00a24df49ba3a72d5c2e..a7e690c8b28bff3e6045425f727c52d45cf7b3dc 100644
--- a/app/views/aspect_memberships/_aspect_membership_dropdown.haml
+++ b/app/views/aspect_memberships/_aspect_membership_dropdown.haml
@@ -1 +1 @@
-.placeholder.aspect_membership_dropdown
+.placeholder.aspect-membership-dropdown
diff --git a/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml b/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml
index 02ebe2e48319e90efa1e48de93395fe4215640a1..8c4a46ec8f0f603074156de975800ae020abdbe2 100644
--- a/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml
+++ b/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml
@@ -1,5 +1,5 @@
 %div
-  %select.aspect_dropdown.form-control.user_aspects{"name" => "user_aspects", "data-person-id" => @person.id}
+  %select.aspect-dropdown.form-control.user_aspects{"name" => "user_aspects", "data-person-id" => @person.id}
     %option{value: 'list_cover', class: 'list_cover', disabled: 'true', selected: 'true'}
       = t("contacts.index.add_contact")
     - contact = current_user.contact_for(@person)
diff --git a/app/views/aspects/_aspect_dropdown.html.haml b/app/views/aspects/_aspect_dropdown.html.haml
index 226bbc068e9a24edba8d7020b19cd35099e43e0b..04c9ecf96c8cf36981d24ac5547f63baa228b92d 100644
--- a/app/views/aspects/_aspect_dropdown.html.haml
+++ b/app/views/aspects/_aspect_dropdown.html.haml
@@ -6,7 +6,7 @@
     dropdown_css["data-content"] = t("shared.public_explain.visibility_dropdown")
   end
 
-.btn-group.aspect_dropdown
+.btn-group.aspect-dropdown
   %button.btn.btn-default.dropdown-toggle{dropdown_css}
     - if public_selected?(selected_aspects)
       %i.entypo-globe.small#visibility-icon
diff --git a/app/views/aspects/_aspect_stream.haml b/app/views/aspects/_aspect_stream.haml
index 7154d0f505ce706897afabd771db711c4c421291..902528710e9df3dc2e5f14c002a5edda62cccf6c 100644
--- a/app/views/aspects/_aspect_stream.haml
+++ b/app/views/aspects/_aspect_stream.haml
@@ -8,10 +8,10 @@
   = render "publisher/publisher", publisher_aspects_for(stream)
 
 - if current_user.getting_started?
-  .stream#main_stream{:title => popover_with_close_html("3. #{t('.stay_updated')}"),
+  .stream#main-stream{:title => popover_with_close_html("3. #{t('.stay_updated')}"),
     "data-content" => t(".stay_updated_explanation")}
 - else
-  .stream#main_stream
+  .stream#main-stream
 
 #paginate
   .loader.hidden
diff --git a/app/views/comments/_new_comment.mobile.haml b/app/views/comments/_new_comment.mobile.haml
index d58bce9b21f5387bf396228d1d6e7b446e9a435c..8ed7692ffdc1584ab10625ef6eb9baeaf7e3ced9 100644
--- a/app/views/comments/_new_comment.mobile.haml
+++ b/app/views/comments/_new_comment.mobile.haml
@@ -9,7 +9,7 @@
       %fieldset
         = hidden_field_tag :post_id, post_id, id: "post-id-on-#{post_id}"
         .form-group.clearfix
-          = text_area_tag :text, nil, class: "col-md-12 comment_box form-control",
+          = text_area_tag :text, nil, class: "col-md-12 comment-box form-control",
               id: "comment-text-on-#{post_id}", placeholder: t(".comment")
         = submit_tag t(".comment"), :id => "comment-submit-#{post_id}", "data-disable-with" => t(".commenting"),
             "data-reset-with" => t(".comment"), :class => "btn btn-primary btn-block comment-button"
diff --git a/app/views/contacts/index.html.haml b/app/views/contacts/index.html.haml
index a4fc8da4e97b73e6b91259bb4a77d94384b47af5..217f61c5de86191ae8262edb2e9ea51352894918 100644
--- a/app/views/contacts/index.html.haml
+++ b/app/views/contacts/index.html.haml
@@ -8,7 +8,7 @@
         = render "contacts/sidebar"
 
     .col-md-9
-      .stream.contacts.framed-content#people_stream
+      .stream.contacts.framed-content#people-stream
         = render "contacts/header"
 
         - if @contacts_size > 0
diff --git a/app/views/contacts/index.mobile.haml b/app/views/contacts/index.mobile.haml
index 0e27e5dbb928b69325691781da879cfe5c4eca6f..7873bacc0c2dab895f290cf67a951cab6a82e2f9 100644
--- a/app/views/contacts/index.mobile.haml
+++ b/app/views/contacts/index.mobile.haml
@@ -9,7 +9,7 @@
   %h2
     = t(".title")
 
-#people_stream.stream.contacts
+#people-stream.stream.contacts
   - if @contacts.size > 0
     - for contact in @contacts
       = render "people/person", person: contact.person, contact: contact
diff --git a/app/views/contacts/spotlight.haml b/app/views/contacts/spotlight.haml
index 47767a4825971ec84093fa938e7243750e2adf9a..e12010f8da8f3e0c18ccc13d37d55e0a33ebf630 100644
--- a/app/views/contacts/spotlight.haml
+++ b/app/views/contacts/spotlight.haml
@@ -8,7 +8,7 @@
         = render "contacts/sidebar"
 
     .col-md-9
-      .stream.contacts.framed-content#people_stream
+      .stream.contacts.framed-content#people-stream
         .header.clearfix
           - if AppConfig.settings.community_spotlight.suggest_email.present?
             .pull-right
diff --git a/app/views/conversations/_conversation.haml b/app/views/conversations/_conversation.haml
index b9bbd1ceb461c13e2a9019d3da0a1265668c655d..68e4a474612e608c61b15011682dc6eec4f271b3 100644
--- a/app/views/conversations/_conversation.haml
+++ b/app/views/conversations/_conversation.haml
@@ -26,7 +26,7 @@
             = conversation.subject
         .timestamp
           = timeago(conversation.updated_at)
-        .last_author
+        .last-author
           - if conversation.last_author.present?
             = conversation.last_author.name
         .last_message
diff --git a/app/views/conversations/_conversation.mobile.haml b/app/views/conversations/_conversation.mobile.haml
index b2836af1a20f1c604007be159de904b4d62ffa86..2952d33ada87a0ac8e9d930d7de2d45dbf59675e 100644
--- a/app/views/conversations/_conversation.mobile.haml
+++ b/app/views/conversations/_conversation.mobile.haml
@@ -9,7 +9,7 @@
         = render partial: "conversation_subject",
                  locals:  { conversation: conversation, unread_count: visibility.unread }
 
-        .last_author
+        .last-author
           .timestamp
             = timeago(conversation.updated_at)
 
diff --git a/app/views/conversations/index.haml b/app/views/conversations/index.haml
index c60d0d22e6f71969b2a62fed676a7ab4fb132edf..d26d7c78230ed22c8d7013e21d385f8e5d8bb741 100644
--- a/app/views/conversations/index.haml
+++ b/app/views/conversations/index.haml
@@ -22,7 +22,7 @@
               = will_paginate @visibilities, previous_label: "&laquo;", next_label: "&raquo;", inner_window: 1,
                   renderer: WillPaginate::ActionView::BootstrapLinkRenderer
     .col-md-8
-      .conversations-form-container.stream_container
+      .conversations-form-container.stream-container
         #conversation-show{class: @conversation ? "" : "hidden"}
           - if @conversation
             = render 'conversations/show', conversation: @conversation
diff --git a/app/views/conversations/new.html.haml b/app/views/conversations/new.html.haml
index e66a929ddd0050bba4f4d4822b8fdc3e6c34e400..e43e714c4a38a6a2ce5cffbc87dd6f6cdddbc338 100644
--- a/app/views/conversations/new.html.haml
+++ b/app/views/conversations/new.html.haml
@@ -1,2 +1 @@
-= include_gon camel_case: true
-= render 'conversations/new'
+= render "conversations/new"
diff --git a/app/views/devise/passwords/edit.mobile.haml b/app/views/devise/passwords/edit.mobile.haml
index 883260bba8f9132a4fcbf672febd36bd0f1f167a..57f16868262d5f838db1e436c8d5adbadaa1fa3f 100644
--- a/app/views/devise/passwords/edit.mobile.haml
+++ b/app/views/devise/passwords/edit.mobile.haml
@@ -2,7 +2,7 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-#main_stream.stream
+#main-stream.stream
   .login-form
     .login-container
       = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
diff --git a/app/views/devise/passwords/new.mobile.haml b/app/views/devise/passwords/new.mobile.haml
index 1f4f99b1ca0cd01620f911a38f091b829ed0276e..e588d71d045477b4b1e163bccd3203b3dd03a887 100644
--- a/app/views/devise/passwords/new.mobile.haml
+++ b/app/views/devise/passwords/new.mobile.haml
@@ -2,7 +2,7 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-#main_stream.stream
+#main-stream.stream
   .login-form
     .login-container
       = form_for(resource, :as => resource_name, :url => password_path(resource_name)) do |f|
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index a8e8a6e8582040afedf63cdedeb8e174cd0d56a6..a0bc26e8b565348d5076b12baef3f95fa80067ee 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -8,12 +8,6 @@
     %meta{name: "viewport", content: "width=device-width, initial-scale=1"}/
 
     - content_for :javascript do
-      = old_browser_js_support
-
-      <!--[if IE]>
-      = javascript_include_tag :ie
-      <![endif]-->
-
       = javascript_include_tag :main, :templates
       = load_javascript_locales
 
diff --git a/app/views/layouts/application.mobile.haml b/app/views/layouts/application.mobile.haml
index 40ca264a46c8df8f6fd522d20ce4f5cd9d64de53..23312257543b1d9d48d5bfc4a2735778fc0b475b 100644
--- a/app/views/layouts/application.mobile.haml
+++ b/app/views/layouts/application.mobile.haml
@@ -12,7 +12,7 @@
     = render "head"
     = include_color_theme "mobile"
 
-    %meta{name: "viewport", content: "width=device-width, minimum-scale=1 maximum-scale=1"}/
+    %meta{name: "viewport", content: "width=device-width, minimum-scale=1, maximum-scale=1, user-scalable=no"}/
     %meta{name: "HandheldFriendly", content: "True"}/
     %meta{name: "MobileOptimized", content: "320"}/
     %meta{"http-equiv" => "cleartype", :content => "on"}/
diff --git a/app/views/notifications/_notification.haml b/app/views/notifications/_notification.haml
index 23ff76fd383b91cb13c5aa56b8110b0ff50f50d3..cba9824c4d441de3ba56cf840d6dcff25560b9f6 100644
--- a/app/views/notifications/_notification.haml
+++ b/app/views/notifications/_notification.haml
@@ -6,7 +6,7 @@
     - if note.target.present?
       - gon_load_contact(note.contact)
       .pull-right
-        .aspect_membership_dropdown.placeholder{data: {person_id: note.target.id}}
+        .aspect-membership-dropdown.placeholder{data: {person_id: note.target.id}}
 
   .media-object.pull-left
     = person_image_link note.actors.first, :size => :thumb_small, :class => 'hovercardable'
diff --git a/app/views/people/_index.html.haml b/app/views/people/_index.html.haml
index 3980b16d7e222883bacdc36bc36b7559741d4d94..e8afa9529fe74c124c1cd716d0769a4bf31e1dfd 100644
--- a/app/views/people/_index.html.haml
+++ b/app/views/people/_index.html.haml
@@ -1,4 +1,4 @@
-#people_stream
+#people-stream
   - people.each do |person|
     .media.stream-element{id: person.id}
       .media-object.pull-left
diff --git a/app/views/people/_relationship_action.haml b/app/views/people/_relationship_action.haml
index 01593dec7f98e715dfe873bcef4ed5a2c6aeacd7..c05e8dedf70e37868bf54ac8de86328b144dc394 100644
--- a/app/views/people/_relationship_action.haml
+++ b/app/views/people/_relationship_action.haml
@@ -1,5 +1,5 @@
 - unless person == current_user.person
-  .aspect_membership_dropdown.placeholder{data: {person_id: person.id}}
+  .aspect-membership-dropdown.placeholder{data: {person_id: person.id}}
 -else
   %span.thats_you
     = t("people.person.thats_you")
diff --git a/app/views/people/contacts.haml b/app/views/people/contacts.haml
index 3eeddb08354bd06f46899bf590823bcb6c408c3a..b3af8650d9896a88ca08274fdaa8ca13670fb172 100644
--- a/app/views/people/contacts.haml
+++ b/app/views/people/contacts.haml
@@ -11,8 +11,8 @@
       .profile_header
         -# more JS
 
-      .stream_container
-        #people_stream.stream
+      .stream-container
+        #people-stream.stream
           - @hashes.each do |hash|
             = render partial: 'people/person', locals: hash
         = will_paginate @contacts_of_contact, renderer: WillPaginate::ActionView::BootstrapLinkRenderer
diff --git a/app/views/people/index.html.haml b/app/views/people/index.html.haml
index a3c19c069f33eca5ea627a412525216d8eac7c26..912be0d6f0a94283c7db0af4155877b1d624840e 100644
--- a/app/views/people/index.html.haml
+++ b/app/views/people/index.html.haml
@@ -14,7 +14,7 @@
       = search_header
   .row
     .col-md-8
-      #people_stream.stream
+      #people-stream.stream
         - if @hashes.empty?
           %p
             - if @background_query.present?
diff --git a/app/views/people/index.mobile.haml b/app/views/people/index.mobile.haml
index 56255bd14d5127fa0f3f668183709cd5766d9208..a4b91a51d8b756ee1788d7225d6c8c23028d7e5d 100644
--- a/app/views/people/index.mobile.haml
+++ b/app/views/people/index.mobile.haml
@@ -23,7 +23,7 @@
       =t('.no_one_found')
 
   - else
-    #people_stream.stream
+    #people-stream.stream
       - for hash in @hashes
         = render :partial => 'people/person', :locals => hash
 
diff --git a/app/views/people/show.html.haml b/app/views/people/show.html.haml
index 60e70701076de728a6985d5a27152b4af6b4ecf1..1d725f3828448c0ad101edd0aaeefd29966a212e 100644
--- a/app/views/people/show.html.haml
+++ b/app/views/people/show.html.haml
@@ -18,12 +18,12 @@
       .profile_header
         -# more JS
 
-      .stream_container
+      .stream-container
 
         - if user_signed_in? && current_user.person.id == @person.id && !current_page?(person_photos_path(@person))
           = render 'publisher/publisher', publisher_aspects_for(nil)
 
-        .stream.clearfix#main_stream
+        .stream.clearfix#main-stream
           -# JS
 
         #paginate
diff --git a/app/views/people/show.mobile.haml b/app/views/people/show.mobile.haml
index 29120725b30c094b97532a3034172ff56c288398..f35f81cfcb4f0147e244b895a58972b8df3d863a 100644
--- a/app/views/people/show.mobile.haml
+++ b/app/views/people/show.mobile.haml
@@ -19,7 +19,7 @@
 - if @post_type == :photos
   = render "photos/index", photos: @posts
 - else
-  .stream#main_stream
+  .stream#main-stream
     - if @stream.stream_posts.length > 0
       = render "shared/stream", posts: @stream.stream_posts
       = render "shared/stream_more_button"
diff --git a/app/views/photos/_index.mobile.haml b/app/views/photos/_index.mobile.haml
index 0ab13e289daa9609b0e0b745a3685b954d4d73f1..769000edf0bb43f78f6baaa5c2e583b26abfb7d0 100644
--- a/app/views/photos/_index.mobile.haml
+++ b/app/views/photos/_index.mobile.haml
@@ -2,6 +2,6 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-#main_stream
+#main-stream
   - for photo in photos
     = link_to image_tag(photo.url(:thumb_large)), person_photo_path(photo.author, photo), class: "thumbnail"
diff --git a/app/views/publisher/_publisher.html.haml b/app/views/publisher/_publisher.html.haml
index be58264691c336704a950fea246cafe7d262bce9..74ae6c82cd2938aad26aa2a65db830a68b37ac2f 100644
--- a/app/views/publisher/_publisher.html.haml
+++ b/app/views/publisher/_publisher.html.haml
@@ -3,7 +3,7 @@
     = form_for(StatusMessage.new) do |status|
       = status.error_messages
       %params
-        .publisher-textarea-wrapper#publisher_textarea_wrapper
+        .publisher-textarea-wrapper#publisher-textarea-wrapper
           - if current_user.getting_started?
             = status.text_area :text, :rows => 2, :value => h(publisher_formatted_text),
               :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}...",
diff --git a/app/views/publisher/_publisher.mobile.haml b/app/views/publisher/_publisher.mobile.haml
index dd6bcf2b72eeee51a21465e42afc9096065599a1..68681213bb00f23fa5aeda8f3dcc810dfa2ada7d 100644
--- a/app/views/publisher/_publisher.mobile.haml
+++ b/app/views/publisher/_publisher.mobile.haml
@@ -27,7 +27,7 @@
           = "· #{aspect.name}"
 
     .clear
-    #publisher_textarea_wrapper
+    #publisher-textarea-wrapper
       %ul#photodropzone
     #fileInfo-publisher
 
diff --git a/app/views/registrations/new.mobile.haml b/app/views/registrations/new.mobile.haml
index 5f39962b0a0632fecd46a01f460a6ce7a34864cd..99c858cd2e266eec6c2f7175b05859ca47a5cbc6 100644
--- a/app/views/registrations/new.mobile.haml
+++ b/app/views/registrations/new.mobile.haml
@@ -2,7 +2,7 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-.stream#main_stream
+.stream#main-stream
   - flash.each do |name, msg|
     .expose#flash-container
       .flash-message{class: "message alert alert-#{flash_class name}", role: "alert"}
diff --git a/app/views/sessions/new.mobile.haml b/app/views/sessions/new.mobile.haml
index b4422102d4ebc11de02cda2d99020477db136b30..e15f7af03f5a63d092fc0611b68eec8f8c96db31 100644
--- a/app/views/sessions/new.mobile.haml
+++ b/app/views/sessions/new.mobile.haml
@@ -2,7 +2,7 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-.stream#main_stream
+.stream#main-stream
   - flash.each do |name, msg|
     .expose#flash-container
       .flash-message{class: "message alert alert-#{flash_class name}", role: "alert"}
diff --git a/app/views/shared/_photo_area.mobile.haml b/app/views/shared/_photo_area.mobile.haml
index 19417b915513e65f47edbde0e44e3c2bbb7d9cb2..e37a90391cce9ecbfece680c7766dcb8e1683424 100644
--- a/app/views/shared/_photo_area.mobile.haml
+++ b/app/views/shared/_photo_area.mobile.haml
@@ -5,7 +5,7 @@
 .photo_area
   - if post.is_a?(StatusMessage)
     -if post.photos.size > 0
-      .photo_attachments
+      .photo-attachments
         = link_to person_photo_path(post.author, post.photos.first), class: "stream-photo-link" do
           - if post.photos.size > 1
             .additional_photo_count
diff --git a/app/views/status_messages/_status_message.mobile.haml b/app/views/status_messages/_status_message.mobile.haml
index 51881e1da44101891407a97a1d72a8d9d29ea3cc..1758a96cc4e376be78b9f21d74b05c5f107a4ebb 100644
--- a/app/views/status_messages/_status_message.mobile.haml
+++ b/app/views/status_messages/_status_message.mobile.haml
@@ -6,7 +6,7 @@
   .photo_area
     - if post.is_a?(StatusMessage)
       -if post.photos.size > 0
-        .photo_attachments
+        .photo-attachments
           - if post.photos.size > 1
             .additional_photo_count
               = "+ #{post.photos.size-1}"
diff --git a/app/views/streams/main_stream.html.haml b/app/views/streams/main_stream.html.haml
index 3a8b0225aad254c016454502cb8ef3c7d6397513..2dc05a9e123eee3b371adfb075947aaac8d2e834 100644
--- a/app/views/streams/main_stream.html.haml
+++ b/app/views/streams/main_stream.html.haml
@@ -176,7 +176,7 @@
               = link_to t("layouts.application.powered_by"), "https://diasporafoundation.org"
 
     .col-md-9
-      .stream_container#aspect_stream_container
+      .stream-container#aspect-stream-container
         = render "aspects/aspect_stream", stream: @stream
 
       %a.entypo-chevron-up.back-to-top#back-to-top{title: "#{t('layouts.application.back_to_top')}", href: "#"}
diff --git a/app/views/streams/main_stream.mobile.haml b/app/views/streams/main_stream.mobile.haml
index 0ef61801a03b01a087a7bb05f85906872bc265ba..7b84c08e2ef2da4985534eedfca2f7a5af539274 100644
--- a/app/views/streams/main_stream.mobile.haml
+++ b/app/views/streams/main_stream.mobile.haml
@@ -2,6 +2,6 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
-#main_stream.stream
+#main-stream.stream
   = render 'shared/stream', posts: @stream.stream_posts
   = render 'shared/stream_more_button'
diff --git a/app/views/tags/show.haml b/app/views/tags/show.haml
index e81ec8f7e61d4ceb6f7c0dc0adf7cd220684bc81..8f42ba03271cab81db2234d6159917b3b881c612 100644
--- a/app/views/tags/show.haml
+++ b/app/views/tags/show.haml
@@ -20,7 +20,7 @@
           = render partial: "people/index", locals: {people: @stream.tagged_people}
 
     .col-md-9
-      .stream_container
+      .stream-container
         #author_info
           %h2
             = @stream.display_tag_name
@@ -28,7 +28,7 @@
         - if current_user
           = render "publisher/publisher", publisher_aspects_for(@stream)
 
-        #main_stream.stream
+        #main-stream.stream
 
         #paginate
           .loader.hidden
diff --git a/app/views/tags/show.mobile.haml b/app/views/tags/show.mobile.haml
index 4afda991bc616e7bef7797a6ad159689700986e3..1194d0316e06d684899aeeff62928072cbabcbc5 100644
--- a/app/views/tags/show.mobile.haml
+++ b/app/views/tags/show.mobile.haml
@@ -12,7 +12,7 @@
     .btn.btn-danger.tag_following_action{data: {name: @stream.tag_name}}
       = t(".stop_following", tag: @stream.tag_name)
 
-#main_stream.stream
+#main-stream.stream
   = render 'shared/stream', :posts => @stream.stream_posts
   = render 'shared/stream_more_button'
 
diff --git a/app/views/users/public.atom.builder b/app/views/users/public.atom.builder
index 790f6f21a9c942ea2c504be429932ca032b64990..a8b1d7a99f45b8030c1cf3066c3af6561b3d29b0 100644
--- a/app/views/users/public.atom.builder
+++ b/app/views/users/public.atom.builder
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 atom_feed("xmlns:thr"       => "http://purl.org/syndication/thread/1.0",
           "xmlns:georss"    => "http://www.georss.org/georss",
           "xmlns:activity"  => "http://activitystrea.ms/spec/1.0/",
diff --git a/app/workers/base.rb b/app/workers/base.rb
index 874261e239f0c9a263f55bf3cb8bdd9a308d8db9..5d83392ca95a5a6e5c0e955378db20ce303ffbc5 100644
--- a/app/workers/base.rb
+++ b/app/workers/base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/clean_cached_files.rb b/app/workers/clean_cached_files.rb
index ddf2e93d3f4ac4fd47319cfee2e3d1957863c761..585aee30c4c823aa845748d2da0c46a194caf723 100644
--- a/app/workers/clean_cached_files.rb
+++ b/app/workers/clean_cached_files.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class CleanCachedFiles < Base
     sidekiq_options queue: :low
diff --git a/app/workers/deferred_dispatch.rb b/app/workers/deferred_dispatch.rb
index 3c60ade932e3d7690e81d7204212b633e6876c3b..24d2eb1080531a47278493272054b3f609724f12 100644
--- a/app/workers/deferred_dispatch.rb
+++ b/app/workers/deferred_dispatch.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/deferred_retraction.rb b/app/workers/deferred_retraction.rb
index 85ee2c1abf00c82cb323e68c8609a755a988234c..d8a3220fdeea08faada4ec8110e676c67a217fa8 100644
--- a/app/workers/deferred_retraction.rb
+++ b/app/workers/deferred_retraction.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/delete_account.rb b/app/workers/delete_account.rb
index e3aa95eff1f96a8ee3ac5fa2866ac6002a76efa1..677e1456129b3e0832755d0062535fb8967c626a 100644
--- a/app/workers/delete_account.rb
+++ b/app/workers/delete_account.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/delete_post_from_service.rb b/app/workers/delete_post_from_service.rb
index 33b841f6ac524a43c0a26053dcb84d4fc9db675d..c97a7c077436753496f6b2c7c8b55319386ee72a 100644
--- a/app/workers/delete_post_from_service.rb
+++ b/app/workers/delete_post_from_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/export_photos.rb b/app/workers/export_photos.rb
index 3d036462a6ef65a32b4c5fcdd0d2026aa62f621f..2fe4c007f6e7b031b5e13870b146c12febacda0b 100644
--- a/app/workers/export_photos.rb
+++ b/app/workers/export_photos.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/export_user.rb b/app/workers/export_user.rb
index 26fadc1fbafd18a81f6a01a4d33b88a7693ba143..247b8a6e37cb670634486f18d92f19568a62cccd 100644
--- a/app/workers/export_user.rb
+++ b/app/workers/export_user.rb
@@ -1,13 +1,28 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
-
 module Workers
   class ExportUser < Base
     sidekiq_options queue: :low
 
+    include Diaspora::Logging
+
     def perform(user_id)
+      if currently_running_exports >= AppConfig.settings.export_concurrency.to_i
+        logger.info "Already the maximum number of parallel user exports running, " \
+                    "scheduling export for User:#{user_id} in 5 minutes."
+        self.class.perform_in(5.minutes + rand(30), user_id)
+      else
+        export_user(user_id)
+      end
+    end
+
+    private
+
+    def export_user(user_id)
       @user = User.find(user_id)
       @user.perform_export!
 
@@ -17,5 +32,13 @@ module Workers
         ExportMailer.export_failure_for(@user).deliver_now
       end
     end
+
+    def currently_running_exports
+      return 0 if AppConfig.environment.single_process_mode?
+      Sidekiq::Workers.new.count do |process_id, thread_id, work|
+        !(Process.pid.to_s == process_id.split(":")[1] && Thread.current.object_id.to_s(36) == thread_id) &&
+          work["payload"]["class"] == self.class.to_s
+      end
+    end
   end
 end
diff --git a/app/workers/fetch_profile_photo.rb b/app/workers/fetch_profile_photo.rb
index 8eb370ecb631c4f12b3c74138b96442bb3f49047..2a5fc0ba9d1adbafb4e2c9c6772e622c9ce43ded 100644
--- a/app/workers/fetch_profile_photo.rb
+++ b/app/workers/fetch_profile_photo.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/fetch_public_posts.rb b/app/workers/fetch_public_posts.rb
index 228efe81ee2bc976a99575b00ffb9cd79def33f3..c7cb888b69bb0c9b50ea04693bbab4242fad6271 100644
--- a/app/workers/fetch_public_posts.rb
+++ b/app/workers/fetch_public_posts.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/fetch_webfinger.rb b/app/workers/fetch_webfinger.rb
index 182304ef8fd38ccfd3664c11bb8992163ed13308..d2f00b0dca0b17b658ab7fe4dc13b9a78680b116 100644
--- a/app/workers/fetch_webfinger.rb
+++ b/app/workers/fetch_webfinger.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/gather_o_embed_data.rb b/app/workers/gather_o_embed_data.rb
index e6eb695b215f393f4a51c48a367feff771b4d4f3..3ddfd350b869843e84080a1a8dae87ec2cc501a6 100644
--- a/app/workers/gather_o_embed_data.rb
+++ b/app/workers/gather_o_embed_data.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/gather_open_graph_data.rb b/app/workers/gather_open_graph_data.rb
index f962e04119642ccc22f74bf54691b8e4d3080b44..a82802bebfc6efe741373f9ff07bacea4fac3448 100644
--- a/app/workers/gather_open_graph_data.rb
+++ b/app/workers/gather_open_graph_data.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/mail/also_commented.rb b/app/workers/mail/also_commented.rb
index 05a1ef105b1c205afd5df63bc5e3f9ae0495bb5d..25b88d602893018fae6bd0f6d1723a66fa92f792 100644
--- a/app/workers/mail/also_commented.rb
+++ b/app/workers/mail/also_commented.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class AlsoCommented < NotifierBase
diff --git a/app/workers/mail/comment_on_post.rb b/app/workers/mail/comment_on_post.rb
index 168b75237105925f0d94f7012337fec6208112b9..47d371ccdb01ef9291bba73cdf743dca71209962 100644
--- a/app/workers/mail/comment_on_post.rb
+++ b/app/workers/mail/comment_on_post.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class CommentOnPost < NotifierBase
diff --git a/app/workers/mail/confirm_email.rb b/app/workers/mail/confirm_email.rb
index efa9fb64e138fc232ceaf32ba60cdda1a15e8429..a695188530eae53f9cc635be7f2e45a6412ec703 100644
--- a/app/workers/mail/confirm_email.rb
+++ b/app/workers/mail/confirm_email.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class ConfirmEmail < NotifierBase
diff --git a/app/workers/mail/csrf_token_fail.rb b/app/workers/mail/csrf_token_fail.rb
index f9679b8c3aa835fa179e416d6538a65ec789499c..2512f1c64aaa68cc2b3358d2c6bc5467f0ac1025 100644
--- a/app/workers/mail/csrf_token_fail.rb
+++ b/app/workers/mail/csrf_token_fail.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class CsrfTokenFail < NotifierBase
diff --git a/app/workers/mail/invite_email.rb b/app/workers/mail/invite_email.rb
index 0b18841d9e927d669446f35171c2ac553bf317d2..698d16b265519ce97c9b555170d7e148aaf4d105 100644
--- a/app/workers/mail/invite_email.rb
+++ b/app/workers/mail/invite_email.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/mail/liked.rb b/app/workers/mail/liked.rb
index 16471a542645c4702420b6eca4a4decdf407efb0..8d5ca0db24d431d51b77065dea66f2ba4766f091 100644
--- a/app/workers/mail/liked.rb
+++ b/app/workers/mail/liked.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class Liked < NotifierBase
diff --git a/app/workers/mail/mentioned.rb b/app/workers/mail/mentioned.rb
index 4ae477d5417b9e29f093088ed45e02ac205dcfe1..0f12831f24fa4881069da7dc5d752d7b781dcc96 100644
--- a/app/workers/mail/mentioned.rb
+++ b/app/workers/mail/mentioned.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/mail/mentioned_in_comment.rb b/app/workers/mail/mentioned_in_comment.rb
index 5e8d7f91f69a95c85f13b3353512ae3457c8eea3..fa352c0df7204c6283037edb13e6278ee3e909da 100644
--- a/app/workers/mail/mentioned_in_comment.rb
+++ b/app/workers/mail/mentioned_in_comment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class MentionedInComment < NotifierBase
diff --git a/app/workers/mail/notifier_base.rb b/app/workers/mail/notifier_base.rb
index 72cb4acb8067a3a7fd84e27717fe7058b4804303..8e9924a0f8fe68d395b975cbb08125a14ac00b99 100644
--- a/app/workers/mail/notifier_base.rb
+++ b/app/workers/mail/notifier_base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class NotifierBase < Base
diff --git a/app/workers/mail/private_message.rb b/app/workers/mail/private_message.rb
index b851bfed06373a19e611854e39d1174bfbd1f2e0..dd9db64a1e83d4abf8b74a5456f7228ecf56acea 100644
--- a/app/workers/mail/private_message.rb
+++ b/app/workers/mail/private_message.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/mail/report_worker.rb b/app/workers/mail/report_worker.rb
index 8139266e63f35644427bb1d76e337694dc984a8d..101a3b2b8c145b17a37bade1fdd57daf007c9302 100644
--- a/app/workers/mail/report_worker.rb
+++ b/app/workers/mail/report_worker.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class ReportWorker < Base
diff --git a/app/workers/mail/reshared.rb b/app/workers/mail/reshared.rb
index 7e434788dc024e4c49151f4c4417acbf1855e15f..4ddff8329b6c4852b17b6461fa95467120d51086 100644
--- a/app/workers/mail/reshared.rb
+++ b/app/workers/mail/reshared.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   module Mail
     class Reshared < NotifierBase
diff --git a/app/workers/mail/started_sharing.rb b/app/workers/mail/started_sharing.rb
index ef101060cc36ee5caa4867867e0f2419ba2544da..d0a4c9d9d3cb6d11a35d9dfc7a95be728df63a6c 100644
--- a/app/workers/mail/started_sharing.rb
+++ b/app/workers/mail/started_sharing.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/post_to_service.rb b/app/workers/post_to_service.rb
index 933913663634fc90878ac570ed27da57e7f96676..8b3d84507d2c0970a05683b7ba9fd5c1db4fbda7 100644
--- a/app/workers/post_to_service.rb
+++ b/app/workers/post_to_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/process_photo.rb b/app/workers/process_photo.rb
index 1686c520205f3520db6d613c0a7828fac4bcb73f..41ef597d269f51587b7dba1e3fdc832120b02e0a 100644
--- a/app/workers/process_photo.rb
+++ b/app/workers/process_photo.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/publish_to_hub.rb b/app/workers/publish_to_hub.rb
index 7d33daebaff10379d2c553a24f078bfc736bcdee..d3fcff747b712ea4df62bea2e35857de2d1eb425 100644
--- a/app/workers/publish_to_hub.rb
+++ b/app/workers/publish_to_hub.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/queue_users_for_removal.rb b/app/workers/queue_users_for_removal.rb
index 87c720b3069fba14b5aca6b82cff06b9a6ba54e9..9df013966df2d871e838ea9985720ff75ffd72be 100644
--- a/app/workers/queue_users_for_removal.rb
+++ b/app/workers/queue_users_for_removal.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/receive_base.rb b/app/workers/receive_base.rb
index c49dd7c8c8fdb52f6d922285b0955a0a3351791c..4654c28a92a61a4f3cd00671f753a3e104ecf3a8 100644
--- a/app/workers/receive_base.rb
+++ b/app/workers/receive_base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class ReceiveBase < Base
     sidekiq_options queue: :urgent
diff --git a/app/workers/receive_local.rb b/app/workers/receive_local.rb
index a933329798c92969646a589bdd9ebde789137924..6bc9c7a5675aebfbc44a36215e8eb2368a27d1ae 100644
--- a/app/workers/receive_local.rb
+++ b/app/workers/receive_local.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class ReceiveLocal < Base
     sidekiq_options queue: :high
diff --git a/app/workers/receive_private.rb b/app/workers/receive_private.rb
index bd78b06b5166bf680ae53cd34adcb40d9b8b1b18..18534d6f9c29f74326c7d32307627491ff746b79 100644
--- a/app/workers/receive_private.rb
+++ b/app/workers/receive_private.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/receive_public.rb b/app/workers/receive_public.rb
index 3ec918d2d54b30f4b540f6f9d247efa51cd47512..23c1f72c21c3d6701eedbbb1da0f88312842acb8 100644
--- a/app/workers/receive_public.rb
+++ b/app/workers/receive_public.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/recheck_scheduled_pods.rb b/app/workers/recheck_scheduled_pods.rb
index 8ca2be921bfb8d8b91e4dfbd424dfd5a3ade3617..7156c866978cf34a2e34830eedc9dd88d37187ea 100644
--- a/app/workers/recheck_scheduled_pods.rb
+++ b/app/workers/recheck_scheduled_pods.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class RecheckScheduledPods < Base
     sidekiq_options queue: :low
diff --git a/app/workers/recurring_pod_check.rb b/app/workers/recurring_pod_check.rb
index f6ed65700d62956617af7de58dfd5cde7b85f4dd..90551eae693f0f0263dc01ed947fc8f48d308289 100644
--- a/app/workers/recurring_pod_check.rb
+++ b/app/workers/recurring_pod_check.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class RecurringPodCheck < Base
     sidekiq_options queue: :low
diff --git a/app/workers/remove_old_user.rb b/app/workers/remove_old_user.rb
index 444857ec2818b44fafaa6fa8e1863b3670c445dc..825ff16a7e93a66097ec3cea7ffe4b0fc0c7fd40 100644
--- a/app/workers/remove_old_user.rb
+++ b/app/workers/remove_old_user.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/app/workers/reset_password.rb b/app/workers/reset_password.rb
index 9fdd06bbb0314470c7d5bfd63436614d8aca2bfc..71042de506dbc66121bf961b823c58e3cc013dae 100644
--- a/app/workers/reset_password.rb
+++ b/app/workers/reset_password.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class ResetPassword < Base
     sidekiq_options queue: :urgent
diff --git a/app/workers/send_base.rb b/app/workers/send_base.rb
index 9da921e37e33454f4d553232999013995258c083..4e292de9b12044715459d4fa0e3dac45d931e420 100644
--- a/app/workers/send_base.rb
+++ b/app/workers/send_base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class SendBase < Base
     sidekiq_options queue: :medium, retry: 0
diff --git a/app/workers/send_private.rb b/app/workers/send_private.rb
index 8f87d6b512a868291547e5bbe2e40eea45509746..1b886b00636c816d9af04bb08fe5b237870572df 100644
--- a/app/workers/send_private.rb
+++ b/app/workers/send_private.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class SendPrivate < SendBase
     def perform(sender_id, obj_str, targets, retry_count=0)
diff --git a/app/workers/send_public.rb b/app/workers/send_public.rb
index 5022eac6f3b3a1a986a84d68607b007caeea2660..e93a41f59df71f06b438ca359120bd728ca8ac32 100644
--- a/app/workers/send_public.rb
+++ b/app/workers/send_public.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Workers
   class SendPublic < SendBase
     def perform(sender_id, obj_str, urls, xml, retry_count=0)
diff --git a/config.ru b/config.ru
index 44a1400774ba36dc49855675607e9a945bbf33e0..adee8519413e53678eb6aa037f090572594ef416 100644
--- a/config.ru
+++ b/config.ru
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -5,7 +7,6 @@
 # This file is used by Rack-based servers to start the application.
 
 require ::File.expand_path("../config/environment",  __FILE__)
-require ::File.expand_path("../lib/rack/internet_explorer_version", __FILE__)
 
 # Kill unicorn workers really aggressively (at 300mb)
 if defined?(Unicorn)
@@ -16,6 +17,5 @@ if defined?(Unicorn)
   use Unicorn::WorkerKiller::Oom, oom_min, oom_max
 end
 use Rack::Deflater
-use Rack::InternetExplorerVersion, minimum: 9
 
 run Diaspora::Application
diff --git a/config/application.rb b/config/application.rb
index 3a115d7643ebdf8aee8cb13fbb97b3a6e235c8e6..f40f6b3694f659454deee712c34c35953f58b531 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require_relative 'boot'
 
 require 'rails/all'
@@ -72,23 +74,10 @@ module Diaspora
 
     # Precompile additional assets.
     # (application.js, application.css, and all non-JS/CSS in the app/assets are already added)
-    config.assets.precompile += %w[
-      contact-list.js
-      ie.js
-      jquery3.js
-      jquery_ujs.js
-      main.js
-      jsxc.js
-      bookmarklet.js
-      mobile/bookmarklet.js
-      mobile/mobile.js
-      templates.js
-
-      error_pages.css
-      admin.css
-      rtl.css
+    config.assets.precompile = %w[
       color_themes/*/desktop.css
       color_themes/*/mobile.css
+      manifest.js
     ]
 
     # See lib/tasks/assets.rake: non_digest_assets
diff --git a/config/asset_sync.rb b/config/asset_sync.rb
index ecfa36daedb01f7c2f7f2a448ed404f5764cf2c8..533a1de970e6b67d0122efd355056b27a04f50c9 100644
--- a/config/asset_sync.rb
+++ b/config/asset_sync.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if AppConfig.environment.assets.upload? && AppConfig.environment.s3.enable?
   # Monkey patch to make Rails.root available early
   require 'pathname'
diff --git a/config/boot.rb b/config/boot.rb
index e9f0721fea6ece79a780372c8e491ad914df620e..dcd2d28d58c5562a6133ec6253c6278c3f79c65c 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
 
 require "bundler/setup" # Set up gems listed in the Gemfile.
diff --git a/config/defaults.yml b/config/defaults.yml
index 2871abf7b7d18ceec85530d57a8b7e7dc0041759..48525f7bb23c2b1ba4ef052f3171c97ff2ed3323 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
 
 defaults:
   version:
-    number: "0.7.0.1" # Do not touch unless doing a release, do not backport the version number that's in master
+    number: "0.7.1.0" # Do not touch unless doing a release, do not backport the version number that's in master
   heroku: false
   environment:
     url: "http://localhost:3000/"
@@ -111,6 +111,7 @@ defaults:
       suggest_email:
     typhoeus_verbose: false
     typhoeus_concurrency: 20
+    export_concurrency: 1
     username_blacklist:
       - 'admin'
       - 'administrator'
diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example
index b2573625dd3a0e3424296d8d81ef2eefffb36f79..d52378c294a8316f10643f0af0cf2cce946d044d 100644
--- a/config/diaspora.yml.example
+++ b/config/diaspora.yml.example
@@ -455,6 +455,11 @@ configuration: ## Section
     ## of your Sidekiq workers.
     #typhoeus_concurrency: 20
 
+    ## Maximum number of parallel user data export jobs (default=1)
+    ## Be careful, exports of big/old profiles can use a lot of memory, running
+    ## many of them in parallel can be a problem for small servers.
+    #export_concurrency: 1
+
     ## Captcha settings
     captcha: ## Section
 
diff --git a/config/environment.rb b/config/environment.rb
index 426333bb46978d897be4cc6fac77b9fcaacf59d0..d5abe55806c256100cc029c834f52830829aefc6 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Load the Rails application.
 require_relative 'application'
 
diff --git a/config/environments/development.rb b/config/environments/development.rb
index f422f016e68e9f778ee45a66165d0dbf02c8c961..ea9b179812873cdf046c5ca233240b67c4e436f2 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Rails.application.configure do
   # Settings specified here will take precedence over those in config/application.rb.
 
diff --git a/config/environments/integration.rb b/config/environments/integration.rb
index 0fc42e916a6840b88c7306708458dbfad840641a..1d9e034e2562143ed1cabeed57bc860a380dd15b 100644
--- a/config/environments/integration.rb
+++ b/config/environments/integration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('config', 'environment', 'development')
 
 Diaspora::Application.configure do
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 65d1bc1de1b14200f171a1b6287398a66bbfcbe9..ba2422b2937c4875ece37ba6dfb5893c86c216c3 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Rails.application.configure do
   # Settings specified here will take precedence over those in config/application.rb.
 
diff --git a/config/environments/test.rb b/config/environments/test.rb
index d9d87dbd0c0dc289a5640ec1944401a9b265f496..988cf70445ce7b2fa30906e41a932f50d69925e5 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Rails.application.configure do
   # Settings specified here will take precedence over those in config/application.rb.
 
diff --git a/config/eye.rb b/config/eye.rb
index fbc166709b6cea77fe7023ad6a72e38657997da2..a7d54e3089137e287225a386b384b53f36e93166 100644
--- a/config/eye.rb
+++ b/config/eye.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require_relative "load_config"
 rails_env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
 
diff --git a/config/initializers/acts_as_taggable_on.rb b/config/initializers/acts_as_taggable_on.rb
index 5248c33ef875eff1c77dcd5f6e82e0a786b71383..de8bfc5aadf3237a3eaca07136b14d6337828e8c 100644
--- a/config/initializers/acts_as_taggable_on.rb
+++ b/config/initializers/acts_as_taggable_on.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
 require 'models/acts_as_taggable_on-tag'
 ActsAsTaggableOn.force_lowercase = true
diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb
index 51639b67a00ddba973a92d59ec277f5d97b63ef6..315ac48a9a50c142332c41d0b83466a7dee7ee87 100644
--- a/config/initializers/application_controller_renderer.rb
+++ b/config/initializers/application_controller_renderer.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
 # Be sure to restart your server when you modify this file.
 
 # ApplicationController.renderer.defaults.merge!(
diff --git a/config/initializers/asset_sync.rb b/config/initializers/asset_sync.rb
index 5686d12e223f4a5fdb2e674ceb571866d7c6f299..cd681ed63a58b28802a5f0b5b861f1682cce69c3 100644
--- a/config/initializers/asset_sync.rb
+++ b/config/initializers/asset_sync.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if defined? AssetSync
   AssetSync.configure do |config|
     config.enabled = true
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 33e369e29a8eb99e2a6b1076856d130cb13ab0c6..0874787e3ab4ddfb168d266c226f7687e9c7cdcf 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 # bootstrap-markdown plugin relies on rails-assets-bootstrap gem but we use
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
index 59385cdf379bd06a8d2326dcd4de6d5cd5d3f5b0..d0f0d3b5df2d577df63d7571fb7c153322d4f9dd 100644
--- a/config/initializers/backtrace_silencers.rb
+++ b/config/initializers/backtrace_silencers.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
 # Be sure to restart your server when you modify this file.
 
 # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb
index 0321d524297f79fa1af4066252a1ad4cf4913840..3b0119590deeffcd5e7cf94a2679781c779c631b 100644
--- a/config/initializers/carrierwave.rb
+++ b/config/initializers/carrierwave.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -6,6 +8,8 @@
 ENV['SSL_CERT_FILE'] = AppConfig.environment.certificate_authorities.get
 CarrierWave.configure do |config|
   if !Rails.env.test? && AppConfig.environment.s3.enable?
+    config.fog_provider = "fog/aws"
+    require "carrierwave/storage/fog"
     config.storage = :fog
     config.cache_dir = Rails.root.join('tmp', 'uploads').to_s
     config.fog_credentials = {
diff --git a/config/initializers/color_themes.rb b/config/initializers/color_themes.rb
index ae4757610c2fa3e403907fa4d9087db930f48323..7cabdba6459e313fe1f458cba86db8a507c1eca3 100644
--- a/config/initializers/color_themes.rb
+++ b/config/initializers/color_themes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Generate the path to the .yml file with the available color themes.
 color_themes_file = Rails.root.join("config/color_themes.yml")
 # Check in case config/color_themes.yml does not exist.
diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb
index 1389e86a34a7e992b8761b4b2b9b789b5647a406..20a704ae1085ee0075405df73ba6dccd2203bb6f 100644
--- a/config/initializers/cookies_serializer.rb
+++ b/config/initializers/cookies_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 # Specify a serializer for the signed and encrypted cookie jars.
diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb
index 0fccba3fe5c1dac76e5c5bd1fd86b6bd46b27a40..7330c5903f72c2fd48fd112ff74a29c173fa932f 100644
--- a/config/initializers/cors.rb
+++ b/config/initializers/cors.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 # Avoid CORS issues when API is called from the frontend app.
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 3698e237305bbba629d36ffa940ccdfce82ad6a4..bdd334b26a39b5296e800699bf8002c6b2fe24f9 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/diaspora_federation.rb b/config/initializers/diaspora_federation.rb
index e9270d469bc093ca1b8e4afe863c689a895acd80..050a7057581ced1ffb07aea80ee1a16d623e116f 100644
--- a/config/initializers/diaspora_federation.rb
+++ b/config/initializers/diaspora_federation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # configure the federation engine
 DiasporaFederation.configure do |config|
   # the pod url
@@ -5,6 +7,8 @@ DiasporaFederation.configure do |config|
 
   config.certificate_authorities = AppConfig.environment.certificate_authorities.get
 
+  config.webfinger_http_fallback = Rails.env == "development"
+
   config.http_concurrency = AppConfig.settings.typhoeus_concurrency.to_i
   config.http_verbose = AppConfig.settings.typhoeus_verbose?
 
diff --git a/config/initializers/enforce_ssl.rb b/config/initializers/enforce_ssl.rb
index 65a9951c1297230984566872d8fa354149eea613..cb306a2a5308e00d159d697ef7fb9eeaf810e8bd 100644
--- a/config/initializers/enforce_ssl.rb
+++ b/config/initializers/enforce_ssl.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/config/initializers/entypo.rb b/config/initializers/entypo.rb
index 0c99a40ee2a073e26504fa4fe28e50a084818dbc..1a0fa5221b2a191d1bc9abce10690bcee68a72bf 100644
--- a/config/initializers/entypo.rb
+++ b/config/initializers/entypo.rb
@@ -1 +1,3 @@
+# frozen_string_literal: true
+
 Entypo.css_prefix = "entypo"
diff --git a/config/initializers/faraday.rb b/config/initializers/faraday.rb
index a1f57bb215971a9963331e9ab5e517ae37c75b78..a5496322127b1d080c36127fb2e8dfcf4feb077d 100644
--- a/config/initializers/faraday.rb
+++ b/config/initializers/faraday.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb
index 9d07a384fd08de6e2204ad30a09f44d562c46897..2a915d4709be3f16cc3036322319746f24b2efb5 100644
--- a/config/initializers/filter_parameter_logging.rb
+++ b/config/initializers/filter_parameter_logging.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 # Configure sensitive parameters which will be filtered from the log file.
diff --git a/config/initializers/haml.rb b/config/initializers/haml.rb
index 0eacbe0d57d944a2484825a7a4528147ac4ac3f4..5bfe329b07d05f047930e768c5f2d1a9a946614d 100644
--- a/config/initializers/haml.rb
+++ b/config/initializers/haml.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
 Hamlit::Engine.options[:format] = :html
 Hamlit::Engine.options[:escape_html] = true
diff --git a/config/initializers/handlebars_assets.rb b/config/initializers/handlebars_assets.rb
index 94bf58554c8d66b21de9ee725654f18e23ccdac0..a25783311e541a4d0b3d3ac7d3ae81dc61051950 100644
--- a/config/initializers/handlebars_assets.rb
+++ b/config/initializers/handlebars_assets.rb
@@ -1 +1,3 @@
+# frozen_string_literal: true
+
 HandlebarsAssets::Config.options = {preventIndent: true}
diff --git a/config/initializers/ignore_ssl_in_development.rb b/config/initializers/ignore_ssl_in_development.rb
index 9ec8a2d9ccb7588a28cf036814f486820956d9c4..fb4501e2fa6e577039fec581f0774bd5b3407059 100644
--- a/config/initializers/ignore_ssl_in_development.rb
+++ b/config/initializers/ignore_ssl_in_development.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index ac033bf9dc846101320c96a5ce8aceb8c96ec098..aa7435fbc99fd962f3142a1e4bcc915156a2e801 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
 # Be sure to restart your server when you modify this file.
 
 # Add new inflection rules using the following format. Inflections
diff --git a/config/initializers/json_escape.rb b/config/initializers/json_escape.rb
index 0a5ee2b6ebe6381899689539f95e2ab06288715d..3570c7273749d5f99e33056286ba2559c2b8d4d2 100644
--- a/config/initializers/json_escape.rb
+++ b/config/initializers/json_escape.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # From http://jfire.io/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/
 # Remove on Rails 4.1 update
 
diff --git a/config/initializers/jsroutes.rb b/config/initializers/jsroutes.rb
index 64ee94599b1ef27fb0786e3680e3bd81f8bcba2c..e82bf7125aa7ed4f182f1a834a903cf01f990f28 100644
--- a/config/initializers/jsroutes.rb
+++ b/config/initializers/jsroutes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 JsRoutes.setup do |config|
   config.camel_case = true
   config.compact = true
diff --git a/config/initializers/load_analyitics.rb b/config/initializers/load_analyitics.rb
index 5663b0901e9aab7d3bc8bd887b1ddb388e738a32..602560675b8f5edf86fff51df2e9b40dfefb9cc6 100644
--- a/config/initializers/load_analyitics.rb
+++ b/config/initializers/load_analyitics.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2012, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/config/initializers/load_libraries.rb b/config/initializers/load_libraries.rb
index 315ac3dabcb7ac7bf68264ec6520488832137146..b83fd863b954976023347088042ea9430a1189b6 100644
--- a/config/initializers/load_libraries.rb
+++ b/config/initializers/load_libraries.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Stdlib
 require 'cgi'
 require 'uri'
diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb
index 725de6f7108e7e73aeba34e23b05ab91b39b399c..cbc3641e34ec2764dcc0df784d90254b3bb0cc43 100644
--- a/config/initializers/locale.rb
+++ b/config/initializers/locale.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/mailer_config.rb b/config/initializers/mailer_config.rb
index 8cfb5e9b347abcac033e9e13b71d67d16c483683..e2335075ba445002cf68a0f06879243e3a13657e 100644
--- a/config/initializers/mailer_config.rb
+++ b/config/initializers/mailer_config.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/maintenance.rb b/config/initializers/maintenance.rb
index 76bc58aae15d14b38e4a84829d3d344652c0db3c..824d65ab7df80da6365b96f76bc0fe7fe7f17841 100644
--- a/config/initializers/maintenance.rb
+++ b/config/initializers/maintenance.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/config/initializers/markerb.rb b/config/initializers/markerb.rb
index a7cccced2f69de719f6078c96f738dcd6640ad90..a39d0cbee2570d7ebcf7a7a55e7b834aaec7e440 100644
--- a/config/initializers/markerb.rb
+++ b/config/initializers/markerb.rb
@@ -1 +1,3 @@
+# frozen_string_literal: true
+
 Rails.application.config.markerb.renderer = Diaspora::Markdownify::Email
diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb
index dc1899682b01c3a6d9673faf746e235fb64fc4d2..6e1d16f02786f1c592ba108c5272040c91ff65d2 100644
--- a/config/initializers/mime_types.rb
+++ b/config/initializers/mime_types.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
 # Be sure to restart your server when you modify this file.
 
 # Add new mime types for use in respond_to blocks:
diff --git a/config/initializers/oembed.rb b/config/initializers/oembed.rb
index e8334cdad083957d2eb56d68ce394ba64c0ad04c..8edff537ac20908082a2560cf31f47371c5e63a1 100644
--- a/config/initializers/oembed.rb
+++ b/config/initializers/oembed.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'oembed'
 require 'uri'
 
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb
index 3321cf370c5f77527d0b93fd709142a09f8464e3..8555c0e82815bcc0c8efd0bc91e2365e338bbd44 100644
--- a/config/initializers/omniauth.rb
+++ b/config/initializers/omniauth.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/open_graph_reader.rb b/config/initializers/open_graph_reader.rb
index 182dd4bdbb1f693a4da2a494bd9337e49182db3a..27da867b264708e51280705c89193f88f16aa97f 100644
--- a/config/initializers/open_graph_reader.rb
+++ b/config/initializers/open_graph_reader.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 OpenGraphReader.configure do |config|
   config.synthesize_title      = true
   config.synthesize_url        = true
diff --git a/config/initializers/patch_openssl_pkey.rb b/config/initializers/patch_openssl_pkey.rb
index 22c190ba41af060f67934a89e0d6fcbd9ed26f07..9e1d2be05ba6b14c3157b048ca75fcff5106c025 100644
--- a/config/initializers/patch_openssl_pkey.rb
+++ b/config/initializers/patch_openssl_pkey.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/prosody.rb b/config/initializers/prosody.rb
index 093dd49249106a2a58dd66783e5c5535e86ff0e6..df179e5c037a16fce5682bf46e0280d44cb0f5c1 100644
--- a/config/initializers/prosody.rb
+++ b/config/initializers/prosody.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if AppConfig.chat.enabled? && AppConfig.chat.server.enabled?
   db = Rails.application.config
     .database_configuration[Rails.env]
diff --git a/config/initializers/rspec_generator.rb b/config/initializers/rspec_generator.rb
index d1f1a532268820c36317ee5815c2ec80536f7396..68f73e27bddb9b911b914bc57dd59bd7f990e8ae 100644
--- a/config/initializers/rspec_generator.rb
+++ b/config/initializers/rspec_generator.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb
index d2b44fb9f59664d5c9fe68a27f820a6ecf8b27ed..cf3edbb70d7870f21ae04da939b0d0f17636745f 100644
--- a/config/initializers/secure_headers.rb
+++ b/config/initializers/secure_headers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 SecureHeaders::Configuration.default do |config|
   config.hsts = SecureHeaders::OPT_OUT # added by Rack::SSL
 
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index 06360f9d2973cb72680fd19a16ab4a6e76397e09..fd4d660e22dd82cd8d1a13fccfbcf86450f9685b 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 Diaspora::Application.config.session_store :cookie_store, key: "_diaspora_session", httponly: true
diff --git a/config/initializers/set_session_secret.rb b/config/initializers/set_session_secret.rb
index 1896d44be64d452cc6e3ad9c977ff07ccafe6c85..57304735f95cf49b0354efdb8702edc0d0658b90 100644
--- a/config/initializers/set_session_secret.rb
+++ b/config/initializers/set_session_secret.rb
@@ -1 +1,3 @@
+# frozen_string_literal: true
+
 Rails.application.config.secret_token = AppConfig.secret_token
diff --git a/config/initializers/set_up_image_redirects.rb b/config/initializers/set_up_image_redirects.rb
index 9da80f0094e0735239c5caeb873417e6b29b2a12..be4d77a43b7eed501b84dbe9d0bda8c57376f4cd 100644
--- a/config/initializers/set_up_image_redirects.rb
+++ b/config/initializers/set_up_image_redirects.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if AppConfig.environment.image_redirect_url.present?
   require 'rack-rewrite'
 
diff --git a/config/initializers/setup_simple_captcha.rb b/config/initializers/setup_simple_captcha.rb
index a79b48d456a5c197e5dfb2f16a444b5667a66372..61f17f6c38ab7a6cd962dc1bd1b61de0752514f4 100644
--- a/config/initializers/setup_simple_captcha.rb
+++ b/config/initializers/setup_simple_captcha.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 SimpleCaptcha.setup do |sc|
   sc.image_size = AppConfig.settings.captcha.image_size
   sc.length = [1, [AppConfig.settings.captcha.captcha_length.to_i, 12].min].max
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index fa5ed372d6378bbf07aadeb382439fd4407336a9..50e2e07da5701ffa0ab6fc2a3fdeefa0bcd1c04d 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'sidekiq_middlewares'
 require 'sidekiq/middleware/i18n'
 
diff --git a/config/initializers/version_header.rb b/config/initializers/version_header.rb
index 9d3eaf2948e066a36679c9dc81549b860d308e36..62e653f690497ab17e50b0a15af1e5652ae72f1a 100644
--- a/config/initializers/version_header.rb
+++ b/config/initializers/version_header.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/initializers/will_paginate.rb b/config/initializers/will_paginate.rb
index 8922b88b21731d053af8f97408c86f74089b9b25..f48c76cbdafcf1dec466016c592fe6d875e886e1 100644
--- a/config/initializers/will_paginate.rb
+++ b/config/initializers/will_paginate.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'will_paginate/array'
 
 # Optional for Bootstrap :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
index c72a9676534cbd5292d9fcac1a0ae4b5b27e24d6..8447298ad833c74beb653983cb3c0e5873ead481 100644
--- a/config/initializers/wrap_parameters.rb
+++ b/config/initializers/wrap_parameters.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Be sure to restart your server when you modify this file.
 
 # This file contains settings for ActionController::ParamsWrapper which
diff --git a/config/load_config.rb b/config/load_config.rb
index e02deb90d42e3aac2b9c38d354e5dbc3cd450bad..aa9c37f0a001d3e584df4405fabb40d5c8b1ec49 100644
--- a/config/load_config.rb
+++ b/config/load_config.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "pathname"
 require "bundler/setup"
 require "configurate"
diff --git a/config/locales/cldr/plurals.rb b/config/locales/cldr/plurals.rb
index 6bb223c688b9e8310c1ea95fd8013a79745f6979..009b14d97220fd5353a991171a6890b9bb0017b8 100644
--- a/config/locales/cldr/plurals.rb
+++ b/config/locales/cldr/plurals.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 {
   :ar => {:i18n => {:plural => {:keys => [:zero, :one, :two, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(\..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 0 ? :zero : (n == 1 ? :one : (n == 2 ? :two : ((3..10).include?(n % 100) ? :few : ((11..99).include?(n % 100) ? :many : :other))))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 0 ? 'zero' : (n == 1 ? 'one' : (n == 2 ? 'two' : (((n % 100 >= 3) && (n % 100 <= 10)) ? 'few' : (((n % 100 >= 11) && (n % 100 <= 99)) ? 'many' : 'other'))))); })"}}},
   :bg => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(\..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
diff --git a/config/locales/devise/devise.nb.yml b/config/locales/devise/devise.nb.yml
index 27e523b48b23b917bac6848fadade7ad2e8c09f0..fca18e6242410681594230cc0c6f7dc37264a4c9 100644
--- a/config/locales/devise/devise.nb.yml
+++ b/config/locales/devise/devise.nb.yml
@@ -11,10 +11,13 @@ nb:
       new:
         resend_confirmation: "Send bekreftelses-instruksjoner på nytt"
       send_instructions: "Du vil få en e-post med instrukser om hvordan du bekrefter brukeren din om kort tid."
+      send_paranoid_instructions: "Hvis e-postadressen eksisterer i vår database, vil du om et par minutter motta en epost med instruksjoner for hvordan du bekrefter e-postadressen"
     failure:
+      already_authenticated: "Du er allerede innlogget."
       inactive: "Brukeren din er ikke aktivert ennå."
       invalid: "Ugyldig e-postadresse eller passord."
       invalid_token: "Ugyldig aktiveringskode."
+      last_attempt: "Du har ett forsøkt til før kontoen din blir låst."
       locked: "Brukeren din er låst."
       not_found_in_database: "Ugyldig e-post eller passord."
       timeout: "Økten har løpt ut, logg inn igjen for å fortsette."
@@ -34,6 +37,8 @@ nb:
         accept_at: "via %{url}, kan du akseptere lenken du ser under"
         has_invited_you: "%{name}"
         have_invited_you: "%{names} har invitert deg til diaspora*"
+      password_change:
+        subject: "Passord endret"
       reset_password_instructions:
         change: "Endre passordet mitt"
         ignore: "Hvis du ikke har bedt om det, kan du overse denne e-posten."
@@ -46,6 +51,9 @@ nb:
         subject: "Instrukser for å låse opp"
         unlock: "LÃ¥s opp kontoen min"
       welcome: "Velkommen %{email}!"
+    omniauth_callbacks:
+      failure: "Kunne ikke autentisere deg fra %{kind} på grunn av «%{reason}»."
+      success: "Du ble autentisert fra %{kind}-konto."
     passwords:
       edit:
         change_password: "Endre passordet mitt"
@@ -57,13 +65,21 @@ nb:
         no_account: "Det finnes ingen bruker med denne e-post adressen. Hvis du venter på en invitasjon, sender vi dem ut så snart vi kan."
         reset_password: "Resett passord"
         send_password_instructions: "Send meg instruksjoner for å tilbakestille passordet"
+      no_token: "Du kan ikke se denne siden uten å komme fra en e-post for å tilbakestille passord. Dersom du kom fra en e-post for å tilbakestille passord, sørg for at du bruker den fullstendige URL-en som ble oppgitt i e-posten."
       send_instructions: "Du vil få en e-post med instrukser om hvordan du tilbakestiller passordet ditt om kort tid."
+      send_paranoid_instructions: "Hvis e-postadressen finnes i vår database, vil du snart motta en e-post med en lenke du kan bruke for å tilbakestille passordet ditt."
       updated: "Passordet ditt er nå endra, og du har logga inn."
+      updated_not_active: "Du har endret passordet ditt."
     registrations:
       destroyed: "Ha det! Brukeren din er nå slettet. Vi håper å se deg igjen snart."
       signed_up: "Du har nå laga en bruker. Hvis du valgte å få en e-post med bekreftelse på dette, er den nå sendt."
+      signed_up_but_inactive: "Du er nå registrert. Men siden kontoen din ikke er aktivert ennå, kunne vi ikke logge deg inn."
+      signed_up_but_locked: "Du er nå registrert. Men siden kontoen din er låst, kunne vi ikke logge deg inn."
+      signed_up_but_unconfirmed: "En melding med en bekreftelseslenke er sendt til e-postadressen din. Klikk på lenken for å aktivere kontoen din."
+      update_needs_confirmation: "Du har oppdatert kontoen din, men vi behøver å bekrefte din nye e-postadresse. Sjekk e-posten din og klikk på lenken for å bekrefte din nye e-postadresse."
       updated: "Du har oppdatert brukeren din."
     sessions:
+      already_signed_out: "Du er logget ut."
       new:
         login: "Logg inn"
         modern_browsers: "støtter bare moderne nettlesere."
@@ -85,9 +101,15 @@ nb:
       new:
         resend_unlock: "Send instruksene for å låse opp på nytt"
       send_instructions: "Du vil få en e-post med instrukser om hvordan du låser opp brukeren din om kort tid."
+      send_paranoid_instructions: "Hvis kontoen eksisterer, vil du snart motta en e-post med instrukser om hvordan du kan låse den opp."
       unlocked: "Brukeren din er nå låst opp, og du er logga in."
   errors:
     messages:
       already_confirmed: "er allerede bekreftet"
+      confirmation_period_expired: "må bekreftes i løpet av %{period}, vennligst be om en ny"
+      expired: "er utgått, vennligst be om en ny"
       not_found: "ble ikke funnet"
-      not_locked: "er ikke låst"
\ No newline at end of file
+      not_locked: "er ikke låst"
+      not_saved:
+        one: "1 feil forhindret denne %{resource} fra å bli lagret:"
+        other: "%{count} feil forhindret %{resource} fra å bli lagret:"
\ No newline at end of file
diff --git a/config/locales/devise/devise.oc.yml b/config/locales/devise/devise.oc.yml
index 2251be5d07c8f5da03c4594cb256fa3f0f90f08e..210a3bc0b0733c1911e58125d502556d1c31e130 100644
--- a/config/locales/devise/devise.oc.yml
+++ b/config/locales/devise/devise.oc.yml
@@ -31,7 +31,7 @@ oc:
       confirmation_instructions:
         confirm: "Confirmar mon compte"
         subject: "Instruccions de confirmacion"
-        you_can_confirm: "Podètz confirmar vòstre compte en clicant sul ligam çaijós :"
+        you_can_confirm: "Podètz confirmar vòstre compte en clicant sul ligam çaijós :"
       hello: "Adieusiatz %{email} !"
       inviter:
         accept_at: "a %{url}, lo podètz acceptar a travèrs lo ligal çaijós."
@@ -47,7 +47,7 @@ oc:
         wont_change: "Vòstre senhal cambiarà pas tant que n'auretz pas creat un novèl en accedissent al ligam çaijós."
       unlock_instructions:
         account_locked: "Vòstre compte es estat verrolhat en rason d'un nombre excessiu de temptativas infructuosas de connexion."
-        click_to_unlock: "Clicatz sul ligam çaijós per desblocar vòstre compte :"
+        click_to_unlock: "Clicatz sul ligam çaijós per desblocar vòstre compte :"
         subject: "Instruccions de desverrolhatge"
         unlock: "Desverrolhar mon compte"
       welcome: "Benvenguda %{email} !"
@@ -61,7 +61,7 @@ oc:
         new_password: "Senhal novèl"
       new:
         email: "Adreça de corrièl"
-        forgot_password: "Avètz oblidat vòstre senhal ?"
+        forgot_password: "Avètz oblidat vòstre senhal ?"
         no_account: "Cap de compte es pas associat a aquesta adreça de corrièr electronic."
         reset_password: "Reïnicializar lo senhal"
         send_password_instructions: "Mandar las instruccions de reïnicializacion de senhal"
@@ -91,9 +91,9 @@ oc:
       signed_out: "Ara, sètz desconnectat."
     shared:
       links:
-        forgot_your_password: "Avètz oblidat vòstre senhal ?"
-        receive_confirmation: "Avètz pas recebut las instruccions de confirmacion ?"
-        receive_unlock: "Avètz pas recebut las instruccions de desblocatge ?"
+        forgot_your_password: "Avètz oblidat vòstre senhal ?"
+        receive_confirmation: "Avètz pas recebut las instruccions de confirmacion ?"
+        receive_unlock: "Avètz pas recebut las instruccions de desblocatge ?"
         sign_in: "Connexion"
         sign_up: "Crear un compte"
         sign_up_closed: "Las inscripcions son tampadas pel moment."
diff --git a/config/locales/devise/devise.pl.yml b/config/locales/devise/devise.pl.yml
index 0143ef8848ee1e35e22ee1c7b054a0a2c1a8ff21..ab7c183245a324b96d5dd55aac6d56f0159da543 100644
--- a/config/locales/devise/devise.pl.yml
+++ b/config/locales/devise/devise.pl.yml
@@ -17,6 +17,7 @@ pl:
       inactive: "Twoje konto nie zostało jeszcze aktywowane."
       invalid: "Nieprawidłowa nazwa użytkownika lub hasło."
       invalid_token: "Nieprawidłowy token uwierzytelnienia."
+      last_attempt: "Możesz spróbować jeszcze jeden raz, potem Twoje konto zostanie zablokowane."
       locked: "Twoje konto jest zablokowane."
       not_found_in_database: "Niewłaściwy email lub hasło."
       timeout: "Sesja wygasła, aby kontynuować zaloguj się ponownie."
@@ -102,4 +103,4 @@ pl:
     messages:
       already_confirmed: "już potwierdzone"
       not_found: "nie znaleziono"
-      not_locked: "nie był(a) zablokowany/a"
\ No newline at end of file
+      not_locked: "nie był zablokowany"
\ No newline at end of file
diff --git a/config/locales/devise/devise.sc.yml b/config/locales/devise/devise.sc.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5bec014dea95d525037a474e40f83e416ec4aa14
--- /dev/null
+++ b/config/locales/devise/devise.sc.yml
@@ -0,0 +1,115 @@
+#   Copyright (c) 2010-2013, Diaspora Inc.  This file is
+#   licensed under the Affero General Public License version 3 or later.  See
+#   the COPYRIGHT file.
+
+
+
+sc:
+  devise:
+    confirmations:
+      confirmed: "Su contu de posta eletrònica tuo est istadu cunfirmadu."
+      new:
+        resend_confirmation: "Torra a imbiare sas istrutziones de cunfirma"
+      send_instructions: "As a retzire una lìtera eletrònica cun istrutziones pro cunfirmare sa crae de intrada tua in una paia de minutos."
+      send_paranoid_instructions: "Si su contu de posta eletrònica tuo est giai in s'elencu nostru as a retzire una lìtera cun sas istrutziones pro cunfirmare s'indiritzu tuo in una paia de minutos."
+    failure:
+      already_authenticated: "Ses giai intradu."
+      inactive: "Su contu tuo no est istadu galu ativadu"
+      invalid: "%{authentication_keys} o crae invàlidas."
+      invalid_token: "Getone de autenticatzione non vàlidu."
+      last_attempt: "Tenes galu unu tentativu a disponimentu in antis chi su contu tuo bèngiat blocadu."
+      locked: "Su contu tuo est blocadu."
+      not_found_in_database: "%{authentication_keys} o crae invàlidas."
+      timeout: "Sa sessione tua est iscadida. Pro praghere torra a intrare pro sighire."
+      unauthenticated: "Depes intrare in su contu tuo o ti depes registrare in antis de pòdere sighire."
+      unconfirmed: "Depes cunfirmare s'indiritzu de posta eletrònica in antis de pòdere sighire."
+    invitations:
+      invitation_token_invalid: "Iscusa·nos! Su getone de invitu tuo no est vàlidu."
+      send_instructions: "S'invitu tuo est istadu imbiadu."
+      updated: "Sa crae de intrada tua est istada impostada. Como ses intradu."
+    mailer:
+      confirmation_instructions:
+        confirm: "Cunfirma su contu meu"
+        subject: "Istrutziones pro sa cunfirma"
+        you_can_confirm: "Podes cunfirmare su contu tuo pro mèdiu de su ligàmene inoghe in suta:"
+      hello: "Salude %{email}!"
+      inviter:
+        accept_at: "in %{url}, lu podes atzetare pro mèdiu de su ligàmene inoghe in suta."
+        has_invited_you: "%{name}"
+        have_invited_you: "%{names} t'ant invitadu a t'aunire a diaspora*"
+      password_change:
+        subject: "Crae cambiada"
+      reset_password_instructions:
+        change: "Càmbia sa crae mea"
+        ignore: "Si non l'as pedidu tue, pro praghere ignora custa lìtera."
+        someone_requested: "Calicunu at pedidu unu ligàmene pro cambiare sa crae tua. Si ses istadu tue lu podes fàghere pro mèdiu de su ligàmene inoghe in suta."
+        subject: "Istrutziones pro torrare a impostare sa crae de intrada"
+        wont_change: "Sa crae tua no at a cambiare finas a cando no as a aberire su ligàmene inoghe in pitzu e nd'as a creare una noa."
+      unlock_instructions:
+        account_locked: "Su contu tuo est istadu blocadu pro more de unu nùmeru tropu mannu de tentativos de intrada fallidos."
+        click_to_unlock: "Incarca in su ligàmene inoghe pro isblocare su contu tuo:"
+        subject: "Istrutziones de isblocu"
+        unlock: "Isbloca su contu meu"
+      welcome: "Bene bènnidu %{email}!"
+    omniauth_callbacks:
+      failure: "Impossìbile fàghere s'autenticatzione pro tie dae %{kind}, ca \"%{reason}\"."
+      success: "Autenticatzione dae su contu %{kind} resissida."
+    passwords:
+      edit:
+        change_password: "Càmbia sa crae mea"
+        confirm_password: "Cunfirma sa crae"
+        new_password: "Crae noa"
+      new:
+        email: "Indiritzu de p. eletrònica"
+        forgot_password: "As ismentigadu sa crae tua?"
+        no_account: "Non b'est unu contu cun custu indiritzu de p. eletrònica"
+        reset_password: "Torra a impostare sa crae"
+        send_password_instructions: "Imbia·mi sas istrutziones pro torrare a impostare sa crae"
+      no_token: "Non podes intrare in custa pàgina chene partire dae una lìtera de posta eletrònica pro s'impostatzione de sa crae. Si benis dae una de cussas lìteras ista atentu a impreare s'URL intreu frunidu."
+      send_instructions: "As a retzire una lìtera eletrònica cun istrutziones pro torrare a impostare sa crae de intrada tua in una paia de minutos."
+      send_paranoid_instructions: "Si su contu de p. eletrònica tuo esistit in s'elencu nostru as a retzire unu ligàmene de riprìstinu in s'indiritzu de posta eletrònicu tuo in una paia de minutos."
+      updated: "Su cambiamentu de sa crae tua est resissidu. Como ses intradu."
+      updated_not_active: "Sa crae tua est istada cambiada."
+    registrations:
+      destroyed: "Adiosu! Su contu tuo est istadu iscantzelladu. Isperamus de ti bìdere torra."
+      signed_up: "Sa registratzione est resissida. Si su servìtziu est abilitadu una lìtera de cunfirma est istada imbiada a s'indiritzu de posta eletrònica tua."
+      signed_up_but_inactive: "Ti ses registradu. Ma non podes galu intrare, ca su contu tuo no est galu ativadu."
+      signed_up_but_locked: "Ti ses registradu. Ma non podes galu intrare, ca su contu tuo no est blocadu."
+      signed_up_but_unconfirmed: "Unu messàgiu cun unu ligàmene de cunfirma est istadu imbiadu a su contu de posta eletrònica tuo. Pro praghere sighi su ligàmene pro ativare su contu tuo."
+      update_needs_confirmation: "As agiornadu su contu tuo, ma tenimus bisòngiu de verificare su contu nou tuo. Pro praghere verìfica s'indiritzu tuo e sighi su ligàmene de cunfirma pro cunfirmare su contu de posta eletrònica tuo."
+      updated: "Su contu tuo est istadu abilitadu cun sutzessu."
+    sessions:
+      already_signed_out: "Ses essidu."
+      new:
+        login: "Intra"
+        modern_browsers: "suportat petzi sos esploradores (sos browsers) modernos."
+        password: "Crae"
+        remember_me: "Ammenta·ti de mene"
+        sign_in: "Intra"
+        username: "Nùmene impreadore"
+      signed_in: "Intrada resissida."
+      signed_out: "Essida resissida."
+    shared:
+      links:
+        forgot_your_password: "As ismentigadu sa crae tua?"
+        receive_confirmation: "No as retzidu sas istrutziones pro sa cunfirma?"
+        receive_unlock: "No as retzidu sas istrutziones pro s'isblocu?"
+        sign_in: "Intra"
+        sign_up: "Crea unu contu"
+        sign_up_closed: "Sas registratziones abertas non sunt disponìbiles in custu momentu."
+    unlocks:
+      new:
+        resend_unlock: "Torra a imbiare sas istrutziones de isblocu"
+      send_instructions: "As a retzire una lìtera cun istrutziones pro isblocare su contu tuo in una paia de minutos."
+      send_paranoid_instructions: "Si su contu tuo esistit as a retzire una lìtera cun sas istrutziones pro isblocare su contu tuo in una paia de minutos."
+      unlocked: "Su contu tuo est istadu isblocadu. Pro praghere intra pro sighire."
+  errors:
+    messages:
+      already_confirmed: "est istadu giai cunfirmadu, pro praghere torra a proare"
+      confirmation_period_expired: "depet èssere cunfirmadu intro de %{period}, pro praghere pedi·ne unu nou"
+      expired: "est iscadidu, pro praghere pedi·ne unu nou"
+      not_found: "non agatadu"
+      not_locked: "no est istadu blocadu"
+      not_saved:
+        one: "1 errore nos at impedidu de sarvare custu %{resource}:"
+        other: "%{count} errores nos ant impedidu de sarvare custu %{resource}:"
\ No newline at end of file
diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml
index 2cec1fffaa94a96c28117f75124f8bb79e1aab3b..16534135c8d742646870ba4d628283ce5c857ea9 100644
--- a/config/locales/diaspora/da.yml
+++ b/config/locales/diaspora/da.yml
@@ -494,7 +494,7 @@ da:
       who_sees_profile_a: "Din basis profil (navn, profilbillede og #tags) er offentligt. Din udvidede profil er som standard privat, men du kan gøre det tilgængeligt for offentligheden, hvis du vil. Kun personer, du deler med (hvilket betyder, du har tilføjet dem til et af dine aspekter) kan se din udvidede profil, hvis du holder den privat. Andre mennesker vil kun se dine offentlige oplysninger. Eventuelle profiloplysninger du offentliggør, kan ses af alle der bruger internettet og kan indekseres af søgemaskiner"
       who_sees_profile_q: "Hvem ser min profil?"
     public_posts:
-      can_comment_reshare_like_a: "Enhver der er logget på Diaspora kan kommentere, videredele eller like dine offentlige indlæg."
+      can_comment_reshare_like_a: "Enhver der er logget på Diaspora kan kommentere, videredele eller like dine offentlige indlæg. Undtagelsen til dette er folk du ignorere. De vil ikke kunne kommentere dine indlæg."
       can_comment_reshare_like_q: "Hvem kan kommentere, videredele eller like mine offentlige indlæg?"
       deselect_aspect_posting_a: "Det påvirker ikke offentlige indlæg at fravælge aspekter. Indlægget vil stadig være offentligt, og vil stadig være synligt i strømmen hos alle dine kontakter. For at begrænse adgangen til specifikke aspekter, skal du vælge de aspekter du ønsker skal kunne se indlægget med aspekt-menuen under indlægget."
       deselect_aspect_posting_q: "Hvad sker der, når jeg fravælger et eller flere aspekter i den venstre kolonne, når jeg laver et offentligt indlæg?"
@@ -680,11 +680,9 @@ da:
     mentioned:
       one: "%{actors} har nævnt dig i indlægget %{post_link}."
       other: "%{actors} har nævnt dig i indlægget %{post_link}."
-      zero: "%{actors} har nævnt dig i indlægget %{post_link}."
     mentioned_deleted:
       one: "%{actors} har nævnt dig i et slettet indlæg."
       other: "%{actors} har nævnt dig i et slettet indlæg."
-      zero: "%{actors} har nævnt dig i et slettet indlæg."
     mentioned_in_comment:
       one: "%{actors} har nævnt dig i en <a href=\"%{comment_path}\">kommentar</a> til dette indlæg: %{post_link}."
       other: "%{actors} har nævnt dig i en <a href=\"%{comment_path}\">kommentar</a> til dette indlæg: %{post_link}."
@@ -751,7 +749,7 @@ da:
 
           Mange tak,
           Diaspora email-robotten!
-      subject: "Vi har modtager en ikke-autoriseret forespørgsel fra din konto, %{name}"
+      subject: "Vi har modtaget en ikke-autoriseret forespørgsel fra din konto, %{name}"
     email_sent_by_diaspora: "Denne e-mail blev sendt af %{pod_name}. Hvis du gerne vil holde op med at få e-mails som denne,"
     export_email:
       body: |-
@@ -984,13 +982,13 @@ da:
       terms_link: "Servicevilkår"
       username: "Brugernavn"
   report:
-    comment_label: "<b>Kommentar</b>: %{data}"
+    comment_label: "<strong>Kommentar</strong>: %{data}"
     confirm_deletion: "Er du sikker på at du vil slette det valgte?"
     delete_link: "Slet det valgte"
     not_found: "Indlægget/kommentaren blev ikke fundet. Det ser ud til at være blevet slettet af brugeren!"
-    post_label: "<b>Indlæg</b>: %{content}"
+    post_label: "<strong>Indlæg</strong>: %{content}"
     reason_label: "Begrundelse:"
-    reported_label: "<b>Indrapporteret af</b> %{person}"
+    reported_label: "<strong>Indrapporteret af</strong> %{person}"
     reported_user_details: "Detaljer om den indberettede bruger"
     review_link: "Marker som bedømt"
     status:
diff --git a/config/locales/diaspora/de-CH.yml b/config/locales/diaspora/de-CH.yml
index 43355da0a606d596d8dc913d7ce6db9fcb577ad1..e9d113355004e57de56e852b668c85e3ad789a40 100644
--- a/config/locales/diaspora/de-CH.yml
+++ b/config/locales/diaspora/de-CH.yml
@@ -544,7 +544,7 @@ de-CH:
     create:
       integrity_error: "Fotiupload isch fehlgschlage... Bisch sicher das da e Bild gsi isch?"
       runtime_error: "Fotiupload isch fehlgschlage... Bisch sicher das ali Tasse im Chuchichäschtli sind?"
-      type_error: "Fotiupload isch fehlgschlage... Bisch sicher das e Bild iigfüegt worde isch?"
+      type_error: "Fotiupload isch fehlgschlage... Bisch sicher das es Bild iigfüegt worde isch?"
     destroy:
       notice: "Foti glöscht."
     new_profile_photo:
@@ -785,7 +785,7 @@ de-CH:
       email_awaiting_confirmation: "Mer hend dir en Link a %{unconfirmed_email} gschikt. Bis du de enthalteni Link göffnet hesch und so die neu Adresse aktiviersch, sendemer wiiterhin a dini alt Adresse %{email}"
       export_data: "Date exportiere"
       export_in_progress: "Mir verarbeitet grad dini Date. Bitte chum in es paar Moment wieder verbii."
-      export_photos_in_progress: "Mier verarbeitet grad dini Fotis, bitte lueg chli spöter nomal verbii."
+      export_photos_in_progress: "Mir verarbeitet grad dini Fotis, bitte lueg chli spöter nomal verbii."
       following: "\"Teile\"-Iistelige"
       last_exported_at: "Z'lescht aktualisiert am %{timestamp}"
       liked: "öpperem en Biitrag vo dir gfallt"
diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml
index bb517aeeb02342dec01609f70531be66c80c57a3..1b7c6800676a76180829fbb56a645465bcb6f1b6 100644
--- a/config/locales/diaspora/de.yml
+++ b/config/locales/diaspora/de.yml
@@ -173,7 +173,7 @@ de:
           description: "Das ermöglicht der Anwendung, deinen Stream, deine Konversationen und dein vollständiges Profil auszulesen"
           name: "Profil, Stream und Konversationen lesen"
         sub:
-          description: "Dies gewährt der Anwendung sub-Berechtigungen"
+          description: "Dies vererbt der Anwendung Berechtigungen"
           name: "sub"
         write:
           description: "Das ermöglicht der Anwendung, neue Beiträge zu senden, Konversationen zu schreiben und Reaktionen zu senden"
@@ -279,11 +279,11 @@ de:
     dark_green: "Dunkelgrün"
     egyptian_blue: "Ägyptisch Blau"
     magenta: "Magenta"
-    original: "Ursprünglich grau"
-    original_white: "Ursprünglich weißer Hintergrund"
+    original: "Original Grau"
+    original_white: "Original weißer Hintergrund"
   comments:
     create:
-      error: "Konnte nicht kommentieren."
+      error: "Kommentieren fehlgeschlagen."
     new_comment:
       comment: "Kommentieren"
       commenting: "Kommentieren …"
@@ -299,7 +299,7 @@ de:
       only_sharing_with_me: "Nur mit dir Teilende"
       start_a_conversation: "Beginne eine Unterhaltung"
       title: "Kontakte"
-      user_search: "Nutzersuche"
+      user_search: "Kontaktsuche"
     spotlight:
       community_spotlight: "Gemeinschafts-Schaukasten"
       no_members: "Es gibt noch keine Mitglieder."
@@ -356,7 +356,7 @@ de:
       data_visible_to_podmin_q: "Wie viele Informationen kann der Administrator meines Pods sehen?"
       download_data_a: "Ja. Unten im Bereich „Konto“ deiner Einstellungen sind zwei Schaltflächen, mit denen du deine Daten oder Fotos herunterladen kannst."
       download_data_q: "Kann ich alle Daten, welche auf meinem Konto gespeichert wurden, herunterladen?"
-      move_pods_a: "In Zukunft wirst du deine Daten von einem Pod exportieren und in einem anderen importieren können, aber im Moment ist das noch nicht möglich. Du kannst aber natürlich jederzeit ein neues Konto erstellen, deine Kontakte dort erneut zu Aspekten hinzufügen und sie fragen, ob sie dich ebenfalls wieder zu ihren Aspekten hinzufügen wollen."
+      move_pods_a: "Version 0.7.0.0 von diaspora* ist der erste Schritt der Konto-Migration: Du kannst nun alle deine Daten aus dem Abschnitt \"Konto\" der Benutzereinstellungen exportieren. Bewahre deine Daten sicher auf! In einer zukünftigen Version kannst du dein ganzes Konto, einschließlich Beiträge und Kontakte, zu einem anderen Pod migrieren."
       move_pods_q: "Wie kann ich mein Konto auf einen anderen Pod verschieben?"
       title: "Konto- und Datenverwaltung"
     aspects:
@@ -364,7 +364,7 @@ de:
       change_aspect_of_post_q: "Kann ich die Aspekte eines Beitrags nach dem Senden nochmal verändern?"
       contacts_know_aspect_a: "Nein. Sie können den Namen des Aspekts, in welchem sie eingeordnet sind, nicht sehen."
       contacts_know_aspect_q: "Wissen meine Kontakte in welchem Aspekt von mir sie sind?"
-      contacts_visible_a: "Wenn du diese Option anwählst, werden die Kontakte dieses Aspekts die Möglichkeit haben, auf Ihrem Profil unter Ihrem Profilbild, zu sehen wer sonst noch in diesem Aspekt ist. Es ist am besten diese Option nur anzuwählen, wenn sich alle Kontakte in diesem Aspekt untereinander kennen. Sie werden aber trotzdem nicht erfahren, wie dieser Aspekt heißt."
+      contacts_visible_a: "Wenn du diese Option anwählst, werden die Kontakte dieses Aspekts die Möglichkeit haben, auf deinem Profil unter dem Profilbild, zu sehen wer sonst noch in diesem Aspekt ist. (Im Moment können ausschließlich deine Kontakte vom selben Pod, die Registerkarte \"Kontakte\" in deinem Profil sehen.) Diese Option sollte idealerweise nur gewählt werden, wenn sich alle Aspekt-Kontakte untereinander kennen. Sie werden dennoch nicht erfahren, wie dieser Aspekt heißt."
       contacts_visible_q: "Was bewirkt „Kontakte aus diesem Aspekt öffentlich machen“?"
       delete_aspect_a: "Klicke in der Seitenleiste der Stream-Ansicht auf „Meine Aspekte“ und dann auf das Stiftsymbol bei dem Aspekt, den du löschen möchtest, oder gehe zu deiner Kontaktseite und wähle den entsprechenden Aspekt aus. Dann klicke auf das Mülleimersymbol oben rechts auf der Seite."
       delete_aspect_q: "Wie kann ich einen Aspekt löschen?"
@@ -432,7 +432,7 @@ de:
     miscellaneous:
       back_to_top_a: "Ja. Nachdem du auf einer Seite nach unten gescrollt hast, klicke auf den grauen Pfeil, der unteren rechts im Browserfenster erscheint."
       back_to_top_q: "Gibt es eine Möglichkeit, schnell wieder an den Seitenanfang zu kommen?"
-      diaspora_app_a: "Es gibt einige Android-Apps in einem sehr frühen Entwicklungsstadium. Einige Projekte sind bereits seit langem abgebrochen und funktionieren deshalb nicht richtig mit der aktuellen diaspora*-Version. Erwarte von diesen Apps im Moment nicht allzu viel. Zur Zeit ist die beste Möglichkeit, um auf diaspora* von deinem Mobilgerät zuzugreifen, die Seite in einem Browser aufzurufen, da wir eine mobile Version gestaltet haben, die auf allen Geräten gut funktionieren sollte. Für iOS gibt es im Moment keine Apps. Noch einmal, diaspora* sollte sich gut von deinem Browser aus bedienen lassen."
+      diaspora_app_a: "Es gab einige Android-Apps von community Mitgliedern in einem frühen Entwicklungsstadium. Einige Apps werden seit langem nicht weiter gepflegt und funktionieren deshalb nicht mehr richtig mit der aktuellen diaspora*-Version. Erwarte von diesen Apps im Moment nicht allzu viel. Für iOS gibt es keine App. Am besten rufst du diaspora* auch auf deinem smartphone im Browser auf. Wir haben eine mobile Version gestaltet, die auf allen Geräten gut funktionieren sollte."
       diaspora_app_q: "Gibt es eine diaspora* App für Android oder iOS?"
       photo_albums_a: "Nein, momentan nicht. Aber du kannst dir die hochgeladenen Bilder in der Fotosektion in der linke Leiste auf dem Profil ansehen."
       photo_albums_q: "Gibt es Foto oder Videoalben?"
@@ -440,10 +440,10 @@ de:
       subscribe_feed_q: "Kann ich die öffentlichen Beiträge einer Person mit einem Feedreader verfolgen?"
       title: "Diverses"
     pods:
-      find_people_a: "Lade deine Freunde mit dem E-Mail-Link in der Seitenleiste ein. Folge #Tags, um Andere zu entdecken, die deine Interessen teilen und füge Leute, die Sachen posten, die dich interessieren, zu deinen Aspekten hinzu. Schreibe in einem öffentlichen Post, dass du #NeuHier bist."
+      find_people_a: "Wenn du deine Freunde zu Diaspora* einladen möchtest, benutze den Einladungs- oder E-Mail-Link von der Seitenleiste. Folge #Tags, um Andere zu entdecken, die deine Interessen teilen und füge Leute, die Dinge posten, die dich interessieren, zu deinen Aspekten hinzu. Schreibe in einem öffentlichen Post, dass du #NeuHier bist."
       find_people_q: "Ich bin gerade erst einem Pod beigetreten, wie finde ich nun Leute zum Teilen?"
       title: "Pods"
-      use_search_box_a: "Kennst du deren vollständige diaspora* ID (z.B. benutzername@podname.org), kannst du sie durch suchen finden. Bist du auf dem selben Pod, kannst du direkt nach dem Benutzernamen suchen. Alternativ kannst du auch nach ihrem Profilnamen (dem angezeigten Namen) suchen. Wenn eine Suche beim ersten Mal keine Ergebnisse liefert, dann versuch es nochmal."
+      use_search_box_a: "Du kannst Personen finden deren vollständige diaspora* ID (z.B. benutzername@podname.org) du kennst. Wenn du auf dem selben Pod bist, kannst du direkt nach dem Benutzernamen suchen. Alternativ kannst du auch nach dem Profilnamen (dem Anzeigenamen) suchen. Bringt Deine Suche nicht sofort funktioniert, könnte es an Netzwerkproblemen liegen. Versuch es dann nochmal."
       use_search_box_q: "Wie benutze ich das Suchfeld, um bestimmte Personen zu finden?"
       what_is_a_pod_a: "Ein Pod ist ein Server, auf dem die diaspora*-Software läuft und der mit dem diaspora*-Netzwerk verbunden ist. „Pod“ ist eine Metapher für Hülsen von Pflanzen, die mehrere Samen enthalten, so wie der Server mehrere Benutzerkonten enthält. Es gibt viele verschiedene Pods. Du kannst Kontakte von anderen Pods hinzufügen und mit ihnen kommunizieren. Du musst nicht Benutzerkonten auf verschiedenen Pods erstellen! (Du kannst dir einen diaspora*-Pod wie einen Mail-Anbieter vorstellen: Es gibt öffentliche Pods, private Pods, und mit ein wenig Aufwand kannst du deinen eigenen betreiben.)"
       what_is_a_pod_q: "Was ist ein Pod?"
@@ -454,11 +454,15 @@ de:
       character_limit_q: "Wie groß ist das Zeichenlimit für Beiträge?"
       embed_multimedia_a: "In der Regel kannst du einfach die URL (z.B. http://www.youtube.com/watch?v=nnnnnnnnnnn) in deinen Beitrag einfügen und der Video- oder Audio-Inhalt wird automatisch erscheinen. Unter Anderem werden YouTube, Vimeo, SoundCloud, Flickr und noch einige mehr unterstützt. diaspora* benutzt oEmbed für diese Funktion. Es kommen jederzeit neue Seiten hinzu. Beachte, immer nur einfache, vollständige Links zu posten: Keine gekürzten Links; Keine zusätzlichen Optionen hinter der Basis-URL; Und warte nach dem Posten einen kleinen Moment, bevor du die Seite aktualisierst, um die Vorschau zu sehen."
       embed_multimedia_q: "Wie bette ich Video-, Audio- oder andere Multimediainhalte in einen Beitrag ein?"
-      format_text_a: "Indem du ein vereinfachtes System namens %{markdown} benutzt. Du kannst die vollständige Syntax dazu %{here} finden. Die Vorschau-Schaltfläche ist an dieser Stelle sehr hilfreich, da du so schon vor dem Posten sehen kannst, wie dein Beitrag aussehen wird."
+      format_text_a: "diaspora* verwendet %{markdown}. Die Oberfläche hat Schaltflächen, um deinen Text zu formatieren. Du kannst auch manuell deinen Beitrag formatieren, %{here} ist die Markdown-Syntax. Mit der Vorschau-Registerkarte kannst du sehen, wie deine Nachricht aussieht, bevor du sie teilst. Denke daran, dass du einmal gepostetes nicht mehr bearbeiten kannst. So prüfe vorher das alles OK ist!"
       format_text_q: "Wie kann ich einen Beitrag formatieren (Fett, kursiv, etc.)?"
       hide_posts_a: "Wenn du deinen Mauszeiger über einem Beitrag positionierst, erscheint rechts ein kleines ×. Klicke darauf, um den Beitrag zu verstecken und die Benachrichtigungen zu ihm zu deaktivieren. Du kannst den Beitrag weiterhin auf der Profilseite der Person betrachten, die ihn gepostet hat."
       hide_posts_q: "Wie blende ich einen Beitrag aus?"
-      insert_images_a: "Klicke auf das kleine Kamera-Symbol, um ein Foto zu einem Beitrag hinzuzufügen. Klicke erneut darauf, um weitere Fotos hinzuzufügen, oder wähle mehrere Fotos aus, um sie alle auf einmal hinzuzufügen."
+      ignore_user_a1: "Wenn du derzeit mit dieser Person teilst, entferne sie aus deinen Aspekten, viele ihrer Beiträge erscheinen dann nicht mehr in deinem Stream. Eine vollständigere Methode ist das Konto zu „ignorieren“. Dies verhindert, dass jegliche Beiträge der Person in deinem Stream erscheinen, sie deine Beiträge mit „Gefällt mir“ markieren oder kommentieren kann. Sie wird jedoch immer noch in der Lage sein, deine Beiträge weiterzusagen und diese dann zu kommentieren, und ihre Kommentare zu Beiträgen anderer Personen, die in deinem Stream erscheinen, sind noch für dich sichtbar."
+      ignore_user_a2: "Um jemanden zu ignorieren, klicke auf das „Ignorieren“-Symbol (ein diagonal durchgestrichener Kreis) oben rechts auf einem Beitrag. Die Beiträge werden sofort aus deinem Stream verschwinden. Alternativ gehst du auf die Profilseite der zu ignorierenden Person und klickst dort auf das Ignorier-Symbol. Du kannst die Beiträge weiterhin auf der Profilseite sehen oder indem du die Einzelbeitragsansicht verwendest."
+      ignore_user_a3: "Eine Liste der von dir ignorierten Personen findest du in deinen Kontoeinstellungen unter Privatsphäre. Um jemanden nicht mehr zu ignorieren, entferne sie aus der Liste auf dieser Seite."
+      ignore_user_q: "Wie verhindere ich, dass jemandes Beiträge in meinem Stream erscheinen?"
+      insert_images_a: "Wenn du ein auf deinem Computer gespeichertes Bild in deinem Beitrag verwenden willst, klicke auf das kleine Kamerasymbol am unteren Rand des Veröffentlichungsfeldes. Auch per Drag&Drop kannst du von deinem Computer Bilder auf das Symbol ziehen. Willst du ein Bild aus dem Web in deinem Beitrag einfügen, klicke auf die \"Bild\"-Schaltfläche  an der Oberseite des Veröffentlichungsfeldes. Diese erstellt für dich den Markdown-Code."
       insert_images_comments_a: "Du kannst Markdown verwenden, um ein Bild aus dem Internet in einen Kommentar einzufügen, genau wie in Beiträgen. Du kannst allerdings keine Bilder von deinem Computer direkt in Kommentare hochladen. Lade sie auf einen Bilder-Hosting-Dienst hoch und füge sie dann mittels der Bild-Schaltfläche über dem Eingabefeld ein."
       insert_images_comments_q: "Kann ich Bilder in Kommentare einfügen?"
       insert_images_q: "Wie füge ich einem Beitrag Fotos hinzu?"
@@ -468,9 +472,9 @@ de:
       post_notification_q: "Wie kann ich Benachrichtigungen über einen Beitrag an- oder ausschalten?"
       post_poll_a: "Klicke auf das Diagrammsymbol, um eine Umfrage zu erstellen. Gib eine Frage und mindestens zwei Antwortmöglichkeiten ein. Vergiss nicht, deinen Beitrag öffentlich zu machen, wenn jeder daran teilnehmen können soll."
       post_poll_q: "Wie füge ich meinem Beitrag eine Umfrage hinzu?"
-      post_report_a: "Klicke auf das Warndreieck oben rechts an einem Beitrag, um ihn deinem Podmin zu melden. Gib einen Grund für das Melden des Beitrags in der Dialogbox ein."
+      post_report_a: "Klicke auf das Warndreieck oben rechts an einem Beitrag, um ihn deinem Podmin zu melden. Gib einen Grund für das Melden des Beitrags in der Dialogbox ein. Bitte melde nur Beiträge, die unseren %{community_guidelines} oder den Nutzungsbedingungen deines pods widersprechen, z. B. Beiträge mit illegalen oder missbräuchlichen Inhalten oder Spam."
       post_report_q: "Wie melde ich einen anstößigen Beitrag?"
-      size_of_images_a: "Nein. Bilder werden automatisch auf eine Größe geändert, die in den Stream passt. Markdown bietet keinen Code, um die Größe eines Bildes anzugeben."
+      size_of_images_a: "Nein. Bilder werden automatisch auf eine Größe geändert, die in den Stream oder in die Einzelbeitragsansicht passt. Markdown bietet keinen Code, um die Größe eines Bildes anzugeben."
       size_of_images_q: "Kann ich die Größe von Bildern in Beiträgen oder Kommentaren anpassen?"
       stream_full_of_posts_a1: "Dein Stream ist zusammengesetzt aus drei Arten von Beiträgen:"
       stream_full_of_posts_li1: "Beiträge von Leuten, mit denen du teilst, von denen es zwei Arten gibt: Öffentliche Beiträge und begrenzte Beiträge, die mit einem Aspekt geteilt wurden, in dem du dich befindest. Um diese Beiträge aus deinem Stream zu entfernen, höre einfach auf, mit den jeweiligen Leuten zu teilen."
@@ -481,7 +485,7 @@ de:
     private_posts:
       can_comment_a: "Nur eingeloggte diaspora*-Nutzer, welche sich in diesem Aspekt befinden, können deinen privaten Beitrag kommentieren oder „Gefällt mir“ drücken."
       can_comment_q: "Wer kann private Beiträge kommentieren oder „Gefällt mir“ drücken?"
-      can_reshare_a: "Niemand. Private Beiträge können nicht weitergesagt werden. Eingeloggte diaspora*-Nutzer aus dem Aspekt können sie aber trotzdem potenziell kopieren und in einen neuen Beitrag einfügen."
+      can_reshare_a: "Niemand. Private Beiträge können nicht weitergesagt werden. Eingeloggte diaspora*-Nutzer aus dem Aspekt können sie aber potenziell in einen neuen Beitrag kopieren. Du musst entscheiden, ob du solchen Leuten vertraust!"
       can_reshare_q: "Wer kann meine privaten Beiträge weitersagen?"
       see_comment_a: "Nur Leute, mit denen der Beitrag geteilt wurde (die Personen welche sich in den ausgewählten Aspekten des Orginalautors befinden), können Kommentare und Klicks auf „Gefällt mir“ sehen. "
       see_comment_q: "Wer sieht, dass mir ein privater Beitrag gefällt oder dass ich ihn kommentiert habe?"
@@ -497,7 +501,7 @@ de:
       who_sees_profile_a: "Dein grundlegendes Profil (Name, Profilbild und #Tags) ist öffentlich. Dein erweitertes Profil ist standardmäßig privat, aber du kannst es komplett öffentlich zugänglich machen, wenn du möchtest. Nur Leute, mit denen du teilst (das heißt du hast sie zu einem deiner Aspekte hinzugefügt), können dein erweitertes Profil sehen, wenn du es privat hältst. Andere Leute werden nur deine öffentlichen Informationen sehen. Jede Profilinformation, die du öffentlich machst, kann von jedem im Internet gesehen und von Suchmaschinen indexiert werden"
       who_sees_profile_q: "Wer sieht mein Profil?"
     public_posts:
-      can_comment_reshare_like_a: "Jeder angemeldete diaspora*-Nutzer kann öffentliche Beiträge weitersagen, kommentieren, beziehungsweise „Gefällt mir“ drücken."
+      can_comment_reshare_like_a: "Alle angemeldeten diaspora*-Nutzer können öffentliche Beiträge weitersagen, kommentieren, beziehungsweise „Gefällt mir“ drücken. Ausgenommen sind die, die du ignoriert hast."
       can_comment_reshare_like_q: "Wer kann meinen öffentlichen Beitrag kommentieren, weitersagen oder bei ihm auf „Gefällt mir“ drücken?"
       deselect_aspect_posting_a: "Öffentliche Beiträge werden durch das Abwählen von Aspekten nicht beeinflusst. Sie werden weiterhin in den Streams all deiner Kontakte angezeigt werden. Um einen Beitrag nur für bestimmte Aspekte sichtbar zu machen, musst du diese mit der Schaltfläche unter dem Eingabefeld auswählen."
       deselect_aspect_posting_q: "Was passiert wenn ich bei öffentlichen Beiträgen die Auswahl eines oder mehre Aspekte aufhebe?"
@@ -511,7 +515,7 @@ de:
     resharing_posts:
       reshare_private_post_aspects_a: "Nein, es ist nicht möglich, einen privaten Beitrag weiterzusagen. Dies ist so, um die Absichten des Originalautors zu respektieren, welcher nur mit einer bestimmten Gruppe von Leuten teilen wollte."
       reshare_private_post_aspects_q: "Kann ich einen privaten Beitrag für bestimmte Aspekte weitersagen?"
-      reshare_public_post_aspects_a: "Nein. Wenn du einen öffentlichen Beitrag weitersagst, entsteht ein automatisch ebenfalls öffentlicher Beitrag. Um ihn nur mit einigen Aspekten zu teilen, musst du ihn kopieren und in einen neuen Beitrag einfügen."
+      reshare_public_post_aspects_a: "Nein. Wenn du einen öffentlichen Beitrag weitersagst, entsteht automatisch ebenfalls ein öffentlicher Beitrag. Um ihn nur mit einigen Aspekten zu teilen, musst du ihn in einen neuen begrenzten Beitrag kopieren."
       reshare_public_post_aspects_q: "Kann ich einen öffentlichen Beitrag in einen einzelnen Aspekt weitersagen?"
       title: "Beiträge weitersagen."
     sharing:
@@ -526,7 +530,7 @@ de:
       add_to_aspect_li7: "Amy ist nun auf Bens Kontaktseite unter „Nur mit dir teilend“ zu finden."
       add_to_aspect_li8: "Amy wird Ben auch in einem Beitrag @erwähnen können."
       add_to_aspect_q: "Was passiert wenn ich jemanden zu meinen Aspekten hinzufüge? Oder wenn mich jemand zu seinen Aspekten hinzufügt?"
-      list_not_sharing_a: "Nein, aber du kannst auf den Profilseiten von Leuten nachsehen, ob sie mit dir teilen. Wenn ja, ist die Leiste unter deren Profilbild grün, andernfalls grau. Du solltest zudem immer, wenn jemand mit dir zu teilen beginnt, eine Benachrichtigung bekommen."
+      list_not_sharing_a: "Nein, aber du kannst sehen, ob jemand mit dir teilt oder nicht, indem du die Profilseite der Person besuchst. Wenn ja, befindet sich ein grünes Häkchen neben ihrer diaspora*-ID. Wenn nicht, befindet sich dort ein grauer Kreis."
       list_not_sharing_q: "Gibt es eine Liste mit Leuten, die ich zu einem meiner Aspekte hinzugefügt habe, die mich aber noch nicht zu einem ihrer Aspekte hinzugefügt haben?"
       only_sharing_a: "Das sind Leute, die dich zu einem ihrer Aspekte hinzugefügt haben, die sich aber in (noch) keinem deiner Aspekte befinden. Anders gesagt: Sie teilen mit dir, aber du nicht mit ihnen (Asymmetrisches Teilen). Sobald du sie zu einem Aspekt hinzugefügt hast, werden sie in diesem Aspekt und nicht unter „Nur mit dir teilend“ zu sehen sein. Siehe oben."
       only_sharing_q: "Wer ist auf der Kontaktseite unter „Nur mit dir teilend“ zu finden?"
@@ -566,11 +570,11 @@ de:
       byline: "Du bist drauf und dran, das Internet zu ändern. Lass uns gleich alles einrichten, okay?"
       configuration_info: "Öffne %{database_path} und %{diaspora_path} in deinem Lieblingstexteditor und sieh sie gründlich durch, sie sind ausführlich kommentiert."
       configure_your_pod: "Richte deinen Pod ein"
-      contact_irc: "im IRC"
+      contact_irc: "kontaktiere uns im IRC"
       contribute: "Wirke mit"
       contribute_info: "Mach diaspora* noch besser! Falls du Fehler findest, bitte %{report_bugs}."
       create_an_account: "Erstelle ein Konto"
-      create_an_account_info: "Jetzt ein %{sign_up_link}."
+      create_an_account_info: "Um ein neues Konto anzulegen klicke %{sign_up_link}."
       faq_for_podmins: "häufig gestellte Fragen für Pod-Verwalter in unserem Wiki"
       getting_help: "Erhalte Hilfe"
       getting_help_info: "Wir haben einige %{faq} aufgelistet, einschließlich einiger zusätzlicher Tipps und Tricks und Lösungen für die häufigsten Probleme. Kontaktiere uns gerne auch %{irc}."
@@ -578,7 +582,7 @@ de:
       make_yourself_an_admin: "Mach dich zum Admin"
       make_yourself_an_admin_info: "Du kannst Anweisungen im %{wiki} finden. Das sollte deinem Benutzermenü in der Kopfleiste einen Link „%{admin_dashboard}“ hinzufügen, wenn du angemeldet bist. Er stellt dir Dinge wie Benutzersuche und Statistiken für deinen Pod zur Verfügung."
       report_bugs: "melde sie"
-      update_instructions: "Aktualisierungsanweisungen im diaspora*-Wiki"
+      update_instructions: "Update-Anleitungen im diaspora*-Wiki"
       update_your_pod: "Aktualisiere deinen Pod"
       update_your_pod_info: "Du kannst %{update_instructions} finden."
   invitation_codes:
@@ -607,7 +611,7 @@ de:
     application:
       back_to_top: "Zurück zum Anfang"
       be_excellent: "Seid nett zueinander! ♥"
-      discourse: "Projektdiskussionen und Hilfe"
+      discourse: "Projektdiskussionen und Unterstützung"
       powered_by: "Betrieben mit diaspora*"
       public_feed: "Öffentlicher diaspora* Feed von %{name}"
       source_package: "Quelltextpaket runterladen"
@@ -771,7 +775,8 @@ de:
           Es trat ein Fehler beim Verarbeiten deiner Daten auf.
           Bitte versuche es noch einmal!
 
-          Gruß,
+          Entschuldige bitte,
+
           Der diaspora* email bot!
       subject: "Entschuldige %{name}, es gab einen Fehler beim Verarbeiten deiner Daten."
     export_photos_email:
@@ -984,13 +989,13 @@ de:
       terms_link: "Nutzungsbedingungen"
       username: "Benutzername"
   report:
-    comment_label: "<b>Kommentar</b>: %{data}"
+    comment_label: "<strong>Kommentar</strong>: %{data}"
     confirm_deletion: "Bist du dir sicher, dass du das Objekt löschen willst?"
     delete_link: "Lösche Element"
     not_found: "Der Beitrag/Kommentar wurde nicht gefunden. Es sieht so aus, als ob er vom Benutzer gelöscht wurde!"
-    post_label: "<b>Beitrag</b>: %{content}"
+    post_label: "<strong>Beitrag</strong>: %{content}"
     reason_label: "Grund:"
-    reported_label: "<b>Gemeldet von</b> %{person}"
+    reported_label: "<strong>Gemeldet von</strong> %{person}"
     reported_user_details: "Details des gemeldeten Benutzers"
     review_link: "Als überprüft markieren"
     status:
@@ -1151,9 +1156,9 @@ de:
       none: "Der leere Tag existiert nicht!"
       stop_following: "#%{tag} nicht mehr folgen"
       tagged_people:
-        one: "1 Person ist getaggt mit %{tag}"
-        other: "%{count} Personen sind getaggt mit %{tag}"
-        zero: "Niemand ist getaggt mit %{tag}"
+        one: "1 Person ist mit %{tag} getaggt"
+        other: "%{count} Personen sind mit %{tag} getaggt"
+        zero: "Niemand ist mit %{tag} getaggt"
   username: "Benutzername"
   users:
     confirm_email:
@@ -1197,7 +1202,7 @@ de:
       last_exported_at: "(Zuletzt aktualisiert: %{timestamp})"
       liked: "jemandem dein Beitrag gefällt"
       mentioned: "du in einem Beitrag erwähnt wirst"
-      mentioned_in_comment: "du in einem Kommentar erwähnt wirst"
+      mentioned_in_comment: "du bist in einem Kommentar erwähnt worden"
       new_password: "Neues Kennwort"
       private_message: "du eine private Nachricht erhältst"
       receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …"
@@ -1208,8 +1213,8 @@ de:
       reshared: "jemand deinen Beitrag weitersagt"
       show_community_spotlight: "„Gemeinschafts-Schaukasten“ im Stream anzeigen"
       show_getting_started: "Einstiegshinweise wieder aktivieren"
-      someone_reported: "jemand einen Beitrag meldet"
-      started_sharing: "jemand anfängt, mit dir zu teilen"
+      someone_reported: "jemand hat einen Beitrag gemeldet"
+      started_sharing: "jemand fängt an mit dir zu teilen"
       stream_preferences: "Stream-Einstellungen"
       your_email: "Deine E-Mail-Adresse"
       your_email_private: "Deine E-Mail wird niemals von anderen Nutzern gesehen werden."
diff --git a/config/locales/diaspora/de_formal.yml b/config/locales/diaspora/de_formal.yml
index 04d0bb96e221fefa319d96adec79e2292cec5863..6800ab331044481a3a2abb347a50d2d31c624baf 100644
--- a/config/locales/diaspora/de_formal.yml
+++ b/config/locales/diaspora/de_formal.yml
@@ -98,7 +98,7 @@ de_formal:
       last_seen: "Zuletzt gesehen"
       ? "no"
       : Nein
-      nsfw: "NSFW (unpassend für den Arbeitsplatz)"
+      nsfw: "NSFW (unangemessen für den Arbeitsplatz)"
       unknown: "Unbekannt"
       ? "yes"
       : Ja
@@ -436,7 +436,7 @@ de_formal:
       diaspora_app_q: "Gibt es eine diaspora* App für Android oder iOS?"
       photo_albums_a: "Nein, momentan nicht. Aber Sie können sich die hochgeladenen Bilder einer Person im Reiter „Fotos” auf ihrer Profilseite ansehen."
       photo_albums_q: "Gibt es Foto- oder Videoalben?"
-      subscribe_feed_a: "Ja, allerdings ist diese Funktion noch immer nicht ganz ausgereift und das Ergebnis wird nicht ganz richtig formatiert. Wenn Sie die Funktion dennoch benutzen wollen, gehen Sie einfach zu der Profilseite der Person und klicken Sie auf die Feed-Schaltfläche deines Browsers oder kopieren Sie die Profil-URL (z.B. https://podname.org/people/irgendeinenummer) und fügen Sie sie in den Feedreader ein. Die resultierende Feed-Adresse sieht aus wie https://podname.org/public/benutzername.atom – diaspora* verwendet Atom an Stelle von RSS."
+      subscribe_feed_a: "Ja, allerdings ist diese Funktion noch immer nicht ganz ausgereift und das Ergebnis wird nicht ganz richtig formatiert. Wenn Sie die Funktion dennoch ausprobieren wollen, gehen Sie zu der Profilseite der Person und klicken Sie auf die Feed-Schaltfläche Ihres Browsers oder kopieren Sie die Profil-URL (z.B. https://podname.org/people/irgendeinenummer) und fügen Sie sie in den Feedreader ein. Die resultierende Feed-Adresse sieht aus wie https://podname.org/public/benutzername.atom – diaspora* verwendet Atom an Stelle von RSS."
       subscribe_feed_q: "Kann ich die öffentlichen Beiträge einer Person mit einem Feedreader verfolgen?"
       title: "Diverses"
     pods:
@@ -448,7 +448,7 @@ de_formal:
       what_is_a_pod_a: "Ein Pod ist ein Server, auf dem die diaspora*-Software läuft und der mit dem diaspora*-Netzwerk verbunden ist. „Pod“ ist eine Metapher für Hülsen von Pflanzen, die mehrere Samen enthalten, so wie der Server mehrere Benutzerkonten enthält. Es gibt viele verschiedene Pods. Sie können Kontakte von anderen Pods hinzufügen und mit ihnen kommunizieren. Es ist nicht nötig, Konten auf verschiedenen Pods zu erstellen! Einer reicht – So gesehen können Sie sich einen diaspora*-Pod wie einen E-Mail-Anbieter vorstellen. Es gibt öffentliche Pods, private Pods, und mit ein wenig Aufwand können Sie sogar Ihren eigenen betreiben."
       what_is_a_pod_q: "Was ist ein Pod?"
     posts_and_posting:
-      char_limit_services_a: "In diesem sollten Sie Ihren Beitrag auf das kleinere Zeichenlimit begrenzen (140 bei Twitter, 1000 bei Tumblr). Die Anzahl der verbliebenen Buchstaben wird angezeigt, wenn das Icon des entsprechenden Services hervorgehoben ist. Sie können Ihren Beitrag auch bei Überschreitung des Limits absenden, dieser wird jedoch bei dem jeweiligem Service abgeschnitten und mit einem Link zu dem Beitrag auf diaspora* ergänzt."
+      char_limit_services_a: "In diesem Fall sollten Sie Ihren Beitrag auf das kleinere Zeichenlimit begrenzen (140 bei Twitter, 1000 bei Tumblr). Die Anzahl der verbliebenen Buchstaben wird angezeigt, wenn das Icon des entsprechenden Services hervorgehoben ist. Sie können Ihren Beitrag auch bei Überschreitung des Limits absenden, dieser wird jedoch bei dem jeweiligem Service abgeschnitten und mit einem Link zu dem Beitrag auf diaspora* ergänzt."
       char_limit_services_q: "Was, wenn ich meinen Beitrag mit einem verbundenen Dienst mit geringerer Zeichenanzahl teile?"
       character_limit_a: "65.535 Zeichen. Das sind 65.395 Zeichen mehr, als Sie bei Twitter benutzen können! ;)"
       character_limit_q: "Wie groß ist das Zeichenlimit für Beiträge?"
@@ -458,6 +458,10 @@ de_formal:
       format_text_q: "Wie kann ich einen Beitrag formatieren (Fett, kursiv, etc.)?"
       hide_posts_a: "Wenn Sie Ihren Mauszeiger über einem Beitrag positionieren, erscheint rechts ein kleines ×. Klicken Sie darauf, um den Beitrag zu verstecken und die Benachrichtigungen zu ihm zu deaktivieren. Sie können den Beitrag weiterhin auf der Profilseite der Person betrachten, die ihn gepostet hat."
       hide_posts_q: "Wie blende ich einen Beitrag aus?"
+      ignore_user_a1: "Wenn Sie derzeit mit dieser Person teilen, entfernen Sie sie von Ihren Aspekten. Damit blenden Sie viele ihrer Beiträge aus Ihren Stream aus. Eine vollständigere Methode ist es das Konto zu \"ignorieren\". Dies verhindert das irgendeiner ihrer Beiträge in Ihrem Stream erscheint, und sie werden nicht mehr in der Lage sein einen ihrer Beiträge zu mögen oder kommentieren. Jedoch werden sie weiter in der Lage sein Ihre Beiträge zu teilen, Ihre geteilten Beiträge und Ihre Kommentare zu Beiträgen anderer Personen zu kommentieren. Diese sind in Ihrem Stream noch für Sie sichtbar."
+      ignore_user_a2: "Klicken Sie auf das \"Ignorieren\"-Symbol (ein diagonal durchgestrichener Kreis), um ein Konto zu ignorieren oben rechts auf einen ihrer Beiträge. Diese Beiträge werden sofort aus Ihrem Stream verschwinden. Alternativ, gehen Sie auf Ihre Profilseite und klicken dort auf das Ignorier-Symbol. Sie können Ihre Beiträge auf Ihrer Profilseite noch sehen oder die Single-View-Ansicht verwenden."
+      ignore_user_a3: "Eine Liste ignorierter Personen finden Sie in Ihren Kontoeinstellungen unter Datenschutz. Um jemanden nicht mehr zu ignorieren entfernen Sie sie aus der Liste auf dieser Seite."
+      ignore_user_q: "Wie verhindere ich, dass jemandes Beiträge in meinem Stream erscheinen?"
       insert_images_a: "Klicken Sie auf das kleine Kamera-Symbol, um ein Foto zu einem Beitrag hinzuzufügen. Klicken Sie erneut darauf, um weitere Fotos hinzuzufügen, oder wählen Sie mehrere Fotos aus, um sie alle auf einmal hinzuzufügen."
       insert_images_comments_a: "Sie können Markdown verwenden, um ein Bild aus dem Internet in einen Kommentar einzufügen, genau wie in Beiträgen. Sie können allerdings keine Bilder von Ihrem Computer direkt in Kommentare hochladen. Laden Sie sie auf einen Bilder-Hosting-Dienst hoch und fügen Sie sie dann mittels der Bild-Schaltfläche über dem Eingabefeld ein."
       insert_images_comments_q: "Kann ich Bilder in Kommentare einfügen?"
@@ -527,7 +531,7 @@ de_formal:
       add_to_aspect_li8: "Amy wird Ben auch in einem Beitrag @erwähnen können."
       add_to_aspect_q: "Was passiert, wenn ich jemanden zu meinen Aspekten hinzufüge oder wenn mich jemand zu seinen Aspekten hinzufügt?"
       list_not_sharing_a: "Nein, aber Sie können nachsehen, ob jemand ihnen folgt, indem sie dessen Profilseite besuchen. Falls das der Fall ist, wird die Schaltfläche, die die Aspekte zeigt, zu dem Sie die Person hinzugefügt haben, grün sein; falls nicht wird sie grau sein."
-      list_not_sharing_q: "Gibt es eine Liste mit Leuten, die ich zu einem meiner Aspekte hinzugefügt habe, die mich aber noch nicht zu einem ihrer Aspekte hinzugefügt haben?"
+      list_not_sharing_q: "Gibt es eine Liste mit Leuten, die ich zu einem meiner Aspekte hinzugefügt habe, die mich aber nicht zu einem ihrer Aspekte hinzugefügt haben?"
       only_sharing_a: "Das sind Leute, die Sie zu einem ihrer Aspekte hinzugefügt haben, die sich aber (noch) nicht in einem Ihrer Aspekte befinden. Anders gesagt: Sie teilen mit Ihnen, aber Sie nicht mit ihnen: Sie können sich dies so vorstellen, dass sie Ihnen „folgen”. Wenn Sie sie zu einem Aspekt hinzufügen, werden sie in jenem Aspekt und nicht unter „Nur mit Ihnen Teilende“ zu sehen sein. Siehe oben."
       only_sharing_q: "Wer sind die Leute, die auf der Kontakteseite unter „Nur mit Ihnen Teilende” gelistet sind?"
       see_old_posts_a: "Nein. Er wird ausschließlich neue Beiträge für diesen Aspekt sehen. Er (und alle anderen) können aber alle älteren öffentlichen Beiträge von Ihnen auf Ihrer Profilseite oder in ihrem Stream sehen."
@@ -772,7 +776,7 @@ de_formal:
           Entschuldigung,
 
           Der diaspora* E-Mail-Roboter!
-      subject: "Entschuldige, es gab einen Fehler beim Verarbeiten Ihrer Daten, %{name}"
+      subject: "Entschuldigung, es gab einen Fehler beim Verarbeiten Ihrer Daten, %{name}"
     export_photos_email:
       body: |-
           Hallo %{name},
@@ -942,7 +946,7 @@ de_formal:
       last_name: "Nachname"
       limited: "Begrenzt"
       nsfw_check: "Markiere alles, was ich teile, als NSFW"
-      nsfw_explanation: "NSFW („Not safe for work“, dt. „Unpassend für den Arbeitsplatz“) ist diaspora*s sich selbst verwaltender Community-Standard für Inhalte, die für das Ansehen während der Arbeit möglicherweise ungeeignet sind. Bitte aktivieren Sie diese Option, falls Sie häufig derartiges Material teilen möchten, damit es in den Streams anderer Leute, die es nicht sehen wollen, ausgeblendet wird."
+      nsfw_explanation: "NSFW („Not safe for work“, dt. „Unangemessen für den Arbeitsplatz“) ist diaspora*’s sich selbst verwaltender Community-Standard für Inhalte, die für das Ansehen während der Arbeit möglicherweise ungeeignet sind. Bitte aktivieren Sie diese Option, falls Sie häufig derartiges Material teilen möchten, damit es in den Streams anderer Leute, die es nicht sehen wollen, ausgeblendet wird."
       nsfw_explanation2: "Wenn Sie diese Option nicht verwenden möchten, markieren Sie entsprechendes Material bitte mit dem Tag #nsfw."
       public: "Öffentlich"
       settings: "Profileinstellungen"
@@ -1013,7 +1017,7 @@ de_formal:
     destroy:
       success: "Authentifizierung erfolgreich gelöscht."
     failure:
-      error: "Es gab einen Fehler der Verbindung mit dem Dienst"
+      error: "Mit dem Dienst gab es einen Verbindungsfehler"
     index:
       connect: "Verbinden"
       disconnect: "Verbindung entfernen"
@@ -1168,14 +1172,14 @@ de_formal:
       character_minimum_expl: "bitte mindestens sechs Zeichen eingeben"
       close_account:
         dont_go: "Bitte gehen Sie nicht!"
-        lock_username: "Ihr Benutzername wird gesperrt werden. Sie werden auf diesem Pod kein neues Konto mit derselben ID erstellen können."
-        locked_out: "Sie werden abgemeldet und von Ihrem Konto ausgesperrt, bis es gelöscht wurde."
-        make_diaspora_better: "Wir würden uns freuen, wenn Sie bleiben und uns helfen, diaspora* besser zu machen, anstatt uns zu verlassen. Wenn Sie uns jedoch wirklich verlassen möchten, wird folgendes passieren:"
+        lock_username: "Ihr Benutzername wird gesperrt. Sie werden kein neues Konto auf diesem Pod mit derselben ID erstellen können."
+        locked_out: "Sie werden abgemeldet und Ihr Konto wird gesperrt, bis es gelöscht ist."
+        make_diaspora_better: "Wir würden uns freuen, wenn Sie bleiben und helfen, diaspora* verbesser, anstatt zu verlassen. Wenn Sie uns jedoch wirklich verlassen möchten, wird folgendes passieren:"
         mr_wiggles: "Mr. Wiggles wird traurig sein, wenn Sie gehen"
         no_turning_back: "Es gibt kein Zurück! Wenn Sie sich wirklich sicher sind, geben Sie Ihr Passwort unten ein."
         what_we_delete: "Wir löschen alle Ihre Beiträge und Ihr Profil so schnell wie möglich. Ihre Kommentare auf Beiträge anderer Leute werden noch angezeigt, aber Sie werden mit Ihrer diaspora*-ID anstatt mit Ihrem Namen verknüpft."
       close_account_text: "Konto schließen"
-      comment_on_post: "jemand Ihren Beitrag kommentiert"
+      comment_on_post: "jemand hat Ihren Beitrag kommentiert"
       current_password: "Derzeitiges Passwort"
       current_password_expl: "das mit dem Sie sich anmelden..."
       default_post_visibility: "Zum Teilen vorausgewählte Aspekte"
@@ -1188,11 +1192,11 @@ de_formal:
       export_photos_in_progress: "Ihre Fotos werden derzeit verarbeitet. Bitte sehen Sie in wenigen Augenblicken erneut nach."
       following: "Teilen-Einstellungen"
       last_exported_at: "(Zuletzt aktualisiert am %{timestamp})"
-      liked: "jemandem Ihr Beitrag gefällt"
-      mentioned: "Sie in einem Beitrag erwähnt werden"
+      liked: "jemandem gefällt Ihr Beitrag"
+      mentioned: "Sie wurden in einem Beitrag erwähnt"
       mentioned_in_comment: "Sie in einem Kommentar erwähnt werden"
       new_password: "Neues Passwort"
-      private_message: "Sie eine private Nachricht erhalten"
+      private_message: "Sie haben eine private Nachricht erhalten"
       receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn:"
       request_export: "Meine Profildaten anfordern"
       request_export_photos: "Meine Fotos anfordern"
@@ -1201,8 +1205,8 @@ de_formal:
       reshared: "jemand Ihren Beitrag weitersagt"
       show_community_spotlight: "„Gemeinschafts-Schaukasten” im Stream anzeigen"
       show_getting_started: "„Erste Schritte”-Hinweise anzeigen"
-      someone_reported: "jemand eine Meldung sendet"
-      started_sharing: "jemand anfängt, mit Ihnen zu teilen"
+      someone_reported: "jemand hat eine Meldung gesendet"
+      started_sharing: "jemand fängt an mit Ihnen zu teilen"
       stream_preferences: "Stream-Einstellungen"
       your_email: "Ihre E-Mail-Adresse"
       your_email_private: "Ihre E-Mail-Adresse wird niemals von anderen Nutzern gesehen werden"
@@ -1212,7 +1216,7 @@ de_formal:
       community_welcome: "diaspora*s Gemeinschaft freut sich, Sie an Bord zu haben!"
       connect_to_facebook: "Wir können das Ganze etwas beschleunigen, indem Sie %{link}. So werden Ihr Name und Ihr Profilbild hier eingefügt und die Crossposting-Funktion aktiviert."
       connect_to_facebook_link: "Ihr Facebook-Konto mit diaspora* verlinken"
-      hashtag_explanation: "Hashtags ermöglichen Ihnen, über Ihre Interessen zu reden und ihnen zu folgen.  Sie sind auch ein guter Weg, neue Leute bei diaspora* zu treffen!"
+      hashtag_explanation: "Hashtags ermöglichen Ihnen, über Ihre Interessen zu reden und ihnen zu folgen. Sie sind auch ein guter Weg, neue Leute bei diaspora* zu treffen!"
       hashtag_suggestions: "Probieren Sie mal Tags wie #kunst, #musik oder #gif zu folgen."
       well_hello_there: "Also, Hallöchen!"
       what_are_you_in_to: "Was machen Sie so?"
@@ -1233,7 +1237,7 @@ de_formal:
       follow_settings_not_changed: "Ändern der Folgen-Einstellungen fehlgeschlagen."
       language_changed: "Sprache geändert"
       language_not_changed: "Fehler beim Ändern der Sprache."
-      password_changed: "Passwort geändert.  Sie können sich nun mit Ihrem neuen Passwort anmelden."
+      password_changed: "Passwort geändert. Sie können sich nun mit Ihrem neuen Passwort anmelden."
       password_not_changed: "Passwortänderung fehlgeschlagen"
       settings_not_updated: "Aktualisierung der Einstellungen fehlgeschlagen"
       settings_updated: "Einstellungen aktualisiert"
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index cb98753f88c1fa3449d1139f44cf822b11f2c599..f22bafc4723f8229945d20726d95d2460f210560 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -402,6 +402,10 @@ en:
       hide_posts_a: "If you point your mouse at the top of a post, an X appears on the right. Click it to hide the post and mute notifications about it. You can still see the post if you visit the profile page of the person who posted it."
       post_notification_q: "How do I get notifications, or stop getting notifications, about a post?"
       post_notification_a: "You will find a bell icon next to the X at the top right of a post. Click this to enable or disable notifications for that post."
+      ignore_user_q: "How do I stop someone’s posts from appearing in my stream?"
+      ignore_user_a1: "If you are currently sharing with that person, removing them from your aspects will stop many of their posts from appearing in your stream. A more complete method is to “ignore” that account. This will prevent any of their posts from appearing in your stream, and they will no longer be able to like or comment on your posts. They will, however, still be able to reshare your posts, comment on reshares of your posts, and their comments on posts by other people which appear in your stream will still be visible to you."
+      ignore_user_a2: "To ignore an account, click the “ignore” icon (a circle with a diagonal line through it) at the top right of one of their posts. Their posts will instantly disappear from your stream. Alternatively, go to their profile page and click the ignore icon there. You will still be able to see their posts on their profile page, or by using the single-post view."
+      ignore_user_a3: "A list of people you are ignoring can be found in your account settings under Privacy. To stop ignoring someone, remove them from the list on that page."
       post_report_q: "How do I report an offensive post?"
       post_report_a: "Click the alert triangle icon at the top right of the post to report it to your podmin. Enter a reason for reporting this post in the dialog box. Please only report posts that break our %{community_guidelines} or your pod’s terms of service, for example posts containing illegal content, or which are abusive or spam."
       character_limit_q: "What is the character limit for posts?"
@@ -940,9 +944,9 @@ en:
 
   report:
     title: "Reports overview"
-    post_label: "<b>Post</b>: %{content}"
-    comment_label: "<b>Comment</b>: %{data}"
-    reported_label: "<b>Reported by</b> %{person}"
+    post_label: "<strong>Post</strong>: %{content}"
+    comment_label: "<strong>Comment</strong>: %{data}"
+    reported_label: "<strong>Reported by</strong> %{person}"
     reason_label: "Reason:"
     review_link: "Mark as reviewed"
     delete_link: "Delete item"
diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml
index 6d20ada0f0704b38adb6220d146dbf4db4c3fb9f..4b73498e9a4e58f0b299ee71255a816411aae1e5 100644
--- a/config/locales/diaspora/es.yml
+++ b/config/locales/diaspora/es.yml
@@ -449,6 +449,10 @@ es:
       format_text_q: "¿Cómo puedo formatear el texto en mis publicaciones (negrita, italica, etc.)?"
       hide_posts_a: "Si apuntas tu mouse a la parte superior de una publicación, una X aparecerá en la derecha. Hazle click para ocultar la publicación y silenciar las notificaciones relacionadas. Puedes aún asi ver la publicación si visitas la pagina de perfil de la persona que le publico."
       hide_posts_q: "¿Cómo oculto una publicación?"
+      ignore_user_a1: "Si estás compartiendo con esas personas, eliminarles de tus aspectos detendrá la aparición de sus post en tu stream. Un método más completo es \"ignorar\" esas cuentas. Esto impedirá que cualquiera de sus post aparezcan en tu stream, y ellos no podrán darle a Like o comentar tus post. Ellos podrán, sin embargo, compartir tus post, comentar tus post que hayan compartido otros, y sus comenatrios en los post de otras personas que aparezcan en tu stream serán visibles para ti."
+      ignore_user_a2: "Para ignorar una cuenta, pulsa el icono \"ignorar\" (un círculo con una línea diagonal atravesándolo) en la parte superior derecha de alguno de sus post. Sus post instantáneamente desaparecerán de stream. Alternativamente, ve a su página de perfil y pulsa en el botón de ignorar allí. Tu todavía podrás ver sus post en la página de su perfil, o usando la vista de único-post."
+      ignore_user_a3: "La lista de personas que has ignorado puedes verla en los ajustes de tu cuenta, en la sección Privacidad. Para dejar de ignorar a alguien, bórrale de la lista en esa página."
+      ignore_user_q: "¿Cómo puedo impedir que los post de una persona aparezcan en mi stream?"
       insert_images_a: "Haz click en el pequeño ícono de la camara para insertar una imagen en una publicación. Presiona la foto otra ves para agregar otra foto, o puedes seleccionar multipes fotos para subir de una vez."
       insert_images_comments_a: "Puedes usar Markdown para insertar una imagen desde la web en un comentario, como en los posts. Sin embargo, no puedes subir imágenes de tu ordenador directamente a los comentarios. Súbelas a un servicio de almacenamiento de imágenes y entonces insértales usando el botón de imagen encima del editor."
       insert_images_comments_q: "¿Puedo insertar imágenes en los comentarios?"
diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml
index b57c2d5facca378348923db0d087ed5636936ca9..ca3667dae6508516b4c57abf1a06b514719df7db 100644
--- a/config/locales/diaspora/fr.yml
+++ b/config/locales/diaspora/fr.yml
@@ -34,7 +34,7 @@ fr:
         reshare:
           attributes:
             root_guid:
-              taken: "C'est fini, oui ? Vous avez déjà repartagé ce message !"
+              taken: "C'est si bien, c'est ça ? Vous avez déjà repartagé ce message !"
         user:
           attributes:
             email:
@@ -68,9 +68,9 @@ fr:
         one: "%{count} commentaire"
         other: "%{count} commentaires"
         zero: "Aucun commentaire"
-      current_segment: "La catégorie considérée a une moyenne de <b>%{post_yest}</b> messages par utilisateur, depuis <b>%{post_day}</b>"
+      current_segment: "La période courante a une moyenne de %{post_yest} messages par utilisateur, depuis %{post_day}"
       daily: "Quotidienne"
-      display_results: "Affichage des résultats pour la période <b>%{segment}</b>"
+      display_results: "Affichage des résultats pour la période %{segment}"
       go: "Exécuter"
       month: "Mois"
       posts:
@@ -81,7 +81,7 @@ fr:
         one: "%{count} repartage"
         other: "%{count} repartages"
         zero: "Aucun repartage"
-      tag_name: "Nom du tag : <b>%{name_tag}</b> Nombre : <b>%{count_tag}</b>"
+      tag_name: "Nom du tag : %{name_tag} Nombre : %{count_tag}"
       usage_statistic: "Statistiques d'utilisation"
       users:
         one: "%{count} utilisateur"
@@ -151,7 +151,11 @@ fr:
         login_required: "Vous devez d'abord vous connecter afin de pouvoir autoriser cette application"
         title: "Oups ! Quelque-chose n'a pas marché :("
       scopes:
+        aud:
+          description: "Cela donne la permission aud à l'application"
+          name: "aud"
         name:
+          description: "Cela donne la permission nom à l'application"
           name: "nom"
         nickname:
           description: "Cela donne les permissions liées au surnom à l'application"
@@ -237,7 +241,7 @@ fr:
       introduce_yourself: "Ceci est votre flux. Rejoignez-nous et présentez-vous."
       keep_pod_running: "Permettez à %{pod} de fonctionner rapidement et offrez une dose de café mensuelle à nos serveurs !"
       new_here:
-        follow: "Suivez %{link} et souhaitez la bienvenue aux nouveaux utilisateurs de diaspora* !"
+        follow: "Suivez %{link} et <a href=\"/tags/nouvelleici\">#nouvelleIci</a> et souhaitez la bienvenue aux nouveaux utilisateurs de diaspora* !"
         learn_more: "En savoir plus"
         title: "Accueillir les nouveaux"
       services:
@@ -324,7 +328,7 @@ fr:
       fail: "Message invalide"
     show:
       delete: "Supprimer la conversation"
-      hide: "masquer et mettre en muet la conversation"
+      hide: "Masquer et rendre la conversation muette"
       last_message: "Dernier message reçu %{timeago}"
       reply: "Répondre"
       replying: "Réponse en cours d'envoi..."
@@ -352,7 +356,7 @@ fr:
       data_visible_to_podmin_q: "Quelle quantité de mes informations l'administrateur du pod peut-il voir ?"
       download_data_a: "Oui. En bas de l'onglet 'Compte' de votre page de paramètres, il y a deux boutons : l'un pour télécharger vos données, l'autre pour télécharger vos photos."
       download_data_q: "Puis-je télécharger une copie de toutes les données contenues dans mon compte ?"
-      move_pods_a: "Dans le futur vous pourrez exporter votre compte provenant d'un pod et l'importer dans un autre, mais ce n'est pas possible pour l'instant. Vous pouvez toujours ouvrir un nouveau compte et ajouter les contacts de vos aspects dans celui-ci, et leur demander d'ajouter le nouveau compte à leurs aspects."
+      move_pods_a: "La version 0.7.0.0 de diaspora* apporte la première étape de migration de compte : vous pouvez exporter toutes vos données depuis la section \"compte\" de vos paramètres utilisateur. Gardez vos données en sécurité ! Dans une prochaine version vous pourrez migrer l'ensemble de votre compte (y compris vos messages et contacts) vers un autre pod."
       move_pods_q: "Comment déplacer mon compte d'un pod à un autre ?"
       title: "Gestion du compte et des données"
     aspects:
@@ -420,6 +424,7 @@ fr:
     mentions:
       how_to_mention_a: "Tapez le symbole \"@\" et commencez à taper leur nom. Un menu déroulant devrait apparaître pour vous permettre de les choisir plus facilement. Notez qu'il n'est possible de mentionner que des gens que vous avez ajoutés à un aspect."
       how_to_mention_q: "Comment puis-je mentionner quelqu'un lorsque je rédige un message ?"
+      mention_in_comment_a: "Depuis la version 0.7.0.0, yes! Vous pouvez mentionner quelqu'un dans un commentaire, de la même manière que vous pouviez le faire dans une publication, en tapant \"@\" puis en commençant à écrire son nom. Merci de noter que lorsque vous commentez une publication qui n'est pas publique, vous ne pouvez mentionner que les personnes qui ont déjà interagi avec la publication."
       mention_in_comment_q: "Puis-je mentionner quelqu'un dans un commentaire ?"
       see_mentions_a: "Oui, cliquez sur \"@Mentions\" dans la colonne de gauche de votre page d'accueil."
       see_mentions_q: "Il y a t-il un moyen de voir les messages dans lesquels j'ai été mentionné ?"
@@ -587,7 +592,7 @@ fr:
       empty: "Veuillez fournir au moins une adresse de courrier électronique."
       no_more: "Vous n’avez plus d’invitation."
       note_already_sent: "Une invitation a déjà été envoyée aux e-mails %{emails}"
-      rejected: "Les adresses de courrier électronique suivantes ont rencontré des problèmes :"
+      rejected: "Les adresses de courrier électronique suivantes ont rencontré des problèmes : %{emails}"
       sent: "Les invitations ont été envoyées à : %{emails}"
     new:
       codes_left:
@@ -785,7 +790,7 @@ fr:
       message: |-
           Bonjour !
 
-          Vous avez été invité·e par %{diaspora_id} à rejoindre diaspora* !
+          Vous avez été invité·e par %{user} à rejoindre diaspora* !
 
           Cliquez sur ce lien pour vous lancer dans l'aventure :
 
@@ -1027,7 +1032,7 @@ fr:
         other: "Dans %{count} aspects"
         zero: "Ajouter le contact"
     invitations:
-      by_email: "Par courriel"
+      by_email: "Inviter des personnes par courrier électronique"
       invite_your_friends: "Invitez vos amis"
       invites: "Invitations"
       share_this: "Partagez ce lien par courriel, sur un blog ou via les réseaux sociaux !"
diff --git a/config/locales/diaspora/hy.yml b/config/locales/diaspora/hy.yml
index 1173c99d5d646a9d5456c0cf90ca35d6011353b2..70ec4dea1a785cfc991dbc649010e2ddde2513cb 100644
--- a/config/locales/diaspora/hy.yml
+++ b/config/locales/diaspora/hy.yml
@@ -910,6 +910,8 @@ hy:
     title: "Ô²Õ¸Õ²Õ¸Ö„Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Õ¼Õ¸Õ¿Õ¡Õ£Õ«Ö€"
   reshares:
     comment_email_subject: "%{author}-Õ« Õ£Ö€Õ¡Õ¼Õ´Õ¡Õ¶ %{resharer}-Õ« Õ¿Õ¡Ö€Õ¡Õ®Õ´Õ¡Õ¶Õ¨"
+    create:
+      error: "Տարածել չստացվեց։"
     reshare:
       deleted: "Օրիգինալ գրառումը ջնջվել է հեղինակի կողմից։"
       reshare_confirmation: "Տարածե՞լ %{author}-ի գրառումը։"
diff --git a/config/locales/diaspora/ja.yml b/config/locales/diaspora/ja.yml
index 5aa9d70f1f5e1d1c991bfa6c0507711182b75038..ec50a11269a976ddffe08882de730e28bb7fcb74 100644
--- a/config/locales/diaspora/ja.yml
+++ b/config/locales/diaspora/ja.yml
@@ -451,6 +451,10 @@ ja:
       format_text_q: "自分の投稿内のテキストの書式 (太字、斜体など) を設定する方法は?"
       hide_posts_a: "投稿の先頭にマウスを移動すると、X が右側に表示されます。それをクリックすると、投稿を非表示にして、それに関する通知をミュートします。それを投稿した人のプロフィールページを訪問すると、まだ投稿を見ることができます。"
       hide_posts_q: "投稿を非表示にする方法は?"
+      ignore_user_a1: "現在その人と共有している場合は、その人をアスペクトから削除すると、投稿の多くはあなたのストリームに表示されなくなります。 より完全な方法は、そのアカウントを「無視」することです。 これにより、その人の投稿があなたのストリームに表示されなくなり、その人があなたの投稿にいいねをしたりコメントをつけることができなくなります。 ただし、その人があなたの投稿を再共有したり、あなたの投稿の再共有にコメントしたり、あなたのストリームに表示されている他の人の投稿に対するコメントは引き続き表示されます。"
+      ignore_user_a2: "アカウントを無視するには、彼らの投稿の右上にある「無視」アイコン (対角線が引かれた円) をクリックします。 その投稿はあなたのストリームから即座に消えます。 または、彼らのプロフィールページに移動し、そこにある無視アイコンをクリックします。 彼らのプロフィールページで彼らの投稿を表示したり、シングル投稿ビューを使用したりすることはできます。"
+      ignore_user_a3: "あなたが無視している人のリストは、あなたのアカウント設定のプライバシーの下にあります。 誰かを無視するのを止めるには、そのページのリストからそれを削除します。"
+      ignore_user_q: "自分のストリームに誰かの投稿が表示されるのを止める方法は?"
       insert_images_a: "小さなカメラアイコンをクリックして、投稿に画像を挿入します。もう一度カメラアイコンを押して別の写真を追加したり、複数の写真を選択して一度にアップロードすることができます。"
       insert_images_comments_a: "投稿と同様に、Markdown を使用して、ウェブから画像をコメントに挿入できます。 ただし、コメントにコンピュータから画像を直接アップロードすることはできません。 画像ホスティングサービスにアップロードして、その後公開者の上にある画像ボタンを使用して挿入します。"
       insert_images_comments_q: "コメントに画像を挿入することはできますか?"
diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml
index 6fa91721d6babd94adb46abf21d0cdf2d09cfa17..6fc06e9afd17e4ab018e03dbc32ad06a3976a1e8 100644
--- a/config/locales/diaspora/nb.yml
+++ b/config/locales/diaspora/nb.yml
@@ -10,7 +10,7 @@ nb:
   _help: "Hjelp"
   _services: "Tjenester"
   _statistics: "Statistikk"
-  _terms: "bruksvilkår"
+  _terms: "Bruksvilkår"
   account: "Konto"
   activerecord:
     errors:
@@ -34,7 +34,7 @@ nb:
         reshare:
           attributes:
             root_guid:
-              taken: "Såpass bra, altså?  Du har allerede delt dette innlegget!"
+              taken: "Såpass bra, altså? Du har allerede delt dette innlegget!"
         user:
           attributes:
             email:
@@ -48,11 +48,19 @@ nb:
     admin_bar:
       dashboard: "Dashbord"
       pages: "Sider"
-      pod_stats: "Serverstatistikk"
+      pod_network: "Belgens nettverk"
+      pod_stats: "Belgstatistikk"
       report: "Rapporter"
       sidekiq_monitor: "Sidekiq overvåke"
       user_search: "Brukersøk"
       weekly_user_stats: "Ukentlig brukerstatistikk"
+    dashboard:
+      fetching_diaspora_version: "Finner ut siste diaspora*-versjon ..."
+      pod_status: "Belgens tilstand"
+    pods:
+      pod_desktop_link: "skrivebordsvisning"
+      pod_desktop_view: "Denne siden er ikke tilgjengelig på mobilvisning, vennligst bytt til %{desktop_link}."
+      pod_network: "Belgens nettverk"
     stats:
       2weeks: "To uker"
       50_most: "50 mest populære tagger"
@@ -73,7 +81,7 @@ nb:
         one: "%{count} deling"
         other: "%{count} delinger"
         zero: "%{count} delinger"
-      tag_name: "Tag-navn: <b>%{name_tag}</b> antall <b>%{count_tag}</b>"
+      tag_name: "Tagg-navn: %{name_tag} Antall: %{count_tag}"
       usage_statistic: "Bruksstatistikk"
       users:
         one: "%{count} bruker"
@@ -86,6 +94,7 @@ nb:
       email: "e-post"
       guid: "GUID"
       id: "ID"
+      invite_token: "Invitasjonsnøkkel"
       last_seen: "Sist sett"
       ? "no"
       : nei
@@ -103,7 +112,10 @@ nb:
       are_you_sure_unlock_account: "Er du sikker på at du vil låse opp denne kontoen?"
       close_account: "Avslutt konto"
       email_to: "E-post for invitasjon"
+      invite: "Inviter"
+      lock_account: "LÃ¥s konto"
       under_13: "Vis deltakere under 13 (COPPA)"
+      unlock_account: "LÃ¥s opp konto"
       users:
         one: "%{count} bruker funnet"
         other: "%{count} brukere funnet"
@@ -118,17 +130,70 @@ nb:
         one: "Antall nye brukere denne uken: %{count}"
         other: "Antall nye brukere denne uken: %{count}"
         zero: "Antall nye brukere denne uken: ingen"
-      current_server: "Dagens server-dato er %{date}"
+      current_server: "Dagens tjenerdato er %{date}"
   all_aspects: "Alle aspekter"
+  api:
+    openid_connect:
+      authorizations:
+        destroy:
+          fail: "Forsøket på å fjerne autorisasjonen som har ID %{id} feilet"
+        new:
+          access: "%{name} behøver tilgang til:"
+          approve: "Godta"
+          bad_request: "Mangler klient-ID eller redirect-URI"
+          client_id_not_found: "Fant ingen klienter med client_id %{client_id} og redirect URI %{redirect_uri}"
+          deny: "Avslå"
+          no_requirement: "%{name} behøver ingen tilganger"
+          redirection_message: "Er du sikker på at du vil gi tilgang til %{redirect_uri}?"
+      error_page:
+        contact_developer: "Du burde kontakte utvikleren av denne applikasjonen og inkludere denne detaljerte feilmeldingen:"
+        could_not_authorize: "Denne applikasjonen kan ikke bli autorisert"
+        login_required: "Du må først logge inn før du kan autorisere denne applikasjonen"
+        title: "Oi! Noe gikk galt :("
+      scopes:
+        name:
+          description: "Dette gir navneprivilegier til applikasjonen"
+          name: "navn"
+        nickname:
+          description: "Dette gir kallenavnprivilegier til applikasjonen"
+          name: "kallenavn"
+        openid:
+          description: "Dette tillater at applikasjonen kan lese din basisprofil"
+          name: "basisprofil"
+        picture:
+          description: "Dette gir applikasjonen bildetilganger"
+          name: "bilde"
+        profile:
+          description: "Dette gir applikasjonen tilgang til å lese den utvidede profilen din"
+          name: "den utvidede profilen"
+        read:
+          description: "Dette tillater at applikasjonen kan lese din strøm, dine samtaler og din fullstendige profil"
+          name: "les profil, strøm og samtaler"
+        sub:
+          description: "Dette gir underprivilegier til applikasjonen"
+          name: "under"
+        write:
+          description: "Dette tillater at applikasjonen kan sende nye innlegg, skrive samtaler og sende reaksjoner"
+          name: "send innlegg, samtaler og reaksjoner"
+      user_applications:
+        index:
+          access: "%{name} har tilgang til:"
+          edit_applications: "Applikasjon"
+          no_requirement: "%{name} behøver ingen tilganger"
+          title: "Autoriserte applikasjoner"
+        no_applications: "Du har ingen autoriserte applikasjoner"
+        policy: "Se applikasjonens personvernerklæring"
+        revoke_autorization: "Trekk tilbake"
+        tos: "Se applikasjonens brukervilkår"
   are_you_sure: "Er du sikker?"
   are_you_sure_delete_account: "Er du sikker på at du vil stenge kontoen din? Dette kan ikke gjøres om på!"
   aspect_memberships:
     destroy:
-      failure: "Kunne ikke fjerne person fra aspekt"
+      failure: "Kunne ikke fjerne personen fra aspektet."
       forbidden: "Du har ikke lov til å gjøre det."
       invalid_statement: "Duplikatoppføring avvist."
-      no_membership: "Kunne ikke finne personen i det aspektet"
-      success: "Personen er fjernet fra aspektet"
+      no_membership: "Kunne ikke finne personen i det aspektet."
+      success: "Personen er fjernet fra aspektet."
   aspects:
     add_to_aspect:
       failure: "Kunne ikke legge kontakt til aspektet."
@@ -140,34 +205,37 @@ nb:
       stay_updated: "Hold deg oppdatert"
       stay_updated_explanation: "Din hovedstrøm viser alle kontaktene dine, tagger som du følger og innlegg fra noen kreative medlemmer i felleskapet."
     destroy:
-      failure: "%{Name} er ikke tom, og kunne ikke fjernes."
+      failure: "%{name} kunne ikke fjernes."
       success: "%{name} har blitt fjerna."
       success_auto_follow_back: "%{name} er fjernet. Du brukte dette aspektet for å automatisk følge folk som begynte å følge deg. Sjekk brukerinnstillingene dine for å velge et nytt aspekt til å automatisk følge folk som begynner å følge deg."
     edit:
       aspect_list_is_not_visible: "Kontakter i dette aspektet kan ikke se hverandre."
       aspect_list_is_visible: "Kontakter i dette aspektet er i stand til å se hverandre."
       confirm_remove_aspect: "Er du sikker på at du vil slette dette aspektet?"
-      rename: "endre navn"
-      update: "oppdater"
-      updating: "oppdaterer"
+      rename: "Endre navn"
+      update: "Oppdater"
+      updating: "Oppdaterer"
     index:
       donate: "Doner"
+      donate_liberapay: "Doner til librapay"
       help:
         any_problem: "Noen problemer?"
-        contact_podmin: "Kontakt administratoren til din \"pod\"!"
+        contact_podmin: "Kontakt administratoren til din belg!"
         do_you: "Har du:"
         feature_suggestion: "... et %{link}-forslag?"
         find_a_bug: "... finn en %{link}?"
         have_a_question: "... et %{link}?"
         here_to_help: "Diaspora-felleskapet er her!"
-        mail_podmin: "Podmin e-post"
+        mail_podmin: "E-post til belgmin"
         need_help: "Trenger du hjelp?"
+        support_forum: "Du kan også bli med i %{support_forum}."
+        support_forum_link: "supportforumet"
         tag_bug: "#bug"
         tag_feature: "funksjon"
         tag_question: "#question"
         tutorial_link_text: "Veiledninger"
         tutorials_and_wiki: "%{faq}, %{tutorial} og %{wiki}: Hjelp for dine første skritt"
-      introduce_yourself: "Dette er strømmen din. Hopp inn og presenter deg selv."
+      introduce_yourself: "Dette er strømmen din. Hopp inn og introduser deg selv."
       keep_pod_running: "Sørg for at %{pod} går kjapt ved å kjøpe kaffe-fiks til dem med en månedlig donasjon!"
       new_here:
         follow: "Følg %{link} og ønsk nye brukere velkommen til diaspora*!"
@@ -178,9 +246,10 @@ nb:
         heading: "Koble til tjenester"
       welcome_to_diaspora: "Velkommen til diaspora*, %{name}!"
     no_contacts_message:
-      community_spotlight: "kreative medlemmer"
+      community_spotlight: "Interessante brukere"
+      invite_link_text: "inviter"
       or_spotlight: "Eller du kan dele med denne %{link}"
-      try_adding_some_more_contacts: "Du kan søke etter eller invitere flere kontakter."
+      try_adding_some_more_contacts: "Du kan søke etter eller %{invite_link} flere kontakter."
       you_should_add_some_more_contacts: "Du bør legge til flere kontakter."
     seed:
       acquaintances: "Bekjente"
@@ -202,15 +271,24 @@ nb:
     heading: "Diaspora Bookmarklet"
     post_something: "Publiser noe på diaspora*"
   cancel: "Avbryt"
+  color_themes:
+    dark: "Mørk"
+    dark_green: "Mørkegrønn"
+    egyptian_blue: "Egyptisk blå"
+    magenta: "Magenta"
+    original: "Originalgrå"
+    original_white: "Original, hvit bakgrunn"
   comments:
+    create:
+      error: "Lykkes ikke i å kommentere."
     new_comment:
       comment: "Kommenter"
       commenting: "Kommenterer ..."
   contacts:
     index:
       add_contact: "Legg til kontakt"
-      all_contacts: "Alle Kontakter"
-      community_spotlight: "Fremhevet av Fellesskapet"
+      all_contacts: "Alle kontakter"
+      community_spotlight: "Interessante brukere"
       my_contacts: "Mine kontakter"
       no_contacts: "Ingen kontakter."
       no_contacts_in_aspect: "Du har ikke noen kontakter i dette aspektet ennå. Under er en liste over eksisterende kontakter som du kan legge til i dette aspektet."
@@ -221,6 +299,7 @@ nb:
       user_search: "Søk etter kontakt"
     spotlight:
       community_spotlight: "Fremhevet av Fellesskapet"
+      no_members: "Det finnes ingen medlemmer ennå."
       suggest_member: "Forslå et nytt medlem"
   conversations:
     create:
@@ -233,19 +312,22 @@ nb:
       conversations_inbox: "Samtale - Inbox"
       inbox: "Innboks"
       new_conversation: "Ny samtale"
-      no_messages: "ingen meldinger"
+      no_contacts: "Du må legge til noen kontakter før du kan starte en samtale."
+      no_messages: "Ingen meldinger"
     new:
+      message: "Melding"
       send: "Send"
       sending: "Sender ..."
-      subject: "emne"
+      subject: "Emne"
       subject_default: "Intet emne"
-      to: "til"
+      to: "Til"
     new_conversation:
       fail: "Ugyldig melding"
     show:
-      delete: "slett og blokkér samtalen"
+      delete: "Slett samtale"
       hide: "Gjem og demp samtale"
-      reply: "svar"
+      last_message: "Siste mottatte melding: %{timeago}"
+      reply: "Svar"
       replying: "Svarer ..."
   date:
     formats:
@@ -255,29 +337,31 @@ nb:
   delete: "Slett"
   email: "Epost"
   error_messages:
+    csrf_token_fail: "CSFR-nøkkelen er ugyldig. Vennligst logg inn og prøv igjen."
     helper:
       correct_the_following_errors_and_try_again: "Rett opp de følgende feilene og prøv igjen."
+    need_javascript: "Denne nettsiden krever JavaScript for å fungere skikkelig. Dersom du har slått av JavaScript, må du vennligst slå på JavaScript og laste siden på ny."
   fill_me_out: "Fortell meg"
   find_people: "Finn folk eller #tagger"
   help:
     account_and_data_management:
-      close_account_a: "GÃ¥ til bunnen av instillings-siden din og klikk Slett bruker-knappen."
+      close_account_a: "Gå til bunnen av innstillinger-siden din og klikk Avslutt konto-knappen. Du vil bli bedt om å taste inn passordet ditt for å fullføre prosessen. Husk at hvis du avslutter kontoen din, vil du <strong>aldri</strong> kunne re-registrere brukernavnet ditt på den samme belgen."
       close_account_q: "Hvordan sletter jeg frøet (kontoen) min?"
-      data_other_podmins_a: "Når du har begynt å dele med noen på en annen pod, vil poster du deler med dem og en kopi av dine profildata lagres (midlertidig «cache»-minne) på deres pod, og være tilgjengelig for den pod-ens databaseadministrator. Når du sletter en post eller profildata slettes det fra din pod og eventuelle andre pod-er hvor det tidligere hadde vært lagret."
-      data_other_podmins_q: "Kan administratorene på andre pods se informasjonen min?"
-      data_visible_to_podmin_a: "Kommunikasjon «mellom» pod-er er alltid kryptert (med SSL og diaspora* sin egen transportkryptering), men lagringen av data på pod-er er ikke kryptert. Om de hadde villet, kunne databaseadministratoren for din pod (vanligvis personen som driver pod-en) gått inn på alle dine profildata og alt det du poster (slik tilfellet er for de fleste nettsteder som lagrer brukerdata). Å drive din egen pod gir mer privathet ettersom du da kontrollerer tilgangen til databasen."
-      data_visible_to_podmin_q: "Hvor mye av informasjonen min kan pod-administratoren min se?"
+      data_other_podmins_a: "Når du begynner å dele med noen på en annen belg, vil innlegg du deler med dem og en kopi av dine profildata lagres (i midlertidig hurtigbuffer) på deres belg og vil være tilgjengelig for belgens databaseadministrator. Når du sletter et innlegg eller profildata, slettes det fra din belg og en sletteforespørsel sendes til alle andre belger hvor det ble lagret tidligere. Bildene dine lagres aldri på noen annen belg enn din egen, det er kun lenkene til dem som sendes til andre belger."
+      data_other_podmins_q: "Kan administratorene på andre belger se informasjonen min?"
+      data_visible_to_podmin_a: "Kort fortalt: Alt. Kommunikasjon mellom belger er alltid kryptert (med SSL og diaspora* sin egen transportkryptering), men lagringen av data på belger er ikke kryptert. Dersom de ønsket, kunne databaseadministratorene for din belg (vanligvis personene som driver belgen) gått inn på alle profildataene dine og alt det du sender inn (slik tilfellet er for de fleste nettsteder som lagrer brukerdata). Derfor lar vi deg velge hvilken belg du vil registrere deg på, slik at du kan velge en belg hvor du føler deg komfortabel med å lagre dataene dine. Å drive sin egen belg gir mer privatliv siden du da har full kontroll over tilgangen til databasen."
+      data_visible_to_podmin_q: "Hvor mye av informasjonen min kan belg-administratoren min se?"
       download_data_a: "Ja. på bunnen av Profil-fanen i instillings-siden din er det to knapper for å laste ned dataen din."
       download_data_q: "Kan jeg laste ned en kopi av alle dataene jeg har i frøet (kontoen) min?"
-      move_pods_a: "I fremtiden vil du ha mulighet til å eksportere kontoen din fra en pod og importere den på en annen, men dette er enda ikke mulig. Du kan alltids åpne en ny konto og legge til kontaktene dine på den nye kontoen, og så spørre dem om å legge den nye kontoen din til i sine aspekter."
-      move_pods_q: "Hvordan flytter jeg mitt seed (konto) fra en pod til en annen?"
+      move_pods_a: "Versjon 0.7.0.0 av diaspora* byr på første trinn av kontomigrering: Du kan nå eksportere alle dataene dine fra konto-seksjonen under innstillinger. Oppbevar dataene dine trygt! I en fremtidig versjon vil du kunne migrere hele kontoen din, inkludert innlegg og kontakter, til en annen belg."
+      move_pods_q: "Hvordan flytter jeg frøet mitt (kontoen) fra en belg til en annen?"
       title: "Konto og dataadministrasjon"
     aspects:
       change_aspect_of_post_a: "Nei, men du kan alltids lage en ny post med samme innhold og poste til et annet aspekt."
-      change_aspect_of_post_q: "NÃ¥r jeg har skrevet noe, kan jeg endre aspekt (er) som kan se det?"
+      change_aspect_of_post_q: "NÃ¥r jeg har publisert noe, kan jeg endre aspekt(er) som kan se det?"
       contacts_know_aspect_a: "Nei. De har ikke mulighet til å se hva navnet på aspektet er."
       contacts_know_aspect_q: "Vet kontaktene mine hvilke aspekter jeg har puttet dem i?"
-      contacts_visible_a: "Hvis du huker av for dette alternativet vil kontakter fra dette aspektet være istand til å se hvem som ellers er i det, på din profilside under ditt bilde. Dette alternativet er det best å kun velge dersom alle kontaktene i det aspektet kjenner hverandre. De vil uansett ikke kunne se hva aspektet er kalt."
+      contacts_visible_a: "Hvis du huker av for dette alternativet, vil kontakter fra dette aspektet kunne se de andre medlemmene i aspektet under kontakter-fanen på profilsiden din. (For tiden er det kun kontakter som er på samme belg som deg som vil kunne se kontakter-fanen på profilen din.) Det er best å bare velge dette alternativet dersom alle kontaktene i aspektet kjenner hverandre, for eksempel hvis aspektet er til en klubb eller et forening du tilhører. De vil uansett ikke kunne se hva aspektet er kalt."
       contacts_visible_q: "Hva betyr «knytter kontakter i dette aspektet synlig for hverandre»?"
       delete_aspect_a: "I listen din over aspekter til venstre i hovedsiden, hold musepekeren på aspektet du ønsker å slette. Klikk den lille «rediger»-blyanten som vises til høyre. Klikk sletteknappen i boksen som kommer frem."
       delete_aspect_q: "Hvordan sletter jeg et aspekt?"
@@ -301,20 +385,22 @@ nb:
       add_contact_roster_q: "Hvordan chatter jeg med noen i diaspora*?"
       contacts_page: "kontaktside"
       title: "Chat"
+    community_guidelines: "retningslinjer for samfunnet"
     faq: "FAQ"
     foundation_website: "diaspora-stiftelsens nettside"
     getting_help:
+      get_support_a_discourse: "Søk etter eksisterende diskusjoner knyttet til det du leter etter eller start en ny tråd i %{discourse}-plattformen vår"
       get_support_a_faq: "Les vår %{faq} på wiki"
-      get_support_a_hashtag: "spør i en offentlig post på diaspora* med %{question}-hashtaggen"
-      get_support_a_irc: "bli med oss på %{irc} (live-chat)"
-      get_support_a_tutorials: "sjekk våre %{tutorials}"
-      get_support_a_website: "besøk vår %{link}"
-      get_support_a_wiki: "søk på %{link}"
-      get_support_q: "Hva hvis spørsmålet mitt ikke er besvart i denne FAQ'en? Hvor kan jeg ellers få support."
-      getting_started_a: "Nå var du heldig. Prøv %{tutorial_series} på nettstedet for prosjektet vårt. Det vil ta deg gjennom registreringsprosessen steg for steg og vise deg alle de grunnleggende tingene du trenger å vite om hvordan man bruker diaspora*."
+      get_support_a_hashtag: "Spør i en offentlig post på diaspora* med %{question}-hashtaggen"
+      get_support_a_irc: "Bli med oss på %{irc} (live-chat)"
+      get_support_a_tutorials: "Sjekk våre %{tutorials}"
+      get_support_a_website: "Besøk %{link}"
+      get_support_a_wiki: "Søk på %{link}"
+      get_support_q: "Hva hvis spørsmålet mitt ikke er besvart i denne FAQ-en? Hvor kan jeg ellers få hjelp?"
+      getting_started_a: "Nå var du heldig. Prøv %{tutorial_series} på nettstedet til prosjektet vårt. Den vil ta deg gjennom registreringsprosessen steg for steg, og vise deg alle de grunnleggende tingene du trenger å vite om hvordan man bruker diaspora*."
       getting_started_q: "Hjelp! Jeg trenger hjelp med å komme i gang!"
       title: "FÃ¥ hjelp"
-    getting_started_tutorial: "'Komme i gang' veiledninger"
+    getting_started_tutorial: "«Komme i gang»-veiledningen"
     here: "her"
     irc: "IRC"
     keyboard_shortcuts:
@@ -333,6 +419,7 @@ nb:
     mentions:
       how_to_mention_a: "«»"
       how_to_mention_q: "Hvordan kan jeg omtale noen når jeg gjør et innlegg?"
+      mention_in_comment_a: "Siden versjon 0.7.0.0, ja! Du kan nevnte noen i en kommentar på samme måte som du kan gjøre det i et innlegg. Tast «@» og begynn å skrive navnet deres. Merk at når du kommenterer på et innlegg som ikke er offentlig, kan du bare nevne brukere som allerede har interagert med innlegget."
       mention_in_comment_q: "Kan jeg omtale noen i en kommentar?"
       see_mentions_a: "Ja, klikk på «Omtale» i venstre kolonne på hjemmesiden din."
       see_mentions_q: "Er det en måte å se innleggene der jeg har blitt omtale?"
@@ -346,17 +433,17 @@ nb:
       diaspora_app_q: "Finnes en diaspora* app for Android eller iOS?"
       photo_albums_a: "Nei, ikke for tiden. Derimot kan du se en persons opplastete bilder under Bilder-seksjonen på profilsiden deres."
       photo_albums_q: "Finnes det foto- eller videoalbumer?"
-      subscribe_feed_a: "Ja, men dette er fremdeles ikke en helt finpusset funksjon, og formateringen av resultatet er fremdeles temmelig røff. Hvis du likevel ønsker å prøve den, gå til noen profilside og klikk på feed-knappen i din nettleser, eller du kan kopiere profilens URL (dvs. https://joindiaspora.com/people/somenumber), og lime inn i en feed-leser. Den resulterende feed-adressen ser sånn ut: https://joindiaspora.com/public/username.atom diaspora* bruker Atom fremfor RSS."
+      subscribe_feed_a: "Ja, men dette er fremdeles ikke en helt finpusset funksjon, og formateringen av resultatet er fremdeles temmelig røff. Hvis du likevel ønsker å prøve den, gå til noen profilside og klikk på feed-knappen i nettleseren din eller kopier profilens URL (slik som https://joindiaspora.com/people/etellerannettall) og lime den inn i en feed-leser. Den resulterende feed-adressen ser sånn ut: https://joindiaspora.com/public/username.atom – diaspora* bruker Atom heller enn RSS."
       subscribe_feed_q: "Kan jeg abonnere på noens offentlige innlegg med en feed-leser?"
       title: "Diverse"
     pods:
-      find_people_a: "Inviter dine venner ved å bruke epostlinken i sidebar-en. Følg #tag-er for å oppdage andre som deler dien interesser, og legg de som poster ting som interesser deg til i et aspekt. Rop ut at du er #nyher i en offentlig post."
-      find_people_q: "Jeg ble med en pod, hvordan kan jeg finne noen å dele med?"
-      title: "Podden"
-      use_search_box_a: "Hvis du kjenner deres fulle diaspora* ID (f.eks. brukernavn@podnavn.org), kan du finne dem ved å søke etter den. Hvis du er på samme pod kan du søke etter bare brukernavnet deres. Et alternativ er å søke etter dem på deres profilnavn (navnet du ser på skjermen). Hvis et søk ikke virker første gangen, prøv det igjen."
+      find_people_a: "Inviter dine venner ved å bruke epostlenken i sidepanelet. Følg #tagger for å oppdage andre som deler interessene dine, og legg dem som skriver om ting som interesser deg til i et aspekt. Rop ut at du er #nyher i en offentlig post."
+      find_people_q: "Jeg ble nettopp med i en belg, hvordan finner jeg noen å dele med?"
+      title: "Belger"
+      use_search_box_a: "Du kan søke etter personer ved å taste inn brukernavnet deres eller diaspora*-navnet (navnet som vise i profilen deres). Hvis ingen av disse metodene virker, kan du taste inn deres fulle diaspora*-ID (brukernavn@belgnavn.org). Hvis søket ikke virker på første forsøk, kan det skyldes nettverksforsinkelser. Prøv å søke en gang til."
       use_search_box_q: "Hvordan bruker jeg søkeboksen for å finne bestemte personer?"
-      what_is_a_pod_a: "En pod er en server som kjører diaspora*-programvaren og som er tilknyttet diaspora*-nettverket. «Pod» er et metafor som på engelsk refererer til en del av planter, som inneholder frø, på den måten at en server inneholder et antall brukerkontoer. Der er mange forskjellige pod-er. Du kan legge til venner fra andre pod-er, og kommunisere med dem. (Du kan tenke på en diaspora*-pod som noe lignende en eposttilbyder: der fins offentlige pod-er, private pod-er, og med litt anstrengelse kan du til og med drive din egen)."
-      what_is_a_pod_q: "Hva er en podd?"
+      what_is_a_pod_a: "En belg er en tjener som kjører diaspora*-programvaren og som er tilknyttet diaspora*-nettverket. «Belg» er en metafor som refererer belgen på planter som inneholder frø, på den måten at en server inneholder et brukerkontoer. Der finnes mange forskjellige belger. Du kan legge til venner fra andre belger og kommunisere med dem. Du behøver ikke å åpne konto på forskjellige belger! Én er nok. Du kan tenke på en diaspora*-belg som noe lignende en eposttilbyder. Det finnes offentlige belger, private belger, og med litt innsats kan du til og med drive din egen."
+      what_is_a_pod_q: "Hva er en belg?"
     posts_and_posting:
       char_limit_services_a: "I det tilfellet er posten din begrenset til det laveste antallet tegn (140 når det gjelder Twitter, 1000 når det gjelder Tumblr), og antallet tegn du har igjen å bruke vises når den aktuelle tjenestens ikon markeres. Du kan fremdeles poste til disse tjenestene selv om posten din er lenger enn deres grense, men teksten blir avkortet på de tjenestene."
       char_limit_services_q: "Hva er tegngrensen for poster delt gjennom en tilkoblet tjeneste med et lavere tegnantall?"
@@ -368,7 +455,12 @@ nb:
       format_text_q: "Hvordan kan jeg formatere teksten i mine innlegg (fet, kursiv, etc.)?"
       hide_posts_a: "Hvis du holder musepekeren ved toppen av en post, vises en X til høyre. Klikk den for å skjule posten og mute beskjeder om den. Du kan fremdeles se posten hvis du besøker profilsiden til personen som postet den."
       hide_posts_q: "Hvordan skjuler jeg en post? / Hvordan kan jeg slutte å få beskjeder om en post jeg har kommentert på?"
+      ignore_user_a1: "Hvis du allerede deler med denne personen, vil du stoppe mange av personens innlegg ved å fjerne dem fra dine aspekter. Du kan også «ignorere» kontoen, noe som er en mer fullstendig løsning. Dette vil hindre alle innlegg fra personen fra å dukke opp i strømmen din og personen vil ikke lenger kunne like eller kommentere på innleggene dine. Personen vil derimot fortsatt kunne dele innleggene dine, kommentere på videredelinger av innleggene dine og kommentarer av denne personen på innlegg av andre personer som dukker opp i din strøm vil fortsatt være synlige for deg."
+      ignore_user_a2: "For å ignorere en konto, klikker du på «ignorer»-ikonet (en sirkel med en diagonal linje gjennom seg) øverst til høyre i et av innleggene til personen. Innleggene til personen vil straks forsvinne fra strømmen din. Du kan også gå til profilsiden til personen og klikke på ignorer-ikonet der. Du vil fortsatt kunne se innleggene på personens profilside eller ved å bruke visningen for enkeltinnlegg."
+      ignore_user_a3: "Du kan se en liste over personer du ignorerer i kontoinnstillingene dine under Personvern. For å slutte å ignorere noen, kan du fjerne dem fra listen på den siden."
+      ignore_user_q: "Hvordan hindrer jeg at en persons innlegg dukker opp i strømmen min?"
       insert_images_a: "Klikk på det lille kameraikonet for å sette inn et bilde i en post. Klikk på fotoikonet igjen for å legge til enda et bilde, eller du kan merke flere bilder å laste opp på en gang."
+      insert_images_comments_a: "Du kan bruke Markdown for å sette inn et bilde fra Internett i en kommentar, akkurat som i innlegg. Men du kan ikke laste opp bilder fra PC-en din direkte til en kommentarer. Last dem opp til en tjeneste for deling av bilder og sett dem så inn i kommentaren ved å bruke bildeknappen over send-knappen."
       insert_images_comments_q: "Kan jeg sett inn bilder i kommentarer?"
       insert_images_q: "Hvordan setter jeg inn bilder til innlegg?"
       post_location_a: "Klikk på knappenålsikonet ved siden av kameraet der du legger til bilder. Dette vil legge til plassering fra OpenStreetMap. Du kan selv endre plasseringen - det kan være at du kun ønsker å inkludere byen du er i heller enn den eksakte adressen."
@@ -377,7 +469,7 @@ nb:
       post_notification_q: "Hvordan slår jeg på, eller av, varslinger for et innlegg?"
       post_poll_a: "Klikk på graf-ikonet for å lage en spørreundersøkelse. Skriv inn spørsmålet og minst to svar. Ikke glem å gjøre innlegget offentlig hvis du vil at ale skal kunne delta i spørreundersøkelsen din."
       post_poll_q: "Hvordan legger jeg en spørreundersøkelse til innlegget mitt?"
-      post_report_a: "Klikk på varselstrekanten i det øvre, høyre hjørnet til innlegget som du ønsker å rapportere til din podmin. Oppgi en grunn til at du rapporterer dette innlegget i dialogboksen."
+      post_report_a: "Klikk på varselstrekanten i det øvre, høyre hjørnet til innlegget som du ønsker å rapportere til din belgmin. Oppgi en grunn til at du rapporterer dette innlegget i dialogboksen. Vennligst kun rapporter innlegg som bryter vår %{community_guidelines} eller din belgs brukervilkår, som for eksempel innlegg med ulovlig innhold, eller innlegg som er krenkende eller nettsøppel."
       post_report_q: "Hvordan rapporterer jeg et støtende innlegg?"
       size_of_images_a: "Nei. Bildedimensjonene justeres automatisk for å passe i strømmen. Markdown har ikke en kode for å spesifisere dimensjonene til et bilde."
       size_of_images_q: "Kan jeg tilpasse størrelsen på bilder i innlegg eller kommentarer?"
@@ -397,6 +489,14 @@ nb:
       title: "Private innlegg"
       who_sees_post_a: "Kun innloggede diaspora* brukere du har plassert i det aspektet kan se din private innlegg."
       who_sees_post_q: "NÃ¥r jeg poster en melding til et aspekt (dvs. en privat post), hvem kan se den?"
+    profile:
+      title: "Profil"
+      what_do_tags_do_a: "De hjelper folk med å bli kjent med deg. Profilbildet vil også dukke opp på venstresiden av strømmesidene for disse taggen sammen med andre som har dem i basisprofilen sin."
+      what_do_tags_do_q: "Hva gjør taggene i basisprofilen min?"
+      whats_in_profile_a: "Profilen din har to deler: basisprofilen og den utvidede profilen. Basisprofilen din inneholder navnet ditt, de fem taggene du bruker for å beskrive deg selv og fotoet ditt. Den utvidede profilen din har biografien din, lokasjonen din, kjønnet ditt og fødselsdagen din. All denne informasjonen er valgfri - det er opp til deg om du ønsker å oppgi den og du kan gjøre denne informasjonen så identifiserende eller anonym som du ønsker. Den utvidede profilen vises i kolonnen til venstre på profilsiden din, under profilbildet ditt."
+      whats_in_profile_q: "Hva er i profilen min?"
+      who_sees_profile_a: "Basisprofilen din (navn, profilbilde og #tagger) er offentlig. Den utvidede profilen din er privat som standard, men du kan gjør den offentlig tilgjengelig hvis du ønsker. Kun personer som du deler med (det vil si at du har lagt dem til i et aspekt) kan se den utvidede profilen din hvis du har valgt å gjøre den privat. All profilinformasjon som du velger å gjøre offentlig kan sees av hvem som helst som surfer på nettet og kan bli indeksert av søkemotorer"
+      who_sees_profile_q: "Hvem kan se profilen min?"
     public_posts:
       can_comment_reshare_like_a: "Enhver innloggede diaspora* bruker kan kommentere, videredele, eller liker din offentlige innlegg."
       can_comment_reshare_like_q: "Hvem kan kommentere, videredele, eller liker min offentlige innlegg?"
@@ -453,14 +553,45 @@ nb:
     tutorial: "veiledning"
     tutorials: "veiledninger"
     wiki: "wiki"
+  home:
+    default:
+      be_who_you_want_to_be: "Vær den du ønsker å være"
+      be_who_you_want_to_be_info: "Mange nettverk insisterer på at du bruker den ekte identiteten din. Ikke diaspora*. Her kan du velge hvem du vil være og dele så mye eller så lite om deg selv som du ønsker. Det er virkelig opp til deg å bestemme hvor mye du ønsker å kommunisere med andre."
+      byline: "Det sosiale nettverket der det er du som har kontrollen"
+      choose_your_audience: "Velg publikum"
+      choose_your_audience_info: "Med aspektene til diaspora* kan du velge akkurat hvem du vil dele noe med. Du kan være så offentlig eller privat som du ønsker. Del et morsomt bilde med hele verden eller en dyp hemmelighet med et par av dine nærmeste venner. Du har kontrollen."
+      headline: "Velkommen til %{pod_name}"
+      own_your_data: "Bestem over dataene dine"
+      own_your_data_info: "Mange nettverk bruker dataene dine til å tjene penger. De analyserer hva du gjør og så bruker de denne informasjonen til å vise deg reklame. diaspora* bruker ikke dataene dine til noen annet formål enn å la deg kontakte og dele med andre."
+    podmin:
+      byline: "Du er i ferd med å endre Internett. La oss få deg på plass, skal vi?"
+      configuration_info: "Åpne %{database_path} og %{diaspora_path} i et tekstredigeringsprogram og gå nøye gjennom dem. De er betydelig kommentert."
+      configure_your_pod: "Konfigurer belgen din"
+      contact_irc: "kontakt oss på IRC"
+      contribute: "Bidra"
+      contribute_info: "Gjør diaspora* enda bedre! Hvis du finner feil, vær snill å %{report_bugs}."
+      create_an_account: "Opprett en konto"
+      create_an_account_info: "%{sign_up_link} for en ny konto."
+      faq_for_podmins: "FAQ for belgvedlikeholdere i vår wiki"
+      getting_help: "FÃ¥ hjelp"
+      getting_help_info: "Vi har listet opp noen %{faq} inkludert noen ekstra tips og triks og løsningen for de vanligste problemene. Du må også gjerne %{irc}."
+      headline: "Velkommen, venn."
+      make_yourself_an_admin: "Gjør deg selv til en admin"
+      make_yourself_an_admin_info: "Du finner instruksjoner i %{wiki}. Dette burde legge til en %{admin_dashboard}-lenke i brukermenyen din når du er logget inn. Den gir deg ting som brukersøk og statistikk for belgen din."
+      report_bugs: "rapporter dem."
+      update_instructions: "oppdateringsinstruksjoner i diaspora*-wikien"
+      update_your_pod: "Oppdater belgen din"
+      update_your_pod_info: "Du kan finne %{update_instructions}."
   invitation_codes:
+    already_logged_in: "Du har blitt invitert av %{inviter} til å bli med i denne belgen, men du er allerede logget inn."
     not_valid: "Den invitasjonskoden er ikke lenger gyldig"
   invitations:
     create:
+      closed: "Invitasjoner er lukket for denne diaspora*-belgen."
       empty: "Vennligst angi i hvertfall en e-post adresse"
       no_more: "Du har ikke flere invitasjoner."
       note_already_sent: "Invitasjoner har blitt sendt til: %{emails}"
-      rejected: "Følgende e-postadresser hadde problemer:"
+      rejected: "Følgende e-postadresser hadde problemer: %{emails}"
       sent: "Invitasjoner har blitt sendt til:"
     new:
       codes_left:
@@ -476,17 +607,25 @@ nb:
   layouts:
     application:
       back_to_top: "Til toppen"
-      powered_by: "DREVET AV DIASPORA*"
+      be_excellent: "Vær fantastiske med hverandre! ♥"
+      discourse: "Prosjektdiskusjoner og -hjelp"
+      powered_by: "Drevet av diaspora*"
       public_feed: "Offentlig diaspora*-feed for %{name}"
       source_package: "Last ned kildekodepakken"
-      statistics_link: "Statistikk for poden"
-      toggle: "vis mobilsiden"
-      whats_new: "hva er nytt?"
+      statistics_link: "Statistikk for belgen"
+      toggle: "Vis mobilsiden"
+      whats_new: "Hva er nytt?"
     header:
-      code: "kode"
+      code: "Kode"
       logout: "logg ut"
       profile: "profil"
       settings: "innstillinger"
+      toggle_navigation: "Veksle navigasjon"
+  likes:
+    create:
+      error: "Ã… like feilet."
+    destroy:
+      error: "Kunne ikke slutte å like."
   limited: "Begrenset"
   more: "Mer"
   no_results: "Ingen resultater ble funnet"
@@ -527,6 +666,7 @@ nb:
       mark_read: "Marker som lest"
       mark_unread: "Merk som ulest"
       mentioned: "Nevnte"
+      mentioned_in_comment: "Nevnt i en kommentar"
       no_notifications: "Du har ingen varslinger ennå."
       notifications: "Varsler"
       reshared: "Delt"
@@ -555,6 +695,12 @@ nb:
       other: "%{actors} nevnte deg i en slettet post."
       two: "%{actors} nevnte deg i en slettet post."
       zero: "%{actors} nevnte deg i en slettet post."
+    mentioned_in_comment:
+      one: "%{actors} nevnte deg i en <a href='%{comment_path}'>kommentar</a> til innlegget %{post_link}."
+      other: "%{actors} nevnte deg i en <a href='%{comment_path}'>kommentar</a> til innlegget %{post_link}."
+    mentioned_in_comment_deleted:
+      one: "%{actors} nevnte deg i en slettet kommentar."
+      other: "%{actors} nevnte deg i en slettet kommentar."
     private_message:
       few: "%{actors} sendte deg en melding."
       many: "%{actors} sendte deg en melding."
@@ -583,14 +729,37 @@ nb:
     a_private_message: "Det er en ny privat samtale i diaspora* du kan ta en kikk på."
     also_commented:
       limited_subject: "Det finnes en ny kommentar på et innlegg du kommenterte på"
-    click_here: "klikk her"
+    click_here: "Klikk her"
     comment_on_post:
       limited_subject: "Det finnes en ny kommentar på et av dine innlegg"
       reply: "Svar eller se %{name} sine innlegg >"
     confirm_email:
       click_link: "To activate your new e-mail address %{unconfirmed_email}, please click this link:"
       subject: "Please activate your new e-mail address %{unconfirmed_email}"
-    email_sent_by_diaspora: "Denne e-posten er sendt av Diaspora. Hvis du ikke vil motta flere e-poster som denne, "
+    csrf_token_fail:
+      body: |-
+          Hei, %{name}
+
+          diaspora* har oppdaget et forsøk på å få tilgang til din sesjon som kan være uautorisert. Du har blitt logget ut for å unngå at ukjente skal få tilgang til dataene dine. Ikke vær bekymret, du kan trygt logge inn igjen nå.
+
+          Det ble gjort en forespørsel med en feilaktig eller manglende CSRF-nøkkel. Dette kan være helt uskyldig, men det kan også være en CSRF-angrep (cross site request forgery).
+
+          Dette kan skyldes
+
+            - en utvidelse som manipulerer forespørselen eller gjennomfører forespørsler uten nøkkelen
+            - en nettleserfane fra en tidligere sesjon som fortsatt er åpen
+            - en annen nettside som gjør en forespørsel med eller uten din tillatelse
+            - diverse andre eksterne verktøy
+            - ondsinnet kode som forsøker å få tilgang til dine data
+
+          For mer informasjon om CSRF, se [%{link}](%{link}).
+
+          Hvis du ser denne meldingen gjentatte ganger, vennligst sjekk punktene over, inkludert utvidelser til nettleseren din.
+
+          Med vennlig hilsen,
+          epostroboten til diaspora*!
+      subject: "Vi mottok en uautorisert forespørsel fra din konto, %{name}"
+    email_sent_by_diaspora: "Denne e-posten er sendt av %{pod_name}. Hvis du ikke vil motta flere e-poster som denne,"
     export_email:
       body: |-
           Hei, %{name}
@@ -620,8 +789,7 @@ nb:
           Dine bilder er ferdig behandlet og kan lastes ned ved å følge [denne lenken](%{url}).
 
           Med vennlig hilsen,
-
-          Diaspora*-epostroboten
+          E-postroboten til diaspora*!
       subject: "Dine bilder er klare for nedlasting, %{name}"
     export_photos_failure_email:
       body: |-
@@ -660,13 +828,17 @@ nb:
     mentioned:
       limited_post: "Du ble nevnt i et begrenset innlegg."
       subject: "%{name} har nevnt deg på diaspora*"
+    mentioned_in_comment:
+      limited_post: "Du ble nevnt i en kommentar til et avgrenset innlegg."
+      reply: "Svar på eller se denne samtalen >"
     private_message:
       reply_to_or_view: "Svar eller se på denne samtalen >"
+      subject: "Du har fått en ny privat melding"
     remove_old_user:
       body: |-
           Hei!
 
-          Siden du ikke har brukt diaspora*-kontoen din på %{pod_url} på %{after_days} dager, kan det se ut som om du ikke ønsker å ha den lenger. For å sikre at våre aktive brukere får best mulig ytelse fra denne diaspora*-poden, vil vi helst fjerne uønskede kontoer fra databasen vår.
+          Siden det er %{after_days} dager siden du sist brukte diaspora*-kontoen din på %{pod_url}, kan det se ut som om du ikke ønsker å ha den lenger. For å sikre at våre aktive brukere får best mulig ytelse fra denne diaspora*-belgen, vil vi helst fjerne uønskede kontoer fra databasen vår.
 
           Vi ville satt veldig pris på om du ikke forlot diaspora*-felleskapet vårt, og du må gjerne beholde kontoen hvis du ønsker det.
 
@@ -677,7 +849,7 @@ nb:
           HÃ¥per vi ser deg igjen!
 
           Med vennlig hilsen,
-          Diasporas epostrobot
+          E-postroboten til diaspora*
       subject: "Din diaspora*-konto er satt til å bli slettet på grunn av inaktivitet"
     report_email:
       body: |-
@@ -721,7 +893,7 @@ nb:
       no_one_found: "... og ingen ble funnet."
       no_results: "Hei! Du må søke etter noe."
       results_for: "Brukere tagget med %{search_term}"
-      search_handle: "Benytt diaspora* ID (brukernavn@pod.tid) for å finne dine venner."
+      search_handle: "Bruk diaspora*-ID deres (brukernavn@belg.tld) for å finne dine venner."
       searching: "Søker. Vennligst vent ..."
       send_invite: "Finner fremdeles ikke de du søker? Send en invitasjon!"
     person:
@@ -744,11 +916,17 @@ nb:
       notice: "Bildet er sletta."
     new_profile_photo:
       upload: "Last opp et nytt profilbilde!"
+  polls:
+    votes:
+      one: "Foreløpig %{count} stemme"
+      other: "Foreløpig %{count} stemmer"
+      zero: "Foreløpig ingen stemmer"
   posts:
     presenter:
       title: "En post fra %{name}"
     show:
       forbidden: "Du har ikke lov til å gjøre det"
+      location: "Publisert fra: %{location}"
       photos_by:
         one: "Et bilde av %{author}"
         other: "%{count} bilder av %{author}"
@@ -759,11 +937,19 @@ nb:
   profiles:
     edit:
       allow_search: "Tillat folk å søke på deg i diaspora*"
+      basic: "Basisprofilen min"
+      basic_hint: "Hver punkt i profilen din er valgfritt. Basisprofilen din vil alltid være synlig for alle."
+      extended: "Den utvidede profilen min"
+      extended_hint: "Klikk på bryteren for å avgjøre synligheten til den utvidede profilen din. Offentlig betyr at den er synlig for hele Internett, begrenset betyr at kun personer som du deler med kan se denne informasjonen."
+      extended_visibility_text: "Synligheten til den utvidede profilen din:"
       first_name: "Fornavn"
       last_name: "Etternavn"
+      limited: "Begrenset"
       nsfw_check: "Marker alt jeg deler som NSFW"
       nsfw_explanation: "NSFW («not safe for work») er diaspora* sin selvregulerende felleskapsstandard for innhold som muligens ikke er passende å se på når man er for eksempel er på jobb. Hvis du tenker å dele slikt materiale jevnlig, vennligst huk av for dette alternativet, slik at alt du deler vil være skjult fra folks strømmer med mindre de velger å se det."
       nsfw_explanation2: "Hvis du ikke velger denne opsjonen, vennligst legg til #nsfw tag for hver gang du deler slikt materiale"
+      public: "Offentlig"
+      settings: "Profilinnstillinger"
       update_profile: "Oppdater profil"
       your_bio: "Om meg"
       your_birthday: "Din fødselsdato"
@@ -772,13 +958,13 @@ nb:
       your_name: "Ditt navn"
       your_photo: "Ditt profilbilde"
       your_tags: "Deg: i 5 #tagger"
-      your_tags_placeholder: "f.eks. #diaspora #matlaging #skiskyting #musikk"
+      your_tags_placeholder: "Som #diaspora #matlaging #skiskyting #musikk"
     update:
       failed: "Kunne ikke oppdatere profil"
       updated: "Profil oppdatert"
   public: "Offentlig"
   registrations:
-    closed: "Registreringer er stengt på denne diaspora*-serveren."
+    closed: "Denne diaspora*-belgen er stengt for registreringer."
     create:
       success: "Du er nå med i diaspora*!"
     invalid_invite: "Invitasjonslenken som du brukte er ikke gyldig lenger!"
@@ -803,13 +989,20 @@ nb:
     post_label: "<b>Post</b>: %{title}"
     reason_label: "Ã…rsak:"
     reported_label: "<b>Rapportert av</b> %{person}"
+    reported_user_details: "Detaljer om den rapporterte brukeren"
     review_link: "Markert som verifisert"
     status:
       destroyed: "Innlegget ble slettet"
       failed: "Noe gikk galt..."
     title: "Oversikt over rapporter"
+    unreviewed_reports:
+      one: "Du har %{count} rapport som ikke er gjennomgått."
+      other: "Du har %{count} rapporter som ikke er gjennomgått."
+      zero: "Alle rapporter er gjennomgått."
   reshares:
     comment_email_subject: "%{resharer} sin videredeling av %{author} sitt innhold"
+    create:
+      error: "Kunne ikke videredele."
     reshare:
       deleted: "Opprinnelig innlegg slettet av forfatteren."
       reshare_confirmation: "Reshare %{author} - %{text}?"
@@ -830,10 +1023,12 @@ nb:
       disconnect: "koble fra"
       edit_services: "Rediger tjenester"
       logged_in_as: "logget inn som"
-      no_services_available: "Det  finnes ingen tjenester tilgjengelig på denne poden."
+      no_services_available: "Det  finnes ingen tjenester tilgjengelig på denne belgen."
       not_logged_in: "Ikke logget inn for øyeblikket."
       really_disconnect: "koble fra %{service}?"
       services_explanation: "Ved å koble til andre sosiale tjenester, får du muligheten å publisere til disse tjenestene idet du poster til diaspora*."
+      share_to: "Del med %{provider}"
+      title: "Behandle tilkoblede tjenester"
     provider:
       facebook: "Facebook"
       tumblr: "Tumblr"
@@ -858,7 +1053,7 @@ nb:
       control_your_audience: "Kontrollér ditt publikum"
       logged_in: "innlogget på %{service}"
       manage: "Behandle tilkoblede tjenester"
-      new_user_welcome_message: "Bruk #hashtags for å sette merkelapp på innleggene dine og finne folk som deler samme interessefelt. Rop ut til bra folk med @Mentions"
+      new_user_welcome_message: "Bruk #tagger for å sette merkelapp på innleggene dine og finne folk som deler samme interessefelt. Rop ut til bra folk med @Mentions"
       outside: "Offentlige meldinger vil være synlige for personer utenfor diaspora*."
       share: "Del"
       title: "Du er i ferd med å poste et offentlig innlegg!"
@@ -868,7 +1063,7 @@ nb:
       formatWithMarkdown: "Du kan benytte %{markdown_link} til å formatere din post"
       get_location: "Hent din posisjon"
       new_user_prefill:
-        hello: "Hei alle sammen, jeg er #%{new_user_tag}. "
+        hello: "Hei, alle sammen! Jeg er #%{new_user_tag}. "
         i_like: "Jeg er interessert i %{tags}."
         invited_by: "Takk for invitasjonen,  "
         newhere: "NyHer"
@@ -913,19 +1108,27 @@ nb:
   streams:
     activity:
       title: "Min aktivitet"
+    admin:
+      title: "Admin"
     aspects:
+      all: "Alle aspekter"
       title: "Mine aspekter"
     aspects_stream: "Aspekter"
     comment_stream:
-      title: "Kommenterte poster"
+      title: "Kommenterte innlegg"
+    commented:
+      title: "Kommenterte innlegg"
     community_spotlight_stream: "Fremhevet av Fellesskapet"
     followed_tag:
-      add_a_tag: "Legg til en tag"
+      add_a_tag: "Legg til en tagg"
+      all: "Alle tagger"
       follow: "Følg"
       title: "#Fulgte tagger"
     followed_tags_stream: "#Fulgte tagger"
     like_stream:
       title: "Liker-strøm"
+    liked:
+      title: "Likte innlegg"
     mentioned_stream: "@Omtaler"
     mentions:
       title: "@Omtaler"
@@ -963,13 +1166,14 @@ nb:
       auto_follow_aspect: "Aspekt for automatisk fulgte brukere:"
       auto_follow_back: "Del automatisk med brukere som begynner å dele med deg"
       change: "Endre"
+      change_color_theme: "Endre fargetema"
       change_email: "Endre e-postadresse"
       change_language: "Endre språk"
       change_password: "Endre passord"
       character_minimum_expl: "må være minst seks tegn"
       close_account:
         dont_go: "Vennligst ikke forsvinn nå!"
-        lock_username: "Dette vil reservere brukernavnet ditt hvis du bestemmer deg for å registrere deg igjen."
+        lock_username: "Brukernavnet ditt vil bli låst. Du vil ikke kunne opprette en ny konto på denne belgen med samme ID."
         locked_out: "Du kommer til å bli avlogget og låst ute fra din konto"
         make_diaspora_better: "Vi ønsker at du hjelper oss å gjøre Diaspora bedre, så det hadde vært fint om du hjalp oss i stedet for å forlate oss. Hvis du allikevel ønsker å forsvinne så vil vi gjerne at du skal få vite hva som skjer videre."
         mr_wiggles: "Mr Wiggles blir lei seg om du forlater oss nå"
@@ -979,6 +1183,7 @@ nb:
       comment_on_post: "noen kommenterer på innlegget ditt"
       current_password: "NÃ¥verende passord"
       current_password_expl: "det som du logger på med ..."
+      default_post_visibility: "Forhåndsvalgt aspekt ved publisering"
       download_export: "Last ned min profil"
       download_export_photos: "Last ned mine bilder"
       edit_account: "Endre konto"
@@ -990,7 +1195,8 @@ nb:
       last_exported_at: "(Sist oppdatert %{timestamp})"
       liked: "noen liker innlegget ditt"
       mentioned: "du blir omtalt i et innlegg"
-      new_password: "Nytt Passord"
+      mentioned_in_comment: "du ble nevnt i en kommentar"
+      new_password: "Nytt passord"
       private_message: "du har mottatt en privat melding"
       receive_email_notifications: "Motta varsler på e-post når:"
       request_export: "Be om min profildata"
@@ -1012,7 +1218,7 @@ nb:
       connect_to_facebook: "Vi kan gjøre dette litt kjappere ved hjelp av %{link} til diaspora*. Dette vil trekke ut ditt navn og foto og tillate krysslagring/oppdatering av innhold."
       connect_to_facebook_link: "kobler opp til din Facebook konto"
       hashtag_explanation: "Hastags lar deg beskrive og følge dine interesser. De er også en fin måte å finne nye folk i diaspora*."
-      hashtag_suggestions: "Prøv å følge tags som #art, #movies, #gif, osv."
+      hashtag_suggestions: "Prøv å følge tagger som #art, #movies, #gif, osv."
       well_hello_there: "Vel, hallo der!"
       what_are_you_in_to: "Hva er dine interesser?"
       who_are_you: "Hvem er du?"
@@ -1025,6 +1231,8 @@ nb:
     public:
       does_not_exist: "Bruker %{username} finnes ikke!"
     update:
+      color_theme_changed: "Fargetema ble endret."
+      color_theme_not_changed: "En feil oppstod i forbindelse med endring av fargetema."
       email_notifications_changed: "Language Change Failed"
       follow_settings_changed: "Innstillinger for følging ble endret"
       follow_settings_not_changed: "Kunne ikke endre innstillinger for følging"
diff --git a/config/locales/diaspora/oc.yml b/config/locales/diaspora/oc.yml
index 111d0cf1e1c0bcb32f545283acdf9b6791c186c4..c8f2e6626251d77684b2db76865dc2e2c26f454c 100644
--- a/config/locales/diaspora/oc.yml
+++ b/config/locales/diaspora/oc.yml
@@ -68,9 +68,9 @@ oc:
         one: "%{count} comentari"
         other: "%{count} comentaris"
         zero: "Pas cap de comentari"
-      current_segment: "La categoria considerada a una mejana de <b>%{post_yest}</b> messatges per utilizaire, dempuèi <b>%{post_day}</b>"
+      current_segment: "La categoria considerada a una mejana de %{post_yest} messatges per utilizaire, dempuèi %{post_day}"
       daily: "Quotidiana"
-      display_results: "Afichatge dels resultats pel periòde <b>%{segment}</b>"
+      display_results: "Afichatge dels resultats pel periòde %{segment}"
       go: "Executar"
       month: "Mes"
       posts:
@@ -107,9 +107,9 @@ oc:
       account_locking_scheduled: "Lo compte de %{name} va èsser verrolhat dins un momenton"
       account_unlocking_scheduled: "Lo compte de %{name} va èsser desverrolhat dins un momenton."
       add_invites: "Apondre de convits"
-      are_you_sure: "Sètz segur que volètz tampar aqueste compte ?"
-      are_you_sure_lock_account: "Sètz segur que volètz verrolhar aqueste compte ?"
-      are_you_sure_unlock_account: "Sètz segur que volètz desverrolhar aqueste compte ?"
+      are_you_sure: "Sètz segur que volètz tampar aqueste compte ?"
+      are_you_sure_lock_account: "Sètz segur que volètz verrolhar aqueste compte ?"
+      are_you_sure_unlock_account: "Sètz segur que volètz desverrolhar aqueste compte ?"
       close_account: "Tampar aqueste compte"
       email_to: "Adreça electronica de la persona de convidar"
       invite: "Convidar"
@@ -138,15 +138,15 @@ oc:
         destroy:
           fail: "La temptativa de revocacion de l'autorizacion amb ID %{id} a fracassat"
         new:
-          access: "%{name} a besonh d'accedir a :"
+          access: "%{name} a besonh d'accedir a :"
           approve: "Aprovar"
           bad_request: "ID client mancant o URL de redireccion"
           client_id_not_found: "Pas de client amb client_id %{client_id} amb URL de redireccion %{redirect_uri} pas trobat"
           deny: "Regetar"
           no_requirement: "%{name} a pas besonh de permissions"
-          redirection_message: "Sètz segur que volètz donar accès a %{redirect_uri} ?"
+          redirection_message: "Sètz segur que volètz donar accès a %{redirect_uri} ?"
       error_page:
-        contact_developer: "Deuriatz contactar lo desvolopaire de l'aplicacion e inclure lo messatge d'error detalhat seguent :"
+        contact_developer: "Deuriatz contactar lo desvolopaire de l'aplicacion e inclure lo messatge d'error detalhat seguent :"
         could_not_authorize: "L'aplicacion a pas pugut èsser autorizada"
         login_required: "D'en primièr, vos cal vos connectar per fin de poder autorizar aquesta aplicacion"
         title: "Ops ! Quicòm a trucat :("
@@ -180,15 +180,15 @@ oc:
           name: "mandar publicacions, conversacions e reaccions"
       user_applications:
         index:
-          access: "%{name} a accès a :"
+          access: "%{name} a accès a :"
           edit_applications: "Aplicacions"
           no_requirement: "%{name} as pas besonh d'autorizacions."
           title: "Aplicacions autorizadas"
-        no_applications: "Avètz pas d'aplicacions autorizadas"
+        no_applications: "Avètz cap aplicacion autorizada"
         policy: "Veire la politica de confidencialitat de l'aplicacion"
         revoke_autorization: "Revocar"
         tos: "Veire las condicions d'utilizacion de l'aplicacion"
-  are_you_sure: "Sètz segur ?"
+  are_you_sure: "Sètz segur ?"
   are_you_sure_delete_account: "Sètz segur que volètz tampar vòstre compte ? Aquò se pòt pas anullar !"
   aspect_memberships:
     destroy:
@@ -214,7 +214,7 @@ oc:
     edit:
       aspect_list_is_not_visible: "Los contactes dins aqueste aspècte se pòdon veire entre eles."
       aspect_list_is_visible: "Los contactes dins aqueste aspècte se pòdon veire entre eles."
-      confirm_remove_aspect: "Sètz segur de volètz suprimir aqueste aspècte ?"
+      confirm_remove_aspect: "Sètz segur de volètz suprimir aqueste aspècte ?"
       rename: "Renomenar"
       update: "Metre a jorn"
       updating: "En cors de mesa a jorn"
@@ -222,15 +222,15 @@ oc:
       donate: "Far un don"
       donate_liberapay: "Far un don a liberapay"
       help:
-        any_problem: "Avètz agut un problèma ?"
+        any_problem: "Avètz agut un problèma ?"
         contact_podmin: "Contactar l'administrator de vòstre pod !"
-        do_you: "Volètz :"
-        feature_suggestion: "... far una suggestion de %{link} ?"
-        find_a_bug: "... signalar %{link} ?"
-        have_a_question: "... pausar una %{link} ?"
+        do_you: "Volètz :"
+        feature_suggestion: "... far una suggestion de %{link} ?"
+        find_a_bug: "... signalar %{link} ?"
+        have_a_question: "... pausar una %{link} ?"
         here_to_help: "La comunautat diaspora* es aquí !"
         mail_podmin: "Corrièl del podmin"
-        need_help: "Besonh d'ajuda ?"
+        need_help: "Besonh d'ajuda ?"
         support_forum: "Podètz tanben contactar lo %{support_forum}."
         support_forum_link: "forum d’assisténcia"
         tag_bug: "bug"
@@ -245,7 +245,7 @@ oc:
         learn_more: "Ne saber mai"
         title: "Aculhir los novèls venguts"
       services:
-        content: "Podètz connectar aqueles servicis a diaspora* :"
+        content: "Podètz connectar aqueles servicis a diaspora* :"
         heading: "Connectar de servicis"
       welcome_to_diaspora: "Benvenguda dins diaspora*, %{name} !"
     no_contacts_message:
@@ -348,46 +348,46 @@ oc:
   find_people: "Recercar de personas o de #etiquetas"
   help:
     account_and_data_management:
-      close_account_a: "Rensètz-vos en bas de la pagina e clicatz sul boton « Tampar lo compte ». Vòstre senhal vos serà demandat per acabar lo processus. Vos rapelam que se tampatz vòstre compte, ne poiretz <strong>pas mai</strong> tornar crear sus aqueste pod amb aqueste nom d'utilizaire."
-      close_account_q: "Cossí pòdi suprimir mon compte ?"
-      data_other_podmins_a: "A partir del moment que partejatz amb qualqu'un d'un autre pod, totas las publicacions que partejatz amb eles e una còpia de vòstre perfil seràn gardadas (en cache) sus lor pod e seràn accessiblas a l'administrator de la basa de donadas d'aquel pod. Quand suprimissètz una publicacion o una donada del perfil, es suprimit de vòstre pod e una demanda de supression es mandada a totes los pods ont son estadas gardadas. Vòstres imatges son pas jamai gardats sus d'autres pods ; i a pas que lo ligam cap a eles qu'es transmet als autres pods."
-      data_other_podmins_q: "Los administrators dels autres pods pòdon veire mas informacions ?"
-      data_visible_to_podmin_a: "En un mot: tot. La comunicacion entre los pods es totjorn chifrada (en utilizant SSL e lo pròpri transpòrt chifrat de diaspora*), mai las donadas enregistradas suls pods son pas chifradas.Se volián los administrators de la basa de donada de vòstre pod (sovent la persona en carga del pod) poiriá accedir a totas las donadas de vòstre perfil e a tot çò que publicatz (come es lo cas per lo màger dels sites qu'enregistran las informacions dels utilizaires). Aquò explica perque vos donem la possibilitat de causir sus quin pod vos marcar, pr'amor podètz causir un pod que l'administrator li fisatz vòstras donadas. Executar vòstre pod vos dòna mai de confidencialitat perque auretz lo contraròtle sus la basa de donadas."
-      data_visible_to_podmin_q: "Quina quantitat de mas informacions l'administrator del pod pòt veire ?"
+      close_account_a: "Anatz en bas de la pagina e clicatz lo boton « Tampar lo compte ». Vòstre senhal vos serà demandat per acabar lo processús. Vos rapelam que se tampetz vòstre compte, ne poiretz <strong>pas mai</strong> tornar crear un sus aqueste pod amb lo meteis nom d'utilizaire."
+      close_account_q: "Cossí pòdi suprimir mon compte (apelat seed) ?"
+      data_other_podmins_a: "A partir del moment que partejatz amb qualqu'un d'un autre pod, totas las publicacions que partejatz amb eles e una còpia de vòstre perfil seràn gardadas (en cache) sus lor pod e seràn accessiblas a l'administrator de la basa de donadas d'aquel pod. Quand suprimissètz una publicacion o una donada del perfil, es suprimit de vòstre pod e una demanda de supression es mandada a totes los pods ont son estadas gardadas. Vòstres imatges son pas jamai gardats sus d'autres pods ; i a pas que lo ligam cap a eles qu'es transmés als autres pods."
+      data_other_podmins_q: "Los administrators dels autres pods pòdon veire mas informacions ?"
+      data_visible_to_podmin_a: "En un mot : tot. La comunicacion entre los pods es totjorn chifrada (en utilizant SSL e lo pròpri transpòrt chifrat de diaspora*), mai las donadas enregistradas suls pods son pas chifradas. Se volián los administrators de la basa de donada de vòstre pod (sovent la persona en carga del pod) poiriá accedir a totas las donadas de vòstre perfil e a tot çò que publicatz (coma es lo cas per lo màger dels sites qu'enregistran las informacions dels utilizaires). Aquò explica perque vos donam la possibilitat de causir sus quin pod vos marcar, pr'amor podètz causir un pod que l'administrator li fisatz vòstras donadas. Executar vòstre pod vos dòna mai de confidencialitat perque auretz lo contraròtle sus la basa de donadas."
+      data_visible_to_podmin_q: "Quina quantitat de mas informacions l'administrator del pod pòt veire ?"
       download_data_a: "Òc. En dejós de los paramètres de Compte trobaretz dos botons : un per telecargar vòstras donadas e un per telecargar vòstras fotos."
-      download_data_q: "Pòdi telecargar una còpia de totas las donadas contengudas dins mon compte ?"
+      download_data_q: "Pòdi telecargar una còpia de totas las donadas contengudas dins mon compte (apelat seed) ?"
       move_pods_a: "Dins lo futur poiretz exportar vòstra grana - seed - d'un pod e l'importar dins un autre, mai pel moment es pas possible. Podètz totjorn dubrir un nòu compte e ajustar vòstres contactes sus aquela nòva grana, e lor demandar de vos ajustar sus lors aspèctes amb vòstra nòva grana."
-      move_pods_q: "Cossí desplaçar mon compte d'un pod a un autre ?"
+      move_pods_q: "Cossí desplaçar mon compte (apelat seed) d'un pod a un autre ?"
       title: "Gestion del compte e de las donadas"
     aspects:
       change_aspect_of_post_a: "Non, mas podètz totjorn crear una nòva publicacion amb lo meteis contengut e o publicar sus un autre aspècte."
-      change_aspect_of_post_q: "Un còp qu'ai publiat quicòm, pòdi cambiar los aspècte(s) qu'o pòdon veire ?"
+      change_aspect_of_post_q: "Un còp qu'ai publicat quicòm, pòdi cambiar los aspècte(s) qu'o pòdon veire ?"
       contacts_know_aspect_a: "Non pas. Pòdon pas veire lo nom de l'aspècte qualqu'arribe."
-      contacts_know_aspect_q: "Mos contactes pòdon saber sus quin aspècte los ai mes ?"
+      contacts_know_aspect_q: "Mos contactes pòdon saber dins quin aspècte los ai meses ?"
       contacts_visible_a: "Se causissètz aquesta opcion alara vòstres contactes d'aqueste aspècte poiràn veire qual es dedins, sus l'onglet « Contactes » de vòstra pagina de perfil. Es de melhor far de causir aquesta opcion solament se los contactes d'aqueste aspècte se coneisson entre eles, per exemple se l'aspècte es per un club o societat de la quala apertenètz. Ça que la poiràn pas veire cossí s'apèla l'aspècte."
-      contacts_visible_q: "Qué significa « rendre los contactes dins aqueste aspècte visibles entre eles » ?"
+      contacts_visible_q: "Qué significa « rendre los contactes dins aqueste aspècte visibles entre eles » ?"
       delete_aspect_a: "Clicatz « Mos aspèctes » dins la barra dins la vista del flux d'actualitat e clicatz l'icòna del gredon a costat del aspècte que volètz suprimir, o anatz sus vòstra pagina de Contactes e seleccionatz l'aspècte concernit. Puèi clicatz l'icòna del bordilhièr amont a man drecha de la pagina."
-      delete_aspect_q: "Cossí pòdi suprimir un aspècte ?"
+      delete_aspect_q: "Cossí pòdi suprimir un aspècte ?"
       person_multiple_aspects_a: "Òc-ben. Anatz a vòstra pagina de contactes e clicatz sus « Mos contactes ».  Per cada contacte podètz utilizar lo menú a man drecha per lo apondre (o levar) a tan d'aspèctes que volètz. O podètz los apondre a un novèl aspècte (o los levar d'un aspècte) en clicant sul boton de seleccion d'aspècte sus lor pagina de perfil. O podètz tanben solament bolegar lo puntaire sus lor nom ont lo vesètz dins vòstre flux d'actualitat, un cadron apareissarà. Podètz cambiar l'aspècte ont son d'aquí."
-      person_multiple_aspects_q: "Pòdi apondre una persona a mantun aspècte ?"
-      post_multiple_aspects_a: "Òc. Quand publicatz una publicacion, utilizatz lo boton per causir los aspèctes. « Totes los aspèctes » es la causida per defaut dins los paramaètres. Podètz tanben causir los aspèctes dins la barra de menú. Quand publicactz, lo(s) aspèctes qu'avètz causits dins la lista a man esquèrra seràn automaticament seleccionats per las publicacions venentas."
-      post_multiple_aspects_q: "Pòdi mandar un messatge a mantun aspècte a l'encòp ?"
+      person_multiple_aspects_q: "Pòdi apondre una persona a mantun aspècte ?"
+      post_multiple_aspects_a: "Òc. Quand publicatz una publicacion, utilizatz lo boton per causir los aspèctes. « Totes los aspèctes » es la causida per defaut dins los paramètres. Podètz tanben causir los aspèctes dins la barra de menú. Quand publicatz, lo(s) aspèctes qu'avètz causits dins la lista a man esquèrra seràn automaticament seleccionats per las publicacions venentas."
+      post_multiple_aspects_q: "Pòdi mandar un messatge a mantun aspècte a l'encòp ?"
       remove_notification_a: "Non. Tanpauc seràn pas avisats se los ajustatz dins mai aspèctes, del moment que ja partejatz amb eles."
-      remove_notification_q: "Se suprimissi qualqu'un d'un de mos aspèctes, o totas las personas d'un aspècte, son prevengudas ?"
+      remove_notification_q: "Se suprimissi qualqu'un d'un de mos aspèctes, o totas las personas d'un aspècte, son prevengudas ?"
       rename_aspect_a: "Clicatz « Mos aspèctes » sul costat esquèrra de la pagina de flux e clicatz sul gredonèl « editar » sus la dreita de l'aspècte de renomenar. Podètz tanben anar sus la pagina « Contactes » e seleccionar l'aspècte concernit. Clicatz alara sus l'icòna « editar » al costat del nom amont de la pagina, cambiatz lo nom e clicatz « Metre a jorn »."
-      rename_aspect_q: "Pòdi tornar nommar un aspècte ?"
+      rename_aspect_q: "Pòdi tornar nommar un aspècte ?"
       restrict_posts_i_see_a: "Òc-ben. Clicatz « Mos aspèctes » sus la barra e puèi clicatz sus cada aspècte dins la lista per los seleccionar o deseleccionar. Pas que las publicacions del mond dels aspèctes seleccionats seràn dins vòstre flux."
-      restrict_posts_i_see_q: "Pòdi afichar unicament los messatges de certans aspèctes ?"
+      restrict_posts_i_see_q: "Pòdi afichar unicament los messatges de certans aspèctes ?"
       title: "Aspèctes"
-      what_is_an_aspect_a: "Los aspèctes son lo biais qu'avètz d'amassar vòstres contactes sus diaspora*. Un aspècte es una de las fàcias que fasètz veire al mond. Pòt èsser vos al trabalh, o qual sètz per vòtra familha, o qual sètz per vòstres amics d'un club ont sètz marcat."
-      what_is_an_aspect_q: "De qué es un aspècte ?"
-      who_sees_post_a: "Se fasètz una publicacion limitad, serà visibla pas que pel mond qu'avètz plaçat dins aqueste aspècte (o aspèctes, s'es fach per mai d'un aspècte) abans de publicar. Los contactes qu'avètz e que son pas dins l'aspècte, an pas cap de biais de veire la publicacion. Las publicacions limitadas seràn pas jamai visiblas pel mond qu'avètz pas plaçat dins vòstres aspèctes."
-      who_sees_post_q: "Quand publiqui sus un aspècte, qual pòt o veire ?"
+      what_is_an_aspect_a: "Los aspèctes son lo biais qu'avètz d'amassar vòstres contactes sus diaspora*. Un aspècte es una de las fàcias que fasètz veire al mond. Pòt èsser vos al trabalh, o qual sètz per vòstra familha, o qual sètz per vòstres amics d'un club ont sètz marcat."
+      what_is_an_aspect_q: "De qué es un aspècte ?"
+      who_sees_post_a: "Se fasètz una publicacion limitada, serà visibla pas que pel mond qu'avètz plaçat dins aqueste aspècte (o aspèctes, s'es fach per mai d'un aspècte) abans de publicar. Los contactes qu'avètz e que son pas dins l'aspècte, an pas cap de biais de veire la publicacion. Las publicacions limitadas seràn pas jamai visiblas pel mond qu'avètz pas plaçat dins vòstres aspèctes."
+      who_sees_post_q: "Quand publiqui en un aspècte, qual pòt o veire ?"
     chat:
       add_contact_roster_a: |-
           D'en primièr, vos cal activar la conversacion per un aspècte ont es la persona. Per aquò far, anatz sus %{contacts_page}, seleccionatz l'aspècte que volètz e clicatz l'icòna de conversacion per l'activar sus l'aspècte.
           %{toggle_privilege} Poiriatz, se vos agrada mai, crear un aspècte especial apelat « Chat » e i ajustar lo mond amb qui volètz parlar. Un còp fach, dobrissètz l'interfàcia de conversacion e causissètz la persona amb qui volètz parlar.
-      add_contact_roster_q: "Cossí discutir amb qualqu'un dins diaspora* ?"
+      add_contact_roster_q: "Cossí discutir amb qualqu'un dins diaspora* ?"
       contacts_page: "pagina dels contactes"
       title: "Chat"
     community_guidelines: "règlas de comportament de la comunautat"
@@ -401,7 +401,7 @@ oc:
       get_support_a_tutorials: "Referissètz-vos a nòstres %{tutorials}"
       get_support_a_website: "Visitatz nòstre %{link}"
       get_support_a_wiki: "Recercatz dins lo %{link}"
-      get_support_q: "De qué far se ma question a pas de responsa dins la FAQ ? A quines autres endreits pòdi obténer de documentcion ?"
+      get_support_q: "De qué far se ma question a pas de responsa dins la FAQ ? A quines autres endreits pòdi obténer de documentacion ?"
       getting_started_a: "Sètz astruc. Ensajatz las %{tutorial_series} sul site de nòstre projècte. Vos ajudarà pas a pas de l'inscripcion cap a las causas basicas que vos cal saber per utilizar diaspora*."
       getting_started_q: "Ajudatz-me ! Ai besonh d'ajuda per debutar !"
       title: "Obténer d'ajuda"
@@ -409,7 +409,7 @@ oc:
     here: "aicí"
     irc: "IRC"
     keyboard_shortcuts:
-      keyboard_shortcuts_a1: "Dins lo flux, podètz utilizar los acorchis de clavièr seguents :"
+      keyboard_shortcuts_a1: "Dins lo flux, podètz utilizar los acorchis de clavièr seguents :"
       keyboard_shortcuts_li1: "j - Anar al messatge seguent"
       keyboard_shortcuts_li2: "k - Anar al messatge precedent"
       keyboard_shortcuts_li3: "c - Comentar lo messatge corrent"
@@ -418,80 +418,82 @@ oc:
       keyboard_shortcuts_li6: "m - Afichar l'ensemble del messatge"
       keyboard_shortcuts_li7: "o - Dobrir lo primièr ligam d'aqueste messatge"
       keyboard_shortcuts_li8: "ctrl + entrada - Mandar lo messatge en cors de redaccion"
-      keyboard_shortcuts_q: "Quines son los acorchis de clavièr existents ?"
+      keyboard_shortcuts_q: "Quines son los acorchis de clavièr existents ?"
       title: "Acorchis de clavièr"
     markdown: "Markdown"
     mentions:
       how_to_mention_a: "Picatz lo signe « @ » e començatz a escriure lor nom. Una lista desrotlanta deuriá aparéisser per vos permetre de los causir mai simplament. Notatz qu'es solament possible de mencionar de mond qu'avètz aponduts a un aspècte."
-      how_to_mention_q: "Cossí pòdi mencionar qualqu'un quand escrivi un messatge ?"
+      how_to_mention_q: "Cossí pòdi mencionar qualqu'un quand escrivi un messatge ?"
       mention_in_comment_a: "Dempuèi la version 0.7.0.0 podètz ! Podètz mencionar qualqu’un dins un comentari del meteis biais qu’o fasètz dins una publicacion, n’utilizar “@” e començatz a picar lor nom. Notatz que per las publicacions pas publicas, podètz pas que mencionar qualqu’un qu’a interagit amb la publicacion."
-      mention_in_comment_q: "Pòdi mencionar qualqu'un dins un comentari ?"
-      see_mentions_a: "Òc, clicatz sus « @Mencions » dins la colomna d'esquèrra de vòstra pagina d'acuèlh."
-      see_mentions_q: "I a un biais de veire las publicacions que soi mencionat dedins ?"
+      mention_in_comment_q: "Pòdi mencionar qualqu'un dins un comentari ?"
+      see_mentions_a: "Òc, clicatz « @Mencions » dins la colomna d'esquèrra de vòstra pagina d'acuèlh."
+      see_mentions_q: "I a un biais de veire las publicacions que soi mencionat dedins ?"
       title: "Mencions"
       what_is_a_mention_a: "Una mencion es un ligam cap al perfil d'una persona qu'apareis sus una publicacion. Quand qualqu'un es mencionat, receb una notificacion per atirar son atencion sus la publicacion."
-      what_is_a_mention_q: "De qué es una « mencion » ?"
+      what_is_a_mention_q: "De qué es una « mencion » ?"
     miscellaneous:
       back_to_top_a: "Òc. Aprèp aver davalat la pagina, clicatz sus la flècha en gris qu'apareisserà a man drecha dins lo cunh de la fenèstra."
-      back_to_top_q: "I a una manièra rapida per tornar amont de la pagina un còp arribat aval ?"
+      back_to_top_q: "I a una manièra rapida per tornar amont de la pagina un còp arribat aval ?"
       diaspora_app_a: "I a agut un molon d'aplicacions Android desvolopadas per de membres de la comunautat. Qualques son abandonadas dempuèi un brave temps e doncas foncionan pas tròp ben amb la version actuala de diaspora*. N'esperetz pas tròp d'aquelas pel moment. D'aquela passa i a pas cap d'aplicacion iOS. La melhora manièra d'accedir a diaspora* d'un mobil es amb un navigator, pr'amor qu'avèm creat una version mobila del site que deu foncionar sul màger mobil, encara qu'i aja pas totas las foncionalitats."
-      diaspora_app_q: "Existís una aplicacion diaspora* per Android o iOS ?"
+      diaspora_app_q: "Existís una aplicacion diaspora* per Android o iOS ?"
       photo_albums_a: "Pas pel moment. Pasmens, podètz veire los imatges mandats d'una persona dins l'onglet Fòtos de lor pagina de perfil."
-      photo_albums_q: "I a d'albums de fòtos o de vidèos ?"
+      photo_albums_q: "I a d'albums de fotografias o de vidèos ?"
       subscribe_feed_a: "Òc, mai es pas encara una foncion lustrada e lo format dels resultats es totjorn un pauc brut. S'avètz enveja d'ensajar aquò, anatz sus la pagina de perfil de qualqu'un e clicatz sul boton de flux dins vòstre navigador, o podètz copiar l'URL del perfil (ex. https://nomdelpod.org/mond/unnumero) e pegatz aquò dins un lector de flux. L'adreça del flux semblarà a aquò : https://podname.org/public/username.atom – diaspora* utiliza Atom e non pas RSS."
-      subscribe_feed_q: "Me pòdi inscriure als messatges publics d'una persona amb un lector de fluxes ?"
+      subscribe_feed_q: "Me pòdi inscriure als messatges publics d'una persona amb un lector de fluxes ?"
       title: "Divèrs"
     pods:
       find_people_a: "Se volètz convidar vòstres amics a venir sus diaspora*, utilizatz lo ligam d’invitacion o lo ligam per corrièl. Seguètz d’#etiquetas per conéisser de mond que partejan vòstres interèsses , e ajustatz aqueles que publican de causas que vos interèssan a un aspècte. Cridatz fòrt que sètz #novèlaquí dins una publicacion publica."
-      find_people_q: "Veni de rejónher un pod, cossí pòdi trobar de monde per partejar amb eles ?"
+      find_people_q: "Veni de rejónher un pod, cossí pòdi trobar de monde per partejar amb eles ?"
       title: "Pods"
       use_search_box_a: "Se coneissètz lor ID diaspora* complet (ex. : utilizaire@nomdelpod.org), podètz los trobar en los cercant. Se sètz sul meteis servidor, podètz los trobar sonque amb los noms d'utilizaire. Autrament podètz los cercar amb lor nom de perfil (lo nom que vesètz sus l'ecran). Se una recèrca capita pas lo primièr còp, tornatz ensajar."
-      use_search_box_q: "Cossí me cal utilizar lo camp de recèrca per trobar qualqu'un en particular ?"
+      use_search_box_q: "Cossí me cal utilizar lo camp de recèrca per trobar qualqu'un en particular ?"
       what_is_a_pod_a: "Un pod es un servidor qu’executa lo programa diaspora* e qu’es connectat al malhum diaspora*. « Pod » es una metafòra que fa referéncia a l'anglés, que significa dòlça, perque conten de grans coma lo servidor que conten de comptes d'utilizaires. I a un melon de pods. Podètz apondre d’amics d’autres pods e comunicar amb eles. Cal pas dobrir de compte suls diferents pods ! Cal pas qu’un compte – d’aquel biais podètz pensar un pod coma un fornisseire de corrièls. I a de pods publics, de pods privats, e amb un bocin d’esfòrces podètz aver lo vòstre."
-      what_is_a_pod_q: "Qu'es aquò un pod ?"
+      what_is_a_pod_q: "Qu'es aquò un pod ?"
     posts_and_posting:
       char_limit_services_a: "En aquel cas deuriatz restrénher vòstras publicacions al nombre de caractèrs autorizats pel servici (140 per Twitter, 1000 per Tumblr), lo nombre de caractèrs demòran s’aficharà se l’icòna del servici es seleccionada. Podètz pr’aquò escriure de tèxtes mai grands, mai lo tèxte serà talhat e un ligam plaçat cap a la publicacion sus diaspora*."
-      char_limit_services_q: "Quin es lo limit de caractèrs pels messatges partejats amb un servici qu'a un limit de caractèrs mai pichon ?"
-      character_limit_a: "65 535 caractèrs. Son 65 395 caractèrs de mai que Twitter ! :)"
-      character_limit_q: "Qual es lo limit de caractèrs per las publicacions ?"
+      char_limit_services_q: "Quin es lo limit de caractèrs pels messatges partejats amb un servici qu'a un limit de caractèrs mai pichon ?"
+      character_limit_a: "65 535 caractèrs. Son 65 395 caractèrs de mai que Twitter ! :)"
+      character_limit_q: "Qual es lo limit de caractèrs per las publicacions ?"
       embed_multimedia_a: "Normalament pas cal pas que pegar l’URL (ex. http://www.youtube.com/watch?v=nnnnnnnnnnn) dins vòstra publicacion e la vidèo o l’àudio serà apondut automaticament. Aqueste site es compatible amb : YouTube, Vimeo, SoundCloud, Flickr e qualques mai. diaspora* emplega oEmbed per aquesta foncionalitat. Cada còp sèm compatibles amb mai sorgas de mèdias. Remembratz-vos de totjorn publicar l’URL completa – pas cap de ligams acorchits – e esperatz un momenton abans d’actualizar la pagina aprèp aver publicat per tal de veire l’ulhada."
-      embed_multimedia_q: "Cossí pòdi inserir un contengut vidèo, àudio, o multimèdia dins una publicacion ?"
+      embed_multimedia_q: "Cossí pòdi inserir un contengut vidèo, àudio, o multimèdia dins una publicacion ?"
       format_text_a: "N'emplegant un sistèma simplifiat apelat %{markdown}. Podètz trapar tota la sintaxi de Markdown %{here}. Lo boton d'apercebut pòt èsser de bona ajuda, permet de veire vòstre messatge coma serà afichat abans de o partejar."
-      format_text_q: "Cossí pòdi formatar lo tèxte dins as publicacions (gras, italic, etc.) ?"
+      format_text_q: "Cossí pòdi formatar lo tèxte dins as publicacions (gras, italic, eca.) ?"
       hide_posts_a: "Se posicionatz la mirga de naut d'una publicacion, una X aprareis a man drecha. Clicatz-la per escondre la publicacion e metre en silenci las notificacions ligadas a aquela. Podètz totjorn veire la publicacion se visitatz lo perfil de la persona que la publiquèt."
-      hide_posts_q: "Cossí escondi una publicacion ?"
+      hide_posts_q: "Cossí escondi una publicacion ?"
+      ignore_user_a1: "Se a l’ora d’ara partejatz amb aquesta persona, la levar de vòstres aspèctes farà que veiretz fòrça mens de sas publicacions. Un biais mai complet es « d’ignorar » aqueste compte. Aquò empacharà sas publicacions d’aparéisser dins vòstre flux e poirà pas mai mostrar que li agradan vòstras publicacions o las comentar. Poirà pasmens tornar partejar vòstras publicacions, comentar una publicacions repartejada e sos comentaris sus las publicacions de qualqu’un mai apareisseràn dins vòstre flux."
+      ignore_user_a2: "Per dire d’ignorar un compte clicar l’icòna « ignorar » (un cercle copat per una linha) ennaut a man dreita d’una de sas publicacions. Aquelas desapareisseràn de vòstre flux sulcòp. Autrament podètz anar a sa pagina de perfil e clicar l’icòna per ignorar enlà. Poiretz totjorn veire las publicacions d’una persona qu’ignoratz en anar a sa pagina de perfil."
+      ignore_user_a3: "Podètz trapar la lista del monde qu’ignoratz dins los paramètres de compte seccion Vida privada. Per quitar d’ignorar qualqu’un, levatz-los de la lista d’aquesta pagina."
+      ignore_user_q: "Cossí empachi las publicacions de qualqu’un de se trobar dins mon flux ?"
       insert_images_a: "Clicatz sus la pichona icòna camerà per inserir un imatge dins una publicacion. Tornatz clicar sus l'icòna per apondre una fòto mai, o ne podètz seleccionar mantun per enviar d'un còp."
       insert_images_comments_a: "Podètz utilisar la sintaxi Markdown per inserir un imatge del web sus un comentari, coma per las publicacions. Pr’aquò, podètz pas enviar un imatge directament dempuèi vòstre ordenador. Mandatz-lo a un servici d’albergament en linha puèi inserissètz l’imatge en utilizar lo boton al dessús de l’editor."
-      insert_images_comments_q: "Pòdi inserir d'imatges dins un comentari ?"
-      insert_images_q: "Cossí pòdi inserir d'imatges dins un messatge ?"
+      insert_images_comments_q: "Pòdi inserir d'imatges dins un comentari ?"
+      insert_images_q: "Cossí pòdi inserir d'imatges dins un messatge ?"
       post_location_a: "Clicatz dins l'aisina d'edicion l'icòna de l'espilla a costat de la camerà. Aquò inserirà vòstre emplaçament d'OpenStreetMap. Podètz modificar vòstre emplaçament – benlèu que volètz pas qu'indicar la vila ont sètz e non pas l'adreça amb la carrièra."
-      post_location_q: "Cossí pòdi apondre ma posicion a un messatge ?"
+      post_location_q: "Cossí pòdi apondre ma posicion a un messatge ?"
       post_notification_a: "Trobaretz l'icòna d'una campana prèp de la X a man drecha de la publicacion. Clicatz-la per activar o desactivar las notificacions per aquesta publicacion."
-      post_notification_q: "Cossí pòdi activar o desactivar las notificacions per un messatge ?"
+      post_notification_q: "Cossí pòdi activar o desactivar las notificacions per un messatge ?"
       post_poll_a: "Clicatz sus l'icòna graf per generar un sondatge. Picatz una question e almens doas responsas. Oblidetz pas de far vòstre publicacion publica se volètz que tot lo mond pòsca participar a vòstre sondatge."
-      post_poll_q: "Cossí pòdi apondre un sondatge a mon messatge ?"
+      post_poll_q: "Cossí pòdi apondre un sondatge a mon messatge ?"
       post_report_a: "Clicatz l'icòna del triangle d'alèrta amont a man drecha de la publicacion per la senhalar a vòstre podmin. Marcatz la rason del senhalament d'aquela publicacion dins la zòna de tèxte."
-      post_report_q: "Cossí pòdi senhalar un messatge ofensant ?"
+      post_report_q: "Cossí pòdi senhalar un messatge ofensant ?"
       size_of_images_a: "Non. Los imatges son retalhats automaticament per marcar ben sul flux d'actualitat o sus la vista de la publicacion. I a pas de còdi Markdown per donar una talha a un imatge."
-      size_of_images_q: "Pòdi personalizar la talha dels imatges dins los messatges o los comentaris ?"
-      stream_full_of_posts_a1: "Vòstre flux es fabricat de tres tipes de messatges :"
-      stream_full_of_posts_li1: |-
-          Las publicacions del mond que partejatz, i a doas categorias :
-          las publicacions publicas e las publicacions limitadas a un aspècte que ne fasètz partit. Per levar aquelas publicacions de vòstre flux d'actualitat, vos cal pas que quitar de partejar amb aquela persona.
+      size_of_images_q: "Pòdi personalizar la talha dels imatges dins los messatges o los comentaris ?"
+      stream_full_of_posts_a1: "Vòstre flux es fabricat de tres tipes de messatges :"
+      stream_full_of_posts_li1: "Las publicacions del mond que partejatz, i a doas categorias : las publicacions publicas e las publicacions limitadas a un aspècte que ne fasètz partit. Per levar aquelas publicacions de vòstre flux d'actualitat, vos cal pas que quitar de partejar amb aquela persona."
       stream_full_of_posts_li2: "Los messatges publics contenon una de las etiquetas que seguissètz. Per los suprimir, quitatz de seguir l’etiqueta."
-      stream_full_of_posts_li3: "Las publicacions publicas del mond listat dins las actualitat de la comunitat. Pòdon èsser levadas en clicant sus l'opcion « Afichar las novèlas de la comunitat dins la flux ? » dins l'onglet Compte de vòstre Paramètres."
-      stream_full_of_posts_q: "Perqué mon flux es plen de messatges que provenon de monde que coneissi pas e amb las qualas partegi pas ?"
+      stream_full_of_posts_li3: "Las publicacions publicas del mond listat dins las actualitat de la comunitat. Pòdon èsser levadas en clicant sus l'opcion « Afichar las novèlas de la comunitat dins la flux ? » dins l'onglet Compte de vòstre Paramètres."
+      stream_full_of_posts_q: "Perqué mon flux es plen de messatges que provenon de personas que coneissi pas e amb las qualas partegi pas ?"
       title: "Publicacions e publicar"
     private_posts:
       can_comment_a: "Solament los utilizaires de diaspora* connectats qu'avètz plaçats dins aquel aspècte abans de passar la publicacion privada pòdon la comentar o l'aimar."
-      can_comment_q: "Qual pòt comentar o a qual pòt agradar un messatge privat ?"
+      can_comment_q: "Qual pòt comentar o a qual pòt agradar un messatge privat ?"
       can_reshare_a: "Degun. Las publicacions privadas se pòdon pas tornar partejar. Los utilizaires connectats dins aqueste aspècte pòdon potencialament o copiar e pegar pasmens. Depend de vos se vos fisatz d'aqueste monde !"
-      can_reshare_q: "Qual pòt repartejar mos messatges privats ?"
+      can_reshare_q: "Qual pòt repartejar mos messatges privats ?"
       see_comment_a: "Solament lo mond amb qui la publicacion es partejada (lo mond qu'es dins l'aspècte causit per lo prim publicaire) pòdon veire sos comentaris e mencion « m'agrada ». "
-      see_comment_q: "Quand comenti un messatge privat o que marqui que m'agrada , qual o pòt veire ?"
+      see_comment_q: "Quand comenti un messatge privat o que marqui que m'agrada, qual o pòt veire ?"
       title: "Publicacions privadas"
       who_sees_post_a: "Solament los utilizaires de diaspora* connectats qu'avètz plaçats dins aquel aspècte abans de passar la publicacion privada pòdon la veire."
-      who_sees_post_q: "Quand mandi un messatge a un aspècte (es a dire un messatge privat), qual o pòt veire ?"
+      who_sees_post_q: "Quand mandi un messatge a un aspècte (es a dire un messatge privat), qual o pòt veire ?"
     profile:
       title: "Perfil"
       what_do_tags_do_a: "Ajudan al monde a vos conéisser. Vòstra fotografia de perfil apareisserà a man esquèrra de la pagina d’actualitat d’aquelas etiquetas, demest lo monde que las tenon dins lor perfil de basa."
@@ -501,27 +503,27 @@ oc:
       who_sees_profile_a: "Vòstre perfil basic (nom, fotografia de perfil e #etiquetas) es public. Vòstre perfil espandit es privat per defaut, podètz cambiar la confidencialitat coma vos agrade. Solament lo monde que partejan amb vos (valent a dire : los avètz aponduts a un de vòstres aspèctes) pòdon veire vòstre perfil espandit se lo mantenètz privat. La rèsta del monde veson pas que las informacions de vòstre perfil public. Tota informacion que fasètz publica pòt èsser vista per qual que siá sus Internet, e pòt èsser indexada pels motors de recèrca."
       who_sees_profile_q: "Qual vei mon perfil public ?"
     public_posts:
-      can_comment_reshare_like_a: "Quin utilizaire connectat a diaspora* que siá, pòt comentar, repartejar vòstre messatge public o marcar que li agrada."
-      can_comment_reshare_like_q: "Qual pòt comentar, repartejar, o marcar que li agrada mon messatge public ?"
+      can_comment_reshare_like_a: "Quin utilizaire connectat a diaspora* que siá, pòt comentar, repartejar vòstre messatge public o marcar que li agrada. L'excepcion a aquò es pel mond qu'ignoratz, que pòdon pas comentar o marcar qu'aiman vòstras publicacions."
+      can_comment_reshare_like_q: "Qual pòt comentar, repartejar, o marcar que li agrada mon messatge public ?"
       deselect_aspect_posting_a: "Deseleccionar d’aspèctes càmbia pas res per las publicacions publicas. Demoraràn publicas e apareisseràn dins lo flux d’actualitat de vòstres contactes. Per far venir visibla una publicacion dins un aspècte especific, vos cal seleccionar los aspèctes al moment de publicar sul selector d’aspècte jos l’editor."
-      deselect_aspect_posting_q: "Qué passa quand deseleccioni un o mai aspèctes al moment d'escriure una publicacion publica ?"
+      deselect_aspect_posting_q: "Qué passa quand tira de las seleccion un o mai aspèctes al moment d'escriure una publicacion publica ?"
       find_public_post_a: "Vòstras publicacions publicas apareisseràn dins lo flux d’actualitat de qual que siá que vos sèc. S’ajustatz unas #etiquetas a vòstra publicacion, qual que siá que sèc aquelas etiquetas trobarà vòstra publicacion dins lor flux. Totas las publicacions publicas an una URL especifica que tot lo mond pòdon veire, amai se son pas connectats – doncas las publicacions publicas pòdon èsser ligadas directament de Twitter, blogs, etc. Los robòts de recèrca pòdon tanben las indexar."
-      find_public_post_q: "Cossí las autras personas pòdon trobar mos messatges publics ?"
+      find_public_post_q: "Cossí las autras personas pòdon trobar mos messatges publics ?"
       see_comment_reshare_like_a: "Los comentaris, mencions \"m'agrada\", e repartiments de publicacions publicas son tanben publics. Tot utilizaire connectat dins diaspora* e qual que siasgue d'Internet pòt veire vòstras interaccions amb una publicacion publica."
-      see_comment_reshare_like_q: "Quand comenti, tòrni partejar, o aimi una publicacion publica, qual pòt o veire ?"
+      see_comment_reshare_like_q: "Quand comenti, tòrni partejar, o aimi una publicacion publica, qual pòt o veire ?"
       title: "Publicacions publicas"
       who_sees_post_a: "Qual que siague qu'utiliza internet pòt potencialament veire una publicacion que marcatz publica, doncas asseguratz-vos de voler vertadièrament qu'una publicacion siague publica. Es una manièra de las bonas per aténher de mond."
-      who_sees_post_q: "Quand publiqui quicòm publicament, qual pòt veire ?"
+      who_sees_post_q: "Quand publiqui quicòm publicament, qual pòt veire ?"
     resharing_posts:
       reshare_private_post_aspects_a: "Non, es pas possible de tornar partejar una publicacion privada. Aquò es per respectar las intencions del prim publicaire, que l'a partejada amb un gropon especial de personas."
-      reshare_private_post_aspects_q: "Pòdi repartejar un messatge privat unicament amb certans aspèctes ?"
+      reshare_private_post_aspects_q: "Pòdi repartejar un messatge privat unicament amb certans aspèctes ?"
       reshare_public_post_aspects_a: "Non, quand tornatz partejar una publicacion publica es automaticament una publicacion publica vòstra. Per partejar aquò amb cèrts aspèctes, copiatz e pegatz lo contengut de la publicacion cap a una nòva publicacion limitada."
-      reshare_public_post_aspects_q: "Pòdi repartejar un messatge public unicament amb certans aspèctes ?"
+      reshare_public_post_aspects_q: "Pòdi repartejar un messatge public unicament amb certans aspèctes ?"
       title: "Repartejar los messatges."
     sharing:
-      add_to_aspect_a1: "Direm que l'Amy apond lo Bena un aspècte, mai Ben a pas (encara) apondut Amy a un aspècte :"
+      add_to_aspect_a1: "Direm que l'Amy apond lo Bena un aspècte, mai Ben a pas (encara) apondut Amy a un aspècte :"
       add_to_aspect_a2: "Aquò es conegut coma un partage asimetric. Se e quand Ben ajusta tanben Amy a un aspècte alara vendrà un partatge mutual, quand tan las publicacions publicas a Amy que las a Ben e que de publicacions privadas apareisson dins lors flux d'actualitat, e Amy poiriá veire lo perfil privat de Ben. Poiràn tanben s'enviar de messatges privats."
-      add_to_aspect_li1: "Ben recebrà una notificacion que l'Amy a \"començat a partejar\" amb Ben."
+      add_to_aspect_li1: "Ben recebrà una notificacion que l'Amy a \"començat de partejar\" amb Ben."
       add_to_aspect_li2: "Amy començarà de veire los messatges publics de Ben dins son flux."
       add_to_aspect_li3: "Amy veirà pas cap dels messatges privats de Ben."
       add_to_aspect_li4: "Ben veirà pas las publicacions publicas o privadas de l'Amy dins son flux d'actualitat."
@@ -529,28 +531,28 @@ oc:
       add_to_aspect_li6: "Ben serà autorizat a veire lo perfil privat d'Amy (bio, localizacion, sèxe, anniversari)."
       add_to_aspect_li7: "L'Amy apareisserà coma « Partejan solament amb ieu » sus la pagina de contact del Ben."
       add_to_aspect_li8: "Amy serà tanben capabla de @mencionar Ben dins un messatge."
-      add_to_aspect_q: "Qué passa quand apondi qualqu'un a un de mos aspèctes, o quand qualqu'un m'apond als seus aspèctes ?"
-      list_not_sharing_a: "Non pas, mas podètz veire se qualqu'un parteja amb vos en visitant sa pagina de perfil. Se parteja amb vos, lo boton que mòstra lo(s) aspecète(s) ont l'avètz mes serà verd, autrament serà gris."
-      list_not_sharing_q: "I a una lista del mond qu'ai apondut sus un de mos aspèctes mai que m'an pas apondut de lor costat ?"
+      add_to_aspect_q: "Qué passa quand apondi qualqu'un a un de mos aspèctes, o quand qualqu'un m'apond als seus aspèctes ?"
+      list_not_sharing_a: "Non pas, mas podètz veire se qualqu'un parteja amb vos en visitant sa pagina de perfil. Se parteja amb vos i aurà una sageta verda a costat de lor ID diaspora*. Autrament i aurà un cercle gris."
+      list_not_sharing_q: "I a una lista del mond qu'ai apondut sus un de mos aspèctes mai que m'an pas apondut de lor costat ?"
       only_sharing_a: "Son lo mond que vos an apondut a lor aspècte, mai que son pas - encara - dins vòstres aspèctes. Dich autrament, partejan amb vos, mai partejatz pas amb eles : podètz o pensar aissí, vos « seguisson ». Se los apondètz a un aspècte, pareisseràn dins aqueste e non pas coma « Partejan solament amb ieu ». Veire çai-jos."
-      only_sharing_q: "Qui son los listats dins « Partejan solament amb ieu » sus ma pagina de contactes ?"
+      only_sharing_q: "Qui son los listats dins « Partejan solament amb ieu » sus ma pagina de contactes ?"
       see_old_posts_a: "Non. Poiràn pas que veire las novèlas publicacions dins aqueste aspècte. Pòdon veire vòstras vièlhas publicacions sus vòstra pagina de perfil, e benlèu tanben dins lor flux d'actualitat."
-      see_old_posts_q: "Quand apondi qualqu'un a un aspècte, pòdon veire mas ancianas publicacions qu'ai ja publicadas a aqueste aspècte ?"
+      see_old_posts_q: "Quand apondi qualqu'un a un aspècte, pòdon veire mas ancianas publicacions qu'ai ja publicadas a aqueste aspècte ?"
       sharing_notification_a: "Deuriatz recebre una notificacion a cada còp que qualqu'un comença de partejar amb vos."
-      sharing_notification_q: "Cossí pòdi saber quand qualqu'un comença de partejar amb ieu ?"
+      sharing_notification_q: "Cossí pòdi saber quand qualqu'un comença de partejar amb ieu ?"
       title: "Partatge"
     tags:
-      filter_tags_a: "Aquesta foncion es pas directament disponibla dins diaspora*, mai unes %{third_party_tools} son estats escrichs per far o."
-      filter_tags_q: "Cossí pòdi filtrar/exclure certanas etiquetas de mon flux ?"
-      followed_tags_a: "Aprèp aver cercat una etiqueta podètz clicar sul boton amont de la pagina de las etiquetas per « seguir »aquesta etiqueta. Apareisserà dins vòstre lista d’etiquetas seguidas sul menú a man drecha. En clicant sus una de vòstras etiquetas seguidas aquò vos menarà sus la pagina d’aquesta etiqueta per veire las publicacions recentas que contenon aquesta etiqueta. Clicatz sus #Etiquetas seguidas per veire un flux de publicacions que contenon totes las etiquetas que seguissètz."
-      followed_tags_q: "De qué son las \"#Etiquetas Seguidas\" e cossí pòdi seguir una etiqueta ?"
+      filter_tags_a: "Aquesta foncion es pas directament disponibla dins diaspora*, mai unas %{third_party_tools} son estadas escrichas per o far."
+      filter_tags_q: "Cossí pòdi filtrar/exclure certanas etiquetas de mon flux ?"
+      followed_tags_a: "Aprèp aver cercat una etiqueta podètz clicar sul boton amont de la pagina de las etiquetas per « seguir »aquesta etiqueta. Apareisserà dins vòstre lista d’etiquetas seguidas sul menú a man drecha. En clicant sus una de vòstras etiquetas seguidas aquò vos menarà sus la pagina d’aquesta etiqueta per veire las publicacions recentas que contenon aquesta etiqueta. Clicatz sus #Etiquetas seguidas per veire un flux de publicacions que contenon totes las etiquetas que seguissètz. Las publicacions que contenon aquelas etiquetas tanben apareisseràn dins vòstre flux."
+      followed_tags_q: "De qué son las « #Etiquetas Seguidas » e cossí pòdi seguir una etiqueta ?"
       people_tag_page_a: "I a monde qu'an listat aquesta etiqueta per se descriure eles-meteisses dins lor perfil public."
-      people_tag_page_q: "Qualas son las personas listadas sus la partida d'esquèrra d'una pagina d'etiquetas ?"
+      people_tag_page_q: "Qualas son las personas listadas sus la partida d'esquèrra d'una pagina d'etiquetas ?"
       tags_in_comments_a: "Una etiqueta aponduda a un comentari apareisserà coma un ligam cap a la pagina d'etiquetas correspondenta, mai farà pas aparéisser la publicacion (o comentari) dins aquela pagina. Aquò fonciona pas qu'amb las etiquetas sus las publicacions."
-      tags_in_comments_q: "Pòdi inserir d'etiquetas dins un comentari o sonque dins de messatges ?"
+      tags_in_comments_q: "Pòdi inserir d'etiquetas dins un comentari o sonque dins una publicacion ?"
       title: "Etiquetas"
       what_are_tags_for_a: "Las etiquetas son un biais de triar una publicacion, sovent un tèma. Cercar una etiqueta ensenha las publicacions, tan publicas coma privadas, amb aquesta etiqueta qu'avètz la permission de veire. Aquò permet al mond qu'es interessat per un tèma de trobar de publicacions ligadas a aquò."
-      what_are_tags_for_q: "A qué servisson las etiquetas ?"
+      what_are_tags_for_q: "A qué servisson las etiquetas ?"
     third_party_tools: "Aisinas tèrças"
     title_header: "Ajuda"
     tutorial: "tutorial"
@@ -567,7 +569,7 @@ oc:
       own_your_data: "Siatz proprietari de vòstras donadas"
       own_your_data_info: "Mantun rets emplegan vòstras donadas per se far de moneda en analisant vòstras interaccions e en emplegant aquelas informacions per vos far de reclama. diaspora* utilizant pas vòstras donadas que per vos permetre de comunicar e partejar amb lo mond."
     podmin:
-      byline: "Sètz a mand de cambiar la fàcia d'internet. Prèst a vos lançar ?"
+      byline: "Sètz a mand de cambiar la fàcia d'Internet. Prèst a vos lançar ?"
       configuration_info: "Dobrissètz %{database_path} e %{diaspora_path} dins vòstre editor de tèxte favorit e relegissètz-los menimosament, son comentats abondament."
       configure_your_pod: "Configuratz vòstre pod"
       contact_irc: "nos contactar sus IRC"
@@ -586,7 +588,7 @@ oc:
       update_your_pod: "Mantenètz vòstre pod a jorn"
       update_your_pod_info: "Trobaretz %{update_instructions}."
   invitation_codes:
-    already_logged_in: "Sètz estat convidat per %{inviter} a rejónher aqueste pod mai sètz ja conectat."
+    already_logged_in: "%{inviter} vos a convidat a rejónher aqueste pod mas sètz ja connectat."
     not_valid: "Aqueste còdi es pas pus valid."
   invitations:
     create:
@@ -617,7 +619,7 @@ oc:
       source_package: "Telecargatz lo còdi font"
       statistics_link: "Estatisticas del pod"
       toggle: "Activar/desactivar la version mobila"
-      whats_new: "Qué de nòu ?"
+      whats_new: "Qué de nòu ?"
     header:
       code: "Còdi"
       logout: "Desconnexion"
@@ -655,8 +657,8 @@ oc:
         zero: "e degun mai"
       comment_on_post: "Comentari sus un de vòstres messatges"
       liked: "Que m'agrada"
-      mark_all_as_read: "Tot marcar coma legit"
-      mark_all_shown_as_read: "Marcar tot coma legit"
+      mark_all_as_read: "O marcar tot coma legit"
+      mark_all_shown_as_read: "O marcar tot coma legit"
       mark_read: "Marcar coma legit"
       mark_unread: "Marcar coma pas legit"
       mentioned: "Mencionat dins una publicacion"
@@ -664,7 +666,7 @@ oc:
       no_notifications: "Avètz pas encara cap de notificacion."
       notifications: "Notificacions"
       reshared: "Repartejat"
-      show_all: "Afichar tot"
+      show_all: "O mostrar tot"
       show_unread: "Afichar los que son pas legits"
       started_sharing: "A començat de partejar"
     liked:
@@ -680,8 +682,8 @@ oc:
       other: "%{actors} vos an mencionat dins la publicacion %{post_link}."
       zero: "%{actors} vos a mencionat dins la publicacion %{post_link}."
     mentioned_deleted:
-      one: "%{actors} vos a mencionat sus una publicacion suprimida."
-      other: "%{actors} vos an mencionat sus una publicacion suprimida."
+      one: "%{actors} vos a mencionat en una publicacion suprimida."
+      other: "%{actors} vos an mencionat en una publicacion suprimida."
       zero: "%{actors} vos a mencionat sus una publicacion suprimida."
     mentioned_in_comment:
       one: "%{actors} vos a mencionat dins un <a href='%{comment_path}'>comentari</a> a la publicacion %{post_link}."
@@ -708,7 +710,7 @@ oc:
   notifier:
     a_limited_post_comment: "Avètz un comentari novèl sus un messatge amb visibilitat limitada."
     a_post_you_shared: "una publicacion."
-    a_private_message: "Avètz un nòu messatge privat dins diaspora* per legir."
+    a_private_message: "Avètz un nòu messatge privat dins diaspora* de legir."
     also_commented:
       limited_subject: "I a un comentari novèl sus un messatge qu'avètz comentat"
     click_here: "Clicatz aicí"
@@ -716,7 +718,7 @@ oc:
       limited_subject: "I a un comentari novèl sus una publicacion qu'avètz comentada"
       reply: "Respondre o veire lo messatge de %{name} >"
     confirm_email:
-      click_link: "Per activar vòstre novèla adreça de corrièl %{unconfirmed_email}, seguissètz aqueste ligam :"
+      click_link: "Per activar vòstre novèla adreça de corrièl %{unconfirmed_email}, seguissètz aqueste ligam :"
       subject: "Mercés d'activar vòstre novèl corrièl %{unconfirmed_email}"
     csrf_token_fail:
       body: |-
@@ -740,7 +742,7 @@ oc:
           Mercés, 
           Lo robòt de corrièl a diaspora* !
       subject: "Avèm recebut una demanda sens autorizacion de vòstre compte, %{name}"
-    email_sent_by_diaspora: "Aqueste corrièl es estat mandat per %{pod_name}. Se volètz pas mai de corrièls atal,"
+    email_sent_by_diaspora: "%{pod_name} a mandat aqueste corrièl. Se volètz pas mai de corrièls atal,"
     export_email:
       body: |-
           Bonjorn %{name},
@@ -811,10 +813,10 @@ oc:
       limited_post: "A %{name}, li a agradat vòstra publicacion restrenta"
       view_post: "Veire la publicacion >"
     mentioned:
-      limited_post: "Sètz estat mencionat dins una publicacion restenta."
+      limited_post: "Qualqu'un vos a mencionat dins una publicacion restenta."
       subject: "%{name} vos a mencionat sus diaspora*"
     mentioned_in_comment:
-      limited_post: "Sètz mencionat dins un comentari al accès limitat."
+      limited_post: "Qualqu'un vos a mencionat dins un comentari al accès limitat."
       reply: "Respondre o veire la conversacion >"
     private_message:
       reply_to_or_view: "Respondre o afichar aquela conversacion >"
@@ -864,8 +866,8 @@ oc:
       admin: "Vòstre administrator diaspora*"
       subject: "Un messatge subre vòstre compte diaspora*"
     started_sharing:
-      sharing: "a començat a partejar amb vos !"
-      subject: "%{name} a començat a partejar amb vos sus diaspora*"
+      sharing: "a començat de partejar amb vos !"
+      subject: "%{name} a començat de partejar amb vos sus diaspora*"
       view_profile: "Veire lo perfil de %{name}"
     thanks: "Mercé,"
     to_change_your_notification_settings: "per cambiar vòstres reglatges de notificacion"
@@ -875,14 +877,14 @@ oc:
     add_contact:
       invited_by: "Sètz estat convidat per"
     index:
-      couldnt_find_them: "Los trobatz pas ?"
+      couldnt_find_them: "Los trobatz pas ?"
       looking_for: "Recercar publicacions marcadas %{tag_link}"
       no_one_found: "... e pas cap trobat."
       no_results: "E ben ! Vos cal cercar quicòm."
       results_for: "Utilizaires que correspondon a %{search_term}"
       search_handle: "Utilizatz lor ID diaspora* (nomdutiliaire@pod.tld) per èsser segur de trobar vòstres amics."
       searching: "Recèrca en cors, mercés d'esperar..."
-      send_invite: "Pas res encara ? Mandatz-lor un convit !"
+      send_invite: "Pas res encara ? Mandatz-lor un convidacion !"
     person:
       thats_you: "Sètz vosautres !"
     profile_sidebar:
@@ -896,9 +898,9 @@ oc:
       has_not_shared_with_you_yet: "%{name} a pas encara partejar cap de publicacions amb vos !"
   photos:
     create:
-      integrity_error: "Fracàs al moment de mandar l'imatge.  Sètz segur qu'èra un imatge ?"
-      runtime_error: "Fracàs al moment de mandar l'imatge.  Sètz segur que vòstre cinta de seguretat es estacada ?"
-      type_error: "Fracàs al moment de mandar l'imatge.  Sètz segur qu'un imatge es estat apondut ?"
+      integrity_error: "Fracàs al moment de mandar l'imatge. Sètz segur qu'èra un imatge ?"
+      runtime_error: "Fracàs al moment de mandar l'imatge. Sètz segur que vòstre cinta de seguretat es estacada ?"
+      type_error: "Fracàs al moment de mandar l'imatge. Sètz segur qu'un imatge es estat apondut ?"
     destroy:
       notice: "Fòto suprimida"
     new_profile_photo:
@@ -969,13 +971,13 @@ oc:
       terms_link: "condicions d'utilizacion"
       username: "Nom d'utilizaire"
   report:
-    comment_label: "<b>Comentari</b>:<br>%{data}"
-    confirm_deletion: "Sètz segur que volètz suprimir aqueste element ?"
+    comment_label: "<strong>Comentari</strong> : %{data}"
+    confirm_deletion: "Sètz segur que volètz suprimir aqueste element ?"
     delete_link: "Suprimir l'element"
     not_found: "La publicacion/comentari es pas estat trobat. Sembla qu'es estat suprimit per l'utilizaire !"
-    post_label: "<b>Publicacion</b>: %{title}"
-    reason_label: "Rason :"
-    reported_label: "<b>Senhalat per</b> %{person}"
+    post_label: "<strong>Publicacion</strong> : %{content}"
+    reason_label: "Rason :"
+    reported_label: "<strong>Senhalat per</strong> %{person}"
     reported_user_details: "Detalhs sus l'utilizaire senhalat"
     review_link: "Marcat coma revist."
     status:
@@ -992,7 +994,7 @@ oc:
       error: "Fracàs al moment de tornar partejar."
     reshare:
       deleted: "La publicacion originala foguèt suprimida per son autor."
-      reshare_confirmation: "Volètz tornar partejar la publicacion de %{author} ?"
+      reshare_confirmation: "Volètz tornar partejar la publicacion a %{author} ?"
       reshared_via: "Repartejat per"
   search: "Recercar"
   services:
@@ -1012,8 +1014,8 @@ oc:
       logged_in_as: "Connectat coma %{nickname}."
       no_services_available: "I a pas cap de servici de disponible sus aqueste pod."
       not_logged_in: "Actualament, sètz pas connectat."
-      really_disconnect: "Se desconnectar de %{service} ?"
-      services_explanation: "Se connectar a de servicis tèrç vos permet de publicar vòstras publicacions suls aqueles servicis quand n'escrivètz sus diaspora*."
+      really_disconnect: "Se desconnectar de %{service} ?"
+      services_explanation: "Se connectar a de servicis tèrces vos permet de publicar vòstras publicacions suls aqueles servicis quand n'escrivètz sus diaspora*."
       share_to: "Partejar amb %{provider}"
       title: "Gerir los servicis connectats"
     provider:
@@ -1032,7 +1034,7 @@ oc:
         zero: "Apondre lo contacte"
     invitations:
       by_email: "Convidar de monde per corrièl"
-      invite_your_friends: "Convidatz vòstres amics"
+      invite_your_friends: "Convidar vòstres amics"
       invites: "Convits"
       share_this: "Partejatz aqueste ligam via corrièl, blog, o malhums socials !"
     public_explain:
@@ -1044,7 +1046,7 @@ oc:
       outside: "Los messatges publics poiràn èsser vistes per totes, quitament en defòra de diaspora*."
       share: "Partejatz"
       title: "Metre en plaça de servicis connectats"
-      visibility_dropdown: "Utilizatz aqueste menú per cambiar la visibilitat de vòstra publicacion  (Vos recomandam de marcar la primièra coma publica)"
+      visibility_dropdown: "Utilizatz aqueste menú per cambiar la visibilitat de vòstra publicacion. (Vos recomandam de marcar la primièra coma publica)"
     publisher:
       discard_post: "Suprimir la publicacion"
       formatWithMarkdown: "Utilizatz la sintaxi %{markdown_link} per metre en forma vòstre messatge"
@@ -1059,7 +1061,7 @@ oc:
       posting: "Publicacion..."
       remove_location: "Suprimir l'emplaçament"
       share: "Partejar"
-      whats_on_your_mind: "A de qué pensatz ?"
+      whats_on_your_mind: "A de qué pensatz ?"
     stream_element:
       via: "Via %{link}"
       via_mobile: "Enviat d'un mobil"
@@ -1080,7 +1082,7 @@ oc:
     local_posts: "Messatges locals"
     name: "Nom"
     network: "Ret"
-    open: "Dobèrt"
+    open: "Dubèrt"
     registrations: "Enregistraments"
     services: "Servicis"
     total_users: "Total d'utilizaires"
@@ -1143,15 +1145,15 @@ oc:
   users:
     confirm_email:
       email_confirmed: "Corrièl %{email} activat"
-      email_not_confirmed: "Lo corrièl a pas pogut èsser activat. Marrit ligam ?"
+      email_not_confirmed: "Avèm pas pogut activar lo corrièl. Marrit ligam ?"
     destroy:
       no_password: "Mercé de picar vòstre sehnal actual per tampar lo vòstre compte."
       success: "Vòstre compte es estat verrolhat. Pòt prene vint minuta per ne finalizar la tampadura. Mercés d'aver ensajat diaspora*."
       wrong_password: "Lo senhal dintrat correpond pas amb lo senhal actual."
     edit:
       also_commented: "qualqu'un a comentat una publicacion qu'avètz comentada"
-      auto_follow_aspect: "Aspècte pels utilizaires seguts automaticament :"
-      auto_follow_back: "Automaticament partejar amb los utilizaires que partejan amb vos"
+      auto_follow_aspect: "Aspècte pels utilizaires seguits automaticament :"
+      auto_follow_back: "Apondre automaticament los utilizaires que partejan amb vos"
       change: "Modificar"
       change_color_theme: "Cambiar lo tèma de color"
       change_email: "Cambiar de corrièl"
@@ -1162,12 +1164,12 @@ oc:
         dont_go: "E, se vos plai, patiscatz pas !"
         lock_username: "Vòstre nom d'utilizaire serà verrolhat. Poiretz pas crear un novèl compte sus aqueste pod amb lo meteis ID."
         locked_out: "Seretz desconnectat e vòstre compte serà inaccessible fins a sa supression."
-        make_diaspora_better: "Nos agradariá fòrça que demorèssetz e nos ajudèssetz a far un melhor diaspora* puslèu que de nos daissar. Se volètz vertadièrament partir, pasmens, vaquí çò que se va passar :"
+        make_diaspora_better: "Nos agradariá fòrça que demorèssetz e nos ajudèssetz a far un melhor diaspora* puslèu que de nos daissar. Se volètz vertadièrament partir, pasmens, vaquí çò que se va passar :"
         mr_wiggles: "Mossur Wiggles serà triste de vos veire partir."
         no_turning_back: "Es pas possible de tornar en arrièr ! Se sètz segur de vos, sasissètz vòstre senhal çaijós."
         what_we_delete: "Suprimirem totas vòstras publicacions e informacions de perfil tre que possible. Vòstres comentaris sus la publicacion del mond desapareisseràn, mai seràn associats a vòstre ID diaspora* al lòc de vòstre nom."
       close_account_text: "Tampar lo compte"
-      comment_on_post: "qualqu'un comenta vòstra publicacion"
+      comment_on_post: "qualqu'un a comentat vòstra publicacion"
       current_password: "Senhal actual"
       current_password_expl: "Lo senhal que causissètz..."
       default_post_visibility: "Aspèctes per defaut seleccionats per las publicacions"
@@ -1181,11 +1183,11 @@ oc:
       following: "Paramètres de partiment"
       last_exported_at: "(Darrièra mesa a jorn a %{timestamp})"
       liked: "a qualqu'un li a agradat vòstra publicacion"
-      mentioned: "...se vos menciona dins un messatge."
-      mentioned_in_comment: "sètz mencionat dins un comentari"
+      mentioned: "qualqu'un vos a mencionat dins un messatge"
+      mentioned_in_comment: "qualqu'un vos a mencionat dins un comentari"
       new_password: "Senhal novèl"
       private_message: "Avètz recebut un messatge privat."
-      receive_email_notifications: "Recebre una notificacion per corrièl quand :"
+      receive_email_notifications: "Recebre una notificacion per corrièl quand :"
       request_export: "Demandar mas donadas de perfil"
       request_export_photos: "Demandar mas fòtos"
       request_export_photos_update: "Refrescar mas fòtos."
@@ -1194,7 +1196,7 @@ oc:
       show_community_spotlight: "Mostrar l'actualitat de la comunitat dins lo flux"
       show_getting_started: "Mostrar las astúcias de descoberta"
       someone_reported: "Qualqu'un a senhalat un messatge"
-      started_sharing: "qualqu'un a començat a partejar amb vos"
+      started_sharing: "qualqu'un a començat de partejar amb vos"
       stream_preferences: "Preferéncias del flux"
       your_email: "Vòstre corrièl"
       your_email_private: "Vòstre email serà pas jamai vist per d'autres utilizaires"
@@ -1207,11 +1209,11 @@ oc:
       hashtag_explanation: "Las etiquetas vos permeton de charrar e seguir vòstres interèsses. Son tanben una bona manièra de trobar de mond novèl sus diaspora*."
       hashtag_suggestions: "Ensajatz etiquetas coma aquestas #art #filmes #gif, etc."
       well_hello_there: "E ben, adiu monde !"
-      what_are_you_in_to: "Qué vos interèssa ?"
-      who_are_you: "Qual sètz ?"
+      what_are_you_in_to: "Qué vos interèssa ?"
+      who_are_you: "Qual sètz ?"
     privacy_settings:
       ignored_users: "Utilizaires ignorats"
-      no_user_ignored_message: "Actualament, ignoratz pas cap d'utilizaire"
+      no_user_ignored_message: "Actualament, ignoratz pas degun"
       stop_ignoring: "Arrestar d'ignorar"
       strip_exif: "Levar dels imatges mandats las metadonadas talas coma luòc de presa, autor o modèl d'aparelh fòto (recomandat)"
       title: "Reglatges de confidencialitat"
@@ -1225,7 +1227,7 @@ oc:
       follow_settings_not_changed: "Cambiament dels reglatges pel seguiment fracassat."
       language_changed: "Lenga cambiada"
       language_not_changed: "Cambiament de lenga fracassat"
-      password_changed: "Senhal cambiat.  Ara, vos podètz connectar amb lo senhal novèl."
+      password_changed: "Senhal cambiat. Ara, vos podètz connectar amb lo senhal novèl."
       password_not_changed: "Cambiament de senhal mancat"
       settings_not_updated: "Mesa a jorn fracassada"
       settings_updated: "Reglatges mes a jorn"
diff --git a/config/locales/diaspora/pl.yml b/config/locales/diaspora/pl.yml
index e32d4f0aa09f7148c494bb1abecccff0883c97de..7b8dfc5497b29c99c431a260245d9cc8f52c8937 100644
--- a/config/locales/diaspora/pl.yml
+++ b/config/locales/diaspora/pl.yml
@@ -149,11 +149,16 @@ pl:
   api:
     openid_connect:
       authorizations:
+        destroy:
+          fail: "Próba unieważnienia autoryzacji za pomocą ID %{id} nie powiodła się"
         new:
           access: "%{name} wymaga dostęp do:"
           approve: "Zatwierdź"
+          bad_request: "Brakuje ID klienta lub URI przekierowania"
+          client_id_not_found: "Nie znaleziono klienta z ID klienta %{client_id} i przekierowaniem URI %{redirect_uri}"
           deny: "Odmów"
           no_requirement: "%{name} nie wymaga żadnego pozwolenia"
+          redirection_message: "Czy na pewno chcesz dać dostęp do %{redirect_uri}?"
       error_page:
         contact_developer: "Powinieneś skontaktować się z twórcą aplikacji i wysłać mu następującą, szczegółową informację o błędzie:"
         could_not_authorize: "Autoryzacja aplikacji się nie powiodła"
@@ -168,9 +173,10 @@ pl:
           name: "rozszerzony profil"
         read:
           description: "Pozwala aplikacji czytać Twój strumień, rozmowy oraz cały profil."
-          name: "Czytaj profil, strumień i rozmowy"
+          name: "czytaj profil, strumień i rozmowy"
         write:
           description: "Pozwala aplikacji dodawać nowe wpisy i reakcje oraz uczestniczyć w rozmowach."
+          name: "wysyłaj wpisy, rozmowy i reakcje"
       user_applications:
         index:
           access: "%{name} ma dostęp do:"
@@ -178,9 +184,9 @@ pl:
           no_requirement: "%{name} nie wymaga pozwolenia"
           title: "Autoryzowane aplikacje"
         no_applications: "Nie autoryzowałeś/łaś żadnych aplikacji"
-        policy: "Sprawdź warunki prywatności aplikacji"
-        revoke_autorization: "Odwołuj"
-        tos: "Sprawdź warunki obsługi aplikacji"
+        policy: "Sprawdź politykę prywatności aplikacji"
+        revoke_autorization: "Odwołaj"
+        tos: "Sprawdź warunki korzystania z aplikacji"
   are_you_sure: "Czy na pewno?"
   are_you_sure_delete_account: "Czy na pewno chcesz zamknąć swoje konto? Tego nie można cofnąć!"
   aspect_memberships:
@@ -264,9 +270,16 @@ pl:
       success: "Zobaczmy co mają do powiedzenia! #powiedzcześć"
   bookmarklet:
     explanation: "Publikuj w diasporze* z dowolnego miejsca poprzez dodanie tego linku do zakładek => %{link}"
-    heading: "Bookmarklet"
+    heading: "Skryptozakładka"
     post_something: "Opublikuj na diasporze*"
   cancel: "Anuluj"
+  color_themes:
+    dark: "Ciemny"
+    dark_green: "Ciemnozielony"
+    egyptian_blue: "Egipski niebieski"
+    magenta: "Magenta"
+    original: "Oryginalny szary"
+    original_white: "Oryginalny z białym tłem"
   comments:
     create:
       error: "Nie udało się dodać komentarza."
@@ -330,7 +343,7 @@ pl:
     helper:
       correct_the_following_errors_and_try_again: "Popraw poniższe błędy i spróbuj ponownie."
     need_javascript: "Strona do poprawnego działania wymaga obsługi JavaScriptu. Jeśli ją wyłączyłeś, proszę byś ją włączył i odświeżył stronę."
-  fill_me_out: "Wypełnij mnie"
+  fill_me_out: "Wypełnij pole"
   find_people: "Znajdź osoby lub #tagi"
   help:
     account_and_data_management:
@@ -339,7 +352,7 @@ pl:
       data_other_podmins_a: "Od momentu kiedy zaczniesz udostępniać komuś na innym podzie, wszystkie Twoje wpisy, a także Twój profil są zapisane (jako tzw. cache) na jego podzie, i dostępne dla jego administratora. Jeśli skasujesz wpis lub dane ze swojego profilu, są one kasowane na Twoim podzie i żądanie skasowania jest wysyłane do wszystkich podów na których były przechowywane. Zdjęcia są zawsze przechowywane tylko na Twoim podzie i tylko łącza do nich są przesyłane do innych podów."
       data_other_podmins_q: "Czy administrator innego poda może zobaczyć moje dane?"
       data_visible_to_podmin_a: "Komunikacja między podami jest zawsze szyfrowana (przy użyciu SSL/TLS i własnego szyfrowania diaspory*), ale dane przechowywane na podzie nie są zaszyfrowane. Administrator poda (zwykle jego właściciel) jeśli zechce, ma dostęp do danych Twojego profilu i wszystkiego co udostępniasz. Nie odbiega to od standardowej sytuacji w innych serwisach przechowujących dane użytkowników. Posiadanie własnego poda zwiększa poziom prywatności, ponieważ wtedy sam kontrolujesz dostęp do bazy danych."
-      data_visible_to_podmin_q: "Ile z moich danych może zobaczyć administrator poda, na którym jestem zarejestrowan@{f:a|m:y|n:y/a}?"
+      data_visible_to_podmin_q: "Ile z moich danych może zobaczyć administrator poda, na którym jestem zarejestrowany?"
       download_data_a: "Tak. Na dole karty Konto na stronie z Twoimi ustawieniami znajdują się dwa przyciski służące do pobierania danych – jeden dla danych i jeden dla zdjęć."
       download_data_q: "Czy mogę pobrać kopię wszystkich danych z mojego konta?"
       move_pods_a: "Wersja 0.7.0.0 diaspory* pozwala już na częściową migrację konta: w sekcji \"Konto\" w ustawieniach możesz wyeksportować wszystkie swoje dane. Trzymaj je w bezpiecznym miejscu! W przyszłym wydaniu diaspory* będziesz mógł dokonać pełnej migracji do innego poda, włącznie ze wszystkimi wpisami i kontaktami."
@@ -349,7 +362,7 @@ pl:
       change_aspect_of_post_a: "Nie, ale możesz utworzyć nowy wpis z tą samą treścią i wysłać go do innych aspektów."
       change_aspect_of_post_q: "Czy mogę zmienić aspekty, dla których wpis będzie widoczny, po wysłaniu tego wpisu?"
       contacts_know_aspect_a: "Nie. W żadnej sytuacji nie mogą oni zobaczyć nazwy aspektu."
-      contacts_know_aspect_q: "Czy moje kontakty wiedzą w jakich aspektach ich umieścił@{f:am|m:em|n:em/am}?"
+      contacts_know_aspect_q: "Czy moje kontakty wiedzą w jakich aspektach ich umieściłem?"
       contacts_visible_a: "Jeśli zaznaczysz tą opcję, kontakty z danego aspektu będą mogły zobaczyć pod Twoim zdjęciem na stronie profilu, kto oprócz nich znajduje się w tym aspekcie. Najlepiej zaznaczać tą opcję tylko jeśli kontakty z tego aspektu znają się nawzajem. Nazwa aspektu jednak nadal pozostanie dla nich niewidoczna."
       contacts_visible_q: "Co oznacza \"spraw, aby kontakty z tego aspektu widziały się nawzajem\"?"
       delete_aspect_a: "W liście aspektów na stronie głównej z lewej strony ustaw kursor nad aspektem, który chcesz usunąć. Kliknij ikonkę edycji w kształcie ołówka która pojawi się po prawej stronie. W okienku, które się pojawi, kliknij ikonę kosza na śmieci."
@@ -374,6 +387,7 @@ pl:
       add_contact_roster_q: "Jak mogę czatować z kimś na diasporze*?"
       contacts_page: "strony kontaktów"
       title: "Czat"
+    community_guidelines: "zasady społeczności"
     faq: "często zadawane pytania"
     foundation_website: "Strona fundacji diaspora*"
     getting_help:
@@ -406,6 +420,7 @@ pl:
     mentions:
       how_to_mention_a: "Wprowadź znak \"@\", a po nim zacznij wpisywać imię osoby. Pojawi się menu, które pozwoli Ci wybrać tą osobę. Pamiętaj, że w ten sposób wspomnisz tylko o osobach, które dodałeś do któregoś z aspektów."
       how_to_mention_q: "Jak wspomnieć o kimś we wpisie?"
+      mention_in_comment_a: "Od wersji 0.7.0.0 już tak! Możesz wspomnieć o kimś w komentarzu w dokładnie taki sposób w jaki zrobiłbyś to we wpisie, poprzez wpisanie \"@\" i rozpoczęcie wpisywania nazwy danego użytkownika. Miej na uwadze, że jeśli dodajesz komentarz do niepublicznego wpisu, możesz wspomnieć jedynie osoby które weszły w interakcję z tym wpisem."
       mention_in_comment_q: "Czy mogę wspomnieć o kimś w komentarzu?"
       see_mentions_a: "Tak, kliknij \"Wzmianki\" po lewej stronie Twojej strony głównej."
       see_mentions_q: "Czy mogę jakoś zobaczyć wpisy, w których zostałem wspomniany?"
@@ -440,7 +455,7 @@ pl:
       format_text_a: "diaspora* używa prostego systemu zwanego %{markdown}. Edytor posiada przyciski ułatwiające formatowanie tekstu. Jeśli chcesz robić to ręcznie, więcej informacji na temat Markdown znajdziesz %{here}. Dzięki karcie Podglądu możesz jeszcze przed wysłaniem zobaczyć jak wiadomość będzie wyglądała. Miej na uwadze, że nie ma możliwości edytowania wpisów, więc staraj się by wszystko wyglądało perfekcyjnie zanim Udostępnisz wpis."
       format_text_q: "Jak mogę formatować tekst w moich wpisach (pogrubiać go, dodać kursywę itp.)?"
       hide_posts_a: "Jeśli nakierujesz kursor na górę wpisu, po prawej stronie pojawi się X. Kliknij go aby ukryć ten wpis i wyciszyć powiadomienia dotyczące go. Wciąż będziesz mógł zobaczyć ten wpis jeśli przejdziesz na stronę profilową osoby, która go udostępniła."
-      hide_posts_q: "Jak ukryć wpis? / Jak wyłączyć powiadomienia na temat wpisu skomentowanego przeze mnie?"
+      hide_posts_q: "Jak ukryć wpis?"
       insert_images_a: "Kliknij ikonę aparatu aby dodać zdjęcie do wpisu. Kliknij ikonę jeszcze raz aby dodać kolejne zdjęcie, lub zaznacz kilka plików aby dodać je jednocześnie."
       insert_images_comments_q: "Czy mogę do komentarzy dodać zdięcia?"
       insert_images_q: "Jak mogę dodać do wpisów zdięcia?"
@@ -472,8 +487,10 @@ pl:
       who_sees_post_q: "Kiedy udostępniam wpis w ramach określonego aspektu (t.j. udostępniam wpis prywatny) kto może go zobaczyć?"
     profile:
       title: "Profil"
+      what_do_tags_do_a: "Pozwalają one ludziom zorientować się kim jesteś. Twoje zdjęcie pojawi się również z lewej strony stron tych konkretnych tagów, wraz ze zdjęciami innych ludzi, którzy dodali je do swoich publicznych profili."
       what_do_tags_do_q: "Do czego służą tagi w moim profilu podstawowym?"
       whats_in_profile_q: "Co znajduje siÄ™ w moim profilu?"
+      who_sees_profile_a: "Twój profil podstawowy (imię, nazwisko, zdjęcie profilowe i #tagi) jest publiczny. Twój profil rozszerzony jest domyślnie prywatny, ale jeśli tylko chcesz możesz sprawić by był dostępny publicznie. Tylko osoby z którymi się dzielisz (to znaczy dodałeś je do swoich aspektów) mogą zobaczyć Twój profil rozszerzony, gdy jest ustawiony jako prywatny. Inne osoby będą widzieć jedynie profil podstawowy. Wszystkie informacje, które udostępniasz publicznie, są widoczne dla każdego w internecie i mogą być indeksowane przez wyszukiwarki internetowe."
       who_sees_profile_q: "Kto widzi mój profil?"
     public_posts:
       can_comment_reshare_like_a: "Każdy zalogowany użytkownik diaspory* może komentować, przekazywać i lubić Twoje publiczne wpisy. Jedynym wyjątkiem są osoby które ignorujesz: nie mogą one lubić ani komentować Twoich wpisów."
@@ -534,17 +551,28 @@ pl:
   home:
     default:
       be_who_you_want_to_be: "Bądź kimkolwiek chcesz być"
+      be_who_you_want_to_be_info: "Mnóstwo sieci nalega, aby podać im swoją prawdziwą tożsamość. Nie diaspora*. Tutaj możesz wybrać kim chcesz być i opowiedzieć o sobie tak dużo lub tak mało jak tylko chcesz. To czym i jak dzielisz się z innymi to tylko i wyłącznie Twój wybór."
       byline: "Wirtualna sieć społecznościowa nad którą to Ty masz kontrolę"
       choose_your_audience: "Wybierz swoich słuchaczy"
+      choose_your_audience_info: "Aspekty na diasporze* pozwalają Ci dzielić się tylko z tymi osobami, z którymi chcesz. Możesz być tak otwarty lub skryty, jak zechcesz - jednocześnie. Podziel się śmiesznym zdjęciem ze światem, a głęboki sekret zachowaj tylko dla najbliższych przyjaciół. Ty masz kontrolę."
       headline: "Witaj na %{pod_name}"
       own_your_data: "Twoje dane należą do Ciebie"
+      own_your_data_info: "Wiele sieci używa Twoich danych, aby zarabiać, analizując Twoje zachowanie i podsuwając Ci spersonalizowane reklamy. diaspora* nie używa Twoich danych w celach innych, niż umożliwienie Ci kontaktu z innymi."
     podmin:
+      byline: "Jesteś na dobrej drodze by zmienić Internet. Zaczynamy?"
+      configuration_info: "Otwórz %{database_path} oraz %{diaspora_path} w swoim ulubionym edytorze tekstu i dokładnie je przeczytaj, pomogą Ci w tym komentarze."
       configure_your_pod: "Skonfiguruj swój pod"
       contact_irc: "porozmawiaj z nami na IRC-u"
       contribute: "Współtwórz"
+      contribute_info: "Spraw by diaspora* stała się jeszcze lepsza! Jeśli natrafisz na jakieś błędy prosimy %{report_bugs}."
       create_an_account: "Stwórz konto"
+      faq_for_podmins: "FAQ dla administratorów podów w naszej wiki"
+      getting_help: "Uzyskaj pomoc"
       headline: "Witaj, przyjacielu."
       make_yourself_an_admin: "Zostań administratorem"
+      make_yourself_an_admin_info: "Instrukcje znajdziesz w %{wiki}. To powinno dodać odnośnik %{admin_dashboard} do Twojego menu użytkownika w nagłówku, gdy jesteś zalogowany. Dzięki temu będziesz miał dostęp do, między innymi, wyszukiwania użytkowników czy też statystyk Twojego poda."
+      report_bugs: "zgłoś je"
+      update_instructions: "instrukcje aktualizacji w wiki diaspory*"
       update_your_pod: "Zaktualizuj swój pod"
   invitation_codes:
     already_logged_in: "%{inviter} zaprosił Cię na ten pod, ale jesteś już zalogowany."
@@ -567,7 +595,7 @@ pl:
       comma_separated_plz: "Można wprowadzić wiele adresów e-mail oddzielonych przecinkami."
       invite_someone_to_join: "ZaproÅ› kogoÅ› do diaspory*!"
       language: "Język"
-      paste_link: "Udostępnij to łącze znajomym, aby zaprosić ich do Diaspory* lub wyślij je do nich przez e-mail."
+      paste_link: "Udostępnij ten odnośnik znajomym, aby zaprosić ich do diaspory*, albo prześlij im go e-mailem."
       send_an_invitation: "Wyślij zaproszenie"
       sending_invitation: "Wysyła zaproszenie..."
   layouts:
@@ -603,10 +631,10 @@ pl:
       other: "Wpis %{post_link} dodany przez %{post_author} został także skomentowany przez %{actors}."
       zero: "Wpis %{post_link} dodany przez %{post_author} został także skomentowany przez %{actors}."
     also_commented_deleted:
-      few: "%{actors} skomentowali/ły już usunięty wpis."
-      many: "%{actors} skomentowali/ły już usunięty wpis."
-      one: "%{actors} skomentował/ła już usunięty wpis."
-      other: "%{actors} skomentowali/ły już usunięty wpis."
+      few: "%{actors} skomentowali już usunięty wpis."
+      many: "%{actors} skomentowali już usunięty wpis."
+      one: "%{actors} skomentował już usunięty wpis."
+      other: "%{actors} skomentowali już usunięty wpis."
       zero: "%{actors} skomentował już usunięty wpis."
     comment_on_post:
       few: "Twój wpis %{post_link} ma komentarze od %{actors}."
@@ -631,6 +659,7 @@ pl:
       mark_read: "Oznacz jako przeczytane"
       mark_unread: "Oznacz jako nieprzeczytane"
       mentioned: "Wspomnieli o tobie"
+      mentioned_in_comment: "Wzmianka w komentarzu"
       no_notifications: "Nie masz jeszcze powiadomień"
       notifications: "Powiadomienia"
       reshared: "Przekazali dalej"
@@ -638,52 +667,60 @@ pl:
       show_unread: "pokaż nieprzeczytane"
       started_sharing: "Zaczęli Ci udostępniać"
     liked:
-      few: "%{actors} polubili/ły Twój wpis %{post_link}."
-      many: "%{actors} polubili/ły Twój wpis %{post_link}."
-      one: "%{actors} polubił/ła Twój wpis %{post_link}."
-      other: "%{actors} polubili/ły Twój wpis %{post_link}."
-      zero: "%{actors} polubił/ła Twój wpis %{post_link}."
+      few: "%{actors} polubili Twój wpis %{post_link}."
+      many: "%{actors} polubili Twój wpis %{post_link}."
+      one: "%{actors} polubił Twój wpis %{post_link}."
+      other: "%{actors} polubili Twój wpis %{post_link}."
+      zero: "%{actors} polubił Twój wpis %{post_link}."
     liked_post_deleted:
-      few: "%{actors} polubili/ły Twój usunięty wpis."
-      many: "%{actors} polubili/ły Twój usunięty wpis."
-      one: "%{actors} polubił/ła Twój usunięty wpis."
-      other: "%{actors} polubili/ły Twój usunięty wpis."
-      zero: "%{actors} polubił/ła Twój usunięty wpis."
+      few: "%{actors} polubili Twój usunięty wpis."
+      many: "%{actors} polubili Twój usunięty wpis."
+      one: "%{actors} polubił Twój usunięty wpis."
+      other: "%{actors} polubili Twój usunięty wpis."
+      zero: "%{actors} polubił Twój usunięty wpis."
     mentioned:
-      few: "%{actors} wspomnieli/Å‚y o Tobie we wpisie %{post_link}."
-      many: "%{actors} wspomnieli/Å‚y o Tobie we wpisie %{post_link}."
-      one: "%{actors} wspomniał/ła o Tobie we wpisie %{post_link}."
-      other: "%{actors} wspomnieli/Å‚y o Tobie we wpisie %{post_link}."
-      zero: "%{actors} wspomniał/ła o Tobie we wpisie %{post_link}."
+      few: "%{actors} wspomnieli o Tobie we wpisie %{post_link}."
+      many: "%{actors} wspomnieli o Tobie we wpisie %{post_link}."
+      one: "%{actors} wspomniał o Tobie we wpisie %{post_link}."
+      other: "%{actors} wspomnieli o Tobie we wpisie %{post_link}."
     mentioned_deleted:
-      few: "%{actors} wspomnieli/ły o Tobie w usuniętym już wpisie."
-      many: "%{actors} wspomnieli/ły o Tobie w usuniętym już wpisie."
-      one: "%{actors} wspomniał/ła o Tobie w usuniętym już wpisie."
-      other: "%{actors} wspomnieli/ły o Tobie w usuniętym już wpisie."
-      zero: "%{actors} wspomnieli o Tobie w usuniętym już wpisie."
+      few: "%{actors} wspomnieli o Tobie w usuniętym już wpisie."
+      many: "%{actors} wspomnieli o Tobie w usuniętym już wpisie."
+      one: "%{actors} wspomniał o Tobie w usuniętym już wpisie."
+      other: "%{actors} wspomnieli o Tobie w usuniętym już wpisie."
+    mentioned_in_comment:
+      few: "%{actors} wspomnieli o Tobie w <a href='%{comment_path}'>komentarzu</a> do wpisu %{post_link}."
+      many: "%{actors} wspomnieli o Tobie w <a href='%{comment_path}'>komentarzu</a> do wpisu %{post_link}."
+      one: "%{actors} wspomniał o Tobie w <a href='%{comment_path}'>komentarzu</a> do wpisu %{post_link}."
+      other: "%{actors} wspomnieli o Tobie w <a href='%{comment_path}'>komentarzu</a> do wpisu %{post_link}."
+    mentioned_in_comment_deleted:
+      few: "Wspomnieli o Tobie w usuniętym komentarzu: %{actors}"
+      many: "Wspomnieli o Tobie w usuniętym komentarzu: %{actors}"
+      one: "%{actors} wspomniał o Tobie w usuniętym komentarzu."
+      other: "Wspomnieli o Tobie w usuniętym komentarzu: %{actors}"
     private_message:
-      few: "%{actors} wysłali/ły Ci wiadomość."
-      many: "%{actors} wysłali/ły Ci wiadomość."
-      one: "%{actors} wysłał/ła Ci wiadomość."
-      other: "%{actors} wysłali/ły Ci wiadomość."
+      few: "%{actors} wysłali Ci wiadomość."
+      many: "%{actors} wysłali Ci wiadomość."
+      one: "%{actors} wysłał Ci wiadomość."
+      other: "%{actors} wysłali Ci wiadomość."
       zero: "%{actors} wysłał Ci wiadomość."
     reshared:
-      few: "%{actors} przekazali/ły dalej Twój wpis %{post_link}."
-      many: "%{actors} przekazali/ły dalej Twój wpis %{post_link}."
-      one: "%{actors} przekazał/ła dalej Twój wpis %{post_link}."
-      other: "%{actors} przekazali/ły dalej Twój wpis %{post_link}."
-      zero: "%{actors} przekazał/ła dalej Twój wpis %{post_link}."
+      few: "%{actors} przekazali dalej Twój wpis %{post_link}."
+      many: "%{actors} przekazali dalej Twój wpis %{post_link}."
+      one: "%{actors} przekazał dalej Twój wpis %{post_link}."
+      other: "%{actors} przekazali dalej Twój wpis %{post_link}."
+      zero: "%{actors} przekazał dalej Twój wpis %{post_link}."
     reshared_post_deleted:
-      few: "%{actors} przekazali/ły dalej Twój usunięty wpis."
-      many: "%{actors} przekazali/ły dalej Twój usunięty wpis."
-      one: "%{actors} przekazał/ła dalej Twój usunięty wpis."
-      other: "%{actors} przekazali/ły dalej Twój usunięty wpis."
+      few: "%{actors} przekazali dalej Twój usunięty wpis."
+      many: "%{actors} przekazali dalej Twój usunięty wpis."
+      one: "%{actors} przekazał dalej Twój usunięty wpis."
+      other: "%{actors} przekazali dalej Twój usunięty wpis."
       zero: "%{actors} przekazali dalej Twój usunięty wpis."
     started_sharing:
-      few: "%{actors} zaczęli/ły Ci udostępniać."
-      many: "%{actors} zaczęli/ły Ci udostępniać."
-      one: "%{actors} zaczął/ęła Ci udostępniać."
-      other: "%{actors} zaczęli/ły Ci udostępniać."
+      few: "%{actors} zaczęli Ci udostępniać."
+      many: "%{actors} zaczęli Ci udostępniać."
+      one: "%{actors} zaczął Ci udostępniać."
+      other: "%{actors} zaczęli Ci udostępniać."
       zero: "%{actors} zaczęli Ci udostępniać."
   notifier:
     a_limited_post_comment: "Pojawił się nowy komentarz w ograniczonym wpisie na diasporze*. Zapoznaj się z nim."
@@ -698,7 +735,9 @@ pl:
     confirm_email:
       click_link: "Aby aktywować nowy adres e-mail %{unconfirmed_email}, kliknij to łącze:"
       subject: "Aktywuj nowy adres e-mail %{unconfirmed_email}"
-    email_sent_by_diaspora: "Ta wiadomość została wysłana przez %{pod_name}. Jeśli nie chcesz otrzymywać takich wiadomości,"
+    csrf_token_fail:
+      subject: "Otrzymaliśmy nieautoryzowane żądanie z Twojego konta, %{name}"
+    email_sent_by_diaspora: "Ta wiadomość została wysłana przez pod %{pod_name}. Jeśli nie chcesz otrzymywać takich wiadomości,"
     export_email:
       body: |-
           Dzień dobry %{name},
@@ -763,16 +802,19 @@ pl:
 
           [1]: %{invite_url}
           [2]: %{diasporafoundation_url}
-    invited_you: "%{name} zaprosił/a Cię do diaspory*"
+    invited_you: "%{name} zaprosił Cię do diaspory*"
     liked:
-      liked: "%{name} polubił/ła Twój wpis"
+      liked: "%{name} polubił Twój wpis"
       limited_post: "%{name} polubił twój post o ograniczonej widoczności"
       view_post: "Wyświetl wpis >"
     mentioned:
-      limited_post: "Zostałeś wspomniany w poście o ograniczonej widoczności."
+      limited_post: "Zostałeś wspomniany we wpisie o ograniczonej widoczności."
       subject: "%{name} wspomniał o Tobie na diasporze*"
+    mentioned_in_comment:
+      limited_post: "Zostałeś wspomniany w komentarzu do wpisu o ograniczonej widoczności."
+      reply: "Odpowiedz lub wyświetl rozmowę >"
     private_message:
-      reply_to_or_view: "Odpowiedz lub wyświetl wątek >"
+      reply_to_or_view: "Odpowiedz lub wyświetl rozmowę >"
       subject: "Masz nową prywatną wiadomość"
     remove_old_user:
       body: |-
@@ -809,7 +851,7 @@ pl:
         comment: "komentarz"
         post: "wpis"
     reshared:
-      reshared: "%{name} przekazał/ła dalej Twój wpis"
+      reshared: "%{name} przekazał dalej Twój wpis"
       view_post: "Wyświetl wpis >"
     single_admin:
       admin: "Twój administrator diaspory*"
@@ -908,7 +950,7 @@ pl:
   registrations:
     closed: "Ten pod diaspory* nie zezwala na rejestrację nowych użytkowników."
     create:
-      success: "Dołączył@{f:aś|m:eś|n:aś/eś} do diaspory*!"
+      success: "Dołączyłeś do diaspory*!"
     invalid_invite: "Podane łącze do zaproszenia jest nieważne!"
     new:
       email: "E-mail"
@@ -924,11 +966,11 @@ pl:
       terms_link: "warunki korzystania z serwisu"
       username: "Nazwa użytkownika"
   report:
-    comment_label: "<b>Komentarz</b>:<br/>%{data}"
+    comment_label: "<b>Komentarz</b>: %{data}"
     confirm_deletion: "Czy masz pewność, że chcesz usunąć ten element?"
     delete_link: "Usuń element"
-    not_found: "<u>Ten wpis/komentarz nie został znaleziony. Wygląda na to, że został usunięty przez autora!</u>"
-    post_label: "<b>Wpis</b>: %{title}"
+    not_found: "Ten wpis/komentarz nie został znaleziony. Wygląda na to, że został usunięty przez autora!"
+    post_label: "<b>Wpis</b>: %{content}"
     reason_label: "Powód:"
     reported_label: "<b>Zgłoszony przez</b> %{person}"
     reported_user_details: "Szczegółowe informacje odnośnie zgłoszonego użytkownika"
@@ -937,8 +979,14 @@ pl:
       destroyed: "Wpis został zniszczony"
       failed: "Coś poszło nie tak"
     title: "Przegląd zgłoszeń"
+    unreviewed_reports:
+      few: "Są %{count} nieprzejrzane zgłoszenia."
+      many: "Jest %{count} nieprzejrzanych zgłoszeń."
+      one: "Jest %{count} nieprzejrzane zgłoszenie."
+      other: "Liczba nieprzejrzanych zgłoszeń: %{count}"
+      zero: "Nie ma nieprzejrzanych zgłoszeń."
   reshares:
-    comment_email_subject: "%{resharer} przekazał/a dalej wpis %{author}"
+    comment_email_subject: "%{resharer} przekazał dalej wpis %{author}"
     create:
       error: "Nie udało się przekazać dalej."
     reshare:
@@ -957,7 +1005,7 @@ pl:
     failure:
       error: "Wystąpił błąd podczas łączenia z tą usługą"
     index:
-      connect: "Connect"
+      connect: "Połącz"
       disconnect: "Rozłącz"
       edit_services: "Edycja usług"
       logged_in_as: "Zalogowano jako %{nickname}"
@@ -1103,7 +1151,7 @@ pl:
       success: "Konto zostało zablokowane. Usuwanie Twojego konta może zająć nam do 20 minut. Dziękujemy za wypróbowanie diaspory*."
       wrong_password: "Wprowadzone hasło nie jest zgodne z aktualnym hasłem."
     edit:
-      also_commented: "...ktoś skomentuje wpis mający mój komentarz"
+      also_commented: "ktoś skomentuje wpis mający mój komentarz"
       auto_follow_aspect: "Aspekt dla automatycznie dodanych użytkowników:"
       auto_follow_back: "Automatycznie zacznij udostępniać gdy ktoś zaczyna mi udostępniać"
       change: "Zmień"
@@ -1115,13 +1163,13 @@ pl:
       close_account:
         dont_go: "Prosimy, nie odchodź!"
         lock_username: "Nazwa Twojego konta zostanie zablokowana. Na tym podzie nie będziesz już mógł stworzyć nowego, o tym samym identyfikatorze."
-        locked_out: "Zostaniesz wylogowa@{m:ny|f:na|n:ny/na} i zablokowany, dopóki Twoje konto nie zostanie usunięte."
+        locked_out: "Zostaniesz wylogowany i zablokowany, dopóki Twoje konto nie zostanie usunięte."
         make_diaspora_better: "Wolelibyśmy, żebyś został tu i pomógł nam ulepszyć diasporę*, zamiast opuszczać sieć. Jednak jeśli naprawdę odchodzisz, oto co się potem stanie:"
         mr_wiggles: "Pan Łaskotka będzie niepocieszony, widząc, że odchodzisz"
         no_turning_back: "Nie ma odwrotu! Jeśli naprawdę jesteś pewien, wpisz swoje hasło poniżej."
         what_we_delete: "Usuniemy wszystkie Twoje wpisy i dane profilu najszybciej jak to tylko możliwe. Twoje komentarze pozostaną tam gdzie były, ale będą skojarzone z Twoim Identyfikatorem diaspory* zamiast z imieniem."
       close_account_text: "Zamknij konto"
-      comment_on_post: "...ktoś dodał komentarz do mojego wpisu"
+      comment_on_post: "ktoÅ› doda komentarz do mojego wpisu"
       current_password: "Bieżące hasło"
       current_password_expl: "to, którego używasz do logowania"
       default_post_visibility: "Domyślne aspekty dla nowych wpisów"
@@ -1134,20 +1182,21 @@ pl:
       export_photos_in_progress: "Aktualnie przetwarzamy twoje zdjęcia. Sprawdź ponownie za kilka chwil."
       following: "Ustawienia udostępniania"
       last_exported_at: "(ostatnio aktualizowano o %{timestamp})"
-      liked: "...ktoś polubił mój wpis"
-      mentioned: "...ktoś wspomniał mnie we wpisie"
+      liked: "ktoś polubi mój wpis"
+      mentioned: "ktoÅ› wspomni o mnie we wpisie"
+      mentioned_in_comment: "ktoÅ› wspomni o mnie w komentarzu"
       new_password: "Nowe hasło"
-      private_message: "...otrzymam prywatną wiadomość"
-      receive_email_notifications: "Wysyłaj powiadomienia e-mail jeśli..."
-      request_export: "PoproÅ› o dane mojego profilu"
-      request_export_photos: "Poproś o moje zdjęcia"
+      private_message: "otrzymam prywatną wiadomość"
+      receive_email_notifications: "Wysyłaj powiadomienia e-mail gdy:"
+      request_export: "ProszÄ™ o dane mojego profilu"
+      request_export_photos: "Proszę o moje zdjęcia"
       request_export_photos_update: "Odśwież moje zdjęcia"
       request_export_update: "Odśwież dane mojego profilu"
-      reshared: "...ktoś przekazał dalej mój wpis"
+      reshared: "ktoś przekaże dalej mój wpis"
       show_community_spotlight: "Wyświetlić wyróżnionych użytkowników w Strumieniu?"
       show_getting_started: "Ponownie włącz \"pierwsze kroki\""
       someone_reported: "ktoś wysłał zgłoszenie"
-      started_sharing: "...ktoś zaczął mi udostępniać wpisy"
+      started_sharing: "ktoś zacznie mi udostępniać wpisy"
       stream_preferences: "Ustawienia Strumienia"
       your_email: "Adres e-mail"
       your_email_private: "Twój email zawsze pozostanie niewidoczny dla innych użytkowników"
diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml
index 4a8032ead410f315219ef7c314d202c7a68e0b87..72d2253c2a3cea0c37d1504de784db1e2280d15e 100644
--- a/config/locales/diaspora/pt-BR.yml
+++ b/config/locales/diaspora/pt-BR.yml
@@ -388,6 +388,7 @@ pt-BR:
       add_contact_roster_q: "Como bater papo com alguém na diaspora*?"
       contacts_page: "página de contatos"
       title: "Bate-papo"
+    community_guidelines: "normas da comunidade"
     faq: "FAQ"
     foundation_website: "site da Fundação Diaspora"
     getting_help:
@@ -421,6 +422,7 @@ pt-BR:
     mentions:
       how_to_mention_a: "Digite o símbolo \"@\" e comece a escrever o nome da pessoa. Um menu suspenso deve aparecer para facilitar a seleção. Repare que só é possível mencionar pessoas adicionadas a algum aspecto seu."
       how_to_mention_q: "Como eu menciono alguém quando estou fazendo uma pubicação?"
+      mention_in_comment_a: "Sim, desde o lançamento da versão 0.7.0.0! Você pode mencionar alguém em um comentário do mesmo jeito que em uma publicação, digitando \"@\" e, depois, o nome da pessoa. Repare que, quando você comenta uma publicação limitada, você só pode mencionar usuários que já tenham interagido com o post."
       mention_in_comment_q: "Posso mencionar alguém em um comentário?"
       see_mentions_a: "Sim. Clique em \"@Menções\" na sua página inicial, na coluna à esquerda."
       see_mentions_q: "Existe uma maneira de ver as publicações nas quais eu tenha sido mencionado?"
@@ -456,7 +458,11 @@ pt-BR:
       format_text_q: "Como eu posso formatar o texto em minhas publicações (negrito, itálico, etc.)?"
       hide_posts_a: "Se você apontar seu mouse para a parte superior da publicação, um X aparece à direita. Clique nele para ocultar a publicação e desligar as notificações sobre esta publicação. Você ainda pode ver a publicação se você visitar a página de perfil da pessoa que publicou."
       hide_posts_q: "Como faço para ocultar uma publicação?"
-      insert_images_a: "Clique no pequeno ícone de câmera para inserir uma imagem na publicação. Pressione o ícone novamente para adicionar outra foto. Você também pode selecionar múltiplas fotos para carregá-las de uma vez só."
+      ignore_user_a1: "Se você estiver compartilhando com essa pessoa, basta removê-la dos seus aspectos para reduzir a quantidade de posts dela que aparecem para você. Uma solução mais completa é \"ignorar\" essa conta. Assim, nenhuma das publicações dessa pessoa vai aparecer no seu fluxo, e ela não poderá mais curtir nem comentar os seus posts. Apesar disso, ela ainda poderá recompartilhar os seus posts e comentar recompartilhamentos deles, e os comentários que fizer em publicações de outras pessoas que aparecem no seu fluxo ainda serão visíveis para você."
+      ignore_user_a2: "Para ignorar uma conta, clique no ícone de \"ignorar\" (um círculo cortado por uma diagonal) no canto superior direito de uma das publicações dela. Os posts dessa conta desaparecerão instantaneamente do seu fluxo. Os posts vão desaparecer instantaneamente do seu fluxo. Outra maneira é ir até a página de perfil e lá clicar no ícone de ignorar. Você ainda poderá ver os posts dessa conta na página dela ou usando a visão de publicação única."
+      ignore_user_a3: "Há uma lista das pessoas que você ignora nas suas Configurações, na aba Privacidade. Se quiser deixar de ignorar uma pessoa, apague o nome dela da lista que aparece nessa página."
+      ignore_user_q: "Como evitar que as publicações de alguém apareçam no meu fluxo?"
+      insert_images_a: "Para inserir uma imagem armazenada no seu computador na publicação, clique no pequeno ícone de câmera localizado abaixo do editor. Você também pode arrastar uma ou mais imagens diretamente da pasta no seu computador para o ícone. Se quiser inserir uma imagem da internet, clique no ícone de imagem acima do editor e o código Markdown será gerado para você."
       insert_images_comments_a: "Você pode usar Markdown para inserir imagens da web em comentários da mesma forma que em publicações, mas não carregar imagens armazenadas no seu computador diretamente para um comentário. Primeiro faça upload do arquivo para um serviço de hospedagem de imagens e depois insira-o usando o botão de imagem que fica sobre o editor."
       insert_images_comments_q: "Posso inserir imagens em comentários?"
       insert_images_q: "Como eu insiro imagens às publicações?"
@@ -466,7 +472,7 @@ pt-BR:
       post_notification_q: "Como receber, ou deixar de receber, as notificações de uma publicação?"
       post_poll_a: "Clique no ícone de gráfico para gerar uma enquete. Digite uma pergunta e pelo menos duas respostas. Não se esqueça de marcar sua publicação como pública se você quiser que todos possam participar."
       post_poll_q: "Como posso adicionar uma enquete à minha publicação?"
-      post_report_a: "Clique no triângulo de aviso no canto superior direito de uma publicação para denunciá-la à administração do servidor. Justifique-se na caixa de diálogo."
+      post_report_a: "Clique no triângulo de aviso no canto superior direito de uma publicação para denunciá-la à administração do servidor. Informe o motivo da denúncia na caixa de diálogo. Por favor, denuncie apenas publicações que violem as %{community_guidelines} ou os termos de serviço do seu pod, por exemplo posts com conteúdo ilegal ou abusivo e spam."
       post_report_q: "Como denunciar uma publicação ofensiva?"
       size_of_images_a: "Não. Imagens são redimensionadas automaticamente para preencherem o fluxo. O Markdown não permite especificar o tamanho de uma imagem."
       size_of_images_q: "Posso personalizar o tamanho das imagens em publicações ou comentários?"
@@ -488,13 +494,17 @@ pt-BR:
       who_sees_post_q: "Quando eu publico uma mensagem em um aspecto (por ex., uma publicação privada), quem pode vê-la?"
     profile:
       title: "Perfil"
+      what_do_tags_do_a: "Elas são uma forma das pessoas te conhecerem melhor. A sua foto de perfil também aparece no lado esquerdo dos fluxos dessas tags, junto com as de outros usuários que, como você, as incluíram no perfil básico."
+      what_do_tags_do_q: "Para que servem as tags no meu perfil básico?"
+      whats_in_profile_a: "Seu perfil é dividido em duas partes: o perfil básico e o ampliado. Seu perfil básico inclui seu nome, as cinco tags que você escolheu para se descrever e a sua foto. Seu perfil ampliado inclui sua biografia, local, gênero e data de aniversário. Todos esses campos são opcionais – você decide quais preencher e o quão identificadoras ou anonimizantes serão as informações que der. Seu perfil ampliado é exibido na coluna à esquerda da sua página de perfil, sob a imagem de perfil."
       whats_in_profile_q: "O que aparece no meu perfil?"
+      who_sees_profile_a: "Seu perfil básico (nome, imagem de perfil e #tags) é público. Seu perfil ampliado é privado por padrão, mas pode ser tornado público, se você quiser. Apenas pessoas com quem você compartilha (ou seja, aquelas que foram adicionadas a algum dos seus aspectos) poderão ver seu perfil ampliado caso você decida mantê-lo privado. Outras pessoas verão apenas suas informações públicas. As informações de perfil públicas podem ser acessadas por qualquer internauta e indexadas por mecanismos de busca."
       who_sees_profile_q: "Quem vê meu perfil?"
     public_posts:
-      can_comment_reshare_like_a: "Qualquer usuário logado em diaspora* pode comentar, recompartilhar, ou curtir sua publicação pública."
+      can_comment_reshare_like_a: "Qualquer pessoa logada na diaspora* pode comentar, recompartilhar ou curtir seu post público, com exceção daquelas que você tenha ignorado, que não poderão curtir nem comentar suas publicações."
       can_comment_reshare_like_q: "Quem pode comentar, recompartilhar, ou curtir minha publicação no modo público?"
       deselect_aspect_posting_a: "Desfazer a seleção de aspectos não afeta uma publicação pública. Ela continua pública e aparece nos fluxos de todos os seus contatos. Para tornar uma publicação visível somente para aspectos específicos, você precisa selecionar os aspectos usando o seletor de aspectos, embaixo do editor."
-      deselect_aspect_posting_q: "O que acontece quando eu desseleciono um ou mais aspectos ao fazer uma publicação no modo público?"
+      deselect_aspect_posting_q: "O que acontece quando eu desmarco um ou mais aspectos na coluna à esquerda ao fazer uma publicação no modo público?"
       find_public_post_a: "Suas publicações públicas aparecem nos fluxos das pessoas que seguem você. Se contêm #tags, são mostradas nos fluxos das pessoas que seguem essas tags. Além disso, toda publicação pública tem um URL específico que qualquer internauta pode ver e, portanto, divulgar via Twitter, blogs etc. Publicações públicas também podem ser indexadas por mecanismos de busca."
       find_public_post_q: "Como outras pessoas podem encontrar minhas publicações no modo público?"
       see_comment_reshare_like_a: "Comentários, curtidas e recompartilhamentos de publicações públicas também são públicos. Qualquer  internauta pode ver suas interações com essas publicações."
@@ -520,7 +530,7 @@ pt-BR:
       add_to_aspect_li7: "Ana aparecerá sob \"Só compartilhando comigo\" na página de contatos de Pedro."
       add_to_aspect_li8: "Ana também poderá @mencionar Pedro em uma publicação."
       add_to_aspect_q: "O que acontece quando eu adiciono alguém a um dos meus aspectos? Ou quando alguém me adiciona a um de seus aspectos?"
-      list_not_sharing_a: "Não, mas você pode checar se uma pessoa compartilha com você visitando o perfil dela. Se ela estiver, o botão que mostra os aspectos aos quais você a adicionou estará verde; senão, estará cinza."
+      list_not_sharing_a: "Não, mas você pode checar se uma pessoa compartilha com você visitando o perfil dela. Se compartilhar, você verá um tique verde ao lado da diaspora* ID dela. Se não compartilhar, haverá um círculo cinza."
       list_not_sharing_q: "Existe uma lista de pessoas as quais eu adicionei a um de meus aspectos, mas que não tenham me adicionado a um dos aspectos deles?"
       only_sharing_a: "São pessoas que adicionaram você a um dos aspectos delas, mas que não estão (ainda) em um dos seus aspectos. Em outras palavras, elas estão compartilhando com você, mas você não está compartilhando com elas: elas estão \"seguindo\" você. Se você adicioná-las a um aspecto, então elas aparecerão no aspecto, e não mais em \"Só compartilhando comigo\". Veja acima."
       only_sharing_q: "Quem são as pessoas listadas em \"Só compartilhando comigo\", na página de contatos?"
@@ -532,7 +542,7 @@ pt-BR:
     tags:
       filter_tags_a: "Ainda não é possível diretamente através de diaspora*, mas algumas %{third_party_tools} tem sido escritas para poder prover isto."
       filter_tags_q: "Como posso filtrar/excluir algumas tags de meu fluxo?"
-      followed_tags_a: "Depois de buscar uma tag, você pode clicar no botão no topo da página dela para \"segui-la\". Ela vai então aparecer na sua lista de tags seguidas, no menu à esquerda. Clicar em uma das tags seguidas abre a página da tag, na qual você pode ver publicações recentes marcadas com ela. Clique em #Seguindo Tags para ver um fluxo das publicações que incluem qualquer uma das tags seguidas por você."
+      followed_tags_a: "Depois de buscar uma tag, você pode clicar no botão no topo da página dela para \"segui-la\". Ela vai então aparecer na sua lista de tags seguidas, no menu à esquerda. Clicar em uma das tags seguidas abre a página da tag, na qual você pode ver publicações recentes marcadas com ela. Clique em #Seguindo Tags para ver um fluxo das publicações que incluem qualquer uma das tags seguidas por você. Posts marcados com a tag também serão incluídos no seu fluxo principal."
       followed_tags_q: "O que é \"#Seguindo Tags\" e como eu sigo uma tag?"
       people_tag_page_a: "São as pessoas que listaram aquela tag para descrevê-las no perfil público delas."
       people_tag_page_q: "Quem são as pessoas listadas no lado esquerdo da página de tag?"
@@ -957,13 +967,13 @@ pt-BR:
       terms_link: "Termos de Serviço"
       username: "Nome de usuário"
   report:
-    comment_label: "<b>Comentário</b>: %{data}"
+    comment_label: "<strong>Comentário</strong>: %{data}"
     confirm_deletion: "Tem certeza que quer apagar o item?"
     delete_link: "Apagar item"
     not_found: "A publicação ou comentário não foi encontrado. Ao que parece, ele foi apagado pelo autor!"
-    post_label: "<b>Publicação</b>: %{content}"
+    post_label: "<strong>Publicação</strong>: %{content}"
     reason_label: "Motivo:"
-    reported_label: "<b>Relatado por</b> %{person}"
+    reported_label: "<strong>Relatado por</strong> %{person}"
     reported_user_details: "Detalhes sobre o usuário relatado"
     review_link: "Marcar como revisado"
     status:
diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml
index 3d303f9891a5577dcf2ddeaa7bb977d3f7703ff4..9752103e34fc0e4d701f09e43c75d3b58edb338c 100644
--- a/config/locales/diaspora/ru.yml
+++ b/config/locales/diaspora/ru.yml
@@ -10,7 +10,7 @@ ru:
   _help: "Помощь"
   _services: "Сервисы"
   _statistics: "Статистика"
-  _terms: "условия"
+  _terms: "Условия"
   account: "Аккаунт"
   activerecord:
     errors:
@@ -53,6 +53,10 @@ ru:
       sidekiq_monitor: "Монитор Sidekiq"
       user_search: "Поиск пользователей"
       weekly_user_stats: "Еженедельная пользовательская статистика"
+    dashboard:
+      fetching_diaspora_version: "Определяем последнюю версию диаспоры*..."
+    pods:
+      pod_desktop_view: "Эта страница недоступна в мобильной версии, пожалуйста, переключитесь на %{desktop_link}."
     stats:
       2weeks: "2 недели"
       50_most: "50 самых популярных меток"
@@ -111,6 +115,7 @@ ru:
       are_you_sure_unlock_account: "Вы уверены, что хотите разблокировать этот аккаунт?"
       close_account: "Удалить учетную запись"
       email_to: "E-mail для приглашения"
+      invite: "Пригласить"
       lock_account: "Заблокировать учетную запись"
       under_13: "Показать пользователей моложе 13 (COPPA)"
       unlock_account: "Разблокировать учетную запись"
@@ -140,17 +145,47 @@ ru:
     openid_connect:
       authorizations:
         new:
+          access: "%{name} запрашивает доступ к:"
           approve: "Одобрить"
+          bad_request: "Отсутствующий id или URL-адрес"
           deny: "Отказать"
+          no_requirement: "%{name} не требует разрешений"
+          redirection_message: "Вы уверены, что хотите предоставить доступ к %{redirect_uri}?"
       error_page:
+        contact_developer: "Свяжитесь с разработчиком приложения и предоставьте подробное сообщение об ошибке:"
         could_not_authorize: "Это приложение не может быть авторизовано"
         login_required: "Вы должны войти, прежде чем сможете авторизовать данное приложение"
         title: "Ой! Что-то пошло не так :("
+      scopes:
+        name:
+          name: "имя"
+        nickname:
+          name: "ник"
+        openid:
+          description: "Это позволяет приложению читать ваш основной профиль"
+          name: "основной профиль"
+        picture:
+          name: "изображение"
+        profile:
+          description: "Это позволяет приложению читать Ваш расширенный профиль"
+          name: "расширенный профиль"
+        read:
+          description: "Это позволяет приложению читать Ваш поток, Ваши сообщения и весь Ваш профиль"
+          name: "читать профиль, поток и беседы"
+        sub:
+          description: "Это даёт дополнительные разрешения приложению"
+        write:
+          description: "Это позволяет приложению публиковать новые записи, писать сообщения и реагировать на записи"
+          name: "послать записи, беседы и реакции"
       user_applications:
         index:
+          access: "%{name} имеет доступ к:"
           edit_applications: "Приложения"
           title: "Авторизованные приложения"
+        no_applications: "У Вас нет авторизованных приложений"
+        policy: "Ознакомиться с политикой безопасности приложения"
         revoke_autorization: "Отозвать"
+        tos: "Ознакомиться с условиями оказания услуг приложения"
   are_you_sure: "Вы уверены?"
   are_you_sure_delete_account: "Вы уверены, что хотите закрыть свой аккаунт? Эту процедуру будет невозможно отменить!"
   aspect_memberships:
@@ -182,6 +217,7 @@ ru:
       updating: "Обновление"
     index:
       donate: "Пожертвовать"
+      donate_liberapay: "Пожертвовать через Liberapay"
       help:
         any_problem: "Возникли проблемы?"
         contact_podmin: "Свяжитесь с администратором вашего пода!"
@@ -192,6 +228,8 @@ ru:
         here_to_help: "Сообщество Диаспоры всегда рядом!"
         mail_podmin: "Адрес электронной почты подмина"
         need_help: "Нужна помощь?"
+        support_forum: "Также Вы можете присоединиться к %{support_forum}."
+        support_forum_link: "форуму поддержки"
         tag_bug: "ошибка"
         tag_feature: "функция"
         tag_question: "вопрос"
@@ -209,6 +247,7 @@ ru:
       welcome_to_diaspora: "Добро пожаловать в Диаспору, %{name}!"
     no_contacts_message:
       community_spotlight: "Рекомендуемые пользователи"
+      invite_link_text: "приглашение"
       or_spotlight: "Или вы можете добавить %{link}"
       try_adding_some_more_contacts: "Вы можете найти или пригласить других пользователей."
       you_should_add_some_more_contacts: "Добавьте больше контактов!"
@@ -232,7 +271,16 @@ ru:
     heading: "Закладка Диаспоры"
     post_something: "Отправить в Диаспору"
   cancel: "Отменить"
+  color_themes:
+    dark: "Тёмная"
+    dark_green: "Тёмно-зелёная"
+    egyptian_blue: "Египетский синий"
+    magenta: "Пурпур"
+    original: "Изначальный серый"
+    original_white: "Изначальный с белым фоном"
   comments:
+    create:
+      error: "Не удалось прокомментировать."
     new_comment:
       comment: "Комментировать"
       commenting: "Комментирование..."
@@ -263,6 +311,7 @@ ru:
       conversations_inbox: "Разговоры - Входящие сообщения"
       inbox: "Входящие"
       new_conversation: "Новый разговор"
+      no_contacts: "Вам нужно добавить какой-нибудь контакт, прежде чем начинать беседу"
       no_messages: "Сообщений нет"
     new:
       message: "Сообщение"
@@ -334,6 +383,7 @@ ru:
       add_contact_roster_q: "Как я могу пообщаться с кем-либо в диаспоре*?"
       contacts_page: "страница пользователя"
       title: "Беседа"
+    community_guidelines: "рекомендации сообщества"
     faq: "ЧаВо"
     foundation_website: "сайт Diaspora Foundation"
     getting_help:
@@ -366,6 +416,7 @@ ru:
     mentions:
       how_to_mention_a: "Напишите знак \"@\" и начните набирать имя. Появится меню с выбором подходящих пользователей. Заметьте, что упоминать пользователя можно только, если вы добавили его в свои аспекты."
       how_to_mention_q: "Как мне упомянуть кого-нибудь, когда я создаю запись?"
+      mention_in_comment_a: "Начиная с версии 0.7.0.0, да! Вы можете упомянуть кого-нибудь в комментарии таким же образом, как и в записи, введите \"@\" и потом начните писать его имя. Когда речь идёт о комментарии к не публичной записи, Вы можете упоминать только тех пользователей, которые уже взаимодействовали с этой записью."
       mention_in_comment_q: "Могу ли я упомянуть кого-нибудь в комментарии?"
       see_mentions_a: "Да. Нажмите кнопку \"@Упоминания\" в боковой колонке на вашей странице."
       see_mentions_q: "Есть ли способ увидеть список записей, в которых я упомянут?"
@@ -401,6 +452,7 @@ ru:
       format_text_q: "Как мне оформить текст моих записей (полужирный, курсив и т.д.)?"
       hide_posts_a: "Если вы наведёте мышью на запись, справа вверху появится крестик. Нажмите на него. Вы всё равно сможете видеть запись и комментарии, если зайдёте на страницу к автору этой записи."
       hide_posts_q: "Как мне скрыть запись и перестать получать уведомления о комментариях к ней?"
+      ignore_user_q: "Как я могу исключить посты некоторых людей из моей ленты?"
       insert_images_a: "Нажмите пиктограмму фотокамеры и укажите нужное изображение для загрузки с вашего компьютера. Если же вы хотите вставить изображение из интернета, вы можете воспользоваться синтаксисом Мarkdown."
       insert_images_comments_q: "Могу ли я добавить изображения в комментарии?"
       insert_images_q: "Как мне добавить в запись изображение?"
@@ -430,6 +482,10 @@ ru:
       title: "Приватные записи"
       who_sees_post_a: "Только залогиненные пользователи диаспоры*, которые были добавлены в данный аспект."
       who_sees_post_q: "Когда я создаю запись для аспекта (т.н. приватная запись), кто её сможет видеть?"
+    profile:
+      title: "Профиль"
+      whats_in_profile_q: "Что в моём профиле?"
+      who_sees_profile_q: "Кто видит мой профиль?"
     public_posts:
       can_comment_reshare_like_a: "Любой зарегистрированный пользователь диаспоры."
       can_comment_reshare_like_q: "Кто может комментировать мои публичные записи, делиться или отмечать как понравившиеся?"
@@ -489,8 +545,8 @@ ru:
   home:
     default:
       be_who_you_want_to_be: "Будьте тем, кем хотите быть"
-      be_who_you_want_to_be_info: "Многие социальные сети требуют от вас указания своих настоящих данных. Многие, но не диаспора*. Здесь Вы можете выбрать, кем вы хотите быть, и указать такое количество личной информации, какое считаете нужным. Только от вас зависит, как Вы будете взаимодействовать с другими людьми."
-      byline: "Социальная сеть, которой управляете вы."
+      be_who_you_want_to_be_info: "Многие социальные сети требуют от Вас указания своих настоящих данных. Многие, но не диаспора*. Здесь Вы можете выбрать, кем Вы хотите быть, и указать такое количество личной информации, какое считаете нужным. Только от Вас зависит, как Вы будете взаимодействовать с другими людьми."
+      byline: "Социальная сеть, которой управляете Вы."
       choose_your_audience: "Выбирайте аудиторию"
       choose_your_audience_info: "Аспекты в диаспоре* позволяют вам делиться информацией только с теми людьми, с которыми вы хотите. Вы сами выбираете уровень открытости или секретности ваших записей. Делиться смешными фотографиями со всем миром - или в глубокой тайне только с самыми близкими друзьями. Всё под вашим контролем."
       headline: "Добро пожаловать в %{pod_name}"
@@ -499,16 +555,21 @@ ru:
     podmin:
       byline: "Ты скоро изменишь Интернет. Давай подготовим тебя?"
       configuration_info: "Откройте %{database_path} и %{diaspora_path} в любимом текстовом редакторе и внимательно изучите. Они подробно прокомментированы."
-      configure_your_pod: "Настроить ваш под"
+      configure_your_pod: "Настроить свой под"
+      contact_irc: "связь с нами по IRC"
       contribute: "Внести свой вклад"
       contribute_info: "Сделайте диаспору* еще лучше! Если вы обнаружили ошибку, пожалуйста %{report_bugs}."
       create_an_account: "Создать учетную запись"
       create_an_account_info: "Кликните %{sign_up_link} для получения нового аккаунта"
+      faq_for_podmins: "FAQ по поддержке подов / стручков  в нашей Wiki"
       getting_help: "Получить помощь"
       headline: "Здравствуй, друг!"
       make_yourself_an_admin: "Сделать себя администратором"
       make_yourself_an_admin_info: "Вы можете найти инструкции в %{wiki}. У вас появится ссылка \"Администратор\" в пользовательском меню в заголовке странице, когда вы заходите под своей учетной записью. Она дает вам возможности поиска по пользователям и просмотра статистики по вашему поду. Для получения подробностей по функционированию вашего пода, воспользуйтесь %{admin_panel}."
-      update_your_pod: "Обновить ваш под"
+      report_bugs: "сообщить о них"
+      update_instructions: "инструкции по обновлению в вики diaspora*"
+      update_your_pod: "Обновить свой под"
+      update_your_pod_info: "Вы можете найти %{update_instructions}"
   invitation_codes:
     not_valid: "Код для приглашения уже не активен"
   invitations:
@@ -535,6 +596,7 @@ ru:
     application:
       back_to_top: "Вернуться наверх"
       be_excellent: "Будьте прекрасны друг к другу! ♥"
+      discourse: "Обсуждение и поддержка проекта"
       powered_by: "Основано на диаспоре*"
       public_feed: "Публичный поток %{name} в Диаспоре"
       source_package: "скачать исходный код"
@@ -546,6 +608,7 @@ ru:
       logout: "Выйти"
       profile: "Профиль"
       settings: "Настройки"
+      toggle_navigation: "Переключение навигации"
   likes:
     destroy:
       error: "Не удалось отменить \"Нравится\""
@@ -590,6 +653,7 @@ ru:
       mark_read: "Пометить как прочитанное"
       mark_unread: "пометить как непрочитанное"
       mentioned: "Упомянул"
+      mentioned_in_comment: "Вас упомянули в комментарии"
       no_notifications: "У вас нет ни одного оповещения."
       notifications: "Уведомления"
       reshared: "Поделился"
@@ -622,6 +686,11 @@ ru:
       one: "%{actors} упомянул(а) вас в удаленной записи."
       other: "%{actors} упомянули вас в удаленной записи."
       zero: "%{actors} упомянули вас в удаленной записи."
+    mentioned_in_comment:
+      few: "%{actors} упомянули Вас в <a href='%{comment_path}'>комментарии</a> к записи %{post_link}."
+      many: "%{actors} упомянули Вас в <a href='%{comment_path}'>комментарии</a> к записи %{post_link}."
+      one: "%{actors} упомянул Вас в <a href='%{comment_path}'>комментарии</a> к записи %{post_link}."
+      other: "%{actors} упомянули Вас в <a href='%{comment_path}'>комментарии</a> к записи %{post_link}."
     private_message:
       few: "%{actors} послали вам сообщение."
       many: "%{actors} послали вам сообщение."
@@ -661,6 +730,28 @@ ru:
     confirm_email:
       click_link: "Чтобы активировать ваш адрес %{unconfirmed_email}, пожалуйста, перейдите по этой ссылке:"
       subject: "Пожалуйста, активируйте ваш новый адрес %{unconfirmed_email}"
+    csrf_token_fail:
+      body: |-
+          Здравствуй, %{name}, 
+           
+          диаспора* обнаружила попытку получить доступ к твоему сеансу, которая возможно не авторизована. Во избежание несанкционированного доступа к твоим данным, ты вышел. Не волнуйся, ты безопасно можешь зайти снова прямо сейчас. 
+           
+          Запрос был сделан с использованием неправильного или без CSRF токена. Это может быть совершенно безобидно, но может быть и межсайтовой подделкой запроса (CSRF). 
+           
+          Это может быть вызвано следующим: 
+           
+            - Дополнение управляет запросами или делает запросы без токена; 
+            - С предыдущего сеанса была оставлена открытая вкладка; 
+            - Другой сайт делает запросы с или без твоего ведома; 
+            - Различные внешние приложения;
+            - Вредоносный код пытается получить доступ к твоим данным. 
+           
+          Чтобы больше узнать о CSRF, читай [%{link}] (%{link}). 
+           
+          Если ты видишь это сообщение периодически, пожалуйста, проверь вышеупомянутые пункты, включая дополнения браузера. 
+           
+          Спасибо, 
+          Почтовый робот диаспоры*
     email_sent_by_diaspora: "Это письмо было послано %{pod_name}. Если вы не хотите получать подобные письма,"
     export_email:
       body: |-
@@ -724,6 +815,9 @@ ru:
     mentioned:
       limited_post: "Вас упомянули в приватной записи."
       subject: "%{name} упомянул вас в Диаспоре*"
+    mentioned_in_comment:
+      limited_post: "Вас упомянули в комментарии к ограниченной записи."
+      reply: "Ответить или посмотреть эту беседу >"
     private_message:
       reply_to_or_view: "Ответить или посмотреть эту беседу >"
     remove_old_user:
@@ -804,11 +898,19 @@ ru:
       notice: "Фотография удалена."
     new_profile_photo:
       upload: "Загрузить новое фото для профиля!"
+  polls:
+    votes:
+      few: " %{count} голосов на данный момент"
+      many: " %{count} голосов на данный момент"
+      one: "%{count} голос на данный момент"
+      other: " %{count} голоса на данный момент"
+      zero: "голосов на данный момент"
   posts:
     presenter:
       title: "Запись %{name}"
     show:
       forbidden: "Вам нельзя это делать."
+      location: "Опубликовано из: %{location}"
       photos_by:
         few: "%{count} фото пользователя %{author}"
         many: "%{count} фото пользователя %{author}"
@@ -822,11 +924,18 @@ ru:
     edit:
       allow_search: "Разрешить искать вас в Диаспоре"
       basic: "Мой базовый профиль"
+      basic_hint: "Все элементы в Вашем профиле необязательны. Базовый профиль всегда будет виден всем"
+      extended: "Мой расширенный профиль"
+      extended_hint: "Нажмите, чтобы установить видимость расширенного профиля. Публичный доступен всему интернету, ограниченный - людям из Ваших аспектов."
+      extended_visibility_text: "Видимость расширенного профиля"
       first_name: "Имя"
       last_name: "Фамилия"
+      limited: "Ограниченный"
       nsfw_check: "Пометить все мои записи как NSFW"
-      nsfw_explanation: "NSFW (‘not safe for work’, \"18+\") — внутренний стандарт сообщества диаспоры* для информации, которая может быть неподходящей для просмотра на рабочем месте. Если вы планируете часто публиковать подобные материалы, отметьте, пожалуйста, эту опцию — и всё, чем вы делитесь, будет спрятано в потоках других пользователей, если они сами не пожелают их посмотреть."
+      nsfw_explanation: "NSFW (‘not safe for work’, \"18+\") — внутренний стандарт сообщества диаспоры* для информации, которая может быть неподходящей для просмотра на рабочем месте. Если Вы планируете часто публиковать подобные материалы, отметьте, пожалуйста, эту опцию — и всё, чем Вы делитесь, будет спрятано в потоках других пользователей, если они сами не пожелают их посмотреть."
       nsfw_explanation2: "Если вы не хотите использовать эту опцию, пожалуйста, добавляйте метку #nsfw каждый раз когда ваша запись содержит подобный материал."
+      public: "Публичный"
+      settings: "Настройки профиля"
       update_profile: "Обновить профиль"
       your_bio: "Ваша биография"
       your_birthday: "Ваш день рождения"
@@ -852,7 +961,7 @@ ru:
       enter_password_again: "Повторите пароль"
       enter_username: "Выберите имя пользователя (только латинские буквы, цифры и подчеркивание)"
       password: "ПАРОЛЬ"
-      password_confirmation: "ПОДТВЕРЖДЕНИЕ ПАРОЛЯ"
+      password_confirmation: "Подтверждение пароля"
       sign_up: "РЕГИСТРАЦИЯ"
       submitting: "Отправка..."
       terms: "Создавая аккаунт вы соглашаетесь с %{terms_link}."
@@ -866,6 +975,7 @@ ru:
     post_label: "<b>Запись</b>: %{title}"
     reason_label: "Причина:"
     reported_label: "<b>Донос от</b> %{person}"
+    reported_user_details: "Подробная информация о пользователе"
     review_link: "Отметить как просмотренный"
     status:
       destroyed: "Запись была уничтожена"
@@ -873,6 +983,8 @@ ru:
     title: "Просмотр доносов"
   reshares:
     comment_email_subject: "запись %{author}, распространённая %{resharer}"
+    create:
+      error: "Не удалось поделиться."
     reshare:
       deleted: "Исходная запись удалена автором."
       reshare_confirmation: "Поделиться записью %{author}?"
@@ -896,8 +1008,9 @@ ru:
       no_services_available: "На этом поде недоступны сервисы."
       not_logged_in: "На данный момент вы не вошли в систему."
       really_disconnect: "отключить %{service}?"
-      services_explanation: "Подключение сервисов позволяет публиковать на них записи написанные в Диаспоре."
+      services_explanation: "Подключение сервисов позволяет публиковать на них записи, созданные в Диаспоре."
       share_to: "Поделиться в %{provider}"
+      title: "Управление подключенными сервисами"
     provider:
       facebook: "Facebook"
       tumblr: "Tumblr"
@@ -994,6 +1107,8 @@ ru:
     followed_tags_stream: "#Метки"
     like_stream:
       title: "Понравившиеся"
+    liked:
+      title: "Понравившиеся записи"
     mentioned_stream: "@Упоминания"
     mentions:
       title: "@Упоминания"
@@ -1033,6 +1148,7 @@ ru:
       auto_follow_aspect: "Добавлять этих пользователей в аспект:"
       auto_follow_back: "Автоматически добавлять в ответ пользователей, добавивших вас"
       change: "Изменить"
+      change_color_theme: "Изменить цветовую тему"
       change_email: "Изменить адрес"
       change_language: "Изменить язык"
       change_password: "Изменить пароль"
@@ -1049,6 +1165,7 @@ ru:
       comment_on_post: "кто-то прокомментировал вашу запись"
       current_password: "Текущий пароль"
       current_password_expl: "используемый для входа..."
+      default_post_visibility: "Аспекты по умолчанию для публикации записей"
       download_export: "Скачать данные из моего профиля"
       download_export_photos: "Загрузить мои фотографии"
       edit_account: "Изменить аккаунт"
@@ -1060,6 +1177,7 @@ ru:
       last_exported_at: "(Последнее обновление было %{timestamp})"
       liked: "кому-то понравилась ваша запись"
       mentioned: "вы были упомянуты в записи"
+      mentioned_in_comment: "Вы упомянуты в комментарии"
       new_password: "Новый пароль"
       private_message: "вы получили личное сообщение"
       receive_email_notifications: "Получать уведомление по электронной почте, если:"
@@ -1089,12 +1207,14 @@ ru:
     privacy_settings:
       ignored_users: "Заблокированные пользователи"
       no_user_ignored_message: "На данный момент вы никого не игнорируете"
-      stop_ignoring: "Отменить блокирование"
-      strip_exif: "Удалять метаданные, таких как местоположение, автор, и модель камеры из загружаемых изображений (рекомендуется)"
+      stop_ignoring: "Отменить блокировку"
+      strip_exif: "Удалять метаданные такие, как местоположение, автор и модель камеры из загружаемых изображений (рекомендуется)"
       title: "Настройки приватности"
     public:
       does_not_exist: "Пользователя %{username} не существует!"
     update:
+      color_theme_changed: "Цветовая тема успешно изменена"
+      color_theme_not_changed: "Произошла ошибка при смене цветовой темы."
       email_notifications_changed: "Настройки уведомлений сохранены"
       follow_settings_changed: "Настройки подписок изменены"
       follow_settings_not_changed: "Не удалось изменить настройки подписок."
diff --git a/config/locales/diaspora/sc.yml b/config/locales/diaspora/sc.yml
index cdafc3c403ce310f17cb68bb490988d547c6a971..d83076d8083d7198c1cabf66532ec0aa0882ddc3 100644
--- a/config/locales/diaspora/sc.yml
+++ b/config/locales/diaspora/sc.yml
@@ -9,6 +9,8 @@ sc:
   _contacts: "Cuntatos"
   _help: "Agiudu"
   _services: "Servìtzios"
+  _statistics: "Istatìsticas"
+  _terms: "Tèrmines"
   account: "Contu"
   activerecord:
     errors:
@@ -16,7 +18,7 @@ sc:
         contact:
           attributes:
             person_id:
-              taken: "depet èssere ùnicu intre sos cuntatos de custu impitadore"
+              taken: "depet èssere ùnicu intre sos cuntatos de custu impreadore."
         person:
           attributes:
             diaspora_handle:
@@ -44,12 +46,21 @@ sc:
               taken: "est giai istadu pigadu."
   admins:
     admin_bar:
+      dashboard: "Pannellu de controllu"
       pages: "Pàginas"
+      pod_network: "Retza pod"
       pod_stats: "Istatìsticas de su pod"
       report: "Sinnalatziones"
       sidekiq_monitor: "Monitor Sidekiq"
       user_search: "Chirca impreadore"
       weekly_user_stats: "Istatìsticas de sa chida pro s'impreadore"
+    dashboard:
+      fetching_diaspora_version: "Verifichende s'ùrtima versione de diaspora*..."
+      pod_status: "Istadu pod"
+    pods:
+      pod_desktop_link: "modalidade pro s'iscrivania"
+      pod_desktop_view: "Custa pàgina no est disponìbile in sa modalidade pro tzellulares, pro praghere cola a sa %{desktop_link}."
+      pod_network: "Retza pod"
     stats:
       2weeks: "2 chidas"
       50_most: "Sas 50 etichetas prus popolares"
@@ -77,12 +88,34 @@ sc:
         other: "%{count} impreadores"
         zero: "%{count} impreadores"
       week: "Chida"
+    user_entry:
+      account_closed: "Contu serradu"
+      diaspora_handle: "ID diaspora*"
+      email: "P. eletr. (e-mail)"
+      guid: "GUID"
+      id: "ID"
+      invite_token: "Getone de invitu"
+      last_seen: "Bidu s'ùrtima borta"
+      ? "no"
+      : Nono
+      nsfw: "#nsfw"
+      unknown: "Disconnotu"
+      ? "yes"
+      : Eja
     user_search:
+      account_closing_scheduled: "Su contu de %{name} est programadu pro èssere serradu. At a èssere protzessadu in pagu tempus..."
+      account_locking_scheduled: "Su contu de %{name} est programmadu pro èssere blocadu. At a èssere protzessadu in pagos momentos..."
+      account_unlocking_scheduled: "Su contu de %{name} est programmadu pro èssere isblocadu. At a èssere protzessadu in pagos momentos..."
       add_invites: "Annaghe invitos"
       are_you_sure: "Seguru ses de chèrrere serrare su contu?"
+      are_you_sure_lock_account: "Seguru ses de chèrrere blocare custu contu?"
+      are_you_sure_unlock_account: "Seguru ses de chèrrere isblocare custu contu?"
       close_account: "Serra su contu"
       email_to: "Indiritzos de p. eletrònica a ue imbiare sos invitos"
+      invite: "Invita"
+      lock_account: "Bloca su contu"
       under_13: "Ammustra sos impreadores chi tenent de mancu de 13 annos (Children's Online Privacy Protection Act)"
+      unlock_account: "Isbloca su contu"
       users:
         one: "%{count} impreadore agatadu"
         other: "%{count} impreadores agatados"
@@ -99,13 +132,71 @@ sc:
         zero: "Nùmeru de impreadores noos custa chida: nissunu"
       current_server: "Sa data atuale de su server est %{date}"
   all_aspects: "Totu sas caras"
+  api:
+    openid_connect:
+      authorizations:
+        destroy:
+          fail: "Su tentativu de annullare s'autorizatzione cun ID %{id} est fallidu"
+        new:
+          access: "%{name} pedit atzessu a:"
+          approve: "Aprova"
+          bad_request: "Mancat s'ID cliente o s'URI de reindiritzatzione"
+          client_id_not_found: "Perunu cliente agatadu cun client_id %{client_id} cun URI de reindirizatzione %{redirect_uri}"
+          deny: "Refuda"
+          no_requirement: "%{name} non tenet bisòngiu de permissos"
+          redirection_message: "Seguru ses de chèrrere permìtere s'atzessu a %{redirect_uri}?"
+      error_page:
+        contact_developer: "Dias dèpere cuntatare s'isvilupadore de s'aplicatzione e incluire custu messàgiu de errore detalliadu:"
+        could_not_authorize: "No est istadu possìbile a autorizare custa aplicatzione"
+        login_required: "Depes intrare in su contu tuo in antis de pòdere autorizare custa aplicatzione"
+        title: "Oh! B'est istadu unu problema :("
+      scopes:
+        aud:
+          description: "Custu at a frunire sos permissos \"aud\" a s'aplicatzione"
+          name: "aud"
+        name:
+          description: "Custu at a frunire sos permissos de nùmeme a s'aplicatzione"
+          name: "nùmene"
+        nickname:
+          description: "Custu at a frunire sos permissos de paranùmeme a s'aplicatzione"
+          name: "paranùmene"
+        openid:
+          description: "Custu permitit a s'aplicatzione de lèghere su proflu de base tuo"
+          name: "profilu de base"
+        picture:
+          description: "Custu at a frunire a s'aplicatzione sos permissos ligados a sas immàgines"
+          name: "immàgine"
+        profile:
+          description: "Custu permitit a s'aplicatzione de lèghere su profilu intreu tuo"
+          name: "profilu intreu"
+        read:
+          description: "Custu permitit a s'aplicatzione de lèghere su flussu tuo, sos arresonos tuos e su profilu intreu tuo"
+          name: "leghere su profilu, su flussu e sos arresonos"
+        sub:
+          description: "Custu at a frunire sos permissos \"sub\" a s'aplicatzione"
+          name: "sub"
+        write:
+          description: "Custu permitit a s'aplicatzione de imbiare publicatziones noas, iscrìere arresonos, e imbiare reatziones"
+          name: "imbiare publicatziones, arresonos e reatziones"
+      user_applications:
+        index:
+          access: "%{name} tenet atzessu a :"
+          edit_applications: "Aplicatziones"
+          no_requirement: "%{name} non tenet bisòngiu de permissos"
+          title: "Aplicatziones autorizadas"
+        no_applications: "Non tenes aplicatziones autorizadas"
+        policy: "Abbista sa polìtica de privadesa de s'aplicatzione"
+        revoke_autorization: "Rèvoca"
+        tos: "Abbista sos tèrmines de servìtziu de s'aplicatzione"
   are_you_sure: "Seguru ses?"
-  are_you_sure_delete_account: "Seguru ses de bòlere serrare su contu tuo? Custu non podet èssere annuddadu!"
+  are_you_sure_delete_account: "Seguru ses de bòlere serrare su contu tuo? Est una cosa chi non podet èssere annullada!"
   aspect_memberships:
     destroy:
-      failure: "No est istadu possìbile bogare sa pessone dae s'aspetu."
-      no_membership: "Sa pessone ischertada no est istada agatada in cussu aspetu."
-      success: "Sa pessone est istada bogada dae s'aspetu."
+      failure: "No est istadu possìbile bogare sa persone dae sa cara."
+      forbidden: "Non ses autorizadu a fàghere custu."
+      invalid_statement: "Impossìbile duplicare sa registratzione."
+      no_membership: "Sa persone ischertada no est istada agatada in cussa cara."
+      success: "Sa persone est istada bogada dae sa cara."
   aspects:
     add_to_aspect:
       failure: "Annanghidura de su cuntatu a sa cara faddida."
@@ -119,6 +210,7 @@ sc:
     destroy:
       failure: "No est istadu possìbile bogare %{name}."
       success: "%{name} est istada bogada."
+      success_auto_follow_back: "%{name} est istada bogada cun sutzessu. As impreadu custa cara pro sighire automaticamente sos impreadores chi ti sighiant. Intra in sas impostztiones impreadore tuas pro ischertare una cara noa pro sighire automaticamente."
     edit:
       aspect_list_is_not_visible: "Sos cuntatos de custa cara non si podent bìdere intre issos."
       aspect_list_is_visible: "Sos cuntatos de custa cara si podent bìdere intre issos."
@@ -139,6 +231,7 @@ sc:
         here_to_help: "Sa comunidade de diaspora* est inoghe!"
         mail_podmin: "Indiritzu de su podmin"
         need_help: "Tenes bisòngiu de agiudu?"
+        support_forum: "Ti podes fintzas aunire a sos %{support_forum}."
         support_forum_link: "forum de suportu"
         tag_bug: "errore"
         tag_feature: "funtzionalidade"
@@ -148,15 +241,16 @@ sc:
       introduce_yourself: "Custu est su flussu tuo. Brinca a intro e presenta·ti."
       keep_pod_running: "Mantènne %{pod} lestru e agiuda a comporare servers cun una donatzione mensile!"
       new_here:
-        follow: "Sighi %{link} e saluda sos impitadores noos de diaspora*!"
+        follow: "Sighi %{link} e saluda sos impreadores noos de diaspora*!"
         learn_more: "Àteras informatziones"
-        title: "Saluda sos impitadores noos"
+        title: "Saluda sos impreadores noos"
       services:
         content: "Podes connètere custos servìtzios a diaspora*:"
         heading: "Connessione a sos servìtzios"
       welcome_to_diaspora: "Bene bènnidu in diaspora*, %{name}!"
     no_contacts_message:
       community_spotlight: "Prus de importu in sa comunidade"
+      invite_link_text: "invitare"
       or_spotlight: "O podes cumpartzire cun %{link}"
       try_adding_some_more_contacts: "Podes chircare o %{invite_link} àteros cuntatos."
       you_should_add_some_more_contacts: "Dias dèpere annànghere carchi cuntatu in prus!"
@@ -177,43 +271,65 @@ sc:
       success: "Bidimus ite tenent de nàrrere! #narasalude"
   bookmarklet:
     explanation: "Pùblica in diaspora* dae totue annanghende  %{link} a sos preferidos tuos."
+    heading: "Preferidu de publicatzione"
     post_something: "Pùblica in diaspora*"
-  cancel: "Annudda"
+  cancel: "Annulla"
+  color_themes:
+    dark: "Iscuru"
+    dark_green: "Birde iscuru"
+    egyptian_blue: "Biaitu egitzianu"
+    magenta: "Magenta"
+    original: "Murru originale"
+    original_white: "Isfundu biancu originale"
   comments:
+    create:
+      error: "B'est istadu un'errore cummentende."
     new_comment:
       comment: "Cummenta"
       commenting: "Cummentende..."
   contacts:
     index:
+      add_contact: "Annanghe unu cuntatu"
       all_contacts: "Totu sos cuntatos"
       community_spotlight: "In evidèntzia in sa comunidade"
       my_contacts: "Cuntatos meos"
       no_contacts: "Paret chi tue tèngias bisòngiu de annànghere carchi cuntatu in prus!"
+      no_contacts_in_aspect: "Non tenes galu perunu cuntatu in custa cara. Inoghe in suta b'est una lista de cuntatos tuos chi podes annànghere a custa cara."
       no_contacts_message: "Abbàida %{community_spotlight}"
       only_sharing_with_me: "Cumpartzint petzi cun mie"
       start_a_conversation: "Incumintza un'arresonu"
       title: "Cuntatos"
+      user_search: "Chirca de cuntatos"
     spotlight:
       community_spotlight: "In evidèntzia in sa comunidade"
+      no_members: "Non bi sunt galu membros."
       suggest_member: "Cussìgia unu membru"
   conversations:
     create:
       fail: "Messàgiu non vàlidu"
       sent: "Messàgiu imbiadu"
+    destroy:
+      delete_success: "Arresonu iscantzelladu cun sutzessu"
+      hide_success: "Arresonu istichidu cun sutzessu"
     index:
       conversations_inbox: "Arresonos – Càscia de sas lìteras"
       inbox: "Casella de posta"
       new_conversation: "Arresonu nou"
+      no_contacts: "Depes annànghere carchi cuntatu in antis de pòdere fàghere incumintzare un'arresonu"
       no_messages: "Perunu messàgiu"
     new:
+      message: "Messàgiu"
       send: "Imbia"
       sending: "Imbiende..."
       subject: "Sugetu"
+      subject_default: "Perunu sugetu"
       to: "A"
     new_conversation:
       fail: "Messàgiu non vàlidu"
     show:
       delete: "Iscantzella s'arresonu"
+      hide: "Istichi e pone a sa muda s'arresonu"
+      last_message: "Ùrtimu messàgiu retzidu %{timeago}"
       reply: "Risponde"
       replying: "Rispondende..."
   date:
@@ -224,10 +340,12 @@ sc:
   delete: "Burra"
   email: "P. eletr. (e-mail)"
   error_messages:
+    csrf_token_fail: "Su getone CSRF no est vàlidu. Pro praghere intra in su sistema e torra a proare."
     helper:
       correct_the_following_errors_and_try_again: "Currege custos errore e torra a proare."
+    need_javascript: "Custu situ ìnternet tenet bisòngiu de JavaScript pro funtzionare comente si tocat. Si as istudadu JavaScript torra·lu a allùghere, pro praghere, e torra a carrigare custa pàgina."
   fill_me_out: "Iscrie inoghe"
-  find_people: "Agata pessonas o #etichetas"
+  find_people: "Agata persones o #etichetas"
   help:
     account_and_data_management:
       close_account_a: "Bae a su fundu de sa pàgina de sas impostatziones tuas e incarca su butone \"Iscantzella su contu\". T'at a èssere pedidu de insertare sa crae de intrada tua pro acabare su protzessu. Ammenta·ti chi, si as a iscantzellare su contu tuo, non t'as a pòdere <strong>mai prus</strong> torrare a registrare cun su matèssi nùmene in cussu pod."
@@ -264,10 +382,18 @@ sc:
       what_is_an_aspect_a: "Sas caras sunt una manera de agrupare sos cuntatos tuos in diaspora*. Si mutint \"caras\" ca sunt comente sas caras diferentes chi mostras a su mundu in momentos diferenetes. Diat pòdere èssere chie ses in su traballu, chie ses pro sa famìlia tua, o chie ses pro sos amigos tuos in unu grupu de su cale faghes parte."
       what_is_an_aspect_q: "Ite est una cara?"
       who_sees_post_a: "Cando faghes una publicatzione limitada cussa at a èssere visìbile pro sas persones chi as postu in cussa cara (o in cussas caras, si est fata in prus caras) in antis de fàghere sa publicatzione. Sos cuntatos chi non tenes in cussas caras no ant a pòdere bìdere cussa publicatzione. Sas publicatziones limitadas no ant a èssere mai visìbiles a chie non tenes in una de sas caras tuas."
-      who_sees_post_q: "Cando pùblico in un'aspetu, chie lu bidet?"
+      who_sees_post_q: "Cando pùblico in una cara, chie lu bidet?"
+    chat:
+      add_contact_roster_a: "In antis de totu depes abilitare sa tzarrada pro una de sas caras in ue est cussa persone. Pro lu fàghere intra in sa %{contacts_page}, issèbera sa cara chi boles e incarca in s'iscona de sa tzarrada pro abilitare sa tzarrada pro cussa cara. %{toggle_privilege} Dias podere, si preferis, creare una cara ispetziale mutida \"Tzarrada\" e annànghere sas persones cun sas cales cheres tzarrare in cussa cara."
+      add_contact_roster_q: "Comente potzo tzarrare cun calicunu in diaspora*?"
+      contacts_page: "pàgina de sos cuntatos"
+      title: "Tzarrada"
     community_guidelines: "normas de sa comunidade"
+    faq: "Pregontas fitianas"
     foundation_website: "situ web de sa fundatzione diaspora*"
     getting_help:
+      get_support_a_discourse: "Chirca arresonos esistentes ligados a s'argumentu tuo o aberi un'arresonu nou in sa prataforma de %{discourse} nostra"
+      get_support_a_faq: "Leghe sa pàgina nostra de sas %{faq} in sa wiki"
       get_support_a_hashtag: "Pedi publicamente in diaspora* impreende s'eticheta %{question}"
       get_support_a_irc: "Intra in %{irc} (tzarrada in direta) cun nois"
       get_support_a_tutorials: "Abbista·ti sas %{tutorials} nostras"
@@ -280,6 +406,18 @@ sc:
     getting_started_tutorial: "Serie de ghias \"Comente incumintzare\""
     here: "inoghe"
     irc: "IRC"
+    keyboard_shortcuts:
+      keyboard_shortcuts_a1: "In sa vista de su flussu podes impreare custas incurtzadas dae tecladu:"
+      keyboard_shortcuts_li1: "j - Brinca a sa publicatzione imbeniente"
+      keyboard_shortcuts_li2: "k - Brinca a sa publicatzione anteposta"
+      keyboard_shortcuts_li3: "c - Cummenta in sa publicatzione atuale"
+      keyboard_shortcuts_li4: "I - Sinnala s'agradessimentu tuo a sa publicatzione atuale"
+      keyboard_shortcuts_li5: "r - Torra a cumpartzire sa publicatzione atuale"
+      keyboard_shortcuts_li6: "m - Ismànnia sa publicatzione atuale"
+      keyboard_shortcuts_li7: "o -Aberi su primu ligàmene in sa publicatzione atuale"
+      keyboard_shortcuts_li8: "Ctrl+Imbiu – Imbia su messàgiu chi ses iscriende"
+      keyboard_shortcuts_q: "Cales incurtzadas dae tecladu sunt disponìbiles?"
+      title: "Incurtzadas dae tecladu"
     markdown: "Markdown"
     mentions:
       how_to_mention_a: "Iscrie su sìmbulu \"@\" e incumintza a iscrìere su nùmene suo. Unu menù a ventanedda s'at a abèrrere e l'as a pòdere ischertare in manera prus fàtzile. Ammenta·ti chi est possìbile numenare petzi a sas persones chi as annantu a una cara."
@@ -320,9 +458,22 @@ sc:
       format_text_q: "Comente potzo formatare su testu in sas publicatziones meas (grassetu, corsivu etz.)?"
       hide_posts_a: "Si colas su puntadore in subra de una publicatzione, a pitzu, una X at a aparire a destra. Incarca·la pro istichire sa publicatzione e istudare sas notìficas chi li pertocant. As a pòdere galu bìdere sa publicatzione si as a bisitare sa pàgina de profilu de sa persone chi l'at publicada."
       hide_posts_q: "Comentze potzo istichire una publicatzione?"
+      ignore_user_a1: "Si ses cumpartzende cun cussa persone bogande·la dae sas caras tuas sas publicatziones suas no ant a aparire in su flussu tuo. Unu mètodu prus cumpridu est su de \"ignorare\" cussu contu. In custa manera as a prevènnere s'aparèntzia de sas publicatziones suas in su flussu tuo, e cussa persone non at fintzas prus a pòdere agradèssere  o cummentare sas publicatziones tuas. Las at a pòdere galu torrare a cumpartzire e cummentare in sas cumpartziduras, e sos cummentos suos ant a abarrare visìbiles pro tie."
+      ignore_user_a2: "Pro ignorare unu contu, incarca in s'icona \"ignora\" (unu chircu cun una lìnia diagonale chi l'atraessat) in destra in pitzu de una de sas publicatziones suas. Cussa publicatzione at a isparèssere istantaneamente dae su flussu tuo. Si preferis, podes fintzas andare in sa pàgina de profilu de su contu e incarcare s'icona in ie. As a sighire a pòdere bìdere sas publicatziones suas in sa pàgina de profilu, o impreende sa vista pro una publicatzione a sa sola."
+      ignore_user_a3: "Una lista de sa gente chi ses ignorende podet èssere agatada in sas impostatzioes de su contu tuo in suta de Privadesa. Pro l'acabare de ignorare calicunu boga·lu dae sa lista in cussa pàgina."
+      ignore_user_q: "Comente potzo fàghere in modu chi sas publicatziones de calicunu non aparent in su flussu meu?"
       insert_images_a: "Si cheres incluire in sa publicatzione tua un'immàgine sarvada in s'elaboradore tuo Incarca in s'icona chi tenet sa forma de una fotocàmera in fundu a su publicadore.Podes fintzas trisinare e lassare un'immàgine, o prus immàgines, dae s'elaboradore tuo a intro de cuss'icona. Si cheres insertare un'immàgine dae ìnternet in sa publicatzione tua incarca su butone pro sas immàgines in pitzu de su publicadore, chi at a creare su còdighe Markdown pro tie."
+      insert_images_comments_a: "Podes impreare Markdown pro insertare un'immàgine dae su web in unu cummentu, comente in sas publicatziones. Ma non podes carrigare immàgines dae s'elaboradore tuo diretamente in sos cummentos. Carriga·las in unu situ de istrangiamentu de immàgines e, a pustis, inserta·las impreende su butone pro sas immàgines a subra de su publicadore."
       insert_images_comments_q: "Potzo insertare immàgines in sos cummentos?"
       insert_images_q: "Comente potzo insertare immàgines in sas publicatziones meas?"
+      post_location_a: "Incarca s'icona chi tenet sa forma de una puntighedda a curtzu de sa fotocàmera in su publicadore. Custu at a insertare sa positzione tua dae OpenStreetMap. Podes acontzare sa positzione tua – dias bòlere petzi incluire sa tzitade in ue ses imbetzes de s'indiritzu pretzisu de s'istrada."
+      post_location_q: "Comente potzo annànghere sa positzione mea a una publicatzione?"
+      post_notification_a: "As a agatare un'icona chi tenet sa forma de una campana a curtzu de sa X a destra a pitzu de una publicatzione. Incarca·la pro allughere o istudare sas notìficas pro cussa publicatzione."
+      post_notification_q: "Comente potzo retzire o acabare de retzire sas notìficas chi pertocant a una publicatzione?"
+      post_poll_a: "Incarca in s'icona chi tenet sa forma de unu gràficu pro creare unu sondàgiu. Iscrie una pregonta e a su mancu duas rispostas. Non t'ismèntighes de impostare sa publicatzione tua in manera chi siat pùblica, si cheres chi totus potzant leare parte a su sondàgiu tuo."
+      post_poll_q: "Comente potzo annànghere unu sondàgiu a sa publicatzione mea?"
+      post_report_a: "Incarca s'icona a forma de triàngulu a destra in pitzu de sa publicatzione pro la sinnalare a s'amministradore de su pod tuo. Iscrie una resone pro sa sinnalatzione in sa bentana chi s'at a abèrrere. Pro praghere sinnala petzi sas publicatziones chi non rispetant sas %{community_guidelines} o sas cunditziones de impreu de su pod tuo, comente a sas publicatziones chi cuntenent materiale illegale, chi sunt ingiuriosas o spam."
+      post_report_q: "Comente potzo sinnalare una publicatzione ofensiva?"
       size_of_images_a: "Nono. Sas immàgines benint ridimensionadas automaticamente pro intrare in sa vista de su flussu o de sa publicatzione sìngula. Markdown non tenet unu còdighe pro dislindare sa mannària de un'immàgine."
       size_of_images_q: "Potzo personalizare sa mannària de sas immàgines in sas publicatziones o in sos cummentos?"
       stream_full_of_posts_a1: "In su flussu tuo bi sunt tres castas de publicatziones:"
@@ -343,7 +494,12 @@ sc:
       who_sees_post_q: "Cando pùblico carchi cosa in una cara (creo una publicatzione privada) chie la podet bìdere?"
     profile:
       title: "Profilu"
+      what_do_tags_do_a: "Agiudant sas persones a ti connòschere. S'immàgine de profilu tua at fintzas a aparire in s'ala a manca de sas pàginas de su flussu de cussas etichetas, in paris cun totu sos àteros chi las ant postas in su profilu de base issoro."
+      what_do_tags_do_q: "A ite serbint sas etichetas in su profilu de base meu?"
+      whats_in_profile_a: "Su profilu tuo tenet duas partes: su profilu de base e su profilu intreu. Su profilu de base tuo cuntenit su nùmene tuo, sas chimbe etichetas chi as isseberadu pro ti descrìere e sa fotografia tua. Su profilu intreu tuo cuntenit sa biografia, sa positzione, sa natura e sa data de nàschida tuas. Totu custas informatziones sunt optzionales – ses tue a isseberare si las cheres frunire o nono, e las podes impostare in manera chi siant identificàbiles o anònimas cantu boles. Su profilu intreu tuo est ammustradu in sa culunna a manca de sa pàgina de profilu tua, in suta de sa fotografia de profilu tua."
       whats_in_profile_q: "Ite b'est in su profilu meu?"
+      who_sees_profile_a: "Su prfilu de base tuo (nùmene, immàgine de profilu e #etichetas) est pùblicu. Su profilu intreu tuo est privadu in sas impostatziones predefinidas, ma lu podes fàghere a pùblicu pro totus si cheres. Petzi sos cun sos cales ses cumpartzende (est a nàrrere, sos chi as annantu a una de sas caras tuas) podent bìdere su profilu intreu tuo si lu mantenes privadu. Àteras persones ant a bìdere petzi sas informatziones pùblicas tuas. Totu sas informatziones de su profilu chi as a impostare pro chi siant pùblicas ant a pòdere èssere bidas dae totu sos chi podent intrare in ìnternet, e ant a pòdere èssere inditzitzadas dae sos motores de chirca"
+      who_sees_profile_q: "Chie podet abbistare su profilu meu?"
     public_posts:
       can_comment_reshare_like_a: "Totu sos chi tenent unu contu de diaspora* e chi bi sunt in intro podent cummentare o cumpartzire sa publicatzione tua, o sinnalare chi lis agradat. S'etzetzione sunt sos chi as ignoradu, chi no ant a pòdere pònnere agradessimentos o cummentare in sas publicatziones tuas."
       can_comment_reshare_like_q: "Chie podet cummentare o cumpartzire sa publicatzione mea, o sinnalare chi lis agradat?"
@@ -372,6 +528,7 @@ sc:
       add_to_aspect_li5: "Ma si Ben at a andare a sa pàgina de su profilu de Amy, tando at a bìdere sas publicatziones privadas chi Amy faghet in sa cara in ue l'at postu (in paris cun sas publicatziones pùblicas de issa, chi totus podent bìdere in ie)."
       add_to_aspect_li6: "Ben at a pòdere bìdere su profilu privadu de Amy (biografia, logu, natura, data de nàschida)."
       add_to_aspect_li7: "Amy at a aparire in suta de \"Petzi cumpartzinde cun mie\" in sa pàgina de sos cuntatos de Ben."
+      add_to_aspect_li8: "Fintzas Amy at a pòdere @numenare Ben in una publicatzione."
       add_to_aspect_q: "Ite acontessit cando annango calicunu a una de sas caras meas, o cando calicunu m'annanghet a una de sas caras suas?"
       list_not_sharing_a: "Nono, ma podes bìdere si calicunu est o no est cumpartzende cun bois bisitende sa pàgina de profilu issoro. Si lu sunt faghende, b'at a èssere una icona birde a un'ala de s'ID diaspora suo. Si nono, b'at a èssere unu chircu murru."
       list_not_sharing_q: "B'est una lista de sa gente chi apo annantu a unu de sas caras, ma chi non m'ant annantu a una de sas issoro?"
@@ -379,6 +536,8 @@ sc:
       only_sharing_q: "Chie sunt sas persones in sa lista in suta de \"Petzi cumpartzinde cun mie\" in sa pàgina mea de sos cuntatos?"
       see_old_posts_a: "Nono. At a pòdere bìdere petzi sas publicatziones noas in cussa cara. Issu (in paris a totu sos àteros) at a pòdere bìdere sas publicatziones tuas prus betzas in sa pàgina de su profilu tua, e l'at a pòdere bìdere fintzas in su flussu suo."
       see_old_posts_q: "Cando annango calicunu a una cara, podet bìdere sas publicatziones prus betzas chi apo giai publicadu in cussa cara?"
+      sharing_notification_a: "Dias dèpere retzire una notìfica cada borta chi calicunu incumintzat a cumpartzire cun tie."
+      sharing_notification_q: "Comente potzo ischire cando calicunu incumintzat a cumpartzire cun mie?"
       title: "Cumpartzende"
     tags:
       filter_tags_a: "Custu no est galu disponìbile in manera direta pro mèdiu de diaspora*, ma bi sunt %{third_party_tools} chi lu diant pòdere permìtere."
@@ -397,8 +556,41 @@ sc:
     tutorial: "ghia"
     tutorials: "ghias"
     wiki: "wiki"
+  home:
+    default:
+      be_who_you_want_to_be: "Sias su chi boles èssere"
+      be_who_you_want_to_be_info: "Medas retzas sotziales insistint pro ti pedire s'identidade reale tua. diaspora* nono. Inoghe podes isseberare chie cheres èssere, e cumpartzire cantu boles de tie cun chie cheres. Est semper un'issèbera tua comente cheres interagire cun àteras persones."
+      byline: "Su mundu sotziale in lìnia in ue tenes su controllu"
+      choose_your_audience: "Issèbera su pùblicu tuo"
+      choose_your_audience_info: "Sas caras de diaspora* ti permitint de cumpartzire cun petzi cussas persones cun las cales cheres tue. Podes èssere pùblicu o privadu cantu cheres. Cumpartzire una fotografia ispassiosa cun totu su mundu, o unu segretu de importu cun petzi sos amigos tuos. Tenes tue su controllu."
+      headline: "Bene bènnidu in %{pod_name}"
+      own_your_data: "Sos datos tuos sunt petzi tuos"
+      own_your_data_info: "Medas retzas sotziales impreant sos datos tuos pro fàghere dinare analizende sas interatziones tuas pro ti bèndere cosa. diaspora* no impreat sos datos tuos pro cale si siat punna chi non siet sa de ti permìtere de ti connètere e de cumpartzire cun sos àteros."
+    podmin:
+      byline: "Istas pro cambiare ìnternet. Incumintzamus, ite naras?"
+      configuration_info: "Aberi %{database_path} e %{diaspora_path} in s'editore de testu preferidu dae tie e revisiona·los cun atentzione. Sunt cummentados estensivamente."
+      configure_your_pod: "Configura su pod tuo"
+      contact_irc: "nos cuntatare in IRC"
+      contribute: "Contribui"
+      contribute_info: "Megiora diaspora* fintzas de prus! Si agatas carchi \"bug\", pro praghere, %{report_bugs}."
+      create_an_account: "Crea unu contu"
+      create_an_account_info: "%{sign_up_link} pro unu contu nou."
+      faq_for_podmins: "pregunta fitiana pro sos amministradores de sos pods in sa wiki nostra"
+      getting_help: "Otènnere agiudu"
+      getting_help_info: "Amus allistadu carchi %{faq} incluende carchi impositu, trucu e solutzione in prus pro sos problemas prus comunes. Podes fintzas proare a %{irc}."
+      headline: "Bene bènnidu, amigu."
+      make_yourself_an_admin: "Faghe·ti a amministradore"
+      make_yourself_an_admin_info: "Podes agatare istrutziones in sa %{wiki}. Custu diat dèpere annànghere unu ligàmene “%{admin_dashboard}” a su menù impreadore tuo in pitzu cando as fatu s'atzessu. Ti frunit cosas comente sa chirca de sos impreadores e sas istatìsticas pro su pod tuo."
+      report_bugs: "sinnala·nos·los"
+      update_instructions: "istrutziones pro s'agiornamentu in sa wiki de diaspora*"
+      update_your_pod: "Agiorna su pod tuo"
+      update_your_pod_info: "Podes agatare %{update_instructions}."
+  invitation_codes:
+    already_logged_in: "Ses istadu invitadu dae %{inviter} a t'aunire a custu pod ma ses giai connessu."
+    not_valid: "Custu còdighe de invitu no est prus vàlidu"
   invitations:
     create:
+      closed: "Sos invitos sunt serrados in custu pod de diaspora*."
       empty: "Pro praghere inserta a su mancu un'indiritzu de posta eletrònica."
       no_more: "Non tenes prus invitos."
       note_already_sent: "Sos invitos sunt istados giai imbiados a: %{emails}"
@@ -418,9 +610,12 @@ sc:
   layouts:
     application:
       back_to_top: "Torra a s'incumintzu"
+      be_excellent: "Siais ispantosos unu cun s'àteru! ♥"
+      discourse: "Dibatas de progetu e suportu"
       powered_by: "Suportadu dae diaspora*"
       public_feed: "Flussu de diaspora* pùblicu de %{name}"
       source_package: "Iscàrriga su pachete de su còdighe mitza"
+      statistics_link: "Istatìsticas pod"
       toggle: "Allughe/istuda sa versione mòbile"
       whats_new: "Ite b'est de nou?"
     header:
@@ -428,6 +623,12 @@ sc:
       logout: "Essi"
       profile: "Profilu"
       settings: "Impostatziones"
+      toggle_navigation: "Allughe/istuda su menù de nàvigu"
+  likes:
+    create:
+      error: "B'est istadu un'errore ponende s'agradessimentu."
+    destroy:
+      error: "B'est istadu un'errore boghende s'agradessimentu."
   limited: "Limitadu"
   more: "Àteru"
   no_results: "Perunu resurtadu agatadu"
@@ -455,14 +656,17 @@ sc:
       comment_on_post: "Cummentu in una publicatzione"
       liked: "Agradèssidu"
       mark_all_as_read: "Sinnala·las totu comente lèghidas"
-      mark_read: "Sinnala comente lèghida"
-      mark_unread: "Sinna·las comente non lèghidas"
+      mark_all_shown_as_read: "Sinna totu comente lèghidu"
+      mark_read: "Sinna·la comente lèghida"
+      mark_unread: "Sinna·la comente non lèghida"
       mentioned: "Numenadu in una publicatzione"
+      mentioned_in_comment: "Numenadu in unu cummentu"
+      no_notifications: "Non tenes galu peruna notìfica."
       notifications: "Notìficas"
       reshared: "Torrada a cumparzire"
       show_all: "Ammustra totu"
       show_unread: "Ammustra sas non lèghidas"
-      started_sharing: "Incumintzadu a cumpartzire"
+      started_sharing: "At incumintzadu a cumpartzire"
     liked:
       one: "A %{actors} agradat sa publicatzione tua %{post_link}."
       other: "A %{actors} agradat sa publicatzione tua %{post_link}."
@@ -474,11 +678,15 @@ sc:
     mentioned:
       one: "%{actors} t'at numenadu in sa publicatzione %{post_link}."
       other: "%{actors} t'ant numenadu in sa publicatzione %{post_link}."
-      zero: "%{actors} t'at numenadu in sa publicatzione %{post_link}."
     mentioned_deleted:
       one: "%{actors} t'at numenadu in una publicatzione chi est istada iscantzellada."
       other: "%{actors} t'ant numenadu in una publicatzione chi est istada iscantzellada."
-      zero: "%{actors} t'at numenadu in una publicatzione chi est istada iscantzellada."
+    mentioned_in_comment:
+      one: "%{actors} t'at numenadu in unu <a href='%{comment_path}'>cummentu</a> a sa publicatzione %{post_link}."
+      other: "%{actors} t'ant numenadu in unu <a href='%{comment_path}'>cummentu</a> a sa publicatzione %{post_link}."
+    mentioned_in_comment_deleted:
+      one: "%{actors} t'at numenadu in unu cummentu iscantzelladu."
+      other: "%{actors} t'ant numenadu in unu cummentu iscantzelladu."
     private_message:
       one: "%{actors} t'at imbiadu unu messàgiu."
       other: "%{actors} t'ant imbiadu unu messàgiu."
@@ -496,14 +704,63 @@ sc:
       other: "%{actors} ant incumintzadu a cumpartzire cun tie."
       zero: "%{actors} at incumintzadu a cumpartzire cun tie."
   notifier:
+    a_limited_post_comment: "B'est unu cummentu nou de bìdere pro tie in una publicatzione limitada in diaspora*."
     a_post_you_shared: "una publicatzione."
+    a_private_message: "B'est unu messàgiu privadu nou de bìdere pro tie in diaspora*."
+    also_commented:
+      limited_subject: "B'est unu cummentu nou in una publicatzione chi as cummentadu"
     click_here: "Incarca inoghe"
     comment_on_post:
+      limited_subject: "B'est unu cummentu nou in una de sas publicatziones tuas"
       reply: "Risponde o abbista sa publicatzione de %{name} >"
     confirm_email:
       click_link: "Pro ativare s'indiritzu de posta eletrònica nou tuo %{unconfirmed_email} pro praghere sighi custu ligàmene:"
       subject: "Pro praghere ativa s'indiritzu de posta eletrònica tuo %{unconfirmed_email}"
+    csrf_token_fail:
+      body: |-
+          Salude %{name},
+
+          diaspora* at rilevadu unu tentativu de atzessu a sa sessione tua chi diat pòdere non èssere autorizadu. Pro evitare cale si siat possibilidade de tènnere sos datos tuos compromissos ses istadu fatu essire dae su contu tuo. Non ti preocupes; como podes torrare a intrare.
+
+          Una rechesta est istada fata impreende unu getone CSRF non vàlidu o chi mancat. Custu diat pòdere èssere innotzente, ma fintzas un'atacu cun rechestas farsas intre sos sitos (CSRF).
+
+          Custu diat pòdere èssere istadu causadu dae:
+
+            - Un'estensione chi at manipuladu sa rechesta o at fatu rechesta chene su getone;
+            - Un'ischeda abarrada aberta dae una sessione betza;
+            - Un'àteru situ chi at fatu rechestas, cun o chene su permissu tuo;
+            - Medas àteras ainas esternas;
+            - Còdighe malitziosu chirchende de atzedere a sos datos tuos.
+
+          Pro àteras informatziones a pitzu de sos CSRF abbista·ti [%{link}](%{link}).
+
+          Si as a bìdere custu messàgiu prus bortas una in fatu a s'àtera verìfica sos puntos inoghe in supra, incluende totu sas estensiones de s'esploradore (su browser).
+
+          Gràtzias,
+          Su robot de posta eletrònica de diaspora*!
+      subject: "Amus retzidu una rechesta non autorizada dae unu contu tuo, %{name}"
     email_sent_by_diaspora: "Custa e-lìtera est istada imbiada dae %{pod_name}. Si dias prefèrrere a l'acabare de retzire lìteras comente a custa,"
+    export_email:
+      body: |-
+          Salude %{name},
+
+          Sos datos tuos sunt istados protzessados e sunt prontos pro èssere iscarrigados aberinde [custu ligàmene](%{url}).
+
+          Tantos saludos,
+
+          Su robot de posta eletrònica de diaspora*!
+      subject: "Sos datos personales tuos sunt prontos pro èssere iscarrigados, %{name}"
+    export_failure_email:
+      body: |-
+          Salude %{name}
+
+          B'est istadu unu problema protzessende sos datos personales tuos pro s'iscarrigamentu.
+          Pro praghere torra a proare!
+
+          Ti pedo iscusa pro su problema,
+
+          Su robot de posta eletrònica de diaspora*!
+      subject: "B'est istadu unu problema cun sos datos tuos, %{name}"
     export_photos_email:
       body: |-
           Salude, %{name},
@@ -512,6 +769,18 @@ sc:
 
           Saludos,
           Su robot de sa posta eletrònica de diaspora*!
+      subject: "Sasa fotografias tuas sunt prontas pro èssere iscarrigadas, %{name}"
+    export_photos_failure_email:
+      body: |-
+          Salude %{name}
+
+          B'est istadu un'errore protzessende sas fotografias tuas pro s'iscarrigamentu.
+          Pro praghere torra a proare!
+
+          Ti pedo iscusa pro su problema,
+
+          Su robot de sa posta eletrònica de diaspora*!
+      subject: "B'est istadu unu problema cun sas fotografias tuas, %{name}"
     hello: "Salude %{name}!"
     invite:
       message: |-
@@ -537,12 +806,33 @@ sc:
     invited_you: "%{name} t'at invitadu a t'iscrìere a diaspora*"
     liked:
       liked: "A %{name} l'agradat sa publicatzione tua"
+      limited_post: "A %{name} l'est agradada sa publicatzione limitada tua"
       view_post: "Abbista publicatzione >"
     mentioned:
+      limited_post: "Ses istadu numenadu in una publicatzione limitada."
       subject: "%{name} t'at numenadu in diaspora*"
+    mentioned_in_comment:
+      limited_post: "Ses istadu numenadu in unu cummentu a una publicatzione limitada."
+      reply: "Risponde o abbista custu arresonu >"
     private_message:
       reply_to_or_view: "Risponde o abbista custu arresonu >"
       subject: "B'est unu messàgiu privadu nou pro tie"
+    remove_old_user:
+      body: |-
+          Salude,
+
+          Paret chi tue non sias prus interessadu a su contu tuo in %{pod_url}, bidu chi non l'as impreadu pro %{after_days} dies. Pro garantire sas mègius prestatziones a sos impreadores nostros in custu pod de diaspora, nos diat agradare a iscantzellare sos contos non disigiados dae sa base de datos nostra.
+
+          Nos diat agradare meda a ti sighire a tènnere in sa comunidade de diaspora*, e est craru chi ti podes mantènnere su contu tuo, si lu cheres.
+
+          Si non cheres pèrdere su contu tuo totu su chi depes fàghere est a intrare in su contu tuo in antis de su %{remove_after}. Cando as a intrare, piga·ti unu momentu pro abbistare comente diaspora* est cambiadu, in su tempus. Bi sunt istadas medas megiorias e cambiamentos dae s'ùrtima borta chi ses intradu, e pensamus chi cussas megiorias t'ant a agradare. Sighi carchi #eticheta pro agatare cuntenutu chi ti diat pòdere agradare.
+
+          Intra inoghe: %{login_url}. Si as ismentigadu sas credentziales de intrada tua las  podes torrare a pedire in cussa pàgina.
+
+          Isperamus de ti torrare a bìdere,
+
+          Su robot de posta eletrònica de diaspora*!
+      subject: "Su contu tuo de diaspora* est istadu sinnaladu pro s'iscantzellamentu pro more de s'inatividade sua"
     report_email:
       body: |-
           Salude,
@@ -611,10 +901,17 @@ sc:
       notice: "Fotografia iscantzellada."
     new_profile_photo:
       upload: "Càrriga una fotografia de profilu noa!"
+  polls:
+    votes:
+      one: "%{count} votu finas a como"
+      other: "%{count} votos finas a como"
+      zero: "%{count} votos finas a como"
   posts:
     presenter:
       title: "Una publicatzione de %{name}"
     show:
+      forbidden: "Non ses autorizadu a fàghere custu"
+      location: "Publicadu dae : %{location}"
       photos_by:
         one: "Una fotografia de %{author}"
         other: "%{count} fotografias de %{author}"
@@ -625,11 +922,19 @@ sc:
   profiles:
     edit:
       allow_search: "Permiti a sos àteros de ti chircare in intro de diaspora*"
+      basic: "Profilu de base meu"
+      basic_hint: "Cada elementu in su profilu tuo est optzionale. Su profilu de base tuo at a èssere semper visìbile a totus."
+      extended: "Profilu intreu meu"
+      extended_hint: "Incarca s'interrutore pro impostare sa visibilidade de sos datos de su profilu intreu tuo. Pùblicu cheret nàrrere chi est visìbile in ìnternet, limitadu cheret nàrrere chi petzi sas persones cun sas cales ses cumpartzende ant a pòdere bìdere custa informatzione."
+      extended_visibility_text: "Visibilidade de su profilu intreu tuo:"
       first_name: "Nùmene"
       last_name: "Sambenadu"
+      limited: "Limitadu"
       nsfw_check: "Sinna totu sos chi cumpartzo comente NSFW"
       nsfw_explanation: "NSFW (“not safe for work”, non apropriadu pro su traballu) est s'istandard de sa comunidade pro su cuntenutu chi diat pòdere non èssere adatu pro èssere bidu cando ses in unu logu de traballu. Si tenes s'intentzione de cumpartzire custa casta de materiale in manera fitiana pro praghere incarca custa optzione pro istichire totu sos chi cumpartzis dae sos flussos de sa gente, si non isseberant de lu bìdere."
       nsfw_explanation2: "Si as isseberadu de non ischertare custa optzione pro praghere annanghe s'eticheta #nsfw cada borta chi cumpartzis carchi cosa de custa casta."
+      public: "Pùblicu"
+      settings: "Impostatziones de profilu"
       update_profile: "Agiorna su profilu"
       your_bio: "Sa biografia tua"
       your_birthday: "Su compleannu tuo"
@@ -658,17 +963,31 @@ sc:
       password_confirmation: "Cunfirma sa crae"
       sign_up: "Crea unu contu"
       submitting: "Imbiende..."
+      terms: "Creande unu contu atzetas sos %{terms_link}."
+      terms_link: "termines (sas conditziones) de impreu"
       username: "Nùmene impreadore"
   report:
-    comment_label: "<b>Cummentu</b>: %{data}"
+    comment_label: "<strong>Cummentu</strong>: %{data}"
+    confirm_deletion: "Seguru ses de chèrrere iscantzellare s'elementu?"
     delete_link: "Iscantzella elementu"
-    post_label: "<b>Publicatzione</b>: %{content}"
+    not_found: "Sa publicatzione/su cummentu no est istadu agatadu. Paret chi siat istadu iscantzelladu dae s'impreadore!"
+    post_label: "<strong>Publicatzione</strong>: %{content}"
     reason_label: "Resone:"
-    reported_label: "<b>Sinnaladu dae</b> %{person}"
+    reported_label: "<strong>Sinnaladu dae</strong> %{person}"
+    reported_user_details: "Minujas a pitzu de s'impreadores sinnaladu"
     review_link: "Sinna comente verificadu"
+    status:
+      destroyed: "Sa publicatzione est istada iscantzellada"
+      failed: "B'est istadu un'errore"
     title: "Summàriu de sas verìficas"
+    unreviewed_reports:
+      one: "B'est una sinnalatzione non verificada."
+      other: "Bi sunt %{count} sinnalatziones non verificadas."
+      zero: "Non bi sunt sinnalatziones non verificadas."
   reshares:
     comment_email_subject: "Sa cumpartzidura de %{resharer} de sa publicatzione de %{author}"
+    create:
+      error: "Sa cumpartzidura est fallida."
     reshare:
       deleted: "Publicatzione originale iscantzellada dae s'autore."
       reshare_confirmation: "Cumpartzire sa publicatzione de %{author}?"
@@ -685,14 +1004,26 @@ sc:
     failure:
       error: "B'est istadu un'errore in sa connessione a cussu servìtziu"
     index:
+      connect: "Connètere"
       disconnect: "Disconnete"
       edit_services: "Modìfica sos servìtzios"
       logged_in_as: "Atzessu fatu comente %{nickname}."
+      no_services_available: "Non bi sunt servìtzios disponìbiles in custu pod."
+      not_logged_in: "Pro como no as fatu galu s'atzessu."
       really_disconnect: "Disconnètere %{service}?"
       services_explanation: "Cunnetende·ti a servìtzios esternos as a tènnere sa possibilidade de publicare in ie su chi iscries in diaspora*."
+      share_to: "Cumpartzi in %{provider}"
+      title: "Amministra sos servìtzios connessos"
+    provider:
+      facebook: "Facebook"
+      tumblr: "Tumblr"
+      twitter: "Twitter"
+      wordpress: "WordPress"
   settings: "Impostatziones"
   shared:
     aspect_dropdown:
+      mobile_row_checked: "%{name} (boga)"
+      mobile_row_unchecked: "%{name} (annanghe)"
       toggle:
         one: "In %{count} cara"
         other: "In %{count} caras"
@@ -736,16 +1067,35 @@ sc:
       failed: "Sa verìfica de s'umanidade est fallida"
       user: "S'immàgine segreta e su còdighe sunt diferentes"
     placeholder: "Inserta su valore de s'immàgine"
+  statistics:
+    active_users_halfyear: "Impreadores ativos in sos ùrtimos 6 meses"
+    active_users_monthly: "Impreadores ativos pro mese"
+    closed: "Serradu"
+    disabled: "Non disponìbile"
+    enabled: "Disponìbile"
+    local_comments: "Cummentos locales"
+    local_posts: "Publicatziones locales"
+    name: "Nùmene"
+    network: "Retza"
+    open: "Abertu"
+    registrations: "Iscritziones"
+    services: "Servìtzios"
+    total_users: "Impreadores totales"
+    version: "Versione"
   status_messages:
     new:
       mentioning: "Ses numenende: %{person}"
     too_long: "Pro praghere iscrie un'istadu cun prus pagu de %{count} caràteres. In custu momentu bi sunt %{current_length} caràteres."
+  stream_helper:
+    no_more_posts: "Ses arribadu a sa fine de su flussu."
+    no_posts_yet: "Non bi sunt galu publicatziones."
   streams:
     activity:
       title: "Atividade mea"
     admin:
       title: "Amministradore"
     aspects:
+      all: "Totu sas caras"
       title: "Caras meas"
     aspects_stream: "Caras"
     comment_stream:
@@ -755,6 +1105,7 @@ sc:
     community_spotlight_stream: "In evidèntzia in sa comunidade"
     followed_tag:
       add_a_tag: "Annanghe un'eticheta"
+      all: "Totu sas etichetas"
       follow: "Sighi"
       title: "#Etichetas sighidas"
     followed_tags_stream: "#Etichetas sighidas"
@@ -771,12 +1122,21 @@ sc:
       title: "Atividade pùblica"
     tags:
       title: "Publicatziones cun s'eticheta: %{tags}"
+  tag_followings:
+    manage:
+      no_tags: "Non ses sighende a peruna eticheta."
+      title: "Amministra sas etichetas sighidas"
   tags:
+    name_too_long: "Su nùmene de s'eticheta depet èssere longu a su màssimu %{count} caràteres. Como sunt %{current_length} caràteres"
     show:
       follow: "Sighi #%{tag}"
       none: "S'eticheta bòida no esistit!"
-      stop_following: "Acaba·la de sighire #%{tag}"
-  username: "Nùmene impitadore"
+      stop_following: "Acaba·la de sighire a #%{tag}"
+      tagged_people:
+        one: "1 persone etichetadas cun %{tag}"
+        other: "%{count} persones etichetadas cun %{tag}"
+        zero: "Nemos etichetadu cun %{tag}"
+  username: "Nùmene impreadore"
   users:
     confirm_email:
       email_confirmed: "P. eletrònica %{email} ativada"
@@ -790,6 +1150,7 @@ sc:
       auto_follow_aspect: "Cara pro sos impreadores cun sos cales cumpartzis automaticamente:"
       auto_follow_back: "Cumpartzi automaticamente cun sos impreadores chi incumintzant a cumpartzire cun tie"
       change: "Càmbia"
+      change_color_theme: "Càmbia su tema de sos colores"
       change_email: "Càmbia s'indiritzu de posta eletrònica"
       change_language: "Càmbia sa limba"
       change_password: "Càmbia sa crae de intrada"
@@ -806,23 +1167,34 @@ sc:
       comment_on_post: "calicunu cummentat una publicatzione tua"
       current_password: "Crae de como"
       current_password_expl: "sa chi impreas pro intrare..."
+      default_post_visibility: "Caras predefinidas isseberadas pro sa publicatzione"
+      download_export: "Iscàrriga su profilu meu"
       download_export_photos: "Iscàrriga sas fotos meas"
       edit_account: "Modìfica su contu"
       email_awaiting_confirmation: "Amus imbiadu unu ligàmene de cunfirma a%{unconfirmed_email}. Finas a cando no as a àere abertu cussu ligàmene e no as a àere ativadu s'indiritzu nou amos a impreare s'indiritzu originale tuo %{email}."
       export_data: "Esporta sos datos"
+      export_in_progress: "In custu momentu semus protzessende sos datos tuos. Pro praghere, torra a verificare a pustis de carchi momentu."
       export_photos_in_progress: "Semus elaborande sas fotos tuas. Pro piaghere torra a compidare intre pagu."
       following: "Impostatziones de cumpartzidura"
+      last_exported_at: "(Agiornadu s'ùrtima borta su %{timestamp})"
       liked: "a calicunu agradat una publicatzione tua"
       mentioned: "ses numenadu in una publicatzione"
+      mentioned_in_comment: "ti ant numenadu in unu cummentu"
       new_password: "Crae noa"
       private_message: "as retzidu unu messàgiu privadu"
       receive_email_notifications: "Retzi notìficas pro mèdiu de e-lìteras cando:"
+      request_export: "Pedi sos datos de su profilu meu"
+      request_export_photos: "Pedire sas fotografias meas"
+      request_export_photos_update: "Agiorna sas fotografias meas"
+      request_export_update: "Annoa sos datos de su profilu meu"
       reshared: "calicunu at cumpartzidu una publicatzione tua"
       show_community_spotlight: "Ammustra \"in evidèntzia in sa comunidade\" in su flussu tuo"
       show_getting_started: "Ammustra sa ghia initziale"
+      someone_reported: "calicunu imbiat una sinnalatzione"
       started_sharing: "calicunu at incumintzadu a cumpartzire cun tie"
       stream_preferences: "Preferèntzias pro su flussu"
       your_email: "S'indiritzu de posta eletrònica tuo"
+      your_email_private: "S'indiritzu tuo de posta eletrònica no as a èssere mai bidu dae àteros impreadores"
       your_handle: "S'ID diaspora* tuo"
     getting_started:
       awesome_take_me_to_diaspora: "Fantasticu! Faghe·mi intrare in diaspora*"
@@ -836,11 +1208,15 @@ sc:
       who_are_you: "Chie ses tue?"
     privacy_settings:
       ignored_users: "Impreadores ignorados"
+      no_user_ignored_message: "Como non ses ignorande perunu àteru impreadore"
       stop_ignoring: "Acaba·la de l'ignorare"
+      strip_exif: "Boga sos metadatos comente a sa positzione, s'autore, e su modellu de fotocàmera dae sas immàgines carrigadas (racumandadu)"
       title: "Impostatziones pro sa privadesa"
     public:
       does_not_exist: "S'impreadore %{username} no esistit!"
     update:
+      color_theme_changed: "Tema de sos colores cambiadu cun sutzessu."
+      color_theme_not_changed: "B'est istadu un'errore cambiende su tema de sos colores."
       email_notifications_changed: "Notìficas pro mèdiu de p. eletrònica modificadas"
       follow_settings_changed: "Impostatziones pro sa sighidura cambiadas"
       follow_settings_not_changed: "Modìfica de sas impostatziones de sighidura fallida."
diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml
index 01c5a814900ad88f3657e3b9290887031fc43b2f..3c1db83590575426a167164356d0b07eed2f4c34 100644
--- a/config/locales/diaspora/sv.yml
+++ b/config/locales/diaspora/sv.yml
@@ -345,7 +345,7 @@ sv:
       data_visible_to_podmin_q: "Hur mycket av min personliga information kan min pod-administratör se?"
       download_data_a: "Ja. Längst ned på kontofliken, i inställningsmenyn, finns en knapp för att ladda ner din data och en för dina bilder."
       download_data_q: "Kan jag ladda ner en kopia av all data på mitt frö (konto)?"
-      move_pods_a: "I framtiden kommer du att kunna exportera ditt frö från en pod och importera det till en annan. Just nu är detta dock inte möjligt. Du kan däremot skapa ett nytt konto och lägga till dina kontakter på ett nytt frö och sedan be dem att lägga till dig på nytt."
+      move_pods_a: "Diaspora* version 0.7.0.0 börjar ett steg för att kunna migrera konton: du kan nu exportera all din data från kontosektionen, bland användarinställningarna. Håll din data skyddad! I senare versioner av Diaspora* kommer du kunna migrera hela konton, inklusive foton och kontakter, till en annan pod."
       move_pods_q: "Hur flyttar jag mitt frö (konto) från en pod till en annan?"
       title: "Konto- samt datainställningar"
     aspects:
@@ -353,7 +353,7 @@ sv:
       change_aspect_of_post_q: "Kan jag byta vilka aspekter som ser ett inlägg efter att jag har gjort inlägget?"
       contacts_know_aspect_a: "Nej. De kan inte se namnet på aspekten under några omständigheter."
       contacts_know_aspect_q: "Vet mina kontakter i vilken aspekt jag har sorterat in dem?"
-      contacts_visible_a: "Om du har kryssat i alternativet, kommer alla kontakter från den aspekten att kunna se vilka andra som finns i samma aspekt, på din profilsida. Det är bra om du bara väljer detta alternativt om alla i aspekten känner varandra. Oavsett hur du gör, kommer de inte att se vad aspekten heter."
+      contacts_visible_a: "Om du har kryssat i alternativet, kommer alla kontakter från den aspekten att kunna se vilka andra som finns i samma aspekt, på din profilsida. (Just nu kan bara dina kontakter i samma pod kunna se kontaktfliken på din profilsida.) Det är bra om du bara väljer detta alternativt om alla i aspekten känner varandra. Oavsett hur du gör, kommer de inte att se vad aspekten heter."
       contacts_visible_q: "Vad menar ni med \"gör kontakterna i denna aspekt synlig för varandra\"?"
       delete_aspect_a: "Välj den aspekt du vill ta bort i listan med alla dina aspekter, i den vänstra panellisten. Välj pennan som dyker upp och tryck på ta-bort-knappen som dyker upp."
       delete_aspect_q: "Hur tar jag bort en aspekt?"
@@ -755,7 +755,7 @@ sv:
       message: |-
           Hej!
 
-          Du har fått en inbjudan till Diaspora* från %{diaspora_id}!
+          Du har fått en inbjudan till Diaspora* från %{user}!
 
           Använd länken nedanför för att börja
 
@@ -763,6 +763,7 @@ sv:
 
           Annars kan du lägga till %{diaspora_id} bland dina kontakter, om du redan har ett konto.
 
+
           Hjärtliga hälsningar,
 
           Diasporas e-postrobot!
@@ -1005,7 +1006,7 @@ sv:
       control_your_audience: "Välj din publik"
       logged_in: "Inloggad på %{service}"
       manage: "hantera anslutna tjänster"
-      new_user_welcome_message: "Använd #hashtaggar för att klassificera dina inlägg och hitta folk som delar dina intressen. Ropa ut till häftiga personer med @Mentions"
+      new_user_welcome_message: "Använd #fyrkantstaggar för att klassificera dina inlägg och hitta folk som delar dina intressen. Ropa ut till häftiga personer med @Mentions"
       outside: "Publika meddelanden kan läsas av användare utanför Diaspora."
       share: "Dela"
       title: "Hantera anslutna tjänster"
diff --git a/config/locales/diaspora/uk.yml b/config/locales/diaspora/uk.yml
index 5260a79b8df6b75bd3e1dd3d56c9257a908677de..5b7b5c49a7141dd0f38d3b17a03628e13c691762 100644
--- a/config/locales/diaspora/uk.yml
+++ b/config/locales/diaspora/uk.yml
@@ -98,7 +98,7 @@ uk:
       week: "Тиждень"
     user_entry:
       account_closed: "аккаунт закрито"
-      diaspora_handle: "Ваше особисте посилання в Діаспорі*"
+      diaspora_handle: "Ідентифікатор в Діаспорі*"
       email: "Пошта"
       guid: "Груповий ідентифікатор"
       id: "Ідентифікатор"
@@ -370,7 +370,7 @@ uk:
       data_visible_to_podmin_q: "Яку інформацію може побачити адміністратор мого поду?"
       download_data_a: "Так. Внизу акаунтової інформації на вашій сторінці налаштувань є дві кнопки для завантаження ваших даних."
       download_data_q: "Чи можу я завантажити копії усіх моїх даних, розміщених у моєму акаунті?"
-      move_pods_a: "В майбутньому це буде можливо, але доки підтримується тільки експорт даних аккаунта, але не імпорт. Додавання старих контактів в новому аккаунті і редагування інформації в профілі робиться вручну. Не забудьте повідомити контакти про те, що ви змінили под."
+      move_pods_a: "Версія Діаспори* 0.7.0.0 надає перший крок міграції обліковго запису: тепер ви можете експортувати усі свої дані з розділу «Обліковий запис» налаштувань користувача. Зберігайте свої дані в безпеці! У майбутньому релізі ви зможете мігрувати весь обліковий запис, включно з дописами та контактами, на інший под."
       move_pods_q: "Як мені перенести мій аккаунт з одного поду на інший?"
       title: "Управління акаунтом та інформацією"
     aspects:
@@ -378,7 +378,7 @@ uk:
       change_aspect_of_post_q: "Якщо я створив запис, чи можу я змінити аспекти, які можуть її бачити?"
       contacts_know_aspect_a: "Ні."
       contacts_know_aspect_q: "Чи можуть мої контакти бачити, в які аспекти я їх додав?"
-      contacts_visible_a: "Будь-який користувач в цьому аспекті побачить інших користувачів з того ж аспекту як ваші контакти на вашій сторінці під аватаром. Цю опцію краще включати, якщо користувачі в цьому аспекті знають один одного. І вони у будь-якому випадку не побачать в яких аспектах вони знаходяться."
+      contacts_visible_a: "Будь-який користувач в цьому аспекті побачить інших користувачів з того ж аспекту як ваші контакти на вашій сторінці під аватаром. (Наразі лише ваші контакти на тому ж поді, що й ви, зможуть бачити вкладку «Контакти» у вашому профілі). Цю опцію краще включати, якщо користувачі в цьому аспекті знають один одного. І вони у будь-якому випадку не побачать в яких аспектах вони знаходяться."
       contacts_visible_q: "Що означає \"Зробити контакти у цьому аспекті видимими один одному\"?"
       delete_aspect_a: "У списку аспектів у бічній панелі наведіть курсор на потрібний аспект і натисніть піктограму редагування. У вікні, що з'явилося, натисніть кнопку \"Видалити\"."
       delete_aspect_q: "Як мені видалити аспект?"
@@ -438,7 +438,7 @@ uk:
       how_to_mention_q: "Як мені згадати кого-небудь, коли я створюю запис?"
       mention_in_comment_a: "Починаючи з версії 0.7.0.0, так! Ви можете згадати когось у коментарі так само, як у дописі, написавши «@», а тоді ім'я. Будь ласка, зауважте, що коли коментуєте непублічний допис, то можна згадати лише тих користувачів, які якось відреагували на допис."
       mention_in_comment_q: "Чи можна згадати кого-небудь у коментарях?"
-      see_mentions_a: "Так. Натисність кнопку \"@Упоминания\" у бічній панелі на вашій сторінці."
+      see_mentions_a: "Так. Натисність кнопку «@Згадування» у бічній панелі на вашій сторінці."
       see_mentions_q: "Чи є спосіб побачити список записів, у яких я згадуюсь?"
       title: "Згадування"
       what_is_a_mention_a: "Згадування - це посилання на профіль користувача у записі. Коли когось згадують, він отримує повідомлення з посиланням на запис, в якому його згадали."
@@ -457,7 +457,7 @@ uk:
       find_people_a: "Запросіть своїх друзів за допомогою email через відповідну функцію у бічній панелі. Підписуйтеся на #мітки, щоб знайти однодумців і додавайте їх в \"аспекти\". Створіть запис, що ініціює, з міткою #новачок і іншими мітками, які вас цікавлять."
       find_people_q: "Я тільки що вступив в співтовариство, як мені знайти співрозмовників?"
       title: "Поди"
-      use_search_box_a: "Якщо Ви знаєте повну адресу (наприклад логін@ім'япод.орг),Ви можете просто вставити цю адресу в пошук по логіну .У інших випадках Ви можете просто зробити пошук по імені ,вказаному у профілі(те,яке Ви бачите на екрані).Якщо пошук не дав результатів ,є сенс пошукати пізніше - можливо потрібний под був тимчасово відключений або перевантажений."
+      use_search_box_a: "Ви можете шукати людей за їхнім іменем користувача або іменем у Діаспорі* (тим, яке видно у профілі). Якщо ці способи не працюють, введіть повний ідентифікатор Діаспори* (ім'я_користувача@назва_поду.орг). Якщо пошук не дав результатів, є сенс пошукати пізніше — можливо, мережа перевантажена."
       use_search_box_q: "Як шукати користувачів в полі для пошуку?"
       what_is_a_pod_a: "Под - це сервер з движком Діаспори*, пов'язаний з іншими подами в розподілену соціальну мережу. Под в перекладі означає стручок, що містить насіння, що має на увазі сервер, містящій призначені для користувача аккаунти. Існує багато різних подів. Ви можете додавати друзів з інших подів і спілкуватися з ними. У цьому плані поди Діаспори* можна порівняти з email сервісами - публічні, приватні поди і поди, які ви можете підняти своїми зусиллями."
       what_is_a_pod_q: "Що таке под?"
@@ -468,11 +468,11 @@ uk:
       character_limit_q: "Яка максимальна кількість символів для запису?"
       embed_multimedia_a: "Для цього вам достатньо просто вставити посилання (наприклад http://www.youtube.com/watch?v=nnnnnnnnnnn ) у ваш запис і відео або аудіо буде додано автоматично. Сайти, які підтримуються: YouTube, Vimeo, SoundCloud, Flickr та деякі інші. Цей список постійно поповнюється. Пам'ятайте завжди використовувати прості, повні посилання; не скорочені; жодних операторів після основного посилання і зачекайте трохи перед тим, як перезавантажувати сторінку після викладення запису, задля того аби побачити попередній вигляд."
       embed_multimedia_q: "Як я можу прикріплювати відео, аудіо, чи інший мультимедійний контент у мої пости?"
-      format_text_a: "Діаспора підтримує синтаксис %{markdown}. Його повний опис можна знайти %{here}. Якщо Ви сумніваєтесь, чи правильно оформили запис, Ви можете скористатися кнопкою \"Попередній огляд\"."
+      format_text_a: "Діаспора* підтримує спрощену систему під назвою %{markdown}. В інструменті публікації є кнопки, що полегшать форматування тексту. Якщо ви хочете форматувати допис вручну, повний опис синстаксису Markdown можна знайти %{here}. Вкладка попереднього перегляду дозволяє побачити, як виглядатиме допис, до того, як його збережете. Не забувайте, що після публікації допису редагувати його вже не можна, тому користуйтеся попереднім переглядом до того!"
       format_text_q: "Як мені оформити текст моїх записів (полужирний, курсив і т.д.)?"
       hide_posts_a: "Якщо Ви наведете мишкою на запис, справа вверху з'явиться хрестик. Натисніть на нього. Ви все одно зможете бачити запис і коментарі, якщо зайдете на сторінку до автора цього запису."
       hide_posts_q: "Як мені приховати запис і перестати отримувати повідомлення про коментарі до нього?"
-      insert_images_a: "Натисність піктограму фотокамери та вкажіть потрібне зображення для завантаження з вашого комп'ютера. Якщо ж Ви бажаєте вставити зображення з Інтернету, то Ви можете скористатися синтаксисом Мarkdown."
+      insert_images_a: "Якщо ви хочете додати у свій допис зображення зі свого комп'ютера, натисніть на маленьку іконку камери унизу. Ви можете також перетягнути файл чи декілька зображень з комп'ютера на цю іконку. Якщо ви хочете додати зображення з вебу, натисніть на кнопку зображення угорі, яка створить потрібний код Markdown."
       insert_images_comments_a: "Ми можете використовувати Markdown, щоб вставити зображення з мережі у коментар, так само, як і в дописах. Однак прямо з комп'ютера завантажити зображення не можна. Закиньте їх на сервіс гостингу зображень, а тоді вставте, скориставшись кнопкою зображень."
       insert_images_comments_q: "Чи можу я додати зображення у коментарі?"
       insert_images_q: "Як мені додати у запис зображення?"
@@ -482,7 +482,7 @@ uk:
       post_notification_q: "Як мені підписатись або відписатись від повідомлень певного запису?"
       post_poll_a: "Натисніть на іконку з графіком. Потім введіть запитання і як мінімум два варіанти відповіді. Не забудьте зробити запис публічним, якщо хочете, щоб будь-хто міг взяти участь в опитуванні."
       post_poll_q: "Як мені добавити опитування до запису?"
-      post_report_a: "Щоб повідомити про це адміністратора вашого поду натисніть на значок зі знаком оклику в правому верхньому кутку запису. Потім в діалоговому вікні обґрунтуйте причину."
+      post_report_a: "Щоб повідомити про це адміністратора вашого поду, натисніть на значок зі знаком оклику в правому верхньому кутку запису. Потім в діалоговому вікні обґрунтуйте причину. Будь ласка, повідомляйте лише про дописи, які порушують наші %{community_guidelines} або умови користування вашого поду, наприклад, дописи із забороненим вмістом, зловживання чи спам."
       post_report_q: "Як мені повідомити про образливий запис?"
       size_of_images_a: "Ні. Зображення буде автоматично підігнано під ширину потоку. У Markdown немає коду, що підтримує розмір зображення."
       size_of_images_q: "Чи можу я налаштовувати розміри зображень у постах чи коментарях?"
@@ -511,10 +511,10 @@ uk:
       who_sees_profile_a: "Ваш основний профіль (ім'я, зображення і #мітки) — публічний. Ваш розширений профіль за замовчуванням приватний, але за бажання його можна зробити публічно доступним. Лише люди, з якими ви ділитеся (тобто ви додали їх до одного з аспектів), можуть бачити ваш розширений профіль, якщо він приватний. Інші люди бачать лише публічну інформацію. Будь-яку інформацію, яку ви робите публічною, може переглянути будь-хто в мережі, і вона також індексується пошуковиками"
       who_sees_profile_q: "Хто бачить мій профіль?"
     public_posts:
-      can_comment_reshare_like_a: "Будь-який зареєстрований користувач Діаспори*."
+      can_comment_reshare_like_a: "Будь-який зареєстрований користувач Діаспори* може коментувати, поширювати чи вподобувати ваш публічний допис. Виняток становлять тільки люди, яких ви ігноруєте: вони не зможуть вподобувати чи коментувати ваші дописи."
       can_comment_reshare_like_q: "Хто може коментувати мої публічні записи, ділитися або відмічати як вподобані?"
       deselect_aspect_posting_a: "Це не вплине на сам запис. Якщо Ви хочете, щоб запис не був доступним одному або кільком аспектам, Ви повинні скористатися меню, яке знаходиться під полем введення запису."
-      deselect_aspect_posting_q: "Що буде, якщо я виключу один або кілька аспектів з бокової панелі при створенні публічного запису?"
+      deselect_aspect_posting_q: "Що буде, якщо я виключу один або кілька аспектів з бокової панелі ліворуч при створенні публічного допису?"
       find_public_post_a: "Ваші публічні записи з'являтимуться в потоках людей, які на вас підписані. Якщо ви включаєте #мітки, то їх побачить будь-хто, хто на них підписаний або зробить по них пошук. Також у будь-якого запису є індивідуальне посилання, яке може отримати кожен, навіть не зареєстрований в діаспорі користувач. Так що посилання на публічні записи можуть бути опубліковані в твіттері, блогах і взагалі де завгодно. Також публічні записи індексуються пошуковими системами."
       find_public_post_q: "Як інші люди зможуть знайти мій публічний запис?"
       see_comment_reshare_like_a: "Будь-який інтернет користувач. Коментарі, лайки і репости публічних записів також є публічними."
@@ -540,7 +540,7 @@ uk:
       add_to_aspect_li7: "Маша з'явиться в розділі що \"Тільки додали мене\" на сторінці контактів в профілі Саші."
       add_to_aspect_li8: "Таким чином Маша може @згадувати Сашу у записах."
       add_to_aspect_q: "Що відбувається ,коли я додаю кого-небудь у свої аспекти або коли хто-небудь додає мене?"
-      list_not_sharing_a: "Ні,але Ви можете побачити ,чи додав Вас який-небудь користувач чи ні,зайшовши на сторінку його профілю.Якщо смуга під його аватаром буде зеленою,отже додав.Якщо сірою - ні.Як тільки він Вас додасть, Ви отримаєте про це сповіщення."
+      list_not_sharing_a: "Ні, але ви можете побачити, чи додав вас який-небудь користувач/ка чи ні, зайшовши на їхню сторінку профілю. Якщо поруч з ID Діаспори* стоїть зелена галочка, отже, вас додали. Якщо сіре коло — то ні."
       list_not_sharing_q: "Чи є список людей, яких я додав до своіх аспектів, але які не додали мене?"
       only_sharing_a: "Люди,які додали Вас у свої аспекти ,але яких Ви (ще) не додали у свої.Якщо Ви добавите їх в сої аспекти ,то вони перейдуть у розділ відповідного аспекту."
       only_sharing_q: "Хто перерахований в розділі \"Лише що додали мене\" на моїй сторінці контактів?"
@@ -552,7 +552,7 @@ uk:
     tags:
       filter_tags_a: "Ця функція ще не увімкнена, але Ви можете скористатись сторонніми додатками за посиланням %{third_party_tools}"
       filter_tags_q: "Як відфільтрувати/виключити мітку з мого потоку?"
-      followed_tags_a: "Якщо ви шукали по мітці, то можете натиснути кнопку \"Стежити за міткою #ім'ямітки\". Після цього вона з'явиться у бічній колонці в розділі \"Відстежувані мітки\". Якщо ви натиснете на одну з них, то перейдете на сторінку мітки, де будуть перераховані останні записи, що її містять. Якщо ви натиснете на \"Відстежувані мітки\", то побачите потік з підписками на них, але без підписок на користувачів."
+      followed_tags_a: "Якщо ви шукали по мітці, то можете натиснути кнопку «Стежити за міткою #назва_мітки». Після цього вона з'явиться у бічній колонці в розділі «Відстежувані мітки». Якщо ви натиснете на одну з них, то перейдете на сторінку мітки, де будуть перераховані останні записи, що її містять. Якщо ви натиснете на «Відстежувані мітки», то побачите потік з підписками на них, але без підписок на користувачів. Дописи з цією міткою також будуть у вашому головному потоці."
       followed_tags_q: "Що таке \"#Відстежувані мітки\" і як мені на них підписуватися?"
       people_tag_page_a: "Це люди, які вказали цю мітку в якості опису у своєму публічному профілі."
       people_tag_page_q: "Хто всі ці люди, перераховані у лівому стовпчику на сторінці міток?"
@@ -679,8 +679,8 @@ uk:
       mark_all_shown_as_read: "Позначити все як прочитане"
       mark_read: "Помітити як прочитане"
       mark_unread: "позначити як непрочитане"
-      mentioned: "Згадав"
-      mentioned_in_comment: "Згадується у коментарі"
+      mentioned: "Згадки в дописах"
+      mentioned_in_comment: "Згадано у коментарі"
       no_notifications: "У Вас немає повідомлень."
       notifications: "Повідомлення"
       reshared: "Поділився"
@@ -710,18 +710,18 @@ uk:
     mentioned_deleted:
       few: "%{actors} згадали вас у вилученому записі."
       many: "%{actors} згадали вас у вилученому записі."
-      one: "%{actors} згадали вас у вилученому записі."
+      one: "%{actors} згадав(-ла) вас у вилученому записі."
       other: "%{actors} згадали вас у вилученому записі."
       zero: "%{actors} згадали вас у вилученому записі."
     mentioned_in_comment:
-      few: "%{actors} згадали Вас в <a href='%{comment_path}'>коментарях</a> до запису %{post_link}."
-      many: "%{actors} згадали Вас в <a href='%{comment_path}'>коментарях</a> до запису %{post_link}."
-      one: "%{actors} згадав Вас в <a href='%{comment_path}'>коментарі</a> до запису %{post_link}."
-      other: "%{actors} згадали Вас в <a href='%{comment_path}'>коментарях</a> до запису %{post_link}."
+      few: "%{actors} згадали вас у <a href='%{comment_path}'>коментарі</a> до допису %{post_link}."
+      many: "%{actors} згадали вас у <a href='%{comment_path}'>коментарях</a> до запису %{post_link}."
+      one: "%{actors} згадав(-ла) вас у <a href='%{comment_path}'>коментарі</a> до допису %{post_link}."
+      other: "%{actors} згадали вас у <a href='%{comment_path}'>коментарях</a> до запису %{post_link}."
     mentioned_in_comment_deleted:
       few: "%{actors} згадали Вас у видалених коментарях."
       many: "%{actors} згадали Вас у видалених коментарях."
-      one: "%{actors} згадав Вас у видаленому коментарі."
+      one: "%{actors} згадав(-ла) Вас у видаленому коментарі."
       other: "%{actors} згадали Вас у видалених коментарях."
     private_message:
       few: "%{actors} надіслали вам повідомлення."
@@ -833,9 +833,11 @@ uk:
       message: |-
           Вітаємо!
 
-          %{diaspora_id} запросив/ла Вас до Діаспори*!
+          %{user} запросив/ла Вас до Діаспори*!
 
-          Щоб долучитися, перейдіть за посиланням [%{invite_url}][1]
+          Щоб долучитися, перейдіть за цим посиланням:
+
+          [%{invite_url}][1]
 
           Або Ви можете додати %{diaspora_id} до списку Ваших контактів, якщо у Вас уже є обліковка.
 
@@ -858,7 +860,7 @@ uk:
       subject: "%{name} згадав вас у Діаспорі*"
     mentioned_in_comment:
       limited_post: "Ви були згадані в коментарі до приватного запису."
-      reply: "Відповісти або подивитися цю розмову>"
+      reply: "Відповісти або подивитися цю розмову >"
     private_message:
       reply_to_or_view: "Відповісти або подивитися цю бесіду >"
       subject: "Там нове ПП для Вас"
diff --git a/config/locales/diaspora/zh-CN.yml b/config/locales/diaspora/zh-CN.yml
index 86a0121cc1b233caec861b37d76f7705f3112e0e..323474da96225df7ff110dfe4e174cb5d3da7c15 100644
--- a/config/locales/diaspora/zh-CN.yml
+++ b/config/locales/diaspora/zh-CN.yml
@@ -7,6 +7,7 @@
 zh-CN:
   _applications: "应用"
   _contacts: "好友"
+  _help: "求助"
   _services: "服务"
   account: "帐号"
   activerecord:
@@ -37,6 +38,7 @@ zh-CN:
     admin_bar:
       pages: "分页"
       pod_stats: "Pod 统计资料"
+      sidekiq_monitor: "监控Sidekiq"
       user_search: "搜索用户"
       weekly_user_stats: "用户统计周报"
     stats:
@@ -65,6 +67,7 @@ zh-CN:
     user_search:
       add_invites: "增加邀请次数"
       email_to: "寄电子邮件邀请"
+      under_13: "显示13岁以下的用户 (受COPPA,小孩网路私隐保护法,保护)"
       users:
         other: "找到 %{count} 个用户"
         zero: "找到 %{count} 个用户"
@@ -106,15 +109,20 @@ zh-CN:
     index:
       donate: "捐助"
       help:
+        any_problem: "需要帮忙吗?"
+        contact_podmin: "请联络您所在的服务器的管理员!"
         do_you: "您是否:"
         feature_suggestion: "...想建议 %{link}?"
         find_a_bug: "...找到一只 %{link}?"
         have_a_question: "...有 %{link} ?"
         here_to_help: "Diaspora 社区很高兴帮助您!"
+        mail_podmin: "管理员电邮"
         need_help: "需要帮助吗?"
         tag_bug: "#bug"
         tag_feature: "#特色"
         tag_question: "#问题"
+        tutorial_link_text: "教程"
+        tutorials_and_wiki: "您可在%{faq}、%{tutorial}和%{wiki}学习如何开始。"
       introduce_yourself: "这是您的动态。介绍一下自己吧!"
       keep_pod_running: "让 %{pod} 高速运转,需要您的每月捐助,供应服务器的耗材!"
       new_here:
@@ -166,6 +174,7 @@ zh-CN:
       title: "好友"
     spotlight:
       community_spotlight: "社区热点"
+      suggest_member: "推荐一名成员"
   conversations:
     create:
       fail: "无效的信息"
@@ -194,10 +203,50 @@ zh-CN:
       correct_the_following_errors_and_try_again: "修正以下错误后重试。"
   fill_me_out: "补全信息"
   find_people: "找人或#标签"
+  help:
+    account_and_data_management:
+      close_account_a: "您可以去到设定的低端点击“关闭帐号”的按钮。您会需要在这个过程中输入您的密码。记得,您关闭帐号后,您就<strong>永远</strong>不能再在这个伺服器使用同个用户名了。"
+      close_account_q: "我如何删除我的帐号?"
+      data_other_podmins_a: "当您与另一个伺服器的用户共享您的帖子/资料时,所有您分享的帖子和您的用户资料都将被存储(作为缓存)在那个伺服器上,并且能被管理员开启。当你删除掉一则帖子或您的部分/全部资料时,所有曾留着您的资料的伺服器将被给予删除要求。您的照片永远都不会储存在别的伺服器上,别的伺服器只会拥有一个通往您的图片的链接。"
+      data_other_podmins_q: "其他的伺服器管理员看得到我的资料吗?"
+      data_visible_to_podmin_a: "简单来说:全部。伺服器与伺服器之间的通讯永远都被加密(使用SSL和diaspora*自己的加密方法),但是存储在伺服器上的资料并没有加密。伺服器管理员拥有权力开启您所有的资料(包括帖子)(大部分存储用户资料的网站也一样)。这就是我们给予你选择注册的伺服器的原因:你可以选择一个值得信赖的管理员。您在可以开启您自己的伺服器以后,您也可以因拥有伺服器的管理权而拥有更多的隐私权。"
+      data_visible_to_podmin_q: "伺服器管理员到底能看到我多少资料?"
+      download_data_a: "是的,您可以。在设定中的“帐号”低端找到两个按钮:下载资料和下载图片。"
+      download_data_q: "我可以下载我的帐号所有的资料吗?"
+      move_pods_a: "Diaspora* 0.7.0.0 现在提供迁移帐号的第一步:您现在可以从设定中的“帐号”导出您所有的资料。记得安全的储存您的资料!我们接下来将允许您完全迁移您的账号(包括帖子和联络人)去别的伺服器。"
+      move_pods_q: "我如何把我的帐号移至另一个伺服器?"
+      title: "管理帐号和资料"
+    aspects:
+      restrict_posts_i_see_q: "我可以只阅读一些分组内的人发布的帖子吗?"
+      title: "分组"
+      what_is_an_aspect_a: "分组是个整合您在diaspora*的联络人的方法。一个分组是个您对外的一面。它可以是您的同事、您的家人或者您在一个俱乐部的朋友。"
+      what_is_an_aspect_q: "分组是什么?"
+      who_sees_post_a: "当您指定特定的收帖组时,它只会显示给您所指定的分组内的用户。不在分组内的联络人没有任何阅读您的帖的方法。这些帖子不会对不再您的分组内的用户显示。"
+      who_sees_post_q: "我对一个分组发帖时,有谁可以看到我的帖子?"
+    foundation_website: "diaspora*基金官方网站"
+    getting_help:
+      get_support_a_hashtag: "在公共的帖子使用%{question}问我们问题。"
+      get_support_a_irc: "请在%{irc}(现时交谈服务)加入我们"
+      get_support_a_tutorials: "查看我们的教程:%{tutorials}"
+      get_support_a_website: "请浏览%{link}"
+      get_support_a_wiki: "找看%{link}吧"
+      get_support_q: "朕的问题没被解答。朕需要更多帮助。"
+      getting_started_a: "您很幸运。您可以尝试浏览我们网站的%{tutorial_series}。它会教你注册方法和所有您使用diaspora*所需知道的东西。"
+      getting_started_q: "帮忙下,我需要一些基本的帮助才能开始!"
+      title: "求助"
+    getting_started_tutorial: "开始教程系列"
+    here: "è¿™"
+    irc: "IRC (网路聊天)"
+    markdown: "修饰字体"
+    third_party_tools: "第三方用具"
+    tutorial: "教程"
+    tutorials: "教程"
+    wiki: "百科"
   invitations:
     create:
       empty: "请至少填写一个邮箱"
       no_more: "您暂无邀请函。"
+      note_already_sent: "邀请已被发送至:%{emails}"
       rejected: "下列电子信箱有问题: "
       sent: "邀请函已经寄给: "
     new:
@@ -209,6 +258,7 @@ zh-CN:
       language: "语言"
       paste_link: "将这个链接分享给您的朋友,邀请他们加入 Diaspora*,或者直接用电子邮件发送给他们。"
       send_an_invitation: "发送邀请函"
+      sending_invitation: "正在发出邀请..."
   layouts:
     application:
       back_to_top: "回到上面"
@@ -397,6 +447,7 @@ zh-CN:
     create:
       already_authorized: "已经有 Diaspora 通行证为 %{diaspora_id} 的用户被授权使用 %{service_name} 帐号了"
       failure: "认证失败"
+      read_only_access: "您只拥有阅读的权限,请尝试修复权限并稍后重新尝试。"
       success: "验证成功。"
     destroy:
       success: "验证删除成功。"
@@ -407,6 +458,7 @@ zh-CN:
       edit_services: "编辑服务"
       logged_in_as: "登录为"
       really_disconnect: "切断与 %{service} 的连接?"
+      services_explanation: "您连接第三方共享服务后,diaspora*就能自动把您所发出的帖子自动转发出去。"
   settings: "设置"
   shared:
     aspect_dropdown:
@@ -430,6 +482,7 @@ zh-CN:
       visibility_dropdown: "用这个下拉菜单来改变内容的可见范围。  (建议您的第一篇内容为公开)"
     publisher:
       discard_post: "丢弃内容"
+      get_location: "附上您的位置"
       new_user_prefill:
         hello: "大家好,我是 #%{new_user_tag}。 "
         i_like: "我对 %{tags} 感兴趣。 "
@@ -524,6 +577,8 @@ zh-CN:
     getting_started:
       awesome_take_me_to_diaspora: "棒极了!带我去 Diaspora*"
       community_welcome: "Diaspora 社区欢迎您的到来"
+      connect_to_facebook: "您可以使用%{link}加快注册过程。它将会获取您的名字、照片和开启多发出功能(允许您同时在diaspora*和第三方发出帖子)。"
+      connect_to_facebook_link: "正在连接您的Facebook帐号"
       hashtag_explanation: "标签让您可以讨论关注您的兴趣。并且也是在 Diaspora 找到新朋友的好办法。"
       hashtag_suggestions: "试试看关注如 #艺术,#电影, #gif 之类的标签。"
       well_hello_there: "嗨,您好!"
diff --git a/config/locales/diaspora/zh-TW.yml b/config/locales/diaspora/zh-TW.yml
index e8ed7b43c2e15fb057843e6cf82e4473f280cef8..441167cee1d946fb84f4f13c9da81112bdb3bee1 100644
--- a/config/locales/diaspora/zh-TW.yml
+++ b/config/locales/diaspora/zh-TW.yml
@@ -451,6 +451,10 @@ zh-TW:
       format_text_q: "要怎樣對我的貼文加格式(比如說加粗、推斜等等)?"
       hide_posts_a: "當你把滑鼠游標放在一篇貼文上面時,右邊會出現一個 X 圖示。點那個圖示就可以把貼文隱藏起來,也不會再收到關於它的通知。你還是可以到作者的個人檔案去找到那篇貼文。"
       hide_posts_q: "要怎樣隱藏一篇貼文?"
+      ignore_user_a1: "如果你目前跟那個人互相分享,那就到社交面把他/她刪掉,這樣一來他/她大部分的貼文就不會再出現在你的流水帳了。更徹底的方法,則是「忽視」他/她的帳號。不儘他/她的貼文不會再出現,同時他/她也不能夠對你的貼文按讚或是留言。不過,他/她還是可以先分享你的貼文,然後在他/她的分享下面留言。此外他/她在其他人貼文的留言也還是可能被你看見。"
+      ignore_user_a2: "要忽視一個帳號,就到他/她的貼文的右上角,按一下「忽視」的圖示(一個有對角線的圓圈)。他/她的貼文會馬上從你的流水帳消失。另一個方法,到他/她的個人頁面去,然後按那裡的忽視圖示。你還是可以從他/她的個人檔案頁面看到他/她的貼文,或是用單篇貼文模式來看。"
+      ignore_user_a3: "可以在你的帳號設定的隱私頁面,找到你目前忽視的帳號列表。要停止忽視某人的話,只要從那個列表中把他/她移除就可以了。"
+      ignore_user_q: "要怎樣讓某人的貼文不要出現在我的流水帳?"
       insert_images_a: "如果你想要在貼文中加一張存在電腦上的圖片,請按發表對話框下方的那個照相機小圖示。也可以拖放一張或多張的圖片到那個圖示上。如果你想要加入一張網路(web)上的圖片,請按發表對話框上方的圖片按鈕,就會產生對應的 Markdown 代碼。"
       insert_images_comments_a: "你可以在回應時用 Markdown 加入網路上的圖片,就像是在貼文時一樣。不過,你不能直接加入在你的電腦上的圖片。替代方案是:先將圖片上傳到其他相簿網站,然後用發表對話框上方的圖片按鈕來加入連結。"
       insert_images_comments_q: "我可以在留言中放圖片嗎?"
@@ -663,10 +667,8 @@ zh-TW:
       zero: "%{actors} 稱讚了你刪掉的貼文。"
     mentioned:
       other: "%{actors} 在貼文%{post_link}中提到了你。"
-      zero: "%{actors} 在貼文%{post_link}中提到了你"
     mentioned_deleted:
       other: "%{actors} 在已刪掉的貼文中提到了你。"
-      zero: "%{actors} 在已刪掉的貼文中提到了你。"
     mentioned_in_comment:
       other: "%{actors} 在貼文%{post_link}的<a href='%{comment_path}'>意見</a>中提到了你。"
     mentioned_in_comment_deleted:
@@ -928,13 +930,13 @@ zh-TW:
       terms_link: "服務條款"
       username: "使用者名稱"
   report:
-    comment_label: "<b>留言</b>: %{data}"
+    comment_label: "<strong>留言</strong>: %{data}"
     confirm_deletion: "確定要刪除這一項嗎?"
     delete_link: "刪除項目"
     not_found: "目標貼文或留言已經找不到了。可能已經被作者給刪掉了!"
-    post_label: "<b>貼文</b>: %{content}"
+    post_label: "<strong>貼文</strong>: %{content}"
     reason_label: "理由:"
-    reported_label: "<b>回報人<b> %{person}"
+    reported_label: "<strong>回報人</strong> %{person}"
     reported_user_details: "被舉報使用者的詳細資料"
     review_link: "標記為看過了"
     status:
diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml
index 5b093deb9706f1f18e6b63ef0b6c07802ac5b63e..a8f1807d42e6585a754838a21eb476c56ce33262 100644
--- a/config/locales/javascript/javascript.da.yml
+++ b/config/locales/javascript/javascript.da.yml
@@ -185,6 +185,7 @@ da:
       result: "Resultat"
       show_result: "Vis resultat"
       vote: "Stem"
+      your_vote: "Din stemme"
     profile:
       add_some: "Tilføj nogen"
       bio: "Biografi"
diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml
index 1fc156df40204e1aea1e8484414bfd52c5bbe19a..ad8dc955cbafc1a69fc82bcdb1e2c45e44ec73f3 100644
--- a/config/locales/javascript/javascript.de.yml
+++ b/config/locales/javascript/javascript.de.yml
@@ -94,7 +94,7 @@ de:
       no_comments: "Bisher sind keine Kommentare vorhanden."
       show: "Alle Kommentare zeigen"
     confirm_dialog: "Bist du dir sicher?"
-    confirm_unload: "Bitte bestätige, dass du diese Seite verlassen willst - Daten, welche du eingegeben hast würden nicht gespeichert werden."
+    confirm_unload: "Bitte bestätige, dass du diese Seite verlassen willst - Daten, welche du eingegeben hast werden nicht gespeichert."
     contacts:
       add_contact: "Kontakt hinzufügen"
       aspect_chat_is_enabled: "Kontakte in diesem Aspekt können mit dir chatten."
@@ -186,6 +186,7 @@ de:
       result: "Ergebnis"
       show_result: "Ergebnis anzeigen"
       vote: "Abstimmen"
+      your_vote: "Deine Stimme"
     profile:
       add_some: "Füge neue hinzu"
       bio: "Bio"
@@ -212,7 +213,7 @@ de:
           italic: "kursive Schrift"
           list: "Listentext hier"
           quote: "Zitattext hier"
-          strong: "wichtiger Text"
+          strong: "fetter Text"
         tooltips:
           bold: "Fett"
           cancel: "Nachricht verwerfen"
@@ -261,7 +262,7 @@ de:
       hide_nsfw_posts: "#nsfw-Beiträge verstecken"
       like: "Gefällt mir"
       likes:
-        one: " Einer Person gefällt das"
+        one: "Einer Person gefällt das"
         other: "<%= count %> Personen gefällt das"
         zero: "Niemandem gefällt das"
       limited: "Begrenzt"
diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml
index 7d68220c57a1cd26f0d262d5783a1e5986075d00..17c3a6ceb2923b2f383f72abe40c63b5159ae17f 100644
--- a/config/locales/javascript/javascript.de_formal.yml
+++ b/config/locales/javascript/javascript.de_formal.yml
@@ -185,6 +185,7 @@ de_formal:
       result: "Ergebnis"
       show_result: "Ergebnis anzeigen"
       vote: "Abstimmen"
+      your_vote: "Ihre Stimme"
     profile:
       add_some: "Füge neue hinzu"
       bio: "Beschreibung"
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index 8f4ed6953fdde063dcb8ba3a1216af117dcdd467..e89cf610918468fb8e95342c3d5782454c8ecf6f 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -344,3 +344,4 @@ en:
         other: "<%=count%> votes"
       show_result: "Show result"
       close_result: "Hide result"
+      your_vote: "Your vote"
diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml
index dbe3838f177b7e6af03d444f1e31e58f3cb347bb..1248b82d5fa7a900a87a2f466e75600d58cfdf25 100644
--- a/config/locales/javascript/javascript.es.yml
+++ b/config/locales/javascript/javascript.es.yml
@@ -186,6 +186,7 @@ es:
       result: "Resultados"
       show_result: "Mostrar resultados"
       vote: "Votar"
+      your_vote: "Tu voto"
     profile:
       add_some: "añadir algo"
       bio: "Biografía"
diff --git a/config/locales/javascript/javascript.fr.yml b/config/locales/javascript/javascript.fr.yml
index 063700e8dfc3c48068228993dfba9e08f6c3b85f..bb9525f49a5cd71f48f470b1a94ee4bcb8a072eb 100644
--- a/config/locales/javascript/javascript.fr.yml
+++ b/config/locales/javascript/javascript.fr.yml
@@ -187,6 +187,7 @@ fr:
       result: "Résultat"
       show_result: "Afficher les résultats"
       vote: "Vote"
+      your_vote: "Votre vote"
     profile:
       add_some: "ajouter"
       bio: "Biographie"
diff --git a/config/locales/javascript/javascript.ja.yml b/config/locales/javascript/javascript.ja.yml
index 77c302d88f360d29ff5b0f17b66c0765d7cb1bdb..c8585b9634008f0481783b7cf35f097e9587fd25 100644
--- a/config/locales/javascript/javascript.ja.yml
+++ b/config/locales/javascript/javascript.ja.yml
@@ -177,6 +177,7 @@ ja:
       result: "結果"
       show_result: "結果を表示する"
       vote: "投票"
+      your_vote: "あなたの投票"
     profile:
       add_some: "何かを追加"
       bio: "略歴"
diff --git a/config/locales/javascript/javascript.nb.yml b/config/locales/javascript/javascript.nb.yml
index ce481001d51f4c7e32abcd4ddbe717d7957a666c..3e4711d3bc554514ff13247d58263ee394097aa9 100644
--- a/config/locales/javascript/javascript.nb.yml
+++ b/config/locales/javascript/javascript.nb.yml
@@ -6,6 +6,55 @@
 
 nb:
   javascripts:
+    admin:
+      pods:
+        actions: "Handlinger"
+        added: "Lagt til"
+        check: "kjør tilkoblingstest"
+        errors:
+          one: "Tilkoblingstesten responderte med en feil for én belg."
+          other: "Tilkoblingstesten responderte med en feil for <%= count %> belger."
+        follow_link: "Ã¥pne lenken i nettleser"
+        last_check: "forrige kontroll:"
+        more_info: "vis mer informasjon"
+        ms:
+          one: "<%= count %>ms"
+          other: "<%= count %>ms"
+        no_info: "Ingen ekstra informasjon er tilgjengelig på dette tidspunktet"
+        not_available: "ikke tilgjengelig"
+        offline_since: "frakoblet siden:"
+        pod: "Belg"
+        recheck:
+          failure: "Kontrollen ble ikke utført."
+          success: "Denne belgen ble nettopp kontrollert en gang til."
+        response_time: "Svartid:"
+        server_software: "Tjenerprogramvare:"
+        ssl: "SSL"
+        ssl_disabled: "SSL er deaktivert"
+        ssl_enabled: "SSL er aktivert"
+        states:
+          dns_failed: "Navneresolusjon (DNS) feilet"
+          http_failed: "HTTP-tilkobling feilet"
+          net_failed: "Tilkoblingsforsøk feilet"
+          no_errors: "OK"
+          ssl_failed: "Sikker tilkobling (SSL) feilet"
+          unchecked: "Ukontrollert"
+          unknown_error: "En uspesifisert feil har oppstått i løpet av kontrollen"
+          version_failed: "Kunne ikke hente programvareversjon"
+        status: "Tilstand"
+        unchecked:
+          one: "Det finnes fortsatt en belg som ikke har blitt kontrollert i det hele tatt."
+          other: "Det finnes fortsatt <%= count %> belger som ikke har blitt kontrollert i det hele tatt."
+        unknown: "ukjent"
+        version_failed:
+          one: "Det finnes én belg som ikke har noen versjon (gammel belg, ingen NodeInfo)."
+          other: "Det finnes <%= count %> belger som ikke har noen versjoner (eldre belger, ingen NodeInfo)."
+    admins:
+      dashboard:
+        compare_versions: "Den siste diaspora*-versjonen er <%= latestVersion %>, din belg kjører <%= podVersion %>."
+        error: "Kunne ikke avgjøre siste diaspora*-versjon."
+        outdated: "Din belg er utdatert."
+        up_to_date: "Din belg er oppdatert!"
     and: "og"
     aspect_dropdown:
       add_to_aspect: "Legg til kategori"
@@ -48,6 +97,8 @@ nb:
     confirm_unload: "Bekreft at du ønsker å forlate denne siden. Data du har lagt inn vil ikke bli lagret."
     contacts:
       add_contact: "Legg til kontakt"
+      aspect_chat_is_enabled: "Kontakter i dette aspektet vil kunne chatte med deg."
+      aspect_chat_is_not_enabled: "Kontakter i dette aspektet vil ikke kunne chatte med deg."
       aspect_list_is_not_visible: "Kontakter i dette aspektet har ikke mulighet til å se hverandre"
       aspect_list_is_visible: "Kontakter i dette aspektet har mulighet til å se hverandre"
       error_add: "Kunne ikke legge til <%= name %> til aspektet :("
@@ -55,11 +106,15 @@ nb:
       remove_contact: "Fjern kontakt"
       search_no_results: "Ingen kontakter funnet"
     conversation:
+      create:
+        no_recipient: "Vent, du må legge til en mottaker først!"
       new:
         no_contacts: "Du må legge til noen kontakter før du kan starte en samtale."
     create: "Lag"
     delete: "Slett"
     edit: "Rediger"
+    errors:
+      connection: "Kunne ikke koble til tjeneren."
     failed_to_post_message: "Klarte ikke å publisere post!"
     failed_to_remove: "Noe gikk galt i forsøket på å fjerne innlegget!"
     getting_started:
@@ -82,6 +137,8 @@ nb:
       recent_notifications: "Nylige varsel"
       search: "Søk"
       settings: "Innstillinger"
+      toggle_mobile: "Slå mobiltilpasning av/på"
+      toggle_navigation: "Veksle navigasjon"
       view_all: "Vis alle"
     hide_post: "Gjem dette innlegget?"
     hide_post_failed: "Kunne ikke gjemme dette innlegget"
@@ -95,6 +152,9 @@ nb:
     notifications:
       mark_read: "Merk som lest"
       mark_unread: "Merk som ulest"
+      new_notifications:
+        one: "Du har <%= count %> varsel du ikke har lest"
+        other: "Du har <%= count %> varsler du ikke har lest"
     people:
       edit_my_profile: "Endre profilen min"
       helper:
@@ -111,7 +171,12 @@ nb:
       invalid_ext: "{file} har et ugyldig etternavn. Bare {extensions} er tillatt."
       looking_good: "Wow, du ser fantastisk ut!"
       size_error: "{file} er for stor, maksimal filstørrelse er {sizeLimit}"
+      upload_photos: "Last opp bilder"
     poll:
+      answer_count:
+        one: "Én stemme"
+        other: "<%=count%> stemmer"
+        zero: "Ingen stemmer"
       close_result: "Skjul resultat"
       count:
         one: "1 stemme til nå"
@@ -122,6 +187,7 @@ nb:
       result: "Resultat"
       show_result: "Vis resultat"
       vote: "Stem"
+      your_vote: "Din stemme"
     profile:
       add_some: "Legg til noen"
       bio: "Biografi"
@@ -146,6 +212,7 @@ nb:
           insert_link_description_text: "legg til lenkebeskrivelse her"
           insert_link_help_text: "sett inn lenke her"
           italic: "Kursiv tekst"
+          list: "listetekst her"
           quote: "sitert tekst her"
           strong: "Uthevet tekst"
         tooltips:
@@ -162,6 +229,7 @@ nb:
           quote: "Sett inn sitat"
           write: "Rediger melding"
         write: "Skriv"
+      mention_success: "Nevnte: <%= names %>"
       near_from: "Publisert fra: <%= location %>"
       option: "Valg <%= nr %>"
       question: "Spørsmål"
@@ -176,9 +244,14 @@ nb:
     reshares:
       post: "Videredel <%= name %> sitt innhold?"
       successful: "Dette innholdet ble videredelt"
+    show_all: "Vis alle"
     show_more: "vis mer"
     stream:
       comment: "Kommenter"
+      comments:
+        one: "<%= count %> kommentar"
+        other: "<%= count %> kommentarer"
+        zero: "Ingen kommentarer"
       disable_post_notifications: "Slå av varslinger for dette innlegget"
       enable_post_notifications: "Slå på varslinger for dette innlegget"
       follow: "Følg"
@@ -198,8 +271,9 @@ nb:
         one: "Vis <%= count %> kommentar til"
         other: "Vis <%= count %> komentarer til"
         zero: "Ikke flere kommentarer"
-      no_posts_yet: "Det er ingen poster å vise her ennå"
+      no_posts_yet: "Det er ingen innlegg å vise her ennå"
       original_post_deleted: "Den opprinnelige posten er slettet av forfatteren."
+      permalink: "Permalenke"
       public: "Offentlig"
       reshare: "Del"
       reshares:
@@ -227,6 +301,7 @@ nb:
       hour: "ca. en time"
       hours:
         other: "ca. %d timer"
+      inPast: "når som helst nå"
       minute: "ca. et minutt"
       minutes:
         other: "%d minutter"
diff --git a/config/locales/javascript/javascript.oc.yml b/config/locales/javascript/javascript.oc.yml
index 19730c5e379e3c4767080190c61be64a44426467..1d716df6947f05a89f5a75e89b0316065738f0be 100644
--- a/config/locales/javascript/javascript.oc.yml
+++ b/config/locales/javascript/javascript.oc.yml
@@ -15,20 +15,20 @@ oc:
           one: "Lo tèst de connexion rapòrta una error per un pod."
           other: "Lo tèst de connexion rapòrta una error per <%= count %> pods."
         follow_link: "dobrir lo ligam dins lo navigador"
-        last_check: "darrièra verificacion :"
+        last_check: "darrièra verificacion :"
         more_info: "mostrar mai d'informacion"
         ms:
           one: "<%= count %>&nbsp;ms"
           other: "<%= count %>&nbsp;ms"
         no_info: "Pas d informacion suplementària de disponibla pel moment."
         not_available: "pas disponible"
-        offline_since: "fòra linha dempuèi :"
+        offline_since: "fòra linha dempuèi :"
         pod: "Pod"
         recheck:
           failure: "La verificacion es pas estada executada."
           success: "Lo pod ven d'èsser verificat tornamai."
-        response_time: "Temps de responsa :"
-        server_software: "Logicial del servidor :"
+        response_time: "Temps de responsa :"
+        server_software: "Logicial del servidor :"
         ssl: "SSL"
         ssl_disabled: "SSL desactivada"
         ssl_enabled: "SSL activada"
@@ -59,7 +59,7 @@ oc:
     aspect_dropdown:
       add_to_aspect: "Apondre un contacte"
       all_aspects: "Totes los aspèctes"
-      error: "Impossible de partejar amb <%= name %>. Ignoratz aquesta persona ?"
+      error: "Impossible de partejar amb <%= name %>. Ignoratz aquesta persona ?"
       error_remove: "Pòt pas suprimir <%= name %> de l'aspècte :("
       mobile_row_checked: "<%= name %> (suprimir)"
       mobile_row_unchecked: "<%= name %> (apondre)"
@@ -73,15 +73,15 @@ oc:
       updating: "mesa a jorn..."
     aspect_navigation:
       add_an_aspect: "+ Apondre un aspècte"
-      deselect_all: "Deseleccionat tot"
+      deselect_all: "O deseleccionar tot"
       no_aspects: "Cap d'aspècte pas seleccionat"
-      select_all: "Seleccionar tot"
+      select_all: "O seleccionar tot"
     aspects:
       create:
         add_a_new_aspect: "Apondre un aspècte novèl"
         failure: "La creacion de l'aspècte a fracassat."
         success: "Vòstre novèl aspècte <%= name %> es estat creat"
-      make_aspect_list_visible: "Permetre als contactes d'aqueste aspècte de se veire entre eles ?"
+      make_aspect_list_visible: "Permetre als contactes d'aqueste aspècte de se veire entre eles ?"
       name: "Nom"
     bookmarklet:
       post_something: "Publicar sus diaspora*"
@@ -93,7 +93,7 @@ oc:
       hide: "Amagar los comentaris"
       no_comments: "I a pas encara cap de comentari."
       show: "Afichar totes los comentaris"
-    confirm_dialog: "Sètz segur ?"
+    confirm_dialog: "Sètz segur ?"
     confirm_unload: "Mercé de confirmar que volètz quitar aquesta pagina — las donadas sasidas seràn pas salvadas."
     contacts:
       add_contact: "Apondre aqueste contacte"
@@ -120,7 +120,7 @@ oc:
     getting_started:
       alright_ill_wait: "Bon, vau esperar."
       hey: "Adiu, <%= name %>"
-      no_tags: "È, seguissètz pas cap d’etiquetas ! Contunhar malgrat tot ?"
+      no_tags: "È, seguissètz pas cap d’etiquetas ! Contunhar malgrat tot ?"
       preparing_your_stream: "Preparacion de vòstre flux personalizat..."
     header:
       admin: "Administracion"
@@ -130,7 +130,7 @@ oc:
       help: "Ajuda"
       home: "Acuèlh"
       log_out: "Desconnexion"
-      mark_all_as_read: "Tot marcar coma legit"
+      mark_all_as_read: "O marcar tot coma legit"
       moderator: "Moderator"
       notifications: "Notificacions"
       profile: "Perfil"
@@ -139,12 +139,12 @@ oc:
       settings: "Paramètres"
       toggle_mobile: "Activar/desactivar la version mobila"
       toggle_navigation: "Afichar/amagar lo menú"
-      view_all: "Afichar tot"
-    hide_post: "Amagar aquesta publicacion ?"
+      view_all: "O veire tot"
+    hide_post: "Amagar aquesta publicacion ?"
     hide_post_failed: "Impossible d'amagar aqueste messatge"
     ignore: "Ignorar"
     ignore_failed: "Impossible d'ignorar aqueste utilizaire"
-    ignore_user: "Ignorar aqueste utilizaire ?"
+    ignore_user: "Ignorar aqueste utilizaire ?"
     my_activity: "Mon activitat"
     my_aspects: "Mos aspèctes"
     my_stream: "Flux"
@@ -188,6 +188,7 @@ oc:
       result: "Resultat"
       show_result: "Afichar lo resultat"
       vote: "Vòte"
+      your_vote: "Vòstra votacion"
     profile:
       add_some: "N'apondre"
       bio: "Biografia"
@@ -233,18 +234,18 @@ oc:
       near_from: "Postat a : <%= location %>"
       option: "Responsa"
       question: "Question"
-    remove_post: "Suprimir aqueste messatge ?"
+    remove_post: "Suprimir aqueste messatge ?"
     report:
       name: "Senhalar"
-      prompt: "Mercé de sasir un motiu :"
+      prompt: "Mercé de sasir un motiu :"
       prompt_default: "Contengut ofensant"
       status:
         created: "Lo senhalament es estat creat amb succès."
         exists: "Lo senhalament existís ja"
     reshares:
-      post: "Repartejar lo messatge de <%= name %> ?"
+      post: "Repartejar lo messatge a <%= name %> ?"
       successful: "Lo messatge es estat repartejat !"
-    show_all: "Afichar tot"
+    show_all: "O mostrar tot"
     show_more: "N'afichar mai"
     stream:
       comment: "Comentar"
@@ -281,13 +282,13 @@ oc:
         other: "<%= count %> repartiments"
         zero: "<%= count %> repartiment"
       show_nsfw_post: "Mostrar lo messatge"
-      show_nsfw_posts: "Afichar tot"
+      show_nsfw_posts: "O mostrar tot"
       tags:
         follow: "Seguir #<%= tag %>"
         follow_error: "Impossible de seguir #<%= tag %> :("
         following: "Seguiment de #<%= tag %>"
         stop_following: "Quitar de seguir #<%= tag %>"
-        stop_following_confirm: "Quitar de seguir #<%= tag %> ?"
+        stop_following_confirm: "Quitar de seguir #<%= tag %> ?"
         stop_following_error: "Impossible de quitar de seguir #<%= tag %> :("
       unfollow: "Seguir pas mai"
       unlike: "M'agrada pas mai"
diff --git a/config/locales/javascript/javascript.pl.yml b/config/locales/javascript/javascript.pl.yml
index bdf4571cebaca725a987997faa1e4dee45fe00e4..ba2a5ba7cce64b0dc1d364e3bc3d972fb4c505ac 100644
--- a/config/locales/javascript/javascript.pl.yml
+++ b/config/locales/javascript/javascript.pl.yml
@@ -14,6 +14,11 @@ pl:
         follow_link: "otwórz łącze w przeglądarce"
         last_check: "ostatnio sprawdzone:"
         more_info: "pokaż więcej informacji"
+        ms:
+          few: "<%= count %>ms"
+          many: "<%= count %>ms"
+          one: "<%= count %>ms"
+          other: "<%= count %>ms"
         no_info: "Jak dotÄ…d nie ma dodatkowych informacji"
         not_available: "niedostępne"
         offline_since: "offline od:"
@@ -32,6 +37,7 @@ pl:
           net_failed: "Nie udało się połączyć"
           no_errors: "OK"
           ssl_failed: "Nie udało się połączyć poprzez SSL"
+          unchecked: "Odznaczone"
           unknown_error: "Podczas sprawdzania wystąpił nieoczekiwany błąd"
           version_failed: "Nie udało się pobrać wersji oprogramowania"
         status: "Status"
@@ -46,7 +52,7 @@ pl:
     aspect_dropdown:
       add_to_aspect: "Dodaj kontakt"
       all_aspects: "Wszystkie aspekty"
-      error: "Nie można zacząć dzielić się z <%= name %>. Może go/ją ignorujesz?"
+      error: "Nie możesz zacząć dzielić się z <%= name %>. Może go ignorujesz?"
       error_remove: "Nie można usunąć <%= name %> z aspektu :("
       mobile_row_checked: "<%= name %> (usuń)"
       mobile_row_unchecked: "<%= name %> (dodaj)"
@@ -140,6 +146,11 @@ pl:
     notifications:
       mark_read: "Oznacz jako przeczytane"
       mark_unread: "Oznacz jako nieprzeczytane"
+      new_notifications:
+        few: "Masz <%= count %> nieprzeczytane powiadomienia"
+        many: "Masz <%= count %> nieprzeczytanych powiadomień"
+        one: "Masz <%= count %> nieprzeczytane powiadomienie"
+        other: "Liczba nieprzeczytanych powiadomień: <%= count %>"
     people:
       edit_my_profile: "Edytuj profil"
       helper:
@@ -158,6 +169,12 @@ pl:
       size_error: "{file} jest za duży. Maksymalny rozmiar pliku to {sizeLimit}."
       upload_photos: "Prześlij zdjęcia"
     poll:
+      answer_count:
+        few: "<%=count%> głosy"
+        many: "<%=count%> głosów"
+        one: "1 głos"
+        other: "<%=count%> głosy"
+        zero: "0 głosów"
       close_result: "Ukryj wynik"
       count:
         few: "<%=count%> głosy jak do tej pory"
@@ -229,6 +246,12 @@ pl:
     show_more: "wyświetl więcej"
     stream:
       comment: "Skomentuj"
+      comments:
+        few: "<%= count %> komentarze"
+        many: "<%= count %> komentarzy"
+        one: "<%= count %> komentarz"
+        other: "komentarzy: <%= count %>"
+        zero: "<%= count %> komentarzy"
       disable_post_notifications: "Wyłącz powiadomienia do tego wpisu"
       enable_post_notifications: "WÅ‚Ä…cz powiadomienia do tego wpisu"
       follow: "Obserwuj"
diff --git a/config/locales/javascript/javascript.pt-BR.yml b/config/locales/javascript/javascript.pt-BR.yml
index 74b0d55f70d38336ee6e9c95c729da74f76a3abd..5c931bc3d7414c594a6fa76cb1b7cc5585ccef13 100644
--- a/config/locales/javascript/javascript.pt-BR.yml
+++ b/config/locales/javascript/javascript.pt-BR.yml
@@ -187,6 +187,7 @@ pt-BR:
       result: "Resultado"
       show_result: "Mostrar resultado"
       vote: "Votar"
+      your_vote: "Seu voto"
     profile:
       add_some: "Adicione algumas"
       bio: "Apresentação Pessoal"
diff --git a/config/locales/javascript/javascript.ru.yml b/config/locales/javascript/javascript.ru.yml
index 295f105f248f453c58a97f3fd52e0de30f7a94ed..cf1a476a7b27f51d09c6958ecb33b807a5a9f843 100644
--- a/config/locales/javascript/javascript.ru.yml
+++ b/config/locales/javascript/javascript.ru.yml
@@ -177,6 +177,7 @@ ru:
           preview: "Предпросмотр сообщения"
           quote: "Вставить цитату"
           write: "Редактировать сообщение"
+        write: "Редактор"
       near_from: "Отправлено из: <%= location %>"
       option: "Вариант <%= nr %>"
       question: "Вопрос"
@@ -251,16 +252,28 @@ ru:
     timeago:
       day: "день"
       days:
-        other: "%d дней[-я]"
+        few: "%d дня"
+        many: "%d дней"
+        one: "день"
+        other: "%d д."
       hour: "около часа"
       hours:
+        few: "около %d часов"
+        many: "около %d часов"
+        one: "около часа"
         other: "около %d часов"
       minute: "около минуты"
       minutes:
-        other: "%d минут[-ы]"
+        few: "%d минуты"
+        many: "%d минут"
+        one: "1 минута"
+        other: "%d мин."
       month: "около месяца"
       months:
-        other: "%d месяца[-ев]"
+        few: "%d месяца"
+        many: "%d месяцев"
+        one: "месяц"
+        other: "%d месяцев"
       prefixAgo: ""
       prefixFromNow: ""
       seconds: "меньше минуты"
@@ -269,6 +282,9 @@ ru:
       wordSeparator: " "
       year: "около года"
       years:
+        few: "%d года"
+        many: "%d лет"
+        one: "год"
         other: "%d лет"
     unblock_failed: "Разблокировка пользователя не удалась"
     viewer:
diff --git a/config/locales/javascript/javascript.sc.yml b/config/locales/javascript/javascript.sc.yml
index c174b2888d2be7e59c2f71f7c36565ddc76bea4d..5ad35520f6bec0c9eaf12bd3d9383e977ba53dcf 100644
--- a/config/locales/javascript/javascript.sc.yml
+++ b/config/locales/javascript/javascript.sc.yml
@@ -6,17 +6,320 @@
 
 sc:
   javascripts:
+    admin:
+      pods:
+        actions: "Atziones"
+        added: "Annantu"
+        check: "faghe una proa de connessione"
+        errors:
+          one: "Sa proa de connessione at sinnaladu un'errore cun unu pod."
+          other: "Sa proa de connessione at sinnaladu un'errore cun <%= count %> pods."
+        follow_link: "aberi su ligàmene in s'esploradore"
+        last_check: "ùrtima verìfica:"
+        more_info: "ammustra àteras informatziones"
+        ms:
+          one: "<%= count %>ms"
+          other: "<%= count %>ms"
+        no_info: "Peruna informatzione disponìbile in prus in custu momentu"
+        not_available: "non disponìbile"
+        offline_since: "non in lìnia dae su:"
+        pod: "Pod"
+        recheck:
+          failure: "Sa verifica no est istada fata."
+          success: "Custu pod est istadu torra verificadu como pag'ora."
+        response_time: "Tempus de risposta:"
+        server_software: "Programma de su server:"
+        ssl: "SSL"
+        ssl_disabled: "SSL disabilitadu"
+        ssl_enabled: "SSL abilitadu"
+        states:
+          dns_failed: "Risolutzione de su nùmene (DNS) fallida"
+          http_failed: "Connessione HTTP fallida"
+          net_failed: "Tentativu de connessione fallidu"
+          no_errors: "AB"
+          ssl_failed: "Connessione segura (SSL) fallida"
+          unchecked: "Non verificadu"
+          unknown_error: "B'est istadu un'errore indefinidu durante sa verìfica"
+          version_failed: "Impossìbile determinare sa versione de su programma"
+        status: "Istadu"
+        unchecked:
+          one: "B'est galu unu pod chi no est istadu verificadu pro nudda."
+          other: "Bi sunt galu <%= count %> pods chi no sunt istados verificados pro nudda."
+        unknown: "disconnotu"
+        version_failed:
+          one: "B'est unu pod chi tenet una versione indefinida (pod betzu, chene NodeInfo)."
+          other: "Bi sunt <%= count %> pods chi tenent una versione indefinida (pods betzos, chene NodeInfo)."
+    admins:
+      dashboard:
+        compare_versions: "S'ùrtima versione de diaspora* est sa <%= latestVersion %>, su pod tuo tenet sa <%= podVersion %>."
+        error: "Impossìbile verificare s'ùrtima versione de diaspora*."
+        outdated: "Su pod tuo no est agiornadu."
+        up_to_date: "Su pod tuo est agiornadu!"
+    and: "e"
+    aspect_dropdown:
+      add_to_aspect: "Annanghe unu cuntatu"
+      all_aspects: "Totu sas caras"
+      error: "Impossìbile incumintzare a cumpartzire cun <%= name %>. Lu ses ignorende?"
+      error_remove: "No est istadu possìbile a bogare <%= name %> dae sa cara :("
+      mobile_row_checked: "<%= name %> (boga)"
+      mobile_row_unchecked: "<%= name %> (annanghe)"
+      select_aspects: "Issèbera sas caras"
+      started_sharing_with: "As incumintzadu a cumpartzire cun <%= name %>!"
+      stopped_sharing_with: "As acabadu de cumpartzire cun <%= name %>."
+      toggle:
+        one: "In <%= count %> cara"
+        other: "In <%= count %> caras"
+      updating: "agiornende..."
+    aspect_navigation:
+      add_an_aspect: "+ Annanghe una cara"
+      deselect_all: "Boga s'ischerta a totu"
+      no_aspects: "Peruna cara ischertada"
+      select_all: "Ischerta totu"
     aspects:
+      create:
+        add_a_new_aspect: "Annanghe una cara noa"
+        failure: "Creatzione de sa cara fallida."
+        success: "Sa cara noa tua <%= name %> est istada creada"
       make_aspect_list_visible: "Permìtere a sos cuntatos in custa cara de si bìdere unu cun s'àteru?"
+      name: "Nùmene"
+    bookmarklet:
+      post_something: "Pùblica in diaspora*"
+      post_submit: "Imbiende sa sinnalatzione..."
+      post_success: "Publicada! Serrende sa bentana popup..."
+    cancel: "Annulla"
+    comma: ","
+    comments:
+      hide: "Istichi sos cummentos"
+      no_comments: "Non bi sunt galu cummentos."
+      show: "Ammustra totu sos cummentos"
+    confirm_dialog: "Seguru ses?"
+    confirm_unload: "Pro praghere cunfirma chi cheres essire dae custa pàgina. Sos datos chi as insertadu no ant a èssere sarvados."
+    contacts:
+      add_contact: "Annanghe unu cuntatu"
+      aspect_chat_is_enabled: "Sos cuntatos in custa cara podent tzarrare cun tie."
+      aspect_chat_is_not_enabled: "Sos cuntatos in custa cara non podent tzarrare cun tie."
+      aspect_list_is_not_visible: "Sos cuntatos de custa cara non si podent bìdere intre issos."
+      aspect_list_is_visible: "Sos cuntatos de custa cara si podent bìdere intre issos."
+      error_add: "No est istadu possìbile a annànghere <%= name %> a sa cara :("
+      error_remove: "No est istadu possìbile a bogare <%= name %> dae sa cara :("
+      remove_contact: "Boga custu cuntatu"
+      search_no_results: "Perunu cuntatu agatadu"
+    conversation:
+      create:
+        no_recipient: "Depes annànghere unu retzidore, in antis!"
+      new:
+        no_contacts: "Depes annànghere carchi cuntatu in antis de pòdere fàghere incumintzare un'arresonu."
+    create: "Crea"
+    delete: "Iscantzella"
+    edit: "Acontza"
+    errors:
+      connection: "No est istadu possìbile a si connètere a su server."
+    failed_to_post_message: "Publicatzione de su messàgiu fallida!"
+    failed_to_remove: "S'intrada no est istada pòtia bogare!"
+    getting_started:
+      alright_ill_wait: "Andat bene, apo a isetare."
+      hey: "Salude, <%= name %>!"
+      no_tags: "No as isseberadu peruna eticheta! Cheres sighire su matessi?"
+      preparing_your_stream: "Ammaniende su flussu personalizadu tuo..."
     header:
+      admin: "Amministradore"
+      close: "Serra"
+      contacts: "Cuntatos"
+      conversations: "Arresonos"
+      help: "Agiudu"
+      home: "Pàgina printzipale"
+      log_out: "Essi"
+      mark_all_as_read: "Sinnala·las totu comente lèghidas"
       moderator: "Moderatore"
+      notifications: "Notìficas"
+      profile: "Profilu"
+      recent_notifications: "Notìficas reghentes"
+      search: "Chirca"
+      settings: "Impostatziones"
+      toggle_mobile: "Allughe/istuda sa versione mòbile"
+      toggle_navigation: "Allughe/istuda su menù de nàvigu"
+      view_all: "Ammustra totu"
+    hide_post: "Istichire custa publicatzione?"
+    hide_post_failed: "Impossìbile istichire custa publicatzione"
+    ignore: "Ignora"
+    ignore_failed: "Impossìbile ignorare custu impreadore"
+    ignore_user: "Ignorare custu impreadore?"
+    my_activity: "Atividade mea"
+    my_aspects: "Caras meas"
+    my_stream: "Flussu"
+    no_results: "Perunu resurtadu agatadu"
+    notifications:
+      mark_read: "Sinna·la comente lèghida"
+      mark_unread: "Sinna·la comente non lèghida"
+      new_notifications:
+        one: "Tenes <%= count %> notìfica non lèghida"
+        other: "Tenes <%= count %> notìficas non lèghidas"
+    people:
+      edit_my_profile: "Acontza su profilu meu"
+      helper:
+        is_not_sharing: "<%= name %> no est cumpartzende cun tie"
+        is_sharing: "<%= name %> est cumpartende cun tie"
+      mention: "Nùmena"
+      message: "Messàgiu"
+      not_found: "...e nemos est istadu agatadu"
+      stop_ignoring: "Acaba·la de l'ignorare"
     photo_uploader:
+      completed: "<%= file %> cumpridu"
+      empty: "{file} est bòidu, pro praghere torra a isseberare documentos chene incluire a custu."
+      error: "B'est istadu un'errore carrighende a <%= file %>"
+      invalid_ext: "{file} non tenet un'estensione vàlida. Petzi {extensions} sunt permissos."
+      looking_good: "Eh, raju, ses in forma perfeta!"
+      size_error: "{file} est tropu mannu, sa mannària màssima est de {sizeLimit}."
       upload_photos: "Càrriga fotografias"
+    poll:
+      answer_count:
+        one: "1 votu"
+        other: "<%=count%> votos"
+        zero: "0 votos"
+      close_result: "Istichi sos risultados"
+      count:
+        one: "1 votu finas a como"
+        other: "<%=count%> votos finas a como"
+      go_to_original_post: "Podes leare parte a custu sondàgiu in sa <%= original_post_link %>."
+      original_post: "publicatzione originale"
+      result: "Risultados"
+      show_result: "Ammustra sos risultados"
+      vote: "Vota"
+      your_vote: "Su votu tuo"
+    profile:
+      add_some: "Annanghe·nde una paia"
+      bio: "Biografia"
+      born: "Die de nàschida"
+      contacts: "Cuntatos"
+      edit: "Acontza"
+      gender: "Gènere"
+      location: "Positzione"
+      photos: "Fotografias"
+      posts: "Publicatziones"
+      you_have_no_tags: "Non tenes etichetas!"
     publisher:
+      add_option: "Annanghe una risposta"
+      markdown_editor:
+        preview: "Anteprima"
+        texts:
+          code: "còdighe inoghe"
+          heading: "testu de tìtulu"
+          insert_image_description_text: "inserta sa descritzione de s'immàgine inoghe"
+          insert_image_help_text: "inserta su ligàmene de s'immàgine inoghe"
+          insert_image_title: "inserta su tìtulu de s'immàgine inoghe"
+          insert_link_description_text: "inserta una descritzione pro su ligàmene inoghe"
+          insert_link_help_text: "Inserta su ligàmene inoghe"
+          italic: "testu in corsivu"
+          list: "testu de sa lista inoghe"
+          quote: "testu de sa tzitatzione inoghe"
+          strong: "testu in grassetu"
+        tooltips:
+          bold: "Grassetu"
+          cancel: "Iscantzella su messàgiu"
+          code: "Inserta còdighe"
+          heading: "Tìtulu"
+          insert_image: "Inserta un'immàgine"
+          insert_link: "Inserta unu ligàmene"
+          insert_ordered_list: "Inserta una lista ordinata"
+          insert_unordered_list: "Inserta una lista non ordinata"
+          italic: "Corsivu"
+          preview: "Anteprima de su messàgiu"
+          quote: "Inserta una tzitatzione"
+          write: "Acontza su messàgiu"
+        write: "Iscrie"
       mention_success: "Etichetados curretamente: <%= names %>"
+      near_from: "Publicada in: <%= location %>"
+      option: "Risposta"
+      question: "Pregunta"
+    remove_post: "Bogare custa publicatzione?"
+    report:
+      name: "Sinnala"
+      prompt: "Pro praghere iscrie sa resone:"
+      prompt_default: "p. es. cuntenutu ofensivu"
+      status:
+        created: "Sa sinnalatzione st istada creada cun sutzessu"
+        exists: "Custa sinnalatzione esistit giai"
+    reshares:
+      post: "Torrare a cumpartzire sa publicatzione de <%= name %>?"
+      successful: "Sa cumpartzidura de sa publicatzione est resissida!"
     show_all: "Ammustra totu"
+    show_more: "Ammustra de prus"
+    stream:
+      comment: "Cummenta"
+      comments:
+        one: "<%= count %> cummentu"
+        other: "<%= count %> cummentos"
+        zero: "<%= count %> cummentos"
+      disable_post_notifications: "Disabìlita sas notìficas pro custa publicatzione"
+      enable_post_notifications: "Abìlita sas notìficas pro custa publicatzione"
+      follow: "Sighi"
+      followed_tag:
+        add_a_tag: "Annanghe un'eticheta"
+        follow: "Sighi"
+        title: "#Etichetas sighidas"
+      hide: "Istichi"
+      hide_nsfw_posts: "Istichi sas publicatziones #nsfw"
+      like: "M'agradat"
+      likes:
+        one: "<%= count %> agradessimentu"
+        other: "<%= count %> agradessimentos"
+        zero: "<%= count %> agradessimentos"
+      limited: "Limitadu"
+      more_comments:
+        one: "Ammustra <%= count %> àteru cummentu"
+        other: "Ammustra àteros <%= count %> cummentos"
+        zero: "Ammustra àteros <%= count %> cummentos"
+      no_posts_yet: "Non bi sunt galu publicatziones de ammustrare."
+      original_post_deleted: "Publicatzione originale iscantzellada dae s'autore"
+      permalink: "Ligàmene permanente"
+      public: "Pùblicu"
+      reshare: "Torra a cumpartzire"
+      reshares:
+        one: "<%= count %> cumpartzidura"
+        other: "<%= count %> cumpartziduras"
+        zero: "<%= count %> cumpartziduras"
+      show_nsfw_post: "Ammustra sa publicatzione"
+      show_nsfw_posts: "Ammustra totu"
+      tags:
+        follow: "Sighi #<%= tag %>"
+        follow_error: "No est istadu possìbile a incumintzare a sighire a #<%= tag %> :("
+        following: "Ses sighende a #<%= tag %>"
+        stop_following: "Acaba·la de sighire a #<%= tag %>"
+        stop_following_confirm: "Acabare de sighire a #<%= tag %>?"
+        stop_following_error: "No est istadu possìbile a acabare de sighire a #<%= tag %> :("
+      unfollow: "Non la sighire prus"
+      unlike: "Non m'agradat prus"
+      via: "pro mèdiu de <%= provider %>"
+    tags:
+      wasnt_that_interesting: "AB, immàgino chi #<%= tagName %> non fiat meda interessante..."
     timeago:
-      prefixAgo: ""
-      prefixFromNow: ""
-      suffixAgo: ""
-      suffixFromNow: ""
\ No newline at end of file
+      day: "una die"
+      days:
+        one: "1 die"
+        other: "%d dies"
+      hour: "pagu prus o mancu un'ora"
+      hours:
+        one: "pagu prus o mancu 1 ora"
+        other: "pagu prus o mancu %d oras"
+      inPast: "chitzo"
+      minute: "pagu prus o mancu unu minutu"
+      minutes:
+        one: "1 minutu"
+        other: "%d minutos"
+      month: "pagu prus o mancu unu mese"
+      months:
+        one: "1 mese"
+        other: "%d meses"
+      prefixAgo: " "
+      prefixFromNow: " "
+      seconds: "de mancu de unu minutu"
+      suffixAgo: "fàghet"
+      suffixFromNow: "dae como"
+      wordSeparator: " "
+      year: "pagu prus o mancu un annu"
+      years:
+        one: "1 annu"
+        other: "%d annos"
+    unblock_failed: "Su tentativu de isblocare custu impreadore est fallidu"
+    viewer:
+      reshared: "Torrada a cumparzire"
\ No newline at end of file
diff --git a/config/locales/javascript/javascript.zh-TW.yml b/config/locales/javascript/javascript.zh-TW.yml
index 80c037f24543f8fc5ebcf68b2d64d743ca60a8b6..8c12afe5c63ff450153c9b31323e922d7eebbaac 100644
--- a/config/locales/javascript/javascript.zh-TW.yml
+++ b/config/locales/javascript/javascript.zh-TW.yml
@@ -178,6 +178,7 @@ zh-TW:
       result: "結果"
       show_result: "顯示結果"
       vote: "投票"
+      your_vote: "你的投票"
     profile:
       add_some: "加入一些"
       bio: "自我介紹"
diff --git a/config/logging.rb b/config/logging.rb
index 230ea81170ef6f7494ffa5cfe21b83b175a3343b..60ab999df991ba11f759fb36e7c89003184c07cd 100644
--- a/config/logging.rb
+++ b/config/logging.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Logging::Rails.configure do |config|
   # Configure the Logging framework with the default log levels
   Logging.init %w(debug info warn error fatal)
diff --git a/config/routes.rb b/config/routes.rb
index 82d9afc9140547a3ae994cef7ae9ab1ce5c44936..28ca010f60ebfcd16bab7df7d95ac12f9ca366df 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/config/spring.rb b/config/spring.rb
index 0598e88c309d7fac1aaed6d8fa40c702df49b31d..650a73ca0e52a0c38e004c197d68bd96df43bdc2 100644
--- a/config/spring.rb
+++ b/config/spring.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 %w[
   .ruby-version
   .rbenv-vars
diff --git a/config/unicorn.rb b/config/unicorn.rb
index 078797201cf4ecf26e0f9892edd66d5add62febe..57c0385466bda0e4d1d5e0ea17b54574238572ca 100644
--- a/config/unicorn.rb
+++ b/config/unicorn.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require_relative "load_config"
 
 port = ENV["PORT"]
diff --git a/db/migrate/0000_create_schema.rb b/db/migrate/0000_create_schema.rb
index a6393fd4066c26e88b498d079b370d1f73c3d20c..e739533602d67aa065f3d218ea2d314d8160fdd9 100644
--- a/db/migrate/0000_create_schema.rb
+++ b/db/migrate/0000_create_schema.rb
@@ -1,9 +1,12 @@
+# frozen_string_literal: true
+
 class CreateSchema < ActiveRecord::Migration[4.2]
   # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/LineLength, Layout/ExtraSpacing
   def up
     create_table :account_deletions do |t|
-      t.string  :diaspora_handle
-      t.integer :person_id
+      t.string   :diaspora_handle
+      t.integer  :person_id
+      t.datetime :completed_at
     end
 
     create_table :aspect_memberships do |t|
@@ -14,54 +17,103 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     add_index :aspect_memberships, %i[aspect_id contact_id], name: :index_aspect_memberships_on_aspect_id_and_contact_id, unique: true
-    add_index :aspect_memberships, [:aspect_id], name: :index_aspect_memberships_on_aspect_id
-    add_index :aspect_memberships, [:contact_id], name: :index_aspect_memberships_on_contact_id
+    add_index :aspect_memberships, :aspect_id, name: :index_aspect_memberships_on_aspect_id
+    add_index :aspect_memberships, :contact_id, name: :index_aspect_memberships_on_contact_id
 
     create_table :aspect_visibilities do |t|
       t.integer  :shareable_id,                    null: false
       t.integer  :aspect_id,                       null: false
-      t.datetime :created_at,                      null: false
-      t.datetime :updated_at,                      null: false
       t.string   :shareable_type, default: "Post", null: false
     end
 
-    add_index :aspect_visibilities, [:aspect_id], name: :index_aspect_visibilities_on_aspect_id
-    add_index :aspect_visibilities, %i[shareable_id shareable_type aspect_id], name: :shareable_and_aspect_id, length: {shareable_type: 189}, using: :btree
-    add_index :aspect_visibilities, %i[shareable_id shareable_type], name: :index_aspect_visibilities_on_shareable_id_and_shareable_type, length: {shareable_type: 190}, using: :btree
+    add_index :aspect_visibilities, :aspect_id, name: :index_aspect_visibilities_on_aspect_id
+    add_index :aspect_visibilities, %i[shareable_id shareable_type aspect_id], name: :shareable_and_aspect_id, length: {shareable_type: 189}
+    add_index :aspect_visibilities, %i[shareable_id shareable_type], name: :index_aspect_visibilities_on_shareable_id_and_shareable_type, length: {shareable_type: 190}
 
     create_table :aspects do |t|
-      t.string   :name,                            null: false
-      t.integer  :user_id,                         null: false
-      t.datetime :created_at,                      null: false
-      t.datetime :updated_at,                      null: false
-      t.boolean  :contacts_visible, default: true, null: false
+      t.string   :name,                             null: false
+      t.integer  :user_id,                          null: false
+      t.datetime :created_at,                       null: false
+      t.datetime :updated_at,                       null: false
+      t.boolean  :contacts_visible, default: true,  null: false
       t.integer  :order_id
+      t.boolean  :chat_enabled,     default: false
     end
 
     add_index :aspects, %i[user_id contacts_visible], name: :index_aspects_on_user_id_and_contacts_visible
-    add_index :aspects, [:user_id], name: :index_aspects_on_user_id
+    add_index :aspects, :user_id, name: :index_aspects_on_user_id
+
+    create_table :authorizations do |t|
+      t.integer  :user_id
+      t.integer  :o_auth_application_id
+      t.string   :refresh_token
+      t.string   :code
+      t.string   :redirect_uri
+      t.string   :nonce
+      t.string   :scopes
+      t.boolean  :code_used,             default: false
+      t.datetime :created_at,                            null: false
+      t.datetime :updated_at,                            null: false
+    end
+
+    add_index :authorizations, :user_id, name: :index_authorizations_on_user_id
+    add_index :authorizations, :o_auth_application_id, name: :index_authorizations_on_o_auth_application_id
 
     create_table :blocks do |t|
       t.integer :user_id
       t.integer :person_id
     end
 
+    create_table :chat_contacts do |t|
+      t.integer :user_id,                  null: false
+      ## JID <= 3071 bytes http://tools.ietf.org/html/rfc6122
+      t.string  :jid,                      null: false
+      t.string  :name,         limit: 255, null: true
+      t.string  :ask,          limit: 128, null: true
+      t.string  :subscription, limit: 128, null: false
+    end
+
+    add_index :chat_contacts, %i[user_id jid], name: :index_chat_contacts_on_user_id_and_jid, length: {jid: 190}, unique: true
+
+    create_table :chat_fragments do |t|
+      t.integer :user_id,               null: false
+      t.string  :root,      limit: 256, null: false
+      t.string  :namespace, limit: 256, null: false
+      t.text    :xml,                   null: false
+    end
+
+    add_index :chat_fragments, :user_id, name: :index_chat_fragments_on_user_id, unique: true
+
+    create_table :chat_offline_messages do |t|
+      t.string   :from,       null: false
+      t.string   :to,         null: false
+      t.text     :message,    null: false
+      t.datetime :created_at, null: false
+    end
+
+    create_table :comment_signatures, id: false do |t|
+      t.integer :comment_id,         null: false
+      t.text    :author_signature,   null: false
+      t.integer :signature_order_id, null: false
+      t.text    :additional_data
+    end
+
+    add_index :comment_signatures, :comment_id, name: :index_comment_signatures_on_comment_id, unique: true
+
     create_table :comments do |t|
       t.text     :text,                                               null: false
       t.integer  :commentable_id,                                     null: false
       t.integer  :author_id,                                          null: false
       t.string   :guid,                                               null: false
-      t.text     :author_signature
-      t.text     :parent_author_signature
       t.datetime :created_at,                                         null: false
       t.datetime :updated_at,                                         null: false
       t.integer  :likes_count,                       default: 0,      null: false
       t.string   :commentable_type,       limit: 60, default: "Post", null: false
     end
 
-    add_index :comments, [:author_id], name: :index_comments_on_person_id
+    add_index :comments, :author_id, name: :index_comments_on_person_id
     add_index :comments, %i[commentable_id commentable_type], name: :index_comments_on_commentable_id_and_commentable_type
-    add_index :comments, [:guid], name: :index_comments_on_guid, length: {guid: 191}, using: :btree, unique: true
+    add_index :comments, :guid, name: :index_comments_on_guid, length: {guid: 191}, unique: true
 
     create_table :contacts do |t|
       t.integer  :user_id,                    null: false
@@ -72,7 +124,7 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.boolean  :receiving,  default: false, null: false
     end
 
-    add_index :contacts, [:person_id], name: :index_contacts_on_person_id
+    add_index :contacts, :person_id, name: :index_contacts_on_person_id
     add_index :contacts, %i[user_id person_id], name: :index_contacts_on_user_id_and_person_id, unique: true
 
     create_table :conversation_visibilities do |t|
@@ -84,8 +136,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     add_index :conversation_visibilities, %i[conversation_id person_id], name: :index_conversation_visibilities_usefully, unique: true
-    add_index :conversation_visibilities, [:conversation_id], name: :index_conversation_visibilities_on_conversation_id
-    add_index :conversation_visibilities, [:person_id], name: :index_conversation_visibilities_on_person_id
+    add_index :conversation_visibilities, :conversation_id, name: :index_conversation_visibilities_on_conversation_id
+    add_index :conversation_visibilities, :person_id, name: :index_conversation_visibilities_on_person_id
 
     create_table :conversations do |t|
       t.string   :subject
@@ -95,7 +147,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :updated_at, null: false
     end
 
-    add_index :conversations, [:author_id], name: :conversations_author_id_fk
+    add_index :conversations, :guid, name: :index_conversations_on_guid, length: 191, unique: true
+    add_index :conversations, :author_id, name: :conversations_author_id_fk
 
     create_table :invitation_codes do |t|
       t.string   :token
@@ -105,39 +158,29 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :updated_at, null: false
     end
 
-    create_table :invitations do |t|
-      t.text     :message
-      t.integer  :sender_id
-      t.integer  :recipient_id
-      t.integer  :aspect_id
-      t.datetime :created_at,                   null: false
-      t.datetime :updated_at,                   null: false
-      t.string   :service
-      t.string   :identifier
-      t.boolean  :admin,        default: false
-      t.string   :language,     default: "en"
+    create_table :like_signatures, id: false do |t|
+      t.integer :like_id,            null: false
+      t.text    :author_signature,   null: false
+      t.integer :signature_order_id, null: false
+      t.text    :additional_data
     end
 
-    add_index :invitations, [:aspect_id], name: :index_invitations_on_aspect_id
-    add_index :invitations, [:recipient_id], name: :index_invitations_on_recipient_id
-    add_index :invitations, [:sender_id], name: :index_invitations_on_sender_id
+    add_index :like_signatures, :like_id, name: :index_like_signatures_on_like_id, unique: true
 
     create_table :likes do |t|
       t.boolean  :positive,                           default: true
       t.integer  :target_id
       t.integer  :author_id
       t.string   :guid
-      t.text     :author_signature
-      t.text     :parent_author_signature
       t.datetime :created_at,                                        null: false
       t.datetime :updated_at,                                        null: false
       t.string   :target_type,             limit: 60,                null: false
     end
 
-    add_index :likes, [:author_id], name: :likes_author_id_fk
-    add_index :likes, [:guid], name: :index_likes_on_guid, length: {guid: 191}, using: :btree, unique: true
+    add_index :likes, :author_id, name: :likes_author_id_fk
+    add_index :likes, :guid, name: :index_likes_on_guid, length: {guid: 191}, unique: true
     add_index :likes, %i[target_id author_id target_type], name: :index_likes_on_target_id_and_author_id_and_target_type, unique: true
-    add_index :likes, [:target_id], name: :index_likes_on_post_id
+    add_index :likes, :target_id, name: :index_likes_on_post_id
 
     create_table :locations do |t|
       t.string   :address
@@ -154,8 +197,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     add_index :mentions, %i[person_id post_id], name: :index_mentions_on_person_id_and_post_id, unique: true
-    add_index :mentions, [:person_id], name: :index_mentions_on_person_id
-    add_index :mentions, [:post_id], name: :index_mentions_on_post_id
+    add_index :mentions, :person_id, name: :index_mentions_on_person_id
+    add_index :mentions, :post_id, name: :index_mentions_on_post_id
 
     create_table :messages do |t|
       t.integer  :conversation_id,         null: false
@@ -165,11 +208,11 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :created_at,              null: false
       t.datetime :updated_at,              null: false
       t.text     :author_signature
-      t.text     :parent_author_signature
     end
 
-    add_index :messages, [:author_id], name: :index_messages_on_author_id
-    add_index :messages, [:conversation_id], name: :messages_conversation_id_fk
+    add_index :messages, :guid, name: :index_messages_on_guid, length: 191, unique: true
+    add_index :messages, :author_id, name: :index_messages_on_author_id
+    add_index :messages, :conversation_id, name: :messages_conversation_id_fk
 
     create_table :notification_actors do |t|
       t.integer  :notification_id
@@ -179,8 +222,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     add_index :notification_actors, %i[notification_id person_id], name: :index_notification_actors_on_notification_id_and_person_id, unique: true
-    add_index :notification_actors, [:notification_id], name: :index_notification_actors_on_notification_id
-    add_index :notification_actors, [:person_id], name: :index_notification_actors_on_person_id
+    add_index :notification_actors, :notification_id, name: :index_notification_actors_on_notification_id
+    add_index :notification_actors, :person_id, name: :index_notification_actors_on_person_id
 
     create_table :notifications do |t|
       t.string   :target_type
@@ -192,34 +235,78 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.string   :type
     end
 
-    add_index :notifications, [:recipient_id], name: :index_notifications_on_recipient_id
-    add_index :notifications, [:target_id], name: :index_notifications_on_target_id
-    add_index :notifications, %i[target_type target_id], name: :index_notifications_on_target_type_and_target_id, length: {target_type: 190}, using: :btree
+    add_index :notifications, :recipient_id, name: :index_notifications_on_recipient_id
+    add_index :notifications, :target_id, name: :index_notifications_on_target_id
+    add_index :notifications, %i[target_type target_id], name: :index_notifications_on_target_type_and_target_id, length: {target_type: 190}
+
+    create_table :o_auth_access_tokens do |t|
+      t.integer  :authorization_id
+      t.string   :token
+      t.datetime :expires_at
+      t.datetime :created_at,                                 null: false
+      t.datetime :updated_at,                                 null: false
+    end
+
+    add_index :o_auth_access_tokens, :authorization_id, name: :index_o_auth_access_tokens_on_authorization_id
+    add_index :o_auth_access_tokens, :token, name: :index_o_auth_access_tokens_on_token, length: {token: 191}, unique: true
+
+    create_table :o_auth_applications do |t|
+      t.integer  :user_id
+      t.string   :client_id
+      t.string   :client_secret
+      t.string   :client_name
+      t.text     :redirect_uris
+      t.string   :response_types
+      t.string   :grant_types
+      t.string   :application_type,           default: "web"
+      t.string   :contacts
+      t.string   :logo_uri
+      t.string   :client_uri
+      t.string   :policy_uri
+      t.string   :tos_uri
+      t.string   :sector_identifier_uri
+      t.string   :token_endpoint_auth_method
+      t.text     :jwks
+      t.string   :jwks_uri
+      t.boolean  :ppid,                       default: false
+      t.datetime :created_at,                                 null: false
+      t.datetime :updated_at,                                 null: false
+    end
+
+    add_index :o_auth_applications, :user_id, name: :index_o_auth_applications_on_user_id
+    add_index :o_auth_applications, :client_id, name: :index_o_auth_applications_on_client_id, length: {client_id: 191}, unique: true
+
+    create_table :open_graph_caches do |t|
+      t.string :title
+      t.string :ob_type
+      t.text   :image
+      t.text   :url
+      t.text   :description
+    end
 
     create_table :o_embed_caches do |t|
       t.string :url,  limit: 1024, null: false
       t.text   :data,              null: false
     end
 
-    add_index :o_embed_caches, [:url], name: :index_o_embed_caches_on_url, length: {url: 191}, using: :btree
+    add_index :o_embed_caches, :url, name: :index_o_embed_caches_on_url, length: {url: 191}
 
     create_table :participations do |t|
       t.string   :guid
       t.integer  :target_id
       t.string   :target_type,             limit: 60, null: false
       t.integer  :author_id
-      t.text     :author_signature
-      t.text     :parent_author_signature
       t.datetime :created_at,                         null: false
       t.datetime :updated_at,                         null: false
+      t.integer  :count,       default: 1,            null: false
     end
 
-    add_index :participations, [:guid], name: :index_participations_on_guid, length: {guid: 191}, using: :btree
-    add_index :participations, %i[target_id target_type author_id], name: :index_participations_on_target_id_and_target_type_and_author_id
+    add_index :participations, :guid, name: :index_participations_on_guid, length: {guid: 191}
+    add_index :participations, :author_id, name: :index_participations_on_author_id
+    add_index :participations, %i[target_id target_type author_id], name: :index_participations_on_target_id_and_target_type_and_author_id, unique: true
 
     create_table :people do |t|
       t.string   :guid,                                  null: false
-      t.text     :url,                                   null: false
       t.string   :diaspora_handle,                       null: false
       t.text     :serialized_public_key,                 null: false
       t.integer  :owner_id
@@ -227,17 +314,16 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :updated_at,                            null: false
       t.boolean  :closed_account,        default: false
       t.integer  :fetch_status,          default: 0
+      t.integer  :pod_id
     end
 
-    add_index :people, [:diaspora_handle], name: :index_people_on_diaspora_handle, unique: true, length: {diaspora_handle: 191}
-    add_index :people, [:guid], name: :index_people_on_guid, length: {guid: 191}, using: :btree, unique: true
-    add_index :people, [:owner_id], name: :index_people_on_owner_id, unique: true
+    add_index :people, :diaspora_handle, name: :index_people_on_diaspora_handle, unique: true, length: {diaspora_handle: 191}
+    add_index :people, :guid, name: :index_people_on_guid, length: {guid: 191}, unique: true
+    add_index :people, :owner_id, name: :index_people_on_owner_id, unique: true
 
     create_table :photos do |t|
-      t.integer  :tmp_old_id
       t.integer  :author_id,                           null: false
       t.boolean  :public,              default: false, null: false
-      t.string   :diaspora_handle
       t.string   :guid,                                null: false
       t.boolean  :pending,             default: false, null: false
       t.text     :text
@@ -254,56 +340,109 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.integer  :width
     end
 
-    add_index :photos, [:status_message_guid], name: :index_photos_on_status_message_guid, length: {status_message_guid: 191}, using: :btree
+    add_index :photos, :guid, name: :index_photos_on_guid, length: 191, unique: true
+    add_index :photos, :status_message_guid, name: :index_photos_on_status_message_guid, length: {status_message_guid: 191}
 
     create_table :pods do |t|
       t.string   :host
       t.boolean  :ssl
-      t.datetime :created_at, null: false
-      t.datetime :updated_at, null: false
+      t.datetime :created_at,                              null: false
+      t.datetime :updated_at,                              null: false
+      t.integer  :status,        default: 0
+      t.datetime :checked_at,    default: Time.zone.at(0)
+      t.datetime :offline_since, default: nil
+      t.integer  :response_time, default: -1
+      t.string   :software
+      t.string   :error
+      t.integer  :port
+      t.boolean  :blocked,       default: false
     end
 
+    add_index :pods, :status, name: :index_pods_on_status
+    add_index :pods, :checked_at, name: :index_pods_on_checked_at
+    add_index :pods, :offline_since, name: :index_pods_on_offline_since
+    add_index :pods, %i[host port], name: :index_pods_on_host_and_port, length: {host: 190}, unique: true
+
+    create_table :poll_answers do |t|
+      t.string  :answer,                 null: false
+      t.integer :poll_id,                null: false
+      t.string  :guid
+      t.integer :vote_count, default: 0
+    end
+
+    add_index :poll_answers, :guid, name: :index_poll_answers_on_guid, length: 191, unique: true
+    add_index :poll_answers, :poll_id, name: :index_poll_answers_on_poll_id
+
+    create_table :poll_participation_signatures, id: false do |t|
+      t.integer :poll_participation_id, null: false
+      t.text    :author_signature,       null: false
+      t.integer :signature_order_id,     null: false
+      t.text    :additional_data
+    end
+
+    add_index :poll_participation_signatures, :poll_participation_id, name: :index_poll_participation_signatures_on_poll_participation_id, unique: true
+
+    create_table :poll_participations do |t|
+      t.integer    :poll_answer_id,          null: false
+      t.integer    :author_id,               null: false
+      t.integer    :poll_id,                 null: false
+      t.string     :guid
+      t.timestamps
+    end
+
+    add_index :poll_participations, :guid, name: :index_poll_participations_on_guid, length: 191, unique: true
+    add_index :poll_participations, :poll_id, name: :index_poll_participations_on_poll_id
+
+    create_table :polls do |t|
+      t.string     :question,          null: false
+      t.integer    :status_message_id, null: false
+      t.boolean    :status
+      t.string     :guid
+      t.timestamps
+    end
+
+    add_index :polls, :guid, name: :index_polls_on_guid, length: 191, unique: true
+    add_index :polls, :status_message_id, name: :index_polls_on_status_message_id
+
     create_table :posts do |t|
       t.integer  :author_id,                                        null: false
       t.boolean  :public,                           default: false, null: false
-      t.string   :diaspora_handle
       t.string   :guid,                                             null: false
-      t.boolean  :pending,                          default: false, null: false
       t.string   :type,                  limit: 40,                 null: false
       t.text     :text
-      t.text     :remote_photo_path
-      t.string   :remote_photo_name
-      t.string   :random_string
-      t.string   :processed_image
       t.datetime :created_at,                                       null: false
       t.datetime :updated_at,                                       null: false
-      t.string   :unprocessed_image
-      t.string   :object_url
-      t.string   :image_url
-      t.integer  :image_height
-      t.integer  :image_width
       t.string   :provider_display_name
-      t.string   :actor_url
-      t.string   :objectId
-      t.string   :root_guid,             limit: 30
-      t.string   :status_message_guid
+      t.string   :root_guid
       t.integer  :likes_count,                      default: 0
       t.integer  :comments_count,                   default: 0
       t.integer  :o_embed_cache_id
       t.integer  :reshares_count,                   default: 0
       t.datetime :interacted_at
-      t.string   :frame_name
-      t.boolean  :favorite,                         default: false
+      t.string   :facebook_id
+      t.string   :tweet_id
+      t.integer  :open_graph_cache_id
+      t.text     :tumblr_ids
     end
 
-    add_index :posts, %i[author_id root_guid], name: :index_posts_on_author_id_and_root_guid, length: {root_guid: 30}, using: :btree, unique: true
-    add_index :posts, [:author_id], name: :index_posts_on_person_id
-    add_index :posts, [:guid], name: :index_posts_on_guid, length: {guid: 191}, using: :btree, unique: true
+    add_index :posts, %i[id type], name: :index_posts_on_id_and_type
+    add_index :posts, %i[author_id root_guid], name: :index_posts_on_author_id_and_root_guid, length: {root_guid: 190}, unique: true
+    add_index :posts, :author_id, name: :index_posts_on_person_id
+    add_index :posts, :guid, name: :index_posts_on_guid, length: {guid: 191}, unique: true
     add_index :posts, %i[id type created_at], name: :index_posts_on_id_and_type_and_created_at
-    add_index :posts, [:root_guid], name: :index_posts_on_root_guid, length: {root_guid: 30}
-    add_index :posts, %i[status_message_guid pending], name: :index_posts_on_status_message_guid_and_pending, length: {status_message_guid: 190}, using: :btree
-    add_index :posts, [:status_message_guid], name: :index_posts_on_status_message_guid, length: {status_message_guid: 191}, using: :btree
-    add_index :posts, %i[type pending id], name: :index_posts_on_type_and_pending_and_id
+    add_index :posts, :root_guid, name: :index_posts_on_root_guid, length: {root_guid: 191}
+    add_index :posts, :tweet_id, name: :index_posts_on_tweet_id, length: {tweet_id: 191}
+
+    create_table :ppid do |t|
+      t.integer :o_auth_application_id
+      t.integer :user_id
+      t.string :guid,       limit: 32
+      t.string :string,     limit: 32
+      t.string :identifier
+    end
+
+    add_index :ppid, :o_auth_application_id, name: :index_ppid_on_o_auth_application_id
+    add_index :ppid, :user_id, name: :index_ppid_on_user_id
 
     create_table :profiles do |t|
       t.string   :diaspora_handle
@@ -322,11 +461,12 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.string   :location
       t.string   :full_name,        limit: 70
       t.boolean  :nsfw,                         default: false
+      t.boolean  :public_details,               default: false
     end
 
     add_index :profiles, %i[full_name searchable], name: :index_profiles_on_full_name_and_searchable
-    add_index :profiles, [:full_name], name: :index_profiles_on_full_name
-    add_index :profiles, [:person_id], name: :index_profiles_on_person_id
+    add_index :profiles, :full_name, name: :index_profiles_on_full_name
+    add_index :profiles, :person_id, name: :index_profiles_on_person_id
 
     create_table :rails_admin_histories do |t|
       t.text     :message
@@ -341,6 +481,17 @@ class CreateSchema < ActiveRecord::Migration[4.2]
 
     add_index :rails_admin_histories, %i[item table month year], name: :index_rails_admin_histories, length: {table: 188}
 
+    create_table :reports do |t|
+      t.integer :item_id,                   null: false
+      t.string  :item_type,                 null: false
+      t.boolean :reviewed, default: false
+      t.text    :text
+      t.timestamps
+      t.integer :user_id,                   null: false
+    end
+
+    add_index :reports, :item_id, name: :index_reports_on_item_id
+
     create_table :roles do |t|
       t.integer  :person_id
       t.string   :name
@@ -359,22 +510,34 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :updated_at,                null: false
     end
 
-    add_index :services, %i[type uid], name: :index_services_on_type_and_uid, length: {type: 64, uid: 127}, using: :btree
-    add_index :services, [:user_id], name: :index_services_on_user_id
+    add_index :services, %i[type uid], name: :index_services_on_type_and_uid, length: {type: 64, uid: 127}
+    add_index :services, :user_id, name: :index_services_on_user_id
 
     create_table :share_visibilities do |t|
       t.integer  :shareable_id,                               null: false
-      t.datetime :created_at,                                 null: false
-      t.datetime :updated_at,                                 null: false
       t.boolean  :hidden,                    default: false,  null: false
-      t.integer  :contact_id,                                 null: false
       t.string   :shareable_type, limit: 60, default: "Post", null: false
+      t.integer  :user_id,                                    null: false
+    end
+
+    add_index :share_visibilities, :user_id, name: :index_share_visibilities_on_user_id
+    add_index :share_visibilities, %i[shareable_id shareable_type user_id], name: :shareable_and_user_id
+    add_index :share_visibilities, %i[shareable_id shareable_type hidden user_id], name: :shareable_and_hidden_and_user_id
+    add_index :share_visibilities, :shareable_id, name: :index_post_visibilities_on_post_id
+
+    create_table :signature_orders do |t|
+      t.string :order, null: false
+    end
+
+    add_index :signature_orders, :order, name: :index_signature_orders_on_order, length: 191, unique: true
+
+    create_table :simple_captcha_data do |t|
+      t.string     :key,   limit: 40
+      t.string     :value, limit: 12
+      t.timestamps
     end
 
-    add_index :share_visibilities, [:contact_id], name: :index_post_visibilities_on_contact_id
-    add_index :share_visibilities, %i[shareable_id shareable_type contact_id], name: :shareable_and_contact_id
-    add_index :share_visibilities, %i[shareable_id shareable_type hidden contact_id], name: :shareable_and_hidden_and_contact_id
-    add_index :share_visibilities, [:shareable_id], name: :index_post_visibilities_on_post_id
+    add_index :simple_captcha_data, :key, name: :idx_key
 
     create_table :tag_followings do |t|
       t.integer  :tag_id,     null: false
@@ -384,8 +547,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     add_index :tag_followings, %i[tag_id user_id], name: :index_tag_followings_on_tag_id_and_user_id, unique: true
-    add_index :tag_followings, [:tag_id], name: :index_tag_followings_on_tag_id
-    add_index :tag_followings, [:user_id], name: :index_tag_followings_on_user_id
+    add_index :tag_followings, :tag_id, name: :index_tag_followings_on_tag_id
+    add_index :tag_followings, :user_id, name: :index_tag_followings_on_user_id
 
     create_table :taggings do |t|
       t.integer  :tag_id
@@ -397,16 +560,17 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.datetime :created_at
     end
 
-    add_index :taggings, [:created_at], name: :index_taggings_on_created_at
-    add_index :taggings, [:tag_id], name: :index_taggings_on_tag_id
-    add_index :taggings, %i[taggable_id taggable_type context], name: :index_taggings_on_taggable_id_and_taggable_type_and_context, length: {taggable_type: 95, context: 95}, using: :btree
+    add_index :taggings, :created_at, name: :index_taggings_on_created_at
+    add_index :taggings, :tag_id, name: :index_taggings_on_tag_id
+    add_index :taggings, %i[taggable_id taggable_type context], name: :index_taggings_on_taggable_id_and_taggable_type_and_context, length: {taggable_type: 95, context: 95}
     add_index :taggings, %i[taggable_id taggable_type tag_id], name: :index_taggings_uniquely, unique: true
 
     create_table :tags do |t|
-      t.string :name
+      t.string  :name
+      t.integer :taggings_count, default: 0
     end
 
-    add_index :tags, [:name], name: :index_tags_on_name, unique: true, length: {name: 191}
+    add_index :tags, :name, name: :index_tags_on_name, unique: true, length: {name: 191}
 
     create_table :user_preferences do |t|
       t.string   :email_type
@@ -416,15 +580,13 @@ class CreateSchema < ActiveRecord::Migration[4.2]
     end
 
     create_table :users do |t|
-      t.string   :username
+      t.string   :username,                                                       null: false
       t.text     :serialized_private_key
       t.boolean  :getting_started,                                default: true,  null: false
       t.boolean  :disable_mail,                                   default: false, null: false
       t.string   :language
       t.string   :email,                                          default: "",    null: false
       t.string   :encrypted_password,                             default: "",    null: false
-      t.string   :invitation_token,                   limit: 60
-      t.datetime :invitation_sent_at
       t.string   :reset_password_token
       t.datetime :remember_created_at
       t.integer  :sign_in_count,                                  default: 0
@@ -434,11 +596,7 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.string   :last_sign_in_ip
       t.datetime :created_at,                                                     null: false
       t.datetime :updated_at,                                                     null: false
-      t.string   :invitation_service,                 limit: 127
-      t.string   :invitation_identifier,              limit: 127
-      t.integer  :invitation_limit
       t.integer  :invited_by_id
-      t.string   :invited_by_type
       t.string   :authentication_token,               limit: 30
       t.string   :unconfirmed_email
       t.string   :confirm_email_token,                limit: 30
@@ -448,19 +606,33 @@ class CreateSchema < ActiveRecord::Migration[4.2]
       t.integer  :auto_follow_back_aspect_id
       t.text     :hidden_shareables
       t.datetime :reset_password_sent_at
-    end
-
-    add_index :users, [:authentication_token], name: :index_users_on_authentication_token, unique: true
-    add_index :users, [:email], name: :index_users_on_email, length: {email: 191}
-    add_index :users, %i[invitation_service invitation_identifier], name: :index_users_on_invitation_service_and_invitation_identifier, length: {invitation_service: 64, invitation_identifier: 127}, using: :btree, unique: true
-    add_index :users, [:invitation_token], name: :index_users_on_invitation_token
-    add_index :users, [:username], name: :index_users_on_username, length: {username: 191}, using: :btree, unique: true
+      t.datetime :last_seen
+      t.datetime :remove_after
+      t.string   :export
+      t.datetime :exported_at
+      t.boolean  :exporting,                                      default: false
+      t.boolean  :strip_exif,                                     default: true
+      t.string   :exported_photos_file
+      t.datetime :exported_photos_at
+      t.boolean  :exporting_photos,                               default: false
+      t.string   :color_theme
+    end
+
+    add_index :users, :authentication_token, name: :index_users_on_authentication_token, unique: true
+    add_index :users, :username, name: :index_users_on_username, length: {username: 191}, unique: true
+    add_index :users, :email, name: :index_users_on_email, length: {email: 191}, unique: true
 
     add_foreign_key :aspect_memberships, :aspects, name: :aspect_memberships_aspect_id_fk, on_delete: :cascade
     add_foreign_key :aspect_memberships, :contacts, name: :aspect_memberships_contact_id_fk, on_delete: :cascade
 
     add_foreign_key :aspect_visibilities, :aspects, name: :aspect_visibilities_aspect_id_fk, on_delete: :cascade
 
+    add_foreign_key :authorizations, :users
+    add_foreign_key :authorizations, :o_auth_applications
+
+    add_foreign_key :comment_signatures, :comments, name: :comment_signatures_comment_id_fk, on_delete: :cascade
+    add_foreign_key :comment_signatures, :signature_orders, name: :comment_signatures_signature_orders_id_fk
+
     add_foreign_key :comments, :people, name: :comments_author_id_fk, column: :author_id, on_delete: :cascade
 
     add_foreign_key :contacts, :people, name: :contacts_person_id_fk, on_delete: :cascade
@@ -470,8 +642,8 @@ class CreateSchema < ActiveRecord::Migration[4.2]
 
     add_foreign_key :conversations, :people, name: :conversations_author_id_fk, column: :author_id, on_delete: :cascade
 
-    add_foreign_key :invitations, :users, name: :invitations_recipient_id_fk, column: :recipient_id, on_delete: :cascade
-    add_foreign_key :invitations, :users, name: :invitations_sender_id_fk, column: :sender_id, on_delete: :cascade
+    add_foreign_key :like_signatures, :likes, name: :like_signatures_like_id_fk, on_delete: :cascade
+    add_foreign_key :like_signatures, :signature_orders, name: :like_signatures_signature_orders_id_fk
 
     add_foreign_key :likes, :people, name: :likes_author_id_fk, column: :author_id, on_delete: :cascade
 
@@ -480,13 +652,25 @@ class CreateSchema < ActiveRecord::Migration[4.2]
 
     add_foreign_key :notification_actors, :notifications, name: :notification_actors_notification_id_fk, on_delete: :cascade
 
+    add_foreign_key :o_auth_access_tokens, :authorizations
+
+    add_foreign_key :o_auth_applications, :users
+
+    add_foreign_key :people, :pods, name: :people_pod_id_fk, on_delete: :cascade
+
+    add_foreign_key :poll_participation_signatures, :poll_participations, name: :poll_participation_signatures_poll_participation_id_fk, on_delete: :cascade
+    add_foreign_key :poll_participation_signatures, :signature_orders, name: :poll_participation_signatures_signature_orders_id_fk
+
     add_foreign_key :posts, :people, name: :posts_author_id_fk, column: :author_id, on_delete: :cascade
 
+    add_foreign_key :ppid, :o_auth_applications
+    add_foreign_key :ppid, :users
+
     add_foreign_key :profiles, :people, name: :profiles_person_id_fk, on_delete: :cascade
 
     add_foreign_key :services, :users, name: :services_user_id_fk, on_delete: :cascade
 
-    add_foreign_key :share_visibilities, :contacts, name: :post_visibilities_contact_id_fk, on_delete: :cascade
+    add_foreign_key :share_visibilities, :users, name: :share_visibilities_user_id_fk, on_delete: :cascade
   end
   # rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/LineLength, Layout/ExtraSpacing
 end
diff --git a/db/migrate/20130207231310_add_facebook_id_to_post.rb b/db/migrate/20130207231310_add_facebook_id_to_post.rb
deleted file mode 100644
index f559f46a746018e639ad925b8b64237b1557dd50..0000000000000000000000000000000000000000
--- a/db/migrate/20130207231310_add_facebook_id_to_post.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddFacebookIdToPost < ActiveRecord::Migration[4.2]
-  def change
-    add_column :posts, :facebook_id, :string
-  end
-end
diff --git a/db/migrate/20130404211624_fix_default_image_url_from_profile.rb b/db/migrate/20130404211624_fix_default_image_url_from_profile.rb
deleted file mode 100644
index 80618b8a55043f095a10005c55556ffe1a186ad0..0000000000000000000000000000000000000000
--- a/db/migrate/20130404211624_fix_default_image_url_from_profile.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class FixDefaultImageUrlFromProfile < ActiveRecord::Migration[4.2]
-  def up
-    execute("UPDATE profiles SET image_url = REPLACE(image_url, 'images', 'assets'), image_url_small = REPLACE(image_url_small, 'images', 'assets'), image_url_medium = REPLACE(image_url_medium, 'images', 'assets') WHERE image_url LIKE '%images/user/default.png';")
-  end
-
-  def down
-    execute("UPDATE profiles SET image_url = REPLACE(image_url, 'assets', 'images'), image_url_small = REPLACE(image_url_small, 'assets', 'images'), image_url_medium = REPLACE(image_url_medium, 'assets', 'images') WHERE image_url LIKE '%assets/user/default.png';")
-  end
-end
diff --git a/db/migrate/20130429073928_add_tweet_id_to_post.rb b/db/migrate/20130429073928_add_tweet_id_to_post.rb
deleted file mode 100644
index 7f9c5808ff4bab5403801300d856bdd5de0a793f..0000000000000000000000000000000000000000
--- a/db/migrate/20130429073928_add_tweet_id_to_post.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class AddTweetIdToPost < ActiveRecord::Migration[4.2]
-  def change
-  	add_column :posts, :tweet_id, :string
-  	add_index :posts, ['tweet_id'], :length => { "tweet_id" => 191 }
-  end
-end
diff --git a/db/migrate/20130608171134_add_open_graph_cache.rb b/db/migrate/20130608171134_add_open_graph_cache.rb
deleted file mode 100644
index ac4826c1fe5c60c7fdaf171be88922b55cb67962..0000000000000000000000000000000000000000
--- a/db/migrate/20130608171134_add_open_graph_cache.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class AddOpenGraphCache < ActiveRecord::Migration[4.2]
-  def up
-    create_table :open_graph_caches do |t|
-      t.string :title
-      t.string :ob_type
-      t.string :image
-      t.string :url
-      t.text :description
-    end
-    change_table :posts do |t|
-      t.integer :open_graph_cache_id
-    end
-  end
-
-  def down
-    remove_column :posts, :open_graph_cache_id
-    drop_table :open_graph_caches
-  end
-end
diff --git a/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb b/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb
deleted file mode 100644
index 2e88f0a1e962124280e4ffb3bd21bfd538fb2728..0000000000000000000000000000000000000000
--- a/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class RemoveLimitFromRootGuidInPosts < ActiveRecord::Migration[4.2]
-  def up
-    remove_index 'posts', :name => 'index_posts_on_root_guid'
-    remove_index 'posts', :name => 'index_posts_on_author_id_and_root_guid'
-    change_column :posts, :root_guid, :string
-    add_index 'posts', ["root_guid"], :name => 'index_posts_on_root_guid', length: {"root_guid"=>191}
-    add_index 'posts', ["author_id", "root_guid"], :name => 'index_posts_on_author_id_and_root_guid', length: {"root_guid"=>190}, :using => :btree, :unique => true
-  end
-
-  def down
-    change_column :posts, :root_guid, :string, limit: 30
-  end
-end
diff --git a/db/migrate/20130717104359_migrate_activity_stream_to_status_message.rb b/db/migrate/20130717104359_migrate_activity_stream_to_status_message.rb
deleted file mode 100644
index c37d8dd3e9cbe6a2473c629ebe570d1ac77694b8..0000000000000000000000000000000000000000
--- a/db/migrate/20130717104359_migrate_activity_stream_to_status_message.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class MigrateActivityStreamToStatusMessage < ActiveRecord::Migration[4.2]
-  class Post < ApplicationRecord; self.inheritance_column = false; end
-  def up
-    posts_stream_photos = Post.where(type: 'ActivityStreams::Photo')
-    posts_stream_photos.each do |p|
-      p.update_attributes({text: "#{p.text} ![](#{p.image_url})", type: "StatusMessage"}, without_protection: true)
-    end
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration, "Can't recover the deleted ActivityStreams::Photo"
-  end
-end
diff --git a/db/migrate/20130801063213_add_tumblr_post_ids_to_posts.rb b/db/migrate/20130801063213_add_tumblr_post_ids_to_posts.rb
deleted file mode 100644
index 638157388c4862e4313f15a3c75f6ae61d3ceed8..0000000000000000000000000000000000000000
--- a/db/migrate/20130801063213_add_tumblr_post_ids_to_posts.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddTumblrPostIdsToPosts < ActiveRecord::Migration[4.2]
-  def change
-    add_column :posts, :tumblr_ids, :text
-  end
-end
diff --git a/db/migrate/20131017093025_create_post_reports.rb b/db/migrate/20131017093025_create_post_reports.rb
deleted file mode 100644
index 5ccceca031d7f7fb3c061512dbfe363484adb621..0000000000000000000000000000000000000000
--- a/db/migrate/20131017093025_create_post_reports.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class CreatePostReports < ActiveRecord::Migration[4.2]
-  def change
-    create_table :post_reports do |t|
-      t.integer :post_id, :null => false
-      t.string :user_id
-      t.boolean :reviewed, :default => false
-      t.text :text
-
-      t.timestamps
-    end
-    add_index :post_reports, :post_id
-  end
-end
diff --git a/db/migrate/20131213171804_create_simple_captcha_data.rb b/db/migrate/20131213171804_create_simple_captcha_data.rb
deleted file mode 100644
index 9068aec00d9e34293fdce7f22fffac5da454bd64..0000000000000000000000000000000000000000
--- a/db/migrate/20131213171804_create_simple_captcha_data.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class CreateSimpleCaptchaData < ActiveRecord::Migration[4.2]
-  def self.up
-    create_table :simple_captcha_data do |t|
-      t.string :key, :limit => 40
-      t.string :value, :limit => 6
-      t.timestamps
-    end
-    
-    add_index :simple_captcha_data, :key, :name => "idx_key"
-  end
-
-  def self.down
-    drop_table :simple_captcha_data
-  end
-end
diff --git a/db/migrate/20140121132816_add_post_type_to_post_report.rb b/db/migrate/20140121132816_add_post_type_to_post_report.rb
deleted file mode 100644
index 766efb9b9319398b0b6a4ac85ca171df5b8a1d38..0000000000000000000000000000000000000000
--- a/db/migrate/20140121132816_add_post_type_to_post_report.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class AddPostTypeToPostReport < ActiveRecord::Migration[4.2]
-  def change
-    add_column :post_reports, :post_type, :string, :null => false, :after => :post_id, :default => 'post'
-    change_column_default :post_reports, :post_type, nil
-  end
-end
diff --git a/db/migrate/20140214104217_rename_post_report_to_report.rb b/db/migrate/20140214104217_rename_post_report_to_report.rb
deleted file mode 100644
index 3b02b0aec0525d6b487a8e0643f4c870a9841cc4..0000000000000000000000000000000000000000
--- a/db/migrate/20140214104217_rename_post_report_to_report.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class RenamePostReportToReport < ActiveRecord::Migration[4.2]
-  def self.up
-    rename_table :post_reports, :reports
-  end
-  def self.down
-    rename_table :reports, :post_reports
-  end
-end
diff --git a/db/migrate/20140222162826_devise_add_lastseenable_user.rb b/db/migrate/20140222162826_devise_add_lastseenable_user.rb
deleted file mode 100644
index c0a5428d4911628974800525edcfab048776f706..0000000000000000000000000000000000000000
--- a/db/migrate/20140222162826_devise_add_lastseenable_user.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class DeviseAddLastseenableUser < ActiveRecord::Migration[4.2]
-  def self.up
-    add_column :users, :last_seen, :datetime
-    User.find_each do |user|
-      user.update_column(:last_seen, user.last_sign_in_at)
-    end
-  end
-  
-  def self.down
-    remove_column :users, :last_seen
-  end
-end
\ No newline at end of file
diff --git a/db/migrate/20140308154022_create_polls.rb b/db/migrate/20140308154022_create_polls.rb
deleted file mode 100644
index c9dd794a2f7fa4234436245b3b1abcd64557cf0d..0000000000000000000000000000000000000000
--- a/db/migrate/20140308154022_create_polls.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-class CreatePolls < ActiveRecord::Migration[4.2]
-  def up
-    create_table :polls do |t|
-      t.string :question, :null => false
-      t.belongs_to :status_message, :null => false
-      t.boolean :status
-      t.string :guid
-      t.timestamps
-    end
-    add_index :polls, :status_message_id
-
-    create_table :poll_answers do |t|
-      t.string :answer, :null => false
-      t.belongs_to :poll, :null => false
-      t.string :guid
-      t.integer :vote_count, :default => 0
-    end
-    add_index :poll_answers, :poll_id
-
-    create_table :poll_participations do |t|
-      t.belongs_to :poll_answer, :null => false
-      t.belongs_to :author, :null => false
-      t.belongs_to :poll, :null => false
-      t.string :guid
-      t.text :author_signature
-      t.text :parent_author_signature
-
-      t.timestamps
-    end
-    add_index :poll_participations, :poll_id
-  end
-
-  def down
-    drop_table :polls
-    drop_table :poll_answers
-    drop_table :poll_participations
-  end
-end
diff --git a/db/migrate/20140422134050_rename_post_columns_to_item.rb b/db/migrate/20140422134050_rename_post_columns_to_item.rb
deleted file mode 100644
index 986326152340a456531036fd2a3c47aba7839a43..0000000000000000000000000000000000000000
--- a/db/migrate/20140422134050_rename_post_columns_to_item.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RenamePostColumnsToItem < ActiveRecord::Migration[4.2]
-  def up
-    rename_column :reports, :post_id, :item_id
-    rename_column :reports, :post_type, :item_type
-  end
-
-  def down
-    rename_column :reports, :item_id, :post_id
-    rename_column :reports, :item_type, :post_type
-  end
-end
diff --git a/db/migrate/20140422134627_change_user_id_type_to_integer.rb b/db/migrate/20140422134627_change_user_id_type_to_integer.rb
deleted file mode 100644
index 019cef9623251ff18f7e11fecfae2d98f0b9b5aa..0000000000000000000000000000000000000000
--- a/db/migrate/20140422134627_change_user_id_type_to_integer.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class ChangeUserIdTypeToInteger < ActiveRecord::Migration[4.2]
-  def up
-    remove_column :reports, :user_id
-    add_column :reports, :user_id, :integer, :null => false, :default => 1
-    change_column_default :reports, :user_id, nil
-  end
-
-  def down
-    remove_column :reports, :user_id
-    add_column :reports, :user_id, :string
-  end
-end
diff --git a/db/migrate/20140601102543_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb b/db/migrate/20140601102543_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb
deleted file mode 100644
index 5a3f71a25744cc4356f1266118efc2afbc2ffe4b..0000000000000000000000000000000000000000
--- a/db/migrate/20140601102543_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# This migration comes from acts_as_taggable_on_engine (originally 3)
-class AddTaggingsCounterCacheToTags < ActiveRecord::Migration[4.2]
-  def self.up
-    add_column :tags, :taggings_count, :integer, default: 0
-
-    ActsAsTaggableOn::Tag.reset_column_information
-    ActsAsTaggableOn::Tag.find_each do |tag|
-      ActsAsTaggableOn::Tag.reset_counters(tag.id, :taggings)
-    end
-  end
-
-  def self.down
-    remove_column :tags, :taggings_count
-  end
-end
diff --git a/db/migrate/20140801101230_create_chat_contacts.rb b/db/migrate/20140801101230_create_chat_contacts.rb
deleted file mode 100644
index b50afcece81524292b2d76cfd54ba6b1ad5c2c13..0000000000000000000000000000000000000000
--- a/db/migrate/20140801101230_create_chat_contacts.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class CreateChatContacts < ActiveRecord::Migration[4.2]
-  def up
-    create_table :chat_contacts do |t|
-      t.integer :user_id,                  null: false
-      ## JID <= 3071 bytes http://tools.ietf.org/html/rfc6122
-      t.string :jid,                      null: false
-      t.string :name,         limit: 255, null: true
-      t.string :ask,          limit: 128, null: true
-      t.string :subscription, limit: 128, null: false
-    end
-    add_index :chat_contacts, [:user_id, :jid], unique: true, :length => {:jid => 190}
-  end
-
-  def down
-    drop_table :chat_contacts
-  end
-end
diff --git a/db/migrate/20140801101352_create_chat_fragments.rb b/db/migrate/20140801101352_create_chat_fragments.rb
deleted file mode 100644
index 0457abf224e934d5e20b9e3e53619bf09ae134ce..0000000000000000000000000000000000000000
--- a/db/migrate/20140801101352_create_chat_fragments.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class CreateChatFragments < ActiveRecord::Migration[4.2]
-  def up
-    create_table :chat_fragments do |t|
-      t.integer :user_id, null: false
-      t.string :root, limit: 256, null: false
-      t.string :namespace, limit: 256, null: false
-      t.text :xml, null: false
-    end
-    # That won't work due UTF-8 and the limit of 767 bytes
-    #add_index :chat_fragments, [:user_id, :root, :namespace], unique: true
-    add_index :chat_fragments, [:user_id], unique: true
-  end
-
-  def down
-    drop_table :chat_fragments
-  end
-end
diff --git a/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb b/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb
deleted file mode 100644
index 2c701dcac3baa89619c21e5371cc8dd5327270fd..0000000000000000000000000000000000000000
--- a/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddCompletedAtToAccountDeletions < ActiveRecord::Migration[4.2]
-  def change
-    add_column :account_deletions, :completed_at, :datetime
-  end
-end
diff --git a/db/migrate/20140826165533_increase_simple_captcha_limit.rb b/db/migrate/20140826165533_increase_simple_captcha_limit.rb
deleted file mode 100644
index c0d7d4827f59c24a1f9e25a5e7ac8de6317fac6e..0000000000000000000000000000000000000000
--- a/db/migrate/20140826165533_increase_simple_captcha_limit.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class IncreaseSimpleCaptchaLimit < ActiveRecord::Migration[4.2]
-  def self.up
-    change_column :simple_captcha_data, :value, :string, :limit => 12
-  end
-  def self.down
-    change_column :simple_captcha_data, :value, :string, :limit => 6
-  end
-end
diff --git a/db/migrate/20140906192846_fix_open_graph_data.rb b/db/migrate/20140906192846_fix_open_graph_data.rb
deleted file mode 100644
index 5aec2b531527acab0a5408aaf68fd8fd4fc77b11..0000000000000000000000000000000000000000
--- a/db/migrate/20140906192846_fix_open_graph_data.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class FixOpenGraphData < ActiveRecord::Migration[4.2]
-  def self.up
-    change_column :open_graph_caches, :url, :text
-    change_column :open_graph_caches, :image, :text
-  end
-  def self.down
-    change_column :open_graph_caches, :url, :string
-    change_column :open_graph_caches, :image, :string
-  end
-end
diff --git a/db/migrate/20141001162851_add_remove_after_to_users.rb b/db/migrate/20141001162851_add_remove_after_to_users.rb
deleted file mode 100644
index 8169e5e8b6da5ae410ad83625e1dfb9b93674639..0000000000000000000000000000000000000000
--- a/db/migrate/20141001162851_add_remove_after_to_users.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddRemoveAfterToUsers < ActiveRecord::Migration[4.2]
-  def change
-  	add_column :users, :remove_after, :datetime
-  end
-end
diff --git a/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb b/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb
deleted file mode 100644
index a5e300b9424b03ef6ce65d6aa623a143e9790ec8..0000000000000000000000000000000000000000
--- a/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddChatEnabledToAspects < ActiveRecord::Migration[4.2]
-  def self.up
-    add_column :aspects, :chat_enabled, :boolean, default: false
-  end
-
-  def self.down
-    remove_column :aspects, :chat_enabled
-  end
-end
diff --git a/db/migrate/20141024170120_create_chat_offline_messages.rb b/db/migrate/20141024170120_create_chat_offline_messages.rb
deleted file mode 100644
index 5c31e632dfcd6c6b03d9d249608ecc3feb68a2a0..0000000000000000000000000000000000000000
--- a/db/migrate/20141024170120_create_chat_offline_messages.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CreateChatOfflineMessages < ActiveRecord::Migration[4.2]
-  def self.up
-    create_table :chat_offline_messages do |t|
-      t.string :from, :null => false
-      t.string :to, :null => false
-      t.text :message, :null => false
-      t.datetime "created_at", :null => false
-    end
-  end
-
-  def self.down
-    drop_table :chat_offline_messages
-  end
-end
diff --git a/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb b/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb
deleted file mode 100644
index 1c2b3dbf73916e7f8ccd75df19190d87c2a36d7c..0000000000000000000000000000000000000000
--- a/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class DropOpenGraphCachesWithInvalidUrls < ActiveRecord::Migration[4.2]
-  def up
-    OpenGraphCache.where(url: 'http://').delete_all
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration 
-  end
-end
diff --git a/db/migrate/20141216213423_purge_orphan_conversations.rb b/db/migrate/20141216213423_purge_orphan_conversations.rb
deleted file mode 100644
index 45e6f585691ad5945c19c66f534918a8c2cba1a9..0000000000000000000000000000000000000000
--- a/db/migrate/20141216213423_purge_orphan_conversations.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class PurgeOrphanConversations < ActiveRecord::Migration[4.2]
-  def up
-    Conversation.where(id: Conversation.joins("LEFT JOIN conversation_visibilities ON conversation_visibilities.conversation_id = conversations.id")
-		                       .group('conversations.id')
-				       .having("COUNT(conversation_visibilities.id) = 0")
-				       .pluck('conversations.id')
-    ).delete_all
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20141227120907_add_export_to_user.rb b/db/migrate/20141227120907_add_export_to_user.rb
deleted file mode 100644
index ef1779f7693432ddd3f33e966771e8ab05e5bfe0..0000000000000000000000000000000000000000
--- a/db/migrate/20141227120907_add_export_to_user.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class AddExportToUser < ActiveRecord::Migration[4.2]
-  def change
-    add_column :users, :export, :string
-    add_column :users, :exported_at, :datetime
-    add_column :users, :exporting, :boolean, default: false
-  end
-end
diff --git a/db/migrate/20141230214830_user_pref_strip_exif.rb b/db/migrate/20141230214830_user_pref_strip_exif.rb
deleted file mode 100644
index b573d487442a02acb1a732fa6367e7ba4b270174..0000000000000000000000000000000000000000
--- a/db/migrate/20141230214830_user_pref_strip_exif.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class UserPrefStripExif < ActiveRecord::Migration[4.2]
-  def up
-    add_column :users, :strip_exif, :boolean, default: true
-  end
-  
-  def down
-    remove_column :users, :strip_exif
-  end
-end
diff --git a/db/migrate/20150209230946_disable_mail_for_closed_account.rb b/db/migrate/20150209230946_disable_mail_for_closed_account.rb
deleted file mode 100644
index 2dd573745c15bba51d7adbf8a5fdca4986f03455..0000000000000000000000000000000000000000
--- a/db/migrate/20150209230946_disable_mail_for_closed_account.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class DisableMailForClosedAccount < ActiveRecord::Migration[4.2]
-  def up
-    User.joins(:person).where(people: {closed_account: true}).update_all(disable_mail: true)
-  end
-
-  def down
-    User.joins(:person).where(people: {closed_account: true}).update_all(disable_mail: false)
-  end
-end
diff --git a/db/migrate/20150220001357_add_photos_export_to_user.rb b/db/migrate/20150220001357_add_photos_export_to_user.rb
deleted file mode 100644
index 6bec804203775dda2c4a4d0dcf781dad01001f50..0000000000000000000000000000000000000000
--- a/db/migrate/20150220001357_add_photos_export_to_user.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class AddPhotosExportToUser < ActiveRecord::Migration[4.2]
-  def up
-    add_column :users, :exported_photos_file, :string
-    add_column :users, :exported_photos_at, :datetime
-    add_column :users, :exporting_photos, :boolean, default: false
-  end
-
-  def down
-    remove_column :users, :exported_photos_file
-    remove_column :users, :exported_photos_at
-    remove_column :users, :exporting_photos
-  end
-end
diff --git a/db/migrate/20150403192408_remove_deleted_aspects_from_auto_follow_back.rb b/db/migrate/20150403192408_remove_deleted_aspects_from_auto_follow_back.rb
deleted file mode 100644
index f5f19e750e654a9c25893c662604fece7f1fea05..0000000000000000000000000000000000000000
--- a/db/migrate/20150403192408_remove_deleted_aspects_from_auto_follow_back.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RemoveDeletedAspectsFromAutoFollowBack < ActiveRecord::Migration[4.2]
-  def up
-    User.where.not(auto_follow_back_aspect_id: Aspect.select(:id))
-      .where(auto_follow_back: true)
-      .update_all(auto_follow_back: false, auto_follow_back_aspect_id: nil)
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20150403212139_fix_wrong_only_sharing.rb b/db/migrate/20150403212139_fix_wrong_only_sharing.rb
deleted file mode 100644
index c02f4bba6d55ae9b7b2ad54f22d3de4ab621297f..0000000000000000000000000000000000000000
--- a/db/migrate/20150403212139_fix_wrong_only_sharing.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class FixWrongOnlySharing < ActiveRecord::Migration[4.2]
-  def up
-    Contact.where(sharing: true, receiving: false)
-      .where(id: AspectMembership.select(:contact_id))
-      .update_all(receiving: true)
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20150523004437_enable_color_themes.rb b/db/migrate/20150523004437_enable_color_themes.rb
deleted file mode 100644
index 816fd1fbf67dcf688faa6acaf0eae9c474b70d74..0000000000000000000000000000000000000000
--- a/db/migrate/20150523004437_enable_color_themes.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class EnableColorThemes < ActiveRecord::Migration[4.2]
-  def up
-    add_column(:users, :color_theme, :string)
-  end
-
-  def down
-    remove_column(:users, :color_theme)
-  end
-end
diff --git a/db/migrate/20150531005120_cleanup_default_avatars.rb b/db/migrate/20150531005120_cleanup_default_avatars.rb
deleted file mode 100644
index f3dcee9a246f7dc6c6e85127a1305e6681806f42..0000000000000000000000000000000000000000
--- a/db/migrate/20150531005120_cleanup_default_avatars.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class CleanupDefaultAvatars < ActiveRecord::Migration[4.2]
-  def up
-    Profile.where("image_url LIKE ?", "%user/default%")
-      .update_all(image_url: nil, image_url_small: nil, image_url_medium: nil)
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20150607143809_fix_photo_public_flag.rb b/db/migrate/20150607143809_fix_photo_public_flag.rb
deleted file mode 100644
index ee223cd6ac866c23eb1c4137590c8fb31149648f..0000000000000000000000000000000000000000
--- a/db/migrate/20150607143809_fix_photo_public_flag.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class FixPhotoPublicFlag < ActiveRecord::Migration[4.2]
-  def up
-    Photo.joins(:status_message).where(posts: {public: true}).update_all(public: true)
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20150613202109_create_o_auth_applications.rb b/db/migrate/20150613202109_create_o_auth_applications.rb
deleted file mode 100644
index a39f0ace9409ed336c7e58c1ea01c6fd5f923924..0000000000000000000000000000000000000000
--- a/db/migrate/20150613202109_create_o_auth_applications.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# Inspired by https://github.com/nov/openid_connect_sample/blob/master/db/migrate/20110829023826_create_clients.rb
-
-class CreateOAuthApplications < ActiveRecord::Migration[4.2]
-  def change
-    create_table :o_auth_applications do |t|
-      t.belongs_to :user, index: true
-      t.string :client_id, index: {unique: true, length: 191}
-      t.string :client_secret
-      t.string :client_name
-
-      t.text :redirect_uris
-      t.string :response_types
-      t.string :grant_types
-      t.string :application_type, default: "web"
-      t.string :contacts
-      t.string :logo_uri
-      t.string :client_uri
-      t.string :policy_uri
-      t.string :tos_uri
-      t.string :sector_identifier_uri
-      t.string :token_endpoint_auth_method
-      t.text :jwks
-      t.string :jwks_uri
-      t.boolean :ppid, default: false
-
-      t.timestamps null: false
-    end
-    add_foreign_key :o_auth_applications, :users
-  end
-end
diff --git a/db/migrate/20150630221004_add_public_to_profiles.rb b/db/migrate/20150630221004_add_public_to_profiles.rb
deleted file mode 100644
index 4797c1f3826798501c4df01ad0626991a0368382..0000000000000000000000000000000000000000
--- a/db/migrate/20150630221004_add_public_to_profiles.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddPublicToProfiles < ActiveRecord::Migration[4.2]
-  def change
-    add_column :profiles, :public_details, :boolean, default: false
-  end
-end
diff --git a/db/migrate/20150708153926_create_authorizations.rb b/db/migrate/20150708153926_create_authorizations.rb
deleted file mode 100644
index b9e06dd2c1e494dab51004bc5a532beea1c8569e..0000000000000000000000000000000000000000
--- a/db/migrate/20150708153926_create_authorizations.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class CreateAuthorizations < ActiveRecord::Migration[4.2]
-  def change
-    create_table :authorizations do |t|
-      t.belongs_to :user, index: true
-      t.belongs_to :o_auth_application, index: true
-      t.string :refresh_token
-      t.string :code
-      t.string :redirect_uri
-      t.string :nonce
-      t.string :scopes
-      t.boolean :code_used, default: false
-
-      t.timestamps null: false
-    end
-    add_foreign_key :authorizations, :users
-    add_foreign_key :authorizations, :o_auth_applications
-  end
-end
diff --git a/db/migrate/20150708153928_create_o_auth_access_tokens.rb b/db/migrate/20150708153928_create_o_auth_access_tokens.rb
deleted file mode 100644
index 779283cbefbe6e62ee840dad1feb16bfa3e80e7d..0000000000000000000000000000000000000000
--- a/db/migrate/20150708153928_create_o_auth_access_tokens.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# Inspired by https://github.com/nov/openid_connect_sample/blob/master/db/migrate/20110829023837_create_access_tokens.rb
-
-class CreateOAuthAccessTokens < ActiveRecord::Migration[4.2]
-  def change
-    create_table :o_auth_access_tokens do |t|
-      t.belongs_to :authorization, index: true
-      t.string :token, index: {unique: true, length: 191}
-      t.datetime :expires_at
-
-      t.timestamps null: false
-    end
-    add_foreign_key :o_auth_access_tokens, :authorizations
-  end
-end
diff --git a/db/migrate/20150714055110_create_id_tokens.rb b/db/migrate/20150714055110_create_id_tokens.rb
deleted file mode 100644
index df98206a49b848c7c295726a2e7ad4329c07e1de..0000000000000000000000000000000000000000
--- a/db/migrate/20150714055110_create_id_tokens.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# Inspired by https://github.com/nov/openid_connect_sample/blob/master/db/migrate/20110829024010_create_id_tokens.rb
-
-class CreateIdTokens < ActiveRecord::Migration[4.2]
-  def change
-    create_table :id_tokens do |t|
-      t.belongs_to :authorization, index: true
-      t.datetime :expires_at
-      t.string :nonce
-
-      t.timestamps null: false
-    end
-    add_foreign_key :id_tokens, :authorizations
-  end
-end
diff --git a/db/migrate/20150724152052_remove_favorites_from_posts.rb b/db/migrate/20150724152052_remove_favorites_from_posts.rb
deleted file mode 100644
index 737d3c593ffb06cbbbf104802cee4aea0183578f..0000000000000000000000000000000000000000
--- a/db/migrate/20150724152052_remove_favorites_from_posts.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class RemoveFavoritesFromPosts < ActiveRecord::Migration[4.2]
-  def self.up
-    remove_column :posts, :favorite
-  end
-
-  def self.down
-    add_column :posts, :favorite, :boolean, default: false
-  end
-end
diff --git a/db/migrate/20150731123113_create_pairwise_pseudonymous_identifiers.rb b/db/migrate/20150731123113_create_pairwise_pseudonymous_identifiers.rb
deleted file mode 100644
index 12ed8597fb02272110579645da0dc1229fe3bfa7..0000000000000000000000000000000000000000
--- a/db/migrate/20150731123113_create_pairwise_pseudonymous_identifiers.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# Inspired by https://github.com/nov/openid_connect_sample/blob/master/db/migrate/20110829024140_create_pairwise_pseudonymous_identifiers.rb
-
-class CreatePairwisePseudonymousIdentifiers < ActiveRecord::Migration[4.2]
-  def change
-    create_table :ppid do |t|
-      t.belongs_to :o_auth_application, index: true
-      t.belongs_to :user, index: true
-
-      t.string :guid, :string, limit: 32
-      t.string :identifier
-    end
-    add_foreign_key :ppid, :o_auth_applications
-    add_foreign_key :ppid, :users
-  end
-end
diff --git a/db/migrate/20150731123114_add_status_to_pods.rb b/db/migrate/20150731123114_add_status_to_pods.rb
deleted file mode 100644
index e94a011b1b3e2fdaffa23f3bf090ffb17cb7bada..0000000000000000000000000000000000000000
--- a/db/migrate/20150731123114_add_status_to_pods.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class AddStatusToPods < ActiveRecord::Migration[4.2]
-  def change
-    add_column :pods, :status, :integer, default: 0
-    add_column :pods, :checked_at, :datetime, default: Time.zone.at(0)
-    add_column :pods, :offline_since, :datetime, default: nil
-    add_column :pods, :response_time, :integer, default: -1
-    add_column :pods, :software, :string, limit: 255
-    add_column :pods, :error, :string, limit: 255
-
-    add_index :pods, :status
-    add_index :pods, :checked_at
-    add_index :pods, :offline_since
-  end
-end
diff --git a/db/migrate/20150828132451_remove_duplicate_and_empty_pods.rb b/db/migrate/20150828132451_remove_duplicate_and_empty_pods.rb
deleted file mode 100644
index f3d43447404604604cc1724d9cc29e26252dba89..0000000000000000000000000000000000000000
--- a/db/migrate/20150828132451_remove_duplicate_and_empty_pods.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class RemoveDuplicateAndEmptyPods < ActiveRecord::Migration[4.2]
-  def up
-    remove_dupes
-    remove_empty_or_nil
-
-    add_index :pods, :host, unique: true, length: 190 # =190*4 for utf8mb4
-  end
-
-  def down
-    remove_index :pods, :host
-  end
-
-  private
-
-  def remove_dupes
-    duplicates = Pod.group(:host).count.select {|_, v| v > 1 }.keys
-    ids = duplicates.flat_map {|pod| Pod.where(host: pod).order(created_at: :asc).pluck(:id).tap(&:shift) }
-    Pod.where(id: ids).destroy_all
-  end
-
-  def remove_empty_or_nil
-    Pod.where(host: [nil, ""]).destroy_all
-  end
-end
diff --git a/db/migrate/20151003142048_update_report_item_types.rb b/db/migrate/20151003142048_update_report_item_types.rb
deleted file mode 100644
index 3d497253727addfe98df4ad4a56a43d0c343a615..0000000000000000000000000000000000000000
--- a/db/migrate/20151003142048_update_report_item_types.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class UpdateReportItemTypes < ActiveRecord::Migration[4.2]
-  def change
-    Report.all.each do |report|
-      report.update_attribute :item_type, report[:item_type].capitalize
-    end
-  end
-end
diff --git a/db/migrate/20151210213023_remove_signatures_from_relayables.rb b/db/migrate/20151210213023_remove_signatures_from_relayables.rb
deleted file mode 100644
index c9b7a45fae52f61e2488aa67a8b34a870bf466c2..0000000000000000000000000000000000000000
--- a/db/migrate/20151210213023_remove_signatures_from_relayables.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class RemoveSignaturesFromRelayables < ActiveRecord::Migration[4.2]
-  def change
-    remove_column :comments, :parent_author_signature, :text
-    remove_column :poll_participations, :parent_author_signature, :text
-    remove_column :messages, :parent_author_signature, :text
-    remove_column :participations, :parent_author_signature, :text
-    remove_column :likes, :parent_author_signature, :text
-  end
-end
diff --git a/db/migrate/20160124234712_extend_pods.rb b/db/migrate/20160124234712_extend_pods.rb
deleted file mode 100644
index 9f2dc7ebc0e7f4cc7facd2f3f242418b65d3c998..0000000000000000000000000000000000000000
--- a/db/migrate/20160124234712_extend_pods.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-class ExtendPods < ActiveRecord::Migration[4.2]
-  class Pod < ApplicationRecord
-    has_many :people
-
-    DEFAULT_PORTS = [URI::HTTP::DEFAULT_PORT, URI::HTTPS::DEFAULT_PORT]
-
-    def self.find_or_create_by(opts)
-      uri = URI.parse(opts.fetch(:url))
-      port = DEFAULT_PORTS.include?(uri.port) ? nil : uri.port
-      find_or_initialize_by(host: uri.host, port: port).tap do |pod|
-        pod.ssl ||= (uri.scheme == "https")
-        pod.save
-      end
-    end
-
-    def url
-      (ssl ? URI::HTTPS : URI::HTTP).build(host: host, port: port, path: "/")
-    end
-  end
-
-  class Person < ApplicationRecord
-    belongs_to :owner, class_name: "User"
-    belongs_to :pod
-
-    def url
-      owner_id.nil? ? pod.url.to_s : AppConfig.url_to("/")
-    end
-  end
-
-  class User < ApplicationRecord
-    has_one :person, inverse_of: :owner, foreign_key: :owner_id
-  end
-
-  def up
-    remove_index :pods, :host
-
-    # add port
-    add_column :pods, :port, :integer
-    add_index :pods, %i(host port), unique: true, length: {host: 190, port: nil}, using: :btree
-
-    add_column :pods, :blocked, :boolean, default: false
-
-    Pod.reset_column_information
-
-    # link people with pod
-    add_column :people, :pod_id, :integer
-    add_index :people, :url, length: 190
-    add_foreign_key :people, :pods, name: :people_pod_id_fk, on_delete: :cascade
-    Person.where(owner: nil).distinct(:url).pluck(:url).each do |url|
-      pod = Pod.find_or_create_by(url: url)
-      Person.where(url: url, owner_id: nil).update_all(pod_id: pod.id) if pod.persisted?
-    end
-
-    # cleanup unused pods
-    Pod.joins("LEFT OUTER JOIN people ON pods.id = people.pod_id").where("people.id is NULL").delete_all
-
-    remove_column :people, :url
-  end
-
-  def down
-    # restore url
-    add_column :people, :url, :text
-    Person.all.group_by(&:pod_id).each do |pod_id, persons|
-      Person.where(pod_id: pod_id).update_all(url: persons.first.url)
-    end
-    change_column :people, :url, :text, null: false
-    remove_foreign_key :people, :pods
-    remove_column :people, :pod_id
-
-    # remove pods with port
-    Pod.where.not(port: nil).delete_all
-
-    remove_index :pods, column: %i(host port)
-    remove_columns :pods, :port, :blocked
-    add_index :pods, :host, unique: true, length: 190
-  end
-end
diff --git a/db/migrate/20160225232049_link_share_visibilities_with_user.rb b/db/migrate/20160225232049_link_share_visibilities_with_user.rb
deleted file mode 100644
index 8a6f0f5eadb07a619e339461a664d2d2b27481ae..0000000000000000000000000000000000000000
--- a/db/migrate/20160225232049_link_share_visibilities_with_user.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-class LinkShareVisibilitiesWithUser < ActiveRecord::Migration[4.2]
-  class ShareVisibility < ApplicationRecord
-  end
-
-  def up
-    cleanup_deleted_share_visibilities
-
-    remove_columns :share_visibilities, :created_at, :updated_at
-    add_column :share_visibilities, :user_id, :integer
-
-    # update_all from AR doesn't work with postgres, see: https://github.com/rails/rails/issues/13496
-    if AppConfig.postgres?
-      execute "UPDATE share_visibilities SET user_id = contacts.user_id " \
-              "FROM contacts WHERE contacts.id = share_visibilities.contact_id"
-    else
-      ShareVisibility.joins("INNER JOIN contacts ON share_visibilities.contact_id = contacts.id")
-        .update_all("share_visibilities.user_id = contacts.user_id")
-    end
-
-    remove_foreign_key :share_visibilities, name: :post_visibilities_contact_id_fk
-
-    remove_index :share_visibilities, name: :index_post_visibilities_on_contact_id
-    remove_index :share_visibilities, name: :shareable_and_contact_id
-    remove_index :share_visibilities, name: :shareable_and_hidden_and_contact_id
-
-    remove_column :share_visibilities, :contact_id
-
-    ShareVisibility.joins("LEFT OUTER JOIN users ON users.id = share_visibilities.user_id")
-                   .where("users.id is NULL").delete_all
-
-    change_column :share_visibilities, :user_id, :integer, null: false
-
-    add_index :share_visibilities, :user_id
-    add_index :share_visibilities, %i(shareable_id shareable_type user_id), name: :shareable_and_user_id
-    add_index :share_visibilities, %i(shareable_id shareable_type hidden user_id),
-              name: :shareable_and_hidden_and_user_id
-
-    add_foreign_key :share_visibilities, :users, name: :share_visibilities_user_id_fk, on_delete: :cascade
-  end
-
-  def down
-    add_column :share_visibilities, :contact_id, :integer
-
-    if AppConfig.postgres?
-      execute "UPDATE share_visibilities SET contact_id = contacts.id " \
-              "FROM contacts WHERE contacts.user_id = share_visibilities.user_id"
-    else
-      ShareVisibility.joins("INNER JOIN contacts ON share_visibilities.user_id = contacts.user_id")
-        .update_all("share_visibilities.contact_id = contacts.id")
-    end
-
-    remove_foreign_key :share_visibilities, name: :share_visibilities_user_id_fk
-
-    remove_index :share_visibilities, :user_id
-    remove_index :share_visibilities, name: :shareable_and_user_id
-    remove_index :share_visibilities, name: :shareable_and_hidden_and_user_id
-
-    remove_column :share_visibilities, :user_id
-    change_column :share_visibilities, :contact_id, :integer, null: false
-
-    add_index :share_visibilities, :contact_id, name: :index_post_visibilities_on_contact_id
-    add_index :share_visibilities, %i(shareable_id shareable_type contact_id), name: :shareable_and_contact_id
-    add_index :share_visibilities, %i(shareable_id shareable_type hidden contact_id),
-              name: :shareable_and_hidden_and_contact_id
-
-    add_foreign_key :share_visibilities, :contacts, name: :post_visibilities_contact_id_fk, on_delete: :cascade
-
-    add_column :share_visibilities, :created_at, :datetime
-    add_column :share_visibilities, :updated_at, :datetime
-  end
-
-  private
-
-  def cleanup_deleted_share_visibilities
-    ShareVisibility.joins("LEFT OUTER JOIN posts ON posts.id = share_visibilities.shareable_id")
-                   .where(shareable_type: "Post").where("posts.id is NULL").delete_all
-    ShareVisibility.joins("LEFT OUTER JOIN photos ON photos.id = share_visibilities.shareable_id")
-                   .where(shareable_type: "Photo").where("photos.id is NULL").delete_all
-  end
-end
diff --git a/db/migrate/20160302025129_cleanup_aspect_visibility.rb b/db/migrate/20160302025129_cleanup_aspect_visibility.rb
deleted file mode 100644
index 7d3ae9c5fb50299768c3bd418595cfca24d24bd6..0000000000000000000000000000000000000000
--- a/db/migrate/20160302025129_cleanup_aspect_visibility.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-class CleanupAspectVisibility < ActiveRecord::Migration[4.2]
-  class AspectVisibility < ApplicationRecord
-  end
-
-  def up
-    AspectVisibility.joins("LEFT OUTER JOIN posts ON posts.id = aspect_visibilities.shareable_id")
-                    .where(shareable_type: "Post").where("posts.id is NULL").delete_all
-    AspectVisibility.joins("LEFT OUTER JOIN photos ON photos.id = aspect_visibilities.shareable_id")
-                    .where(shareable_type: "Photo").where("photos.id is NULL").delete_all
-    AspectVisibility.joins("INNER JOIN posts ON posts.id = aspect_visibilities.shareable_id")
-                    .where(shareable_type: "Post").where(posts: {public: true}).delete_all
-    AspectVisibility.joins("INNER JOIN photos ON photos.id = aspect_visibilities.shareable_id")
-                    .where(shareable_type: "Photo").where(photos: {public: true}).delete_all
-
-    remove_columns :aspect_visibilities, :created_at, :updated_at
-  end
-
-  def down
-    add_column :aspect_visibilities, :created_at, :datetime
-    add_column :aspect_visibilities, :updated_at, :datetime
-
-    User.all.each do |user|
-      user.posts.where(public: true).each {|post| user.add_to_streams(post, user.aspects) }
-      user.photos.where(public: true).each {|photo| user.add_to_streams(photo, user.aspects) }
-    end
-  end
-end
diff --git a/db/migrate/20160307142216_cleanup_handles.rb b/db/migrate/20160307142216_cleanup_handles.rb
deleted file mode 100644
index e39be2279bbe73709b6e9493aaa0dd399cc3befb..0000000000000000000000000000000000000000
--- a/db/migrate/20160307142216_cleanup_handles.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class CleanupHandles < ActiveRecord::Migration[4.2]
-  def change
-    remove_column :photos, :tmp_old_id, :integer
-    remove_column :photos, :diaspora_handle, :string
-    remove_column :posts, :diaspora_handle, :string
-  end
-end
diff --git a/db/migrate/20160327103605_add_author_id_index_to_participations.rb b/db/migrate/20160327103605_add_author_id_index_to_participations.rb
deleted file mode 100644
index c416079812cdf240d5c7305ac9f175eaec0023d1..0000000000000000000000000000000000000000
--- a/db/migrate/20160327103605_add_author_id_index_to_participations.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddAuthorIdIndexToParticipations < ActiveRecord::Migration[4.2]
-  def change
-    add_index :participations, :author_id, :using => :btree
-  end
-end
diff --git a/db/migrate/20160509232726_cleanup_duplicates_and_add_unique_indexes.rb b/db/migrate/20160509232726_cleanup_duplicates_and_add_unique_indexes.rb
deleted file mode 100644
index 4e17deb71648fd81d890fce15b00047032e3036c..0000000000000000000000000000000000000000
--- a/db/migrate/20160509232726_cleanup_duplicates_and_add_unique_indexes.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-class CleanupDuplicatesAndAddUniqueIndexes < ActiveRecord::Migration[4.2]
-  def up
-    # temporary index to speed up the migration
-    add_index :photos, :guid, length: 191
-
-    # fix share visibilities for private photos
-    if AppConfig.postgres?
-      execute "UPDATE share_visibilities" \
-              " SET shareable_id = (SELECT MIN(p3.id) FROM photos as p3 WHERE p3.guid = p1.guid)" \
-              " FROM photos as p1, photos as p2" \
-              " WHERE p1.id = share_visibilities.shareable_id AND (p1.guid = p2.guid AND p1.id > p2.id)" \
-              " AND share_visibilities.shareable_type = 'Photo'"
-    else
-      execute "UPDATE share_visibilities" \
-              " INNER JOIN photos as p1 ON p1.id = share_visibilities.shareable_id" \
-              " INNER JOIN photos as p2 ON p1.guid = p2.guid AND p1.id > p2.id" \
-              " SET share_visibilities.shareable_id = (SELECT MIN(p3.id) FROM photos as p3 WHERE p3.guid = p1.guid)" \
-              " WHERE share_visibilities.shareable_type = 'Photo'"
-    end
-
-    %i(conversations messages photos polls poll_answers poll_participations).each do |table|
-      delete_duplicates_and_create_unique_index(table)
-    end
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-
-  private
-
-  def delete_duplicates_and_create_unique_index(table)
-    # temporary index to speed up the migration
-    add_index table, :guid, length: 191 unless table == :photos
-
-    if AppConfig.postgres?
-      execute "DELETE FROM #{table} AS t1 USING #{table} AS t2 WHERE t1.guid = t2.guid AND t1.id > t2.id"
-    else
-      execute "DELETE t1 FROM #{table} t1, #{table} t2 WHERE t1.guid = t2.guid AND t1.id > t2.id"
-    end
-
-    remove_index table, column: :guid
-
-    # now create unique index \o/
-    add_index table, :guid, length: 191, unique: true
-  end
-end
diff --git a/db/migrate/20160531170531_remove_duplicate_aspect_visibilities.rb b/db/migrate/20160531170531_remove_duplicate_aspect_visibilities.rb
deleted file mode 100644
index 40306c8988518547915d2370e3f2e80dd3e6052b..0000000000000000000000000000000000000000
--- a/db/migrate/20160531170531_remove_duplicate_aspect_visibilities.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RemoveDuplicateAspectVisibilities < ActiveRecord::Migration[4.2]
-  def up
-    where = "WHERE a1.aspect_id = a2.aspect_id AND a1.shareable_id = a2.shareable_id AND "\
-      "a1.shareable_type = a2.shareable_type AND a1.id > a2.id"
-    if AppConfig.postgres?
-      execute("DELETE FROM aspect_visibilities AS a1 USING aspect_visibilities AS a2 #{where}")
-    else
-      execute("DELETE a1 FROM aspect_visibilities a1, aspect_visibilities a2 #{where}")
-    end
-  end
-end
diff --git a/db/migrate/20160618033455_cleanup_participations.rb b/db/migrate/20160618033455_cleanup_participations.rb
deleted file mode 100644
index df27d04a73ca80135f713ca14407677cec604747..0000000000000000000000000000000000000000
--- a/db/migrate/20160618033455_cleanup_participations.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-class CleanupParticipations < ActiveRecord::Migration[4.2]
-  class Participation < ApplicationRecord
-  end
-
-  def up
-    remove_column :participations, :author_signature
-
-    cleanup
-
-    remove_index :participations, name: :index_participations_on_target_id_and_target_type_and_author_id
-    add_index :participations, %i(target_id target_type author_id), unique: true
-  end
-
-  def down
-    remove_index :participations, name: :index_participations_on_target_id_and_target_type_and_author_id
-    add_index :participations, %i(target_id target_type author_id)
-    add_column :participations, :author_signature, :text
-  end
-
-  private
-
-  def cleanup
-    self_where = "WHERE participations.target_type = 'Post' AND participations.target_id = posts.id AND " \
-                 "posts.author_id = participations.author_id"
-    remote_where = "WHERE participations.target_type = 'Post' AND participations.target_id = posts.id AND " \
-                   "posts.author_id = post_author.id AND participations.author_id = author.id AND " \
-                   "author.owner_id is NULL AND post_author.owner_id is NULL"
-    duplicate_where = "WHERE p1.author_id = p2.author_id AND p1.target_id = p2.target_id " \
-                      "AND p1.target_type = p2.target_type AND p1.id > p2.id"
-
-    if AppConfig.postgres?
-      execute "DELETE FROM participations USING posts #{self_where}"
-      execute "DELETE FROM participations USING posts, people AS author, people AS post_author #{remote_where}"
-      execute "DELETE FROM participations AS p1 USING participations AS p2 #{duplicate_where}"
-    else
-      execute "DELETE participations FROM participations, posts #{self_where}"
-      execute "DELETE participations FROM participations, posts, people author, people post_author #{remote_where}"
-      execute "DELETE p1 FROM participations p1, participations p2 #{duplicate_where}"
-    end
-
-    Participation.joins("LEFT OUTER JOIN posts ON posts.id = participations.target_id")
-                 .where(target_type: "Post").where("posts.id is NULL").delete_all
-  end
-end
diff --git a/db/migrate/20160720212620_create_signature_tables.rb b/db/migrate/20160720212620_create_signature_tables.rb
deleted file mode 100644
index fa843fcdd7a72f50b36836d1eaca472724f559f7..0000000000000000000000000000000000000000
--- a/db/migrate/20160720212620_create_signature_tables.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-class CreateSignatureTables < ActiveRecord::Migration[4.2]
-  class SignatureOrder < ApplicationRecord
-  end
-
-  RELAYABLES = %i(comment like poll_participation).freeze
-
-  def self.up
-    create_table :signature_orders do |t|
-      t.string :order, null: false
-    end
-    add_index :signature_orders, :order, length: 191, unique: true
-
-    RELAYABLES.each {|relayable_type| create_signature_table(relayable_type) }
-
-    migrate_signatures
-
-    RELAYABLES.each {|relayable_type| remove_column "#{relayable_type}s", :author_signature }
-  end
-
-  def self.down
-    RELAYABLES.each {|relayable_type| add_column "#{relayable_type}s", :author_signature, :text }
-
-    RELAYABLES.each {|relayable_type| restore_signatures(relayable_type) }
-
-    drop_table :comment_signatures
-    drop_table :like_signatures
-    drop_table :poll_participation_signatures
-    drop_table :signature_orders
-  end
-
-  private
-
-  def create_signature_table(relayable_type)
-    create_table "#{relayable_type}_signatures", id: false do |t|
-      t.integer "#{relayable_type}_id", null: false
-      t.text    :author_signature,      null: false
-      t.integer :signature_order_id,    null: false
-      t.text    :additional_data
-    end
-
-    add_index "#{relayable_type}_signatures", "#{relayable_type}_id", unique: true
-
-    add_foreign_key "#{relayable_type}_signatures", :signature_orders,
-                    name: "#{relayable_type}_signatures_signature_orders_id_fk"
-    add_foreign_key "#{relayable_type}_signatures", "#{relayable_type}s",
-                    name: "#{relayable_type}_signatures_#{relayable_type}_id_fk", on_delete: :cascade
-  end
-
-  def migrate_signatures
-    comment_order_id = SignatureOrder.create!(order: "guid parent_guid text author").id
-    comment_parent_join = "INNER JOIN posts AS parent ON relayable.commentable_id = parent.id"
-    migrate_signatures_for(:comment, comment_order_id, comment_parent_join)
-
-    like_order_id = SignatureOrder.create!(order: "positive guid parent_type parent_guid author").id
-    post_like_join = "INNER JOIN posts AS parent ON relayable.target_id = parent.id AND relayable.target_type = 'Post'"
-    comment_like_join = "INNER JOIN comments ON relayable.target_id = comments.id " \
-                        "AND relayable.target_type = 'Comment' " \
-                        "INNER JOIN posts AS parent ON comments.commentable_id = parent.id"
-    migrate_signatures_for(:like, like_order_id, post_like_join)
-    migrate_signatures_for(:like, like_order_id, comment_like_join)
-
-    poll_participation_order_id = SignatureOrder.create!(order: "guid parent_guid author poll_answer_guid").id
-    poll_participation_parent_join = "INNER JOIN polls ON relayable.poll_id = polls.id " \
-                                     "INNER JOIN posts AS parent ON polls.status_message_id = parent.id"
-    migrate_signatures_for(:poll_participation, poll_participation_order_id, poll_participation_parent_join)
-  end
-
-  def migrate_signatures_for(relayable_type, order_id, parent_join)
-    execute "INSERT INTO #{relayable_type}_signatures (#{relayable_type}_id, signature_order_id, author_signature) " \
-            "SELECT relayable.id, #{order_id}, relayable.author_signature FROM #{relayable_type}s AS relayable " \
-            "INNER JOIN people AS author ON relayable.author_id = author.id " \
-            "#{parent_join} INNER JOIN people AS parent_author ON parent.author_id = parent_author.id " \
-            "WHERE author.owner_id IS NULL AND parent_author.owner_id IS NOT NULL AND relayable.author_signature IS NOT NULL"
-  end
-
-  def restore_signatures(relayable_type)
-    if AppConfig.postgres?
-      execute "UPDATE #{relayable_type}s SET author_signature = #{relayable_type}_signatures.author_signature " \
-              "FROM #{relayable_type}_signatures " \
-              "WHERE #{relayable_type}s.id = #{relayable_type}_signatures.#{relayable_type}_id "
-    else
-      execute "UPDATE #{relayable_type}s INNER JOIN #{relayable_type}_signatures " \
-              "ON #{relayable_type}s.id = #{relayable_type}_signatures.#{relayable_type}_id " \
-              "SET #{relayable_type}s.author_signature = #{relayable_type}_signatures.author_signature"
-    end
-  end
-end
diff --git a/db/migrate/20160802212635_cleanup_posts_table.rb b/db/migrate/20160802212635_cleanup_posts_table.rb
deleted file mode 100644
index ffab18c7db233b73c5ff681af828edf8639ffbe8..0000000000000000000000000000000000000000
--- a/db/migrate/20160802212635_cleanup_posts_table.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-class CleanupPostsTable < ActiveRecord::Migration[4.2]
-  def change
-    remove_index :posts, column: %i(status_message_guid pending),
-                 name: :index_posts_on_status_message_guid_and_pending, length: {status_message_guid: 190}
-    remove_index :posts, column: :status_message_guid, name: :index_posts_on_status_message_guid, length: 191
-    remove_index :posts, column: %i(type pending id), name: :index_posts_on_type_and_pending_and_id
-
-    # from photos?
-    remove_column :posts, :pending, :boolean, default: false, null: false
-    remove_column :posts, :remote_photo_path, :text
-    remove_column :posts, :remote_photo_name, :string
-    remove_column :posts, :random_string, :string
-    remove_column :posts, :processed_image, :string
-    remove_column :posts, :unprocessed_image, :string
-    remove_column :posts, :status_message_guid, :string
-
-    # old cubbi.es stuff
-    remove_column :posts, :object_url, :string
-    remove_column :posts, :image_url, :string
-    remove_column :posts, :image_height, :integer
-    remove_column :posts, :image_width, :integer
-    remove_column :posts, :actor_url, :string
-    remove_column :posts, :objectId, :string
-
-    # old single post view templates
-    remove_column :posts, :frame_name, :string
-
-    add_index :posts, %i(id type), name: :index_posts_on_id_and_type
-  end
-end
diff --git a/db/migrate/20160807212443_participation_counter.rb b/db/migrate/20160807212443_participation_counter.rb
deleted file mode 100644
index 719458ec7e4c831c401ff561a0659d95e372e30a..0000000000000000000000000000000000000000
--- a/db/migrate/20160807212443_participation_counter.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-class ParticipationCounter < ActiveRecord::Migration[4.2]
-  class Comment < ApplicationRecord
-  end
-
-  class Like < ApplicationRecord
-  end
-
-  class Participation < ApplicationRecord
-    belongs_to :author, class_name: "Person"
-  end
-
-  class Poll < ApplicationRecord
-  end
-
-  class PollParticipation < ApplicationRecord
-    belongs_to :poll
-  end
-
-  def up
-    return if ActiveRecord::SchemaMigration.where(version: "20150404193023").exists?
-
-    add_column :participations, :count, :integer, null: false, default: 1
-
-    likes_count = Like.select("COUNT(likes.id)")
-                      .where("likes.target_id = participations.target_id")
-                      .where("likes.author_id = participations.author_id")
-                      .to_sql
-    comments_count = Comment.select("COUNT(comments.id)")
-                            .where("comments.commentable_id = participations.target_id")
-                            .where("comments.author_id = participations.author_id")
-                            .to_sql
-    polls_count = PollParticipation.select("COUNT(*)")
-                                   .where("poll_participations.author_id = participations.author_id")
-                                   .joins(:poll)
-                                   .where("polls.status_message_id = participations.target_id")
-                                   .to_sql
-    Participation.joins(:author).where.not(people: {owner_id: nil})
-                 .update_all("count = (#{likes_count}) + (#{comments_count}) + (#{polls_count})")
-    Participation.where(count: 0).update_all(count: 1)
-  end
-
-  def down
-    remove_column :participations, :count
-
-    ActiveRecord::SchemaMigration.where(version: "20150404193023").delete_all
-  end
-end
diff --git a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb b/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb
deleted file mode 100644
index 2022589fc23967cf91e7634950600be6ea8170f0..0000000000000000000000000000000000000000
--- a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration[4.2]
-  class InvitationCode < ApplicationRecord
-  end
-
-  class User < ApplicationRecord
-  end
-
-  def change
-    remove_index :users, column: %i(invitation_service invitation_identifier),
-                 name: :index_users_on_invitation_service_and_invitation_identifier,
-                 unique: true, length: {invitation_service: 64}
-    remove_index :users, column: :invitation_token, name: :index_users_on_invitation_token
-    remove_index :users, column: :email, name: :index_users_on_email, length: 191
-
-    cleanup_invitations
-
-    remove_column :users, :invitation_token, :string, limit: 60
-    remove_column :users, :invitation_sent_at, :datetime
-    remove_column :users, :invitation_service, :string, limit: 127
-    remove_column :users, :invitation_identifier, :string, limit: 127
-    remove_column :users, :invitation_limit, :integer
-    remove_column :users, :invited_by_type, :string
-
-    add_index :users, :email, name: :index_users_on_email, unique: true, length: 191
-  end
-
-  def cleanup_invitations
-    reversible do |dir|
-      dir.up do
-        drop_table :invitations
-
-        # reset negative invitation counters
-        new_counter = AppConfig.settings.enable_registrations? ? AppConfig["settings.invitations.count"] : 0
-        InvitationCode.where("count < 0").update_all(count: new_counter)
-
-        # remove old invitation-users
-        User.where(username: nil).delete_all
-        change_column :users, :username, :string, null: false
-      end
-
-      dir.down do
-        change_column :users, :username, :string, null: true
-
-        create_invitations_table
-      end
-    end
-  end
-
-  def create_invitations_table
-    # rubocop:disable Layout/ExtraSpacing
-    create_table :invitations, force: :cascade do |t|
-      t.text     :message,      limit: 65_535
-      t.integer  :sender_id,    limit: 4
-      t.integer  :recipient_id, limit: 4
-      t.integer  :aspect_id,    limit: 4
-      t.datetime :created_at,                                 null: false
-      t.datetime :updated_at,                                 null: false
-      t.string   :service,      limit: 255
-      t.string   :identifier,   limit: 255
-      t.boolean  :admin,                      default: false
-      t.string   :language,     limit: 255,   default: "en"
-    end
-    # rubocop:enable Layout/ExtraSpacing
-
-    add_index :invitations, :aspect_id, name: :index_invitations_on_aspect_id, using: :btree
-    add_index :invitations, :recipient_id, name: :index_invitations_on_recipient_id, using: :btree
-    add_index :invitations, :sender_id, name: :index_invitations_on_sender_id, using: :btree
-
-    add_foreign_key :invitations, :users, column: :recipient_id, name: :invitations_recipient_id_fk, on_delete: :cascade
-    add_foreign_key :invitations, :users, column: :sender_id, name: :invitations_sender_id_fk, on_delete: :cascade
-  end
-end
diff --git a/db/migrate/20160813115514_remove_id_tokens.rb b/db/migrate/20160813115514_remove_id_tokens.rb
deleted file mode 100644
index 346b2a24b7fc744866edc04b52d5477f65954be5..0000000000000000000000000000000000000000
--- a/db/migrate/20160813115514_remove_id_tokens.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require_relative "20150714055110_create_id_tokens"
-
-class RemoveIdTokens < ActiveRecord::Migration[4.2]
-  def change
-    revert CreateIdTokens
-  end
-end
diff --git a/db/migrate/20160822212739_remove_started_sharing_notifications_without_contact.rb b/db/migrate/20160822212739_remove_started_sharing_notifications_without_contact.rb
deleted file mode 100644
index ddd1f5b3a20a555fc3a08ccee6d8d2f574bb553e..0000000000000000000000000000000000000000
--- a/db/migrate/20160822212739_remove_started_sharing_notifications_without_contact.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class RemoveStartedSharingNotificationsWithoutContact < ActiveRecord::Migration[4.2]
-  class Notification < ApplicationRecord
-  end
-
-  def up
-    Notification.where(type: "Notifications::StartedSharing", target_type: "Person")
-                .joins("INNER JOIN people ON people.id = notifications.target_id")
-                .joins("LEFT OUTER JOIN contacts ON contacts.person_id = people.id " \
-                       "AND contacts.user_id = notifications.recipient_id")
-                .where("contacts.id IS NULL")
-                .delete_all
-  end
-end
diff --git a/db/migrate/20160829170244_add_post_default_to_aspects.rb b/db/migrate/20160829170244_add_post_default_to_aspects.rb
index e861933463d32018dfd4942b0db305eeb62ae020..364c48a54b237fe0ccf1cd3899c94f7ee1858e50 100644
--- a/db/migrate/20160829170244_add_post_default_to_aspects.rb
+++ b/db/migrate/20160829170244_add_post_default_to_aspects.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AddPostDefaultToAspects < ActiveRecord::Migration[4.2]
   def change
     add_column :aspects, :post_default, :boolean, default: true
diff --git a/db/migrate/20160901072443_add_video_url_to_open_graph_cache.rb b/db/migrate/20160901072443_add_video_url_to_open_graph_cache.rb
index eb123a6b3ed2f2636420739b6d96fff686af3406..382891aa82026b5d0fd8be693f6ef0b452d7e2e1 100644
--- a/db/migrate/20160901072443_add_video_url_to_open_graph_cache.rb
+++ b/db/migrate/20160901072443_add_video_url_to_open_graph_cache.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AddVideoUrlToOpenGraphCache < ActiveRecord::Migration[4.2]
   def change
     add_column :open_graph_caches, :video_url, :text
diff --git a/db/migrate/20160902180630_remove_invalid_unconfirmed_emails.rb b/db/migrate/20160902180630_remove_invalid_unconfirmed_emails.rb
index 27a7feecf059f7a4d6431ccb5218421f5f4f64f0..5bd31acd54b5736977028c405505f57ccb68aaab 100644
--- a/db/migrate/20160902180630_remove_invalid_unconfirmed_emails.rb
+++ b/db/migrate/20160902180630_remove_invalid_unconfirmed_emails.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class RemoveInvalidUnconfirmedEmails < ActiveRecord::Migration[4.2]
   class User < ApplicationRecord
   end
diff --git a/db/migrate/20160906225138_fix_photos_share_visibilities.rb b/db/migrate/20160906225138_fix_photos_share_visibilities.rb
index ff382a7d5201de13b4ed8f950e2eeb5e10467381..6bfb39fc934749d066fe72e17ead935a52861d16 100644
--- a/db/migrate/20160906225138_fix_photos_share_visibilities.rb
+++ b/db/migrate/20160906225138_fix_photos_share_visibilities.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class FixPhotosShareVisibilities < ActiveRecord::Migration[4.2]
   class Photo < ApplicationRecord
   end
diff --git a/db/migrate/20161015174300_remove_empty_pod.rb b/db/migrate/20161015174300_remove_empty_pod.rb
index ba7369bc179c3671c048579978b73d80eb29b8fd..a76dbb0bda036aa720e46439af7ad6bcb1511fe3 100644
--- a/db/migrate/20161015174300_remove_empty_pod.rb
+++ b/db/migrate/20161015174300_remove_empty_pod.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class RemoveEmptyPod < ActiveRecord::Migration[4.2]
   def up
     Pod.where("host IS NULL").delete_all
diff --git a/db/migrate/20161024231443_add_scheduled_check_to_pod.rb b/db/migrate/20161024231443_add_scheduled_check_to_pod.rb
index b080564b7889ab703fffe72ee850617bda30f6c9..57854110742b8b630c5b6d36689b6dc59ebfe672 100644
--- a/db/migrate/20161024231443_add_scheduled_check_to_pod.rb
+++ b/db/migrate/20161024231443_add_scheduled_check_to_pod.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AddScheduledCheckToPod < ActiveRecord::Migration[4.2]
   def change
     add_column :pods, :scheduled_check, :boolean, default: false, null: false
diff --git a/db/migrate/20161107100840_polymorphic_mentions.rb b/db/migrate/20161107100840_polymorphic_mentions.rb
index 99f65d822ce0f6f13f938de71fab29943f71b1f1..01729ffac4e79849fe32988410e06e99cf69b058 100644
--- a/db/migrate/20161107100840_polymorphic_mentions.rb
+++ b/db/migrate/20161107100840_polymorphic_mentions.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PolymorphicMentions < ActiveRecord::Migration[4.2]
   def change
     remove_index :mentions, column: %i(post_id)
diff --git a/db/migrate/20170430022507_remove_message_signature.rb b/db/migrate/20170430022507_remove_message_signature.rb
index a8e65c2e071697e42146767e471ab92622b4fd20..17df7883682facae77d3d071db7d33fd201f2fe5 100644
--- a/db/migrate/20170430022507_remove_message_signature.rb
+++ b/db/migrate/20170430022507_remove_message_signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class RemoveMessageSignature < ActiveRecord::Migration[4.2]
   def change
     remove_column :messages, :author_signature, :text
diff --git a/db/migrate/20170730154117_create_account_migrations.rb b/db/migrate/20170730154117_create_account_migrations.rb
index b01eadbc60e13ec8e9005703a6384a8fdd84acf0..7b430d6a171a1c8e37ed57e2582c3aab428c81a9 100644
--- a/db/migrate/20170730154117_create_account_migrations.rb
+++ b/db/migrate/20170730154117_create_account_migrations.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CreateAccountMigrations < ActiveRecord::Migration[5.1]
   def change
     create_table :account_migrations do |t|
diff --git a/db/migrate/20170813141631_cleanup_account_deletions_and_add_unique_index.rb b/db/migrate/20170813141631_cleanup_account_deletions_and_add_unique_index.rb
index 6d188278dd62c0368d277a09f52002dda0acbf94..619cff1b768de3896c5b56c1593f5d7b9e3c5567 100644
--- a/db/migrate/20170813141631_cleanup_account_deletions_and_add_unique_index.rb
+++ b/db/migrate/20170813141631_cleanup_account_deletions_and_add_unique_index.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CleanupAccountDeletionsAndAddUniqueIndex < ActiveRecord::Migration[5.1]
   def up
     remove_column :account_deletions, :diaspora_handle
diff --git a/db/migrate/20170813153048_add_missing_indexes.rb b/db/migrate/20170813153048_add_missing_indexes.rb
index 9da177a30bc2394f3cc0507296e0b4a54732f5ee..f43c8f46ecabbf1f694ff8c452daec41ddbc82e5 100644
--- a/db/migrate/20170813153048_add_missing_indexes.rb
+++ b/db/migrate/20170813153048_add_missing_indexes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AddMissingIndexes < ActiveRecord::Migration[5.1]
   def change
     add_index :photos, :author_id
diff --git a/db/migrate/20170813160104_cleanup_aspects_and_add_unique_index.rb b/db/migrate/20170813160104_cleanup_aspects_and_add_unique_index.rb
index 324f43a09171bc34c6c283d81c468815754a0277..1d8c7325ac0004686078b94e1f5803a2f3d0fdc1 100644
--- a/db/migrate/20170813160104_cleanup_aspects_and_add_unique_index.rb
+++ b/db/migrate/20170813160104_cleanup_aspects_and_add_unique_index.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class CleanupAspectsAndAddUniqueIndex < ActiveRecord::Migration[5.1]
   class Aspect < ApplicationRecord
   end
diff --git a/db/migrate/20170813164435_add_missing_unique_indexes.rb b/db/migrate/20170813164435_add_missing_unique_indexes.rb
index 4c853fbf1a97746fbd3d5609144d410abac79f18..7626bac5e70ffdcbb83e8f9e33eabbd6355aeda9 100644
--- a/db/migrate/20170813164435_add_missing_unique_indexes.rb
+++ b/db/migrate/20170813164435_add_missing_unique_indexes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class AddMissingUniqueIndexes < ActiveRecord::Migration[5.1]
   def up
     cleanup
diff --git a/db/migrate/20170813222333_reset_export_states.rb b/db/migrate/20170813222333_reset_export_states.rb
index 12a7e5789e87c93c4cbfcca90a0c6871c0648909..122861d3ad02ee0e0cb55a924d4f1a2eb0609dd5 100644
--- a/db/migrate/20170813222333_reset_export_states.rb
+++ b/db/migrate/20170813222333_reset_export_states.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ResetExportStates < ActiveRecord::Migration[5.1]
   class User < ApplicationRecord
   end
diff --git a/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb b/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bc0ff10a7f6c0c472e9a3351d3ef607a8ef60418
--- /dev/null
+++ b/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class CleanupRootGuidsFromReshares < ActiveRecord::Migration[5.1]
+  def up
+    # rubocop:disable Rails/SkipsModelValidations
+    Reshare.joins("LEFT OUTER JOIN posts as root ON root.guid = posts.root_guid")
+           .where("root.id is NULL AND posts.root_guid is NOT NULL")
+           .update_all(root_guid: nil)
+    # rubocop:enable Rails/SkipsModelValidations
+  end
+end
diff --git a/db/migrate/20170827222357_remove_rails_admin_histories.rb b/db/migrate/20170827222357_remove_rails_admin_histories.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7c914cb8b3ab3990545f2eeb717abf067c470acb
--- /dev/null
+++ b/db/migrate/20170827222357_remove_rails_admin_histories.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class RemoveRailsAdminHistories < ActiveRecord::Migration[5.1]
+  def up
+    drop_table :rails_admin_histories
+  end
+
+  def down
+    create_table :rails_admin_histories do |t|
+      t.text     :message
+      t.string   :username
+      t.integer  :item
+      t.string   :table
+      t.integer  :month,      limit: 2
+      t.integer  :year,       limit: 8
+      t.datetime :created_at,           null: false
+      t.datetime :updated_at,           null: false
+    end
+
+    add_index :rails_admin_histories, %i[item table month year], name:   :index_rails_admin_histories,
+                                                                 length: {table: 188}
+  end
+end
diff --git a/db/migrate/20170827231800_remove_string_column_from_ppid.rb b/db/migrate/20170827231800_remove_string_column_from_ppid.rb
new file mode 100644
index 0000000000000000000000000000000000000000..019fda8279844cfae783648a7a40b76186b738ef
--- /dev/null
+++ b/db/migrate/20170827231800_remove_string_column_from_ppid.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveStringColumnFromPpid < ActiveRecord::Migration[5.1]
+  def change
+    remove_column :ppid, :string, :string, limit: 32
+  end
+end
diff --git a/db/migrate/20170914202650_cleanup_invalid_likes.rb b/db/migrate/20170914202650_cleanup_invalid_likes.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2f1805fa00771145760fefb6a8f129deb82fa67f
--- /dev/null
+++ b/db/migrate/20170914202650_cleanup_invalid_likes.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class CleanupInvalidLikes < ActiveRecord::Migration[5.1]
+  class Like < ApplicationRecord
+  end
+
+  def up
+    Like.where(target_type: "Post").joins("LEFT OUTER JOIN posts ON posts.id = likes.target_id")
+        .where("posts.id IS NULL").delete_all
+    Like.where(target_type: "Comment").joins("LEFT OUTER JOIN comments ON comments.id = likes.target_id")
+        .where("comments.id IS NULL").delete_all
+  end
+end
diff --git a/db/migrate/20170914212336_cleanup_invalid_polls.rb b/db/migrate/20170914212336_cleanup_invalid_polls.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7d7cda97f943fbf7e2b9ed945ea6b5c79ba223bf
--- /dev/null
+++ b/db/migrate/20170914212336_cleanup_invalid_polls.rb
@@ -0,0 +1,19 @@
+class CleanupInvalidPolls < ActiveRecord::Migration[5.1]
+  class Poll < ApplicationRecord
+    has_many :poll_answers, dependent: :destroy
+    has_many :poll_participations, dependent: :destroy
+  end
+  class PollAnswer < ApplicationRecord
+    belongs_to :poll
+    has_many :poll_participations
+  end
+  class PollParticipation < ApplicationRecord
+    belongs_to :poll
+    belongs_to :poll_answer
+  end
+
+  def up
+    Poll.joins("LEFT OUTER JOIN posts ON posts.id = polls.status_message_id")
+        .where("posts.id IS NULL").destroy_all
+  end
+end
diff --git a/db/migrate/20170917163640_cleanup_invalid_o_embed_caches.rb b/db/migrate/20170917163640_cleanup_invalid_o_embed_caches.rb
new file mode 100644
index 0000000000000000000000000000000000000000..89272d2ffd49a3d1f27c72bd98f9b2d128f15a36
--- /dev/null
+++ b/db/migrate/20170917163640_cleanup_invalid_o_embed_caches.rb
@@ -0,0 +1,12 @@
+class CleanupInvalidOEmbedCaches < ActiveRecord::Migration[5.1]
+  class OEmbedCache < ApplicationRecord
+  end
+  class Post < ApplicationRecord
+  end
+
+  def up
+    ids = OEmbedCache.where("data LIKE '%!binary%'").ids
+    Post.where(o_embed_cache_id: ids).update_all(o_embed_cache_id: nil) # rubocop:disable Rails/SkipsModelValidations
+    OEmbedCache.where(id: ids).delete_all
+  end
+end
diff --git a/db/migrate/20170920214158_create_references_table.rb b/db/migrate/20170920214158_create_references_table.rb
new file mode 100644
index 0000000000000000000000000000000000000000..75ce6c10973d44879544988bbd70440cf39c40f9
--- /dev/null
+++ b/db/migrate/20170920214158_create_references_table.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class CreateReferencesTable < ActiveRecord::Migration[5.1]
+  def change
+    create_table :references do |t|
+      t.integer  :source_id,              null: false
+      t.string   :source_type, limit: 60, null: false
+      t.integer  :target_id,              null: false
+      t.string   :target_type, limit: 60, null: false
+    end
+
+    add_index :references, %i[source_id source_type target_id target_type],
+              name: :index_references_on_source_and_target, unique: true
+    add_index :references, %i[source_id source_type], name: :index_references_on_source_id_and_source_type
+  end
+end
diff --git a/db/migrate/20170928233609_cleanup_invalid_diaspora_ids.rb b/db/migrate/20170928233609_cleanup_invalid_diaspora_ids.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f88fec22b98c60e6a5701c1817cd149a068ce27a
--- /dev/null
+++ b/db/migrate/20170928233609_cleanup_invalid_diaspora_ids.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class CleanupInvalidDiasporaIds < ActiveRecord::Migration[5.1]
+  def up
+    ids = Person.where("diaspora_handle LIKE '%@%/%'").ids
+    return if ids.empty?
+
+    AspectMembership.joins(:contact).where(contacts: {person_id: ids}).delete_all
+
+    Person.where(id: ids).each do |person|
+      destroy_notifications_for_person(person)
+      person.destroy
+    end
+  end
+
+  def destroy_notifications_for_person(person)
+    Notification.joins(:notification_actors).where(notification_actors: {person_id: person.id}).each do |notification|
+      if notification.notification_actors.count > 1
+        notification.notification_actors.where(person_id: person.id).delete_all
+      else
+        notification.destroy
+      end
+    end
+  end
+end
diff --git a/db/migrate/20171009232054_cleanup_relayables_without_signature.rb b/db/migrate/20171009232054_cleanup_relayables_without_signature.rb
new file mode 100644
index 0000000000000000000000000000000000000000..12af91f198ae4ed6751c6959431089fe845a9749
--- /dev/null
+++ b/db/migrate/20171009232054_cleanup_relayables_without_signature.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+class CleanupRelayablesWithoutSignature < ActiveRecord::Migration[5.1]
+  class Comment < ApplicationRecord
+    belongs_to :commentable, polymorphic: true
+
+    before_destroy do
+      Like.where(target_type: "Comment", target_id: id).destroy_all
+      ActsAsTaggableOn::Tagging.where(taggable_type: "Comment", taggable_id: id).destroy_all
+    end
+
+    after_destroy do
+      commentable.update_comments_counter
+    end
+  end
+
+  class Like < ApplicationRecord
+    belongs_to :target, polymorphic: true
+
+    has_one :signature, class_name: "LikeSignature", dependent: :delete
+
+    after_destroy do
+      target.update_likes_counter
+    end
+  end
+
+  class PollParticipation < ApplicationRecord
+    belongs_to :poll_answer, counter_cache: :vote_count
+  end
+
+  def up
+    cleanup_comments
+    cleanup_likes
+    cleanup_poll_participations
+  end
+
+  def cleanup_comments
+    Comment.joins("INNER JOIN posts as post ON post.id = comments.commentable_id AND " \
+                  "comments.commentable_type = 'Post'")
+           .joins("INNER JOIN people as comment_author ON comment_author.id = comments.author_id")
+           .joins("INNER JOIN people as post_author ON post_author.id = post.author_id")
+           .where("comment_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \
+                  "AND NOT EXISTS(" \
+                    "SELECT NULL FROM comment_signatures WHERE comment_signatures.comment_id = comments.id" \
+                  ")")
+           .destroy_all
+  end
+
+  def cleanup_likes
+    Like.joins("INNER JOIN posts as post ON post.id = likes.target_id AND likes.target_type = 'Post'")
+        .joins("INNER JOIN people as like_author ON like_author.id = likes.author_id")
+        .joins("INNER JOIN people as post_author ON post_author.id = post.author_id")
+        .where("like_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \
+               "AND NOT EXISTS(" \
+                 "SELECT NULL FROM like_signatures WHERE like_signatures.like_id = likes.id" \
+               ")")
+        .destroy_all
+    Like.joins("INNER JOIN comments as comment ON comment.id = likes.target_id AND likes.target_type = 'Comment'")
+        .joins("INNER JOIN posts as post ON post.id = comment.commentable_id AND comment.commentable_type = 'Post'")
+        .joins("INNER JOIN people as like_author ON like_author.id = likes.author_id")
+        .joins("INNER JOIN people as post_author ON post_author.id = post.author_id")
+        .where("like_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \
+               "AND NOT EXISTS(" \
+                 "SELECT NULL FROM like_signatures WHERE like_signatures.like_id = likes.id" \
+               ")")
+        .destroy_all
+  end
+
+  def cleanup_poll_participations
+    PollParticipation.joins("INNER JOIN polls as poll ON poll.id = poll_participations.poll_id")
+                     .joins("INNER JOIN posts as post ON post.id = poll.status_message_id")
+                     .joins("INNER JOIN people as pp_author ON pp_author.id = poll_participations.author_id")
+                     .joins("INNER JOIN people as post_author ON post_author.id = post.author_id")
+                     .where("pp_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \
+                            "AND NOT EXISTS(" \
+                              "SELECT NULL FROM poll_participation_signatures " \
+                              "WHERE poll_participation_signatures.poll_participation_id = poll_participations.id" \
+                            ")")
+                     .destroy_all
+  end
+end
diff --git a/db/migrate/20171012202650_cleanup_invalid_contacts.rb b/db/migrate/20171012202650_cleanup_invalid_contacts.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7097247231681e45ad55a5a834bd60b69f8e20fb
--- /dev/null
+++ b/db/migrate/20171012202650_cleanup_invalid_contacts.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class CleanupInvalidContacts < ActiveRecord::Migration[5.1]
+  class Contact < ApplicationRecord
+    belongs_to :user
+    belongs_to :person
+
+    has_many :aspect_memberships, dependent: :delete_all
+
+    before_destroy :destroy_notifications
+
+    def destroy_notifications
+      Notification.where(
+        target_type:  "Person",
+        target_id:    person_id,
+        recipient_id: user_id,
+        type:         "Notifications::StartedSharing"
+      ).destroy_all
+    end
+  end
+
+  class User < ApplicationRecord
+  end
+
+  class Person < ApplicationRecord
+    belongs_to :owner, class_name: "User", optional: true
+  end
+
+  class Notification < ApplicationRecord
+    self.inheritance_column = nil
+    has_many :notification_actors, dependent: :delete_all
+  end
+
+  class NotificationActor < ApplicationRecord
+  end
+
+  class AspectMembership < ApplicationRecord
+  end
+
+  def up
+    Contact.left_outer_joins(:user).where("users.id is NULL").destroy_all
+    Contact.left_outer_joins(person: :owner).where("people.owner_id is NOT NULL").where("users.id is NULL").destroy_all
+  end
+end
diff --git a/db/migrate/20171017221434_cleanup_empty_signatures.rb b/db/migrate/20171017221434_cleanup_empty_signatures.rb
new file mode 100644
index 0000000000000000000000000000000000000000..de12be8b1e1c0d3fd4777f2198e21bd1a1c3f372
--- /dev/null
+++ b/db/migrate/20171017221434_cleanup_empty_signatures.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class CleanupEmptySignatures < ActiveRecord::Migration[5.1]
+  class Comment < ApplicationRecord
+    belongs_to :commentable, polymorphic: true
+
+    has_one :signature, class_name: "CommentSignature", dependent: :delete
+
+    before_destroy do
+      Like.where(target_type: "Comment", target_id: id).destroy_all
+      ActsAsTaggableOn::Tagging.where(taggable_type: "Comment", taggable_id: id).destroy_all
+    end
+
+    after_destroy do
+      commentable.update_comments_counter
+    end
+  end
+
+  class Like < ApplicationRecord
+    belongs_to :target, polymorphic: true
+
+    has_one :signature, class_name: "LikeSignature", dependent: :delete
+
+    after_destroy do
+      target.update_likes_counter
+    end
+  end
+
+  class PollParticipation < ApplicationRecord
+    belongs_to :poll_answer, counter_cache: :vote_count
+
+    has_one :signature, class_name: "PollParticipationSignature", dependent: :delete
+  end
+
+  def up
+    Comment.joins("INNER JOIN comment_signatures as signature ON comments.id = signature.comment_id")
+           .where("signature.author_signature = ''").destroy_all
+    Like.joins("INNER JOIN like_signatures as signature ON likes.id = signature.like_id")
+        .where("signature.author_signature = ''").destroy_all
+    PollParticipation.joins("INNER JOIN poll_participation_signatures as signature " \
+                            "ON poll_participations.id = signature.poll_participation_id")
+                     .where("signature.author_signature = ''").destroy_all
+  end
+end
diff --git a/features/desktop/change_settings.feature b/features/desktop/change_settings.feature
index 6bc8ae64169eb5102eeffe283d911c4b4ad3440b..d30f6f1371aec6d7595d87054397f1bd497f7c55 100644
--- a/features/desktop/change_settings.feature
+++ b/features/desktop/change_settings.feature
@@ -36,7 +36,7 @@ Feature: Change settings
   Scenario: Change my post default aspects
     When I go to the stream page
     And I expand the publisher
-    Then I should see "All aspects" within ".aspect_dropdown"
+    Then I should see "All aspects" within ".aspect-dropdown"
     When I go to the edit user page
     And I press the aspect dropdown
     And I toggle the aspect "Family"
@@ -44,7 +44,7 @@ Feature: Change settings
     And I press "Change" within "#post-default-aspects"
     And I go to the stream page
     And I expand the publisher
-    Then I should see "Family" within ".aspect_dropdown"
+    Then I should see "Family" within ".aspect-dropdown"
 
   Scenario: Change my post default to public
     When I press the aspect dropdown
@@ -52,7 +52,7 @@ Feature: Change settings
     And I press "Change" within "#post-default-aspects"
     And I go to the stream page
     And I expand the publisher
-    Then I should see "Public" within ".aspect_dropdown"
+    Then I should see "Public" within ".aspect-dropdown"
 
   Scenario: exporting profile data
     When I click on the first selector "#account_data a"
diff --git a/features/desktop/comments.feature b/features/desktop/comments.feature
index 0ef2ca6c8fa90ead72b75a946c2a6368b0bf1d2d..2a1afbf5436c3ddf8f2b66546c219a846111a8f4 100644
--- a/features/desktop/comments.feature
+++ b/features/desktop/comments.feature
@@ -19,6 +19,7 @@ Feature: commenting
     When I focus the comment field
     And I fill in the following:
         | text            | is that a poodle?    |
+    And I reject the alert after I follow "My activity"
     And I press "Comment"
     Then I should see "is that a poodle?" within ".comment"
     And I should see "less than a minute ago" within ".comment time"
diff --git a/features/desktop/connects_users.feature b/features/desktop/connects_users.feature
index b9f93473564bb8abc3fa77f63f221638a3905d8c..7016c8351c913a4297f0fc016d7e3bb2b7aa3361 100644
--- a/features/desktop/connects_users.feature
+++ b/features/desktop/connects_users.feature
@@ -30,7 +30,7 @@ Feature: following and being followed
     When I sign in as "alice@alice.alice"
     And I am on "bob@bob.bob"'s page
 
-    And I press the first ".aspect_membership_dropdown .dropdown-toggle"
+    And I press the first ".aspect-membership-dropdown .dropdown-toggle"
     And I press the first "a" within ".add_aspect"
 
     And I fill in "aspect_name" with "Super People" in the aspect creation modal
diff --git a/features/desktop/contacts.feature b/features/desktop/contacts.feature
index 5521f74fe2b3a50f5875777cc54abc0816297e66..1beecbc86c9f4e096a43bdb9a3e5c10c088c2fdd 100644
--- a/features/desktop/contacts.feature
+++ b/features/desktop/contacts.feature
@@ -25,8 +25,8 @@ Feature: show contacts
     Then I should see "Contacts" within "#profile-horizontal-bar"
 
     When I press the first "#contacts_link"
-    Then I should see "Bob Jones" within "#people_stream .media-body"
-    When I add the person to my "Besties" aspect within "#people_stream"
+    Then I should see "Bob Jones" within "#people-stream .media-body"
+    When I add the person to my "Besties" aspect within "#people-stream"
     Then I should see a flash message containing "You have started sharing with Bob Jones!"
 
   Scenario: don't see contacts of an invisible aspect list
diff --git a/features/desktop/conversations.feature b/features/desktop/conversations.feature
index a9408fb691701fe461f7d099c0ce1fa1db992239..a8affa3addd5c7bac6b1a97bdf1b2c8e8435554c 100644
--- a/features/desktop/conversations.feature
+++ b/features/desktop/conversations.feature
@@ -24,12 +24,12 @@ Feature: private conversations
     And I should see "less than a minute ago" within "#conversation-show"
     And I should see "Alice Awesome" as a participant
     And "Alice Awesome" should be part of active conversation
-    And I should see "hello, alice!" within ".stream_container"
+    And I should see "hello, alice!" within ".stream-container"
     When I sign in as "alice@alice.alice"
     Then I should have 1 unread private message
     And I should have 1 email delivery
     When I reply with "hey, how you doing?"
-    Then I should see "hey, how you doing?" within ".stream_container"
+    Then I should see "hey, how you doing?" within ".stream-container"
 
   Scenario: send a message using keyboard shortcuts
     When I sign in as "bob@bob.bob"
@@ -37,9 +37,9 @@ Feature: private conversations
     Then I should see "Greetings" within "#conversation-inbox"
     And I should see "Greetings" within "#conversation-show"
     And "Alice Awesome" should be part of active conversation
-    And I should see "hello, alice!" within ".stream_container"
+    And I should see "hello, alice!" within ".stream-container"
     When I reply with "hey, how you doing?" using keyboard shortcuts
-    Then I should see "hey, how you doing?" within ".stream_container"
+    Then I should see "hey, how you doing?" within ".stream-container"
     When I sign in as "alice@alice.alice"
     Then I should have 2 unread private messages
     And I should have 2 email delivery
@@ -54,7 +54,7 @@ Feature: private conversations
     Then I should see "Greetings" within "#conversation-inbox"
     And I should see "Greetings" within "#conversation-show"
     And "Alice Awesome" should be part of active conversation
-    And I should see "hello, alice!" within ".stream_container"
+    And I should see "hello, alice!" within ".stream-container"
 
   Scenario: delete a conversation
     When I sign in as "bob@bob.bob"
@@ -66,7 +66,7 @@ Feature: private conversations
     Then I should have 1 unread private message
     And I should have 1 email delivery
     When I reply with "hey, how you doing?"
-    Then I should see "hey, how you doing?" within ".stream_container"
+    Then I should see "hey, how you doing?" within ".stream-container"
     When I sign in as "bob@bob.bob"
     Then I should have 1 email delivery
     And I should have no unread private messages
diff --git a/features/desktop/hovercards.feature b/features/desktop/hovercards.feature
index 76313185a4a1fe05d3ab9f7611673148f15fb075..6fff24f728cb19b8a67324dccd80970b89836154 100644
--- a/features/desktop/hovercards.feature
+++ b/features/desktop/hovercards.feature
@@ -24,12 +24,12 @@ Feature: Hovercards
   Scenario: Hovercards on the main stream in reshares
     Given I sign in as "alice@alice.alice"
     And I am on "bob@bob.bob"'s page
-    Then I should see "Alice" within "#main_stream"
-    When I hover "Alice" within "#main_stream"
+    Then I should see "Alice" within "#main-stream"
+    When I hover "Alice" within "#main-stream"
     Then I should not see a hovercard
     When I am on "alice@alice.alice"'s page
-    Then I should see "Bob Jones" within "#main_stream"
-    When I hover "Bob Jones" within "#main_stream"
+    Then I should see "Bob Jones" within "#main-stream"
+    When I hover "Bob Jones" within "#main-stream"
     Then I should see a hovercard
 
   Scenario: Hovercards on the tag stream as a logged out user
diff --git a/features/desktop/likes.feature b/features/desktop/likes.feature
index eef1a4c4ce9f25d9ebf606190bd4636d757de4ca..73227004d1ce07bfd7ac49c0acee625f32cb0ac3 100644
--- a/features/desktop/likes.feature
+++ b/features/desktop/likes.feature
@@ -17,12 +17,12 @@ Feature: Liking posts
     Then I should not have activated notifications for the post
     When I like the post "I like unicorns" in the stream
     Then I should see "Unlike" within ".stream-element .feedback"
-    And I should see a ".likes .media" within "#main_stream .stream-element"
+    And I should see a ".likes .media" within "#main-stream .stream-element"
     And I should have activated notifications for the post
 
     When I unlike the post "I like unicorns" in the stream
     Then I should see "Like" within ".stream-element .feedback"
-    And I should not see a ".likes .media" within "#main_stream .stream-element"
+    And I should not see a ".likes .media" within "#main-stream .stream-element"
 
 
   Scenario: Liking and unliking a post from a single post page
@@ -39,4 +39,4 @@ Feature: Liking posts
     When I like the post "I like unicorns" in the stream
     And I sign out
     And I sign in as "bob@bob.bob"
-    Then I should see a ".likes" within "#main_stream .stream-element"
+    Then I should see a ".likes" within "#main-stream .stream-element"
diff --git a/features/desktop/post_preview.feature b/features/desktop/post_preview.feature
index d2a69b6870388dd3038d9e0394a3b50d878e768f..bf6301c12a139a0136a80b40dd21aa2c72972bf5 100644
--- a/features/desktop/post_preview.feature
+++ b/features/desktop/post_preview.feature
@@ -46,7 +46,7 @@ Feature: preview posts in the stream
       When I fill in the following:
           | status_message_text    | Look at this dog    |
       And I preview the post
-      Then I should see a "img" within ".md-preview .stream-element .photo_attachments"
+      Then I should see a "img" within ".md-preview .stream-element .photo-attachments"
       And I should see "Look at this dog" within ".md-preview .stream-element"
       And I close the publisher
 
@@ -80,7 +80,7 @@ Feature: preview posts in the stream
           | normal |
           | not normal  |
       And I preview the post
-      Then I should see a ".poll_form" within ".md-preview .stream-element"
+      Then I should see a ".poll-form" within ".md-preview .stream-element"
       And I should see a "form" within ".md-preview .stream-element"
       And I close the publisher
 
diff --git a/features/desktop/post_with_a_poll.feature b/features/desktop/post_with_a_poll.feature
index 5a27fc7eef06dd1c5a51c52a5f97ace3bc303a13..31843c3eb22ff55818077c57e8c53582a448a356 100644
--- a/features/desktop/post_with_a_poll.feature
+++ b/features/desktop/post_with_a_poll.feature
@@ -46,7 +46,7 @@ Feature: posting with a poll
           | normal |
           | not normal  |
       And I press "Share"
-      Then I should see a ".poll_form" within ".stream-element"
+      Then I should see a ".poll-form" within ".stream-element"
       And I should see a "form" within ".stream-element"
 
     Scenario: vote for an option
@@ -62,9 +62,9 @@ Feature: posting with a poll
 
       And I check the first option
       And I press "Vote" within ".stream-element"
-      Then I should see an element ".poll_progress_bar"
+      Then I should see an element ".progress-bar"
       And I should see an element ".percentage"
-      And I should see "1 vote so far" within ".poll_statistic"
+      And I should see "1 vote so far" within ".poll-statistic"
 
   Scenario: click to show result
     Given I expand the publisher
@@ -76,7 +76,7 @@ Feature: posting with a poll
         | normal |
         | not normal  |
     And I press "Share"
-    And I click on selector ".toggle_result"
+    And I click on selector ".toggle-result"
     Then I should see an element ".percentage"
 
   Scenario: validate answer input
diff --git a/features/desktop/posts_from_main_page.feature b/features/desktop/posts_from_main_page.feature
index 7e75c7df78b6cef37b418d6e4c8a04b5ec3d000b..f4be7342b4501ac2fce3638332a0a284777530f7 100644
--- a/features/desktop/posts_from_main_page.feature
+++ b/features/desktop/posts_from_main_page.feature
@@ -78,12 +78,12 @@ Feature: posting from the main page
       When I write the status message "Look at this dog"
       And I submit the publisher
       And I go to the aspects page
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
       And I should see "Look at this dog" within ".stream-element"
       When I log out
       And I sign in as "alice@alice.alice"
       And I go to "bob@bob.bob"'s page
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
       And I should see "Look at this dog" within ".stream-element"
 
     Scenario: post a photo without text
@@ -91,13 +91,13 @@ Feature: posting from the main page
       And I attach "spec/fixtures/button.png" to the publisher
       Then I should see an uploaded image within the photo drop zone
       When I press "Share"
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
       When I go to the aspects page
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
       When I log out
       And I sign in as "alice@alice.alice"
       And I go to "bob@bob.bob"'s page
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
 
     Scenario: back out of posting a photo-only post
       Given I expand the publisher
diff --git a/features/desktop/posts_from_profile_page.feature b/features/desktop/posts_from_profile_page.feature
index b4804b71c044acd7253f1df9097986e53599f6d0..aa559e812a1898a9e0e61b19816ca3740d53e0e7 100644
--- a/features/desktop/posts_from_profile_page.feature
+++ b/features/desktop/posts_from_profile_page.feature
@@ -39,7 +39,7 @@ Feature: posting from own profile page
       And I submit the publisher
 
       When I go to the home page
-      Then I should see a "img" within ".stream-element div.photo_attachments"
+      Then I should see a "img" within ".stream-element div.photo-attachments"
       And I should see "who am I?" within ".stream-element"
 
     Scenario: back out of posting a photo-only post
diff --git a/features/desktop/profile_photos.feature b/features/desktop/profile_photos.feature
index 644b21ecf23a7e51652dddbbf324b4bbf6405524..f1e0699a74a3daa80330864c913e68ac98379267 100644
--- a/features/desktop/profile_photos.feature
+++ b/features/desktop/profile_photos.feature
@@ -31,8 +31,8 @@ Feature: show photos
 
     Scenario: I delete a photo
       When I am on "robert@grimm.grimm"'s photos page
-      Then I should see a ".thumbnail" within "#main_stream"
+      Then I should see a ".thumbnail" within "#main-stream"
       When I confirm the alert after I delete a photo
-      Then I should not see a ".thumbnail" within "#main_stream"
+      Then I should not see a ".thumbnail" within "#main-stream"
       When I am on "robert@grimm.grimm"'s page
       Then I should not see "Photos" within "#profile-horizontal-bar"
diff --git a/features/desktop/search.feature b/features/desktop/search.feature
index 03e8fc343e5b1eb46dcea625121804933d9bbbeb..b96de002ca7eb1d5f0c5dee88fa694d2caa66727 100644
--- a/features/desktop/search.feature
+++ b/features/desktop/search.feature
@@ -31,7 +31,7 @@ Scenario: search for a user in background
   And I search for "user@pod.tld"
   And a person with ID "user@pod.tld" has been discovered
   Then I should see "user@pod.tld" within ".stream .info.diaspora_handle"
-  And I should see a ".aspect_dropdown" within ".stream"
+  And I should see a ".aspect-dropdown" within ".stream"
 
 Scenario: search for a not searchable user
   When I sign in as "carol@example.com"
diff --git a/features/desktop/signs_up.feature b/features/desktop/signs_up.feature
index bed865064e85fc0fa296596563f15d6c9a7f15d4..2703069e0b247eb85343f34a1e8e9b98657cccae 100644
--- a/features/desktop/signs_up.feature
+++ b/features/desktop/signs_up.feature
@@ -42,7 +42,7 @@ Feature: new user registration
     When I confirm the alert after I follow "awesome_button"
     Then I should be on the stream page
     And the publisher should be expanded
-    And I should see "Public" within ".aspect_dropdown"
+    And I should see "Public" within ".aspect-dropdown"
 
   Scenario: new user without any tags posts first status message
     When I confirm the alert after I follow "awesome_button"
diff --git a/features/mobile/drawer.feature b/features/mobile/drawer.feature
index 700fc95b8f390621a4a6ff608cea0ed5538f6b59..41bf76976b881869003be5cfb5409241fd1a9460 100644
--- a/features/mobile/drawer.feature
+++ b/features/mobile/drawer.feature
@@ -58,11 +58,11 @@ Feature: Navigate between pages using the header menu and the drawer
     And I click on "My aspects" in the drawer
     And I click on "All aspects" in the drawer
     Then I should be on the aspects page
-    And I should see "Hi you!" within "#main_stream"
+    And I should see "Hi you!" within "#main-stream"
     When I open the drawer
     And I click on "My aspects" in the drawer
     And I click on "Unicorns" in the drawer
-    And I should not see "Hi you!" within "#main_stream"
+    And I should not see "Hi you!" within "#main-stream"
 
   Scenario: navigate to the followed tags page
     When I follow the "boss" tag
diff --git a/features/mobile/posts_from_main_page.feature b/features/mobile/posts_from_main_page.feature
index 9afee520dc14f935848a0a36f76eeedb5d585915..338b271aa186f604f7ecd60e58e3e42d527b9ab9 100644
--- a/features/mobile/posts_from_main_page.feature
+++ b/features/mobile/posts_from_main_page.feature
@@ -35,11 +35,11 @@ Feature: posting from the mobile main page
     And I should see an uploaded image within the photo drop zone
     When I press "Share"
     When I go to the stream page
-    Then I should see a "img" within ".stream-element div.photo_attachments"
+    Then I should see a "img" within ".stream-element div.photo-attachments"
     When I log out
     And I sign in as "alice@alice.alice" on the mobile website
     When I go to the stream page
-    Then I should see a "img" within ".stream-element div.photo_attachments"
+    Then I should see a "img" within ".stream-element div.photo-attachments"
 
   Scenario: back out of posting a photo-only post
     Given I visit the mobile publisher page
diff --git a/features/mobile/stream.feature b/features/mobile/stream.feature
index 02301cd47d4291708aa037f1b7d15c5c35c80043..7a28892d7912145ca6eb63a57181d55203d4fb51 100644
--- a/features/mobile/stream.feature
+++ b/features/mobile/stream.feature
@@ -13,4 +13,4 @@ Feature: Viewing the main stream mobile page
     When I sign in as "bob@bob.bob" on the mobile website
     And I go to the stream page
     Then I should see "Hello! I am #newhere" within ".ltr"
-    And I should see "less than a minute ago" within "#main_stream"
+    And I should see "less than a minute ago" within "#main-stream"
diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb
index 39726a308250a26419d0ae9af1618aae391f1d0f..a5a61b3b3c4ceab0e2cb78112d026778888c7490 100644
--- a/features/step_definitions/aspects_steps.rb
+++ b/features/step_definitions/aspects_steps.rb
@@ -1,6 +1,8 @@
+# frozen_string_literal: true
+
 module AspectCukeHelpers
   def click_aspect_dropdown
-    find(".aspect_dropdown .dropdown-toggle").trigger "click"
+    find(".aspect-dropdown .dropdown-toggle").trigger "click"
   end
 
   def toggle_aspect(a_name)
@@ -9,19 +11,19 @@ module AspectCukeHelpers
            else
              @me.aspects.where(name: a_name).pluck(:id).first
            end
-    aspect_css = ".aspect_dropdown li[data-aspect_id='#{a_id}']"
+    aspect_css = ".aspect-dropdown li[data-aspect_id='#{a_id}']"
     expect(page).to have_selector(aspect_css)
     find(aspect_css).click
   end
 
   def toggle_aspect_via_ui(aspect_name)
-    aspects_dropdown = find(".aspect_membership_dropdown .dropdown-toggle", match: :first)
+    aspects_dropdown = find(".aspect-membership-dropdown .dropdown-toggle", match: :first)
     aspects_dropdown.trigger "click"
-    selected_aspect_count = all(".aspect_membership_dropdown.open .dropdown-menu li.selected").length
-    aspect = find(".aspect_membership_dropdown.open .dropdown-menu li", text: aspect_name)
+    selected_aspect_count = all(".aspect-membership-dropdown.open .dropdown-menu li.selected").length
+    aspect = find(".aspect-membership-dropdown.open .dropdown-menu li", text: aspect_name)
     aspect_selected = aspect["class"].include? "selected"
     aspect.trigger "click"
-    expect(find(".aspect_membership_dropdown .dropdown-menu", visible: false)).to have_no_css(".loading")
+    expect(find(".aspect-membership-dropdown .dropdown-menu", visible: false)).to have_no_css(".loading")
 
     # close dropdown
     page.should have_no_css('#profile.loading')
@@ -31,7 +33,7 @@ module AspectCukeHelpers
   end
 
   def aspect_dropdown_visible?
-    expect(find('.aspect_membership_dropdown.open')).to be_visible
+    expect(find('.aspect-membership-dropdown.open')).to be_visible
   end
 end
 World(AspectCukeHelpers)
@@ -46,7 +48,7 @@ end
 
 When /^I select only "([^"]*)" aspect$/ do |aspect_name|
   click_link "My aspects"
-  expect(find("#aspect_stream_container")).to have_css(".loader.hidden", visible: false)
+  expect(find("#aspect-stream-container")).to have_css(".loader.hidden", visible: false)
   within("#aspects_list") do
     all(".selected").each do |node|
       aspect_item = node.find(:xpath, "..")
diff --git a/features/step_definitions/auth_code_steps.rb b/features/step_definitions/auth_code_steps.rb
index 0e3cb9616b1645cac157b83e718cbf5d398da6e5..723b913cba695e81cfb0d38f599ad7c6681ec6e2 100644
--- a/features/step_definitions/auth_code_steps.rb
+++ b/features/step_definitions/auth_code_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 O_AUTH_QUERY_PARAMS_WITH_CODE = {
   redirect_uri:  "http://example.org/",
   response_type: "code",
diff --git a/features/step_definitions/comment_steps.rb b/features/step_definitions/comment_steps.rb
index 0679e7b3d1749ea8460fc177126192be58d3e555..9a8ad9eebe7e1f06587de8d9eb090eeea2fc85e4 100644
--- a/features/step_definitions/comment_steps.rb
+++ b/features/step_definitions/comment_steps.rb
@@ -1,14 +1,16 @@
+# frozen_string_literal: true
+
 When /^I focus the comment field$/ do
   focus_comment_box
 end
 
 Then /^the first comment field should be open/ do
-  find("#main_stream .stream-element .new-comment").should be_visible
+  find("#main-stream .stream-element .new-comment").should be_visible
 end
 
 Then /^the first comment field should be closed$/ do
   page.should have_css(".stream-element .media")
-  page.should_not have_selector("#main_stream .stream-element .new-comment", match: :first)
+  page.should_not have_selector("#main-stream .stream-element .new-comment", match: :first)
 end
 
 When /^I make a show page comment "([^"]*)"$/ do |comment_text|
@@ -40,5 +42,5 @@ Given /^"([^"]*)" has commented a lot on "([^"]*)"$/ do |email, post_text|
 end
 
 When /^I enter "([^"]*)" in the comment field$/ do |comment_text|
-  find("textarea.comment_box.mention-textarea").native.send_keys(comment_text)
+  find("textarea.comment-box.mention-textarea").native.send_keys(comment_text)
 end
diff --git a/features/step_definitions/conversations_steps.rb b/features/step_definitions/conversations_steps.rb
index ea076b30e5b050c9c99c41a6275f9b60c749598b..ac4f5e08cf3236fe6d073a93990e920ecac32113 100644
--- a/features/step_definitions/conversations_steps.rb
+++ b/features/step_definitions/conversations_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^"([^"]*)" should be part of active conversation$/ do |name|
   within(".conversation-participants") do
     find("img.avatar[title^='#{name}']").should_not be_nil
diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb
index 812a66f3477c84c58374eb9bc079d92a6dbdfb2d..041afe43953ea2589890777ebe581d1ea0817539 100644
--- a/features/step_definitions/custom_web_steps.rb
+++ b/features/step_definitions/custom_web_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ScreenshotCukeHelpers
 
   def set_screenshot_location(path)
@@ -12,8 +14,8 @@ module ScreenshotCukeHelpers
 
     sleep 0.5
 
-    browser.manage.window.resize_to(1280, 1024)
-    browser.save_screenshot(pic)
+    page.driver.resize(1280, 1024)
+    save_screenshot(pic)
   end
 
   def take_screenshots_without_login
@@ -29,16 +31,15 @@ module ScreenshotCukeHelpers
 
   def take_screenshots_with_login
     pages = {
-      'stream'        => 'stream',
-      'activity'      => 'activity_stream',
-      'mentions'      => 'mentioned_stream',
-      'aspects'       => 'aspects_stream',
-      'tags'          => 'followed_tags_stream',
-      'contacts'      => 'contacts',
-      'settings'      => 'edit_user',
-      'notifications' => 'notifications',
-      'conversations' => 'conversations',
-      'logout'        => 'destroy_user_session'
+      "stream"        => "stream",
+      "activity"      => "activity_stream",
+      "mentions"      => "mentioned_stream",
+      "aspects"       => "aspects_stream",
+      "tags"          => "followed_tags_stream",
+      "contacts"      => "contacts",
+      "settings"      => "edit_user",
+      "notifications" => "notifications",
+      "conversations" => "conversations"
     }
 
     pages.each do |name, path|
@@ -73,7 +74,7 @@ Then /^the publisher should be expanded$/ do
 end
 
 Then /^the text area wrapper mobile should be with attachments$/ do
-  find("#publisher_textarea_wrapper")["class"].should include("with_attachments")
+  find("#publisher-textarea-wrapper")["class"].should include("with_attachments")
 end
 
 And /^I want to mention (?:him|her) from the profile$/ do
@@ -205,7 +206,7 @@ Then /^the "([^"]*)" field(?: within "([^"]*)")? should be filled with "([^"]*)"
 end
 
 Then /^I should see (\d+) contacts$/ do |n_posts|
-  has_css?("#people_stream .stream-element", count: n_posts.to_i).should be true
+  has_css?("#people-stream .stream-element", count: n_posts.to_i).should be true
 end
 
 And /^I scroll down$/ do
@@ -221,11 +222,11 @@ When /^I resize my window to 800x600$/ do
 end
 
 Then 'I should see an image attached to the post' do
-  step %(I should see a "img" within ".stream-element div.photo_attachments")
+  step %(I should see a "img" within ".stream-element div.photo-attachments")
 end
 
 Then 'I press the attached image' do
-  step %(I press the 1st "img" within ".stream-element div.photo_attachments")
+  step %(I press the 1st "img" within ".stream-element div.photo-attachments")
 end
 
 And "I wait for the popovers to appear" do
diff --git a/features/step_definitions/debug_steps.rb b/features/step_definitions/debug_steps.rb
index 59cab887ade3436e91d2679d6f33d325b005f96c..814302433aef9ab541f9fccc378d14690ae0fa66 100644
--- a/features/step_definitions/debug_steps.rb
+++ b/features/step_definitions/debug_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module DebuggingCukeHelpers
   def start_debugging
     require 'pry'
diff --git a/features/step_definitions/drawer_steps.rb b/features/step_definitions/drawer_steps.rb
index 7f7359366b75a3d8f7b5ac2c0c36a6aff08761d0..13c674c7221e3d065639a1bde95f87d41aa1e597 100644
--- a/features/step_definitions/drawer_steps.rb
+++ b/features/step_definitions/drawer_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 And /^I click on "([^"]*)" in the drawer$/ do |txt|
   within("#drawer") do
     find_link(txt).trigger "click"
diff --git a/features/step_definitions/gallery_steps.rb b/features/step_definitions/gallery_steps.rb
index 2dc5e262f39be8d715ea18e64c24595cbc1fe2fd..a008556d6d043b0a8d273e85c76c8eb5b3d2a370 100644
--- a/features/step_definitions/gallery_steps.rb
+++ b/features/step_definitions/gallery_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then "I should see the photo lightbox" do
   step %(I should see a "#blueimp-gallery" within "body")
 end
diff --git a/features/step_definitions/hovercard_steps.rb b/features/step_definitions/hovercard_steps.rb
index cfe38cecfb98cc18bd262b81d506571173fab717..832dcc307eef715fda0272b70fe612b60c90150b 100644
--- a/features/step_definitions/hovercard_steps.rb
+++ b/features/step_definitions/hovercard_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When(/^I activate the first hovercard$/) do
   page.execute_script("$('.hovercardable').first().trigger('mouseenter');")
 end
diff --git a/features/step_definitions/implicit_flow_steps.rb b/features/step_definitions/implicit_flow_steps.rb
index d8b9b1d69edb525aeb821090aa9c273cc9d93bb9..316ecfa74cc0b0e08a37ad3b45052389c8d964e8 100644
--- a/features/step_definitions/implicit_flow_steps.rb
+++ b/features/step_definitions/implicit_flow_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 O_AUTH_QUERY_PARAMS = {
   redirect_uri:  "http://example.org/",
   response_type: "id_token token",
diff --git a/features/step_definitions/keyboard_navigation_steps.rb b/features/step_definitions/keyboard_navigation_steps.rb
index 32188aff34fa4acf960e4914ab9b99002774a912..042e56b3176b3cc9dc3b4261b04343761fc5abbe 100644
--- a/features/step_definitions/keyboard_navigation_steps.rb
+++ b/features/step_definitions/keyboard_navigation_steps.rb
@@ -1,5 +1,7 @@
+# frozen_string_literal: true
+
 When /^I press the "([^\"]*)" key somewhere$/ do |key|
-  within("#main_stream") do
+  within("#main-stream") do
     find("div.stream-element", match: :first).native.send_keys(key)
   end
 end
diff --git a/features/step_definitions/like_steps.rb b/features/step_definitions/like_steps.rb
index e0670e7c8db6c29b4e8def37253f552b4635665e..12e68f34a5fae1ff9811cf05fb49f850d328dd9c 100644
--- a/features/step_definitions/like_steps.rb
+++ b/features/step_definitions/like_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Given /^"([^"]*)" has liked the post "([^"]*)"$/ do |email, post_text|
   user = User.find_by(email: email)
   post = StatusMessage.find_by(text: post_text)
diff --git a/features/step_definitions/location_steps.rb b/features/step_definitions/location_steps.rb
index cfd41f0e72d80189d0dfb20d2d1911df1ab7c7e2..268aec049e7c1ee9a6f37b840e4260ae9560b487 100644
--- a/features/step_definitions/location_steps.rb
+++ b/features/step_definitions/location_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When /^I allow geolocation$/ do
   page.execute_script <<-JS
     window.navigator = {
@@ -7,5 +9,11 @@ When /^I allow geolocation$/ do
         }
       }
     };
+
+    $.getJSON = function(url, myCallback) {
+      if (url === "https://nominatim.openstreetmap.org/reverse?format=json&lat=42.42424242&lon=3.14159&addressdetails=3") {
+        return myCallback({display_name: "locator address"});
+      }
+    };
   JS
 end
diff --git a/features/step_definitions/mention_steps.rb b/features/step_definitions/mention_steps.rb
index 7f2ce1256a5c6e7945e8eaa61d49c23d61ed75cd..2b65b049b2fadf1fa8f0e9c38c7a68a20f891ab9 100644
--- a/features/step_definitions/mention_steps.rb
+++ b/features/step_definitions/mention_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 And /^Alice has a post mentioning Bob$/ do
   alice = User.find_by_email "alice@alice.alice"
   bob = User.find_by_email "bob@bob.bob"
diff --git a/features/step_definitions/message_steps.rb b/features/step_definitions/message_steps.rb
index a85c1bd9dd7d0571e31b4d6bc0544761f244e2f5..631b5437ebc170693a7e896096fa0ae488cc944a 100644
--- a/features/step_definitions/message_steps.rb
+++ b/features/step_definitions/message_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^I should see the "(.*)" message$/ do |message|
   text = case message
            when "alice is excited"
diff --git a/features/step_definitions/mobile_steps.rb b/features/step_definitions/mobile_steps.rb
index 28a966e3aea9d043adeb1ac415c0ebf118837113..abb1214446ed84b0de0d5c9e1ad3a202151bb707 100644
--- a/features/step_definitions/mobile_steps.rb
+++ b/features/step_definitions/mobile_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When /^I toggle the mobile view$/ do
   visit("/mobile/toggle")
 end
diff --git a/features/step_definitions/modal_steps.rb b/features/step_definitions/modal_steps.rb
index ad74522eb8584f83543f02a381ce0c9fdd12a083..ceea1f667eeb81b7bcbe3c1263db3c0a811aaa25 100644
--- a/features/step_definitions/modal_steps.rb
+++ b/features/step_definitions/modal_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^I should see a modal$/ do
   step %{I should see a ".modal.in"}
 end
diff --git a/features/step_definitions/notifications_steps.rb b/features/step_definitions/notifications_steps.rb
index bd38c03f0060d0c5fefae9bf80eaf6e6d485c9f4..11cb5efa7dce4c0aed3f9437edc9f5e3921de11d 100644
--- a/features/step_definitions/notifications_steps.rb
+++ b/features/step_definitions/notifications_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When "I filter notifications by likes" do
   step %(I follow "Liked" within "#notifications_container .list-group")
 end
@@ -7,7 +9,7 @@ When "I filter notifications by mentions" do
 end
 
 Then /^I should( not)? have activated notifications for the post( in the single post view)?$/ do |negate, spv|
-  selector = spv ? "#single-post-moderation" : "#main_stream .stream-element"
+  selector = spv ? "#single-post-moderation" : "#main-stream .stream-element"
   if negate
     expect(find(selector, match: :first)).to have_no_css(".destroy_participation", visible: false)
     expect(find(selector, match: :first)).to have_css(".create_participation", visible: false)
diff --git a/features/step_definitions/oembed_steps.rb b/features/step_definitions/oembed_steps.rb
index 7732146a0ad02693a5631b7fb269bb1d56446ecc..6d30b7272c8ea8d6193147b9a414baddd5085125 100644
--- a/features/step_definitions/oembed_steps.rb
+++ b/features/step_definitions/oembed_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Given /^I have several oEmbed data in cache$/ do
   scenarios = {
     "photo" => {
@@ -125,10 +127,10 @@ end
 Then /^I should see a video player$/ do
   visit aspects_path
   find('.post-content .oembed')
-  find('.stream_container').should have_css('.post-content .oembed img')
+  find('.stream-container').should have_css('.post-content .oembed img')
 end
 
 Then /^I should not see a video player$/ do
-  find('.stream_container').should_not have_css('.post-content .oembed img')
+  find('.stream-container').should_not have_css('.post-content .oembed img')
 end
 
diff --git a/features/step_definitions/oidc_common_steps.rb b/features/step_definitions/oidc_common_steps.rb
index 0f7ae95a843170dbba6dda4e73bcce84f0c6d2cc..971f7c2e0360ec5a718edff6e80339b948b28b82 100644
--- a/features/step_definitions/oidc_common_steps.rb
+++ b/features/step_definitions/oidc_common_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Given /^a client with a provided picture exists for user "([^\"]*)"$/ do |email|
   app = FactoryGirl.create(:o_auth_application, logo_uri: "/assets/user/default.png")
   user = User.find_by(email: email)
diff --git a/features/step_definitions/post_preview_steps.rb b/features/step_definitions/post_preview_steps.rb
index f79b4e32ee99475400fe4e6fba4f9c68b31b8abb..288db43d14c15ef1d5e76bd015dfd928fa7382ab 100644
--- a/features/step_definitions/post_preview_steps.rb
+++ b/features/step_definitions/post_preview_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 And /^I edit the post$/ do
   with_scope(".publisher-textarea-wrapper") do
     find(".md-write-tab").click
diff --git a/features/step_definitions/post_with_poll_steps.rb b/features/step_definitions/post_with_poll_steps.rb
index 4d95ef1dbc4d48a43963377edc961f1eb7724df3..6ab1e1640fff74ba9145c18e0813d0a0c611bca8 100644
--- a/features/step_definitions/post_with_poll_steps.rb
+++ b/features/step_definitions/post_with_poll_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^I should see ([1-9]+) options?$/ do |number|
   find("#poll_creator_container").all(".poll-answer").count.should eql(number.to_i)
 end
@@ -19,8 +21,8 @@ When /^I fill in the following for the options:$/ do |table|
 end
 
 When /^I check the first option$/ do
-  page.should have_css('.poll_form input')
-  first(".poll_form input").click
+  page.should have_css(".poll-form input")
+  first(".poll-form input").click
 end
 
 When(/^I fill in values for the first two options$/) do
diff --git a/features/step_definitions/posts_steps.rb b/features/step_definitions/posts_steps.rb
index a13779a2c3734cb6a8babc0a449ee219019fe0e7..7f8c9346639be45328b7cc3e6d8c573b16efcde3 100644
--- a/features/step_definitions/posts_steps.rb
+++ b/features/step_definitions/posts_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^the post should be collapsed$/ do
   first_post_collapsed?
 end
@@ -128,7 +130,7 @@ end
 
 When /^I select "([^"]*)" on the aspect dropdown$/ do |text|
   page.execute_script(
-    "$('#publisher .dropdown .dropdown_list, #publisher .aspect_dropdown .dropdown-menu')
+    "$('#publisher .dropdown .dropdown_list, #publisher .aspect-dropdown .dropdown-menu')
       .find('li').each(function(i,el){
       var elem = $(el);
       if ('" + text + "' == $.trim(elem.text()) ) {
diff --git a/features/step_definitions/profile_steps.rb b/features/step_definitions/profile_steps.rb
index af9949d9320b8920e33e02553663804a4ac17f3e..5c38a3aa540a359fa1283db60143c109c58ffdcc 100644
--- a/features/step_definitions/profile_steps.rb
+++ b/features/step_definitions/profile_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 And /^I mark myself as not safe for work$/ do
   check('profile[nsfw]')
 end
diff --git a/features/step_definitions/search_steps.rb b/features/step_definitions/search_steps.rb
index 35fd296fa34109ad14a070a442332dea65700455..0db421cb4cc2d5563b9e3a61b45bce84e6a11374 100644
--- a/features/step_definitions/search_steps.rb
+++ b/features/step_definitions/search_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When /^I enter "([^"]*)" in the search input$/ do |search_term|
   find("input#q").native.send_keys(search_term)
 end
diff --git a/features/step_definitions/session_steps.rb b/features/step_definitions/session_steps.rb
index 03f5bd3ed79e37d1580dbe2175933389d4fd452f..a31de421f985cc62ca442c23a33fc5a1e2aff6ba 100644
--- a/features/step_definitions/session_steps.rb
+++ b/features/step_definitions/session_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Given /^I am signed in( on the mobile website)?$/ do |mobile|
   automatic_login
   confirm_login mobile
diff --git a/features/step_definitions/single_post_view_steps.rb b/features/step_definitions/single_post_view_steps.rb
index 07eba83bdc482629486560cc4f737240b18cf4f8..cd6d6026a15a7e64c52c56c382e647abb13a7ab7 100644
--- a/features/step_definitions/single_post_view_steps.rb
+++ b/features/step_definitions/single_post_view_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 And /^I click to hide the post/ do
   find('.hide_post').click
 end
diff --git a/features/step_definitions/stream_steps.rb b/features/step_definitions/stream_steps.rb
index 22c285439c334bca0e5f7d91857b6141222e5192..5d241eaa0f51b92380273918a77baf51e25516b8 100644
--- a/features/step_definitions/stream_steps.rb
+++ b/features/step_definitions/stream_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When /^I (?:like|unlike) the post "([^"]*)" in the stream$/ do |post_text|
   like_stream_post(post_text)
 end
diff --git a/features/step_definitions/tag_steps.rb b/features/step_definitions/tag_steps.rb
index 7ea491c4ebd4e96da2168187d04e3d7f026f526c..d7d104b9c47d14618d5ccf9484a2926c30a7705a 100644
--- a/features/step_definitions/tag_steps.rb
+++ b/features/step_definitions/tag_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 When(/^I unfollow the "(.*?)" tag$/) do |tag|
   accept_alert do
     within("#tags_list") do
diff --git a/features/step_definitions/user_applications_steps.rb b/features/step_definitions/user_applications_steps.rb
index 7cef790501063de39666ed90435999e685ffccf6..4fc3755ac9a5b7f7445596a557767bd89d36ad57 100644
--- a/features/step_definitions/user_applications_steps.rb
+++ b/features/step_definitions/user_applications_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Then /^I should see (\d+) authorized applications$/ do |num|
   expect(page).to have_selector(".applications-page", count: 1)
   expect(page).to have_selector(".authorized-application", count: num.to_i)
diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb
index 7eb0e2b6eeec41ad7fe243096212b40b09cb9d3c..e50102961ff30ae6f6d6e25d1db08c411e482ab7 100644
--- a/features/step_definitions/user_steps.rb
+++ b/features/step_definitions/user_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 Given /^a user with username "([^\"]*)" and password "([^\"]*)"$/ do |username, password|
   @me ||= FactoryGirl.create(:user, :username => username, :password => password,
                   :password_confirmation => password, :getting_started => false)
@@ -233,7 +235,7 @@ end
 
 And /^I should be able to friend "([^\"]*)"$/ do |email|
   user = User.find_by_email(email)
-  step 'I should see a ".aspect_dropdown"'
+  step 'I should see a ".aspect-dropdown"'
   step "I should see \"#{user.name}\""
 end
 
diff --git a/features/step_definitions/web_steps.rb b/features/step_definitions/web_steps.rb
index 2ffdd48296ea6046fe0886f675e9dd2177df3edd..38f7d0ab470c4d16b366a663648de21ad449d23d 100644
--- a/features/step_definitions/web_steps.rb
+++ b/features/step_definitions/web_steps.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
 # It is recommended to regenerate this file in the future when you upgrade to a
 # newer version of cucumber-rails. Consider adding your own code to a new file
diff --git a/features/support/application_cuke_helpers.rb b/features/support/application_cuke_helpers.rb
index 082c05b1af12d9394cf4abb35aa4f5c31a555268..7d1f92cc9692bc9e8e61ad4a091b0ebc2c03c7cc 100644
--- a/features/support/application_cuke_helpers.rb
+++ b/features/support/application_cuke_helpers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module ApplicationCukeHelpers
   def flash_message_success?
     flash_message(selector: "success").visible?
diff --git a/features/support/env.rb b/features/support/env.rb
index cf95b37ef83d17c66fa2a5d7029692b3921fb3ba..7ee2f0e9d259f42581634cc40a3f70976e5b1e6c 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "rubygems"
 
 ENV["RAILS_ENV"] ||= "test"
@@ -51,6 +53,9 @@ Capybara.default_max_wait_time = 30
 # of your scenarios, as this makes it hard to discover errors in your application.
 ActionController::Base.allow_rescue = false
 
+# TODO: Temporary fix for rails 5, remove the next line after a new version of database_cleaner is released.
+# See https://github.com/DatabaseCleaner/database_cleaner/issues/445
+Cucumber::Rails::Database.javascript_strategy = :truncation, {except: %w[ar_internal_metadata]}
 Cucumber::Rails::Database.autorun_database_cleaner = true
 Cucumber::Rails::World.use_transactional_tests = false
 
diff --git a/features/support/integration_sessions_controller.rb b/features/support/integration_sessions_controller.rb
index c34f8723731802b2e43c4824760fc64d6f013c86..1d6bccbe842ab25a13f0cbdb6c11a745e6aa3736 100644
--- a/features/support/integration_sessions_controller.rb
+++ b/features/support/integration_sessions_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class IntegrationSessionsController < ActionController::Base
   def new
     @user_id = params[:user_id]
diff --git a/features/support/matchers.rb b/features/support/matchers.rb
index f38e8935d2373a23f3b044e8b5ad96f4255dfea7..d87247046040a7d760c9d29366afe52a92a0712c 100644
--- a/features/support/matchers.rb
+++ b/features/support/matchers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 RSpec::Matchers.define :have_path do |expected|
   match do |actual|
     await_condition { actual.current_path == expected }
diff --git a/features/support/paths.rb b/features/support/paths.rb
index ae9f0d404e1b4f7685aa0ad2186223300277cf86..a486ef245c1e3c7e1b45c63d183f6fb29e5da1c5 100644
--- a/features/support/paths.rb
+++ b/features/support/paths.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module NavigationHelpers
   def path_to(page_name)
     case page_name
diff --git a/features/support/poor_mans_webmock.rb b/features/support/poor_mans_webmock.rb
index 061441a8fa33133c4f4d1162b80641a9dbb588ed..fd722c756f973abfeb22f656837636cae9334667 100644
--- a/features/support/poor_mans_webmock.rb
+++ b/features/support/poor_mans_webmock.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/features/support/publishing_cuke_helpers.rb b/features/support/publishing_cuke_helpers.rb
index a6e0593ffe61eac519b6e051c2dec2fbafecbee3..13ed9834c647ed81626874e3582014e7833f6290 100644
--- a/features/support/publishing_cuke_helpers.rb
+++ b/features/support/publishing_cuke_helpers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module PublishingCukeHelpers
   def write_in_publisher(txt)
     fill_in "status_message_text", with: txt
@@ -12,7 +14,7 @@ module PublishingCukeHelpers
 
   def upload_file_with_publisher(path)
     page.execute_script(%q{$("input[name='qqfile']").css("opacity", '1');})
-    with_scope("#publisher_textarea_wrapper") do
+    with_scope("#publisher-textarea-wrapper") do
       attach_file("qqfile", Rails.root.join(path).to_s)
       # wait for the image to be ready
       page.assert_selector(".publisher_photo.loading", count: 0)
@@ -30,7 +32,7 @@ module PublishingCukeHelpers
     # wait for the publisher to be closed
     expect(find("#publisher")["class"]).to include("closed")
     # wait for the content to appear
-    expect(find("#main_stream")).to have_content(txt)
+    expect(find("#main-stream")).to have_content(txt)
   end
 
   def click_and_post(text)
diff --git a/features/support/user_cuke_helpers.rb b/features/support/user_cuke_helpers.rb
index b7014b0ac988d13fd03364341429735c747b2554..1b24eb5b22a7c5d08095457841f148f6af5e3304 100644
--- a/features/support/user_cuke_helpers.rb
+++ b/features/support/user_cuke_helpers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module UserCukeHelpers
 
   # creates a new user object from the factory with some default attributes
diff --git a/features/support/webmock.rb b/features/support/webmock.rb
index 372d81803513a754c85cd07a4cea2e3476c57679..f6d4726bff107ff25ceb38dd68c7fe537a00708a 100644
--- a/features/support/webmock.rb
+++ b/features/support/webmock.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "webmock/cucumber"
 WebMock.disable_net_connect!(allow_localhost: true)
 
diff --git a/lib/account_deleter.rb b/lib/account_deleter.rb
index 95a5c9130bb972cb17b0d90a35978419fcdf9aae..2136e774129f10d994bcc92b878f962caf4709b0 100644
--- a/lib/account_deleter.rb
+++ b/lib/account_deleter.rb
@@ -1,9 +1,10 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 class AccountDeleter
-
   # Things that are not removed from the database:
   # - Comments
   # - Likes
@@ -23,17 +24,14 @@ class AccountDeleter
   end
 
   def perform!
-    ActiveRecord::Base.transaction do
-      #person
-      delete_standard_person_associations
-      remove_conversation_visibilities
-      delete_contacts_of_me
-      tombstone_person_and_profile
+    # close person
+    delete_standard_person_associations
+    delete_contacts_of_me
+    tombstone_person_and_profile
 
-      close_user if user
+    close_user if user
 
-      mark_account_deletion_complete
-    end
+    mark_account_deletion_complete
   end
 
   # user deletion methods
@@ -44,30 +42,29 @@ class AccountDeleter
     tombstone_user
   end
 
-  #user deletions
+  # user deletions
   def normal_ar_user_associates_to_delete
     %i[tag_followings services aspects user_preferences
        notifications blocks authorizations o_auth_applications pairwise_pseudonymous_identifiers]
   end
 
-  def special_ar_user_associations
-    %i[person profile contacts auto_follow_back_aspect]
-  end
-
-  def ignored_ar_user_associations
-    %i[followed_tags invited_by invited_users contact_people aspect_memberships
-       ignored_people share_visibilities conversation_visibilities conversations reports]
-  end
-
   def delete_standard_user_associations
     normal_ar_user_associates_to_delete.each do |asso|
-      self.user.send(asso).each{|model| model.destroy }
+      user.send(asso).ids.each_slice(20) do |ids|
+        User.reflect_on_association(asso).class_name.constantize.where(id: ids).destroy_all
+      end
     end
   end
 
+  def normal_ar_person_associates_to_delete
+    %i[posts photos mentions participations roles blocks conversation_visibilities]
+  end
+
   def delete_standard_person_associations
     normal_ar_person_associates_to_delete.each do |asso|
-      self.person.send(asso).destroy_all
+      person.send(asso).ids.each_slice(20) do |ids|
+        Person.reflect_on_association(asso).class_name.constantize.where(id: ids).destroy_all
+      end
     end
   end
 
@@ -78,33 +75,20 @@ class AccountDeleter
   # Currently this would get deleted due to the db foreign key constrainsts,
   # but we'll keep this method here for completeness
   def remove_share_visibilities_on_contacts_posts
-    ShareVisibility.for_a_user(user).destroy_all
-  end
-
-  def remove_conversation_visibilities
-    ConversationVisibility.where(:person_id => person.id).destroy_all
+    ShareVisibility.for_a_user(user).find_each(batch_size: 20, &:destroy)
   end
 
   def tombstone_person_and_profile
-    self.person.lock_access!
-    self.person.clear_profile!
+    person.lock_access!
+    person.clear_profile!
   end
 
   def tombstone_user
-    self.user.clear_account!
+    user.clear_account!
   end
 
   def delete_contacts_of_me
-    Contact.all_contacts_of_person(self.person).destroy_all
-  end
-
-  def normal_ar_person_associates_to_delete
-    %i[posts photos mentions participations roles blocks]
-  end
-
-  def ignored_or_special_ar_person_associations
-    %i[comments likes poll_participations contacts notification_actors notifications owner profile
-       conversation_visibilities pod conversations messages]
+    Contact.all_contacts_of_person(person).find_each(batch_size: 20, &:destroy)
   end
 
   def mark_account_deletion_complete
diff --git a/lib/api/openid_connect/authorization_point/endpoint.rb b/lib/api/openid_connect/authorization_point/endpoint.rb
index 8f3392bd97760ceda87530d583345e76dbef481f..c88a43a09eccf9df38cfc33e994a8dd768075ed2 100644
--- a/lib/api/openid_connect/authorization_point/endpoint.rb
+++ b/lib/api/openid_connect/authorization_point/endpoint.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     module AuthorizationPoint
diff --git a/lib/api/openid_connect/authorization_point/endpoint_confirmation_point.rb b/lib/api/openid_connect/authorization_point/endpoint_confirmation_point.rb
index 08e99b25db12ddfad2b94cadf3d846fbb1da733e..9c4eadeea7f1c8b8c0dd2e74e654236a8617e0f3 100644
--- a/lib/api/openid_connect/authorization_point/endpoint_confirmation_point.rb
+++ b/lib/api/openid_connect/authorization_point/endpoint_confirmation_point.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     module AuthorizationPoint
diff --git a/lib/api/openid_connect/authorization_point/endpoint_start_point.rb b/lib/api/openid_connect/authorization_point/endpoint_start_point.rb
index 007a2c592ceb2c3ded42b9078832a46d724fad07..7ce6b6b5de9ed23f93e4a09958ec3b000c54d3da 100644
--- a/lib/api/openid_connect/authorization_point/endpoint_start_point.rb
+++ b/lib/api/openid_connect/authorization_point/endpoint_start_point.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     module AuthorizationPoint
diff --git a/lib/api/openid_connect/error.rb b/lib/api/openid_connect/error.rb
index 56059ad59249506a4b0482ccbd93c69e5c256ec9..5619ae3c3fa276a3c2e0767fce9a4bac418701c6 100644
--- a/lib/api/openid_connect/error.rb
+++ b/lib/api/openid_connect/error.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     module Error
diff --git a/lib/api/openid_connect/id_token.rb b/lib/api/openid_connect/id_token.rb
index 328e9c6366eac9cb4d5695fbdabf82f2cb81aa93..44b95779030a2bb382aa0cd9a07bda30e65e8894 100644
--- a/lib/api/openid_connect/id_token.rb
+++ b/lib/api/openid_connect/id_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/lib/api/openid_connect/id_token_config.rb b/lib/api/openid_connect/id_token_config.rb
index f76fa09613e08002c838f73946dc77075a3c55ba..a38c7215aee969c5f1c9ee96a77f924f8aa02110 100644
--- a/lib/api/openid_connect/id_token_config.rb
+++ b/lib/api/openid_connect/id_token_config.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     class IdTokenConfig
diff --git a/lib/api/openid_connect/protected_resource_endpoint.rb b/lib/api/openid_connect/protected_resource_endpoint.rb
index 540b69d1d63cb478b3cb912fb2cb0d726276f066..b755131831c9d4747e3e6de40d0512f1f28d1926 100644
--- a/lib/api/openid_connect/protected_resource_endpoint.rb
+++ b/lib/api/openid_connect/protected_resource_endpoint.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2011 nov matake
 #
 # Permission is hereby granted, free of charge, to any person obtaining
diff --git a/lib/api/openid_connect/subject_identifier_creator.rb b/lib/api/openid_connect/subject_identifier_creator.rb
index b6a771fa0ca46d3ef54947889d717313eac0fd93..7e86b10f656acbadc02f4e4a6b499d083b8b4bf6 100644
--- a/lib/api/openid_connect/subject_identifier_creator.rb
+++ b/lib/api/openid_connect/subject_identifier_creator.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Api
   module OpenidConnect
     module SubjectIdentifierCreator
diff --git a/lib/api/openid_connect/token_endpoint.rb b/lib/api/openid_connect/token_endpoint.rb
index 7bde221a92f9deadc75d7a71f6118033caa25a0a..b9b9d39e9b5cf16e5a8f759935249c007d4a990a 100644
--- a/lib/api/openid_connect/token_endpoint.rb
+++ b/lib/api/openid_connect/token_endpoint.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Inspired by https://github.com/nov/openid_connect_sample/blob/master/lib/token_endpoint.rb
 
 module Api
diff --git a/lib/bookmarklet_renderer.rb b/lib/bookmarklet_renderer.rb
index 0ecc9cf48a2d8fc2cd0b0f8c2d542aae3bd0d7e8..75b2b51f1f69d1c9c5f6f4a38dd2bf047e2e3fc2 100644
--- a/lib/bookmarklet_renderer.rb
+++ b/lib/bookmarklet_renderer.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 class BookmarkletRenderer
   class << self
     def cached_name
diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb
index d9546dce796901550db676c9b4bf5ec7435c956b..add11a016b36bd2d7ae70e6633695b5c1dca5587 100644
--- a/lib/configuration_methods.rb
+++ b/lib/configuration_methods.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Configuration
   KNOWN_SERVICES = [:twitter, :tumblr, :facebook, :wordpress].freeze
 
@@ -70,7 +72,7 @@ module Configuration
     def version_string
       return @version_string unless @version_string.nil?
       @version_string = version.number.to_s
-      @version_string << "-p#{git_revision[0..7]}" if git_available?
+      @version_string = "#{@version_string}-p#{git_revision[0..7]}" if git_available?
       @version_string
     end
 
diff --git a/lib/connection_tester.rb b/lib/connection_tester.rb
index 6619250e5079bbe479699f1ad2410259012d6dbc..5bc58d75b3f4a39a786f99ff244b74adcc91abb2 100644
--- a/lib/connection_tester.rb
+++ b/lib/connection_tester.rb
@@ -1,9 +1,11 @@
 
+# frozen_string_literal: true
+
 class ConnectionTester
   include Diaspora::Logging
 
-  NODEINFO_SCHEMA   = "http://nodeinfo.diaspora.software/ns/schema/1.0".freeze
-  NODEINFO_FRAGMENT = "/.well-known/nodeinfo".freeze
+  NODEINFO_SCHEMA   = "http://nodeinfo.diaspora.software/ns/schema/1.0"
+  NODEINFO_FRAGMENT = "/.well-known/nodeinfo"
 
   class << self
     # Test the reachability of a server by the given HTTP/S URL.
diff --git a/lib/diaspora.rb b/lib/diaspora.rb
index f1785738eb4118e00068d388e9f67da49a29f54f..7040eb4e933b33c60df616ab573789bb43426289 100644
--- a/lib/diaspora.rb
+++ b/lib/diaspora.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/camo.rb b/lib/diaspora/camo.rb
index 389aa48a5dc9b36b243ea4651149a31ff177827d..e2ecf587e0bca73135c70f9e763cb1773b9640eb 100644
--- a/lib/diaspora/camo.rb
+++ b/lib/diaspora/camo.rb
@@ -1,9 +1,11 @@
+# frozen_string_literal: true
+
 # implicitly requires OpenSSL
 module Diaspora
   module Camo
     def self.from_markdown(markdown_text)
       return unless markdown_text
-      markdown_text.gsub!(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/m) do |link|
+      markdown_text = markdown_text.gsub(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/m) do |link|
         link.gsub($4, self.image_url($4))
       end
       markdown_text.gsub(/src=(['"])(.+?)\1/m) do |link|
diff --git a/lib/diaspora/commentable.rb b/lib/diaspora/commentable.rb
index 0e5e06b4458354f665f9b1474d1f07252c05587e..e9e04faf420ea69457b348f0980c87d5278c5339 100644
--- a/lib/diaspora/commentable.rb
+++ b/lib/diaspora/commentable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/exceptions.rb b/lib/diaspora/exceptions.rb
index f17689e3183e3bbbbe5dae01d49153b4839127d3..8999ba3d17151be844e071748387e4e1b1e7100a 100644
--- a/lib/diaspora/exceptions.rb
+++ b/lib/diaspora/exceptions.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2012, Diaspora Inc. This file is
 # licensed under the Affero General Public License version 3 or later. See
 # the COPYRIGHT file.
diff --git a/lib/diaspora/exporter.rb b/lib/diaspora/exporter.rb
index 2c9e279094965321b2af5f050c04121c6fc354aa..837261b765a527c35c7cabdeb7d6e98fa071ec12 100644
--- a/lib/diaspora/exporter.rb
+++ b/lib/diaspora/exporter.rb
@@ -1,12 +1,12 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 module Diaspora
-
   class Exporter
-
-    SERIALIZED_VERSION = "2.0".freeze
+    SERIALIZED_VERSION = "2.0"
 
     def initialize(user)
       @user = user
@@ -20,9 +20,8 @@ module Diaspora
 
     def full_archive
       {version: SERIALIZED_VERSION}
-        .merge(Export::UserSerializer.new(@user).as_json)
-        .merge(Export::OthersDataSerializer.new(@user).as_json)
+        .merge(Export::UserSerializer.new(@user.id).as_json)
+        .merge(Export::OthersDataSerializer.new(@user.id).as_json)
     end
   end
-
 end
diff --git a/lib/diaspora/exporter/non_contact_authors.rb b/lib/diaspora/exporter/non_contact_authors.rb
deleted file mode 100644
index f3cfc4801a1577fda398b7db557efe9c21b70d49..0000000000000000000000000000000000000000
--- a/lib/diaspora/exporter/non_contact_authors.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-module Diaspora
-  class Exporter
-    # This class is capable of quering a list of people from authors of given posts that are non-contacts of a given
-    # user.
-    class NonContactAuthors
-      # @param posts [Post::ActiveRecord_Relation] posts that we fetch authors from to make authors list
-      # @param user [User] a user we fetch a contact list from
-      def initialize(posts, user)
-        @posts = posts
-        @user = user
-      end
-
-      # Create a request of non-contact authors of the posts for the user
-      # @return [Post::ActiveRecord_Relation]
-      def query
-        Person.where(id: non_contact_authors_ids)
-      end
-
-      private
-
-      def non_contact_authors_ids
-        posts_authors_ids - contacts_ids
-      end
-
-      def posts_authors_ids
-        posts.pluck(:author_id).uniq
-      end
-
-      def contacts_ids
-        user.contacts.pluck(:person_id)
-      end
-
-      attr_reader :posts, :user
-    end
-  end
-end
diff --git a/lib/diaspora/exporter/others_relayables.rb b/lib/diaspora/exporter/others_relayables.rb
index 5876c52cdaa7ea1d41d8ea6ab87ef4a7a8870f69..db537b1dcad792e8e49675214add0bcc8b46bdf8 100644
--- a/lib/diaspora/exporter/others_relayables.rb
+++ b/lib/diaspora/exporter/others_relayables.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   class Exporter
     # This class implements methods that allow to query relayables (comments, likes, participations,
diff --git a/lib/diaspora/exporter/posts_with_activity.rb b/lib/diaspora/exporter/posts_with_activity.rb
deleted file mode 100644
index 00461c55b183ac40e152493b7668d67415e38d59..0000000000000000000000000000000000000000
--- a/lib/diaspora/exporter/posts_with_activity.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-module Diaspora
-  class Exporter
-    # This class allows to query posts where a person made any activity (submitted comments,
-    # likes, participations or poll participations).
-    class PostsWithActivity
-      # @param user [User] user who the activity belongs to (the one who liked, commented posts, etc)
-      def initialize(user)
-        @user = user
-      end
-
-      # Create a request of posts with activity
-      # @return [Post::ActiveRecord_Relation]
-      def query
-        Post.from("(#{sql_union_all_activities}) AS posts")
-      end
-
-      private
-
-      attr_reader :user
-
-      def person
-        user.person
-      end
-
-      def sql_union_all_activities
-        all_activities.map(&:to_sql).join(" UNION ")
-      end
-
-      def all_activities
-        [comments_activity, likes_activity, subscriptions, polls_activity, reshares_activity]
-      end
-
-      def likes_activity
-        other_people_posts.liked_by(person)
-      end
-
-      def comments_activity
-        other_people_posts.commented_by(person)
-      end
-
-      def subscriptions
-        other_people_posts.subscribed_by(user)
-      end
-
-      def reshares_activity
-        other_people_posts.reshared_by(person)
-      end
-
-      def polls_activity
-        StatusMessage.where.not(author_id: person.id).joins(:poll_participations)
-                     .where(poll_participations: {author_id: person.id})
-      end
-
-      def other_people_posts
-        Post.where.not(author_id: person.id)
-      end
-    end
-  end
-end
diff --git a/lib/diaspora/federated.rb b/lib/diaspora/federated.rb
index e00fbd86aecd8abe0298e864356ebab4eb95256f..a50a93d66198dcfa739adb058dc7c1d625a91822 100644
--- a/lib/diaspora/federated.rb
+++ b/lib/diaspora/federated.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/federated/base.rb b/lib/diaspora/federated/base.rb
index ebceec3fa23494a0547e23f140da3addf8cd0477..b492309c0860f65619034ff8dfb4c771dc7d66c6 100644
--- a/lib/diaspora/federated/base.rb
+++ b/lib/diaspora/federated/base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/federated/contact_retraction.rb b/lib/diaspora/federated/contact_retraction.rb
index 7ff7cc6f5e5a388075c2ed11b02cde3ade5c521a..57efd2f45f4f3dc549e7b5716be185ef7c0bc11e 100644
--- a/lib/diaspora/federated/contact_retraction.rb
+++ b/lib/diaspora/federated/contact_retraction.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class ContactRetraction < Retraction
   def self.entity_class
     DiasporaFederation::Entities::Contact
diff --git a/lib/diaspora/federated/generator.rb b/lib/diaspora/federated/generator.rb
index deebe80cc5df719fdc9949348f5ed82cc7a70968..870ec8c3c7dd4e6165ed43dcc3aeba53dc5e4deb 100644
--- a/lib/diaspora/federated/generator.rb
+++ b/lib/diaspora/federated/generator.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federated
     class Generator
diff --git a/lib/diaspora/federated/retraction.rb b/lib/diaspora/federated/retraction.rb
index d6343c6fc3dec2e9042de2ce640ec0a270b061e6..b0ea20dbc0c30f7961e350ad8542b8e34a638609 100644
--- a/lib/diaspora/federated/retraction.rb
+++ b/lib/diaspora/federated/retraction.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/federation.rb b/lib/diaspora/federation.rb
index d43e2b4f03d332c25704aedbf43f76bd2baad849..1a1bd96b91f11aa9f6d64d4beb0c509670fe2f56 100644
--- a/lib/diaspora/federation.rb
+++ b/lib/diaspora/federation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     # Raised, if author is ignored by the relayable parent author
diff --git a/lib/diaspora/federation/dispatcher.rb b/lib/diaspora/federation/dispatcher.rb
index 64b16dae74b4bb06b4d0e5bd6b927c0b7bc537aa..4e03e725f06de6497631d8a15c88b749d6f2c0c0 100644
--- a/lib/diaspora/federation/dispatcher.rb
+++ b/lib/diaspora/federation/dispatcher.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     class Dispatcher
diff --git a/lib/diaspora/federation/dispatcher/private.rb b/lib/diaspora/federation/dispatcher/private.rb
index 456e1dcec6ebede929f2e3ca4722c6a0d9fa5725..864c87180edfe7c08861099d4c9586428f63f889 100644
--- a/lib/diaspora/federation/dispatcher/private.rb
+++ b/lib/diaspora/federation/dispatcher/private.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     class Dispatcher
diff --git a/lib/diaspora/federation/dispatcher/public.rb b/lib/diaspora/federation/dispatcher/public.rb
index b8ad30bff2352055e98e9c7fafa43ae9cd34c00a..51b7b545433393f200a5277eac6d3d50bbd67189 100644
--- a/lib/diaspora/federation/dispatcher/public.rb
+++ b/lib/diaspora/federation/dispatcher/public.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     class Dispatcher
diff --git a/lib/diaspora/federation/entities.rb b/lib/diaspora/federation/entities.rb
index 0a9bd8af44db7e333f5872eed31793ba1832a571..e6dbff2a0c683fbf50e9b407cb4e42c72f58d10d 100644
--- a/lib/diaspora/federation/entities.rb
+++ b/lib/diaspora/federation/entities.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     module Entities
@@ -174,13 +176,11 @@ module Diaspora
 
       def self.reshare(reshare)
         DiasporaFederation::Entities::Reshare.new(
-          root_author:           reshare.root_diaspora_id,
-          root_guid:             reshare.root_guid,
-          author:                reshare.diaspora_handle,
-          guid:                  reshare.guid,
-          public:                reshare.public,
-          created_at:            reshare.created_at,
-          provider_display_name: reshare.provider_display_name
+          root_author: reshare.root_diaspora_id,
+          root_guid:   reshare.root_guid,
+          author:      reshare.diaspora_handle,
+          guid:        reshare.guid,
+          created_at:  reshare.created_at
         )
       end
 
diff --git a/lib/diaspora/federation/mappings.rb b/lib/diaspora/federation/mappings.rb
index ec344cab2e34f744999fee80db538fb392a998ad..91ccefee603e1442747d9b5cccd8a9029365e13f 100644
--- a/lib/diaspora/federation/mappings.rb
+++ b/lib/diaspora/federation/mappings.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     module Mappings
diff --git a/lib/diaspora/federation/receive.rb b/lib/diaspora/federation/receive.rb
index d130cab68c0893a2ead55594723fd6e594babbd2..d4dcea34ddc344fcfacf4c1e10e81b1db4a1a13b 100644
--- a/lib/diaspora/federation/receive.rb
+++ b/lib/diaspora/federation/receive.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Federation
     module Receive
@@ -8,15 +10,22 @@ module Diaspora
       end
 
       def self.account_deletion(entity)
-        AccountDeletion.create!(person: author_of(entity))
+        person = author_of(entity)
+        AccountDeletion.create!(person: person) unless AccountDeletion.where(person: person).exists?
+      rescue => e # rubocop:disable Lint/RescueWithoutErrorClass
+        raise e unless AccountDeletion.where(person: person).exists?
+        logger.warn "ignoring error on receive AccountDeletion:#{entity.author}: #{e.class}: #{e.message}"
       end
 
       def self.account_migration(entity)
+        old_person = author_of(entity)
         profile = profile(entity.profile)
-        AccountMigration.create!(
-          old_person: Person.by_account_identifier(entity.author),
-          new_person: profile.person
-        )
+        return if AccountMigration.where(old_person: old_person, new_person: profile.person).exists?
+        AccountMigration.create!(old_person: old_person, new_person: profile.person)
+      rescue => e # rubocop:disable Lint/RescueWithoutErrorClass
+        raise e unless AccountMigration.where(old_person: old_person, new_person: profile.person).exists?
+        logger.warn "ignoring error on receive #{entity}: #{e.class}: #{e.message}"
+        nil
       end
 
       def self.comment(entity)
@@ -140,12 +149,10 @@ module Diaspora
         author = author_of(entity)
         ignore_existing_guid(Reshare, entity.guid, author) do
           Reshare.create!(
-            author:                author,
-            guid:                  entity.guid,
-            created_at:            entity.created_at,
-            provider_display_name: entity.provider_display_name,
-            public:                entity.public,
-            root_guid:             entity.root_guid
+            author:     author,
+            guid:       entity.guid,
+            created_at: entity.created_at,
+            root_guid:  entity.root_guid
           )
         end
       end
@@ -158,10 +165,10 @@ module Diaspora
         when Person
           User.find(recipient_id).disconnected_by(object)
         when Diaspora::Relayable
-          if object.parent.author.local?
-            parent_author = object.parent.author.owner
+          if object.root.author.local?
+            root_author = object.root.author.owner
             retraction = Retraction.for(object)
-            retraction.defer_dispatch(parent_author, false)
+            retraction.defer_dispatch(root_author, false)
             retraction.perform
           else
             object.destroy!
@@ -257,7 +264,7 @@ module Diaspora
           yield.tap do |relayable|
             retract_if_author_ignored(relayable)
 
-            relayable.signature = build_signature(klass, entity) if relayable.parent.author.local?
+            relayable.signature = build_signature(klass, entity) if relayable.root.author.local?
             relayable.save!
           end
         end
@@ -272,18 +279,18 @@ module Diaspora
       end
 
       private_class_method def self.retract_if_author_ignored(relayable)
-        parent_author = relayable.parent.author.owner
-        return unless parent_author && parent_author.ignored_people.include?(relayable.author)
+        root_author = relayable.root.author.owner
+        return unless root_author && root_author.ignored_people.include?(relayable.author)
 
         retraction = Retraction.for(relayable)
-        Diaspora::Federation::Dispatcher.build(parent_author, retraction, subscribers: [relayable.author]).dispatch
+        Diaspora::Federation::Dispatcher.build(root_author, retraction, subscribers: [relayable.author]).dispatch
 
         raise Diaspora::Federation::AuthorIgnored
       end
 
       private_class_method def self.relay_relayable(relayable)
-        parent_author = relayable.parent.author.owner
-        Diaspora::Federation::Dispatcher.defer_dispatch(parent_author, relayable) if parent_author
+        root_author = relayable.root.author.owner
+        Diaspora::Federation::Dispatcher.defer_dispatch(root_author, relayable) if root_author
       end
 
       # check if the object already exists, otherwise save it.
diff --git a/lib/diaspora/fetcher.rb b/lib/diaspora/fetcher.rb
index adb82e55254d69e69abfba6bf960a17f58023de6..6fb16ee205d552151b232704d5e0eac9606590ba 100644
--- a/lib/diaspora/fetcher.rb
+++ b/lib/diaspora/fetcher.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Fetcher
     require 'diaspora/fetcher/public'
diff --git a/lib/diaspora/fetcher/public.rb b/lib/diaspora/fetcher/public.rb
index 1a7fbd7ee648c4ab680906cbb128925fa59bd269..03530167af1729171ac3c50adffd894f68b15496 100644
--- a/lib/diaspora/fetcher/public.rb
+++ b/lib/diaspora/fetcher/public.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/fields/author.rb b/lib/diaspora/fields/author.rb
index 29bf5204d2d4bfba47b50c32ae2d69b6a0fea3a7..7c88842af9e98e68018c3c539bfadb37d286394e 100644
--- a/lib/diaspora/fields/author.rb
+++ b/lib/diaspora/fields/author.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Fields
     module Author
diff --git a/lib/diaspora/fields/guid.rb b/lib/diaspora/fields/guid.rb
index 16876c9aaaf0a57258892b233c259dcf78472134..12f591fccbaedcd49a29c9f255ddf6048fc0a951 100644
--- a/lib/diaspora/fields/guid.rb
+++ b/lib/diaspora/fields/guid.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Fields
     module Guid
diff --git a/lib/diaspora/fields/target.rb b/lib/diaspora/fields/target.rb
index 7120c2a8439139956e1bc58492090d03a5ceeab1..f40f361fa9defac84daaca0e79de5278975a50e8 100644
--- a/lib/diaspora/fields/target.rb
+++ b/lib/diaspora/fields/target.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Fields
     module Target
diff --git a/lib/diaspora/likeable.rb b/lib/diaspora/likeable.rb
index bbb84d2cea8ff8445588274429c7d2c0f418e430..95f7fdd51e691c724a9cb500a7b7e3b9159dca0a 100644
--- a/lib/diaspora/likeable.rb
+++ b/lib/diaspora/likeable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/logging.rb b/lib/diaspora/logging.rb
index 4fe8c04ac5092c66daff2c087ac07317705af16c..9e85628bc282295a3a0cd76450760970dc12c988 100644
--- a/lib/diaspora/logging.rb
+++ b/lib/diaspora/logging.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # a logging mixin providing the logger
 module Diaspora
   module Logging
diff --git a/lib/diaspora/markdownify.rb b/lib/diaspora/markdownify.rb
index 4a2d06686aaceddf41bd7f85c19ea6f2fd430b54..0dddf89e45709df440f035269873dba24ece72d5 100644
--- a/lib/diaspora/markdownify.rb
+++ b/lib/diaspora/markdownify.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Markdownify
     require 'diaspora/markdownify/html'
diff --git a/lib/diaspora/markdownify/email.rb b/lib/diaspora/markdownify/email.rb
index f5d2dd2909f5457d5430525a5770f2de8d3645a8..8016b25e1e90d25623576999c9070b39f3ece9b6 100644
--- a/lib/diaspora/markdownify/email.rb
+++ b/lib/diaspora/markdownify/email.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Markdownify
     class Email < Redcarpet::Render::HTML
diff --git a/lib/diaspora/markdownify/html.rb b/lib/diaspora/markdownify/html.rb
index a9c516869afbfa9287247f3cb3b21c0d71f59d4e..19d4dd6491f20e2a801849f10baf3dde4295814d 100644
--- a/lib/diaspora/markdownify/html.rb
+++ b/lib/diaspora/markdownify/html.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Markdownify
     class HTML < Redcarpet::Render::HTML
diff --git a/lib/diaspora/mentionable.rb b/lib/diaspora/mentionable.rb
index fb6117a45f8b618d3d6af063a7fce32eec828c01..81ade53b781e9ff2e748e44de9d8d058340d60f5 100644
--- a/lib/diaspora/mentionable.rb
+++ b/lib/diaspora/mentionable.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 module Diaspora::Mentionable
 
   # regex for finding mention markup in plain text:
diff --git a/lib/diaspora/mentions_container.rb b/lib/diaspora/mentions_container.rb
index 68e8b425c8236d66e8f257512cc47c73ab9f0980..b02dddb2000dffa5a2f3b946fd4614e81b22286a 100644
--- a/lib/diaspora/mentions_container.rb
+++ b/lib/diaspora/mentions_container.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module MentionsContainer
     extend ActiveSupport::Concern
diff --git a/lib/diaspora/message_renderer.rb b/lib/diaspora/message_renderer.rb
index 9540db6311a78f0874defa40f4698e1fb5a25aed..38bdf58630a6d05cf5e78e6c8049fbff7e4be9cf 100644
--- a/lib/diaspora/message_renderer.rb
+++ b/lib/diaspora/message_renderer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   # Takes a raw message text and converts it to
   # various desired target formats, respecting
@@ -93,6 +95,12 @@ module Diaspora
       def normalize
         @message = self.class.normalize(@message)
       end
+
+      def diaspora_links
+        @message = @message.gsub(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX) {|match_str|
+          Regexp.last_match(2) == "post" ? AppConfig.url_to("/posts/#{Regexp.last_match(3)}") : match_str
+        }
+      end
     end
 
     DEFAULTS = {mentioned_people: [],
@@ -156,6 +164,7 @@ module Diaspora
     def plain_text opts={}
       process(opts) {
         make_mentions_plain_text
+        diaspora_links
         squish
         append_and_truncate
       }
@@ -165,6 +174,7 @@ module Diaspora
     def plain_text_without_markdown opts={}
       process(opts) {
         make_mentions_plain_text
+        diaspora_links
         strip_markdown
         squish
         append_and_truncate
@@ -175,6 +185,7 @@ module Diaspora
     def plain_text_for_json opts={}
       process(opts) {
         normalize
+        diaspora_links
         camo_urls if AppConfig.privacy.camo.proxy_markdown_images?
       }
     end
@@ -184,6 +195,7 @@ module Diaspora
       process(opts) {
         escape
         normalize
+        diaspora_links
         render_mentions
         render_tags
         squish
@@ -196,6 +208,7 @@ module Diaspora
       process(opts) {
         process_newlines
         normalize
+        diaspora_links
         camo_urls if AppConfig.privacy.camo.proxy_markdown_images?
         markdownify
         render_mentions
diff --git a/lib/diaspora/relayable.rb b/lib/diaspora/relayable.rb
index 5753674d478c73cc00eb3ba7025ac1c6f4bb0b9a..55e3d8ff493d4bbce785a08f0be4ae944af0fab7 100644
--- a/lib/diaspora/relayable.rb
+++ b/lib/diaspora/relayable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -15,9 +17,15 @@ module Diaspora
       end
     end
 
+    def root
+      @root ||= parent
+      @root = @root.parent while @root.is_a?(Relayable)
+      @root
+    end
+
     def author_is_not_ignored
-      unless new_record? && parent.present? && parent.author.local? &&
-        parent.author.owner.ignored_people.include?(author)
+      unless new_record? && root.present? && root.author.local? &&
+        root.author.owner.ignored_people.include?(author)
         return
       end
 
@@ -26,19 +34,19 @@ module Diaspora
 
     # @return [Array<Person>]
     def subscribers
-      if parent.author.local?
+      if root.author.local?
         if author.local?
-          parent.subscribers
+          root.subscribers
         else
-          parent.subscribers.select(&:remote?).reject {|person| person.pod_id == author.pod_id }
+          root.subscribers.select(&:remote?).reject {|person| person.pod_id == author.pod_id }
         end
       else
-        [parent.author, author]
+        [root.author, author]
       end
     end
 
     def sender_for_dispatch
-      parent.author.owner if parent.author.local?
+      root.author.owner if root.author.local?
     end
 
     # @abstract
diff --git a/lib/diaspora/shareable.rb b/lib/diaspora/shareable.rb
index 97078dd6a694a4a2d57f2c65e6faa5e3066a65db..41e07972ed155e18e72d106683a5c73e0253ef3c 100644
--- a/lib/diaspora/shareable.rb
+++ b/lib/diaspora/shareable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/diaspora/signature.rb b/lib/diaspora/signature.rb
index fb571b3ccaa3755c6e59b08bdc55dbbeaf43cd94..821c68c4a72f21d2136bb3873d9e08501a95b576 100644
--- a/lib/diaspora/signature.rb
+++ b/lib/diaspora/signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Diaspora
   module Signature
     def self.included(model)
diff --git a/lib/diaspora/taggable.rb b/lib/diaspora/taggable.rb
index 88d4f3290e738bc85666174d16f077e174e0849b..ec9f9e6d8f702d30bb5043079e0362297b69fded 100644
--- a/lib/diaspora/taggable.rb
+++ b/lib/diaspora/taggable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/direction_detector.rb b/lib/direction_detector.rb
index c7ffd055adc5b9510cf69349bdf76cb5177a6416..e7ed020cbdd704dc185d47be25279a1380f90e63 100644
--- a/lib/direction_detector.rb
+++ b/lib/direction_detector.rb
@@ -1,4 +1,6 @@
 # coding: utf-8
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/email_inviter.rb b/lib/email_inviter.rb
index 3fdfd567dafe33736c5ecd2d93342a695c6434d2..dee190c7ce5cd14f04cd0e0bcbaa75473c1ee6f5 100644
--- a/lib/email_inviter.rb
+++ b/lib/email_inviter.rb
@@ -1,9 +1,10 @@
+# frozen_string_literal: true
+
 class EmailInviter
-  attr_accessor :emails, :message, :inviter, :locale
+  attr_accessor :emails, :inviter, :locale
 
   def initialize(emails, inviter, options={})
     options = options.symbolize_keys
-    self.message = options[:message]
     self.locale = options.fetch(:locale, 'en')
     self.inviter = inviter
     self.emails = emails
@@ -26,6 +27,6 @@ class EmailInviter
   private
 
   def mail(email)
-    Notifier.invite(email, message, inviter, invitation_code, locale).deliver_now
+    Notifier.invite(email, inviter, invitation_code, locale).deliver_now
   end
 end
diff --git a/lib/error_page_renderer.rb b/lib/error_page_renderer.rb
index dae92f41932200c4f5e93419295bfef5b72eaf14..65bd09dbcaa7379c9af3195e63105fc4a7986936 100644
--- a/lib/error_page_renderer.rb
+++ b/lib/error_page_renderer.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 # Inspired by https://github.com/route/errgent/blob/master/lib/errgent/renderer.rb
 class ErrorPageRenderer
   def initialize options={}
diff --git a/lib/evil_query.rb b/lib/evil_query.rb
index 782833a92dd78923af9ca2f8fa88c1e566253eec..4ac15b34e520a9a44985e9a794656ebf59678ff8 100644
--- a/lib/evil_query.rb
+++ b/lib/evil_query.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module EvilQuery
   class Base
     include Diaspora::Logging
diff --git a/lib/i18n_interpolation_fallbacks.rb b/lib/i18n_interpolation_fallbacks.rb
index d379a965e3277160b4779e4f99b817d83c287664..0cfbf6bfa38bcaf7d05e3de66cb33c342ad55fb7 100644
--- a/lib/i18n_interpolation_fallbacks.rb
+++ b/lib/i18n_interpolation_fallbacks.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module I18n
   module Backend
     module InterpolationFallbacks
diff --git a/lib/node_info.rb b/lib/node_info.rb
index 789bdd64dd75d252cfac78afc72b7cddf98c75d0..f2118af2667bc1c6a2b543f6dde0ecebb14ba656 100644
--- a/lib/node_info.rb
+++ b/lib/node_info.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "pathname"
 require "json-schema"
 
diff --git a/lib/photo_exporter.rb b/lib/photo_exporter.rb
index 99c25ab98ace5dbbde1c4933a8fddbec2279ab7c..88e04d6f779f388d36950f5c020da505f4b2dcbc 100644
--- a/lib/photo_exporter.rb
+++ b/lib/photo_exporter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class PhotoExporter
   attr_reader :user
 
diff --git a/lib/publisher.rb b/lib/publisher.rb
index 677afb89fe237af29ddf6f5fca70257b2bdcde11..a6c6ab069829478a56eef4f5b13f74f4f4749ef3 100644
--- a/lib/publisher.rb
+++ b/lib/publisher.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Publisher
   attr_accessor :user, :open, :prefill, :public
 
diff --git a/lib/pubsubhubbub.rb b/lib/pubsubhubbub.rb
index deed195daf49857e2125c6bf0e6e746cc9302fc8..66f899ba685c348911562ff35292e9bdb8edd370 100644
--- a/lib/pubsubhubbub.rb
+++ b/lib/pubsubhubbub.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/rack/internet_explorer_version.rb b/lib/rack/internet_explorer_version.rb
deleted file mode 100644
index 4d3b4446838887aa01eeb92e4327f04de4a79839..0000000000000000000000000000000000000000
--- a/lib/rack/internet_explorer_version.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
-#   licensed under the Affero General Public License version 3 or later.  See
-#   the COPYRIGHT file.
-
-module Rack
-  class InternetExplorerVersion
-    def initialize(app, options={})
-      @app = app
-      @options = options
-    end
-
-    def call(env)
-      if env["HTTP_USER_AGENT"] =~ /MSIE/ && ie_version(env["HTTP_USER_AGENT"]) < @options[:minimum]
-        html = <<-HTML
-          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-          <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-            <head>
-              <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
-              <title>Diaspora doesn't support your version of Internet Explorer. Try Firefox, Chrome or Opera!</title>
-            </head>
-            <body>
-              <h1>Diaspora doesn't support your version of Internet Explorer.</h1>
-              You can use one of these browsers (and many more):
-              <ul>
-                <li><a href="https://www.mozilla.org/firefox/">Firefox</a></li>
-                <li><a href="https://www.google.com/chrome/">Chrome</a></li>
-                <li><a href="https://www.opera.com/">Opera</a></li>
-              </ul>
-            </body>
-          </html>
-        HTML
-        return [200, {"Content-Type" =>  "text/html", "Content-Length" => html.size.to_s}, Rack::Response.new([html])]
-      end
-      @app.call(env)
-    end
-
-    def ie_version(ua_string)
-      ua_string.match(/MSIE ?(\S+)/)[1].to_f
-    end
-  end
-end
diff --git a/lib/schemas/archive-format.json b/lib/schemas/archive-format.json
index 11ba60a724d78f401c5ccbf004f4d7ae67b68fbf..3143315066a6537edf7278d040ace31c7c72c647 100644
--- a/lib/schemas/archive-format.json
+++ b/lib/schemas/archive-format.json
@@ -81,7 +81,8 @@
               {
                 "oneOf": [
                   { "$ref": "#/definitions/remote_subscription/public" },
-                  { "$ref": "#/definitions/remote_subscription/private" }
+                  { "$ref": "#/definitions/remote_subscription/private" },
+                  { "$ref": "#/definitions/remote_subscription/reshare" }
                 ]
               }
             ]
@@ -223,7 +224,7 @@
           }
         },
         "required": [
-          "entity_data"
+          "entity_data", "subscribed_pods_uris"
         ]
       },
 
@@ -248,7 +249,29 @@
               "public"
             ]
           }
-        }
+        },
+        "required": [
+          "entity_data", "subscribed_users_ids"
+        ]
+      },
+
+      "reshare": {
+        "type": "object",
+        "properties": {
+          "entity_type": {
+            "type": "string",
+            "pattern": "^reshare$"
+          },
+          "subscribed_pods_uris": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          }
+        },
+        "required": [
+          "entity_type", "subscribed_pods_uris"
+        ]
       }
     }
   }
diff --git a/lib/share_visibility_converter.rb b/lib/share_visibility_converter.rb
index 82b9e2d23bba33657619a3292674399f0b8df12b..7faa1ecad3491e0a9599011b667e92a2af3c61f6 100644
--- a/lib/share_visibility_converter.rb
+++ b/lib/share_visibility_converter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #we dont have the environment, and it is not carring over from the migration
 unless defined?(Person)
   class Person < ApplicationRecord
diff --git a/lib/sidekiq_middlewares.rb b/lib/sidekiq_middlewares.rb
index 6190cff4a81480c96a7ad1a2b0003eca35f0f115..55aeb304fd39503314dae3d7a69c42fc5952fb6e 100644
--- a/lib/sidekiq_middlewares.rb
+++ b/lib/sidekiq_middlewares.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module SidekiqMiddlewares
   class CleanAndShortBacktraces
     def call(worker, item, queue)
diff --git a/lib/stream.rb b/lib/stream.rb
index ae5c98f260828be3137dc1d079051cb39bdcacdc..27cb67e25bd2e430b716d1d58dd0d9eea1964a05 100644
--- a/lib/stream.rb
+++ b/lib/stream.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module Stream
   require 'stream/activity'
   require 'stream/aspect'
diff --git a/lib/stream/activity.rb b/lib/stream/activity.rb
index 4a4b06f82d7a3c5c56db803a6b0d1ee874a283c7..2d0cd1f50779e87e6a955f2ac28186d74183313d 100644
--- a/lib/stream/activity.rb
+++ b/lib/stream/activity.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Stream::Activity < Stream::Base
   def link(opts={})
     Rails.application.routes.url_helpers.activity_streams_path(opts)
diff --git a/lib/stream/aspect.rb b/lib/stream/aspect.rb
index 0891ebde191882d9de8d823ba3855e3ca231e596..6800310b0cea97ad6a25993ecb5deba0919d07b5 100644
--- a/lib/stream/aspect.rb
+++ b/lib/stream/aspect.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/base.rb b/lib/stream/base.rb
index 72dad18d298738bc2507ad2108d413ec9ff3ed50..9e45666e38a24f01406dc1ccd75b8b771b9b53d1 100644
--- a/lib/stream/base.rb
+++ b/lib/stream/base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Stream::Base
   TYPES_OF_POST_IN_STREAM = ['StatusMessage', 'Reshare']
 
diff --git a/lib/stream/comments.rb b/lib/stream/comments.rb
index e4c8ee45ba9dbc277cf4a76440905f4759aa7e53..26c27d9e946cc44f254889b5797ff9d62ee84e67 100644
--- a/lib/stream/comments.rb
+++ b/lib/stream/comments.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/followed_tag.rb b/lib/stream/followed_tag.rb
index ab1513bfb687c963224ea9a3eb20e2ea0ebd5d0c..b4ad5767e0291f442b826cb3d44c9780355c8d1e 100644
--- a/lib/stream/followed_tag.rb
+++ b/lib/stream/followed_tag.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/likes.rb b/lib/stream/likes.rb
index f534d1cd9c422ccbad106aa44d4752461b33b6f5..aff782ff3c0d20e1bdbcece8fdb51aa744c9149f 100644
--- a/lib/stream/likes.rb
+++ b/lib/stream/likes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc. This file is
 # licensed under the Affero General Public License version 3 or later. See
 # the COPYRIGHT file.
diff --git a/lib/stream/mention.rb b/lib/stream/mention.rb
index a1afe8ff458b792b4bb4294772e51b85cac17f8f..c003f234a7f43007c63c319b3e0a0164ded38ab2 100644
--- a/lib/stream/mention.rb
+++ b/lib/stream/mention.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/multi.rb b/lib/stream/multi.rb
index 7a7d6cc2ab5ba7c00808a862dff426407c218a10..3ca27a262e1a916d06e1571445ddc1b9b2695a92 100644
--- a/lib/stream/multi.rb
+++ b/lib/stream/multi.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class Stream::Multi < Stream::Base
 
   # @return [String] URL
diff --git a/lib/stream/person.rb b/lib/stream/person.rb
index 1a1123d71f613a27a30cb13f04c3ecaa6533c355..b7c11baacdf768adc5026d39c4af3903112e0674 100644
--- a/lib/stream/person.rb
+++ b/lib/stream/person.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/public.rb b/lib/stream/public.rb
index b0285f4a8fc7535d250eb0b54082e388823af280..de6484b0eb1ede5cacdeda7153058299164df224 100644
--- a/lib/stream/public.rb
+++ b/lib/stream/public.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/stream/tag.rb b/lib/stream/tag.rb
index 53372ba577eadff7ee62f008f38719ee97fbd06f..bec10d341f74cd5a96ccd3c2876bfb196690015e 100644
--- a/lib/stream/tag.rb
+++ b/lib/stream/tag.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
index 39083eea300bcb795effe72547b3a0df553ea6c3..38101d7b3ddae33822a40ed1f45bad8c6f5ba359 100644
--- a/lib/tasks/assets.rake
+++ b/lib/tasks/assets.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 namespace :assets do
   desc "Generate error pages"
   task :generate_error_pages => :environment do
diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake
index 83f79471e59f606e24ea78921be60d709e1b8f50..b572086e3d472f07416f69f90b72ff24b0dd319a 100644
--- a/lib/tasks/cucumber.rake
+++ b/lib/tasks/cucumber.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
 # It is recommended to regenerate this file in the future when you upgrade to a 
 # newer version of cucumber-rails. Consider adding your own code to a new file 
diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake
index defd67ce70253b61aa1bb09ba80373f446c74875..2a4bda1c9b6180542c0064f0f0dfd31d58806c15 100644
--- a/lib/tasks/db.rake
+++ b/lib/tasks/db.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/tasks/default.rake b/lib/tasks/default.rake
index 6ec0e55cda03bb4c616258d57c3414c91ebb469f..980cf702dcc438c278181b40906367779c17ce0c 100644
--- a/lib/tasks/default.rake
+++ b/lib/tasks/default.rake
@@ -1 +1,3 @@
+# frozen_string_literal: true
+
 task :default => [:spec, :cucumber, :'jasmine:ci']
diff --git a/lib/tasks/generate_session_secret.rake b/lib/tasks/generate_session_secret.rake
index cab226177acc277a77cddba92af714a12c4ebda1..28af3ef6e444253b9bef9a89baa3ae7b11f75f10 100644
--- a/lib/tasks/generate_session_secret.rake
+++ b/lib/tasks/generate_session_secret.rake
@@ -1,11 +1,12 @@
+# frozen_string_literal: true
+
 namespace :generate do
   desc 'Generates a Session Secret Token'
   task :secret_token do
-
-  path = Rails.root.join('config', 'initializers', 'secret_token.rb')
-  secret = SecureRandom.hex(40)
-  File.open(path, 'w') do |f|
-    f.write <<"EOF"
+    path = Rails.root.join("config", "initializers", "secret_token.rb")
+    secret = SecureRandom.hex(40)
+    File.open(path, "w") do |f|
+      f.write <<EOF
 # Be sure to restart your server when you modify this file.
 
 # Your secret key is used for verifying the integrity of signed cookies.
@@ -19,8 +20,7 @@ namespace :generate do
 # if you're sharing your code publicly.
 Diaspora::Application.config.secret_key_base = '#{secret}'
 EOF
-
-end
+    end
 
   end
 end
diff --git a/lib/tasks/linter.rake b/lib/tasks/linter.rake
index 31ff91957d88e403ac340834e8eb4918f22314c1..f80d074d230f45c2117df866213b03cb13bc0e14 100644
--- a/lib/tasks/linter.rake
+++ b/lib/tasks/linter.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 begin
   require "eslintrb/eslinttask"
   Eslintrb::EslintTask.new :eslint do |t|
diff --git a/lib/tasks/maintenance.rake b/lib/tasks/maintenance.rake
index 042d78b58638ff8be79f9b232787d66a2a16444b..493d208972f7e4e86f5f3fabde8303faf3c1aa05 100644
--- a/lib/tasks/maintenance.rake
+++ b/lib/tasks/maintenance.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/lib/tasks/migrations.rake b/lib/tasks/migrations.rake
index b55e493e85660743c7bf66dee858c29bfdb39701..6d49bec46eaf50b9efff062f50e3a1ada8d42c8c 100644
--- a/lib/tasks/migrations.rake
+++ b/lib/tasks/migrations.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
@@ -57,4 +59,26 @@ namespace :migrations do
       queue.clear
     end
   end
+
+  desc "Run uncompleted account deletions"
+  task run_account_deletions: :environment do
+    if AccountDeletion.uncompleted.count > 0
+      puts "Running account deletions..."
+      AccountDeletion.uncompleted.find_each do |account_deletion|
+        print "Deleting #{account_deletion.person.diaspora_handle} ..."
+        progress = Thread.new {
+          loop {
+            sleep 10
+            print "."
+          }
+        }
+        account_deletion.perform!
+        progress.kill
+        puts " Done"
+      end
+      puts "OK."
+    else
+      puts "No account deletions to run."
+    end
+  end
 end
diff --git a/lib/tasks/podmin.rake b/lib/tasks/podmin.rake
index dc5289cbd1f3c98d69082b34b6b489d5bf3d81a3..ccfbfe737e6f25680454cbce53b49a14e7f42222 100644
--- a/lib/tasks/podmin.rake
+++ b/lib/tasks/podmin.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 namespace :podmin do
   
   desc "Send an email to users as admin"
diff --git a/lib/tasks/screenshots.rake b/lib/tasks/screenshots.rake
index eee87fedc4fc7dafc00321f59034330635ef50c3..42282488c46510184f11d7cd7e8d2e7b2b8151a3 100644
--- a/lib/tasks/screenshots.rake
+++ b/lib/tasks/screenshots.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if defined? Cucumber
 
 namespace :screenshots do
@@ -15,7 +17,6 @@ namespace :screenshots do
 
   desc 'Generate "flicker" images for easy comparison (requires RMagick)'
   task :flicker do
-    require 'RMagick'
     screen_dir = Rails.root.join('tmp', 'screenshots')
 
     ref_dir = screen_dir.join('reference')
@@ -28,10 +29,12 @@ namespace :screenshots do
         raise "the comparison screenshot for #{filename} doesn't exist!"
       end
 
-      img_list = Magick::ImageList.new(ref_dir.join(filename), cur_dir.join(filename))
-      img_list.delay = 65      # number of ticks between flicker img change (100 ticks/second)
-      img_list.iterations = 0  # -> endless loop
-      img_list.write(screen_dir.join("#{filename}.gif"))
+      MiniMagick::Tool::Convert.new do |convert|
+        convert.merge! ["-delay", "65", "-loop", "0"]
+        convert << ref_dir.join(filename)
+        convert << cur_dir.join(filename)
+        convert << screen_dir.join("#{filename}.gif")
+      end
     end
 
     puts %Q(
diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake
index b6e2bcfcf262e210052151de7f387a336d6a2dea..30c0eec484e7246629348c761b9907dc16384e41 100644
--- a/lib/tasks/tests.rake
+++ b/lib/tasks/tests.rake
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 namespace :ci do
   namespace :travis do
     task prepare_db: %w[db:create db:migrate]
diff --git a/script/cucumber b/script/cucumber
deleted file mode 100755
index 7fa5c9208675ca06c02b2d3a3279f17623d1cbc9..0000000000000000000000000000000000000000
--- a/script/cucumber
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env ruby
-
-vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
-if vendored_cucumber_bin
-  load File.expand_path(vendored_cucumber_bin)
-else
-  require 'rubygems' unless ENV['NO_RUBYGEMS']
-  require 'cucumber'
-  load Cucumber::BINARY
-end
diff --git a/script/get_config.rb b/script/get_config.rb
index a9197096d13e11601e4fe8fa9893270f386f6e25..da8bb55db0d26167a1a798b2d95d8b2817370dff 100755
--- a/script/get_config.rb
+++ b/script/get_config.rb
@@ -1,4 +1,6 @@
 #!/usr/bin/env ruby
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/script/i18n/xmltoyml.rb b/script/i18n/xmltoyml.rb
index e3fde7da14385ec4b1b5ae4eb1c73343041cace3..f7eeee935a81cf4dd5a550babe836920f869c4dd 100755
--- a/script/i18n/xmltoyml.rb
+++ b/script/i18n/xmltoyml.rb
@@ -1,4 +1,6 @@
 #!/usr/bin/env ruby
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/script/i18n/ymltoxml.rb b/script/i18n/ymltoxml.rb
index ff32ca4052564eff6dbc9ebb640b64bb388e4df3..16c21b91ea8fe2c2061fa22853260c0fe5eced8e 100755
--- a/script/i18n/ymltoxml.rb
+++ b/script/i18n/ymltoxml.rb
@@ -1,4 +1,6 @@
 #!/usr/bin/env ruby
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/script/rails b/script/rails
deleted file mode 100755
index f8da2cffd4de029d658fe2f7b9ec88f28dc34a9a..0000000000000000000000000000000000000000
--- a/script/rails
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env ruby
-# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
-
-APP_PATH = File.expand_path('../../config/application',  __FILE__)
-require File.expand_path('../../config/boot',  __FILE__)
-require 'rails/commands'
diff --git a/spec/configuration_methods_spec.rb b/spec/configuration_methods_spec.rb
index f3b4595cf6f2aa5b499b6686035acef0d7e11373..e358e17a40ad7f7f62315186e90b266ff229bf6a 100644
--- a/spec/configuration_methods_spec.rb
+++ b/spec/configuration_methods_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe "ensure configuration effects" do
   it "sets the captcha length as required" do
     expect(SimpleCaptcha.length).to eq(AppConfig.settings.captcha.captcha_length.to_i)
diff --git a/spec/controllers/admin/pods_controller_spec.rb b/spec/controllers/admin/pods_controller_spec.rb
index 784e29c6e30a79bc48de274fabe36fd3cd83e5ad..02085a180b217e43ed43594c7a78410c8222e465 100644
--- a/spec/controllers/admin/pods_controller_spec.rb
+++ b/spec/controllers/admin/pods_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Admin::PodsController, type: :controller do
   before do
     @user = FactoryGirl.create :user
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index 7293ffab2b59d580f3ea8b5b01df5c56853d0367..751d05114c1934e3ddec83d3ac77b17a3ec1ebfe 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Admin::UsersController, :type => :controller do
   before do
     @user = FactoryGirl.create :user
diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb
index e9580a5d26a790c6e7860bc1221c1464ae2bfc7c..a9e61eb6af95883c12455b10afd18e50ec7903fd 100644
--- a/spec/controllers/admins_controller_spec.rb
+++ b/spec/controllers/admins_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/api/openid_connect/authorizations_controller_spec.rb b/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
index 54435e0b3784bbe5a5f6c816d9a9ce05ceb79bc8..ebe4f1ef091cf61a9a0e0c3441e1855763c82696 100644
--- a/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::AuthorizationsController, type: :request do
   let!(:client) { FactoryGirl.create(:o_auth_application) }
 
diff --git a/spec/controllers/api/openid_connect/clients_controller_spec.rb b/spec/controllers/api/openid_connect/clients_controller_spec.rb
index 33776fdfbbd5f7dc2b6ba4290c73f89282968f70..1a2c0eb4dd804d69a0840c645cee2ad3b0d0d015 100644
--- a/spec/controllers/api/openid_connect/clients_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/clients_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::ClientsController, type: :controller, suppress_csrf_verification: :none do
   describe "#create" do
     context "when valid parameters are passed" do
diff --git a/spec/controllers/api/openid_connect/discovery_controller_spec.rb b/spec/controllers/api/openid_connect/discovery_controller_spec.rb
index 73d6e51fd067674325dd6f12c84ef2667128851c..a67463f9df7e967e467c89c6692448a58a288518 100644
--- a/spec/controllers/api/openid_connect/discovery_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/discovery_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::DiscoveryController, type: :controller do
   describe "#configuration" do
     before do
diff --git a/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb b/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
index eb7bccefa473554a01c86396c8de4b604b82a4e9..cbbce0e319af50174bcfd147d9d3389d53a41b9b 100644
--- a/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::IdTokensController, type: :controller do
   describe "#jwks" do
     before do
diff --git a/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb b/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
index 766a3c806bc8a84dfdd76dac48a9e06484ec2c6c..20cf9ba446050f5fed1457dc81338c54c378b373 100644
--- a/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::TokenEndpointController, type: :controller, suppress_csrf_verification: :none do
   let(:auth) { FactoryGirl.create(:auth_with_read) }
 
diff --git a/spec/controllers/api/openid_connect/user_applications_spec.rb b/spec/controllers/api/openid_connect/user_applications_spec.rb
index 3a94d830e3a1e719825f7d9bc7e83abbae70e955..ec119eb706bdb51b0ac529b1abf574b7f57011da 100644
--- a/spec/controllers/api/openid_connect/user_applications_spec.rb
+++ b/spec/controllers/api/openid_connect/user_applications_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::UserApplicationsController, type: :controller do
   before do
     @app = FactoryGirl.create(:o_auth_application_with_xss)
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index faacf265fb3192b3a0d4f1aa552a2a35146f0f7d..c0b1c87cd3a56b00e2030cbd455d9bcfb82760b2 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/aspect_memberships_controller_spec.rb b/spec/controllers/aspect_memberships_controller_spec.rb
index a577a613a8b1ed9f47e52c52fcf704223e5aeb18..903e732efb233f6bba834c599580dfdb1bb9dd6a 100644
--- a/spec/controllers/aspect_memberships_controller_spec.rb
+++ b/spec/controllers/aspect_memberships_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb
index 1f39d7312a6b4d25ba4a9ca0fef3a1d427cd8852..d763f4a833654502adbb6b395b8f91002d3c19b1 100644
--- a/spec/controllers/aspects_controller_spec.rb
+++ b/spec/controllers/aspects_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/blocks_controller_spec.rb b/spec/controllers/blocks_controller_spec.rb
index 0a774da3a92ca69205162962c095b94b3260e424..b3d7b156769eb9d9908c7988b71a54e37df5d4de 100644
--- a/spec/controllers/blocks_controller_spec.rb
+++ b/spec/controllers/blocks_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe BlocksController, :type => :controller do
   before do
     sign_in alice
diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb
index 4b9e22ce5a6011c3efae97b15a2a1f0df0132771..597205268bd01d311d3a0016710973fda272be9e 100644
--- a/spec/controllers/comments_controller_spec.rb
+++ b/spec/controllers/comments_controller_spec.rb
@@ -1,10 +1,11 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
 
 describe CommentsController, :type => :controller do
   before do
-    allow(@controller).to receive(:current_user).and_return(alice)
     sign_in alice, scope: :user
   end
 
@@ -62,6 +63,7 @@ describe CommentsController, :type => :controller do
       aspect_to_post = eve.aspects.where(:name => "generic").first
       @post = eve.post :status_message, :text => 'GIANTS', :to => aspect_to_post
 
+      allow(@controller).to receive(:current_user).and_return(alice)
       expect(alice).not_to receive(:comment)
       post :create, params: comment_hash
       expect(response.code).to eq("404")
@@ -81,7 +83,7 @@ describe CommentsController, :type => :controller do
         sign_in bob, scope: :user
       end
 
-      it 'lets the user delete his comment' do
+      it "lets the user delete their comment" do
         comment = bob.comment!(@message, "hey")
 
         expect(bob).to receive(:retract).with(comment)
@@ -99,18 +101,20 @@ describe CommentsController, :type => :controller do
     end
 
     context "another user's post" do
-      it 'let the user delete his comment' do
+      it "lets the user delete their comment" do
         comment = alice.comment!(@message, "hey")
 
+        allow(@controller).to receive(:current_user).and_return(alice)
         expect(alice).to receive(:retract).with(comment)
         delete :destroy, params: {post_id: 1, id: comment.id}, format: :js
         expect(response.status).to eq(204)
       end
 
-      it 'does not let the user destroy comments he does not own' do
+      it "does not let the user destroy comments they do not own" do
         comment1 = bob.comment!(@message, "hey")
         comment2 = eve.comment!(@message, "hey")
 
+        allow(@controller).to receive(:current_user).and_return(alice)
         expect(alice).not_to receive(:retract).with(comment1)
         delete :destroy, params: {post_id: 1, id: comment2.id}, format: :js
         expect(response.status).to eq(403)
@@ -154,5 +158,12 @@ describe CommentsController, :type => :controller do
       get :index, params: {post_id: message.id}, format: :json
       expect(response.status).to eq(404)
     end
+
+    it "returns a 401 for a private post when logged out" do
+      bob.comment!(@message, "hey")
+      sign_out :user
+      get :index, params: {post_id: @message.id}, format: :json
+      expect(response.status).to eq(401)
+    end
   end
 end
diff --git a/spec/controllers/contacts_controller_spec.rb b/spec/controllers/contacts_controller_spec.rb
index c50243264a0179c19f32e5abca72cea645e5642a..608d664e83e8e29096f4b956a9caf05832f20f8a 100644
--- a/spec/controllers/contacts_controller_spec.rb
+++ b/spec/controllers/contacts_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/conversation_visibilities_controller_spec.rb b/spec/controllers/conversation_visibilities_controller_spec.rb
index 973873e48b7df2eeccf48fc82d6305cad04991cf..9c936fb8634e0bc68adbdac357ab14e9cda3f8ee 100644
--- a/spec/controllers/conversation_visibilities_controller_spec.rb
+++ b/spec/controllers/conversation_visibilities_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/conversations_controller_spec.rb b/spec/controllers/conversations_controller_spec.rb
index dd6b646778a1dc0ac366e122b5a8c1620221df36..aaf81076c6a14327aaa0920d5f748009a952b08c 100644
--- a/spec/controllers/conversations_controller_spec.rb
+++ b/spec/controllers/conversations_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -20,16 +22,6 @@ describe ConversationsController, :type => :controller do
         get :new, params: {modal: true}
         expect(response).to be_success
       end
-
-      it "assigns a contact if passed a contact id" do
-        get :new, params: {contact_id: alice.contacts.first.id, modal: true}
-        expect(controller.gon.conversation_prefill).to eq([alice.contacts.first.person.as_json])
-      end
-
-      it "assigns a set of contacts if passed an aspect id" do
-        get :new, params: {aspect_id: alice.aspects.first.id, modal: true}
-        expect(controller.gon.conversation_prefill).to eq(alice.aspects.first.contacts.map {|c| c.person.as_json })
-      end
     end
 
     context "mobile" do
@@ -483,7 +475,9 @@ describe ConversationsController, :type => :controller do
 
     it "returns html of conversation" do
       get :raw, params: {conversation_id: conversation.id}
-      expect(response).to render_template(partial: "show", locals: {conversation: conversation})
+      expect(response).to render_template(partial: "conversations/_show")
+      expect(response.body).to include conversation.subject
+      expect(response.body).to include conversation.messages.first.text
     end
 
     it "returns 404 when requesting non-existant conversation" do
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index a9c3b0a1aed7545708b9cd6dfe8c03eb7fdc85c8..11feab03be21885cb57c727a81c2e384a8aa39cf 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe HelpController, type: :controller do
   describe "#faq" do
     it "succeeds" do
diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb
index 2e5a9b3a8280b3a77720b06465360f265e3d8a72..82cc10711a3498ab6fd9afc5f31e68c24da9e506 100644
--- a/spec/controllers/home_controller_spec.rb
+++ b/spec/controllers/home_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/invitation_codes_controller_spec.rb b/spec/controllers/invitation_codes_controller_spec.rb
index afc317f99253196d23b32d0f6f2405d830dbd12d..b6f604ec1c21913aea61936d9c2fa45e6eb75cd6 100644
--- a/spec/controllers/invitation_codes_controller_spec.rb
+++ b/spec/controllers/invitation_codes_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe InvitationCodesController, type: :controller do
   describe "#show" do
     it "redirects to the root page if the invitation code is invalid" do
diff --git a/spec/controllers/invitations_controller_spec.rb b/spec/controllers/invitations_controller_spec.rb
index 9ca17c1255cfb2c1fa3215ec0334f49f9fbd3a3d..7919b6a8b3e78dbe21535f0731ef88cc929c7b5d 100644
--- a/spec/controllers/invitations_controller_spec.rb
+++ b/spec/controllers/invitations_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/admins_spec.rb b/spec/controllers/jasmine_fixtures/admins_spec.rb
index 23a448ed8f89fb9672c766456d6b5dbf4b42e278..62bfd77a25133c38543cee69ab603157e1675af8 100644
--- a/spec/controllers/jasmine_fixtures/admins_spec.rb
+++ b/spec/controllers/jasmine_fixtures/admins_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe AdminsController, type: :controller do
   describe "#dashboard" do
     before do
diff --git a/spec/controllers/jasmine_fixtures/aspects_spec.rb b/spec/controllers/jasmine_fixtures/aspects_spec.rb
index b82fbc2de0c1c8a3eebbd1a159d5c38081534a3b..cd2c39c6cc271c57ff847718cec86b1dfe03c440 100644
--- a/spec/controllers/jasmine_fixtures/aspects_spec.rb
+++ b/spec/controllers/jasmine_fixtures/aspects_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/contacts_spec.rb b/spec/controllers/jasmine_fixtures/contacts_spec.rb
index 06262aed2830286af4a36fb15f64caa7a7977bce..35e7566603ea233a36f8c03481c453e5d22794ac 100644
--- a/spec/controllers/jasmine_fixtures/contacts_spec.rb
+++ b/spec/controllers/jasmine_fixtures/contacts_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/conversations_spec.rb b/spec/controllers/jasmine_fixtures/conversations_spec.rb
index a35993c0b538d30b320001318db19d8a4c047ebf..f6585b6abb57e8ecde891ae9ceea83c08b7c8d04 100644
--- a/spec/controllers/jasmine_fixtures/conversations_spec.rb
+++ b/spec/controllers/jasmine_fixtures/conversations_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ConversationsController, :type => :controller do
   describe '#index' do
     before do
diff --git a/spec/controllers/jasmine_fixtures/notifications_spec.rb b/spec/controllers/jasmine_fixtures/notifications_spec.rb
index 687bc252300d93bb7eef7115d344c70ff82cdcaa..26dd262e9c85edc207528c96bc37fb6481baf0bf 100644
--- a/spec/controllers/jasmine_fixtures/notifications_spec.rb
+++ b/spec/controllers/jasmine_fixtures/notifications_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NotificationsController, :type => :controller do
   describe '#index' do
     before do
diff --git a/spec/controllers/jasmine_fixtures/people_spec.rb b/spec/controllers/jasmine_fixtures/people_spec.rb
index 77ec784248837ec19cff6369e58ee2c87dc1ee2a..0d48f2ff761d4c5ad4839950fa0edace8b9b9da4 100644
--- a/spec/controllers/jasmine_fixtures/people_spec.rb
+++ b/spec/controllers/jasmine_fixtures/people_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/photos_spec.rb b/spec/controllers/jasmine_fixtures/photos_spec.rb
index 3dabe5e53661e49a7334025dde5fee72eb97caa4..08badf72a3674990d1796b04685b59a81be94c4b 100644
--- a/spec/controllers/jasmine_fixtures/photos_spec.rb
+++ b/spec/controllers/jasmine_fixtures/photos_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/posts_spec.rb b/spec/controllers/jasmine_fixtures/posts_spec.rb
index aed5d118ae3b02721451a513181850aa031ec5d6..6af6f4e5f2b987a80f90c651e4e7a08c27663b54 100644
--- a/spec/controllers/jasmine_fixtures/posts_spec.rb
+++ b/spec/controllers/jasmine_fixtures/posts_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "spec_helper"
 
 describe PostsController, type: :controller do
diff --git a/spec/controllers/jasmine_fixtures/status_messages_spec.rb b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
index 6964f1d5b195e3356bd0585f6ddf8d686d38cfe2..a09a2e5a6239fdbee483f24d27cb9b710f66e1b2 100644
--- a/spec/controllers/jasmine_fixtures/status_messages_spec.rb
+++ b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/streams_spec.rb b/spec/controllers/jasmine_fixtures/streams_spec.rb
index 0e815439adb0055a14180bdcbde0fbd053007c00..ea58bf176ed3fa5d111e5953f20763e5b15003f2 100644
--- a/spec/controllers/jasmine_fixtures/streams_spec.rb
+++ b/spec/controllers/jasmine_fixtures/streams_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/jasmine_fixtures/users_spec.rb b/spec/controllers/jasmine_fixtures/users_spec.rb
index 54d624a776fea9ca0aaf31d921b7bef846ba9f68..dedebceae9d576757ef453cf1818c07ab4e22984 100644
--- a/spec/controllers/jasmine_fixtures/users_spec.rb
+++ b/spec/controllers/jasmine_fixtures/users_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe UsersController, type: :controller do
   before do
     sign_in alice, scope: :user
diff --git a/spec/controllers/likes_controller_spec.rb b/spec/controllers/likes_controller_spec.rb
index b29fdeae92087fd4de4f6c077a258b0e6267eb9c..26ed8c6f18f842145533dda7ef319bf667785c24 100644
--- a/spec/controllers/likes_controller_spec.rb
+++ b/spec/controllers/likes_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -91,7 +93,22 @@ describe LikesController, type: :controller do
 
     it "returns an empty array for a post with no likes" do
       get :index, params: {post_id: @message.id}
-      expect(JSON.parse(response.body).map(&:id)).to eq([])
+      expect(JSON.parse(response.body)).to eq([])
+    end
+
+    it "returns likes for a public post without login" do
+      post = alice.post(:status_message, text: "hey", public: true)
+      bob.like!(post)
+      sign_out :user
+      get :index, params: {post_id: post.id}, format: :json
+      expect(JSON.parse(response.body).map {|h| h["id"] }).to match_array(post.likes.map(&:id))
+    end
+
+    it "returns a 401 for a private post when logged out" do
+      bob.like!(@message)
+      sign_out :user
+      get :index, params: {post_id: @message.id}, format: :json
+      expect(response.status).to eq(401)
     end
   end
 
diff --git a/spec/controllers/messages_controller_spec.rb b/spec/controllers/messages_controller_spec.rb
index 596ca084e83547df399a42acb91cb7be7ec04ef4..4fd9bd4f352853f1e71d9fe157c15470965d2d83 100644
--- a/spec/controllers/messages_controller_spec.rb
+++ b/spec/controllers/messages_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/node_info_controller_spec.rb b/spec/controllers/node_info_controller_spec.rb
index 3108ca4cfb527321cd0313524b3e6eba6969807b..80cae293a00052013a2645243f866f51685ada85 100644
--- a/spec/controllers/node_info_controller_spec.rb
+++ b/spec/controllers/node_info_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NodeInfoController do
   describe "#jrd" do
     it "responds to JSON" do
diff --git a/spec/controllers/notifications_controller_spec.rb b/spec/controllers/notifications_controller_spec.rb
index 58a078bcb1c8683c28a74a28c1ebdb08642450a6..1788182a31ffea9513aadb1f3b1bb160328a0dc4 100644
--- a/spec/controllers/notifications_controller_spec.rb
+++ b/spec/controllers/notifications_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -119,7 +121,7 @@ describe NotificationsController, :type => :controller do
         eve.share_with(alice.person, eve.aspects.first)
         get :index, params: {per_page: 5}
 
-        expect(Nokogiri(response.body).css(".aspect_membership_dropdown")).not_to be_empty
+        expect(Nokogiri(response.body).css(".aspect-membership-dropdown")).not_to be_empty
       end
 
       it 'succeeds on mobile' do
diff --git a/spec/controllers/participations_controller_spec.rb b/spec/controllers/participations_controller_spec.rb
index 9c2fc1e2c6fc670be83b65c1865ef093308fb88b..d38e7bc694dc76e6250fd01e37721077dac2be70 100644
--- a/spec/controllers/participations_controller_spec.rb
+++ b/spec/controllers/participations_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ParticipationsController, :type => :controller do
   before do
     allow(@controller).to receive(:current_user).and_return(alice)
diff --git a/spec/controllers/passwords_controller_spec.rb b/spec/controllers/passwords_controller_spec.rb
index 378e3a1119bb7583c5a6c4358322e0f3fb00feb6..87090790464ec762606fa67998e0bed672742e71 100644
--- a/spec/controllers/passwords_controller_spec.rb
+++ b/spec/controllers/passwords_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb
index bb450b88cb85793f287ab8a6ad3c247701e87bb1..740744525cac2ccaf3f7b0b0162101335afa1b4c 100644
--- a/spec/controllers/people_controller_spec.rb
+++ b/spec/controllers/people_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb
index d323ba87b613e65ae8393e8822539a62d26e4b3f..424eeb235bb9c6af338e4cce0e5f9c1b87244fb0 100644
--- a/spec/controllers/photos_controller_spec.rb
+++ b/spec/controllers/photos_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -173,7 +175,7 @@ describe PhotosController, :type => :controller do
   end
 
   describe '#destroy' do
-    it 'let a user delete his message' do
+    it "lets a user delete their message" do
       delete :destroy, params: {id: @alices_photo.id}
       expect(Photo.find_by_id(@alices_photo.id)).to be_nil
     end
diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb
index 2c5f72f92260bf70842ee1a186f98d928ac625b7..47c669ba4e7a9a9b30b8c101d1aa955f67258f43 100644
--- a/spec/controllers/posts_controller_spec.rb
+++ b/spec/controllers/posts_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -27,7 +29,7 @@ describe PostsController, type: :controller do
           msg = alice.post(:status_message, text: "Mention @{User ; #{user.diaspora_handle}}", public: true)
 
           expect(msg.mentioned_people.count).to eq(1)
-          user.destroy
+          user.close_account!
 
           get :show, params: {id: msg.id}
           expect(response).to be_success
diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb
index 405b2902b131d06d32a7f228d110a892839c218f..b5b635796f690545f3e40c2bafdbe1858b54bef9 100644
--- a/spec/controllers/profiles_controller_spec.rb
+++ b/spec/controllers/profiles_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 91cf4603d3cca464fece8d786b0fdf170924f1c5..c7063e7280ac3c6f7bb7fbc07da2988a21881fa1 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb
index 176a1d4f85f0b9bed70723bb8d9fedbed34a83b2..be7b6ffd12999d4d0d9916b6fe23adc5ecc29788 100644
--- a/spec/controllers/report_controller_spec.rb
+++ b/spec/controllers/report_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/reshares_controller_spec.rb b/spec/controllers/reshares_controller_spec.rb
index 4682baa2345267318462b1a894adb0204b82fea6..d266c4b713c3928bf95b76385ec197f9365c8953 100644
--- a/spec/controllers/reshares_controller_spec.rb
+++ b/spec/controllers/reshares_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ResharesController, :type => :controller do
   describe '#create' do
     let(:post_request!) {
@@ -101,6 +103,13 @@ describe ResharesController, :type => :controller do
         get :index, params: {post_id: @post.id}, format: :json
         expect(JSON.parse(response.body)).to eq([])
       end
+
+      it "returns reshares without login" do
+        bob.reshare!(@post)
+        sign_out :user
+        get :index, params: {post_id: @post.id}, format: :json
+        expect(JSON.parse(response.body).map {|h| h["id"] }).to match_array(@post.reshares.map(&:id))
+      end
     end
   end
 end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 655cb86d4701eae02c380592d1dbd83286347c36..680554cc8087e4825ebeb06d84f722eb38c338ef 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe SearchController, :type => :controller do
   before do
     @user = alice
diff --git a/spec/controllers/services_controller_spec.rb b/spec/controllers/services_controller_spec.rb
index 9ad8e36aa71728a786fc35c449220af09522da9f..a1c333915df846f61719beb8adfb53bed5e3b724 100644
--- a/spec/controllers/services_controller_spec.rb
+++ b/spec/controllers/services_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 69bbf510c67e5a53c0a2fcea30b28e9cda615244..ff00c6a5bd71eddd92226c130df133744aa0799c 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/share_visibilities_controller_spec.rb b/spec/controllers/share_visibilities_controller_spec.rb
index f70a50ea3396fd5c7c855be6bc70f862611d0513..6f071655842dd494d307754cdec4be2cc7623172 100644
--- a/spec/controllers/share_visibilities_controller_spec.rb
+++ b/spec/controllers/share_visibilities_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/social_relay_controller_spec.rb b/spec/controllers/social_relay_controller_spec.rb
index 1949eb0c7799c02cf000fa148292084d9c1a1a17..5754dc305675689973f0dd8f9cc8ecae982c42c1 100644
--- a/spec/controllers/social_relay_controller_spec.rb
+++ b/spec/controllers/social_relay_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe SocialRelayController, type: :controller do
   describe "#well_known" do
     it "responds to format json" do
diff --git a/spec/controllers/status_messages_controller_spec.rb b/spec/controllers/status_messages_controller_spec.rb
index 8b99c04c2b6b934b578c984aa33daee7db574105..c954ce4c6e5b05b601b7b9966cfbc34c4604063a 100644
--- a/spec/controllers/status_messages_controller_spec.rb
+++ b/spec/controllers/status_messages_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -93,7 +95,7 @@ describe StatusMessagesController, :type => :controller do
         post :create, params: status_message_hash, format: :json
         expect(response.status).to eq(201)
         status_message = StatusMessage.find_by_text(text)
-        expect(status_message.aspect_visibilities.map(&:aspect)).to eq([@aspect1]), format: :json
+        expect(status_message.aspect_visibilities.map(&:aspect)).to eq([@aspect1])
       end
 
       it "takes one aspect as string in aspect_ids" do
diff --git a/spec/controllers/streams_controller_spec.rb b/spec/controllers/streams_controller_spec.rb
index e7114cb1fdeffb997b055bfd8c3be826499448cc..40f9fdf4640984b8f675164b70816c3a87385701 100644
--- a/spec/controllers/streams_controller_spec.rb
+++ b/spec/controllers/streams_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/tag_followings_controller_spec.rb b/spec/controllers/tag_followings_controller_spec.rb
index 6ee1b138b45b5613a702e4dfabda4a843fd539db..c5c6dd8ebe0b74015d9548e74ab76b2a672ce9f7 100644
--- a/spec/controllers/tag_followings_controller_spec.rb
+++ b/spec/controllers/tag_followings_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe TagFollowingsController, type: :controller do
   describe "#manage" do
     context "not signed in" do
diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb
index b62adc5b000263f5993d5dd16176ce54975b6eca..c537e49a517d3c4df1e0d8d6d81772baa4727565 100644
--- a/spec/controllers/tags_controller_spec.rb
+++ b/spec/controllers/tags_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/controllers/terms_controller_spec.rb b/spec/controllers/terms_controller_spec.rb
index ea948a153de2138fb576bf7f1a3d684b379533a1..ea22bbc9426558470b714293e0bf3a320a007f24 100644
--- a/spec/controllers/terms_controller_spec.rb
+++ b/spec/controllers/terms_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe TermsController, type: :controller do
   describe "#index" do
     it "succeeds" do
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index e3ef6a78585f438dca5731d71babf5e146aa0443..0351a7d3eaad31b259daf55cb62800b07de3071d 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -144,7 +146,7 @@ describe UsersController, :type => :controller do
     end
 
     describe 'language' do
-      it 'allow the user to change his language' do
+      it "allows the user to change their language" do
         old_language = 'en'
         @user.language = old_language
         @user.save
@@ -155,7 +157,7 @@ describe UsersController, :type => :controller do
     end
 
     describe "color_theme" do
-      it "allow the user to change his color theme" do
+      it "allows the user to change their color theme" do
         old_color_theme = "original"
         @user.color_theme = old_color_theme
         @user.save
@@ -166,14 +168,14 @@ describe UsersController, :type => :controller do
     end
 
     describe 'email' do
-      it 'disallow the user to change his new (unconfirmed) mail when it is the same as the old' do
+      it "disallows the user to change their new (unconfirmed) mail when it is the same as the old" do
         @user.email = "my@newemail.com"
         put :update, params: {id: @user.id, user: {email: "my@newemail.com"}}
         @user.reload
         expect(@user.unconfirmed_email).to eql(nil)
       end
 
-      it 'allow the user to change his (unconfirmed) email' do
+      it "allows the user to change their (unconfirmed) email" do
         put :update, params: {id: @user.id, user: {email: "my@newemail.com"}}
         @user.reload
         expect(@user.unconfirmed_email).to eql("my@newemail.com")
@@ -191,7 +193,7 @@ describe UsersController, :type => :controller do
         expect(request.flash[:notice]).to be_blank
       end
 
-      it 'allow the user to change his (unconfirmed) email to blank (= abort confirmation)' do
+      it "allow the user to change their (unconfirmed) email to blank (= abort confirmation)" do
         put :update, params: {id: @user.id, user: {email: ""}}
         @user.reload
         expect(@user.unconfirmed_email).to eql(nil)
diff --git a/spec/factories.rb b/spec/factories.rb
index 32a322933914a3897eac7f63705dcca23af856df..0c08448d039b7ab7e8972dddaf7ef650bb03b6e3 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora In  This file is
 #   licensed under the Affero General Public License version 3 or late  See
 #   the COPYRIGHT file.
@@ -247,6 +249,20 @@ FactoryGirl.define do
     association(:post, factory: :status_message)
   end
 
+  factory :signed_comment, parent: :comment do
+    association(:parent, factory: :status_message)
+
+    after(:build) do |comment|
+      order = SignatureOrder.first || FactoryGirl.create(:signature_order)
+      comment.signature = FactoryGirl.build(:comment_signature, comment: comment, signature_order: order)
+    end
+  end
+
+  factory :reference do
+    association :source, factory: :status_message
+    association :target, factory: :status_message
+  end
+
   factory(:notification, class: Notifications::AlsoCommented) do
     association :recipient, :factory => :user
     association :target, :factory => :comment
diff --git a/spec/federation_callbacks_spec.rb b/spec/federation_callbacks_spec.rb
index 7a5ddb58e9633d1648454350f9aba3a8eb0de2ce..f672596660b13d6687dd1bcf487695e6bf5797ba 100644
--- a/spec/federation_callbacks_spec.rb
+++ b/spec/federation_callbacks_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "diaspora_federation/test"
 
 describe "diaspora federation callbacks" do
@@ -426,7 +428,6 @@ describe "diaspora federation callbacks" do
 
       expect(entity.guid).to eq(post.guid)
       expect(entity.author).to eq(alice.diaspora_handle)
-      expect(entity.public).to be_truthy
     end
 
     it "does not fetch a private post" do
diff --git a/spec/helper_methods.rb b/spec/helper_methods.rb
index 720f28058ebfe91a71e8d353ff7c43e503f09027..957f757d64663f203f02a933814ac2cd0afe74d8 100644
--- a/spec/helper_methods.rb
+++ b/spec/helper_methods.rb
@@ -1,4 +1,6 @@
 
+# frozen_string_literal: true
+
 require Rails.root.join("spec", "support", "inlined_jobs")
 
 module HelperMethods
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index c7564c5bed03c5c013a5e7c930be9bc739b55d22..569360e94373cb54e35bb6469614ea52d4cdbb1b 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/conversations_helper_spec.rb b/spec/helpers/conversations_helper_spec.rb
index 24768fe7a22df6dd873aa9606ac0bfdea53f2412..a1613bbaa378ee1d0d3adcf5bb1725f74712fb05 100644
--- a/spec/helpers/conversations_helper_spec.rb
+++ b/spec/helpers/conversations_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ConversationsHelper, :type => :helper do
   before do
     @conversation = FactoryGirl.create(:conversation)
diff --git a/spec/helpers/getting_started_helper_spec.rb b/spec/helpers/getting_started_helper_spec.rb
index 7b89fbe24d711559bc82836654b7b30152076cde..a2a8fe2fe4a59664fb4eadb9b99ad3f74264a6b7 100644
--- a/spec/helpers/getting_started_helper_spec.rb
+++ b/spec/helpers/getting_started_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/gon_helper_spec.rb b/spec/helpers/gon_helper_spec.rb
index e097122427c541772059c934f7816dc068087030..5b21b1d4402cb7ada1f3509e095f697678ea73cd 100644
--- a/spec/helpers/gon_helper_spec.rb
+++ b/spec/helpers/gon_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe GonHelper, type: :helper do
   include_context :gon
 
diff --git a/spec/helpers/interim_stream_hackiness_helper_spec.rb b/spec/helpers/interim_stream_hackiness_helper_spec.rb
index fe6b787b2c5cd90d85967042fc2ef6090b0a34ae..890e6e84243274c5e0de722c746a8a50060998f5 100644
--- a/spec/helpers/interim_stream_hackiness_helper_spec.rb
+++ b/spec/helpers/interim_stream_hackiness_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe InterimStreamHackinessHelper, type: :helper do
   describe "commenting_disabled?" do
     include Devise::Test::ControllerHelpers
diff --git a/spec/helpers/jsxc_helper_spec.rb b/spec/helpers/jsxc_helper_spec.rb
index 18bdb4daa56ed9de4bba570cb3997bd850759f6a..0d80218c2aff5ba41e0a4a58e12982cea14ae9d5 100644
--- a/spec/helpers/jsxc_helper_spec.rb
+++ b/spec/helpers/jsxc_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe JsxcHelper, :type => :helper do
   before do
     AppConfig.chat.server.bosh.port = 1234
diff --git a/spec/helpers/language_helper_spec.rb b/spec/helpers/language_helper_spec.rb
index 3b0e9431a42c54625408a9e97b640e81809ccfd4..5e4c1dce59bff523a3c355c3dcaa10fd4d2d318e 100644
--- a/spec/helpers/language_helper_spec.rb
+++ b/spec/helpers/language_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe LanguageHelper, type: :helper do
   describe "#get_javascript_strings_for" do
     it "generates a jasmine fixture", fixture: true do
diff --git a/spec/helpers/layout_helper_spec.rb b/spec/helpers/layout_helper_spec.rb
index 15379776975e49ad5c8e4a143a7dfa339a5ea11a..f3bdfa329be979fc90dd9faf41d6768645b3b211 100644
--- a/spec/helpers/layout_helper_spec.rb
+++ b/spec/helpers/layout_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/meta_data_helper_spec.rb b/spec/helpers/meta_data_helper_spec.rb
index 998d357212f0b20bd55dd1d9c62c666f5f1cca97..8e9feb5a69d1d59890e955dce4049afa3fd98df0 100644
--- a/spec/helpers/meta_data_helper_spec.rb
+++ b/spec/helpers/meta_data_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe MetaDataHelper, type: :helper do
   describe "#meta_tag" do
     it "returns an empty string if passed an empty hash" do
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
index 1aa84d6a93ba856ed7a58f058cf3dbe1179d5f26..356092b184be6338a7c743aff5c48cba3d846b33 100644
--- a/spec/helpers/notifications_helper_spec.rb
+++ b/spec/helpers/notifications_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NotificationsHelper, type: :helper do
   include ApplicationHelper
 
diff --git a/spec/helpers/notifier_helper_spec.rb b/spec/helpers/notifier_helper_spec.rb
index 654fcd6d49548ed83e820851a42d1ef9fa8cc157..5e24990018091d7163d7b455cfdf0ddfe069704e 100644
--- a/spec/helpers/notifier_helper_spec.rb
+++ b/spec/helpers/notifier_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/o_embed_helper_spec.rb b/spec/helpers/o_embed_helper_spec.rb
index c3675902698ba952a16a80163e8bce1408bc4ce4..17394acda050c7cfeb4ad5ec20f216094f3c51bd 100644
--- a/spec/helpers/o_embed_helper_spec.rb
+++ b/spec/helpers/o_embed_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe OEmbedHelper, :type => :helper do
   describe 'o_embed_html' do
     scenarios = {
diff --git a/spec/helpers/open_graph_helper_spec.rb b/spec/helpers/open_graph_helper_spec.rb
index 7962781e7bd50a1b002a239f351e27964bf8192c..c6b10188ad3c2403abbdc3adc3e52f6cdb920531 100644
--- a/spec/helpers/open_graph_helper_spec.rb
+++ b/spec/helpers/open_graph_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe OpenGraphHelper, :type => :helper do
 
   describe 'og_html' do
diff --git a/spec/helpers/people_helper_spec.rb b/spec/helpers/people_helper_spec.rb
index 866b56fd0fcd60e6c393cecd2eb78028bbe2f5c2..4b41409188fb35e6afe91f65279bb5d5daeb49b0 100644
--- a/spec/helpers/people_helper_spec.rb
+++ b/spec/helpers/people_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/posts_helper_spec.rb b/spec/helpers/posts_helper_spec.rb
index 1b5f1f1824660740c1492799aa6ae78a65e6cec6..90b73c2738c0795ef181c037b98e7a58b0d645de 100644
--- a/spec/helpers/posts_helper_spec.rb
+++ b/spec/helpers/posts_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/publisher_helper_spec.rb b/spec/helpers/publisher_helper_spec.rb
index e4a20368cad4b9dcc9720a8af07a15dc00472ea8..34dcad05152a00aab11fa772b56926dfc49950c1 100644
--- a/spec/helpers/publisher_helper_spec.rb
+++ b/spec/helpers/publisher_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PublisherHelper, type: :helper do
   describe "#public_selected?" do
     it "returns true when the selected_aspects contains 'public'" do
diff --git a/spec/helpers/report_helper_spec.rb b/spec/helpers/report_helper_spec.rb
index f044c03640e203c367efd77cef1c96f147ef7c49..60346dbc5ae97aa101acbead89a425e3c9857783 100644
--- a/spec/helpers/report_helper_spec.rb
+++ b/spec/helpers/report_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ReportHelper, type: :helper do
   before do
     @user = bob
diff --git a/spec/helpers/stream_helper_spec.rb b/spec/helpers/stream_helper_spec.rb
index 05d975321424a41350ef0a881a07ca54bfe7cc9c..dac0196cb7a2edbf9c975a66eb4cdbbccedf1e03 100644
--- a/spec/helpers/stream_helper_spec.rb
+++ b/spec/helpers/stream_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/helpers/tags_helper_spec.rb b/spec/helpers/tags_helper_spec.rb
index 7667ea1bf2acdf12dd61479673aa09ef2965e3fb..5880136f0286697b0ae493d220dd101de6c28964 100644
--- a/spec/helpers/tags_helper_spec.rb
+++ b/spec/helpers/tags_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe TagsHelper, :type => :helper do
   describe '#looking_for_tag_link' do
     it 'returns nil if there is a @ in the query' do
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index aa5a83a5f7b49025549249178b1ada42f447988c..4d00317b731e73f3274b8d88d1c4cb6d8ad8dc5e 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe UsersHelper, type: :helper do
   include Devise::Test::ControllerHelpers
 
diff --git a/spec/integration/account_deletion_spec.rb b/spec/integration/account_deletion_spec.rb
index b6cca15cfbd89daa9aa7595358b0b89bd50a95fa..d09b5d564b4c5c270d9a03a757893d7cbc3da1d3 100644
--- a/spec/integration/account_deletion_spec.rb
+++ b/spec/integration/account_deletion_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe "deleteing account", type: :request do
   def account_removal_method
     AccountDeleter.new(person).perform!
diff --git a/spec/integration/account_migration_spec.rb b/spec/integration/account_migration_spec.rb
index b7559259e677d7cf90ad812f442a97e2c87ce30d..35597edad654344b3c7998bfdbfa50bd7ed64984 100644
--- a/spec/integration/account_migration_spec.rb
+++ b/spec/integration/account_migration_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "integration/federation/federation_helper"
 
 def create_remote_contact(user, pod_host)
diff --git a/spec/integration/api/user_info_controller_spec.rb b/spec/integration/api/user_info_controller_spec.rb
index 2c692a1003a4b6a0174adb5f4b735cf4a2815d9d..334059d9c37b1eba6c998a75842850713fc884f2 100644
--- a/spec/integration/api/user_info_controller_spec.rb
+++ b/spec/integration/api/user_info_controller_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::UserInfoController do
   let!(:auth_with_read_and_ppid) { FactoryGirl.create(:auth_with_read_and_ppid) }
   let!(:access_token_with_read) { auth_with_read_and_ppid.create_access_token.to_s }
diff --git a/spec/integration/application_spec.rb b/spec/integration/application_spec.rb
index 2c4e78fd5425aa7eb6d4a50a4bd5493e7a0a1aef..7cba50af58ec37ad1aef9394d4301347b8bfa486 100644
--- a/spec/integration/application_spec.rb
+++ b/spec/integration/application_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ApplicationController, type: :request do
   describe "csrf token validation" do
     context "without a current user" do
diff --git a/spec/integration/contact_deleting_spec.rb b/spec/integration/contact_deleting_spec.rb
index a08ead841c699d492bf9f6e951a8610b0bf1ff27..cc9e860d3ea0bfe41050a5f8ae02a3e964626448 100644
--- a/spec/integration/contact_deleting_spec.rb
+++ b/spec/integration/contact_deleting_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/integration/contacts_spec.rb b/spec/integration/contacts_spec.rb
index 1af6ae508f5bc92ba4d829157380a77351c773b8..00436ccae5a99f1330b439c82705650b8fe684fc 100644
--- a/spec/integration/contacts_spec.rb
+++ b/spec/integration/contacts_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ContactsController, type: :request do
   describe "/contacts" do
     context "user is signed in" do
diff --git a/spec/integration/dispatching_spec.rb b/spec/integration/dispatching_spec.rb
index 58124de3ade695ad2e9dcac4d607a790546fa7b7..30ab378b9bee59c9d18609d225b52353f08934f5 100644
--- a/spec/integration/dispatching_spec.rb
+++ b/spec/integration/dispatching_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe "Dispatching", type: :request do
   context "a comment retraction on a public post" do
     it "triggers a public dispatch" do
diff --git a/spec/integration/export/memory_usage_spec.rb b/spec/integration/export/memory_usage_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9036796ee32ffa249155446ac2e0a2177fc9c8ff
--- /dev/null
+++ b/spec/integration/export/memory_usage_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+# Memory usage methods are from: https://gist.github.com/pvdb/6240788
+
+# returns detailed information about the process memory usage (as recorded in the "/proc/$$/statm" proc fs file)
+def Process.statm
+  Hash[%i[size resident shared trs lrs drs dt].zip(open("/proc/#{Process.pid}/statm").read.split)]
+end
+
+# the real memory (resident set) size of the process (in 1_024 byte units, assuming a 4kB memory page size)
+def Process.rss
+  Process.statm[:resident].to_i * 4
+end
+
+describe Diaspora::Exporter do
+  context "on big profiles", :performance do
+    before :all do
+      if Post.count < 1000
+        # Force fixture rebuild
+        FileUtils.rm_f(Rails.root.join("tmp", "fixture_builder.yml"))
+      end
+
+      FixtureBuilder.configure do |fbuilder|
+        # rebuild fixtures automatically when these files change:
+        fbuilder.files_to_check += Dir[
+          "app/models/*.rb", "lib/**/*.rb", "spec/factories/*.rb", "spec/support/fixture_builder.rb"
+        ] - ["lib/diaspora/exporter.rb"]
+
+        # now declare objects
+        fbuilder.factory do
+          create_basic_users
+
+          1000.times {
+            FactoryGirl.create(:signed_comment, post: bob.person.posts.first)
+            FactoryGirl.create(:status_message, author: bob.person)
+            FactoryGirl.create(:comment, author: bob.person)
+            FactoryGirl.create(:contact, user: bob)
+            FactoryGirl.create(:participation, author: bob.person)
+          }
+        end
+      end
+    end
+
+    it "doesn't exceed sensible memory usage limit" do
+      json = Diaspora::Exporter.new(bob).execute
+      expect(json).not_to be_empty
+      expect(Process.rss).to be < 500 * 1024
+      puts "Process resident set size: #{Process.rss}"
+    end
+  end
+end
diff --git a/spec/integration/exporter_spec.rb b/spec/integration/exporter_spec.rb
index 8cea5501af1c4173b44bafcf88b2600aac8dfd34..908a92532bd6c95cb47744275d16aaf0a7bcb0c0 100644
--- a/spec/integration/exporter_spec.rb
+++ b/spec/integration/exporter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -199,7 +201,7 @@ describe Diaspora::Exporter do
       expect(json).to include_json(user: {posts: [serialized]})
     end
 
-    it "contains a reshare and its root" do
+    it "contains a reshare" do
       reshare = FactoryGirl.create(:reshare, author: user.person)
       serialized_reshare = {
         "subscribed_pods_uris": [reshare.root.author.pod.url_to(""), AppConfig.pod_uri.to_s],
@@ -208,27 +210,13 @@ describe Diaspora::Exporter do
           "author":      user.diaspora_handle,
           "guid":        reshare.guid,
           "created_at":  reshare.created_at.iso8601,
-          "public":      true,
           "root_author": reshare.root_author.diaspora_handle,
           "root_guid":   reshare.root_guid
         }
       }
 
-      status_message = reshare.root
-      serialized_parent = {
-        "entity_type": "status_message",
-        "entity_data": {
-          "author":     status_message.diaspora_handle,
-          "guid":       status_message.guid,
-          "created_at": status_message.created_at.iso8601,
-          "text":       status_message.text,
-          "public":     true
-        }
-      }
-
       expect(json).to include_json(
-        user:        {posts: [serialized_reshare]},
-        others_data: {posts: [serialized_parent]}
+        user: {posts: [serialized_reshare]}
       )
     end
 
@@ -242,7 +230,7 @@ describe Diaspora::Exporter do
       expect(json).to include_json(user: {post_subscriptions: [subscription.target.guid]})
     end
 
-    it "contains a comment and the commented post" do
+    it "contains a comment" do
       comment = FactoryGirl.create(:comment, author: user.person)
       serialized_comment = {
         "entity_type":    "comment",
@@ -256,25 +244,12 @@ describe Diaspora::Exporter do
         "property_order": %w[author guid parent_guid text created_at]
       }
 
-      status_message = comment.parent
-      serialized_post = {
-        "entity_type": "status_message",
-        "entity_data": {
-          "author":     status_message.diaspora_handle,
-          "guid":       status_message.guid,
-          "created_at": status_message.created_at.iso8601,
-          "text":       status_message.text,
-          "public":     false
-        }
-      }
-
       expect(json).to include_json(
-        user:        {relayables: [serialized_comment]},
-        others_data: {posts: [serialized_post]}
+        user: {relayables: [serialized_comment]}
       )
     end
 
-    it "contains a like and the liked post" do
+    it "contains a like" do
       like = FactoryGirl.create(:like, author: user.person)
       serialized_like = {
         "entity_type":    "like",
@@ -288,25 +263,12 @@ describe Diaspora::Exporter do
         "property_order": %w[author guid parent_guid parent_type positive]
       }
 
-      status_message = like.target
-      serialized_post = {
-        "entity_type": "status_message",
-        "entity_data": {
-          "author":     status_message.diaspora_handle,
-          "guid":       status_message.guid,
-          "created_at": status_message.created_at.iso8601,
-          "text":       status_message.text,
-          "public":     false
-        }
-      }
-
       expect(json).to include_json(
-        user:        {relayables: [serialized_like]},
-        others_data: {posts: [serialized_post]}
+        user: {relayables: [serialized_like]}
       )
     end
 
-    it "contains a poll participation and post with this poll" do
+    it "contains a poll participation" do
       poll_participation = FactoryGirl.create(:poll_participation, author: user.person)
       serialized_participation = {
         "entity_type":    "poll_participation",
@@ -319,38 +281,8 @@ describe Diaspora::Exporter do
         "property_order": %w[author guid parent_guid poll_answer_guid]
       }
 
-      poll = poll_participation.poll
-      status_message = poll_participation.status_message
-      serialized_post = {
-        "entity_type": "status_message",
-        "entity_data": {
-          "author":     status_message.diaspora_handle,
-          "guid":       status_message.guid,
-          "created_at": status_message.created_at.iso8601,
-          "text":       status_message.text,
-          "poll":       {
-            "entity_type": "poll",
-            "entity_data": {
-              "guid":         poll.guid,
-              "question":     poll.question,
-              "poll_answers": poll.poll_answers.map {|answer|
-                {
-                  "entity_type": "poll_answer",
-                  "entity_data": {
-                    "guid":   answer.guid,
-                    "answer": answer.answer
-                  }
-                }
-              }
-            }
-          },
-          "public":     false
-        }
-      }
-
       expect(json).to include_json(
-        user:        {relayables: [serialized_participation]},
-        others_data: {posts: [serialized_post]}
+        user: {relayables: [serialized_participation]}
       )
     end
 
@@ -407,23 +339,6 @@ describe Diaspora::Exporter do
       expect(json).to include_json(others_data: {relayables: [serialized]})
     end
 
-    it "contains metadata of a non-contact author of a post where we commented" do
-      comment = FactoryGirl.create(:comment, author: user.person)
-
-      author = comment.parent.author
-      expect(json).to include_json(
-        others_data: {
-          non_contact_authors: [
-            {
-              "guid":       author.guid,
-              "account_id": author.diaspora_handle,
-              "public_key": author.serialized_public_key
-            }
-          ]
-        }
-      )
-    end
-
     def transform_value(value)
       return value.iso8601 if value.is_a? Date
       value
diff --git a/spec/integration/federation/attack_vectors_spec.rb b/spec/integration/federation/attack_vectors_spec.rb
index b88d4883cde25d1719df715431b4bcb716513658..4810c8203b80c61d2d3f04392a5af6751673ac85 100644
--- a/spec/integration/federation/attack_vectors_spec.rb
+++ b/spec/integration/federation/attack_vectors_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/integration/federation/federation_helper.rb b/spec/integration/federation/federation_helper.rb
index f2da9812b7a405877d8f7e58569dbc5efc5a96ae..311fd85df5b7af0a676bbc265557f6933d61423c 100644
--- a/spec/integration/federation/federation_helper.rb
+++ b/spec/integration/federation/federation_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 def remote_user_on_pod_b
   @remote_on_b ||= create_remote_user("remote-b.net")
 end
diff --git a/spec/integration/federation/receive_federation_messages_spec.rb b/spec/integration/federation/receive_federation_messages_spec.rb
index 8ddb917ccee434d8892913d73e74e33b0382ebe8..c9a67aeb4972ff37433cbd194c16b8b9b599f05b 100644
--- a/spec/integration/federation/receive_federation_messages_spec.rb
+++ b/spec/integration/federation/receive_federation_messages_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "integration/federation/federation_helper"
 require "integration/federation/shared_receive_relayable"
 require "integration/federation/shared_receive_retraction"
@@ -56,11 +58,12 @@ describe "Receive federation messages feature" do
           expect(AccountMigration.find_by(old_person: sender.person, new_person: new_user.person)).to be_performed
         end
 
-        it "doesn't accept the same migration for the second time" do
+        it "doesn't run the same migration for the second time" do
           run_migration
-          expect {
-            run_migration
-          }.to raise_error(ActiveRecord::RecordInvalid)
+          expect_any_instance_of(AccountMigration).not_to receive(:perform!)
+          run_migration
+          expect(AccountMigration.where(old_person: sender.person, new_person: new_user.person).count).to eq(1)
+          expect(AccountMigration.find_by(old_person: sender.person, new_person: new_user.person)).to be_performed
         end
 
         it "doesn't accept second migration for the same sender" do
diff --git a/spec/integration/federation/shared_receive_relayable.rb b/spec/integration/federation/shared_receive_relayable.rb
index 2d0e150ba349d2a06c0f5f7267f5d04a269fb52e..5ceb78ef2df86710018365133cd8d12559f4b7a2 100644
--- a/spec/integration/federation/shared_receive_relayable.rb
+++ b/spec/integration/federation/shared_receive_relayable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "it deals correctly with a relayable" do
   context "local" do
     let(:entity) { create_relayable_entity(entity_name, local_parent, sender_id) }
@@ -36,7 +38,7 @@ shared_examples_for "it deals correctly with a relayable" do
     end
 
     # Checks when a remote pod B wants to send us a relayable with authorship from a remote pod C user
-    # without having correct signature from him.
+    # without having a correct signature for them.
     it "rejects a downstream entity with a malformed author signature" do
       expect(Workers::ReceiveLocal).not_to receive(:perform_async)
       allow(remote_user_on_pod_c).to receive(:encryption_key).and_return(OpenSSL::PKey::RSA.new(1024))
diff --git a/spec/integration/federation/shared_receive_retraction.rb b/spec/integration/federation/shared_receive_retraction.rb
index adc8112c09c6daa112229357eca645c52e733771..c7ef41c5352612924a524300ed2e94055664b9bc 100644
--- a/spec/integration/federation/shared_receive_retraction.rb
+++ b/spec/integration/federation/shared_receive_retraction.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 def retraction_entity(target_object, sender)
   Fabricate(
     :retraction_entity,
diff --git a/spec/integration/federation/shared_receive_stream_items.rb b/spec/integration/federation/shared_receive_stream_items.rb
index 86cb4125b1fbc9386dbc5f946b3492a2bdfa3488..347848e356f8469872adb5ebc435a4067322531d 100644
--- a/spec/integration/federation/shared_receive_stream_items.rb
+++ b/spec/integration/federation/shared_receive_stream_items.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # by "stream items" we mean everything that could appear in the stream - post, comment, like, poll, etc and therefore
 # could be send either publicly or privately
 shared_examples_for "messages which are indifferent about sharing fact" do
diff --git a/spec/integration/mentioning_spec.rb b/spec/integration/mentioning_spec.rb
index 41a231d3e923516654110e7e88cb76b3e0532844..7e3006912c49b4e19be6de39a97c50bbcf4adf22 100644
--- a/spec/integration/mentioning_spec.rb
+++ b/spec/integration/mentioning_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module MentioningSpecHelpers
   def notifications_about_mentioning(user, object)
     table = object.class.table_name
diff --git a/spec/integration/mobile_posts_spec.rb b/spec/integration/mobile_posts_spec.rb
index 1b5e53509e32be108c580e22de38572f4cd593c2..f12f9cf071cf617815b85b132afdeb5f640eec92 100644
--- a/spec/integration/mobile_posts_spec.rb
+++ b/spec/integration/mobile_posts_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PostsController, type: :request do
   context "with a poll" do
     let(:sm) { FactoryGirl.build(:status_message_with_poll, public: true) }
diff --git a/spec/integration/profile_spec.rb b/spec/integration/profile_spec.rb
index 36be045d63a75d638d5dfc9ed1a8d6767ddbe8a0..25cd0e7f4eaf4ab9723115bae278eda396d32e26 100644
--- a/spec/integration/profile_spec.rb
+++ b/spec/integration/profile_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PeopleController, type: :request do
   context "for the current user" do
     before do
@@ -10,7 +12,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we are signed in
       expect(response.body).not_to match(/a class="login"/)
-      expect(response.body).to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
 
     it "displays the publisher for people path" do
@@ -19,7 +21,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we are signed in
       expect(response.body).not_to match(/a class="login"/)
-      expect(response.body).to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
 
     it "doesn't display the publisher for people photos path" do
@@ -28,7 +30,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we are signed in
       expect(response.body).not_to match(/a class="login"/)
-      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
   end
 
@@ -43,7 +45,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we are signed in
       expect(response.body).not_to match(/a class="login"/)
-      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
 
     it "doesn't display the publisher for people path" do
@@ -52,7 +54,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we are signed in
       expect(response.body).not_to match(/a class="login"/)
-      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
   end
 
@@ -63,7 +65,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we aren't signed in
       expect(response.body).to match(/a class="login"/)
-      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
 
     it "doesn't display the publisher for people path" do
@@ -72,7 +74,7 @@ describe PeopleController, type: :request do
       expect(response.status).to eq(200)
       # make sure we aren't signed in
       expect(response.body).to match(/a class="login"/)
-      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher_textarea_wrapper'/)
+      expect(response.body).not_to match(/div class='publisher-textarea-wrapper' id='publisher-textarea-wrapper'/)
     end
   end
 end
diff --git a/spec/integration/receiving_spec.rb b/spec/integration/receiving_spec.rb
index faa8ffb20f0ecc084dc76ef569a306003ae3dd3e..e7a44cfbc4ee3de239e7168887a47b63479326df 100644
--- a/spec/integration/receiving_spec.rb
+++ b/spec/integration/receiving_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/integration/tag_people_spec.rb b/spec/integration/tag_people_spec.rb
index 22b07d8519c81cb4d60ed77a07285fda67e211c6..ea8174e05691be6c788e6b2b5d72f8b73f6c3ac6 100644
--- a/spec/integration/tag_people_spec.rb
+++ b/spec/integration/tag_people_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe TagsController, type: :request do
   describe 'will_paginate people on the tag page' do
     let(:people) { (1..2).map { FactoryGirl.create(:person) } }
diff --git a/spec/javascripts/app/pages/contacts_spec.js b/spec/javascripts/app/pages/contacts_spec.js
index a1be4be48b01f2046d8f3b0436e897a73064c081..fa9f001d2f1c421e91615bfdfe34df73056189f2 100644
--- a/spec/javascripts/app/pages/contacts_spec.js
+++ b/spec/javascripts/app/pages/contacts_spec.js
@@ -290,17 +290,15 @@ describe("app.pages.Contacts", function(){
     });
 
     it("initializes app.views.ConversationsForm with correct parameters when modal is loaded", function() {
-      gon.conversationPrefill = [
-        {id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"},
-        {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
-        {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
-      ];
-
       spyOn(app.views.ConversationsForm.prototype, "initialize");
+      app.aspect = new app.models.Aspect(app.contacts.first().get("aspect_memberships")[0].aspect);
       this.view.showMessageModal();
       $("#conversationModal").trigger("modal:loaded");
-      expect(app.views.ConversationsForm.prototype.initialize)
-        .toHaveBeenCalledWith({prefill: gon.conversationPrefill});
+      expect(app.views.ConversationsForm.prototype.initialize).toHaveBeenCalled();
+
+      var prefill = app.views.ConversationsForm.prototype.initialize.calls.mostRecent().args[0].prefill;
+      var contacts = app.contacts.filter(function(contact) { return contact.inAspect(app.aspect.get("id")); });
+      expect(_.pluck(prefill, "id")).toEqual(contacts.map(function(contact) { return contact.person.id; }));
     });
   });
 });
diff --git a/spec/javascripts/app/views/aspects_dropdown_view_spec.js b/spec/javascripts/app/views/aspects_dropdown_view_spec.js
index 004706b1dfb33cc1eb4afd50291c68217d9e664a..77f0a75a090e21609632ab0a7b7a44c12885ab32 100644
--- a/spec/javascripts/app/views/aspects_dropdown_view_spec.js
+++ b/spec/javascripts/app/views/aspects_dropdown_view_spec.js
@@ -1,7 +1,7 @@
 describe("app.views.AspectsDropdown", function(){
   beforeEach(function() {
     spec.loadFixture("bookmarklet");
-    this.view = new app.views.AspectsDropdown({el: $('.aspect_dropdown')});
+    this.view = new app.views.AspectsDropdown({el: $('.aspect-dropdown')});
   });
 
   context('_toggleCheckbox', function() {
diff --git a/spec/javascripts/app/views/comment_stream_view_spec.js b/spec/javascripts/app/views/comment_stream_view_spec.js
index 284b16c7ab2dc13748d94280eeb0ceb8fe79ff2a..88842a11c55e2fe6583b8ebfbd437a1d6033b9b3 100644
--- a/spec/javascripts/app/views/comment_stream_view_spec.js
+++ b/spec/javascripts/app/views/comment_stream_view_spec.js
@@ -51,7 +51,7 @@ describe("app.views.CommentStream", function(){
       this.view.commentBox = undefined;
       this.view.postRenderTemplate();
       expect(this.view.commentBox).toBeDefined();
-      expect(this.view.commentBox).toEqual(this.view.$(".comment_box"));
+      expect(this.view.commentBox).toEqual(this.view.$(".comment-box"));
     });
 
     it("sets commentSubmitButton", function() {
@@ -92,6 +92,12 @@ describe("app.views.CommentStream", function(){
       expect(renderedPreview).toBe("<div class='preview-content'>" + renderedText + "</div>");
       expect(renderedPreview).toContain("Alice Awesome");
     });
+
+    it("calls jQuery.AreYouSure()", function() {
+      spyOn($.fn, "areYouSure");
+      this.view.postRenderTemplate();
+      expect($.fn.areYouSure).toHaveBeenCalled();
+    });
   });
 
   describe("createComment", function() {
@@ -118,7 +124,7 @@ describe("app.views.CommentStream", function(){
 
     context("submission", function() {
       beforeEach(function() {
-        this.view.$(".comment_box").val('a new comment');
+        this.view.$(".comment-box").val('a new comment');
         this.view.createComment();
 
         this.request = jasmine.Ajax.requests.mostRecent();
diff --git a/spec/javascripts/app/views/conversations_form_view_spec.js b/spec/javascripts/app/views/conversations_form_view_spec.js
index b0d06535094c8a350affa3a844d5f7f35eca066b..419af34c534b70cf91a611b092af29fd334edfeb 100644
--- a/spec/javascripts/app/views/conversations_form_view_spec.js
+++ b/spec/javascripts/app/views/conversations_form_view_spec.js
@@ -85,7 +85,11 @@ describe("app.views.ConversationsForm", function() {
 
   describe("prefill", function() {
     beforeEach(function() {
-      this.prefills = [{name: "diaspora user"}, {name: "other diaspora user"}, {name: "user"}];
+      this.prefills = [
+        factory.personWithProfile({"diaspora_id": "alice@pod.tld"}),
+        factory.personWithProfile({"diaspora_id": "bob@pod.tld"}),
+        factory.personWithProfile({"diaspora_id": "carol@pod.tld"})
+      ];
     });
 
     it("calls addRecipient for each prefilled participant", function() {
@@ -95,7 +99,14 @@ describe("app.views.ConversationsForm", function() {
       var allArgsFlattened = app.views.ConversationsForm.prototype.addRecipient.calls.allArgs().map(function(arg) {
         return arg[0];
       });
-      expect(allArgsFlattened).toEqual(this.prefills);
+
+      expect(_.pluck(allArgsFlattened, "handle")).toEqual(
+        this.prefills.map(function(person) { return person.get("diaspora_id"); })
+      );
+
+      expect(_.pluck(allArgsFlattened, "avatar")).toEqual(
+        this.prefills.map(function(person) { return person.get("profile").avatar.small; })
+      );
     });
   });
 
diff --git a/spec/javascripts/app/views/poll_view_spec.js b/spec/javascripts/app/views/poll_view_spec.js
index 93d68533299cfdfa091c308c0e16d2ff17390ed4..03aa2aee784bf7481070046378600385552d645f 100644
--- a/spec/javascripts/app/views/poll_view_spec.js
+++ b/spec/javascripts/app/views/poll_view_spec.js
@@ -8,16 +8,16 @@ describe("app.views.Poll", function(){
   describe("setProgressBar", function(){
     it("sets the progress bar according to the voting result", function(){
       var percentage = (this.view.poll.poll_answers[0].vote_count / this.view.poll.participation_count)*100;
-      expect(this.view.$('.poll_progress_bar:first').css('width')).toBe(percentage+"%");
+      expect(this.view.$(".progress-bar:first").css("width")).toBe(percentage + "%");
       expect(this.view.$(".percentage:first").text()).toBe(percentage + "%");
     });
   });
 
   describe("toggleResult", function(){
     it("toggles the progress bar and result", function(){
-      expect($(".poll_progress_bar_wrapper:first")).toBeHidden();
+      expect($(".progress:first")).toBeHidden();
       this.view.toggleResult();
-      expect($(".poll_progress_bar_wrapper:first")).toBeVisible();
+      expect($(".progress:first")).toBeVisible();
     });
   });
 
@@ -39,7 +39,7 @@ describe("app.views.Poll", function(){
       var question = "<script>alert(0);</script>";
       this.view.poll.question = question;
       this.view.render();
-      expect(this.view.$('.poll_head strong').text()).toBe(question);
+      expect(this.view.$(".poll-head strong").text()).toBe(question);
     });
   });
 
@@ -65,7 +65,7 @@ describe("app.views.Poll", function(){
       expect(this.view.$('form').length).toBe(1);
     });
     it("hides vote form when user voted before", function(){
-      this.view.model.attributes.already_participated_in_poll = true;
+      this.view.model.set("poll_participation_answer_id", this.view.poll.poll_answers[0].id);
       this.view.render();
       expect(this.view.$('form').length).toBe(0);
     });
@@ -75,4 +75,25 @@ describe("app.views.Poll", function(){
       expect(this.view.$('form').length).toBe(0);
     });
   });
+
+  describe("answer given", function() {
+    it("adds 'users-vote' class to progress bar for the option the user voted for", function() {
+      var answer = this.view.poll.poll_answers[0];
+      this.view.model.set("poll_participation_answer_id", answer.id);
+      expect(this.view.$(".progress-bar.users-vote").length).toBe(1);
+    });
+
+    it("doesn't add 'users-vote' class to progress bar of the options the user didn't vote for", function() {
+      var answer1 = this.view.poll.poll_answers[0];
+      var answer2 = this.view.poll.poll_answers[1];
+      this.view.model.set("poll_participation_answer_id", answer1.id);
+      expect(this.view.$(".progress-bar[data-answerid='" + answer2.id + "']").hasClass("users-vote")).toBe(false);
+    });
+
+    it("adds label next to the answer the user voted for", function() {
+      var answer = this.view.poll.poll_answers[0];
+      this.view.model.set("poll_participation_answer_id", answer.id);
+      expect(this.view.$(".label.label-primary").length).toBe(1);
+    });
+  });
 });
diff --git a/spec/javascripts/app/views/profile_header_view_spec.js b/spec/javascripts/app/views/profile_header_view_spec.js
index 999d56cd6a24f3bc68614ccae279eb18a92862b8..3b5d086a95e0a48f8785bec377552402a2a349fe 100644
--- a/spec/javascripts/app/views/profile_header_view_spec.js
+++ b/spec/javascripts/app/views/profile_header_view_spec.js
@@ -4,8 +4,11 @@ describe("app.views.ProfileHeader", function() {
     this.model = factory.personWithProfile({
       diaspora_id: "my@pod",
       name: "User Name",
-      relationship: 'mutual',
-      profile: { tags: ['test'] }
+      relationship: "mutual",
+      profile: {
+        avatar: {small: "http://example.org/avatar.jpg"},
+        tags: ["test"]
+      }
     });
     this.view = new app.views.ProfileHeader({model: this.model});
     loginAs(factory.userAttrs());
@@ -71,17 +74,12 @@ describe("app.views.ProfileHeader", function() {
     });
 
     it("initializes app.views.ConversationsForm with correct parameters when modal is loaded", function() {
-      gon.conversationPrefill = [
-        {id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"},
-        {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
-        {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
-      ];
-
       spyOn(app.views.ConversationsForm.prototype, "initialize");
       spyOn($.fn, "load").and.callFake(function(url, callback) { callback(); });
       this.view.showMessageModal();
-      expect(app.views.ConversationsForm.prototype.initialize)
-        .toHaveBeenCalledWith({prefill: gon.conversationPrefill});
+      expect(app.views.ConversationsForm.prototype.initialize).toHaveBeenCalledWith({
+        prefill: [this.model]
+      });
     });
   });
 });
diff --git a/spec/javascripts/app/views/publisher_view_spec.js b/spec/javascripts/app/views/publisher_view_spec.js
index 1a8b4a3bf827f5ef497d76b20bc7d4785e564edc..a43d12a76861669a0bdc5c51daf3b3c7e6e7484c 100644
--- a/spec/javascripts/app/views/publisher_view_spec.js
+++ b/spec/javascripts/app/views/publisher_view_spec.js
@@ -112,7 +112,7 @@ describe("app.views.Publisher", function() {
         expect("#publisher").not.toHaveClass("closed");
         $("#publisher").find(".publisher-textarea-wrapper").click();
         expect("#publisher").not.toHaveClass("closed");
-        $("#publisher").find(".aspect_dropdown button").click();
+        $("#publisher").find(".aspect-dropdown button").click();
         expect("#publisher").not.toHaveClass("closed");
       });
 
@@ -121,10 +121,10 @@ describe("app.views.Publisher", function() {
         // that take the whole page when it detects a mobile.
         // Clicking on this element should not close the publisher.
         // See https://github.com/diaspora/diaspora/issues/6979.
-        $("#publisher").find(".aspect_dropdown").append("<div class='dropdown-backdrop'></div>")
+        $("#publisher").find(".aspect-dropdown").append("<div class='dropdown-backdrop'></div>")
           .css({position: "fixed", left: 0, right: 0, bottom: 0, top: 0, "z-index": 990});
         expect("#publisher").not.toHaveClass("closed");
-        $("#publisher").find(".aspect_dropdown button").click();
+        $("#publisher").find(".aspect-dropdown button").click();
         expect("#publisher").not.toHaveClass("closed");
         $("#publisher").find(".dropdown-backdrop").click();
         expect("#publisher").not.toHaveClass("closed");
@@ -403,13 +403,13 @@ describe("app.views.Publisher", function() {
 
     describe("toggles the selected entry visually", function(){
       it("click on the first aspect", function(){
-        this.view.$(".aspect_dropdown li.aspect_selector:first").click();
+        this.view.$(".aspect-dropdown li.aspect_selector:first").click();
         expect($("#publisher #visibility-icon")).not.toHaveClass("entypo-globe");
         expect($("#publisher #visibility-icon")).toHaveClass("entypo-lock");
       });
 
       it("click on public", function(){
-        this.view.$(".aspect_dropdown li.public").click();
+        this.view.$(".aspect-dropdown li.public").click();
         expect($("#publisher #visibility-icon")).toHaveClass("entypo-globe");
         expect($("#publisher #visibility-icon")).not.toHaveClass("entypo-lock");
       });
@@ -430,7 +430,7 @@ describe("app.views.Publisher", function() {
         expect(selected.length).toBe(1);
         expect(selected.first().val()).toBe('all_aspects');
 
-        var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+        var evt = $.Event("click", { target: $('.aspect-dropdown li.aspect_selector:last') });
         this.view.viewAspectSelector.toggleAspect(evt);
 
         selected = $('input[name="aspect_ids[]"]');
@@ -441,20 +441,20 @@ describe("app.views.Publisher", function() {
       it("toggles the same item", function() {
         expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
 
-        var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+        var evt = $.Event("click", { target: $('.aspect-dropdown li.aspect_selector:last') });
         this.view.viewAspectSelector.toggleAspect(evt);
         expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
 
-        evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+        evt = $.Event("click", { target: $('.aspect-dropdown li.aspect_selector:last') });
         this.view.viewAspectSelector.toggleAspect(evt);
         expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
       });
 
       it("keeps other fields with different values", function() {
         $('.dropdown-menu').append('<li data-aspect_id="99" class="aspect_selector" />');
-        var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:eq(-2)') });
+        var evt = $.Event("click", { target: $('.aspect-dropdown li.aspect_selector:eq(-2)') });
         this.view.viewAspectSelector.toggleAspect(evt);
-        evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:eq(-1)') });
+        evt = $.Event("click", { target: $('.aspect-dropdown li.aspect_selector:eq(-1)') });
         this.view.viewAspectSelector.toggleAspect(evt);
 
         expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
@@ -519,7 +519,7 @@ describe("app.views.Publisher", function() {
       setFixtures(
         '<div id="publisher">'+
         '  <div class="content_creation"><form>'+
-        '    <div id="publisher_textarea_wrapper"></div>'+
+        '    <div id="publisher-textarea-wrapper"></div>'+
         '    <div id="photodropzone"></div>'+
         '    <input type="submit" />'+
         '  </form></div>'+
diff --git a/spec/javascripts/jasmine_helpers/factory.js b/spec/javascripts/jasmine_helpers/factory.js
index ba97e5b7151139ca3a1034f4b9c81cac32e2debb..9b0d4ecfc5c0c38b5e817953b3b61429a4f89f38 100644
--- a/spec/javascripts/jasmine_helpers/factory.js
+++ b/spec/javascripts/jasmine_helpers/factory.js
@@ -138,9 +138,11 @@ var factory = {
       "full_name": "bob grimm",
       "gender": "robot",
       "id": id,
-      "image_url": "http://localhost:3000/assets/user/default.png",
-      "image_url_medium": "http://localhost:3000/assets/user/default.png",
-      "image_url_small": "http://localhost:3000/assets/user/default.png",
+      "avatar": {
+        "small": "http://localhost:3000/assets/user/default.png",
+        "medium": "http://localhost:3000/assets/user/default.png",
+        "large": "http://localhost:3000/assets/user/default.png"
+      },
       "last_name": "Grimm",
       "location": "Earth",
       "nsfw": false,
@@ -211,9 +213,9 @@ var factory = {
   },
 
   postWithPoll :  function(overrides) {
-    var defaultAttrs = _.extend(factory.postAttrs(),  {"author" : this.author()});
-    defaultAttrs = _.extend(defaultAttrs,  {"already_participated_in_poll" : false});
-    defaultAttrs = _.extend(defaultAttrs,  {"poll" : factory.poll()});
+    var defaultAttrs = _.extend(factory.postAttrs(), {"author": this.author()});
+    defaultAttrs = _.extend(defaultAttrs, {"poll_participation_answer_id": null});
+    defaultAttrs = _.extend(defaultAttrs, {"poll": factory.poll()});
     return new app.models.Post(_.extend(defaultAttrs, overrides));
   },
 
diff --git a/spec/javascripts/support/jasmine_runner.rb b/spec/javascripts/support/jasmine_runner.rb
index 2add1b9f9a2d6547ee7cba763657a5a9a2bfacbb..bb049f9d11b23e3a7f50d6410f1155daf79e8496 100644
--- a/spec/javascripts/support/jasmine_runner.rb
+++ b/spec/javascripts/support/jasmine_runner.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
 
 ENV["JASMINE_BROWSER"] = "firefox"
diff --git a/spec/lib/account_deleter_spec.rb b/spec/lib/account_deleter_spec.rb
index 01552e3abe0aaaf903d52d92f71d0555a7a3796f..7a3a7faf6675c5ce97a1699799ceaec8350a3dec 100644
--- a/spec/lib/account_deleter_spec.rb
+++ b/spec/lib/account_deleter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -18,7 +20,6 @@ describe AccountDeleter do
       delete_contacts_of_me
       delete_standard_person_associations
       tombstone_person_and_profile
-      remove_conversation_visibilities
     ]
 
     context "user deletion" do
@@ -94,8 +95,12 @@ describe AccountDeleter do
     it 'removes all standard user associaltions' do
       @account_deletion.normal_ar_user_associates_to_delete.each do |asso|
         association_double = double
-        expect(association_double).to receive(:destroy)
-        expect(bob).to receive(asso).and_return([association_double])
+        expect(association_double).to receive(:ids).and_return([42])
+        expect(bob).to receive(asso).and_return(association_double)
+        batch_double = double
+        expect(User.reflect_on_association(asso).class_name.constantize).to receive(:where)
+          .with(id: [42]).and_return(batch_double)
+        expect(batch_double).to receive(:destroy_all)
       end
 
       @account_deletion.delete_standard_user_associations
@@ -109,8 +114,12 @@ describe AccountDeleter do
     it 'removes all standard person associaltions' do
       @account_deletion.normal_ar_person_associates_to_delete.each do |asso|
         association_double = double
-        expect(association_double).to receive(:destroy_all)
+        expect(association_double).to receive(:ids).and_return([42])
         expect(bob.person).to receive(asso).and_return(association_double)
+        batch_double = double
+        expect(Person.reflect_on_association(asso).class_name.constantize).to receive(:where)
+          .with(id: [42]).and_return(batch_double)
+        expect(batch_double).to receive(:destroy_all)
       end
 
       @account_deletion.delete_standard_person_associations
@@ -131,7 +140,7 @@ describe AccountDeleter do
       it 'deletes all the local contact objects where deleted account is the person' do
         contacts = double
         expect(Contact).to receive(:all_contacts_of_person).with(bob.person).and_return(contacts)
-        expect(contacts).to receive(:destroy_all)
+        expect(contacts).to receive(:find_each).with(batch_size: 20)
         @account_deletion.delete_contacts_of_me
       end
     end
@@ -147,21 +156,13 @@ describe AccountDeleter do
         @account_deletion.tombstone_person_and_profile
       end
     end
-     describe "#remove_conversation_visibilities" do
-      it "removes the conversation visibility for the deleted user" do
-        vis = double
-        expect(ConversationVisibility).to receive(:where).with(hash_including(:person_id => bob.person.id)).and_return(vis)
-        expect(vis).to receive(:destroy_all)
-        @account_deletion.remove_conversation_visibilities
-      end
-    end
   end
 
   describe "#remove_share_visibilities_by_contacts_of_user" do
     it "removes the share visibilities for a user" do
       s_vis = double
       expect(ShareVisibility).to receive(:for_a_user).with(bob).and_return(s_vis)
-      expect(s_vis).to receive(:destroy_all)
+      expect(s_vis).to receive(:find_each).with(batch_size: 20)
 
       @account_deletion.remove_share_visibilities_on_contacts_posts
     end
@@ -174,14 +175,20 @@ describe AccountDeleter do
     end
   end
 
-  it 'has all user association keys accounted for' do
-    all_keys = (@account_deletion.normal_ar_user_associates_to_delete + @account_deletion.special_ar_user_associations + @account_deletion.ignored_ar_user_associations)
-    expect(all_keys.sort{|x, y| x.to_s <=> y.to_s}).to eq(User.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}.map(&:to_sym))
+  it "has all user association keys accounted for" do
+    special_ar_user_associations = %i[person profile contacts auto_follow_back_aspect]
+    ignored_ar_user_associations = %i[followed_tags invited_by invited_users contact_people aspect_memberships
+                                      ignored_people share_visibilities conversation_visibilities conversations reports]
+    all_keys = @account_deletion.normal_ar_user_associates_to_delete +
+      special_ar_user_associations + ignored_ar_user_associations
+    expect(all_keys.sort_by(&:to_s)).to eq(User.reflections.keys.sort_by(&:to_s).map(&:to_sym))
   end
 
-  it 'has all person association keys accounted for' do
-    all_keys = (@account_deletion.normal_ar_person_associates_to_delete + @account_deletion.ignored_or_special_ar_person_associations)
-    expect(all_keys.sort{|x, y| x.to_s <=> y.to_s}).to eq(Person.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}.map(&:to_sym))
+  it "has all person association keys accounted for" do
+    ignored_or_special_ar_person_associations = %i[comments likes poll_participations contacts notification_actors
+                                                   notifications owner profile pod conversations messages]
+    all_keys = @account_deletion.normal_ar_person_associates_to_delete + ignored_or_special_ar_person_associations
+    expect(all_keys.sort_by(&:to_s)).to eq(Person.reflections.keys.sort_by(&:to_s).map(&:to_sym))
   end
 end
 
diff --git a/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb b/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
index fc2f4cb11c5c26cbaaf4ba66989bbbea1ace164e..a77da83a0de072434c4032213b1150ca9ea34fc9 100644
--- a/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
+++ b/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::ProtectedResourceEndpoint, type: :request do
   let(:auth_with_read) { FactoryGirl.create(:auth_with_read) }
   let!(:access_token_with_read) { auth_with_read.create_access_token.to_s }
diff --git a/spec/lib/api/openid_connect/token_endpoint_spec.rb b/spec/lib/api/openid_connect/token_endpoint_spec.rb
index 440d8132a5323ca3080de0cf157850d5501a0528..c27770f33117c9c13355972ab042902a84640e01 100644
--- a/spec/lib/api/openid_connect/token_endpoint_spec.rb
+++ b/spec/lib/api/openid_connect/token_endpoint_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::TokenEndpoint, type: :request do
   let!(:client) { FactoryGirl.create(:o_auth_application_with_ppid) }
   let!(:auth) {
diff --git a/spec/lib/configuration_methods_spec.rb b/spec/lib/configuration_methods_spec.rb
index 76fb4a9ab0a5e14a3385052b3def9b12bf6b4791..eeb963185dab26a4e4432ed38b03f47aae2c2660 100644
--- a/spec/lib/configuration_methods_spec.rb
+++ b/spec/lib/configuration_methods_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Configuration::Methods do
   before(:all) do
     @settings = Configurate::Settings.create do
diff --git a/spec/lib/connection_tester_spec.rb b/spec/lib/connection_tester_spec.rb
index 6f2fcaaf58cbd9673b25c3488f31dab1ce0bcd59..01acd20f4d3b3f1a870ef5e6749f396db645392a 100644
--- a/spec/lib/connection_tester_spec.rb
+++ b/spec/lib/connection_tester_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ConnectionTester do
   let(:url) { "https://pod.example.com" }
   let(:result) { ConnectionTester::Result.new }
diff --git a/spec/lib/diaspora/camo_spec.rb b/spec/lib/diaspora/camo_spec.rb
index 6c72fce089eaff70e78be89b213bf6c77ae22db7..161c1640d471fa024bf852e6ccfd4b3fc6485882 100644
--- a/spec/lib/diaspora/camo_spec.rb
+++ b/spec/lib/diaspora/camo_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/diaspora/exporter/non_contact_authors_spec.rb b/spec/lib/diaspora/exporter/non_contact_authors_spec.rb
deleted file mode 100644
index cac8c3ca047969558b374b1d79f07a17863746d3..0000000000000000000000000000000000000000
--- a/spec/lib/diaspora/exporter/non_contact_authors_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-describe Diaspora::Exporter::NonContactAuthors do
-  describe "#query" do
-    let(:user) { FactoryGirl.create(:user_with_aspect) }
-    let(:post) { FactoryGirl.create(:status_message) }
-    let(:instance) {
-      Diaspora::Exporter::NonContactAuthors.new(Post.where(id: post.id), user)
-    }
-
-    context "without contact relationship" do
-      it "includes post author to the result set" do
-        expect(instance.query).to eq([post.author])
-      end
-    end
-
-    context "with contact relationship" do
-      before do
-        user.share_with(post.author, user.aspects.first)
-      end
-
-      it "doesn't include post author to the result set" do
-        expect(instance.query).to be_empty
-      end
-    end
-  end
-end
diff --git a/spec/lib/diaspora/exporter/others_relayables_spec.rb b/spec/lib/diaspora/exporter/others_relayables_spec.rb
index 95595739faee0bfa4d176eb57af27cbb24a75c9b..5f1bc7f4c0d8e578540d0dde54367195f7bbebc6 100644
--- a/spec/lib/diaspora/exporter/others_relayables_spec.rb
+++ b/spec/lib/diaspora/exporter/others_relayables_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Exporter::OthersRelayables do
   let(:status_message) { FactoryGirl.create(:status_message) }
   let(:person) { status_message.author }
diff --git a/spec/lib/diaspora/exporter/posts_with_activity_spec.rb b/spec/lib/diaspora/exporter/posts_with_activity_spec.rb
deleted file mode 100644
index 4dc27495c84163c1c376204924b141b11a67902d..0000000000000000000000000000000000000000
--- a/spec/lib/diaspora/exporter/posts_with_activity_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-describe Diaspora::Exporter::PostsWithActivity do
-  let(:user) { FactoryGirl.create(:user) }
-  let(:instance) { Diaspora::Exporter::PostsWithActivity.new(user) }
-
-  describe "#query" do
-    let(:activity) {
-      [
-        user.person.likes.first.target,
-        user.person.comments.first.parent,
-        user.person.poll_participations.first.parent.status_message,
-        user.person.participations.first.target,
-        user.person.posts.reshares.first.root
-      ]
-    }
-
-    before do
-      DataGenerator.create(user, %i[activity participation])
-    end
-
-    it "returns all posts with person's activity" do
-      expect(instance.query).to match_array(activity)
-    end
-  end
-end
diff --git a/spec/lib/diaspora/exporter_spec.rb b/spec/lib/diaspora/exporter_spec.rb
index 7db86e82fd006a37bc98287dd451d3d078efd9b5..6a9b1056f1986345205d37839450c60f8f153ca9 100644
--- a/spec/lib/diaspora/exporter_spec.rb
+++ b/spec/lib/diaspora/exporter_spec.rb
@@ -1,10 +1,12 @@
+# frozen_string_literal: true
+
 describe Diaspora::Exporter do
   describe "#execute" do
     it "calls exporters and forms JSON" do
       expect_any_instance_of(Export::UserSerializer).to receive(:as_json).and_return(user: "user_data")
       expect_any_instance_of(Export::OthersDataSerializer).to receive(:as_json).and_return(others_date: "others_data")
 
-      json = Diaspora::Exporter.new(nil).execute
+      json = Diaspora::Exporter.new(FactoryGirl.create(:user)).execute
       expect(json).to include_json(
         version:     "2.0",
         user:        "user_data",
diff --git a/spec/lib/diaspora/federated/base_spec.rb b/spec/lib/diaspora/federated/base_spec.rb
index 706abb7b35a384f4fcfcda64691c1d462d33eee4..8da2c370e5d67825a0fe06f87c27fd2263626337 100644
--- a/spec/lib/diaspora/federated/base_spec.rb
+++ b/spec/lib/diaspora/federated/base_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/diaspora/federated/contact_retraction_spec.rb b/spec/lib/diaspora/federated/contact_retraction_spec.rb
index bd5c7c3dd9628ea9577a96d20177c899f9571259..04e19ea1c8973930dce28483448b6e1a901bc6d9 100644
--- a/spec/lib/diaspora/federated/contact_retraction_spec.rb
+++ b/spec/lib/diaspora/federated/contact_retraction_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ContactRetraction do
   let(:contact) { FactoryGirl.build(:contact, sharing: true, receiving: true) }
   let(:retraction) { ContactRetraction.for(contact) }
diff --git a/spec/lib/diaspora/federated/retraction_spec.rb b/spec/lib/diaspora/federated/retraction_spec.rb
index 565f22387064509c889f2cdce42a40fb36cbdfad..1fe6b9d566f0c721219c2b2f227d974be5173b4f 100644
--- a/spec/lib/diaspora/federated/retraction_spec.rb
+++ b/spec/lib/diaspora/federated/retraction_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/diaspora/federation/dispatcher/private_spec.rb b/spec/lib/diaspora/federation/dispatcher/private_spec.rb
index b1fd867a6f34dd1a27c036987787fa623c267c80..a5453023bc94975ffc927671f8a1d24a7702cd06 100644
--- a/spec/lib/diaspora/federation/dispatcher/private_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher/private_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Federation::Dispatcher::Private do
   let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: false) }
   let(:comment) { FactoryGirl.create(:comment, author: alice.person, post: post) }
@@ -81,7 +83,7 @@ describe Diaspora::Federation::Dispatcher::Private do
         expect(magic_env).to receive(:envelop).with(encryption_key).and_return(magic_env_xml)
         expect(DiasporaFederation::Salmon::EncryptedMagicEnvelope).to receive(:encrypt) do |magic_env, public_key|
           expect(magic_env).to eq(magic_env_xml)
-          expect(public_key.to_s).to eq(remote_raphael.public_key.to_s)
+          expect(public_key.to_s).to eq(remote_person.public_key.to_s)
           json
         end
 
@@ -107,7 +109,7 @@ describe Diaspora::Federation::Dispatcher::Private do
         expect(magic_env).to receive(:envelop).with(encryption_key).and_return(magic_env_xml)
         expect(DiasporaFederation::Salmon::EncryptedMagicEnvelope).to receive(:encrypt) do |magic_env, public_key|
           expect(magic_env).to eq(magic_env_xml)
-          expect(public_key.to_s).to eq(remote_raphael.public_key.to_s)
+          expect(public_key.to_s).to eq(remote_person.public_key.to_s)
           json
         end
 
diff --git a/spec/lib/diaspora/federation/dispatcher/public_spec.rb b/spec/lib/diaspora/federation/dispatcher/public_spec.rb
index f893c7a57438a353a59aa1105961376919c46fe8..6efc8716fabd75d25f85cb40535588d1b86183fb 100644
--- a/spec/lib/diaspora/federation/dispatcher/public_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher/public_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Federation::Dispatcher::Public do
   let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: true) }
   let(:comment) { FactoryGirl.create(:comment, author: alice.person, post: post) }
diff --git a/spec/lib/diaspora/federation/dispatcher_spec.rb b/spec/lib/diaspora/federation/dispatcher_spec.rb
index d4baadade397b00af98759f76bffadebbfffcb9e..a4faa0ab944b9b84a549eb5bc8872cdafb0b72ec 100644
--- a/spec/lib/diaspora/federation/dispatcher_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Federation::Dispatcher do
   let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: true) }
   let(:opts) { {service_types: "Services::Twitter"} }
diff --git a/spec/lib/diaspora/federation/entities_spec.rb b/spec/lib/diaspora/federation/entities_spec.rb
index 82bad8fb07cd795bd1a8573690d984c897b60143..0b80c1cc835ff6f19a90447cad90e335225f0072 100644
--- a/spec/lib/diaspora/federation/entities_spec.rb
+++ b/spec/lib/diaspora/federation/entities_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Federation::Entities do
   describe ".build" do
     it "builds an account deletion" do
@@ -210,9 +212,7 @@ describe Diaspora::Federation::Entities do
       expect(federation_entity.guid).to eq(diaspora_entity.guid)
       expect(federation_entity.root_author).to eq(diaspora_entity.root.author.diaspora_handle)
       expect(federation_entity.root_guid).to eq(diaspora_entity.root.guid)
-      expect(federation_entity.public).to be_truthy
       expect(federation_entity.created_at).to eq(diaspora_entity.created_at)
-      expect(federation_entity.provider_display_name).to eq(diaspora_entity.provider_display_name)
     end
 
     context "Retraction" do
diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb
index a28dacf7f198b125681da5eef1a98164481384a7..2c2e7e1106135eed12fe83d83bd7feebfc13a508 100644
--- a/spec/lib/diaspora/federation/receive_spec.rb
+++ b/spec/lib/diaspora/federation/receive_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Federation::Receive do
   let(:sender) { FactoryGirl.create(:person) }
   let(:post) { FactoryGirl.create(:status_message, text: "hello", public: true, author: alice.person) }
@@ -10,6 +12,27 @@ describe Diaspora::Federation::Receive do
 
       expect(AccountDeletion.exists?(person: sender)).to be_truthy
     end
+
+    it "ignores duplicate the account deletion" do
+      AccountDeletion.create(person: sender)
+
+      expect(AccountDeletion).not_to receive(:create!)
+
+      Diaspora::Federation::Receive.account_deletion(account_deletion_entity)
+
+      expect(AccountDeletion.exists?(person: sender)).to be_truthy
+    end
+
+    it "handles race conditions on parallel receive" do
+      expect(AccountDeletion).to receive(:create!) do
+        AccountDeletion.create(person: sender)
+        raise "Some database error"
+      end
+
+      Diaspora::Federation::Receive.account_deletion(account_deletion_entity)
+
+      expect(AccountDeletion.exists?(person: sender)).to be_truthy
+    end
   end
 
   describe ".account_migration" do
@@ -24,6 +47,27 @@ describe Diaspora::Federation::Receive do
 
       expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy
     end
+
+    it "ignores duplicate the account migrations" do
+      AccountMigration.create(old_person: sender, new_person: new_person)
+
+      expect(AccountMigration).not_to receive(:create!)
+
+      expect(Diaspora::Federation::Receive.account_migration(account_migration_entity)).to be_nil
+
+      expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy
+    end
+
+    it "handles race conditions on parallel receive" do
+      expect(AccountMigration).to receive(:create!) do
+        AccountMigration.create(old_person: sender, new_person: new_person)
+        raise "Some database error"
+      end
+
+      expect(Diaspora::Federation::Receive.account_migration(account_migration_entity)).to be_nil
+
+      expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy
+    end
   end
 
   describe ".comment" do
@@ -72,7 +116,7 @@ describe Diaspora::Federation::Receive do
 
     let(:entity) { comment_entity }
     it_behaves_like "it ignores existing object received twice", Comment
-    it_behaves_like "it rejects if the parent author ignores the author", Comment
+    it_behaves_like "it rejects if the root author ignores the author", Comment
     it_behaves_like "it relays relayables", Comment
   end
 
@@ -239,8 +283,49 @@ describe Diaspora::Federation::Receive do
 
     let(:entity) { like_entity }
     it_behaves_like "it ignores existing object received twice", Like
-    it_behaves_like "it rejects if the parent author ignores the author", Like
+    it_behaves_like "it rejects if the root author ignores the author", Like
     it_behaves_like "it relays relayables", Like
+
+    context "like for a comment" do
+      let(:comment) { FactoryGirl.create(:comment, post: post) }
+      let(:like_entity) {
+        build_relayable_federation_entity(
+          :like,
+          {
+            author:           sender.diaspora_handle,
+            parent_guid:      comment.guid,
+            parent_type:      "Comment",
+            author_signature: "aa"
+          },
+          "new_property" => "data"
+        )
+      }
+
+      it "attaches the like to the comment" do
+        Diaspora::Federation::Receive.perform(like_entity)
+
+        like = Like.find_by!(guid: like_entity.guid)
+
+        expect(comment.likes).to include(like)
+        expect(like.target).to eq(comment)
+      end
+
+      it "saves the signature data" do
+        Diaspora::Federation::Receive.perform(like_entity)
+
+        like = Like.find_by!(guid: like_entity.guid)
+
+        expect(like.signature).not_to be_nil
+        expect(like.signature.author_signature).to eq("aa")
+        expect(like.signature.additional_data).to eq("new_property" => "data")
+        expect(like.signature.order).to eq(like_entity.signature_order.map(&:to_s))
+      end
+
+      let(:entity) { like_entity }
+      it_behaves_like "it ignores existing object received twice", Like
+      it_behaves_like "it rejects if the root author ignores the author", Like
+      it_behaves_like "it relays relayables", Like
+    end
   end
 
   describe ".message" do
@@ -406,7 +491,7 @@ describe Diaspora::Federation::Receive do
 
     let(:entity) { poll_participation_entity }
     it_behaves_like "it ignores existing object received twice", PollParticipation
-    it_behaves_like "it rejects if the parent author ignores the author", PollParticipation
+    it_behaves_like "it rejects if the root author ignores the author", PollParticipation
     it_behaves_like "it relays relayables", PollParticipation
   end
 
@@ -582,17 +667,6 @@ describe Diaspora::Federation::Receive do
 
         Diaspora::Federation::Receive.perform(status_message_entity)
       end
-
-      it "finds the correct author if the author is not lowercase" do
-        status_message_entity = Fabricate(:status_message_entity, author: sender.diaspora_handle.upcase)
-
-        received = Diaspora::Federation::Receive.perform(status_message_entity)
-
-        status_message = StatusMessage.find_by!(guid: status_message_entity.guid)
-
-        expect(received).to eq(status_message)
-        expect(status_message.author).to eq(sender)
-      end
     end
 
     context "with poll" do
diff --git a/spec/lib/diaspora/fetcher/public_spec.rb b/spec/lib/diaspora/fetcher/public_spec.rb
index 08468d105375d75bc518ad7951e585ca4bbfb085..58f751ef7cada120665a2aa6f02644f1e371596b 100644
--- a/spec/lib/diaspora/fetcher/public_spec.rb
+++ b/spec/lib/diaspora/fetcher/public_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2012, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/diaspora/markdownify_email_spec.rb b/spec/lib/diaspora/markdownify_email_spec.rb
index bac2de175f2ce0e7d802b902bf4852e4ca542052..5ed08677f1c0a8ddbe4b7d034c71007d37a6cdf1 100644
--- a/spec/lib/diaspora/markdownify_email_spec.rb
+++ b/spec/lib/diaspora/markdownify_email_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Markdownify::Email do
   include Rails.application.routes.url_helpers
 
diff --git a/spec/lib/diaspora/markdownify_spec.rb b/spec/lib/diaspora/markdownify_spec.rb
index 10ac97a8b9d332a0e8b28b64b1dc8efc4ebb8c75..44fdb70a787a1db095785f4d86e5602eacef65db 100644
--- a/spec/lib/diaspora/markdownify_spec.rb
+++ b/spec/lib/diaspora/markdownify_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Markdownify::HTML do
   describe "#autolink" do
     before do
diff --git a/spec/lib/diaspora/mentionable_spec.rb b/spec/lib/diaspora/mentionable_spec.rb
index 477e6837b1dcc35d4ac189bd347ffcdd93f142b5..aef3e12f4c32252e65a0637d992258433cf30aba 100644
--- a/spec/lib/diaspora/mentionable_spec.rb
+++ b/spec/lib/diaspora/mentionable_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Mentionable do
   include PeopleHelper
 
diff --git a/spec/lib/diaspora/message_renderer_spec.rb b/spec/lib/diaspora/message_renderer_spec.rb
index f72adc2405fb18b91860794e18cb7e26887d3cfc..7789e243e852c3e0f5d006292e2f5e64b817449f 100644
--- a/spec/lib/diaspora/message_renderer_spec.rb
+++ b/spec/lib/diaspora/message_renderer_spec.rb
@@ -1,9 +1,6 @@
-describe Diaspora::MessageRenderer do
-  MESSAGE_NORMALIZTIONS = {
-    "\u202a#\u200eUSA\u202c" => "#USA",
-    "ള്‍"                     => "ള്‍"
-  }
+# frozen_string_literal: true
 
+describe Diaspora::MessageRenderer do
   def message(text, opts={})
     Diaspora::MessageRenderer.new(text, opts)
   end
@@ -98,6 +95,20 @@ describe Diaspora::MessageRenderer do
         end
       end
     end
+
+    context "with diaspora:// links" do
+      it "replaces diaspora:// links with pod-local links" do
+        target = FactoryGirl.create(:status_message)
+        expect(
+          message("Have a look at diaspora://#{target.diaspora_handle}/post/#{target.guid}.").html
+        ).to match(/Have a look at #{AppConfig.url_to("/posts/#{target.guid}")}./)
+      end
+
+      it "doesn't touch invalid diaspora:// links" do
+        text = "You can create diaspora://author/type/guid links!"
+        expect(message(text).html).to match(/#{text}/)
+      end
+    end
   end
 
   describe "#markdownified" do
@@ -126,8 +137,11 @@ describe Diaspora::MessageRenderer do
     end
 
     it "normalizes" do
-      MESSAGE_NORMALIZTIONS.each do |input, output|
-        expect(message(input).plain_text_for_json).to eq output
+      {
+        "\u202a#\u200eUSA\u202c" => "<p><a class=\"tag\" href=\"/tags/USA\">#USA</a></p>\n",
+        "ള്‍"                    => "<p>ള്‍</p>\n"
+      }.each do |input, output|
+        expect(message(input).markdownified).to eq output
       end
     end
 
@@ -178,6 +192,25 @@ describe Diaspora::MessageRenderer do
         entities = '&amp; &szlig; &#x27; &#39; &quot;'
         expect(message(entities).markdownified).to eq "<p>#{entities}</p>\n"
       end
+
+      context "with diaspora:// links" do
+        it "replaces diaspora:// links with pod-local links" do
+          target1 = FactoryGirl.create(:status_message)
+          target2 = FactoryGirl.create(:status_message)
+          text = "Have a look at [this post](diaspora://#{target1.diaspora_handle}/post/#{target1.guid}) and " \
+                 "this one too diaspora://#{target2.diaspora_handle}/post/#{target2.guid}."
+
+          rendered = message(text).markdownified
+
+          expect(rendered).to match(%r{at <a href="#{AppConfig.url_to("/posts/#{target1.guid}")}">this post</a> and})
+          expect(rendered).to match(/this one too #{AppConfig.url_to("/posts/#{target2.guid}")}./)
+        end
+
+        it "doesn't touch invalid diaspora:// links" do
+          text = "You can create diaspora://author/type/guid links!"
+          expect(message(text).markdownified).to match(/#{text}/)
+        end
+      end
     end
   end
 
@@ -208,6 +241,25 @@ describe Diaspora::MessageRenderer do
         expect(msg.plain_text_without_markdown).to eq "@#{alice.diaspora_handle} is cool"
       end
     end
+
+    context "with diaspora:// links" do
+      it "replaces diaspora:// links with pod-local links" do
+        target1 = FactoryGirl.create(:status_message)
+        target2 = FactoryGirl.create(:status_message)
+        text = "Have a look at [this post](diaspora://#{target1.diaspora_handle}/post/#{target1.guid}) and " \
+               "this one too diaspora://#{target2.diaspora_handle}/post/#{target2.guid}."
+
+        rendered = message(text).plain_text_without_markdown
+
+        expect(rendered).to match(/look at this post \(#{AppConfig.url_to("/posts/#{target1.guid}")}\) and/)
+        expect(rendered).to match(/this one too #{AppConfig.url_to("/posts/#{target2.guid}")}./)
+      end
+
+      it "doesn't touch invalid diaspora:// links" do
+        text = "You can create diaspora://author/type/guid links!"
+        expect(message(text).plain_text_without_markdown).to match(/#{text}/)
+      end
+    end
   end
 
   describe "#urls" do
@@ -239,9 +291,31 @@ describe Diaspora::MessageRenderer do
 
   describe "#plain_text_for_json" do
     it "normalizes" do
-      MESSAGE_NORMALIZTIONS.each do |input, output|
+      {
+        "\u202a#\u200eUSA\u202c" => "#USA",
+        "ള്‍"                    => "ള്‍"
+      }.each do |input, output|
         expect(message(input).plain_text_for_json).to eq output
       end
     end
+
+    context "with diaspora:// links" do
+      it "replaces diaspora:// links with pod-local links" do
+        target1 = FactoryGirl.create(:status_message)
+        target2 = FactoryGirl.create(:status_message)
+        text = "Have a look at [this post](diaspora://#{target1.diaspora_handle}/post/#{target1.guid}) and " \
+               "this one too diaspora://#{target2.diaspora_handle}/post/#{target2.guid}."
+
+        rendered = message(text).plain_text_for_json
+
+        expect(rendered).to match(/look at \[this post\]\(#{AppConfig.url_to("/posts/#{target1.guid}")}\) and/)
+        expect(rendered).to match(/this one too #{AppConfig.url_to("/posts/#{target2.guid}")}./)
+      end
+
+      it "doesn't touch invalid diaspora:// links" do
+        text = "You can create diaspora://author/type/guid links!"
+        expect(message(text).plain_text_for_json).to match(/#{text}/)
+      end
+    end
   end
 end
diff --git a/spec/lib/diaspora/shareable_spec.rb b/spec/lib/diaspora/shareable_spec.rb
index 716373a4d724cd08898740c932a7e92d8e500dc6..f1609d967737d14cefe71a79a9f4ba0e617d5a65 100644
--- a/spec/lib/diaspora/shareable_spec.rb
+++ b/spec/lib/diaspora/shareable_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Shareable do
   describe "scopes" do
     context "having multiple objects with equal db IDs" do
diff --git a/spec/lib/diaspora/taggable_spec.rb b/spec/lib/diaspora/taggable_spec.rb
index f3b03f0e534a1bf4e7a637118a951211cd06ab69..5008bf1d58227976a0456ea4880894a3038f6a05 100644
--- a/spec/lib/diaspora/taggable_spec.rb
+++ b/spec/lib/diaspora/taggable_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Diaspora::Taggable do
   include Rails.application.routes.url_helpers
 
diff --git a/spec/lib/direction_detector_spec.rb b/spec/lib/direction_detector_spec.rb
index 50c924b8afe78bcfcf520e5c86381f1339b9277f..3c809ca5bff2cd7d784aff7f78bcd2db6a2753ba 100644
--- a/spec/lib/direction_detector_spec.rb
+++ b/spec/lib/direction_detector_spec.rb
@@ -1,4 +1,6 @@
 # coding: utf-8
+# frozen_string_literal: true
+
 # Copyright (c) 2010-2011, Diaspora Inc.  This file is
 # licensed under the Affero General Public License version 3 or later.  See
 # the COPYRIGHT file.
diff --git a/spec/lib/email_inviter_spec.rb b/spec/lib/email_inviter_spec.rb
index 33f7fecfdf78d429c8a16cb6451d9df7e56bfec7..3a957cb1b760ec2ffe210d683637b328df4753ff 100644
--- a/spec/lib/email_inviter_spec.rb
+++ b/spec/lib/email_inviter_spec.rb
@@ -1,11 +1,12 @@
+# frozen_string_literal: true
+
 describe EmailInviter do
   before do
-    @user = double(:invitation_code => 'coolcodebro', :present? => true, 
-                 :email => 'foo@bar.com')
+    @user = double(invitation_code: "coolcodebro", present?: true, email: "foo@bar.com")
     @emails = "mbs333@gmail.com, foo1@bar.com maxwell@dude.com"
   end
 
-  it 'has a list of emails' do 
+  it "has a list of emails" do
     inviter = EmailInviter.new(@emails, @user)
     expect(inviter.emails).not_to be_empty
   end
@@ -20,12 +21,6 @@ describe EmailInviter do
     expect(inviter.inviter).not_to be_nil
   end
 
-  it 'can have a message' do
-    message = "you guys suck hard"
-    inviter = EmailInviter.new("emails", @user, :message =>  message)
-    expect(inviter.message).to eq(message) 
-  end
-
   describe '#emails' do
     it 'rejects the inviter email if present' do
       inviter = EmailInviter.new(@emails + " #{@user.email}", @user)
diff --git a/spec/lib/evil_query_spec.rb b/spec/lib/evil_query_spec.rb
index dbaaf3b02e9164661c3d754ca8a194935409a2ad..d83f8cbc88fa831a68e148c10d391ee4ecdf4fb1 100644
--- a/spec/lib/evil_query_spec.rb
+++ b/spec/lib/evil_query_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe EvilQuery::MultiStream do
   let(:evil_query) { EvilQuery::MultiStream.new(alice, "created_at", Time.zone.now, true) }
 
diff --git a/spec/lib/i18n_interpolation_fallbacks_spec.rb b/spec/lib/i18n_interpolation_fallbacks_spec.rb
index 5c306849dd6b0460e18954c707481792946da9c1..c44e60552ac8ac8a85e9a1478753e0ad9c718b81 100644
--- a/spec/lib/i18n_interpolation_fallbacks_spec.rb
+++ b/spec/lib/i18n_interpolation_fallbacks_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/publisher_spec.rb b/spec/lib/publisher_spec.rb
index f8479d884d5302b8c912e984e0f1670eb28db805..55d9fdea8eacd20d46d6c51bf74adf64a2bf33dd 100644
--- a/spec/lib/publisher_spec.rb
+++ b/spec/lib/publisher_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Publisher do
   before do
     @publisher = Publisher.new(alice)
diff --git a/spec/lib/pubsubhubbub_spec.rb b/spec/lib/pubsubhubbub_spec.rb
index 0292c64720046dc86ed8e67906d7483c1386699f..25e5b26a4e4be5913e907ed198f0ea30b6a17337 100644
--- a/spec/lib/pubsubhubbub_spec.rb
+++ b/spec/lib/pubsubhubbub_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/rack/internet_explorer_version_spec.rb b/spec/lib/rack/internet_explorer_version_spec.rb
deleted file mode 100644
index 78781cb2526ee137632ddc31f20175cd03065500..0000000000000000000000000000000000000000
--- a/spec/lib/rack/internet_explorer_version_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
-#   licensed under the Affero General Public License version 3 or later.  See
-#   the COPYRIGHT file.
-
-describe Rack::InternetExplorerVersion do
-  before :all do
-    @app = Rack::Builder.parse_file(Rails.root.join("config.ru").to_s).first
-  end
-
-  subject { get_response_for_user_agent(@app, ua_string) }
-
-  context "non-IE browser" do
-    let(:ua_string) { "another browser chromeframe" }
-
-    it "shouldn't complain about the browser" do
-      expect(subject.body).not_to match(/Diaspora doesn't support your version of Internet Explorer/)
-    end
-  end
-
-  context "new IE" do
-    let(:ua_string) { "MSIE 9" }
-
-    it "shouldn't complain about the browser" do
-      expect(subject.body).not_to match(/Diaspora doesn't support your version of Internet Explorer/)
-    end
-  end
-
-  context "old IE" do
-    let(:ua_string) { "MSIE 7" }
-
-    it "should complain about the browser" do
-      expect(subject.body).to match(/Diaspora doesn't support your version of Internet Explorer/)
-    end
-
-    it "should have the correct content-length header" do
-      expect(subject.headers["Content-Length"]).to eq(subject.body.length.to_s)
-    end
-  end
-
-  context "Specific case with no space after MSIE" do
-    let(:ua_string) { "Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.0) .NET CLR 2.0.50727" }
-
-    it "should complain about the browser" do
-      expect(subject.body).to match(/Diaspora doesn't support your version of Internet Explorer/)
-    end
-  end
-end
diff --git a/spec/lib/stream/activity_spec.rb b/spec/lib/stream/activity_spec.rb
index a57cce580e7ae3aa8d7dc8575263f5377876dc1d..ad6e01d3fc861cc1343716b5193e078ea4cfadc4 100644
--- a/spec/lib/stream/activity_spec.rb
+++ b/spec/lib/stream/activity_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Activity do
diff --git a/spec/lib/stream/aspect_spec.rb b/spec/lib/stream/aspect_spec.rb
index 6b5003f3abb34bd9e3ba7c6112f955d4094bc7da..21f8ec7b7a16b2c556c38a31830e01384e3c7372 100644
--- a/spec/lib/stream/aspect_spec.rb
+++ b/spec/lib/stream/aspect_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/lib/stream/base_spec.rb b/spec/lib/stream/base_spec.rb
index 76ddcd1ba2f7ff335da48ac7ade381039fa1b52c..08fa3d89c11e4f0550a6afbc8720b2d8bd4d9814 100644
--- a/spec/lib/stream/base_spec.rb
+++ b/spec/lib/stream/base_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Base do
diff --git a/spec/lib/stream/comments_spec.rb b/spec/lib/stream/comments_spec.rb
index 8cc926870749a712c16574c4b68f828477606567..0d43b8ab35a4578be5f35e2a322bf1c0f101aa93 100644
--- a/spec/lib/stream/comments_spec.rb
+++ b/spec/lib/stream/comments_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Comments do
diff --git a/spec/lib/stream/followed_tag_spec.rb b/spec/lib/stream/followed_tag_spec.rb
index 61569d7c463a30f057ae6c709f19b52617e58d2c..dad0b2a6913d2a6e79c3ecd1c8cde83b3ef322bf 100644
--- a/spec/lib/stream/followed_tag_spec.rb
+++ b/spec/lib/stream/followed_tag_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::FollowedTag do
diff --git a/spec/lib/stream/likes_spec.rb b/spec/lib/stream/likes_spec.rb
index f8d1b250393aff38984616421b2076cb8bd88140..b12204f164bf5b84a732211d7f8e89c492615057 100644
--- a/spec/lib/stream/likes_spec.rb
+++ b/spec/lib/stream/likes_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Likes do
diff --git a/spec/lib/stream/mention_spec.rb b/spec/lib/stream/mention_spec.rb
index bf292dccd9f345d7b308b86332a635c06ce78b26..518191d6d938de096edf021c061eb5e31e1d6869 100644
--- a/spec/lib/stream/mention_spec.rb
+++ b/spec/lib/stream/mention_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Mention do
diff --git a/spec/lib/stream/multi_spec.rb b/spec/lib/stream/multi_spec.rb
index c5c22254661d4ffe926fd28edbd3654ddb59fb9c..04dbd153da95451f9fd4b82f8d1923f31397faff 100644
--- a/spec/lib/stream/multi_spec.rb
+++ b/spec/lib/stream/multi_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Multi do
diff --git a/spec/lib/stream/person_spec.rb b/spec/lib/stream/person_spec.rb
index 2c44377bcaebf03d6fb2792afe1dc10f78df1419..bd1056e81bd2c79a2e8e802d6caa4eaaee0d26b2 100644
--- a/spec/lib/stream/person_spec.rb
+++ b/spec/lib/stream/person_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Person do
diff --git a/spec/lib/stream/public_spec.rb b/spec/lib/stream/public_spec.rb
index f6fbe8b5ca82ed7fb139251b40d25c7012a850e3..7492d8e48bfe1fa4d94096724f01693c9f08b36a 100644
--- a/spec/lib/stream/public_spec.rb
+++ b/spec/lib/stream/public_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require Rails.root.join('spec', 'shared_behaviors', 'stream')
 
 describe Stream::Public do
diff --git a/spec/lib/stream/tag_spec.rb b/spec/lib/stream/tag_spec.rb
index afde047f93be53fa9fc533cc53087bc457d4f084..c126e7d8345ea533fa880bf80e3b308a08f24b24 100644
--- a/spec/lib/stream/tag_spec.rb
+++ b/spec/lib/stream/tag_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/locale_spec.rb b/spec/locale_spec.rb
index 9aae0dc1364d5c24d18562d89bb5821ba3788037..735aea78d96c3c74b988d59479a35f75e6b1dbc5 100644
--- a/spec/locale_spec.rb
+++ b/spec/locale_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe 'locale files' do
   describe "cldr/plurals.rb" do
     AVAILABLE_LANGUAGE_CODES.each do |locale|
diff --git a/spec/mailers/export_spec.rb b/spec/mailers/export_spec.rb
index 0c1e7a9ca72a644353a3d9055bc7b3946d62a521..f522026401f0abdf4c0ea5c9dcbc4af16bcebdbd 100644
--- a/spec/mailers/export_spec.rb
+++ b/spec/mailers/export_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/mailers/maintenance_spec.rb b/spec/mailers/maintenance_spec.rb
index 4b997833b7c4fef51e5493e8fbbc55454e221053..71955bbb7eee854f5865e4ebd39fc8378ab7daa8 100644
--- a/spec/mailers/maintenance_spec.rb
+++ b/spec/mailers/maintenance_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/mailers/notifier_spec.rb b/spec/mailers/notifier_spec.rb
index 12ee1dd78691c18121a297047c5ef3b64fcb4867..ea8ad573eda3a3441712586434e5e486c851ddc1 100644
--- a/spec/mailers/notifier_spec.rb
+++ b/spec/mailers/notifier_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Notifier, type: :mailer do
   let(:person) { FactoryGirl.create(:person) }
   let(:pod_name) { AppConfig.settings.pod_name }
@@ -502,7 +504,7 @@ describe Notifier, type: :mailer do
   end
 
   describe ".invite" do
-    let(:email) { Notifier.invite(alice.email, nil, bob, "1234", "en") }
+    let(:email) { Notifier.invite(alice.email, bob, "1234", "en") }
 
     it "goes to the right person" do
       expect(email.to).to eq([alice.email])
@@ -522,7 +524,7 @@ describe Notifier, type: :mailer do
 
     it "has the inviter id if the name is nil" do
       bob.person.profile.update_attributes(first_name: "", last_name: "")
-      mail = Notifier.invite(alice.email, nil, bob, "1234", "en")
+      mail = Notifier.invite(alice.email, bob, "1234", "en")
       expect(email.body.encoded).to_not include("#{bob.name} (#{bob.diaspora_handle})")
       expect(mail.body.encoded).to include(bob.person.diaspora_handle)
     end
diff --git a/spec/mailers/report_spec.rb b/spec/mailers/report_spec.rb
index 96699f5625479fb53f339016050016e49d132913..4770a800026dfde8b2c2015d4f0ffc9cfeee2ddf 100644
--- a/spec/mailers/report_spec.rb
+++ b/spec/mailers/report_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/account_deletion_spec.rb b/spec/models/account_deletion_spec.rb
index 7fc069984583fa07471460e12ae593345e029ce9..996eb29ef2721781410a01b0d2b48b5b45416815 100644
--- a/spec/models/account_deletion_spec.rb
+++ b/spec/models/account_deletion_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb
index 0f62a4d8b36957f8f631bbc0143b614e2b811155..2121a5a7ae54216c72ac55e682613c680e19cf86 100644
--- a/spec/models/account_migration_spec.rb
+++ b/spec/models/account_migration_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require "integration/federation/federation_helper"
 
 describe AccountMigration, type: :model do
@@ -125,7 +127,7 @@ describe AccountMigration, type: :model do
       include_context "with local new user"
 
       it "dispatches account migration message" do
-        expect(account_migration).to receive(:sender).and_return(old_user)
+        expect(account_migration).to receive(:sender).twice.and_return(old_user)
         dispatcher = double
         expect(dispatcher).to receive(:dispatch)
         expect(Diaspora::Federation::Dispatcher).to receive(:build)
@@ -133,6 +135,14 @@ describe AccountMigration, type: :model do
           .and_return(dispatcher)
         account_migration.perform!
       end
+
+      it "doesn't run migration if old key is not provided" do
+        expect(embedded_account_deleter).not_to receive(:tombstone_person_and_profile)
+
+        expect {
+          account_migration.perform!
+        }.to raise_error "can't build sender without old private key defined"
+      end
     end
 
     context "with local old and new users" do
diff --git a/spec/models/acts_as_taggable_on_tag_spec.rb b/spec/models/acts_as_taggable_on_tag_spec.rb
index c5d341224aa2c335aa79943f57579b82494e7a8c..880eebdf04cc6981bb1e482cbbcf35f4f2da5050 100644
--- a/spec/models/acts_as_taggable_on_tag_spec.rb
+++ b/spec/models/acts_as_taggable_on_tag_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ActsAsTaggableOn::Tag, :type => :model do
   subject(:tag) { ActsAsTaggableOn::Tag }
 
diff --git a/spec/models/api/openid_connect/id_token_spec.rb b/spec/models/api/openid_connect/id_token_spec.rb
index 154bbd90fe619dbcbb56b1655ecf35e2174ac5e2..22efb08be37a21471e2e61e0efa41e5a4892d7a2 100644
--- a/spec/models/api/openid_connect/id_token_spec.rb
+++ b/spec/models/api/openid_connect/id_token_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Api::OpenidConnect::IdToken, type: :model do
   describe "#to_jwt" do
     let(:auth) { FactoryGirl.create(:auth_with_read) }
diff --git a/spec/models/aspect_membership_spec.rb b/spec/models/aspect_membership_spec.rb
index 6bfda455157928e3c7d7f361c09b56318fb735da..d8f1de0fe1ad59c6cafb3a9b24aa00fc91e07ef0 100644
--- a/spec/models/aspect_membership_spec.rb
+++ b/spec/models/aspect_membership_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -24,5 +26,13 @@ describe AspectMembership, :type => :model do
       alice.add_contact_to_aspect(contact, aspect)
       aspect_membership.destroy
     end
+
+    it "doesn't fail destruction if the user entry was deleted in prior" do
+      aspect_membership.user.delete
+      id = aspect_membership.id
+
+      expect { AspectMembership.find(id).destroy }.not_to raise_error
+      expect(AspectMembership.where(id: id)).not_to exist
+    end
   end
 end
diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb
index 4899a2f409ac0c6facacb3b455a0bd668b2db54b..c5426bf7c75593690f83c8407cd3ce0a858aa897 100644
--- a/spec/models/aspect_spec.rb
+++ b/spec/models/aspect_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/aspect_visibility_spec.rb b/spec/models/aspect_visibility_spec.rb
index 61b9aa28b2ce4165c42829bf463db4deaec6627f..7689799bc380e6411ad00b7c95bd1927b5d514e4 100644
--- a/spec/models/aspect_visibility_spec.rb
+++ b/spec/models/aspect_visibility_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe AspectVisibility, type: :model do
   let(:status_message) { FactoryGirl.create(:status_message) }
   let(:aspect) { FactoryGirl.create(:aspect) }
diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb
index e85ea6600fd47da91489f9f576d1d6bbb1477dc0..e3ee01c42bd558e7cfdb256806f96a72cf3a1417 100644
--- a/spec/models/block_spec.rb
+++ b/spec/models/block_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Block, :type => :model do
   describe "validations" do
     it "doesnt allow you to block yourself" do
diff --git a/spec/models/comment_signature_spec.rb b/spec/models/comment_signature_spec.rb
index c669786d38f659b2502cfb85aa82ea267aff966b..1220a645e0cd33596a8965bf8c9f35b3badb5e72 100644
--- a/spec/models/comment_signature_spec.rb
+++ b/spec/models/comment_signature_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb
index 82d46566ce51548af63590dee9839af8b1d6c31e..9b426b2249b7167de32eaad62803522a5d59fa13 100644
--- a/spec/models/comment_spec.rb
+++ b/spec/models/comment_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -8,6 +10,7 @@ describe Comment, type: :model do
   let(:comment_alice) { alice.comment!(status_bob, "why so formal?") }
 
   it_behaves_like "it is mentions container"
+  it_behaves_like "a reference source"
 
   describe "#destroy" do
     it "should delete a participation" do
diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb
index aabad41dcbf32d4ec29a261411cea97463809138..dd5f5b27c6ee040fa21e47bb218bf5c313a39aa4 100644
--- a/spec/models/contact_spec.rb
+++ b/spec/models/contact_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index 4ec3f61406ed887593dfe570f65489bf484c92ab..76dadafcf9dee00c8ae9a1345db34c636592296a 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/conversation_visibilities_spec.rb b/spec/models/conversation_visibilities_spec.rb
index 4c968622c84e2003d966370f7d650945e1422989..99b4adfc87f835d5605af0598a8acadb6f569a6c 100644
--- a/spec/models/conversation_visibilities_spec.rb
+++ b/spec/models/conversation_visibilities_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/invitation_code_spec.rb b/spec/models/invitation_code_spec.rb
index 2912c1415a68de4f5359bfa29963b7d33e1fceb6..3525b3a96586a5d6b1c8e59e8b5289ee4762890d 100644
--- a/spec/models/invitation_code_spec.rb
+++ b/spec/models/invitation_code_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe InvitationCode, :type => :model do
   it 'has a valid factory' do
     expect(FactoryGirl.build(:invitation_code)).to be_valid
diff --git a/spec/models/like_signature_spec.rb b/spec/models/like_signature_spec.rb
index 79b5228d43ecda714fce2db6fa262b6d41b27dc8..ff57b76e122aa07b78a190161ff752ae335a1e7c 100644
--- a/spec/models/like_signature_spec.rb
+++ b/spec/models/like_signature_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/like_spec.rb b/spec/models/like_spec.rb
index 6236924b1207c11c712226dac236a7fa8f3d68e6..d96121d7801f800f3ea6a013fefa183f5128edad 100644
--- a/spec/models/like_spec.rb
+++ b/spec/models/like_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -60,4 +62,17 @@ describe Like, type: :model do
     let(:remote_object_on_local_parent) { FactoryGirl.create(:like, target: local_parent, author: remote_raphael) }
     let(:relayable) { Like::Generator.new(alice, status).build }
   end
+
+  context "like for a comment" do
+    it_behaves_like "it is relayable" do
+      let(:local_parent) { local_luke.post(:status_message, text: "hi", to: local_luke.aspects.first) }
+      let(:remote_parent) { FactoryGirl.create(:status_message, author: remote_raphael) }
+      let(:comment_on_local_parent) { FactoryGirl.create(:comment, post: local_parent) }
+      let(:comment_on_remote_parent) { FactoryGirl.create(:comment, post: remote_parent) }
+      let(:object_on_local_parent) { local_luke.like!(comment_on_local_parent) }
+      let(:object_on_remote_parent) { local_luke.like!(comment_on_remote_parent) }
+      let(:remote_object_on_local_parent) { FactoryGirl.create(:like, target: local_parent, author: remote_raphael) }
+      let(:relayable) { Like::Generator.new(alice, status).build }
+    end
+  end
 end
diff --git a/spec/models/location_spec.rb b/spec/models/location_spec.rb
index 0742ffa50a73cd01c005d511e3540c5e2114350c..ba7ab17fd0f5046ecbf7772ddd7ad1736f5bcf9f 100644
--- a/spec/models/location_spec.rb
+++ b/spec/models/location_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Location, type: :model do
   describe "before validation" do
     let(:status) { FactoryGirl.create(:status_message) }
diff --git a/spec/models/mention_spec.rb b/spec/models/mention_spec.rb
index 6fe5ecdb50ede6ca49c6cf36ac97c552089342fa..5e5e95642f61c6ae29ddf76320f900c6a08f9c33 100644
--- a/spec/models/mention_spec.rb
+++ b/spec/models/mention_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
index e2588a50272e6d1cda59e0823dd07211a07844f2..031df4a9a7a23a4c6324243639edfff5861fdb0d 100644
--- a/spec/models/message_spec.rb
+++ b/spec/models/message_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -50,4 +52,6 @@ describe Message, type: :model do
       expect(conf.reload.unread).to eq(1)
     end
   end
+
+  it_behaves_like "a reference source"
 end
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index 392fc3940872e0297c0e43cef6b7233de9034dce..14f5d9b4bf572f2d2166213e22b045b75f218756 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/notifications/also_commented_spec.rb b/spec/models/notifications/also_commented_spec.rb
index ba57068f72a16027983b3027a5e4e046724c0e05..dd40392850e6da905d5cbd3eb08ec9d23230a3bf 100644
--- a/spec/models/notifications/also_commented_spec.rb
+++ b/spec/models/notifications/also_commented_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/notifications/mentioned_in_post_spec.rb b/spec/models/notifications/mentioned_in_post_spec.rb
index 90c5b007d722661ae1b1c8124a3f3263ed066b3a..bbf6b02b833207c6e8eec6c7f36eecbcd1d5633e 100644
--- a/spec/models/notifications/mentioned_in_post_spec.rb
+++ b/spec/models/notifications/mentioned_in_post_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Notifications::MentionedInPost, type: :model do
   let(:sm) {
     FactoryGirl.create(:status_message, author: alice.person, text: "hi @{bob; #{bob.diaspora_handle}}", public: true)
diff --git a/spec/models/notifications/mentioned_spec.rb b/spec/models/notifications/mentioned_spec.rb
index 2256a35a8a8042217f18460d9868555802791ed6..90e112aa3342d4ec2c3c6b77eb706abcc3c7e521 100644
--- a/spec/models/notifications/mentioned_spec.rb
+++ b/spec/models/notifications/mentioned_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Notifications::Mentioned do
   class TestNotification < Notification
     include Notifications::Mentioned
diff --git a/spec/models/notifications/private_message_spec.rb b/spec/models/notifications/private_message_spec.rb
index 327312ff6e9209ed8ee12152a6f2b06fda246f90..0879a1cb22ccc1d21634938cdf898bdac3258c5f 100644
--- a/spec/models/notifications/private_message_spec.rb
+++ b/spec/models/notifications/private_message_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/notifications/reshared_spec.rb b/spec/models/notifications/reshared_spec.rb
index 6a9cb82ab687b3cebfebc89f957953945fbd7d80..739fd79e4a56a46d9e4a3100ed465795b244558c 100644
--- a/spec/models/notifications/reshared_spec.rb
+++ b/spec/models/notifications/reshared_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/notifications/started_sharing_spec.rb b/spec/models/notifications/started_sharing_spec.rb
index 4c5a094b8040633f4a211efbd6307f3c1a591911..9239767a3d01fb4c0901e0ff4bf3db95e3d3a020 100644
--- a/spec/models/notifications/started_sharing_spec.rb
+++ b/spec/models/notifications/started_sharing_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Notifications::StartedSharing, type: :model do
   let(:contact) { alice.contact_for(bob.person) }
   let(:started_sharing_notification) { Notifications::StartedSharing.new(recipient: alice) }
diff --git a/spec/models/open_graph_cache_spec.rb b/spec/models/open_graph_cache_spec.rb
index 8edd764c6267403305762b5a1f220a3e7b8c560e..40d7eebd87f90d1a96e834cea7173843fb149f86 100644
--- a/spec/models/open_graph_cache_spec.rb
+++ b/spec/models/open_graph_cache_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/participation_spec.rb b/spec/models/participation_spec.rb
index 7ee4d189b8b4164ba0053bb821cf353771cf95e4..8ce158f1e6be7c232aa5c1c1006bf442d787fdfe 100644
--- a/spec/models/participation_spec.rb
+++ b/spec/models/participation_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Participation, type: :model do
   let(:status) { bob.post(:status_message, text: "hello", to: bob.aspects.first.id) }
 
diff --git a/spec/models/person_spec.rb b/spec/models/person_spec.rb
index 7cfe69ab9735dfad4f957b836e74007543cacb95..8087506d8baf48a4f1d06982667f7c499787e5f1 100644
--- a/spec/models/person_spec.rb
+++ b/spec/models/person_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb
index 31d4afff66cdbbdb9eb3c142ab6f3799eca2b4e6..225d609a88a0f730c4624b33acd68fa4fb673757 100644
--- a/spec/models/photo_spec.rb
+++ b/spec/models/photo_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/pod_spec.rb b/spec/models/pod_spec.rb
index 99e860c0bb7a979b5b59408440343853727cc21e..a8001d3a87fa893a8fb81099cd127eb10430d8a4 100644
--- a/spec/models/pod_spec.rb
+++ b/spec/models/pod_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Pod, type: :model do
   describe ".find_or_create_by" do
     it "takes a url, and makes one by host" do
diff --git a/spec/models/poll_answer_spec.rb b/spec/models/poll_answer_spec.rb
index 780f2b7b325336a91d49ea455ac2b399d27c4e07..b670cb09d58b78a0e90749d4c7ec64cf51c1270d 100644
--- a/spec/models/poll_answer_spec.rb
+++ b/spec/models/poll_answer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PollAnswer, :type => :model do
   before do
     @status = FactoryGirl.create(:status_message_with_poll)
diff --git a/spec/models/poll_participation_signature_spec.rb b/spec/models/poll_participation_signature_spec.rb
index 181b4d94f82a2e71ca206b61f295901cfa812e28..52c774ff158f7332f3a92c4bd93eff03ae169303 100644
--- a/spec/models/poll_participation_signature_spec.rb
+++ b/spec/models/poll_participation_signature_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/poll_participation_spec.rb b/spec/models/poll_participation_spec.rb
index 677da69f0c6dcd6edcac0644a83034e784c0b0e6..581be0663216bf504c12e08beb7ddd7fe8f0e1c4 100644
--- a/spec/models/poll_participation_spec.rb
+++ b/spec/models/poll_participation_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PollParticipation, type: :model do
   let(:status) { bob.post(:status_message, text: "hello", to: bob.aspects.first.id) }
   let(:poll) { Poll.new(question: "Who is in charge?") }
diff --git a/spec/models/poll_spec.rb b/spec/models/poll_spec.rb
index f18eb4faba3cc23e95d0b834deec45c24f5b33f8..382fae7f7ed1398650d78a948d423ba05c0e65ae 100644
--- a/spec/models/poll_spec.rb
+++ b/spec/models/poll_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Poll, type: :model do
   let(:status) { FactoryGirl.create(:status_message) }
   let(:poll) { Poll.new(question: "What do you think about apples?", status_message: status) }
@@ -20,4 +22,23 @@ describe Poll, type: :model do
       expect(poll.errors).to have_key(:question)
     end
   end
+
+  describe "poll_participation" do
+    it "should return the answer object after a user voted in a poll" do
+      answer = poll.poll_answers.build(answer: "1")
+      answer.poll = poll
+      poll.poll_answers.build(answer: "2").poll = poll
+      poll.save
+      participation = poll.poll_participations.create(poll_answer: answer, author: alice.person)
+      expect(poll.participation_answer(alice)).to eql(participation)
+    end
+
+    it "should return nil if a user did not participate in a poll" do
+      answer = poll.poll_answers.build(answer: "1")
+      answer.poll = poll
+      poll.poll_answers.build(answer: "2").poll = poll
+      poll.save
+      expect(poll.participation_answer(alice)).to eql(nil)
+    end
+  end
 end
diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb
index fdfc1f4b433f2f56ade5b0ff4b09b5afe23f5763..98f38ff6f1f0b370ec1d995f03232bdc5e40c4b4 100644
--- a/spec/models/post_spec.rb
+++ b/spec/models/post_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -387,4 +389,13 @@ describe Post, :type => :model do
       expect(post.interacted_at).not_to be_blank
     end
   end
+
+  describe "#before_destroy" do
+    it "removes root_guid from reshares" do
+      post = FactoryGirl.create(:status_message, author: alice.person, public: true)
+      reshare = FactoryGirl.create(:reshare, author: bob.person, root: post)
+      post.destroy!
+      expect(reshare.reload.root_guid).to be_nil
+    end
+  end
 end
diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb
index 678dc677c043ce9951076910cc3a06f44acc74d7..a6d941d1db5232889924243e56cfe186bb81fade 100644
--- a/spec/models/profile_spec.rb
+++ b/spec/models/profile_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/reference_spec.rb b/spec/models/reference_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6d5514e325bc9f46bccf95d3f91ef473dd156a63
--- /dev/null
+++ b/spec/models/reference_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+describe Reference, type: :model do
+  context "validation" do
+    it "validates a valid reference" do
+      expect(FactoryGirl.build(:reference)).to be_valid
+    end
+
+    it "requires a source" do
+      expect(FactoryGirl.build(:reference, source: nil)).not_to be_valid
+    end
+
+    it "requires a target" do
+      expect(FactoryGirl.build(:reference, target: nil)).not_to be_valid
+    end
+
+    it "disallows to link the same target twice from one source" do
+      reference = FactoryGirl.create(:reference)
+      expect(FactoryGirl.build(:reference, source: reference.source, target: reference.target)).not_to be_valid
+    end
+  end
+end
diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb
index 12b843656e7a605895c3e8a50dc5c4661eec8ace..662768f4ffc83248d1ab1c5e54380ac26dfab542 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/reshare_spec.rb b/spec/models/reshare_spec.rb
index b861065ea14756a34947400d12a765d273f751a2..39cbbcbf2fbf201b9dc0eee7f6a515ca020a2efa 100644
--- a/spec/models/reshare_spec.rb
+++ b/spec/models/reshare_spec.rb
@@ -1,17 +1,50 @@
+# frozen_string_literal: true
+
 describe Reshare, type: :model do
   it "has a valid Factory" do
     expect(FactoryGirl.build(:reshare)).to be_valid
   end
 
-  it "requires root" do
-    reshare = FactoryGirl.build(:reshare, root: nil)
-    expect(reshare).not_to be_valid
-  end
+  context "validation" do
+    it "requires root when the author is local" do
+      reshare = FactoryGirl.build(:reshare, root: nil, author: alice.person)
+      expect(reshare).not_to be_valid
+    end
+
+    it "doesn't require root when the author is remote" do
+      reshare = FactoryGirl.build(:reshare, root: nil, author: remote_raphael)
+      expect(reshare).to be_valid
+    end
+
+    it "require public root" do
+      reshare = FactoryGirl.build(:reshare, root: FactoryGirl.create(:status_message, public: false))
+      expect(reshare).not_to be_valid
+      expect(reshare.errors[:base]).to include("Only posts which are public may be reshared.")
+    end
+
+    it "allows two reshares without a root" do
+      reshare1 = FactoryGirl.create(:reshare, author: alice.person)
+      reshare2 = FactoryGirl.create(:reshare, author: alice.person)
 
-  it "require public root" do
-    reshare = FactoryGirl.build(:reshare, root: FactoryGirl.create(:status_message, public: false))
-    expect(reshare).not_to be_valid
-    expect(reshare.errors[:base]).to include("Only posts which are public may be reshared.")
+      reshare1.update_attributes(root_guid: nil)
+
+      reshare2.root_guid = nil
+      expect(reshare2).to be_valid
+    end
+
+    it "doesn't allow to reshare the same post twice" do
+      post = FactoryGirl.create(:status_message, public: true)
+      FactoryGirl.create(:reshare, author: alice.person, root: post)
+
+      expect(FactoryGirl.build(:reshare, author: alice.person, root: post)).not_to be_valid
+    end
+
+    it "allows to reshare the same post with different people" do
+      post = FactoryGirl.create(:status_message, public: true)
+      FactoryGirl.create(:reshare, author: alice.person, root: post)
+
+      expect(FactoryGirl.build(:reshare, author: bob.person, root: post)).to be_valid
+    end
   end
 
   it "forces public" do
diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb
index dad31a04d7af7a81f95c2a0de080c8704e3caa3f..051f63b67b60bbbb9c01295a26f108d454121075 100644
--- a/spec/models/role_spec.rb
+++ b/spec/models/role_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Role do
   let!(:person) { create(:person) }
   let!(:admin) { create(:person) }
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index b15287a380e7a169c6b0fcdccd060278bd25547c..57223b981bdeca7fd1272e70f10a6660c0a50f7c 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Service, :type => :model do
   before do
     @post = alice.post(:status_message, :text => "hello", :to => alice.aspects.first.id)
diff --git a/spec/models/services/facebook_spec.rb b/spec/models/services/facebook_spec.rb
index ec5176b4cd818e47d4e4bb386af3e7596fc9ec2d..b0ba24605b39beb65bdd11393a9bed086fe0b345 100644
--- a/spec/models/services/facebook_spec.rb
+++ b/spec/models/services/facebook_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Services::Facebook, :type => :model do
   before do
     @user = alice
diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb
index 43113a590991d8e5514c718b373f51555a278349..0da20eb37afd3879d346a984a20d27003a4f8ca7 100644
--- a/spec/models/services/tumblr_spec.rb
+++ b/spec/models/services/tumblr_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Services::Tumblr, type: :model do
   let(:user) { alice }
   let(:post) { user.post(:status_message, text: "hello", to: user.aspects.first.id) }
diff --git a/spec/models/services/twitter_spec.rb b/spec/models/services/twitter_spec.rb
index 79469a8c101e3da2c93b61118e80b4fabf28b6a0..a2b10c617cc068d3815b1366c821f0bb26a0ded8 100644
--- a/spec/models/services/twitter_spec.rb
+++ b/spec/models/services/twitter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Services::Twitter, :type => :model do
   before do
     @user = alice
diff --git a/spec/models/services/wordpress_spec.rb b/spec/models/services/wordpress_spec.rb
index 4b52ae34aaae40dc93a630bbb183887a72967864..82e971539a7aeebe225f4a244a6847169f9bd010 100644
--- a/spec/models/services/wordpress_spec.rb
+++ b/spec/models/services/wordpress_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Services::Wordpress, type: :model do
   before do
     @user = alice
diff --git a/spec/models/share_visibility_spec.rb b/spec/models/share_visibility_spec.rb
index a4ba6f361884b0f9dde4732418e10922869d4e53..0efc50820b619e7c886abeed3419f6a61a240b2b 100644
--- a/spec/models/share_visibility_spec.rb
+++ b/spec/models/share_visibility_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/signature_order_spec.rb b/spec/models/signature_order_spec.rb
index e3d2072818b6d563e43768ca609150a33975cb52..795c6b57dcea5d3facf44785b693f06ad1900996 100644
--- a/spec/models/signature_order_spec.rb
+++ b/spec/models/signature_order_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb
index d7632958e1e3b95291fd8e3c045bc574484bf0c3..8dfca6f67e9e5f4952a8e114faf772d766f1c41f 100644
--- a/spec/models/status_message_spec.rb
+++ b/spec/models/status_message_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -145,6 +147,9 @@ describe StatusMessage, type: :model do
     end
   end
 
+  it_behaves_like "a reference source"
+  it_behaves_like "a reference target"
+
   describe "#nsfw" do
     it "returns MatchObject (true) if the post contains #nsfw (however capitalised)" do
       status = FactoryGirl.build(:status_message, text: "This message is #nSFw")
@@ -231,6 +236,23 @@ describe StatusMessage, type: :model do
     end
   end
 
+  describe "poll" do
+    it "destroys the poll (with all answers and participations) when the status message is destroyed" do
+      poll = FactoryGirl.create(:poll_participation).poll
+      status_message = poll.status_message
+
+      poll_id = poll.id
+      poll_answers = poll.poll_answers.map(&:id)
+      poll_participations = poll.poll_participations.map(&:id)
+
+      status_message.destroy
+
+      expect(Poll.where(id: poll_id)).not_to exist
+      poll_answers.each {|id| expect(PollAnswer.where(id: id)).not_to exist }
+      poll_participations.each {|id| expect(PollParticipation.where(id: id)).not_to exist }
+    end
+  end
+
   describe "validation" do
     let(:status_message) { build(:status_message, text: @message_text) }
 
diff --git a/spec/models/tag_following_spec.rb b/spec/models/tag_following_spec.rb
index cc159a2555db8cacda9d69e09431b29837287bfe..ee5fa80b0b537cc3e84c560bb405705410c031e7 100644
--- a/spec/models/tag_following_spec.rb
+++ b/spec/models/tag_following_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe TagFollowing, :type => :model do
   before do
     @tag = FactoryGirl.build(:tag)
diff --git a/spec/models/user/authentication_token_spec.rb b/spec/models/user/authentication_token_spec.rb
index f43a4155788cfc8fb575ddc1d220f396038d693f..73cce8fc3443f210dbe697c7f3cfd451d462e4f6 100644
--- a/spec/models/user/authentication_token_spec.rb
+++ b/spec/models/user/authentication_token_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe User::AuthenticationToken, type: :model do
   describe "#reset_authentication_token!" do
     it "sets the authentication token" do
diff --git a/spec/models/user/connecting_spec.rb b/spec/models/user/connecting_spec.rb
index 2d6d53f9d84c2a5d696ae20a11a7c99816b6fdb1..c31ce1004f7948f7af3bfbf906300b534dfd538f 100644
--- a/spec/models/user/connecting_spec.rb
+++ b/spec/models/user/connecting_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -102,6 +104,16 @@ describe User::Connecting, type: :model do
           alice.disconnect(contact)
         }.to change(contact.aspects, :count).from(2).to(0)
       end
+
+      it "raises when a contact for an improperly deleted user was passed" do
+        contact = alice.contact_for(bob.person)
+
+        bob.delete
+        expect {
+          alice.disconnect(contact)
+        }.to raise_error "FATAL: user entry is missing from the DB. Aborting"
+        expect(Contact.where(id: contact.id)).to exist
+      end
     end
   end
 
diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb
index dd24509ed35fa110606f792401b0c9b2e326a63e..4998d48dc6c62e7e003fd0ea8854165ac1d48868 100644
--- a/spec/models/user/posting_spec.rb
+++ b/spec/models/user/posting_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/user/querying_spec.rb b/spec/models/user/querying_spec.rb
index 18ea07dfdcdc5b2f725ba8c911c8c77263cac7b3..53843a7bc9e80516c1b7344381debcb9789a8dab 100644
--- a/spec/models/user/querying_spec.rb
+++ b/spec/models/user/querying_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/models/user/social_actions_spec.rb b/spec/models/user/social_actions_spec.rb
index 3f4ff57b39f8edfbe4a73088724a82f210ad0e98..43065ef62a944bf72aa8de2a9f83d26a39cf4047 100644
--- a/spec/models/user/social_actions_spec.rb
+++ b/spec/models/user/social_actions_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe User::SocialActions, type: :model do
   let(:status) { FactoryGirl.create(:status_message, public: true, author: bob.person) }
 
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 3f1ced13cc287d305febb4aab5061274ad1c8ceb..761dafaa4a817b177b275a62e77395f4e0c7bed8 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe UserPreference, :type => :model do
   it 'should only allow valid email types to exist' do
     pref = alice.user_preferences.new(:email_type => 'not_valid')
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index c74969c0e9c6b24130ef2afeafb0abae2ac71a4d..913e3c735b06c0c63f7121bac041e3378e995198 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -563,16 +565,11 @@ describe User, :type => :model do
     end
   end
 
-  describe 'account deletion' do
-    describe '#destroy' do
-      it 'removes all service connections' do
-        Services::Facebook.create(:access_token => 'what', :user_id => alice.id)
-        expect {
-          alice.destroy
-        }.to change {
-          alice.services.count
-        }.by(-1)
-      end
+  describe "#destroy" do
+    it "raises error" do
+      expect {
+        alice.destroy
+      }.to raise_error "Never destroy users!"
     end
   end
 
@@ -979,6 +976,17 @@ describe User, :type => :model do
     end
   end
 
+  describe "#export" do
+    it "doesn't change the filename when the user is saved" do
+      user = FactoryGirl.create(:user)
+
+      filename = user.export.filename
+      user.save!
+
+      expect(User.find(user.id).export.filename).to eq(filename)
+    end
+  end
+
   describe "queue_export" do
     it "queues up a job to perform the export" do
       user = FactoryGirl.create(:user)
diff --git a/spec/presenters/aspect_membership_presenter_spec.rb b/spec/presenters/aspect_membership_presenter_spec.rb
index 971fdb9e4f09216799da6e2f1a6c04aedc16df3a..4ee5ea206cc9d189f2490bbb4c6a3be7f904be60 100644
--- a/spec/presenters/aspect_membership_presenter_spec.rb
+++ b/spec/presenters/aspect_membership_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe AspectMembershipPresenter do
   before do
     @am = alice.aspects.where(:name => "generic").first.aspect_memberships.first
diff --git a/spec/presenters/aspect_presenter_spec.rb b/spec/presenters/aspect_presenter_spec.rb
index 74dd52a410a0a4b699d995422547748f22e42eb0..fd4d528308432b3bc9d38f6b1d7367e83d37436a 100644
--- a/spec/presenters/aspect_presenter_spec.rb
+++ b/spec/presenters/aspect_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe AspectPresenter do
   before do
     @presenter = AspectPresenter.new(bob.aspects.first)
diff --git a/spec/presenters/avatar_presenter_spec.rb b/spec/presenters/avatar_presenter_spec.rb
index f51b4ef834e0484cd0bb4ff126f62054ade42672..c025d0f6decca7d6b26da2052f8a314d177a74aa 100644
--- a/spec/presenters/avatar_presenter_spec.rb
+++ b/spec/presenters/avatar_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe AvatarPresenter do
   describe "#base_hash" do
     it "calls image_url() for the avatars" do
diff --git a/spec/presenters/base_presenter_spec.rb b/spec/presenters/base_presenter_spec.rb
index 108594c019db9f1754274ad536ee462c255cadb0..8ee2ba5d8064ea81eda32a579b1f5d0d52112fd4 100644
--- a/spec/presenters/base_presenter_spec.rb
+++ b/spec/presenters/base_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe BasePresenter do
   it "falls back to nil" do
     p = BasePresenter.new(nil)
diff --git a/spec/presenters/contact_presenter_spec.rb b/spec/presenters/contact_presenter_spec.rb
index dc24a0b3a1e499da5731a62c4b47917c24cde1e5..feaa204e412afa7dcb482e6e17f9bf584247467d 100644
--- a/spec/presenters/contact_presenter_spec.rb
+++ b/spec/presenters/contact_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ContactPresenter do
   before do
     @presenter = ContactPresenter.new(alice.contact_for(bob.person), alice)
diff --git a/spec/presenters/node_info_presenter_spec.rb b/spec/presenters/node_info_presenter_spec.rb
index 737ee07f75f7a4df7aedce52fa38103d51fcc0e2..8dcc0894b1bb1825c7ea014dca63a2ca80182473 100644
--- a/spec/presenters/node_info_presenter_spec.rb
+++ b/spec/presenters/node_info_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NodeInfoPresenter do
   let(:presenter) { NodeInfoPresenter.new("1.0") }
   let(:hash) { presenter.as_json.as_json }
@@ -37,7 +39,12 @@ describe NodeInfoPresenter do
         },
         "metadata"          => {
           "nodeName" => AppConfig.settings.pod_name,
-          "xmppChat" => AppConfig.chat.enabled?
+          "xmppChat" => AppConfig.chat.enabled?,
+          "camo"     => {
+            "markdown"   => AppConfig.privacy.camo.proxy_markdown_images?,
+            "opengraph"  => AppConfig.privacy.camo.proxy_opengraph_thumbnails?,
+            "remotePods" => AppConfig.privacy.camo.proxy_remote_pod_images?
+          }
         }
       )
     end
@@ -129,6 +136,22 @@ describe NodeInfoPresenter do
       end
     end
 
+    context "when camo is enabled" do
+      before do
+        AppConfig.privacy.camo.proxy_markdown_images = true
+        AppConfig.privacy.camo.proxy_opengraph_thumbnails = true
+        AppConfig.privacy.camo.proxy_remote_pod_images = true
+      end
+
+      it "should list enabled camo options in the metadata as true" do
+        expect(hash).to include "metadata" => include("camo" => {
+                                                        "markdown"   => true,
+                                                        "opengraph"  => true,
+                                                        "remotePods" => true
+                                                      })
+      end
+    end
+
     context "when admin account is set" do
       before do
         AppConfig.admins.account = "podmin"
@@ -158,7 +181,12 @@ describe NodeInfoPresenter do
           },
           "metadata"          => {
             "nodeName" => AppConfig.settings.pod_name,
-            "xmppChat" => AppConfig.chat.enabled?
+            "xmppChat" => AppConfig.chat.enabled?,
+            "camo"     => {
+              "markdown"   => AppConfig.privacy.camo.proxy_markdown_images?,
+              "opengraph"  => AppConfig.privacy.camo.proxy_opengraph_thumbnails?,
+              "remotePods" => AppConfig.privacy.camo.proxy_remote_pod_images?
+            }
           }
         )
       end
diff --git a/spec/presenters/o_embed_presenter_spec.rb b/spec/presenters/o_embed_presenter_spec.rb
index 55c19a80eb88faeb25459b0f9f0a0ac491a9c58d..355598a71dfeed9b2740eeed06059d4dc1480e7e 100644
--- a/spec/presenters/o_embed_presenter_spec.rb
+++ b/spec/presenters/o_embed_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe OEmbedPresenter do
   before do
    @oembed = OEmbedPresenter.new(FactoryGirl.create(:status_message))
diff --git a/spec/presenters/person_presenter_spec.rb b/spec/presenters/person_presenter_spec.rb
index c21965f9b47327640af447d51caa8975a35d6067..e2a6da75ad6a5b7dac372166a8688375e7bdc83d 100644
--- a/spec/presenters/person_presenter_spec.rb
+++ b/spec/presenters/person_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PersonPresenter do
   let(:profile_user) { FactoryGirl.create(:user_with_aspect) }
   let(:person) { profile_user.person }
diff --git a/spec/presenters/post_interaction_presenter_spec.rb b/spec/presenters/post_interaction_presenter_spec.rb
index c7306a37a85d6729559f18af2b2937d1c2a996f4..4623493fd81589744a0996ca2da3476202d15562 100644
--- a/spec/presenters/post_interaction_presenter_spec.rb
+++ b/spec/presenters/post_interaction_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PostInteractionPresenter do
   let(:status_message_without_participation) {
     FactoryGirl.create(:status_message_without_participation)
diff --git a/spec/presenters/post_presenter_spec.rb b/spec/presenters/post_presenter_spec.rb
index 4110cedeb319f4d9d558e8bbc60a06391ee503c2..14974d07388556b3ae4adb25d2aa43678382db9b 100644
--- a/spec/presenters/post_presenter_spec.rb
+++ b/spec/presenters/post_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PostPresenter do
   let(:status_message) { FactoryGirl.create(:status_message, public: true) }
   let(:status_message_with_poll) { FactoryGirl.create(:status_message_with_poll, public: true) }
@@ -135,6 +137,19 @@ describe PostPresenter do
       presenter = PostPresenter.new(status_message_with_poll)
       expect(presenter.as_json).to be_a(Hash)
     end
+
+    it "returns the answer id of the current user's poll participation" do
+      presenter = PostPresenter.new(status_message_with_poll, alice)
+      poll_answer = status_message_with_poll.poll.poll_answers.first
+      poll_participation = status_message_with_poll.poll.poll_participations
+      poll_participation = poll_participation.create(poll_answer: poll_answer, author: alice.person)
+      expect(presenter.as_json[:poll_participation_answer_id]).to eql(poll_participation.poll_answer_id)
+    end
+
+    it "returns nil if the user did not participate in a poll" do
+      presenter = PostPresenter.new(status_message_with_poll, alice)
+      expect(presenter.as_json[:poll_participation_answer_id]).to eql(nil)
+    end
   end
 
   describe "#tags" do
diff --git a/spec/presenters/profile_presenter_spec.rb b/spec/presenters/profile_presenter_spec.rb
index 8084490e6f6b9c1382f86e889cb0c8d6933cadfb..44167a150b338434e388fc636d7920288c83c5f7 100644
--- a/spec/presenters/profile_presenter_spec.rb
+++ b/spec/presenters/profile_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ProfilePresenter do
   let(:profile) { FactoryGirl.create(:profile_with_image_url, person: alice.person) }
 
diff --git a/spec/presenters/service_presenter_spec.rb b/spec/presenters/service_presenter_spec.rb
index 997952795cbe6db14caff6ee0166373bc509b1ec..f9d13cb925bb465f2e3d69b182d36d9989efc3cf 100644
--- a/spec/presenters/service_presenter_spec.rb
+++ b/spec/presenters/service_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ServicePresenter do
   describe '#as_json' do
     it 'includes the provider name of the json' do
diff --git a/spec/presenters/social_relay_presenter_spec.rb b/spec/presenters/social_relay_presenter_spec.rb
index 61a80edf8074dce66177d3954324ff4d1a430932..3e8215f9c184250011ebc132b266afe772b75b74 100644
--- a/spec/presenters/social_relay_presenter_spec.rb
+++ b/spec/presenters/social_relay_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe SocialRelayPresenter do
   before do
     @presenter = SocialRelayPresenter.new
diff --git a/spec/presenters/user_presenter_spec.rb b/spec/presenters/user_presenter_spec.rb
index eeb4633162adae95fd75f71a0b8fd60205b1ab5b..9c08820bb666d9161973450112f623f8a8a2c52b 100644
--- a/spec/presenters/user_presenter_spec.rb
+++ b/spec/presenters/user_presenter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe UserPresenter do
   before do
     @presenter = UserPresenter.new(bob, [])
diff --git a/spec/serializers/export/aspect_serializer_spec.rb b/spec/serializers/export/aspect_serializer_spec.rb
index bc33997573176be93f92aedd145cd2d5c5d747cc..bd13b7b2b3ab8021b7615675927ee11a6a59ab9a 100644
--- a/spec/serializers/export/aspect_serializer_spec.rb
+++ b/spec/serializers/export/aspect_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Export::AspectSerializer do
   let(:aspect) { FactoryGirl.create(:aspect) }
   let(:serializer) { Export::AspectSerializer.new(aspect) }
diff --git a/spec/serializers/export/contact_serializer_spec.rb b/spec/serializers/export/contact_serializer_spec.rb
index c2578e647171ab35f445d7630474b2639a444010..53be08f272227e0c1941e8fc68f2ba8b08c7e8cb 100644
--- a/spec/serializers/export/contact_serializer_spec.rb
+++ b/spec/serializers/export/contact_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Export::ContactSerializer do
   let(:contact) { FactoryGirl.create(:contact) }
   let(:serializer) { Export::ContactSerializer.new(contact) }
diff --git a/spec/serializers/export/others_data_serializer_spec.rb b/spec/serializers/export/others_data_serializer_spec.rb
index 81d9be47805d0e14a13efd0e7a45f783c22b4608..2c40adfb80c08196e728716dfbdefb14510e9787 100644
--- a/spec/serializers/export/others_data_serializer_spec.rb
+++ b/spec/serializers/export/others_data_serializer_spec.rb
@@ -1,14 +1,8 @@
+# frozen_string_literal: true
+
 describe Export::OthersDataSerializer do
   let(:user) { FactoryGirl.create(:user) }
-  let(:serializer) { Export::OthersDataSerializer.new(user) }
-  let(:others_posts) {
-    [
-      *user.person.likes.map(&:target),
-      *user.person.comments.map(&:parent),
-      *user.person.posts.reshares.map(&:root),
-      *user.person.poll_participations.map(&:status_message)
-    ]
-  }
+  let(:serializer) { Export::OthersDataSerializer.new(user.id) }
 
   it "uses FederationEntitySerializer for array serializing relayables" do
     sm = DataGenerator.new(user).status_message_with_activity
@@ -23,21 +17,5 @@ describe Export::OthersDataSerializer do
     before do
       DataGenerator.new(user).activity
     end
-
-    it "uses FederationEntitySerializer for array serializing posts" do
-      expect(Export::OthersDataSerializer).to serialize_association(:posts)
-        .with_each_serializer(FederationEntitySerializer)
-        .with_objects(others_posts)
-      serializer.associations
-    end
-
-    it "uses PersonMetadataSerializer for array serializing non_contact_authors" do
-      non_contact_authors = others_posts.map(&:author)
-
-      expect(Export::OthersDataSerializer).to serialize_association(:non_contact_authors)
-        .with_each_serializer(Export::PersonMetadataSerializer)
-        .with_objects(non_contact_authors)
-      serializer.associations
-    end
   end
 end
diff --git a/spec/serializers/export/own_post_serializer_spec.rb b/spec/serializers/export/own_post_serializer_spec.rb
index 91228ccf84de39c1649a14637e1d5d1d7b5cff6c..b9580785f8b6514ddf5dc0efb1ac856c78db6e2e 100644
--- a/spec/serializers/export/own_post_serializer_spec.rb
+++ b/spec/serializers/export/own_post_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Export::OwnPostSerializer do
   let(:author) { FactoryGirl.create(:user_with_aspect).person }
 
diff --git a/spec/serializers/export/own_relayables_serializer_spec.rb b/spec/serializers/export/own_relayables_serializer_spec.rb
index 9906cdf9bc15e833422ba27ecd1c0c41f2897384..d11dee61d8593c7ebcfab1021dc104a6c6515599 100644
--- a/spec/serializers/export/own_relayables_serializer_spec.rb
+++ b/spec/serializers/export/own_relayables_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Export::OwnRelayablesSerializer do
   let(:comment) { FactoryGirl.create(:comment) }
   let!(:signature) { FactoryGirl.create(:comment_signature, comment: comment) }
diff --git a/spec/serializers/export/person_metadata_serializer_spec.rb b/spec/serializers/export/person_metadata_serializer_spec.rb
deleted file mode 100644
index d284c303e5ac7f332e65c7c8cb0e858e61ae5e86..0000000000000000000000000000000000000000
--- a/spec/serializers/export/person_metadata_serializer_spec.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-describe Export::PersonMetadataSerializer do
-  let(:person) { FactoryGirl.create(:person) }
-  let(:serializer) { Export::PersonMetadataSerializer.new(person) }
-
-  it "has person metadata attributes" do
-    expect(serializer.attributes).to eq(
-      guid:       person.guid,
-      account_id: person.diaspora_handle,
-      public_key: person.serialized_public_key
-    )
-  end
-end
diff --git a/spec/serializers/export/user_serializer_spec.rb b/spec/serializers/export/user_serializer_spec.rb
index e5022e5fd5eabf5967b5e52a190bcec0e8ceb79b..a316ef3d9b69626d3550b3898490625b3b2051a0 100644
--- a/spec/serializers/export/user_serializer_spec.rb
+++ b/spec/serializers/export/user_serializer_spec.rb
@@ -1,6 +1,8 @@
+# frozen_string_literal: true
+
 describe Export::UserSerializer do
   let(:user) { FactoryGirl.create(:user) }
-  let(:serializer) { Export::UserSerializer.new(user, root: false) }
+  let(:serializer) { Export::UserSerializer.new(user.id, root: false) }
 
   it "has basic user's attributes" do
     expect(serializer.attributes).to eq(
diff --git a/spec/serializers/federation_entity_serializer_spec.rb b/spec/serializers/federation_entity_serializer_spec.rb
index 7dcbd3bdf35f048d966c646c0ccf78b3561e1f7f..88a3a8d3cbe4c31c974519eda64e5cf76932cb7a 100644
--- a/spec/serializers/federation_entity_serializer_spec.rb
+++ b/spec/serializers/federation_entity_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe FederationEntitySerializer do
   class TestEntity < DiasporaFederation::Entity
     property :test, :string
diff --git a/spec/serializers/notification_serializer_spec.rb b/spec/serializers/notification_serializer_spec.rb
index 156dc5ee5525e2b2470cc2846cf9249dd63b7704..3a5b5f9145ffd915d42494d448f1d1da2d172ba6 100644
--- a/spec/serializers/notification_serializer_spec.rb
+++ b/spec/serializers/notification_serializer_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NotificationSerializer do
   let(:notifications_controller) { NotificationsController.new }
 
diff --git a/spec/serializers/serializer_post_processing_spec.rb b/spec/serializers/serializer_post_processing_spec.rb
index 8cb140fd6521c9a272c6ac03774eb0bf1a521b4a..3880aca53721f9f5a53bae39920e9dbad9c811c5 100644
--- a/spec/serializers/serializer_post_processing_spec.rb
+++ b/spec/serializers/serializer_post_processing_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe SerializerPostProcessing do
   describe "#modify_serializable_object" do
     it "allows to modify serializable object of ActiveModel::Serializer ancestor" do
diff --git a/spec/services/comment_service_spec.rb b/spec/services/comment_service_spec.rb
index 9ec6facffc103f1fffb420f212dcbc4b81c08e53..c04002cdc8a2bca3f579125c059b5fba9241a424 100644
--- a/spec/services/comment_service_spec.rb
+++ b/spec/services/comment_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe CommentService do
   let(:post) { alice.post(:status_message, text: "hello", to: alice.aspects.first) }
 
diff --git a/spec/services/like_service_spec.rb b/spec/services/like_service_spec.rb
index 2d711b6126baaf6eba3655010c6c53bda84d2cda..59d890fe029b6832fb19a55ee40630fb85de5757 100644
--- a/spec/services/like_service_spec.rb
+++ b/spec/services/like_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe LikeService do
   let(:post) { alice.post(:status_message, text: "hello", to: alice.aspects.first) }
 
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 8ef4bec5d762ce0bd78c201ec48d5d843fb29f77..e690b8de89f50f99515247f10648b467a3e68663 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe NotificationService do
   describe "notification interrelation" do
     context "with mention in comment" do
diff --git a/spec/services/post_service_spec.rb b/spec/services/post_service_spec.rb
index 5dd889b72c51f98bd974bfaf57481a8f2a62b052..21fdf7a241b657a0d743a4d58703b5383aa6a96b 100644
--- a/spec/services/post_service_spec.rb
+++ b/spec/services/post_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe PostService do
   let(:post) { alice.post(:status_message, text: "ohai", to: alice.aspects.first) }
   let(:public) { alice.post(:status_message, text: "hey", public: true) }
@@ -332,7 +334,7 @@ describe PostService do
           end
         end
 
-        shared_examples "current user can't mention himself" do
+        shared_examples "current user can't mention themself" do
           before do
             current_user.profile.update(first_name: "Ro#{r_str}")
           end
@@ -345,7 +347,7 @@ describe PostService do
         context "when current user is a post author" do
           let(:post_author) { current_user.person }
 
-          include_examples "current user can't mention himself"
+          include_examples "current user can't mention themself"
         end
 
         context "current user is a participant" do
@@ -354,11 +356,11 @@ describe PostService do
             current_user.comment!(post, "hello")
           end
 
-          include_examples "current user can't mention himself"
+          include_examples "current user can't mention themself"
         end
 
         context "current user is a stranger matching a search pattern" do
-          include_examples "current user can't mention himself"
+          include_examples "current user can't mention themself"
         end
 
         it "doesn't fail when the post author doesn't match the requested pattern" do
diff --git a/spec/services/reshare_service.rb b/spec/services/reshare_service.rb
index 4541b64e2a22b1df5733d18944d72c6fcf7f22b8..efff5038653abf0e617730beba06723abcd6d0f4 100644
--- a/spec/services/reshare_service.rb
+++ b/spec/services/reshare_service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe ReshareService do
   let(:post) { alice.post(:status_message, text: "hello", public: true) }
 
diff --git a/spec/services/status_message_creation_service_spec.rb b/spec/services/status_message_creation_service_spec.rb
index 47838d172f66729f17ca6d35b376780609d0da60..a7b9f05c311c6ccc5a0f3dd30528b9a0bd4c04a3 100644
--- a/spec/services/status_message_creation_service_spec.rb
+++ b/spec/services/status_message_creation_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe StatusMessageCreationService do
   describe "#create" do
     let(:aspect) { alice.aspects.first }
diff --git a/spec/shared_behaviors/account_deletion.rb b/spec/shared_behaviors/account_deletion.rb
index 2f7b8f8d9bf4f307cf55911ab3a75c6ea4c0996e..d4019937a94e64de9435d3e2620cbf339728d5f7 100644
--- a/spec/shared_behaviors/account_deletion.rb
+++ b/spec/shared_behaviors/account_deletion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/shared_behaviors/account_migration.rb b/spec/shared_behaviors/account_migration.rb
index 5da2f3b620c7ee7570abf1e29279f3677af947d2..7187c44c38a890d70b5a35e17ea583dddbe3517d 100644
--- a/spec/shared_behaviors/account_migration.rb
+++ b/spec/shared_behaviors/account_migration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_context "with local old user" do
   let(:old_user) { FactoryGirl.create(:user) }
   let(:old_person) { old_user.person }
diff --git a/spec/shared_behaviors/dispatcher.rb b/spec/shared_behaviors/dispatcher.rb
index b168465d8d641d186ed79b5d9096c09765c72c8d..2b42dec005602ab5e3697dbdf6490805ae7db68d 100644
--- a/spec/shared_behaviors/dispatcher.rb
+++ b/spec/shared_behaviors/dispatcher.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples "a dispatcher" do
   describe "#dispatch" do
     context "deliver to user services" do
diff --git a/spec/shared_behaviors/federation_entity_serializer.rb b/spec/shared_behaviors/federation_entity_serializer.rb
index ef1505fc44883a0c8de9652326c3dbac1935fe6c..f8f103d4f6f1f7b7a1702be6414a665a876f0e14 100644
--- a/spec/shared_behaviors/federation_entity_serializer.rb
+++ b/spec/shared_behaviors/federation_entity_serializer.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "a federation entity serializer" do
   describe "#to_json" do
     it "contains JSON serialized entity object" do
diff --git a/spec/shared_behaviors/mentions_container.rb b/spec/shared_behaviors/mentions_container.rb
index 50e4efdc96fb0236d349a5b19f4d9037665a8a02..1378be9d3d864b86dbb62c598c994511d674d91e 100644
--- a/spec/shared_behaviors/mentions_container.rb
+++ b/spec/shared_behaviors/mentions_container.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "it is mentions container" do
   let(:people) { [alice, bob, eve].map(&:person) }
   let(:test_string) {
diff --git a/spec/shared_behaviors/receiving.rb b/spec/shared_behaviors/receiving.rb
index 99914742739b06c549b4f8c83391b6b0e858f755..6a563e2379a65f448fcb834e0d3861ccbafce221 100644
--- a/spec/shared_behaviors/receiving.rb
+++ b/spec/shared_behaviors/receiving.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "it ignores existing object received twice" do |klass|
   it "return nil if the #{klass} already exists" do
     expect(Diaspora::Federation::Receive.perform(entity)).not_to be_nil
@@ -13,7 +15,7 @@ shared_examples_for "it ignores existing object received twice" do |klass|
   end
 end
 
-shared_examples_for "it rejects if the parent author ignores the author" do |klass|
+shared_examples_for "it rejects if the root author ignores the author" do |klass|
   it "saves the relayable if the author is not ignored" do
     Diaspora::Federation::Receive.perform(entity)
 
diff --git a/spec/shared_behaviors/references.rb b/spec/shared_behaviors/references.rb
new file mode 100644
index 0000000000000000000000000000000000000000..61567a652e5327d7fcde1efd02dc3ca48673d8d6
--- /dev/null
+++ b/spec/shared_behaviors/references.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+shared_examples_for "a reference source" do
+  let!(:source) { FactoryGirl.create(described_class.to_s.underscore.to_sym) }
+  let!(:reference) { FactoryGirl.create(:reference, source: source) }
+
+  describe "references" do
+    it "returns the references" do
+      expect(source.references).to match_array([reference])
+    end
+
+    it "destroys the reference when the source is destroyed" do
+      source.destroy
+      expect(Reference.where(id: reference.id)).not_to exist
+    end
+  end
+
+  describe "#create_references" do
+    it "creates a reference for every referenced post after create" do
+      target1 = FactoryGirl.create(:status_message)
+      target2 = FactoryGirl.create(:status_message)
+      text = "Have a look at [this post](diaspora://#{target1.diaspora_handle}/post/#{target1.guid}) and " \
+             "this one too diaspora://#{target2.diaspora_handle}/post/#{target2.guid}."
+
+      post = FactoryGirl.build(described_class.to_s.underscore.to_sym, text: text)
+      post.save
+
+      expect(post.references.map(&:target).map(&:guid)).to match_array([target1, target2].map(&:guid))
+    end
+
+    it "only creates one reference, even when it is referenced twice" do
+      target = FactoryGirl.create(:status_message)
+      text = "Have a look at [this post](diaspora://#{target.diaspora_handle}/post/#{target.guid}) and " \
+             "this one too diaspora://#{target.diaspora_handle}/post/#{target.guid}."
+
+      post = FactoryGirl.build(described_class.to_s.underscore.to_sym, text: text)
+      post.save
+
+      expect(post.references.map(&:target).map(&:guid)).to match_array([target.guid])
+    end
+
+    it "only creates references, when the author of the known entity matches" do
+      target1 = FactoryGirl.create(:status_message)
+      target2 = FactoryGirl.create(:status_message)
+      text = "Have a look at [this post](diaspora://#{target1.diaspora_handle}/post/#{target1.guid}) and " \
+             "this one too diaspora://#{target1.diaspora_handle}/post/#{target2.guid}."
+
+      post = FactoryGirl.build(described_class.to_s.underscore.to_sym, text: text)
+      post.save
+
+      expect(post.references.map(&:target).map(&:guid)).to match_array([target1.guid])
+    end
+  end
+end
+
+shared_examples_for "a reference target" do
+  let!(:target) { FactoryGirl.create(described_class.to_s.underscore.to_sym) }
+  let!(:reference) { FactoryGirl.create(:reference, target: target) }
+
+  describe "referenced_by" do
+    it "returns the references where the target is referenced" do
+      expect(target.referenced_by).to match_array([reference])
+    end
+
+    it "destroys the reference when the target is destroyed" do
+      target.destroy
+      expect(Reference.where(id: reference.id)).not_to exist
+    end
+  end
+end
diff --git a/spec/shared_behaviors/relayable.rb b/spec/shared_behaviors/relayable.rb
index e50ab11615be4baf5172e7b35a1f80b8329befac..a80476c283ca8d82cdbb4b7a722760336f4b1164 100644
--- a/spec/shared_behaviors/relayable.rb
+++ b/spec/shared_behaviors/relayable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/shared_behaviors/shareable.rb b/spec/shared_behaviors/shareable.rb
index a857ab5a7dd345334434eebfa86a28a2ad7eb330..fba7aaeaea70b6705832393414774e13a2a7875f 100644
--- a/spec/shared_behaviors/shareable.rb
+++ b/spec/shared_behaviors/shareable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "a shareable" do
   describe "#subscribed_pods_uris" do
     let(:pods) { Array.new(3) { FactoryGirl.create(:pod) } }
diff --git a/spec/shared_behaviors/signature.rb b/spec/shared_behaviors/signature.rb
index 389cf2838089ca6460ebadf2e5443109c241bf31..61b1d87d5657a158c258f5aa5be23b362cdc1f9d 100644
--- a/spec/shared_behaviors/signature.rb
+++ b/spec/shared_behaviors/signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for "signature data" do
   let(:relayable) { FactoryGirl.create(relayable_type) }
   let(:signature) {
diff --git a/spec/shared_behaviors/stream.rb b/spec/shared_behaviors/stream.rb
index 91d00d513bac65eeefd2cc72509fe3d1fb9c6ab8..3b07486f26a17003117e7fd80ddfbe0b878bf96c 100644
--- a/spec/shared_behaviors/stream.rb
+++ b/spec/shared_behaviors/stream.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_examples_for 'it is a stream' do
   context 'required methods for display' do
     it '#title' do
diff --git a/spec/shared_behaviors/taggable.rb b/spec/shared_behaviors/taggable.rb
index d6accd6a4ddb0855253acf268e6446d6c6c786b2..6652d0766a9c20d67fe891a0fc1581fca04db125 100644
--- a/spec/shared_behaviors/taggable.rb
+++ b/spec/shared_behaviors/taggable.rb
@@ -1,4 +1,6 @@
 # coding: utf-8
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/spec-doc.rb b/spec/spec-doc.rb
deleted file mode 100644
index d1e778b120b208b6690f9423f633856352402b46..0000000000000000000000000000000000000000
--- a/spec/spec-doc.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-class SpecDoc
-  def initialize(response)
-    @html = Nokogiri::HTML(response.body)
-  end
-
-  def method_missing(method, *args)
-    @html.send method, *args
-  end
-
-  def has_content?(string)
-    escaped = string.gsub("'", "\\'")
-    @html.xpath("//*[contains(text(), '#{escaped}')]").any?
-  end
-  def has_no_content?(string)
-    ! has_content?(string)
-  end
-
-  def has_link?(text)
-    @html.xpath("//a[text()='#{text}']").any?
-  end
-end
-
-def doc
-  SpecDoc.new response
-end
diff --git a/spec/spec/data_generator_spec.rb b/spec/spec/data_generator_spec.rb
index 1e2800245a14574875d6c5ef8bd06abd08ded25e..5c6b46db6bcfb51a10ee04bda94120a18eabe0bf 100644
--- a/spec/spec/data_generator_spec.rb
+++ b/spec/spec/data_generator_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 RSpec::Matchers.define :have_subscribers do
   match do |posts|
     posts.map(&:subscribers).delete_if(&:empty?).any?
diff --git a/spec/spec/misc_spec.rb b/spec/spec/misc_spec.rb
index 494e8a91dedab81132ca70784b8e8315b7d73265..3690af9556225b8fda10a5c3df89588666612cc2 100644
--- a/spec/spec/misc_spec.rb
+++ b/spec/spec/misc_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 493ee8b3671f0ae075dd7743967ccf817cf22a78..8cb7fa13b6f19ceaaecf7ff529e08b33ea1bcf92 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
@@ -9,7 +11,6 @@ Coveralls.wear!('rails')
 
 require File.join(File.dirname(__FILE__), "..", "config", "environment")
 require Rails.root.join("spec", "helper_methods")
-require Rails.root.join("spec", "spec-doc")
 require "rspec/rails"
 require "webmock/rspec"
 require "factory_girl"
@@ -81,9 +82,6 @@ def client_assertion_with_nonexistent_client_id_path
                                                            "client_assertion_with_nonexistent_client_id.txt")
 end
 
-# Force fixture rebuild
-FileUtils.rm_f(Rails.root.join("tmp", "fixture_builder.yml"))
-
 # Requires supporting files with custom matchers and macros, etc,
 # in ./support/ and its subdirectories.
 fixture_builder_file = "#{File.dirname(__FILE__)}/support/fixture_builder.rb"
@@ -92,6 +90,9 @@ support_files.each {|f| require f }
 require fixture_builder_file
 
 RSpec.configure do |config|
+  config.fixture_path = Rails.root.join("spec", "fixtures")
+  config.global_fixtures = :all
+
   config.include Devise::Test::ControllerHelpers, type: :controller
   config.include Devise::Test::IntegrationHelpers, type: :request
   config.mock_with :rspec
diff --git a/spec/support/account_matchers.rb b/spec/support/account_matchers.rb
index 758e2b58371a0921760e68e9fbb0cbb305c24695..7be32e7b5bc92c0a7a9e57c3e06746177ba82521 100644
--- a/spec/support/account_matchers.rb
+++ b/spec/support/account_matchers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 RSpec::Matchers.define :be_a_discovered_person do
   match do |person|
     !Person.by_account_identifier(person.diaspora_handle).nil?
diff --git a/spec/support/data_generator.rb b/spec/support/data_generator.rb
index 77194201d9342dc527636cca1433a948a92c24f7..a2849a6f92880776f423627c83c04a28077d751a 100644
--- a/spec/support/data_generator.rb
+++ b/spec/support/data_generator.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # This is a helper class for tests that is capable of generating different sets of data, which are possibly
 # interrelated.
 class DataGenerator
diff --git a/spec/support/fake_http_request.rb b/spec/support/fake_http_request.rb
index f4f56e8683884858d1c940cbb08da6182425f642..be71ba5d51a6bc8fee3bd422efa2c8289c698a6a 100644
--- a/spec/support/fake_http_request.rb
+++ b/spec/support/fake_http_request.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class FakeHttpRequest
   def initialize(callback_wanted)
     @callback = callback_wanted
diff --git a/spec/support/fixture_builder.rb b/spec/support/fixture_builder.rb
index 7d8eb3a09e06f22790bc2e54cc968c1fd991b90e..242ebb03b0aa36d66ee9f9383b4c6d2c8be0bdad 100644
--- a/spec/support/fixture_builder.rb
+++ b/spec/support/fixture_builder.rb
@@ -1,45 +1,49 @@
-FixtureBuilder.configure do |fbuilder|
+# frozen_string_literal: true
 
-  # rebuild fixtures automatically when these files change:
-  fbuilder.files_to_check += Dir["app/models/*.rb", "lib/**/*.rb",  "spec/factories/*.rb", "spec/support/fixture_builder.rb"]
+def create_basic_users
+  # Users
+  alice = FactoryGirl.create(:user_with_aspect, username: "alice", strip_exif: false)
+  alices_aspect = alice.aspects.where(name: "generic").first
 
-  # now declare objects
-  fbuilder.factory do
-    # Users
-    alice = FactoryGirl.create(:user_with_aspect, :username => "alice", :strip_exif => false)
-    alices_aspect = alice.aspects.where(:name => "generic").first
+  eve = FactoryGirl.create(:user_with_aspect, username: "eve")
+  eves_aspect = eve.aspects.where(name: "generic").first
+
+  bob = FactoryGirl.create(:user_with_aspect, username: "bob")
+  bobs_aspect = bob.aspects.where(name: "generic").first
+  FactoryGirl.create(:aspect, name: "empty", user: bob)
 
-    eve   = FactoryGirl.create(:user_with_aspect, :username => "eve")
-    eves_aspect = eve.aspects.where(:name => "generic").first
+  connect_users(bob, bobs_aspect, alice, alices_aspect)
+  connect_users(bob, bobs_aspect, eve, eves_aspect)
 
-    bob   = FactoryGirl.create(:user_with_aspect, :username => "bob")
-    bobs_aspect = bob.aspects.where(:name => "generic").first
-    FactoryGirl.create(:aspect, :name => "empty", :user => bob)
+  # Set up friends - 2 local, 1 remote
+  local_luke = FactoryGirl.create(:user_with_aspect, username: "luke")
+  lukes_aspect = local_luke.aspects.where(name: "generic").first
 
-    connect_users(bob, bobs_aspect, alice, alices_aspect)
-    connect_users(bob, bobs_aspect, eve, eves_aspect)
+  local_leia = FactoryGirl.create(:user_with_aspect, username: "leia")
+  leias_aspect = local_leia.aspects.where(name: "generic").first
 
-    # Set up friends - 2 local, 1 remote
-    local_luke = FactoryGirl.create(:user_with_aspect, :username => "luke")
-    lukes_aspect = local_luke.aspects.where(:name => "generic").first
+  remote_raphael = FactoryGirl.create(:person, diaspora_handle: "raphael@remote.net")
 
-    local_leia = FactoryGirl.create(:user_with_aspect, :username => "leia")
-    leias_aspect = local_leia.aspects.where(:name => "generic").first
+  connect_users_with_aspects(local_luke, local_leia)
 
-    remote_raphael = FactoryGirl.create(:person, :diaspora_handle => "raphael@remote.net")
+  local_leia.contacts.create(person: remote_raphael, aspects: [leias_aspect])
+  local_luke.contacts.create(person: remote_raphael, aspects: [lukes_aspect])
 
-    connect_users_with_aspects(local_luke, local_leia)
+  # Set up a follower
+  peter = FactoryGirl.create(:user_with_aspect, username: "peter")
+  peters_aspect = peter.aspects.where(name: "generic").first
 
-    local_leia.contacts.create(:person => remote_raphael, :aspects => [leias_aspect])
-    local_luke.contacts.create(:person => remote_raphael, :aspects => [lukes_aspect])
+  peter.contacts.create!(person: alice.person, aspects: [peters_aspect], sharing: false, receiving: true)
+end
 
-    # Set up a follower
-    peter = FactoryGirl.create(:user_with_aspect, :username => "peter")
-    peters_aspect = peter.aspects.where(:name => "generic").first
+FixtureBuilder.configure do |fbuilder|
+  # rebuild fixtures automatically when these files change:
+  fbuilder.files_to_check += Dir[
+    "app/models/*.rb", "lib/**/*.rb", "spec/factories/*.rb", "spec/support/fixture_builder.rb"
+  ] - ["lib/diaspora/exporter.rb"]
 
-    peter.contacts.create!(:person => alice.person,
-                           :aspects => [peters_aspect],
-                           :sharing => false,
-                           :receiving => true)
-   end
+  # now declare objects
+  fbuilder.factory do
+    create_basic_users
+  end
 end
diff --git a/spec/support/fixture_generation.rb b/spec/support/fixture_generation.rb
index 3f3496c421606194fa64f28dc30703ca11aff641..27f92512f0a667301a6d5a7b2d2614c74447cbe9 100644
--- a/spec/support/fixture_generation.rb
+++ b/spec/support/fixture_generation.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module JasmineFixtureGeneration
   # Saves the markup to a fixture file using the given name
   def save_fixture(markup, name, fixture_path=nil )
diff --git a/spec/support/gon.rb b/spec/support/gon.rb
index 418c755b6de136b9958b543cbcb560de95202d05..552e1aba71cda9848dd39a30e8e662647468b797 100644
--- a/spec/support/gon.rb
+++ b/spec/support/gon.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 shared_context :gon do
   let(:gon) { RequestStore.store[:gon].gon }
 end
diff --git a/spec/support/inlined_jobs.rb b/spec/support/inlined_jobs.rb
index 96af22d091bc002c65207d3d36bd15a562f1bb44..daef7e15bcaf59ba970d1872beb7d1d90b5cd1f3 100644
--- a/spec/support/inlined_jobs.rb
+++ b/spec/support/inlined_jobs.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 module HelperMethods
   def inlined_jobs
     Sidekiq::Worker.clear_all
diff --git a/spec/support/serializer_matchers.rb b/spec/support/serializer_matchers.rb
index 0d9ec438210575ee24d15d1e5bac9282068f2f71..7da7b69270746d341e5f540c1ebb06fe196ca8f7 100644
--- a/spec/support/serializer_matchers.rb
+++ b/spec/support/serializer_matchers.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 # This file contains custom RSpec matchers for AMS.
 # NOTE: It was developed for AMS v0.9 and the API might be changed in future, so that should be examined when moving
 # between stable versions of AMS (e.g. 0.9 to 0.10, or 0.9 to a possible 1.0).
@@ -13,6 +15,7 @@
 RSpec::Matchers.define :serialize_association do |association_name|
   match do |root_serializer_class|
     association = fetch_association(root_serializer_class, association_name)
+    @serializer_from_options = association.serializer_from_options
     execute_receive_matcher_with(association)
   end
 
@@ -48,7 +51,11 @@ RSpec::Matchers.define :serialize_association do |association_name|
 
   def with_object_expectation(object)
     if association_object.is_a?(Array)
-      expect(object).to match_array(association_object)
+      if serializer_class == FlatMapArraySerializer
+        expect(object.flat_map(&:to_a)).to match_array(association_object)
+      else
+        expect(object).to match_array(association_object)
+      end
     elsif !association_object.nil?
       expect(object).to eq(association_object)
     end
@@ -64,6 +71,7 @@ RSpec::Matchers.define :serialize_association do |association_name|
 
   def pick_serializer_class
     return association_serializer_class unless association_serializer_class.nil?
+    return @serializer_from_options unless @serializer_from_options.nil?
     return ActiveModel::ArraySerializer unless each_serializer_class.nil?
   end
 end
diff --git a/spec/support/user_methods.rb b/spec/support/user_methods.rb
index 48fec7abafad32db1afb3b951d0d444357c0f449..7e37e1251d1d821b9cb187422c6935003ef9f656 100644
--- a/spec/support/user_methods.rb
+++ b/spec/support/user_methods.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 class User
   alias_method :share_with_original, :share_with
 
diff --git a/spec/workers/deferred_dispatch_spec.rb b/spec/workers/deferred_dispatch_spec.rb
index f39a1ac98c6403f975fab1081c55fc36f3339dcf..803a5e83af035eefa230144059f677a042bdb3cb 100644
--- a/spec/workers/deferred_dispatch_spec.rb
+++ b/spec/workers/deferred_dispatch_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::DeferredDispatch do
   it "handles non existing records gracefully" do
     expect {
diff --git a/spec/workers/delete_account_spec.rb b/spec/workers/delete_account_spec.rb
index 8c6fbff89206a09152074d2db85da1f6087b0d5d..3745648952617fb34c3cc20d9173fbdd5e36d0f3 100644
--- a/spec/workers/delete_account_spec.rb
+++ b/spec/workers/delete_account_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/delete_post_from_service_spec.rb b/spec/workers/delete_post_from_service_spec.rb
index 4aee4aef784d48774da744c3f4c001d8effec780..48a9b85c10f528fe6cb071dd0f0a30e6a558cec0 100644
--- a/spec/workers/delete_post_from_service_spec.rb
+++ b/spec/workers/delete_post_from_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::DeletePostFromService do
   it "calls service#delete_from_service with given opts" do
     service = double
diff --git a/spec/workers/export_photos_spec.rb b/spec/workers/export_photos_spec.rb
index e5ee4c47d685261b663502efc8a0f3f1f7a2e25e..8fb79617b4d726d5ee3490d5a8801de6d6720ae3 100644
--- a/spec/workers/export_photos_spec.rb
+++ b/spec/workers/export_photos_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ExportPhotos do
   before do
     allow(User).to receive(:find).with(alice.id).and_return(alice)
diff --git a/spec/workers/export_user_spec.rb b/spec/workers/export_user_spec.rb
index 65ebfb3567aa3b0635afe03c39f2f5d911626efa..e72410149d4157b169fa0703576b44c17b5e759e 100644
--- a/spec/workers/export_user_spec.rb
+++ b/spec/workers/export_user_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ExportUser do
   before do
     allow(User).to receive(:find).with(alice.id).and_return(alice)
@@ -20,4 +22,68 @@ describe Workers::ExportUser do
     expect(ExportMailer).to receive(:export_failure_for).with(alice).and_call_original
     Workers::ExportUser.new.perform(alice.id)
   end
+
+  context "concurrency" do
+    before do
+      AppConfig.environment.single_process_mode = false
+      AppConfig.settings.export_concurrency = 1
+    end
+
+    after :all do
+      AppConfig.environment.single_process_mode = true
+    end
+
+    let(:pid) { "#{Socket.gethostname}:#{Process.pid}:#{SecureRandom.hex(6)}" }
+
+    it "schedules a job for later when already another parallel export job is running" do
+      expect(Sidekiq::Workers).to receive(:new).and_return(
+        [[pid, SecureRandom.hex(4), {"payload" => {"class" => "Workers::ExportUser"}}]]
+      )
+
+      expect(Workers::ExportUser).to receive(:perform_in).with(kind_of(Integer), alice.id)
+      expect(alice).not_to receive(:perform_export!)
+
+      Workers::ExportUser.new.perform(alice.id)
+    end
+
+    it "runs the export when the own running job" do
+      expect(Sidekiq::Workers).to receive(:new).and_return(
+        [[pid, Thread.current.object_id.to_s(36), {"payload" => {"class" => "Workers::ExportUser"}}]]
+      )
+
+      expect(Workers::ExportUser).not_to receive(:perform_in).with(kind_of(Integer), alice.id)
+      expect(alice).to receive(:perform_export!)
+
+      Workers::ExportUser.new.perform(alice.id)
+    end
+
+    it "runs the export when no other job is running" do
+      expect(Sidekiq::Workers).to receive(:new).and_return([])
+
+      expect(Workers::ExportUser).not_to receive(:perform_in).with(kind_of(Integer), alice.id)
+      expect(alice).to receive(:perform_export!)
+
+      Workers::ExportUser.new.perform(alice.id)
+    end
+
+    it "runs the export when some other job is running" do
+      expect(Sidekiq::Workers).to receive(:new).and_return(
+        [[pid, SecureRandom.hex(4), {"payload" => {"class" => "Workers::OtherJob"}}]]
+      )
+
+      expect(Workers::ExportUser).not_to receive(:perform_in).with(kind_of(Integer), alice.id)
+      expect(alice).to receive(:perform_export!)
+
+      Workers::ExportUser.new.perform(alice.id)
+    end
+
+    it "runs the export when diaspora is in single process mode" do
+      AppConfig.environment.single_process_mode = true
+      expect(Sidekiq::Workers).not_to receive(:new)
+      expect(Workers::ExportUser).not_to receive(:perform_in).with(kind_of(Integer), alice.id)
+      expect(alice).to receive(:perform_export!)
+
+      Workers::ExportUser.new.perform(alice.id)
+    end
+  end
 end
diff --git a/spec/workers/fetch_profile_photo_spec.rb b/spec/workers/fetch_profile_photo_spec.rb
index 66106b27859a18b4e382b626de5f2f79d0fb0eef..ab99e6b209430c4f2f908fa6779b9e063cf9c2e0 100644
--- a/spec/workers/fetch_profile_photo_spec.rb
+++ b/spec/workers/fetch_profile_photo_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::FetchProfilePhoto do
   before do
    @user = alice
diff --git a/spec/workers/fetch_webfinger_spec.rb b/spec/workers/fetch_webfinger_spec.rb
index 7a3b667fb81c66c4f7cd35c82168f77dc35ac6ae..234c7d215be2bdd767ab78f3199e78c9cf4f14b6 100644
--- a/spec/workers/fetch_webfinger_spec.rb
+++ b/spec/workers/fetch_webfinger_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::FetchWebfinger do
   it "should webfinger and queue a job to fetch public posts" do
     @person = FactoryGirl.create(:person)
diff --git a/spec/workers/gather_o_embed_data_spec.rb b/spec/workers/gather_o_embed_data_spec.rb
index 6d9fe14842a90a2ef9afb9f11e9c00c73d05f503..298fd4585fafb99ef33328eadf7e9f38104a5d02 100644
--- a/spec/workers/gather_o_embed_data_spec.rb
+++ b/spec/workers/gather_o_embed_data_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::GatherOEmbedData do
   before do
     @flickr_oembed_data = {
diff --git a/spec/workers/gather_open_graph_data_spec.rb b/spec/workers/gather_open_graph_data_spec.rb
index 74aefe5489f774776580a1320c85d811a52338c8..c5a91c058c09c920ab64f67e70d7019d3cd52f8f 100644
--- a/spec/workers/gather_open_graph_data_spec.rb
+++ b/spec/workers/gather_open_graph_data_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::GatherOpenGraphData do
   before do
     @ogsite_title = 'Homepage'
diff --git a/spec/workers/mail/csrf_token_fail_spec.rb b/spec/workers/mail/csrf_token_fail_spec.rb
index 8c94f86637b8fa9879fbb053b673cd6ac60c98cd..010d7474e7929113af0cb2cd2190d3ebc6ac4f47 100644
--- a/spec/workers/mail/csrf_token_fail_spec.rb
+++ b/spec/workers/mail/csrf_token_fail_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/mail/invite_email_spec.rb b/spec/workers/mail/invite_email_spec.rb
index 70ad6a2c9b3615903dc228354baf293db49f81f8..44e0cef79a093a283c53c155b09e42cfd5550e03 100644
--- a/spec/workers/mail/invite_email_spec.rb
+++ b/spec/workers/mail/invite_email_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::Mail::InviteEmail do
   let(:emails) { ['foo@bar.com', 'baz@bar.com'] }
   let(:message) { 'get over here!' }
diff --git a/spec/workers/mail/liked_spec.rb b/spec/workers/mail/liked_spec.rb
index 7ab94586a8b6d652fe09e2494ef0a245fac0f5f4..565305937b61e7929cdd2d284e25e36ae3b51701 100644
--- a/spec/workers/mail/liked_spec.rb
+++ b/spec/workers/mail/liked_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::Mail::Liked do
   describe "#perform" do
     it "should call .deliver_now on the notifier object" do
diff --git a/spec/workers/mail/mentioned_spec.rb b/spec/workers/mail/mentioned_spec.rb
index cc06f5d5829491515caae940bc5d7449275b769d..a96c6b966510f768de8850f7b1f96abc2029b0ad 100644
--- a/spec/workers/mail/mentioned_spec.rb
+++ b/spec/workers/mail/mentioned_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/mail/private_message_spec.rb b/spec/workers/mail/private_message_spec.rb
index 7b840198642d6090e361aa8d7fa3ab0f4abec8aa..623897150a03b9f33942499be302f8f9fb8a5241 100644
--- a/spec/workers/mail/private_message_spec.rb
+++ b/spec/workers/mail/private_message_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/mail/reshared_spec.rb b/spec/workers/mail/reshared_spec.rb
index d1ebd990873a71b67c70fce83aa4a1c4c9ce99fa..595f1b78b45830c5b7b6785263244a83912da12d 100644
--- a/spec/workers/mail/reshared_spec.rb
+++ b/spec/workers/mail/reshared_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/post_to_service_spec.rb b/spec/workers/post_to_service_spec.rb
index 1a4370b81fe26ae77a590e6a9eb18c308412297b..8c3fe0ef6c4de31354af693e0a4e1c5d0020c79c 100644
--- a/spec/workers/post_to_service_spec.rb
+++ b/spec/workers/post_to_service_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::PostToService do
   it 'calls service#post with the given service' do
     user = alice
diff --git a/spec/workers/process_photo_spec.rb b/spec/workers/process_photo_spec.rb
index e7bfc5312cde2393f193df9abf179cd0209eb528..e9c7e645edbda63a97d4f0a2b43e95232e64d8ed 100644
--- a/spec/workers/process_photo_spec.rb
+++ b/spec/workers/process_photo_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ProcessPhoto do
   before do
    @user = alice
diff --git a/spec/workers/publish_to_hub_spec.rb b/spec/workers/publish_to_hub_spec.rb
index 62656d4de5953da0dbf23c67a17cf4010a549f54..a98d035c44c6ecd819a6f4afc24cf39e858fe01e 100644
--- a/spec/workers/publish_to_hub_spec.rb
+++ b/spec/workers/publish_to_hub_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
 #   licensed under the Affero General Public License version 3 or later.  See
 #   the COPYRIGHT file.
diff --git a/spec/workers/queue_users_for_removal_spec.rb b/spec/workers/queue_users_for_removal_spec.rb
index 19c25cc0affef4da5bbe4730016d1386ef442805..a87d4664fb8987b9def691567615d4ba9912508b 100644
--- a/spec/workers/queue_users_for_removal_spec.rb
+++ b/spec/workers/queue_users_for_removal_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::QueueUsersForRemoval do
   describe 'remove_old_users is active' do
     before do
diff --git a/spec/workers/receive_private_spec.rb b/spec/workers/receive_private_spec.rb
index b4089e51caea3ff10ec0bc0737fe977e32a1bf54..288db75e376b52d8830d475aa76d12cc4c18e720 100644
--- a/spec/workers/receive_private_spec.rb
+++ b/spec/workers/receive_private_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ReceivePrivate do
   let(:data) { "<xml></xml>" }
 
diff --git a/spec/workers/receive_public_spec.rb b/spec/workers/receive_public_spec.rb
index 62e6a56328dede0c7bef1125ad112bbe7fcacc72..2b97dbd2017ebb3eb1394b6cdca76a08ad8a3d16 100644
--- a/spec/workers/receive_public_spec.rb
+++ b/spec/workers/receive_public_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ReceivePublic do
   let(:data) { "<xml></xml>" }
 
diff --git a/spec/workers/recheck_offline_pods_spec.rb b/spec/workers/recheck_offline_pods_spec.rb
index 6dc59b0e5f46a4241e9fdbc8725d83b5ab275200..cd1ab90b00ac626cdd92b0c60c7d6b5807a42b4e 100644
--- a/spec/workers/recheck_offline_pods_spec.rb
+++ b/spec/workers/recheck_offline_pods_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::RecheckScheduledPods do
   it "performs a connection test on all scheduled pods" do
     (0..4).map { FactoryGirl.create(:pod) }
diff --git a/spec/workers/recurring_pod_check_spec.rb b/spec/workers/recurring_pod_check_spec.rb
index cba3c0543b2a34601e7bbadd36fb1f804b01a9a6..f5ed5e65aad44def31e271dafdfc21b59c22dcd1 100644
--- a/spec/workers/recurring_pod_check_spec.rb
+++ b/spec/workers/recurring_pod_check_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::RecurringPodCheck do
   before do
     @pods = (0..4).map do
diff --git a/spec/workers/remove_old_user_spec.rb b/spec/workers/remove_old_user_spec.rb
index 91c3efa9e6272d49b437a392031b92728b3d1f83..d1b76b6cedd91634429ae3daeeb53db8e8256d4c 100644
--- a/spec/workers/remove_old_user_spec.rb
+++ b/spec/workers/remove_old_user_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::RemoveOldUser do
   describe 'remove_old_users is active' do
     before do
diff --git a/spec/workers/reset_password_spec.rb b/spec/workers/reset_password_spec.rb
index faf829e6996bb85d3f35abf80c60859a140ab81d..c57cf52d36323aeb8e855cf583fb814630bb467e 100644
--- a/spec/workers/reset_password_spec.rb
+++ b/spec/workers/reset_password_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::ResetPassword do
   describe "#perform" do
     it "given a user id it sends the reset password instructions for that user" do
diff --git a/spec/workers/send_base_spec.rb b/spec/workers/send_base_spec.rb
index 5c0bb66103439056259eb8958be3873149ca5952..c7961451b3ac785c0a3ced2e8dba0c6ecf3c3a84 100644
--- a/spec/workers/send_base_spec.rb
+++ b/spec/workers/send_base_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::SendBase do
   it "retries first time after at least 256 seconds" do
     retry_delay = Workers::SendBase.new.send(:seconds_to_delay, 1)
diff --git a/spec/workers/send_private_spec.rb b/spec/workers/send_private_spec.rb
index e3d9a99bcfe443f16b15f52d6b278241ac56e97a..622c1e93eb7d6da8474bf05b850c11bf32508daf 100644
--- a/spec/workers/send_private_spec.rb
+++ b/spec/workers/send_private_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::SendPrivate do
   let(:sender_id) { "any_user@example.org" }
   let(:obj_str) { "status_message@guid" }
diff --git a/spec/workers/send_public_spec.rb b/spec/workers/send_public_spec.rb
index 4f87ddb3341576fc5a6efe936efe4c46d6a4cfe8..cd53b581ec147f6464ef65fa7284798f5b7e4c60 100644
--- a/spec/workers/send_public_spec.rb
+++ b/spec/workers/send_public_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 describe Workers::SendPublic do
   let(:sender_id) { "any_user@example.org" }
   let(:obj_str) { "status_message@guid" }