]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into moderation
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 12 Jul 2017 09:16:11 +0000 (10:16 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 12 Jul 2017 09:16:11 +0000 (10:16 +0100)
13 files changed:
1  2 
Gemfile
Gemfile.lock
app/assets/stylesheets/common.scss
app/controllers/diary_entry_controller.rb
app/models/notifier.rb
app/models/user.rb
app/views/diary_entry/view.html.erb
app/views/layouts/_header.html.erb
app/views/user/view.html.erb
config/locales/en-GB.yml
config/locales/en.yml
config/routes.rb
db/structure.sql

diff --combined Gemfile
index 25d80f1c0a01a2b30fc2ddc3aa012756cdac1500,baa1dcc04985ae87cdc921306368f44633692574..0fd68e4e223d962615d3d70de304e9f34813adc7
+++ b/Gemfile
@@@ -1,7 -1,7 +1,7 @@@
  source "https://rubygems.org"
  
  # Require rails
- gem "rails", "4.2.7"
+ gem "rails", "5.0.4"
  
  # Require things which have moved to gems in ruby 1.9
  gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
@@@ -22,7 -22,7 +22,7 @@@ gem "sass-rails", "~> 5.0
  gem "uglifier", ">= 1.3.0"
  
  # Use CoffeeScript for .js.coffee assets and views
- gem "coffee-rails", "~> 4.1.0"
+ gem "coffee-rails", "~> 4.2"
  
  # Use jquery as the JavaScript library
  gem "jquery-rails"
@@@ -38,45 -38,44 +38,47 @@@ gem "r2
  gem "autoprefixer-rails"
  
  # Use image_optim to optimise images
- gem "image_optim", ">= 0.22.0"
+ gem "image_optim_rails"
  
  # Load rails plugins
- gem "rails-i18n", "~> 4.0.0"
+ gem "actionpack-page_caching"
+ gem "composite_primary_keys", "~> 9.0.7"
+ gem "deadlock_retry", ">= 1.2.0"
  gem "dynamic_form"
- gem "rinku", ">= 1.2.2", :require => "rails_rinku"
- gem "oauth-plugin", ">= 0.5.1"
- gem "validates_email_format_of", ">= 1.5.1"
- gem "composite_primary_keys", "~> 8.1.0"
  gem "http_accept_language", "~> 2.0.0"
+ gem "i18n-js", ">= 3.0.0"
+ gem "oauth-plugin", ">= 0.5.1"
  gem "paperclip", "~> 4.0"
- gem "deadlock_retry", ">= 1.2.0"
- gem "i18n-js", ">= 3.0.0.rc10"
  gem "rack-cors"
- gem "actionpack-page_caching"
+ gem "rails-i18n", "~> 4.0.0"
+ gem "record_tag_helper"
+ gem "rinku", ">= 1.2.2", :require => "rails_rinku"
+ gem "validates_email_format_of", ">= 1.5.1"
  
  # Sanitise URIs
  gem "rack-uri_sanitizer"
  
  # Omniauth for authentication
  gem "omniauth"
- gem "omniauth-openid"
- gem "omniauth-google-oauth2", ">= 0.2.7"
  gem "omniauth-facebook"
- gem "omniauth-windowslive"
  gem "omniauth-github"
+ gem "omniauth-google-oauth2", ">= 0.2.7"
+ gem "omniauth-mediawiki", ">= 0.0.3"
+ gem "omniauth-openid"
+ gem "omniauth-windowslive"
  
  # Markdown formatting support
  gem "redcarpet"
  
 +# For status transitions of Issues
 +gem "aasm"
 +
  # Load libxml support for XML parsing and generation
  gem "libxml-ruby", ">= 2.0.5", :require => "libxml"
  
  # Use for HTML sanitisation
- gem "sanitize"
  gem "htmlentities"
+ gem "sanitize"
  
  # Load SystemTimer for implementing request timeouts
  gem "SystemTimer", ">= 1.1.3", :require => "system_timer", :platforms => :ruby_18
  # Load faraday for mockable HTTP client
  gem "faraday"
  
- # Load httpclient and soap4r for SOAP support for Quova GeoIP queries
- gem "httpclient"
- gem "soap4r-ruby1.9"
+ # Load geoip for querying Maxmind GeoIP database
+ gem "geoip"
+ # Load rotp to generate TOTP tokens
+ gem "rotp"
  
  # Load memcache client in case we are using it
  gem "dalli"
  gem "kgio"
  
+ # Load secure_headers for Content-Security-Policy support
+ gem "secure_headers"
+ # Load canonical-rails to generate canonical URLs
+ gem "canonical-rails"
  # Used to generate logstash friendly log files
  gem "logstasher"
  
  # Gems useful for development
  group :development do
+   gem "listen"
    gem "vendorer"
  end
  
  # Gems needed for running tests
  group :test do
-   gem "rubocop"
-   gem "timecop"
    gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20]
+   gem "rails-controller-testing"
+   gem "rubocop"
+   gem "webmock"
  end
  
  # Needed in development as well so rake can see konacha tasks
  group :development, :test do
+   gem "coveralls", :require => false
+   gem "factory_girl_rails"
    gem "jshint"
-   gem "konacha"
+   #  gem "konacha"
    gem "poltergeist"
-   gem "coveralls", :require => false
  end
diff --combined Gemfile.lock
index a007125214b3f3a6003386c1d111ac8bd22ea8fc,9b79e9ca14db7d80ba66ee285a570a9d5031f097..f25e2e7f0623ae134fdcb97fc61c21685da4847d
@@@ -2,80 -2,84 +2,85 @@@ GE
    remote: https://rubygems.org/
    specs:
      SystemTimer (1.2.3)
-     actionmailer (4.2.7)
-       actionpack (= 4.2.7)
-       actionview (= 4.2.7)
-       activejob (= 4.2.7)
 +    aasm (4.1.0)
+     actioncable (5.0.4)
+       actionpack (= 5.0.4)
+       nio4r (>= 1.2, < 3.0)
+       websocket-driver (~> 0.6.1)
+     actionmailer (5.0.4)
+       actionpack (= 5.0.4)
+       actionview (= 5.0.4)
+       activejob (= 5.0.4)
        mail (~> 2.5, >= 2.5.4)
-       rails-dom-testing (~> 1.0, >= 1.0.5)
-     actionpack (4.2.7)
-       actionview (= 4.2.7)
-       activesupport (= 4.2.7)
-       rack (~> 1.6)
-       rack-test (~> 0.6.2)
-       rails-dom-testing (~> 1.0, >= 1.0.5)
+       rails-dom-testing (~> 2.0)
+     actionpack (5.0.4)
+       actionview (= 5.0.4)
+       activesupport (= 5.0.4)
+       rack (~> 2.0)
+       rack-test (~> 0.6.3)
+       rails-dom-testing (~> 2.0)
        rails-html-sanitizer (~> 1.0, >= 1.0.2)
-     actionpack-page_caching (1.0.2)
-       actionpack (>= 4.0.0, < 5)
-     actionview (4.2.7)
-       activesupport (= 4.2.7)
+     actionpack-page_caching (1.1.0)
+       actionpack (>= 4.0.0, < 6)
+     actionview (5.0.4)
+       activesupport (= 5.0.4)
        builder (~> 3.1)
        erubis (~> 2.7.0)
-       rails-dom-testing (~> 1.0, >= 1.0.5)
-       rails-html-sanitizer (~> 1.0, >= 1.0.2)
-     activejob (4.2.7)
-       activesupport (= 4.2.7)
-       globalid (>= 0.3.0)
-     activemodel (4.2.7)
-       activesupport (= 4.2.7)
-       builder (~> 3.1)
-     activerecord (4.2.7)
-       activemodel (= 4.2.7)
-       activesupport (= 4.2.7)
-       arel (~> 6.0)
-     activesupport (4.2.7)
+       rails-dom-testing (~> 2.0)
+       rails-html-sanitizer (~> 1.0, >= 1.0.3)
+     activejob (5.0.4)
+       activesupport (= 5.0.4)
+       globalid (>= 0.3.6)
+     activemodel (5.0.4)
+       activesupport (= 5.0.4)
+     activerecord (5.0.4)
+       activemodel (= 5.0.4)
+       activesupport (= 5.0.4)
+       arel (~> 7.0)
+     activesupport (5.0.4)
+       concurrent-ruby (~> 1.0, >= 1.0.2)
        i18n (~> 0.7)
-       json (~> 1.7, >= 1.7.7)
        minitest (~> 5.1)
-       thread_safe (~> 0.3, >= 0.3.4)
        tzinfo (~> 1.1)
-     addressable (2.4.0)
-     arel (6.0.3)
+     addressable (2.5.1)
+       public_suffix (~> 2.0, >= 2.0.2)
+     arel (7.1.4)
      ast (2.3.0)
-     autoprefixer-rails (6.3.7)
+     autoprefixer-rails (7.1.1.2)
        execjs
      bigdecimal (1.1.0)
-     builder (3.2.2)
-     capybara (2.7.1)
+     builder (3.2.3)
+     canonical-rails (0.2.0)
+       rails (>= 4.1, < 5.2)
+     capybara (2.14.3)
        addressable
        mime-types (>= 1.16)
        nokogiri (>= 1.3.3)
        rack (>= 1.0.0)
        rack-test (>= 0.5.4)
        xpath (~> 2.0)
-     climate_control (0.0.3)
-       activesupport (>= 3.0)
+     climate_control (0.2.0)
      cliver (0.3.2)
      cocaine (0.5.8)
        climate_control (>= 0.0.3, < 1.0)
-     coffee-rails (4.1.1)
+     coffee-rails (4.2.2)
        coffee-script (>= 2.2.0)
-       railties (>= 4.0.0, < 5.1.x)
+       railties (>= 4.0.0)
      coffee-script (2.4.1)
        coffee-script-source
        execjs
-     coffee-script-source (1.10.0)
-     colorize (0.8.1)
-     composite_primary_keys (8.1.3)
-       activerecord (~> 4.2.0)
-     concurrent-ruby (1.0.2)
-     coveralls (0.8.14)
+     coffee-script-source (1.12.2)
+     composite_primary_keys (9.0.7)
+       activerecord (~> 5.0.0)
+     concurrent-ruby (1.0.5)
+     coveralls (0.8.21)
        json (>= 1.8, < 3)
-       simplecov (~> 0.12.0)
+       simplecov (~> 0.14.1)
        term-ansicolor (~> 1.3)
-       thor (~> 0.19.1)
-       tins (~> 1.6.0)
+       thor (~> 0.19.4)
+       tins (~> 1.6)
+     crack (0.4.3)
+       safe_yaml (~> 1.0.0)
      crass (1.0.2)
      dalli (2.7.6)
      deadlock_retry (1.2.0)
      dynamic_form (1.1.4)
      erubis (2.7.0)
      execjs (2.7.0)
-     exifr (1.2.4)
-     faraday (0.9.2)
+     exifr (1.2.5)
+     factory_girl (4.8.0)
+       activesupport (>= 3.0.0)
+     factory_girl_rails (4.8.0)
+       factory_girl (~> 4.8.0)
+       railties (>= 3.0.0)
+     faraday (0.12.1)
        multipart-post (>= 1.2, < 3)
-     fspath (2.1.1)
-     globalid (0.3.6)
-       activesupport (>= 4.1.0)
-     hashie (3.4.4)
+     ffi (1.9.18)
+     fspath (3.1.0)
+     geoip (1.6.3)
+     globalid (0.4.0)
+       activesupport (>= 4.2.0)
+     hashdiff (0.3.4)
+     hashie (3.5.5)
      htmlentities (4.3.4)
      http_accept_language (2.0.5)
-     httpclient (2.8.0)
-     i18n (0.7.0)
-     i18n-js (3.0.0.rc13)
+     i18n (0.8.4)
+     i18n-js (3.0.0)
        i18n (~> 0.6, >= 0.6.6)
-     image_optim (0.22.1)
+     image_optim (0.24.3)
        exifr (~> 1.2, >= 1.2.2)
-       fspath (~> 2.1)
-       image_size (~> 1.3)
+       fspath (~> 3.0)
+       image_size (~> 1.5)
        in_threads (~> 1.3)
        progress (~> 3.0, >= 3.0.1)
-     image_size (1.4.2)
-     in_threads (1.3.1)
-     jquery-rails (4.1.1)
+     image_optim_rails (0.4.0)
+       image_optim (~> 0.24.0)
+       rails
+       sprockets
+     image_size (1.5.0)
+     in_threads (1.4.0)
+     jquery-rails (4.3.1)
        rails-dom-testing (>= 1, < 3)
        railties (>= 4.2.0)
        thor (>= 0.14, < 2.0)
-     jshint (1.4.0)
+     jshint (1.5.0)
        execjs (>= 1.4.0)
        multi_json (~> 1.0)
        therubyracer (~> 0.12.1)
