diff --git a/app/assets/javascripts/mastodon-logo.coffee b/app/assets/javascripts/mastodon-logo.coffee
index 3fb8c0a13b3e6837bac66c54840527417bda62cc..bcf52f3781a9e04b573a718d8f547a635de7ecf9 100644
--- a/app/assets/javascripts/mastodon-logo.coffee
+++ b/app/assets/javascripts/mastodon-logo.coffee
@@ -45,4 +45,4 @@ work = ->
     stop()
 
 $ ->
-  setTimeout(start, 500)
+  setTimeout(start, 100)
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 187c083115b76038a564c4db80c4415fcc1a9e4f..d4b462cabdb418e61f7afc289a94c52419a92203 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -154,6 +154,29 @@ body {
     }
   }
 
+  .prompt {
+    font-size: 16px;
+    color: #9baec8;
+    text-align: center;
+
+    .prompt-highlight {
+      font-weight: 500;
+      color: #fff;
+    }
+  }
+
+  code.copypasteable {
+    display: block;
+    font-family: 'Roboto Mono', monospace;
+    font-weight: 400;
+    font-size: 12px;
+    margin-top: 20px;
+    background: #282c37;
+    border-radius: 4px;
+    padding: 2px;
+    word-wrap: break-word;
+  }
+
   .actions {
     margin-top: 30px;
 
@@ -170,6 +193,7 @@ body {
       cursor: pointer;
       font-weight: 500;
       outline: 0;
+      margin-bottom: 10px;
 
       &:hover {
         background-color: lighten(#2b90d9, 5%);
@@ -180,6 +204,18 @@ body {
         top: 1px;
         background-color: darken(#2b90d9, 5%);
       }
+
+      &.negative {
+        background: #df405a;
+
+        &:hover {
+          background-color: lighten(#df405a, 5%);
+        }
+
+        &:active, &:focus {
+          background-color: darken(#df405a, 5%);
+        }
+      }
     }
   }
 
diff --git a/app/views/doorkeeper/authorizations/error.html.erb b/app/views/doorkeeper/authorizations/error.html.erb
deleted file mode 100644
index 2247c0d54cd745fc2adb8c4f3683836560dc582f..0000000000000000000000000000000000000000
--- a/app/views/doorkeeper/authorizations/error.html.erb
+++ /dev/null
@@ -1,7 +0,0 @@
-<div class="page-header">
-  <h1><%= t('doorkeeper.authorizations.error.title') %></h1>
-</div>
-
-<main role="main">
-  <pre><%= @pre_auth.error_response.body[:error_description] %></pre>
-</main>
diff --git a/app/views/doorkeeper/authorizations/error.html.haml b/app/views/doorkeeper/authorizations/error.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..cb97ae170e48f1b5e452efe2e5ff8de214c657dd
--- /dev/null
+++ b/app/views/doorkeeper/authorizations/error.html.haml
@@ -0,0 +1,4 @@
+.prompt= t('doorkeeper.authorizations.error.title')
+
+#error_explanation
+  = @pre_auth.error_response.body[:error_description]
diff --git a/app/views/doorkeeper/authorizations/new.html.erb b/app/views/doorkeeper/authorizations/new.html.erb
deleted file mode 100644
index c6f738b33b3554e8e537b1bd7d22036caab19ea7..0000000000000000000000000000000000000000
--- a/app/views/doorkeeper/authorizations/new.html.erb
+++ /dev/null
@@ -1,40 +0,0 @@
-<header class="page-header" role="banner">
-  <h1><%= t('.title') %></h1>
-</header>
-
-<main role="main">
-  <p class="h4">
-    <%= raw t('.prompt', client_name: "<strong class=\"text-info\">#{ @pre_auth.client.name }</strong>") %>
-  </p>
-
-  <% if @pre_auth.scopes.count > 0 %>
-    <div id="oauth-permissions">
-      <p><%= t('.able_to') %>:</p>
-
-      <ul class="text-info">
-        <% @pre_auth.scopes.each do |scope| %>
-          <li><%= t scope, scope: [:doorkeeper, :scopes] %></li>
-        <% end %>
-      </ul>
-    </div>
-  <% end %>
-
-  <div class="actions">
-    <%= form_tag oauth_authorization_path, method: :post do %>
-      <%= hidden_field_tag :client_id, @pre_auth.client.uid %>
-      <%= hidden_field_tag :redirect_uri, @pre_auth.redirect_uri %>
-      <%= hidden_field_tag :state, @pre_auth.state %>
-      <%= hidden_field_tag :response_type, @pre_auth.response_type %>
-      <%= hidden_field_tag :scope, @pre_auth.scope %>
-      <%= submit_tag t('doorkeeper.authorizations.buttons.authorize'), class: "btn btn-success btn-lg btn-block" %>
-    <% end %>
-    <%= form_tag oauth_authorization_path, method: :delete do %>
-      <%= hidden_field_tag :client_id, @pre_auth.client.uid %>
-      <%= hidden_field_tag :redirect_uri, @pre_auth.redirect_uri %>
-      <%= hidden_field_tag :state, @pre_auth.state %>
-      <%= hidden_field_tag :response_type, @pre_auth.response_type %>
-      <%= hidden_field_tag :scope, @pre_auth.scope %>
-      <%= submit_tag t('doorkeeper.authorizations.buttons.deny'), class: "btn btn-danger btn-lg btn-block" %>
-    <% end %>
-  </div>
-</main>
diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..91d71cc0180da127039cace163adab15e61354e4
--- /dev/null
+++ b/app/views/doorkeeper/authorizations/new.html.haml
@@ -0,0 +1,26 @@
+.prompt= raw t('.prompt', client_name: "<strong class=\"prompt-highlight\">#{ @pre_auth.client.name }</strong>")
+
+/- if @pre_auth.scopes.count > 0
+/  .scope-permission-prompt
+/    %p= t('.able_to')
+
+/    %ul.scope-permissions
+/      - @pre_auth.scopes.each do |scope|
+/        %li= t scope, scope: [:doorkeeper, :scopes]
+
+.actions
+  = form_tag oauth_authorization_path, method: :post do
+    = hidden_field_tag :client_id, @pre_auth.client.uid
+    = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri
+    = hidden_field_tag :state, @pre_auth.state
+    = hidden_field_tag :response_type, @pre_auth.response_type
+    = hidden_field_tag :scope, @pre_auth.scope
+    = button_tag t('doorkeeper.authorizations.buttons.authorize'), type: :submit
+
+  = form_tag oauth_authorization_path, method: :delete do
+    = hidden_field_tag :client_id, @pre_auth.client.uid
+    = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri
+    = hidden_field_tag :state, @pre_auth.state
+    = hidden_field_tag :response_type, @pre_auth.response_type
+    = hidden_field_tag :scope, @pre_auth.scope
+    = button_tag t('doorkeeper.authorizations.buttons.deny'), type: :submit, class: 'negative'
diff --git a/app/views/doorkeeper/authorizations/show.html.erb b/app/views/doorkeeper/authorizations/show.html.erb
deleted file mode 100644
index f4d661019397688ab1c9a800068a94662cc8582b..0000000000000000000000000000000000000000
--- a/app/views/doorkeeper/authorizations/show.html.erb
+++ /dev/null
@@ -1,7 +0,0 @@
-<header class="page-header">
-  <h1><%= t('.title') %>:</h1>
-</header>
-
-<main role="main">
-  <code id="authorization_code"><%= params[:code] %></code>
-</main>
diff --git a/app/views/doorkeeper/authorizations/show.html.haml b/app/views/doorkeeper/authorizations/show.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..44638318b0c654b9a44028781446b875f39fe691
--- /dev/null
+++ b/app/views/doorkeeper/authorizations/show.html.haml
@@ -0,0 +1,2 @@
+.prompt= t('.title')
+%code.copypasteable= params[:code]
diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml
index 775815751158817f11a242dec9d528c5d69415f8..8a2c8fa74a01535c6d4a48ee6461fe1b8e83e181 100644
--- a/app/views/layouts/auth.html.haml
+++ b/app/views/layouts/auth.html.haml
@@ -2,7 +2,7 @@
   .logo-container
     %h1
       = link_to root_path do
-        = render partial: 'logo', locals: { dim: 200 }
+        = render partial: 'application/logo', locals: { dim: 200 }
         %small= Rails.configuration.x.local_domain
 
   .form-container
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 10b9980b45224b22f8405aa87c8d7a03ddf737ca..7418ba24d6b9c311e195be025c91d720d625c8f0 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -47,7 +47,7 @@ Doorkeeper.configure do
   # For more information go to
   # https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes
   # default_scopes  :public
-  # optional_scopes :write, :update
+  # optional_scopes :write, :follow
 
   # Change the way client credentials are retrieved from the request object.
   # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
diff --git a/db/migrate/20160306172223_create_doorkeeper_tables.rb b/db/migrate/20160306172223_create_doorkeeper_tables.rb
index e9da5f3424cfb4f8f5401dd81ab310cc2654c57e..d89b005c3c1e3bdbc89902a98c3af5d3e00932f9 100644
--- a/db/migrate/20160306172223_create_doorkeeper_tables.rb
+++ b/db/migrate/20160306172223_create_doorkeeper_tables.rb
@@ -12,7 +12,7 @@ class CreateDoorkeeperTables < ActiveRecord::Migration
     add_index :oauth_applications, :uid, unique: true
 
     create_table :oauth_access_grants do |t|
-      t.integer  :user_id,           null: false
+      t.integer  :resource_owner_id, null: false
       t.integer  :application_id,    null: false
       t.string   :token,             null: false
       t.integer  :expires_in,        null: false
diff --git a/db/schema.rb b/db/schema.rb
index a63c6f3995845c473236bcdda5f62040b00b29bb..b5026c0c1a9ad8bfa1cf9d14da73cf502eed5398 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -68,12 +68,12 @@ ActiveRecord::Schema.define(version: 20160306172223) do
   add_index "mentions", ["account_id", "status_id"], name: "index_mentions_on_account_id_and_status_id", unique: true, using: :btree
 
   create_table "oauth_access_grants", force: :cascade do |t|
-    t.integer  "user_id",        null: false
-    t.integer  "application_id", null: false
-    t.string   "token",          null: false
-    t.integer  "expires_in",     null: false
-    t.text     "redirect_uri",   null: false
-    t.datetime "created_at",     null: false
+    t.integer  "resource_owner_id", null: false
+    t.integer  "application_id",    null: false
+    t.string   "token",             null: false
+    t.integer  "expires_in",        null: false
+    t.text     "redirect_uri",      null: false
+    t.datetime "created_at",        null: false
     t.datetime "revoked_at"
     t.string   "scopes"
   end