-     json (1.8.3)
+     json (2.1.0)
      jsonify (0.3.1)
        multi_json (~> 1.0)
      jsonify-rails (0.3.2)
        actionpack
        jsonify (< 0.4.0)
-     jwt (1.5.4)
-     kgio (2.10.0)
-     konacha (4.0.0)
-       actionpack (>= 4.1, < 5)
-       capybara
-       colorize
-       railties (>= 4.1, < 5)
-       sprockets (>= 2, < 4)
-       sprockets-rails (>= 2, < 4)
-       tilt
-     libv8 (3.16.14.15)
-     libxml-ruby (2.9.0)
+     jwt (1.5.6)
+     kgio (2.11.0)
+     libv8 (3.16.14.19)
+     libxml-ruby (3.0.0)
+     listen (3.1.5)
+       rb-fsevent (~> 0.9, >= 0.9.4)
+       rb-inotify (~> 0.9, >= 0.9.7)
+       ruby_dep (~> 1.2)
      logstash-event (1.2.02)
-     logstasher (1.0.0)
-       activerecord (>= 4.0)
+     logstasher (1.2.1)
        activesupport (>= 4.0)
        logstash-event (~> 1.2.0)
        request_store
      loofah (2.0.3)
        nokogiri (>= 1.5.9)
-     mail (2.6.4)
+     mail (2.6.6)
        mime-types (>= 1.16, < 4)
+     method_source (0.8.2)
      mime-types (3.1)
        mime-types-data (~> 3.2015)
      mime-types-data (3.2016.0521)
      mimemagic (0.3.0)
-     mini_portile2 (2.1.0)
-     minitest (5.9.0)
+     mini_portile2 (2.2.0)
+     minitest (5.10.2)
      multi_json (1.12.1)
-     multi_xml (0.5.5)
+     multi_xml (0.6.0)
      multipart-post (2.0.0)
-     nokogiri (1.6.8)
-       mini_portile2 (~> 2.1.0)
-       pkg-config (~> 1.1.7)
-     nokogumbo (1.4.7)
+     nio4r (2.1.0)
+     nokogiri (1.8.0)
+       mini_portile2 (~> 2.2.0)
+     nokogumbo (1.4.13)
        nokogiri
      oauth (0.4.7)
      oauth-plugin (0.5.1)
        oauth (~> 0.4.4)
        oauth2 (>= 0.5.0)
        rack
-     oauth2 (1.2.0)
-       faraday (>= 0.8, < 0.10)
+     oauth2 (1.4.0)
+       faraday (>= 0.8, < 0.13)
        jwt (~> 1.0)
        multi_json (~> 1.3)
        multi_xml (~> 0.5)
        rack (>= 1.2, < 3)
-     omniauth (1.3.1)
-       hashie (>= 1.2, < 4)
-       rack (>= 1.0, < 3)
-     omniauth-facebook (3.0.0)
+     omniauth (1.6.1)
+       hashie (>= 3.4.6, < 3.6.0)
+       rack (>= 1.6.2, < 3)
+     omniauth-facebook (4.0.0)
        omniauth-oauth2 (~> 1.2)
-     omniauth-github (1.1.2)
-       omniauth (~> 1.0)
-       omniauth-oauth2 (~> 1.1)
-     omniauth-google-oauth2 (0.4.1)
-       jwt (~> 1.5.2)
+     omniauth-github (1.3.0)
+       omniauth (~> 1.5)
+       omniauth-oauth2 (>= 1.4.0, < 2.0)
+     omniauth-google-oauth2 (0.5.0)
+       jwt (~> 1.5)
        multi_json (~> 1.3)
        omniauth (>= 1.1.1)
        omniauth-oauth2 (>= 1.3.1)
+     omniauth-mediawiki (0.0.3)
+       jwt (~> 1.0)
+       omniauth-oauth (~> 1.0)
+     omniauth-oauth (1.1.0)
+       oauth
+       omniauth (~> 1.0)
      omniauth-oauth2 (1.4.0)
        oauth2 (~> 1.0)
        omniauth (~> 1.2)
      omniauth-openid (1.0.1)
        omniauth (~> 1.0)
        rack-openid (~> 1.3.1)
-     omniauth-windowslive (0.0.9.1)
-       multi_json (>= 1.0.3)
-       omniauth-oauth2 (~> 1.0)
+     omniauth-windowslive (0.0.12)
+       multi_json (~> 1.12)
+       omniauth-oauth2 (~> 1.4)
      paperclip (4.3.7)
        activemodel (>= 3.2.0)
        activesupport (>= 3.2.0)
        cocaine (~> 0.5.5)
        mime-types
        mimemagic (= 0.3.0)
-     parser (2.3.1.2)
+     parallel (1.11.2)
+     parser (2.4.0.0)
        ast (~> 2.2)
-     pg (0.18.4)
-     pkg-config (1.1.7)
-     poltergeist (1.10.0)
+     pg (0.21.0)
+     poltergeist (1.15.0)
        capybara (~> 2.1)
        cliver (~> 0.3.1)
        websocket-driver (>= 0.2.0)
      powerpack (0.1.1)
-     progress (3.1.1)
-     psych (2.1.0)
+     progress (3.3.1)
+     psych (2.2.4)
+     public_suffix (2.0.5)
      r2 (0.2.6)
-     rack (1.6.4)
-     rack-cors (0.4.0)
+     rack (2.0.3)
+     rack-cors (0.4.1)
      rack-openid (1.3.1)
        rack (>= 1.1.0)
        ruby-openid (>= 2.1.8)
      rack-test (0.6.3)
        rack (>= 1.0)
      rack-uri_sanitizer (0.0.2)
-     rails (4.2.7)
-       actionmailer (= 4.2.7)
-       actionpack (= 4.2.7)
-       actionview (= 4.2.7)
-       activejob (= 4.2.7)
-       activemodel (= 4.2.7)
-       activerecord (= 4.2.7)
-       activesupport (= 4.2.7)
+     rails (5.0.4)
+       actioncable (= 5.0.4)
+       actionmailer (= 5.0.4)
+       actionpack (= 5.0.4)
+       actionview (= 5.0.4)
+       activejob (= 5.0.4)
+       activemodel (= 5.0.4)
+       activerecord (= 5.0.4)
+       activesupport (= 5.0.4)
        bundler (>= 1.3.0, < 2.0)
-       railties (= 4.2.7)
-       sprockets-rails
-     rails-deprecated_sanitizer (1.0.3)
-       activesupport (>= 4.2.0.alpha)
-     rails-dom-testing (1.0.7)
-       activesupport (>= 4.2.0.beta, < 5.0)
-       nokogiri (~> 1.6.0)
-       rails-deprecated_sanitizer (>= 1.0.1)
+       railties (= 5.0.4)
+       sprockets-rails (>= 2.0.0)
+     rails-controller-testing (1.0.2)
+       actionpack (~> 5.x, >= 5.0.1)
+       actionview (~> 5.x, >= 5.0.1)
+       activesupport (~> 5.x)
+     rails-dom-testing (2.0.3)
+       activesupport (>= 4.2.0)
+       nokogiri (>= 1.6)
      rails-html-sanitizer (1.0.3)
        loofah (~> 2.0)
-     rails-i18n (4.0.9)
-       i18n (~> 0.7)
-       railties (~> 4.0)
-     railties (4.2.7)
-       actionpack (= 4.2.7)
-       activesupport (= 4.2.7)
+     rails-i18n (4.0.2)
+       i18n (~> 0.6)
+       rails (>= 4.0)
+     railties (5.0.4)
+       actionpack (= 5.0.4)
+       activesupport (= 5.0.4)
+       method_source
        rake (>= 0.8.7)
        thor (>= 0.18.1, < 2.0)
-     rainbow (2.1.0)
-     rake (11.2.2)
-     redcarpet (3.3.4)
+     rainbow (2.2.2)
+       rake
+     rake (12.0.0)
+     rb-fsevent (0.9.8)
+     rb-inotify (0.9.10)
+       ffi (>= 0.5.0, < 2)
+     record_tag_helper (1.0.0)
+       actionview (~> 5.x)
+     redcarpet (3.4.0)
      ref (2.0.0)
-     request_store (1.3.1)
-     rinku (2.0.0)
-     rubocop (0.41.2)
-       parser (>= 2.3.1.1, < 3.0)
+     request_store (1.3.2)
+     rinku (2.0.2)
+     rotp (3.3.0)
+     rubocop (0.49.1)
+       parallel (~> 1.10)
+       parser (>= 2.3.3.1, < 3.0)
        powerpack (~> 0.1)
        rainbow (>= 1.99.1, < 3.0)
        ruby-progressbar (~> 1.7)
        unicode-display_width (~> 1.0, >= 1.0.1)
      ruby-openid (2.7.0)
      ruby-progressbar (1.8.1)
-     sanitize (4.0.1)
+     ruby_dep (1.5.0)
+     safe_yaml (1.0.4)
+     sanitize (4.5.0)
        crass (~> 1.0.2)
        nokogiri (>= 1.4.4)
        nokogumbo (~> 1.4.1)
-     sass (3.4.22)
-     sass-rails (5.0.5)
+     sass (3.4.24)
+     sass-rails (5.0.6)
        railties (>= 4.0.0, < 6)
        sass (~> 3.1)
        sprockets (>= 2.8, < 4.0)
        sprockets-rails (>= 2.0, < 4.0)
        tilt (>= 1.1, < 3)
-     simplecov (0.12.0)
+     secure_headers (3.6.5)
+       useragent
+     simplecov (0.14.1)
        docile (~> 1.1.0)
        json (>= 1.8, < 3)
        simplecov-html (~> 0.10.0)
-     simplecov-html (0.10.0)
-     soap4r-ruby1.9 (2.0.5)
-     sprockets (3.6.3)
+     simplecov-html (0.10.1)
+     sprockets (3.7.1)
        concurrent-ruby (~> 1.0)
        rack (> 1, < 3)
-     sprockets-rails (3.1.1)
+     sprockets-rails (3.2.0)
        actionpack (>= 4.0)
        activesupport (>= 4.0)
        sprockets (>= 3.0.0)
-     term-ansicolor (1.3.2)
+     term-ansicolor (1.6.0)
        tins (~> 1.0)
-     therubyracer (0.12.2)
-       libv8 (~> 3.16.14.0)
+     therubyracer (0.12.3)
+       libv8 (~> 3.16.14.15)
        ref
-     thor (0.19.1)
-     thread_safe (0.3.5)
-     tilt (2.0.5)
-     timecop (0.8.1)
-     tins (1.6.0)
-     tzinfo (1.2.2)
+     thor (0.19.4)
+     thread_safe (0.3.6)
+     tilt (2.0.7)
+     tins (1.14.0)
+     tzinfo (1.2.3)
        thread_safe (~> 0.1)
-     uglifier (3.0.0)
+     uglifier (3.2.0)
        execjs (>= 0.3.0, < 3)
-     unicode-display_width (1.1.0)
+     unicode-display_width (1.3.0)
+     useragent (0.16.8)
      validates_email_format_of (1.6.3)
        i18n
      vendorer (0.1.16)
-     websocket-driver (0.6.4)
+     webmock (3.0.1)
+       addressable (>= 2.3.6)
+       crack (>= 0.3.2)
+       hashdiff
+     websocket-driver (0.6.5)
        websocket-extensions (>= 0.1.0)
      websocket-extensions (0.1.2)
-     xpath (2.0.0)
+     xpath (2.1.0)
        nokogiri (~> 1.3)
  
  PLATFORMS
  
  DEPENDENCIES
    SystemTimer (>= 1.1.3)
 +  aasm
    actionpack-page_caching
    autoprefixer-rails
    bigdecimal (~> 1.1.0)
-   coffee-rails (~> 4.1.0)
-   composite_primary_keys (~> 8.1.0)
+   canonical-rails
+   coffee-rails (~> 4.2)
+   composite_primary_keys (~> 9.0.7)
    coveralls
    dalli
    deadlock_retry (>= 1.2.0)
    dynamic_form
+   factory_girl_rails
    faraday
+   geoip
    htmlentities
    http_accept_language (~> 2.0.0)
-   httpclient
-   i18n-js (>= 3.0.0.rc10)
-   image_optim (>= 0.22.0)
+   i18n-js (>= 3.0.0)
+   image_optim_rails
    jquery-rails
    jshint
    json
    jsonify-rails
    kgio
-   konacha
    libxml-ruby (>= 2.0.5)
+   listen
    logstasher
    minitest (~> 5.1)
    oauth-plugin (>= 0.5.1)
    omniauth-facebook
    omniauth-github
    omniauth-google-oauth2 (>= 0.2.7)
+   omniauth-mediawiki (>= 0.0.3)
    omniauth-openid
    omniauth-windowslive
    paperclip (~> 4.0)
    r2
    rack-cors
    rack-uri_sanitizer
-   rails (= 4.2.7)
+   rails (= 5.0.4)
+   rails-controller-testing
    rails-i18n (~> 4.0.0)
+   record_tag_helper
    redcarpet
    rinku (>= 1.2.2)
+   rotp
    rubocop
    sanitize
    sass-rails (~> 5.0)
-   soap4r-ruby1.9
-   timecop
+   secure_headers
    uglifier (>= 1.3.0)
    validates_email_format_of (>= 1.5.1)
    vendorer
+   webmock
  
  BUNDLED WITH
-    1.10.6
+    1.13.7
index 251731a4c5cd40d65cf54fe7a9000cbef6fa8cf2,121e0c6d63cb6eb50b4898d282b4b3249309403f..2410c210adf9eb11c2cee9a575280b2b266428ea
@@@ -148,6 -148,8 +148,8 @@@ small, aside 
  
  .red { color: $red; }
  
+ .piwik { border: 0; }
  /* Rules for icons */
  
  .icon {
@@@ -491,7 -493,8 +493,8 @@@ body.compact 
      background-color: black;
    }
  
-   &.disabled {
+   &.disabled,
+   &.leaflet-disabled {
      background-color: #333;
      background-color: rgba(0,0,0,.5);
      cursor: default;
      background: #fff;
      font-size: 12px;
  
+     #sidebar_loader {
+       display: none;
+     }
      > div {
        position: relative;
        float: left;
  
      .icon.close {
        float: right;
+       cursor: pointer;
      }
  
-     p.error {
-       background-color: #ff7070;
-       padding: 10px;
-       font-weight: bold;
+     .flash {
+       padding: 15px;
+       picture {
+         margin-right: -25px;
+       }
+       div.message {
+         margin-left: 30px;
+       }
      }
    }
  
          font-size: 16px;
          text-stroke: 2px #fff;
          background: rgba(255,255,255,.9);
-         z-index: 2; // For IE9
+         z-index: 1000;
          input[type="radio"] {
            display: none;
          }
  
  #sidebar {
    #sidebar_loader,
+   .search_more {
+     width: 100%;
+     margin: $lineheight auto;
+   }
    .loader,
    .load_more {
      text-align: center;
-     margin: $lineheight auto;
+     margin: auto;
      width: 40px;
      display: block;
    }
@@@ -1175,6 -1194,7 +1194,7 @@@ tr.turn:hover 
        width: 50%;
        padding: 6px 10px;
        word-wrap: break-word;
+       white-space: pre-wrap;
      }
  
      .browse-tag-k {
    }
  }
  
+ /* Rules for the trace view */
+ .trace-view {
+   .trace_pending {
+     color: red;
+   }
+   .geo {
+     display: inline;
+   }
+ }
  /* Rules for the new trace form */
  
  #new_trace {
    float: left;
  }
  
+ .diary-subscribe-buttons {
+   position:relative;
+   top: -30px;
+   left: 130px;
+ }
  /* Rules for the log in page */
  
  #login_auth_buttons {
      margin-bottom: $lineheight;
      overflow: auto;
      height: 20em;
+     li {
+       list-style: inherit;
+     }
+     ol ol {
+       list-style-type: lower-alpha;
+     }
    }
  
    #decline {
    border-radius: 0 2px 2px 0;
  }
  
+ /* Rules for the oauth authorization page */
+ .oauth-authorize ul {
+   list-style: none;
+ }
  /* Rules for messages pages */
  
  .messages {
@@@ -2739,54 -2792,3 +2792,54 @@@ input.richtext_title[type="text"] 
      display: none;
    }
  }
 +
 +.read-reports {
 +  background: #eee;
 +  opacity: 0.7;
 +}
 +
 +.report-related-block {
 +  display:inline-block;
 +}
 +
 +.report-block {
 +  width:475px;
 +  float:left;
 +  margin-right:100px;
 +}
 +
 +.related-block{
 +  width:280px;
 +  float:right;
 +}
 +
 +.issue-comments {
 +  width:475px;
 +}
 +
 +.new-report-form {
 +  border:1px solid #ccc;
 +  border-radius:4px;
 +  display:block-inline;
 +}
 +
 +.new-report-checkbox{
 +  float:left;
 +  margin-left:10px;
 +  margin-top:3px;
 +}
 +
 +.new-report-string {
 +  font-size:15px;
 +}
 +
 +.report-button {
 +  float:right;
 +}
 +
 +.disclaimer {
 +  width: 600px;
 +  background: #fff1f0;
 +  color: #d85030;
 +  border-color: rgba(216, 80, 48, 0.3);
 +}
index 105ddb59065d33b724fb02dac6c36c3a11e171eb,1635dc0d0a19657e717b877571eea100a0590c12..89107ab1ac2f1c22f01398bd67086afbc6f2b62a
@@@ -3,16 -3,16 +3,16 @@@ class DiaryEntryController < Applicatio
  
    before_action :authorize_web
    before_action :set_locale
-   before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment]
+   before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
    before_action :lookup_this_user, :only => [:view, :comments]
    before_action :check_database_readable
-   before_action :check_database_writable, :only => [:new, :edit]
+   before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
    before_action :require_administrator, :only => [:hide, :hidecomment]
  
    def new
      @title = t "diary_entry.new.title"
  
-     if params[:diary_entry]
+     if request.post?
        @diary_entry = DiaryEntry.new(entry_params)
        @diary_entry.user = @user
  
          else
            @user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code)
          end
-         redirect_to :controller => "diary_entry", :action => "list", :display_name => @user.display_name
+         # Subscribe user to diary comments
+         @diary_entry.subscriptions.create(:user => @user)
+         redirect_to :action => "list", :display_name => @user.display_name
        else
          render :action => "edit"
        end
      else
        default_lang = @user.preferences.where(:k => "diary.default_language").first
        lang_code = default_lang ? default_lang.v : @user.preferred_language
-       @diary_entry = DiaryEntry.new(:language_code => lang_code)
+       @diary_entry = DiaryEntry.new(entry_params.merge(:language_code => lang_code))
        set_map_location
        render :action => "edit"
      end
@@@ -42,9 -46,9 +46,9 @@@
      @diary_entry = DiaryEntry.find(params[:id])
  
      if @user != @diary_entry.user
-       redirect_to :controller => "diary_entry", :action => "view", :id => params[:id]
+       redirect_to :action => "view", :id => params[:id]
      elsif params[:diary_entry] && @diary_entry.update_attributes(entry_params)
-       redirect_to :controller => "diary_entry", :action => "view", :id => params[:id]
+       redirect_to :action => "view", :id => params[:id]
      end
  
      set_map_location
      @diary_comment = @entry.comments.build(comment_params)
      @diary_comment.user = @user
      if @diary_comment.save
-       if @diary_comment.user != @entry.user
-         Notifier.diary_comment_notification(@diary_comment).deliver_now
+       # Notify current subscribers of the new comment
+       @entry.subscribers.visible.each do |user|
+         if @user != user
+           Notifier.diary_comment_notification(@diary_comment, user).deliver_now
+         end
        end
  
-       redirect_to :controller => "diary_entry", :action => "view", :display_name => @entry.user.display_name, :id => @entry.id
+       # Add the commenter to the subscribers if necessary
+       @entry.subscriptions.create(:user => @user) unless @entry.subscribers.exists?(@user.id)
+       redirect_to :action => "view", :display_name => @entry.user.display_name, :id => @entry.id
      else
        render :action => "view"
      end
      render :action => "no_such_entry", :status => :not_found
    end
  
+   def subscribe
+     diary_entry = DiaryEntry.find(params[:id])
+     diary_entry.subscriptions.create(:user => @user) unless diary_entry.subscribers.exists?(@user.id)
+     redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
+   rescue ActiveRecord::RecordNotFound
+     render :action => "no_such_entry", :status => :not_found
+   end
+   def unsubscribe
+     diary_entry = DiaryEntry.find(params[:id])
+     diary_entry.subscriptions.where(:user => @user).delete_all if diary_entry.subscribers.exists?(@user.id)
+     redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
+   rescue ActiveRecord::RecordNotFound
+     render :action => "no_such_entry", :status => :not_found
+   end
    def list
      if params[:display_name]
-       @this_user = User.active.find_by_display_name(params[:display_name])
+       @this_user = User.active.find_by(:display_name => params[:display_name])
  
        if @this_user
          @title = t "diary_entry.list.user_title", :user => @this_user.display_name
          return
        end
      else
-       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w(active confirmed) })
+       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
  
        if params[:language]
          @title = t "diary_entry.list.in_language_title", :language => Language.find(params[:language]).english_name
        end
      end
  
+     @params = params.permit(:display_name, :friends, :nearby, :language)
      @page = (params[:page] || 1).to_i
      @page_size = 20
  
  
    def rss
      if params[:display_name]
-       user = User.active.find_by_display_name(params[:display_name])
+       user = User.active.find_by(:display_name => params[:display_name])
  
        if user
          @entries = user.diary_entries
          @description = I18n.t("diary_entry.feed.user.description", :user => user.display_name)
          @link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
        else
-         render :text => "", :status => :not_found
+         head :not_found
          return
        end
      else
-       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w(active confirmed) })
+       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
  
        if params[:language]
          @entries = @entries.where(:language_code => params[:language])
      @entry = @this_user.diary_entries.visible.where(:id => params[:id]).first
      if @entry
        @title = t "diary_entry.view.title", :user => params[:display_name], :title => @entry.title
 +      if params[:comment_id]
 +        @reported_comment = DiaryComment.where(:id => params[:comment_id])
 +      end
      else
        @title = t "diary_entry.no_such_entry.title", :id => params[:id]
        render :action => "no_such_entry", :status => :not_found
    # return permitted diary entry parameters
    def entry_params
      params.require(:diary_entry).permit(:title, :body, :language_code, :latitude, :longitude)
+   rescue ActionController::ParameterMissing
+     ActionController::Parameters.new.permit(:title, :body, :language_code, :latitude, :longitude)
    end
  
    ##
    def require_administrator
      unless @user.administrator?
        flash[:error] = t("user.filter.not_an_administrator")
-       redirect_to :controller => "diary_entry", :action => "view"
+       redirect_to :action => "view"
      end
    end
  
diff --combined app/models/notifier.rb
index 1b1da7b5eaacb1da4edfb2f4de544066fc0b5406,8f9e3e2954814e45151632c0ba88ca0db8fa6dfd..54eb9b41852c71622f772a7fb4894558db31172e
@@@ -3,6 -3,8 +3,8 @@@ class Notifier < ActionMailer::Bas
            :return_path => EMAIL_RETURN_PATH,
            :auto_submitted => "auto-generated"
    helper :application
+   before_action :set_shared_template_vars
+   before_action :attach_project_logo
  
    def signup_confirm(user, token)
      with_recipient_locale user do
@@@ -76,6 -78,9 +78,9 @@@
        @replyurl = url_for(:host => SERVER_URL,
                            :controller => "message", :action => "reply",
                            :message_id => message.id)
+       @author = @from_user
+       attach_user_avatar(message.sender)
  
        mail :from => from_address(message.sender.display_name, "m", message.id, message.digest),
             :to => message.recipient.email,
@@@ -83,9 -88,9 +88,9 @@@
      end
    end
  
-   def diary_comment_notification(comment)
-     with_recipient_locale comment.diary_entry.user do
-       @to_user = comment.diary_entry.user.display_name
+   def diary_comment_notification(comment, recipient)
+     with_recipient_locale recipient do
+       @to_user = recipient.display_name
        @from_user = comment.user.display_name
        @text = comment.body
        @title = comment.diary_entry.title
                            :action => "new",
                            :display_name => comment.user.display_name,
                            :title => "Re: #{comment.diary_entry.title}")
+       @author = @from_user
  
-       mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest),
-            :to => comment.diary_entry.user.email,
+       attach_user_avatar(comment.user)
+       mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest, recipient.id),
+            :to => recipient.email,
             :subject => I18n.t("notifier.diary_comment_notification.subject", :user => comment.user.display_name)
      end
    end
        @friendurl = url_for(:host => SERVER_URL,
                             :controller => "user", :action => "make_friend",
                             :display_name => @friend.befriender.display_name)
+       @author = @friend.befriender.display_name
  
+       attach_user_avatar(@friend.befriender)
        mail :to => friend.befriendee.email,
             :subject => I18n.t("notifier.friend_notification.subject", :user => friend.befriender.display_name)
      end
                       I18n.t("notifier.note_comment_notification.anonymous")
                     end
  
+       @author = @commenter
+       attach_user_avatar(comment.author)
        subject = if @owner
                    I18n.t("notifier.note_comment_notification.#{@event}.subject_own", :commenter => @commenter)
                  else
  
    def changeset_comment_notification(comment, recipient)
      with_recipient_locale recipient do
+       @to_user = recipient.display_name
        @changeset_url = changeset_url(comment.changeset, :host => SERVER_URL)
        @comment = comment.body
        @owner = recipient == comment.changeset.user
        @changeset_comment = comment.changeset.tags["comment"].presence
        @time = comment.created_at
        @changeset_author = comment.changeset.user.display_name
+       @author = @commenter
  
        subject = if @owner
                    I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter)
                    I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter)
                  end
  
+       attach_user_avatar(comment.author)
        mail :to => recipient.email, :subject => subject
      end
    end
  
 +  def new_issue_notification(issue_id, recipient)
 +    with_recipient_locale recipient do
 +      @url = url_for(:host => SERVER_URL,
 +                     :controller => "issues",
 +                     :action => "show",
 +                     :id => issue_id)
 +      subject = I18n.t("notifier.new_issue_notification.subject")
 +      mail :to => recipient.email, :subject => subject
 +    end
 +  end
 +
    private
  
+   def set_shared_template_vars
+     @root_url = root_url(:host => SERVER_URL)
+   end
+   def attach_project_logo
+     attachments.inline["logo.png"] = File.read(Rails.root.join("app", "assets", "images", "osm_logo_30.png"))
+   end
+   def attach_user_avatar(user)
+     attachments.inline["avatar.png"] = File.read(user_avatar_file_path(user))
+   end
+   def user_avatar_file_path(user)
+     image = user && user.image
+     if image && image.file?
+       return image.path(:small)
+     else
+       return Rails.root.join("app", "assets", "images", "users", "images", "small.png")
+     end
+   end
    def with_recipient_locale(recipient)
      I18n.with_locale Locale.available.preferred(recipient.preferred_languages) do
        yield
      end
    end
  
-   def from_address(name, type, id, digest)
+   def from_address(name, type, id, digest, user_id = nil)
      if Object.const_defined?(:MESSAGES_DOMAIN) && domain = MESSAGES_DOMAIN
-       "#{name} <#{type}-#{id}-#{digest[0, 6]}@#{domain}>"
+       if user_id
+         "#{name} <#{type}-#{id}-#{user_id}-#{digest[0, 6]}@#{domain}>"
+       else
+         "#{name} <#{type}-#{id}-#{digest[0, 6]}@#{domain}>"
+       end
      else
        EMAIL_FROM
      end
diff --combined app/models/user.rb
index 6fbf8eecbb31573121d0209cece0112edbc3cb7a,3ce48e7cd34d021724adf2976ede26326fc82c47..63c9527c7870415bae932bb387bc8a158eb5ff20
@@@ -4,10 -4,12 +4,12 @@@ class User < ActiveRecord::Bas
    has_many :traces, -> { where(:visible => true) }
    has_many :diary_entries, -> { order(:created_at => :desc) }
    has_many :diary_comments, -> { order(:created_at => :desc) }
+   has_many :diary_entry_subscriptions, :class_name => "DiaryEntrySubscription"
+   has_many :diary_subscriptions, :through => :diary_entry_subscriptions, :source => :diary_entry
    has_many :messages, -> { where(:to_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :foreign_key => :to_user_id
    has_many :new_messages, -> { where(:to_user_visible => true, :message_read => false).order(:sent_on => :desc) }, :class_name => "Message", :foreign_key => :to_user_id
    has_many :sent_messages, -> { where(:from_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :class_name => "Message", :foreign_key => :from_user_id
-   has_many :friends, -> { joins(:befriendee).where(:users => { :status => %w(active confirmed) }) }
+   has_many :friends, -> { joins(:befriendee).where(:users => { :status => %w[active confirmed] }) }
    has_many :friend_users, :through => :friends, :source => :befriendee
    has_many :tokens, :class_name => "UserToken"
    has_many :preferences, :class_name => "UserPreference"
  
    has_many :roles, :class_name => "UserRole"
  
-   scope :visible, -> { where(:status => %w(pending active confirmed)) }
-   scope :active, -> { where(:status => %w(active confirmed)) }
 +  has_many :issues, :class_name => "Issue", :foreign_key => :reported_user_id
 +  has_one :issue, :class_name => "Issue", :foreign_key => :updated_by
 +  has_many :issue_comments
 +
 +  has_many :reports
 +
+   scope :visible, -> { where(:status => %w[pending active confirmed]) }
+   scope :active, -> { where(:status => %w[active confirmed]) }
    scope :identifiable, -> { where(:data_public => true) }
  
    has_attached_file :image,
@@@ -41,7 -37,7 +43,7 @@@
                      :styles => { :large => "100x100>", :small => "50x50>" }
  
    validates :display_name, :presence => true, :allow_nil => true, :length => 3..255,
-                            :exclusion => %w(new terms save confirm confirm-email go_public reset-password forgot-password suspended)
+                            :exclusion => %w[new terms save confirm confirm-email go_public reset-password forgot-password suspended]
    validates :display_name, :if => proc { |u| u.display_name_changed? },
                             :uniqueness => { :case_sensitive => false }
    validates :display_name, :if => proc { |u| u.display_name_changed? },
@@@ -87,7 -83,7 +89,7 @@@
          user = nil
        end
      elsif options[:token]
-       token = UserToken.find_by_token(options[:token])
+       token = UserToken.find_by(:token => options[:token])
        user = token.user if token
      end
  
        user = nil
      end
  
-     token.update_column(:expiry, 1.week.from_now) if token && user
+     token.update(:expiry => 1.week.from_now) if token && user
  
      user
    end
    ##
    # returns true if a user is visible
    def visible?
-     %w(pending active confirmed).include? status
+     %w[pending active confirmed].include? status
    end
  
    ##
    # returns true if a user is active
    def active?
-     %w(active confirmed).include? status
+     %w[active confirmed].include? status
    end
  
    ##
    def spam_score
      changeset_score = changesets.size * 50
      trace_score = traces.size * 50
-     diary_entry_score = diary_entries.inject(0) { |a, e| a + e.body.spam_score }
-     diary_comment_score = diary_comments.inject(0) { |a, e| a + e.body.spam_score }
+     diary_entry_score = diary_entries.inject(0) { |acc, elem| acc + elem.body.spam_score }
+     diary_comment_score = diary_comments.inject(0) { |acc, elem| acc + elem.body.spam_score }
  
      score = description.spam_score / 4.0
      score += diary_entries.where("created_at > ?", 1.day.ago).count * 10
    # perform a spam check on a user
    def spam_check
      if status == "active" && spam_score > SPAM_THRESHOLD
-       update_column(:status, "suspended")
+       update(:status => "suspended")
      end
    end
  
    ##
    # return an oauth access token for a specified application
    def access_token(application_key)
-     ClientApplication.find_by_key(application_key).access_token_for_user(self)
+     ClientApplication.find_by(:key => application_key).access_token_for_user(self)
    end
  
    private
index 8bc2b64693aa34ecb90339c83d54d46ae8c960ea,6a2a21abcba3bf26b0b341a5dd1fb4019501af57..23a5230c1f86c54d5a0a92cec51c69128eef14e2
  
  <a id="comments"></a>
  <div class='comments'>
 -<%= render :partial => 'diary_comment', :collection => @entry.visible_comments %>
 +  <% if @reported_comment %>
 +    <%= render :partial => 'diary_comment', :collection => @reported_comment %>
 +  <% else %>
 +    <%= render :partial => 'diary_comment', :collection => @entry.visible_comments %>
 +  <% end %>
  </div>
  <%= if_logged_in(:div) do %>
    <h3 id="newcomment"><%= t 'diary_entry.view.leave_a_comment' %></h3>
      <%= richtext_area :diary_comment, :body, :cols => 80, :rows => 15 %>
      <%= submit_tag t('diary_entry.view.save_button') %>
    <% end %>
+   <% if @user and @entry.subscribers.exists?(@user.id) %>
+     <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.unsubscribe'), diary_entry_unsubscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div>
+   <% elsif @user %>
+     <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.subscribe'), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div>
+   <% end %>
  <% end %>
  
  <%= if_not_logged_in(:div) do %>
index bc8fde49c73c4ed4e276195fe36fc2d754d87ba5,262989752706e10951415b19fd85ac413a494964..cd18e79dfc22401f74b4c569f88fc28e76542fff
@@@ -38,9 -38,6 +38,9 @@@
    </nav>
    <nav class='secondary'>
      <ul>
 +      <% if @user and ( @user.administrator? or @user.moderator? ) %>
 +        <li class="compact-hide <%= current_page_class(issues_path) %>"><b><%= link_to t('layouts.reports'), issues_path %></b></li>
 +      <% end %>
        <li class="compact-hide <%= current_page_class(traces_path) %>"><%= link_to t('layouts.gps_traces'), traces_path %></li>
        <li class="compact-hide <%= current_page_class(diary_path) %>"><%= link_to t('layouts.user_diaries'), diary_path %></li>
        <li class="compact-hide <%= current_page_class(copyright_path) %>"><%= link_to t('layouts.copyright'), copyright_path %></li>
@@@ -60,7 -57,7 +60,7 @@@
      <% if @user && @user.id %>
        <div class='dropdown user-menu logged-in'>
          <a class='dropdown-toggle' data-toggle='dropdown' href="#">
-           <%= user_thumbnail_tiny(@user, :size => 25, :width => 25, :height => 25)
+           <%= user_thumbnail_tiny(@user, :width => 25, :height => 25)
            %><%= render :partial => 'layouts/inbox'
          %><span class="user-button"><span class='username'><%= @user.display_name %></span>
            <b class="caret"></b></span>
@@@ -83,7 -80,7 +83,7 @@@
              <%= yield :greeting %>
            </li>
            <li>
-             <%= link_to t('layouts.logout'), logout_path(:session => request.session_options[:id], :referer => request.fullpath) %>
+             <%= link_to t('layouts.logout'), logout_path(:session => session.id, :referer => request.fullpath) %>
            </li>
          </ul>
        </div>
index 6bb64504d5bf1be7e7d9d52fc8d842fb7684ec88,91f85f305aa2ecd7689f54b5224c0041f73fe8b7..417b07bd0a618e1b8365600cf69b90cb0d1944d1
        <p class='deemphasize'>
          <small>
            <%= t 'user.view.mapper since' %> <%= l @this_user.creation_time.to_date, :format => :long %>
-           |
-           <%= t 'user.view.ct status' %>
-           <% if not @this_user.terms_agreed.nil? -%>
-           <%= t 'user.view.ct accepted', :ago =>time_ago_in_words(@this_user.terms_agreed)  %>
-           <% elsif not @this_user.terms_seen? -%>
-           <%= t 'user.view.ct undecided' %>
-           <% else -%>
-           <%= t 'user.view.ct declined' %>
+           <% unless @this_user.terms_agreed %>
+             |
+             <%= t 'user.view.ct status' %>
+             <% if @this_user.terms_seen? -%>
+               <%= t 'user.view.ct declined' %>
+             <% else -%>
+               <%= t 'user.view.ct undecided' %>
+             <% end -%>
            <% end -%>
          </small>
        </p>
      </div>
  
 +    <% if @user and @this_user.id != @user.id %>
 +      <div class="report-button">
 +         <%= link_to new_issue_url(reportable_id: @this_user.id, reportable_type: @this_user.class.name, reported_user_id: @this_user.id,referer: request.fullpath), :title => t('user.view.report') do%>
 +            &nbsp;&#9872;
 +         <% end %>
 +      </div>
 +    <% end %>
 +
      <div class="user-description richtext"><%= @this_user.description.to_html %></div>
  
    </div>
diff --combined config/locales/en-GB.yml
index ea13cf0f87491e0e9fb9252125c267b725a8d631,430af7d456b8e94a0ce06262d7dd96ce581756dd..c5b2630cfb9debf5fc0e4f0b8a107f634828323b
@@@ -8,12 -8,17 +8,17 @@@
  # Author: Captaindogfish
  # Author: Chase me ladies, I'm the Cavalry
  # Author: E THP
+ # Author: EdLoach
+ # Author: Eduard Popov
+ # Author: IknowJoseph
  # Author: Jagwar
  # Author: Kosovastar
  # Author: Macofe
  # Author: Meno25
  # Author: Sampablokuper
  # Author: Shirayuki
+ # Author: Smsm1
+ # Author: ديفيد
  ---
  en-GB:
    html:
          title_comment: Changeset %{id} - %{comment}
        join_discussion: Log in to join the discussion
        discussion: Discussion
 +      report: Report this changeset?
      node:
        title: 'Node: %{name}'
        history_title: 'Node History: %{name}'
        reopened_by_anonymous: Reactivated by anonymous <abbr title='%{exact_time}'>%{when}
          ago</abbr>
        hidden_by: Hidden by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>
 +      report: Report this note?
      query:
        title: Query Features
        introduction: Click on the map to find nearby features.
        edit_link: Edit this entry
        hide_link: Hide this entry
        confirm: Confirm
 +      report: Report this entry?
      diary_comment:
        comment_from: Comment from %{link_user} on %{comment_created_at}
        hide_link: Hide this comment
        confirm: Confirm
 +      report: Report this comment?
      location:
        location: 'Location:'
        view: View
            clock: Clock
            college: College
            community_centre: Community Centre
-           courthouse: Courthouse
+           courthouse: Court
            crematorium: Crematorium
            dentist: Dentist
            doctors: Doctors
            vending_machine: Vending Machine
            veterinary: Veterinary Surgery
            village_hall: Village Hall
-           waste_basket: bin
+           waste_basket: Waste Bin
            waste_disposal: Waste Disposal
            youth_centre: Youth Centre
          boundary:
      results:
        no_results: No results found
        more_results: More results
 +  issues:
 +    report: Report
 +    resolve: Resolve
 +    ignore: Ignore
 +    reopen: Reopen
 +    index:
 +      search:
 +        user_not_found: User does not exist
 +        issues_not_found: No such issues found
 +    create:
 +      successful_report: Your report has been registered sucessfully
 +      provide_details: Please provide the required details
 +    update:
 +      new_report: Your report been registered sucessfully
 +      successful_update: Your report has been updated successfully
 +      provide_details: Please provide the required details
 +    new:
 +      details: Please provide some more details into the problem. (This field cannot be left blank!)
 +      select: Select a reason for your report
 +      disclaimer:
 +        placeholder: Before sending in a report for official action, be sure that
 +        placeholder1: You are sure that the problem is not just a mistake
 +        placeholder2: You are unable to fix the problem yourself
 +        placeholder3: You have tried to resolve the problem with the user
 +    show:
 +      comments:
 +        reassign: The Issue was reassigned
 +        reassign_param: Reassign Issue?
 +    comment:
 +      provide_details: Please provide the required details
 +      comment_created: Your comment was successfully created
 +    resolved: Issue status has been set to 'Resolved'
 +    ignored: Issue status has been set to 'Ignored'
 +    reopened: Issue status has been set to 'Open'
 +    report_strings:
 +      DiaryEntry:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Entry is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Entry is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Entry contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      DiaryComment:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Comment is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Comment is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Comment contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      User:
 +        spam:
 +          type: "[SPAM]"
 +          details: This User profile is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This User profile is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This User profile contains a threat
 +        vandal:
 +          type: "[VANDAL]"
 +          details: This User is a vandal
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Changeset:
 +        undiscussed_import:
 +          type: "[UNDISCUSSED-IMPORT]"
 +          details: This changeset is an undiscussed import
 +        mechanical_edit:
 +          type: "[MECH-EDIT]"
 +          details: This changeset is a mechanical edit
 +        edit_error:
 +          type: "[EDIT-ERROR]"
 +          details: This changeset contains a newbie or an editor error
 +        spam:
 +          type: "[SPAM]"
 +          details: This changeset is/contains spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This changeset is/contains vandalism
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Note:
 +        spam:
 +          type: "[SPAM]"
 +          details: This note is spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This note is vandalism
 +        personal:
 +          type: "[PERSONAL]"
 +          details: This note contains personal data
 +        abusive:
 +          type: "[ABUSIVE]"
 +          details: This note is abusive
 +        other:
 +          type: "[OTHER]"
 +          details: Other
    layouts:
      project_name:
        title: OpenStreetMap
      edit: Edit
      history: History
      export: Export
 +    reports: Reports
      data: Data
      export_data: Export Data
      gps_traces: GPS Traces
      intro_2_create_account: Create a user account
      partners_html: Hosting is supported by %{ucl}, %{ic} and %{bytemark}, and other
        %{partners}.
-     partners_ucl: the UCL VR Centre
+     partners_ucl: UCL
      partners_ic: Imperial College London
      partners_bytemark: Bytemark Hosting
      partners_partners: partners
-     partners_url: http://wiki.openstreetmap.org/wiki/Partners
      osm_offline: The OpenStreetMap database is currently offline while essential database
        maintenance work is carried out.
      osm_read_only: The OpenStreetMap database is currently in read-only mode while
          href="http://osmfoundation.org/Licence">OSMF Licence page</a> and the community <a
          href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal
          FAQ</a>.
-       more_2_html: Although OpenStreetMap is open data, we cannot provide a free-of-charge
-         map API for third-party developers. See our <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API
-         Usage Policy</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Tile
-         Usage Policy</a> and <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim
-         Usage Policy</a>.
+       more_2_html: |-
+         Although OpenStreetMap is open data, we cannot provide a
+         free-of-charge map API for third-parties.
+         See our <a href="https://operations.osmfoundation.org/policies/api/">API Usage Policy</a>,
+         <a href="https://operations.osmfoundation.org/policies/tiles/">Tile Usage Policy</a>
+         and <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Usage Policy</a>.
        contributors_title_html: Our contributors
        contributors_intro_html: |-
          Our contributors are thousands of individuals. We also include
      legal_title: Legal
      legal_html: "This site and many other related services are formally operated by
        the  \n<a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
-       \non behalf of the community.\n<br> \nPlease <a href='http://osmfoundation.org/Contact'>contact
+       \non behalf of the community. Use of all OSMF operated services is subject \nto
+       our <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nAcceptable
+       Use Policies</a> and our <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacy
+       Policy</a>\n<br> \nPlease <a href='http://osmfoundation.org/Contact'>contact
        the OSMF</a> \nif you have licensing, copyright or other legal questions and
        issues."
      partners_title: Partners
    notifier:
      diary_comment_notification:
-       subject: '[OpenStreetMap] %{user} commented on your diary entry'
+       subject: '[OpenStreetMap] %{user} commented on a diary entry'
        hi: Hi %{to_user},
-       header: '%{from_user} has commented on your recent OpenStreetMap diary entry
-         with the subject %{subject}:'
+       header: '%{from_user} has commented on the OpenStreetMap diary entry with the
+         subject %{subject}:'
        footer: You can also read the comment at %{readurl} and you can comment at %{commenturl}
          or reply at %{replyurl}
      message_notification:
        footer_html: You can also read the message at %{readurl} and you can reply at
          %{replyurl}
      friend_notification:
+       hi: Hi %{to_user},
        subject: '[OpenStreetMap] %{user} added you as a friend'
        had_added_you: '%{user} has added you as a friend on OpenStreetMap.'
        see_their_profile: You can see their profile at %{userurl}.
            on. The note is near %{place}.'
        details: More details about the note can be found at %{url}.
      changeset_comment_notification:
+       hi: Hi %{to_user},
        greeting: Hi,
        commented:
          subject_own: '[OpenStreetMap] %{commenter} has commented on one of your changesets'
          partial_changeset_with_comment: with comment '%{changeset_comment}'
          partial_changeset_without_comment: without comment
        details: More details about the changeset can be found at %{url}.
+       unsubscribe: To unsubscribe from updates to this changeset, visit %{url} and
+         click "Unsubscribe".
 +    new_issue_notification:
 +      subject: "[OpenStreetMap] New Issue"
 +      greeting: "Hi,"
 +      new_issue: "A new issue has been created"
 +      url: You can view the issue here
    message:
      inbox:
        title: Inbox
            track: Track
            bridleway: Bridleway
            cycleway: Cycleway
+           cycleway_national: National cycleway
+           cycleway_regional: Regional cycleway
+           cycleway_local: Local cycleway
            footway: Footway
            rail: Railway
            subway: Subway
            private: Private access
            destination: Destination access
            construction: Roads under construction
+           bicycle_shop: Bicycle shop
+           bicycle_parking: Bicycle parking
+           toilets: Toilets
      richtext_area:
        edit: Edit
        preview: Preview
        second: Second item
        link: Link
        text: Text
-       image: شکیل
+       image: Image
        alt: Alt text
        url: URL
    trace:
      require_cookies:
        cookies_needed: You appear to have cookies disabled - please enable cookies
          in your browser before continuing.
 +    require_admin:
 +      not_an_admin: You need to be an admin to perform that action.
      require_moderator:
        not_a_moderator: You need to be a moderator to perform that action.
      setup_user_auth:
+       blocked_zero_hour: You have an urgent message on the OpenStreetMap web site.
+         You need to read the message before you will be able to save your edits.
        blocked: Your access to the API has been blocked. Please log-in to the web interface
          to find out more.
        need_to_see_terms: Your access to the API is temporarily suspended. Please log-in
        invalid: The authorisation token is not valid.
      revoke:
        flash: You've revoked the token for %{application}
+     permissions:
+       missing: You have not permitted the application access to this facility
    oauth_clients:
      new:
        title: Register a new application
          github:
            title: Login with GitHub
            alt: Login with a GitHub Account
+         wikipedia:
+           title: Login with Wikipedia
+           alt: Login with a Wikipedia Account
          yahoo:
            title: Login with Yahoo
            alt: Login with a Yahoo OpenID
          terms</a>.
        email address: 'Email Address:'
        confirm email address: 'Confirm Email Address:'
-       not displayed publicly: Not displayed publicly (see <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
-         title="wiki privacy policy including section on email addresses">privacy policy</a>)
+       not displayed publicly: Your address is not displayed publicly, see our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+         title="OSMF privacy policy including section on email addresses">privacy policy</a>
+         for more information
        display name: 'Display Name:'
        display name description: Your publicly displayed username. You can change this
          later in the preferences.
        friends_diaries: friends' diary entries
        nearby_changesets: nearby user changesets
        nearby_diaries: nearby user diary entries
 +      report: Report this user?
      popup:
        your location: Your location
        nearby mapper: Nearby mapper
          gravatar: Use Gravatar
          link: http://wiki.openstreetmap.org/wiki/Gravatar
          link text: what is this?
+         disabled: Gravatar has been disabled.
+         enabled: Display of your Gravatar has been enabled.
        new image: Add an image
        keep image: Keep the current image
        delete image: Remove the current image
      helper:
        time_future: Ends in %{time}.
        until_login: Active until the user logs in.
+       time_future_and_until_login: Ends in %{time} and after the user has logged in.
        time_past: Ended %{time} ago.
      blocks_on:
        title: Blocks on %{name}
      key:
        title: Map Key
        tooltip: Legend
-       tooltip_disabled: Legend available only for Standard layer
+       tooltip_disabled: Map Key not available for this layer
      map:
        zoom:
          in: Zoom In
          header: Map Layers
          notes: Map Notes
          data: Map Data
+         gps: Public GPS Traces
          overlays: Enable overlays for troubleshooting the map
          title: Layers
        copyright: © <a href='%{copyright_url}'>OpenStreetMap contributors</a>
      edit_help: Move the map and zoom in on a location you want to edit, then click
        here.
      directions:
+       ascend: Ascend
        engines:
          graphhopper_bicycle: Bicycle (GraphHopper)
          graphhopper_foot: Foot (GraphHopper)
          mapzen_bicycle: Bicycle (Mapzen)
          mapzen_car: Car (Mapzen)
          mapzen_foot: Foot (Mapzen)
+       descend: Descend
        directions: Directions
        distance: Distance
        errors:
          against_oneway_without_exit: Go against one-way on %{name}
          end_oneway_without_exit: End of one-way on %{name}
          roundabout_with_exit: At roundabout take exit %{exit} onto %{name}
+         turn_left_with_exit: At roundabout turn left onto %{name}
+         slight_left_with_exit: At roundabout slight left onto %{name}
+         turn_right_with_exit: At roundabout turn right onto %{name}
+         slight_right_with_exit: At roundabout slight right onto %{name}
+         continue_with_exit: At roundabout continue straight onto %{name}
          unnamed: unnamed road
          courtesy: Directions courtesy of %{link}
        time: Time
        nothing_found: No features found
        error: 'Error contacting %{server}: %{error}'
        timeout: Timeout contacting %{server}
+     context:
+       directions_from: Directions from here
+       directions_to: Directions to here
+       add_note: Add a note here
+       show_address: Show address
+       query_features: Query features
+       centre_map: Centre map here
    redaction:
      edit:
        description: Description
diff --combined config/locales/en.yml
index dc59506e853e4e197a468516b7d1b5cedd4f1fcb,a05083a1e59956cff11cba0621d71fa8c7c35b91..558e960b4e12f9b923e30d78c2c59f72c75ba5dc
@@@ -131,7 -131,6 +131,7 @@@ en
          title_comment: "Changeset %{id} - %{comment}"
        join_discussion: "Log in to join the discussion"
        discussion: Discussion
 +      report: Report this changeset?
      node:
        title: "Node: %{name}"
        history_title: "Node History: %{name}"
        reopened_by: "Reactivated by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>"
        reopened_by_anonymous: "Reactivated by anonymous <abbr title='%{exact_time}'>%{when} ago</abbr>"
        hidden_by: "Hidden by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>"
 +      report: Report this note?
      query:
        title: "Query Features"
        introduction: "Click on the map to find nearby features."
        edit_link: Edit this entry
        hide_link: Hide this entry
        confirm: Confirm
 +      report: Report this entry?
      diary_comment:
        comment_from: "Comment from %{link_user} on %{comment_created_at}"
        hide_link: Hide this comment
        confirm: Confirm
 +      report: Report this comment?
      location:
        location: "Location:"
        view: "View"
            car_parts: "Car Parts"
            car_repair: "Car Repair"
            carpet: "Carpet Shop"
-           car_repair: "Car Repair"
            charity: "Charity Shop"
            chemist: "Chemist"
            clothes: "Clothes Shop"
      results:
        no_results: "No results found"
        more_results: "More results"
 +  issues:
 +    report: Report
 +    resolve: Resolve
 +    ignore: Ignore
 +    reopen: Reopen
 +    index:
 +      search:
 +        user_not_found: User does not exist
 +        issues_not_found: No such issues found
 +    create:
 +      successful_report: Your report has been registered sucessfully
 +      provide_details: Please provide the required details
 +    update:
 +      new_report: Your report been registered sucessfully
 +      successful_update: Your report has been updated successfully
 +      provide_details: Please provide the required details
 +    new:
 +      details: Please provide some more details into the problem. (This field cannot be left blank!)
 +      select: Select a reason for your report
 +      disclaimer:
 +        intro: Before sending in a report for official action, be sure that
 +        not_just_mistake: You are sure that the problem is not just a mistake
 +        unable_to_fix: You are unable to fix the problem yourself
 +        resolve_with_user: You have tried to resolve the problem with the user
 +    show:
 +      comments:
 +        reassign: The Issue was reassigned
 +        reassign_param: Reassign Issue?
 +    comment:
 +      provide_details: Please provide the required details
 +      comment_created: Your comment was successfully created
 +    resolved: Issue status has been set to 'Resolved'
 +    ignored: Issue status has been set to 'Ignored'
 +    reopened: Issue status has been set to 'Open'
 +    report_strings:
 +      DiaryEntry:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Entry is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Entry is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Entry contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      DiaryComment:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Comment is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Comment is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Comment contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      User:
 +        spam:
 +          type: "[SPAM]"
 +          details: This User profile is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This User profile is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This User profile contains a threat
 +        vandal:
 +          type: "[VANDAL]"
 +          details: This User is a vandal
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Changeset:
 +        undiscussed_import:
 +          type: "[UNDISCUSSED-IMPORT]"
 +          details: This changeset is an undiscussed import
 +        mechanical_edit:
 +          type: "[MECH-EDIT]"
 +          details: This changeset is a mechanical edit
 +        edit_error:
 +          type: "[EDIT-ERROR]"
 +          details: This changeset contains a newbie or an editor error
 +        spam:
 +          type: "[SPAM]"
 +          details: This changeset is/contains spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This changeset is/contains vandalism
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Note:
 +        spam:
 +          type: "[SPAM]"
 +          details: This note is spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This note is vandalism
 +        personal:
 +          type: "[PERSONAL]"
 +          details: This note contains personal data
 +        abusive:
 +          type: "[ABUSIVE]"
 +          details: This note is abusive
 +        other:
 +          type: "[OTHER]"
 +          details: Other
    layouts:
      project_name:
        # in <title>
      edit: Edit
      history: History
      export: Export
 +    reports: Reports
      data: Data
      export_data: Export Data
      gps_traces: GPS Traces
      intro_header: Welcome to OpenStreetMap!
      intro_text: OpenStreetMap is a map of the world, created by people like you and free to use under an open license.
      intro_2_create_account: "Create a user account"
-     partners_html: "Hosting is supported by %{ucl}, %{ic} and %{bytemark}, and other %{partners}."
-     partners_ucl: "the UCL VR Centre"
+     partners_html: "Hosting is supported by %{ucl}, %{bytemark} and %{ic}, and other %{partners}."
+     partners_ucl: "UCL"
      partners_ic: "Imperial College London"
      partners_bytemark: "Bytemark Hosting"
      partners_partners: "partners"
-     partners_url: "http://wiki.openstreetmap.org/wiki/Partners"
      osm_offline: "The OpenStreetMap database is currently offline while essential database maintenance work is carried out."
      osm_read_only: "The OpenStreetMap database is currently in read-only mode while essential database maintenance work is carried out."
      donate: "Support OpenStreetMap by %{link} to the Hardware Upgrade Fund."
          FAQ</a>.
        more_2_html: |
          Although OpenStreetMap is open data, we cannot provide a
-         free-of-charge map API for third-party developers.
-         See our <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Usage Policy</a>,
-         <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Tile Usage Policy</a>
-         and <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim Usage Policy</a>.
+         free-of-charge map API for third-parties.
+         See our <a href="https://operations.osmfoundation.org/policies/api/">API Usage Policy</a>,
+         <a href="https://operations.osmfoundation.org/policies/tiles/">Tile Usage Policy</a>
+         and <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Usage Policy</a>.
        contributors_title_html: Our contributors
        contributors_intro_html: |
          Our contributors are thousands of individuals. We also include
        paragraph_1_html: |
          OpenStreetMap has few formal rules but we expect all participants to collaborate
          with, and communicate with, the community. If you are considering
--        any activities other than editing by hand, please read and follow the guidelines on 
--        <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and 
++        any activities other than editing by hand, please read and follow the guidelines on
++        <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and
          <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automated Edits</a>.
      questions:
        title: Any questions?
          title: Join the community
          explanation_html: |
            If you have noticed a problem with our map data, for example a road is missing or your address, the best way to
--          proceed is to join the OpenStreetMap community and add or repair the data yourself. 
++          proceed is to join the OpenStreetMap community and add or repair the data yourself.
        add_a_note:
          instructions_html: |
            Just click <a class='icon note'></a> or the same icon on the map display.
        title: Other concerns
        explanation_html: |
          If you have concerns about how our data is being used or about the contents please consult our
--        <a href='/copyright'>copyright page</a> for more legal information, or contact the appropriate 
--        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.  
++        <a href='/copyright'>copyright page</a> for more legal information, or contact the appropriate
++        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.
    help_page:
      title: Getting Help
      introduction: |
        License page</a> for details.
      legal_title: Legal
      legal_html: |
--      This site and many other related services are formally operated by the  
--      <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) 
-       on behalf of the community.
-       <br> 
-       Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a> 
 -      on behalf of the community. Use of all OSMF operated services is subject 
++      This site and many other related services are formally operated by the
++      <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
++      on behalf of the community. Use of all OSMF operated services is subject
+       to our <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+       Acceptable Use Policies</a> and our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a>
 -      <br> 
 -      Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a> 
++      <br>
++      Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a>
        if you have licensing, copyright or other legal questions and issues.
      partners_title: Partners
    notifier:
      diary_comment_notification:
-       subject: "[OpenStreetMap] %{user} commented on your diary entry"
+       subject: "[OpenStreetMap] %{user} commented on a diary entry"
        hi: "Hi %{to_user},"
-       header: "%{from_user} has commented on your recent OpenStreetMap diary entry with the subject %{subject}:"
+       header: "%{from_user} has commented on the OpenStreetMap diary entry with the subject %{subject}:"
        footer: "You can also read the comment at %{readurl} and you can comment at %{commenturl} or reply at %{replyurl}"
      message_notification:
        subject_header: "[OpenStreetMap] %{subject}"
        header: "%{from_user} has sent you a message through OpenStreetMap with the subject %{subject}:"
        footer_html: "You can also read the message at %{readurl} and you can reply at %{replyurl}"
      friend_notification:
+       hi: "Hi %{to_user},"
        subject: "[OpenStreetMap] %{user} added you as a friend"
        had_added_you: "%{user} has added you as a friend on OpenStreetMap."
        see_their_profile: "You can see their profile at %{userurl}."
          commented_note: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}."
        details: "More details about the note can be found at %{url}."
      changeset_comment_notification:
+       hi: "Hi %{to_user},"
        greeting: "Hi,"
        commented:
          subject_own: "[OpenStreetMap] %{commenter} has commented on one of your changesets"
          partial_changeset_with_comment: "with comment '%{changeset_comment}'"
          partial_changeset_without_comment: "without comment"
        details: "More details about the changeset can be found at %{url}."
+       unsubscribe: 'To unsubscribe from updates to this changeset, visit %{url} and click "Unsubscribe".'
 +    new_issue_notification:
 +      subject: "[OpenStreetMap] New Issue"
 +      greeting: "Hi,"
 +      new_issue: "A new issue has been created"
 +      url: You can view the issue here
    message:
      inbox:
        title: "Inbox"
        date: "Date"
        reply_button: "Reply"
        unread_button: "Mark as unread"
+       delete_button: "Delete"
        back: "Back"
        to: "To"
        wrong_user: "You are logged in as `%{user}' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it."
    application:
      require_cookies:
        cookies_needed: "You appear to have cookies disabled - please enable cookies in your browser before continuing."
 +    require_admin:
 +      not_an_admin: You need to be an admin to perform that action.
      require_moderator:
        not_a_moderator: "You need to be a moderator to perform that action."
      setup_user_auth:
+       blocked_zero_hour: "You have an urgent message on the OpenStreetMap web site. You need to read the message before you will be able to save your edits."
        blocked: "Your access to the API has been blocked. Please log-in to the web interface to find out more."
        need_to_see_terms: "Your access to the API is temporarily suspended. Please log-in to the web interface to view the Contributor Terms. You do not need to agree, but you must view them."
    oauth:
        invalid: "The authorization token is not valid."
      revoke:
        flash: "You've revoked the token for %{application}"
+     permissions:
+       missing: "You have not permitted the application access to this facility"
    oauth_clients:
      new:
        title: "Register a new application"
          github:
            title: Login with GitHub
            alt: Login with a GitHub Account
+         wikipedia:
+           title: Login with Wikipedia
+           alt: Login with a Wikipedia Account
          yahoo:
            title: Login with Yahoo
            alt: Login with a Yahoo OpenID
        license_agreement: 'When you confirm your account you will need to agree to the <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">contributor terms</a>.'
        email address: "Email Address:"
        confirm email address: "Confirm Email Address:"
-       not displayed publicly: 'Not displayed publicly (see <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">privacy policy</a>)'
+       not displayed publicly: 'Your address is not displayed publicly, see our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy policy including section on email addresses">privacy policy</a> for more information'
        display name: "Display Name:"
        display name description: "Your publicly displayed username. You can change this later in the preferences."
        external auth: "Third Party Authentication:"
        friends_diaries: "friends' diary entries"
        nearby_changesets: "nearby user changesets"
        nearby_diaries: "nearby user diary entries"
 +      report: "Report this user?"
      popup:
        your location: "Your location"
        nearby mapper: "Nearby mapper"
      helper:
        time_future: "Ends in %{time}."
        until_login: "Active until the user logs in."
+       time_future_and_until_login: "Ends in %{time} and after the user has logged in."
        time_past: "Ended %{time} ago."
      blocks_on:
        title: "Blocks on %{name}"
      key:
        title: "Map Key"
        tooltip: "Map Key"
-       tooltip_disabled: "Map Key available only for Standard layer"
+       tooltip_disabled: "Map Key not available for this layer"
      map:
        zoom:
          in: Zoom In
          header: Map Layers
          notes: Map Notes
          data: Map Data
+         gps: Public GPS Traces
          overlays: Enable overlays for troubleshooting the map
          title: "Layers"
        copyright: "© <a href='%{copyright_url}'>OpenStreetMap contributors</a>"
          comment: Comment
      edit_help: Move the map and zoom in on a location you want to edit, then click here.
      directions:
+       ascend: "Ascend"
        engines:
          graphhopper_bicycle: "Bicycle (GraphHopper)"
+         graphhopper_car: "Car (GraphHopper)"
          graphhopper_foot: "Foot (GraphHopper)"
          mapquest_bicycle: "Bicycle (MapQuest)"
          mapquest_car: "Car (MapQuest)"
          mapzen_bicycle: "Bicycle (Mapzen)"
          mapzen_car: "Car (Mapzen)"
          mapzen_foot: "Foot (Mapzen)"
+       descend: "Descend"
        directions: "Directions"
        distance: "Distance"
        errors:
          against_oneway_without_exit: Go against one-way on %{name}
          end_oneway_without_exit: End of one-way on %{name}
          roundabout_with_exit: At roundabout take exit %{exit} onto %{name}
+         turn_left_with_exit: At roundabout turn left onto %{name}
+         slight_left_with_exit: At roundabout slight left onto %{name}
+         turn_right_with_exit: At roundabout turn right onto %{name}
+         slight_right_with_exit: At roundabout slight right onto %{name}
+         continue_with_exit: At roundabout continue straight onto %{name}
          unnamed: "unnamed road"
          courtesy: "Directions courtesy of %{link}"
        time: "Time"
        nothing_found: No features found
        error: "Error contacting %{server}: %{error}"
        timeout: "Timeout contacting %{server}"
+     context:
+       directions_from: Directions from here
+       directions_to: Directions to here
+       add_note: Add a note here
+       show_address: Show address
+       query_features: Query features
+       centre_map: Centre map here
    redaction:
      edit:
        description: "Description"
diff --combined config/routes.rb
index 7692ebdadfe952ccee7d2b8ddad6145accf5c205,47bedac08ed80e809970f2fffd3883177198358e..c92926bd5fc46d20cc6d0e94f4e2b74690d82c60
@@@ -184,7 -184,7 +184,7 @@@ OpenStreetMap::Application.routes.draw 
    match "/go/:code" => "site#permalink", :via => :get, :code => /[a-zA-Z0-9_@~]+[=-]*/
  
    # rich text preview
-   match "/preview/:format" => "site#preview", :via => :post, :as => :preview
+   match "/preview/:type" => "site#preview", :via => :post, :as => :preview
  
    # traces
    match "/user/:display_name/traces/tag/:tag/page/:page" => "trace#list", :via => :get, :page => /[1-9][0-9]*/
    match "/traces/mine" => "trace#mine", :via => :get
    match "/trace/create" => "trace#create", :via => [:get, :post]
    match "/trace/:id/data" => "trace#data", :via => :get, :id => /\d+/, :as => "trace_data"
-   match "/trace/:id/edit" => "trace#edit", :via => [:get, :post, :patch], :id => /\d+/, :as => "trace_edit"
+   match "/trace/:id/edit" => "trace#edit", :via => [:get, :post], :id => /\d+/, :as => "trace_edit"
    match "/trace/:id/delete" => "trace#delete", :via => :post, :id => /\d+/
  
    # diary pages
    match "/user/:display_name/diary/:id/edit" => "diary_entry#edit", :via => [:get, :post], :id => /\d+/
    match "/user/:display_name/diary/:id/hide" => "diary_entry#hide", :via => :post, :id => /\d+/, :as => :hide_diary_entry
    match "/user/:display_name/diary/:id/hidecomment/:comment" => "diary_entry#hidecomment", :via => :post, :id => /\d+/, :comment => /\d+/, :as => :hide_diary_comment
+   match "/user/:display_name/diary/:id/subscribe" => "diary_entry#subscribe", :via => :post, :as => :diary_entry_subscribe, :id => /\d+/
+   match "/user/:display_name/diary/:id/unsubscribe" => "diary_entry#unsubscribe", :via => :post, :as => :diary_entry_unsubscribe, :id => /\d+/
  
    # user pages
    match "/user/:display_name" => "user#view", :via => :get, :as => "user"
    resources :user_blocks
    match "/blocks/:id/revoke" => "user_blocks#revoke", :via => [:get, :post], :as => "revoke_user_block"
  
 +  # issues and reports
 +  resources :issues do
 +    member do
 +      post "resolve"
 +      post "assign"
 +      post "ignore"
 +      post "reopen"
 +    end
 +  end
 +
 +  post "/comment" => "issues#comment"
 +
    # redactions
    resources :redactions
  end
diff --combined db/structure.sql
index 53be24a5a8b20ddc2aa81d81cb567b0d9615379c,08aafa8d7ccea6d24ceb06927b777d1aee9ee7df..be0603e6ea299927e23c3b2140ccdbb39fd1ee5f
@@@ -2,8 -2,8 +2,8 @@@
  -- PostgreSQL database dump
  --
  
- -- Dumped from database version 9.5.3
- -- Dumped by pg_dump version 9.5.3
+ -- Dumped from database version 9.5.7
+ -- Dumped by pg_dump version 9.5.7
  
  SET statement_timeout = 0;
  SET lock_timeout = 0;
@@@ -187,6 -187,18 +187,18 @@@ CREATE SEQUENCE acls_id_se
  ALTER SEQUENCE acls_id_seq OWNED BY acls.id;
  
  
+ --
+ -- Name: ar_internal_metadata; Type: TABLE; Schema: public; Owner: -
+ --
+ CREATE TABLE ar_internal_metadata (
+     key character varying NOT NULL,
+     value character varying,
+     created_at timestamp without time zone NOT NULL,
+     updated_at timestamp without time zone NOT NULL
+ );
  --
  -- Name: changeset_comments; Type: TABLE; Schema: public; Owner: -
  --
@@@ -550,6 -562,16 +562,16 @@@ CREATE SEQUENCE diary_entries_id_se
  ALTER SEQUENCE diary_entries_id_seq OWNED BY diary_entries.id;
  
  
+ --
+ -- Name: diary_entry_subscriptions; Type: TABLE; Schema: public; Owner: -
+ --
+ CREATE TABLE diary_entry_subscriptions (
+     user_id bigint NOT NULL,
+     diary_entry_id bigint NOT NULL
+ );
  --
  -- Name: friends; Type: TABLE; Schema: public; Owner: -
  --
@@@ -663,79 -685,6 +685,79 @@@ CREATE SEQUENCE gpx_files_id_se
  ALTER SEQUENCE gpx_files_id_seq OWNED BY gpx_files.id;
  
  
 +--
 +-- Name: issue_comments; Type: TABLE; Schema: public; Owner: -
 +--
 +
 +CREATE TABLE issue_comments (
 +    id integer NOT NULL,
 +    issue_id integer,
 +    commenter_user_id integer,
 +    body text,
 +    created_at timestamp without time zone NOT NULL,
 +    reassign boolean,
 +    updated_at timestamp without time zone NOT NULL
 +);
 +
 +
 +--
 +-- Name: issue_comments_id_seq; Type: SEQUENCE; Schema: public; Owner: -
 +--
 +
 +CREATE SEQUENCE issue_comments_id_seq
 +    START WITH 1
 +    INCREMENT BY 1
 +    NO MINVALUE
 +    NO MAXVALUE
 +    CACHE 1;
 +
 +
 +--
 +-- Name: issue_comments_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
 +--
 +
 +ALTER SEQUENCE issue_comments_id_seq OWNED BY issue_comments.id;
 +
 +
 +--
 +-- Name: issues; Type: TABLE; Schema: public; Owner: -
 +--
 +
 +CREATE TABLE issues (
 +    id integer NOT NULL,
 +    reportable_type character varying NOT NULL,
 +    reportable_id integer NOT NULL,
 +    reported_user_id integer NOT NULL,
 +    status integer,
 +    issue_type character varying,
 +    resolved_at timestamp without time zone,
 +    resolved_by integer,
 +    created_at timestamp without time zone NOT NULL,
 +    updated_at timestamp without time zone NOT NULL,
 +    updated_by integer,
 +    report_count integer DEFAULT 0
 +);
 +
 +
 +--
 +-- Name: issues_id_seq; Type: SEQUENCE; Schema: public; Owner: -
 +--
 +
 +CREATE SEQUENCE issues_id_seq
 +    START WITH 1
 +    INCREMENT BY 1
 +    NO MINVALUE
 +    NO MAXVALUE
 +    CACHE 1;
 +
 +
 +--
 +-- Name: issues_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
 +--
 +
 +ALTER SEQUENCE issues_id_seq OWNED BY issues.id;
 +
 +
  --
  -- Name: languages; Type: TABLE; Schema: public; Owner: -
  --
@@@ -1037,39 -986,6 +1059,39 @@@ CREATE TABLE relations 
  );
  
  
 +--
 +-- Name: reports; Type: TABLE; Schema: public; Owner: -
 +--
 +
 +CREATE TABLE reports (
 +    id integer NOT NULL,
 +    issue_id integer,
 +    reporter_user_id integer,
 +    details text,
 +    created_at timestamp without time zone NOT NULL,
 +    updated_at timestamp without time zone NOT NULL
 +);
 +
 +
 +--
 +-- Name: reports_id_seq; Type: SEQUENCE; Schema: public; Owner: -
 +--
 +
 +CREATE SEQUENCE reports_id_seq
 +    START WITH 1
 +    INCREMENT BY 1
 +    NO MINVALUE
 +    NO MAXVALUE
 +    CACHE 1;
 +
 +
 +--
 +-- Name: reports_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
 +--
 +
 +ALTER SEQUENCE reports_id_seq OWNED BY reports.id;
 +
 +
  --
  -- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -
  --
@@@ -1372,20 -1288,6 +1394,20 @@@ ALTER TABLE ONLY gpx_file_tags ALTER CO
  ALTER TABLE ONLY gpx_files ALTER COLUMN id SET DEFAULT nextval('gpx_files_id_seq'::regclass);
  
  
 +--
 +-- Name: id; Type: DEFAULT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issue_comments ALTER COLUMN id SET DEFAULT nextval('issue_comments_id_seq'::regclass);
 +
 +
 +--
 +-- Name: id; Type: DEFAULT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issues ALTER COLUMN id SET DEFAULT nextval('issues_id_seq'::regclass);
 +
 +
  --
  -- Name: id; Type: DEFAULT; Schema: public; Owner: -
  --
@@@ -1428,13 -1330,6 +1450,13 @@@ ALTER TABLE ONLY oauth_tokens ALTER COL
  ALTER TABLE ONLY redactions ALTER COLUMN id SET DEFAULT nextval('redactions_id_seq'::regclass);
  
  
 +--
 +-- Name: id; Type: DEFAULT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY reports ALTER COLUMN id SET DEFAULT nextval('reports_id_seq'::regclass);
 +
 +
  --
  -- Name: id; Type: DEFAULT; Schema: public; Owner: -
  --
@@@ -1471,6 -1366,14 +1493,14 @@@ ALTER TABLE ONLY acl
      ADD CONSTRAINT acls_pkey PRIMARY KEY (id);
  
  
+ --
+ -- Name: ar_internal_metadata_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+ --
+ ALTER TABLE ONLY ar_internal_metadata
+     ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
  --
  -- Name: changeset_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
  --
@@@ -1575,6 -1478,14 +1605,14 @@@ ALTER TABLE ONLY diary_entrie
      ADD CONSTRAINT diary_entries_pkey PRIMARY KEY (id);
  
  
+ --
+ -- Name: diary_entry_subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+ --
+ ALTER TABLE ONLY diary_entry_subscriptions
+     ADD CONSTRAINT diary_entry_subscriptions_pkey PRIMARY KEY (user_id, diary_entry_id);
  --
  -- Name: friends_pkey; Type: CONSTRAINT; Schema: public; Owner: -
  --
@@@ -1599,22 -1510,6 +1637,22 @@@ ALTER TABLE ONLY gpx_file
      ADD CONSTRAINT gpx_files_pkey PRIMARY KEY (id);
  
  
 +--
 +-- Name: issue_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issue_comments
 +    ADD CONSTRAINT issue_comments_pkey PRIMARY KEY (id);
 +
 +
 +--
 +-- Name: issues_pkey; Type: CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issues
 +    ADD CONSTRAINT issues_pkey PRIMARY KEY (id);
 +
 +
  --
  -- Name: languages_pkey; Type: CONSTRAINT; Schema: public; Owner: -
  --
@@@ -1711,14 -1606,6 +1749,14 @@@ ALTER TABLE ONLY relation
      ADD CONSTRAINT relations_pkey PRIMARY KEY (relation_id, version);
  
  
 +--
 +-- Name: reports_pkey; Type: CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY reports
 +    ADD CONSTRAINT reports_pkey PRIMARY KEY (id);
 +
 +
  --
  -- Name: user_blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: -
  --
@@@ -1979,41 -1866,20 +2017,55 @@@ CREATE UNIQUE INDEX index_changesets_su
  CREATE UNIQUE INDEX index_client_applications_on_key ON client_applications USING btree (key);
  
  
+ --
+ -- Name: index_client_applications_on_user_id; Type: INDEX; Schema: public; Owner: -
+ --
+ CREATE INDEX index_client_applications_on_user_id ON client_applications USING btree (user_id);
+ --
+ -- Name: index_diary_entry_subscriptions_on_diary_entry_id; Type: INDEX; Schema: public; Owner: -
+ --
+ CREATE INDEX index_diary_entry_subscriptions_on_diary_entry_id ON diary_entry_subscriptions USING btree (diary_entry_id);
 +--
 +-- Name: index_issue_comments_on_commenter_user_id; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_issue_comments_on_commenter_user_id ON issue_comments USING btree (commenter_user_id);
 +
 +
 +--
 +-- Name: index_issue_comments_on_issue_id; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_issue_comments_on_issue_id ON issue_comments USING btree (issue_id);
 +
 +
 +--
 +-- Name: index_issues_on_reportable_id_and_reportable_type; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_issues_on_reportable_id_and_reportable_type ON issues USING btree (reportable_id, reportable_type);
 +
 +
 +--
 +-- Name: index_issues_on_reported_user_id; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_issues_on_reported_user_id ON issues USING btree (reported_user_id);
 +
 +
 +--
 +-- Name: index_issues_on_updated_by; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_issues_on_updated_by ON issues USING btree (updated_by);
 +
 +
  --
  -- Name: index_note_comments_on_body; Type: INDEX; Schema: public; Owner: -
  --
@@@ -2042,20 -1908,13 +2094,27 @@@ CREATE UNIQUE INDEX index_oauth_nonces_
  CREATE UNIQUE INDEX index_oauth_tokens_on_token ON oauth_tokens USING btree (token);
  
  
+ --
+ -- Name: index_oauth_tokens_on_user_id; Type: INDEX; Schema: public; Owner: -
+ --
+ CREATE INDEX index_oauth_tokens_on_user_id ON oauth_tokens USING btree (user_id);
 +--
 +-- Name: index_reports_on_issue_id; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_reports_on_issue_id ON reports USING btree (issue_id);
 +
 +
 +--
 +-- Name: index_reports_on_reporter_user_id; Type: INDEX; Schema: public; Owner: -
 +--
 +
 +CREATE INDEX index_reports_on_reporter_user_id ON reports USING btree (reporter_user_id);
 +
 +
  --
  -- Name: index_user_blocks_on_user_id; Type: INDEX; Schema: public; Owner: -
  --
@@@ -2412,6 -2271,22 +2471,22 @@@ ALTER TABLE ONLY diary_entrie
      ADD CONSTRAINT diary_entries_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);
  
  
+ --
+ -- Name: diary_entry_subscriptions_diary_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+ --
+ ALTER TABLE ONLY diary_entry_subscriptions
+     ADD CONSTRAINT diary_entry_subscriptions_diary_entry_id_fkey FOREIGN KEY (diary_entry_id) REFERENCES diary_entries(id);
+ --
+ -- Name: diary_entry_subscriptions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+ --
+ ALTER TABLE ONLY diary_entry_subscriptions
+     ADD CONSTRAINT diary_entry_subscriptions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);
  --
  -- Name: friends_friend_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
  --
@@@ -2452,38 -2327,6 +2527,38 @@@ ALTER TABLE ONLY gpx_file
      ADD CONSTRAINT gpx_files_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);
  
  
 +--
 +-- Name: issue_comments_commenter_user_id; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issue_comments
 +    ADD CONSTRAINT issue_comments_commenter_user_id FOREIGN KEY (commenter_user_id) REFERENCES users(id) ON DELETE CASCADE;
 +
 +
 +--
 +-- Name: issue_comments_issue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issue_comments
 +    ADD CONSTRAINT issue_comments_issue_id_fkey FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
 +
 +
 +--
 +-- Name: issues_reported_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issues
 +    ADD CONSTRAINT issues_reported_user_id_fkey FOREIGN KEY (reported_user_id) REFERENCES users(id) ON DELETE CASCADE;
 +
 +
 +--
 +-- Name: issues_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY issues
 +    ADD CONSTRAINT issues_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE CASCADE;
 +
 +
  --
  -- Name: messages_from_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
  --
@@@ -2596,22 -2439,6 +2671,22 @@@ ALTER TABLE ONLY relation
      ADD CONSTRAINT relations_redaction_id_fkey FOREIGN KEY (redaction_id) REFERENCES redactions(id);
  
  
 +--
 +-- Name: reports_issue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY reports
 +    ADD CONSTRAINT reports_issue_id_fkey FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
 +
 +
 +--
 +-- Name: reports_reporter_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 +--
 +
 +ALTER TABLE ONLY reports
 +    ADD CONSTRAINT reports_reporter_user_id_fkey FOREIGN KEY (reporter_user_id) REFERENCES users(id) ON DELETE CASCADE;
 +
 +
  --
  -- Name: user_blocks_moderator_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
  --
@@@ -2706,194 -2533,101 +2781,102 @@@ ALTER TABLE ONLY way
  
  SET search_path TO "$user", public;
  
- INSERT INTO schema_migrations (version) VALUES ('1');
- INSERT INTO schema_migrations (version) VALUES ('10');
- INSERT INTO schema_migrations (version) VALUES ('11');
- INSERT INTO schema_migrations (version) VALUES ('12');
- INSERT INTO schema_migrations (version) VALUES ('13');
- INSERT INTO schema_migrations (version) VALUES ('14');
- INSERT INTO schema_migrations (version) VALUES ('15');
- INSERT INTO schema_migrations (version) VALUES ('16');
- INSERT INTO schema_migrations (version) VALUES ('17');
- INSERT INTO schema_migrations (version) VALUES ('18');
- INSERT INTO schema_migrations (version) VALUES ('19');
- INSERT INTO schema_migrations (version) VALUES ('2');
- INSERT INTO schema_migrations (version) VALUES ('20');
- INSERT INTO schema_migrations (version) VALUES ('20100513171259');
- INSERT INTO schema_migrations (version) VALUES ('20100516124737');
- INSERT INTO schema_migrations (version) VALUES ('20100910084426');
- INSERT INTO schema_migrations (version) VALUES ('20101114011429');
- INSERT INTO schema_migrations (version) VALUES ('20110322001319');
- INSERT INTO schema_migrations (version) VALUES ('20110508145337');
- INSERT INTO schema_migrations (version) VALUES ('20110521142405');
- INSERT INTO schema_migrations (version) VALUES ('20110925112722');
- INSERT INTO schema_migrations (version) VALUES ('20111116184519');
- INSERT INTO schema_migrations (version) VALUES ('20111212183945');
- INSERT INTO schema_migrations (version) VALUES ('20120123184321');
- INSERT INTO schema_migrations (version) VALUES ('20120208122334');
- INSERT INTO schema_migrations (version) VALUES ('20120208194454');
- INSERT INTO schema_migrations (version) VALUES ('20120214210114');
- INSERT INTO schema_migrations (version) VALUES ('20120219161649');
- INSERT INTO schema_migrations (version) VALUES ('20120318201948');
- INSERT INTO schema_migrations (version) VALUES ('20120328090602');
- INSERT INTO schema_migrations (version) VALUES ('20120404205604');
- INSERT INTO schema_migrations (version) VALUES ('20120808231205');
- INSERT INTO schema_migrations (version) VALUES ('20121005195010');
- INSERT INTO schema_migrations (version) VALUES ('20121012044047');
- INSERT INTO schema_migrations (version) VALUES ('20121119165817');
- INSERT INTO schema_migrations (version) VALUES ('20121202155309');
- INSERT INTO schema_migrations (version) VALUES ('20121203124841');
- INSERT INTO schema_migrations (version) VALUES ('20130328184137');
- INSERT INTO schema_migrations (version) VALUES ('20131029121300');
- INSERT INTO schema_migrations (version) VALUES ('20131212124700');
- INSERT INTO schema_migrations (version) VALUES ('20140115192822');
- INSERT INTO schema_migrations (version) VALUES ('20140117185510');
- INSERT INTO schema_migrations (version) VALUES ('20140210003018');
- INSERT INTO schema_migrations (version) VALUES ('20140507110937');
- INSERT INTO schema_migrations (version) VALUES ('20140519141742');
- INSERT INTO schema_migrations (version) VALUES ('20150110152606');
- INSERT INTO schema_migrations (version) VALUES ('20150111192335');
- INSERT INTO schema_migrations (version) VALUES ('20150222101847');
- INSERT INTO schema_migrations (version) VALUES ('20150818224516');
- INSERT INTO schema_migrations (version) VALUES ('20160822153055');
- INSERT INTO schema_migrations (version) VALUES ('20160822153115');
- INSERT INTO schema_migrations (version) VALUES ('20160822153153');
- INSERT INTO schema_migrations (version) VALUES ('21');
- INSERT INTO schema_migrations (version) VALUES ('22');
- INSERT INTO schema_migrations (version) VALUES ('23');
- INSERT INTO schema_migrations (version) VALUES ('24');
- INSERT INTO schema_migrations (version) VALUES ('25');
- INSERT INTO schema_migrations (version) VALUES ('26');
- INSERT INTO schema_migrations (version) VALUES ('27');
- INSERT INTO schema_migrations (version) VALUES ('28');
- INSERT INTO schema_migrations (version) VALUES ('29');
- INSERT INTO schema_migrations (version) VALUES ('3');
- INSERT INTO schema_migrations (version) VALUES ('30');
- INSERT INTO schema_migrations (version) VALUES ('31');
- INSERT INTO schema_migrations (version) VALUES ('32');
- INSERT INTO schema_migrations (version) VALUES ('33');
- INSERT INTO schema_migrations (version) VALUES ('34');
- INSERT INTO schema_migrations (version) VALUES ('35');
- INSERT INTO schema_migrations (version) VALUES ('36');
- INSERT INTO schema_migrations (version) VALUES ('37');
- INSERT INTO schema_migrations (version) VALUES ('38');
- INSERT INTO schema_migrations (version) VALUES ('39');
- INSERT INTO schema_migrations (version) VALUES ('4');
- INSERT INTO schema_migrations (version) VALUES ('40');
- INSERT INTO schema_migrations (version) VALUES ('41');
- INSERT INTO schema_migrations (version) VALUES ('42');
- INSERT INTO schema_migrations (version) VALUES ('43');
- INSERT INTO schema_migrations (version) VALUES ('44');
- INSERT INTO schema_migrations (version) VALUES ('45');
- INSERT INTO schema_migrations (version) VALUES ('46');
- INSERT INTO schema_migrations (version) VALUES ('47');
- INSERT INTO schema_migrations (version) VALUES ('48');
- INSERT INTO schema_migrations (version) VALUES ('49');
- INSERT INTO schema_migrations (version) VALUES ('5');
- INSERT INTO schema_migrations (version) VALUES ('50');
- INSERT INTO schema_migrations (version) VALUES ('51');
- INSERT INTO schema_migrations (version) VALUES ('52');
- INSERT INTO schema_migrations (version) VALUES ('53');
- INSERT INTO schema_migrations (version) VALUES ('54');
- INSERT INTO schema_migrations (version) VALUES ('55');
- INSERT INTO schema_migrations (version) VALUES ('56');
- INSERT INTO schema_migrations (version) VALUES ('57');
- INSERT INTO schema_migrations (version) VALUES ('6');
- INSERT INTO schema_migrations (version) VALUES ('7');
- INSERT INTO schema_migrations (version) VALUES ('8');
- INSERT INTO schema_migrations (version) VALUES ('9');
+ INSERT INTO "schema_migrations" (version) VALUES
+ ('1'),
+ ('10'),
+ ('11'),
+ ('12'),
+ ('13'),
+ ('14'),
+ ('15'),
+ ('16'),
+ ('17'),
+ ('18'),
+ ('19'),
+ ('2'),
+ ('20'),
+ ('20100513171259'),
+ ('20100516124737'),
+ ('20100910084426'),
+ ('20101114011429'),
+ ('20110322001319'),
+ ('20110508145337'),
+ ('20110521142405'),
+ ('20110925112722'),
+ ('20111116184519'),
+ ('20111212183945'),
+ ('20120123184321'),
+ ('20120208122334'),
+ ('20120208194454'),
+ ('20120214210114'),
+ ('20120219161649'),
+ ('20120318201948'),
+ ('20120328090602'),
+ ('20120404205604'),
+ ('20120808231205'),
+ ('20121005195010'),
+ ('20121012044047'),
+ ('20121119165817'),
+ ('20121202155309'),
+ ('20121203124841'),
+ ('20130328184137'),
+ ('20131212124700'),
+ ('20140115192822'),
+ ('20140117185510'),
+ ('20140210003018'),
+ ('20140507110937'),
+ ('20140519141742'),
+ ('20150110152606'),
+ ('20150111192335'),
+ ('20150222101847'),
+ ('20150818224516'),
++('20160822153055'),
++('20160822153115'),
++('20160822153153'),
+ ('20161002153425'),
+ ('20161011010929'),
+ ('20170222134109'),
+ ('21'),
+ ('22'),
+ ('23'),
+ ('24'),
+ ('25'),
+ ('26'),
+ ('27'),
+ ('28'),
+ ('29'),
+ ('3'),
+ ('30'),
+ ('31'),
+ ('32'),
+ ('33'),
+ ('34'),
+ ('35'),
+ ('36'),
+ ('37'),
+ ('38'),
+ ('39'),
+ ('4'),
+ ('40'),
+ ('41'),
+ ('42'),
+ ('43'),
+ ('44'),
+ ('45'),
+ ('46'),
+ ('47'),
+ ('48'),
+ ('49'),
+ ('5'),
+ ('50'),
+ ('51'),
+ ('52'),
+ ('53'),
+ ('54'),
+ ('55'),
+ ('56'),
+ ('57'),
+ ('6'),
+ ('7'),
+ ('8'),
+ ('9');
 -
 -