diff --git a/app/assets/javascripts/build.js b/app/assets/javascripts/build.js
index 78d21c0552a639fa3830452b118924503e2fe474..f336bfc36d619e01470277deb6b11ccbe6fb01dd 100644
--- a/app/assets/javascripts/build.js
+++ b/app/assets/javascripts/build.js
@@ -146,7 +146,7 @@
       $date = $('.js-artifacts-remove');
       if ($date.length) {
         date = $date.text();
-        return $date.text($.timefor(new Date(date.replace(/-/g, '/')), ' '));
+        return $date.text($.timefor(new Date(date.replace(/([0-9]+)-([0-9]+)-([0-9]+)/g, '$1/$2/$3')), ' '));
       }
     };
 
diff --git a/config/routes.rb b/config/routes.rb
index 525953449cb68b29553508f3c79022667ed41187..bf7c5b761284f3045baa9b6f41283311be828876 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -9,33 +9,6 @@ class ActionDispatch::Routing::Mapper
 end
 
 Rails.application.routes.draw do
-  if Gitlab::Sherlock.enabled?
-    namespace :sherlock do
-      resources :transactions, only: [:index, :show] do
-        resources :queries, only: [:show]
-        resources :file_samples, only: [:show]
-
-        collection do
-          delete :destroy_all
-        end
-      end
-    end
-  end
-
-  if Rails.env.development?
-    # Make the built-in Rails routes available in development, otherwise they'd
-    # get swallowed by the `namespace/project` route matcher below.
-    #
-    # See https://git.io/va79N
-    get '/rails/mailers'         => 'rails/mailers#index'
-    get '/rails/mailers/:path'   => 'rails/mailers#preview'
-    get '/rails/info/properties' => 'rails/info#properties'
-    get '/rails/info/routes'     => 'rails/info#routes'
-    get '/rails/info'            => 'rails/info#index'
-
-    mount LetterOpenerWeb::Engine, at: '/rails/letter_opener'
-  end
-
   concern :access_requestable do
     post :request_access, on: :collection
     post :approve_access_request, on: :member
@@ -45,21 +18,9 @@ Rails.application.routes.draw do
     post :toggle_award_emoji, on: :member
   end
 
-  namespace :ci do
-    # CI API
-    Ci::API::API.logger Rails.logger
-    mount Ci::API::API => '/api'
-
-    resource :lint, only: [:show, :create]
-
-    resources :projects, only: [:index, :show] do
-      member do
-        get :status, to: 'projects#badge'
-      end
-    end
-
-    root to: 'projects#index'
-  end
+  draw :sherlock
+  draw :development
+  draw :ci
 
   use_doorkeeper do
     controllers applications: 'oauth/applications',
@@ -82,36 +43,16 @@ Rails.application.routes.draw do
   # JSON Web Token
   get 'jwt/auth' => 'jwt#auth'
 
-  # API
-  API::API.logger Rails.logger
-  mount API::API => '/api'
-
-  constraint = lambda { |request| request.env['warden'].authenticate? and request.env['warden'].user.admin? }
-  constraints constraint do
-    mount Sidekiq::Web, at: '/admin/sidekiq', as: :sidekiq
-  end
-
   # Health check
   get 'health_check(/:checks)' => 'health_check#index', as: :health_check
 
-  # Help
-  get 'help'           => 'help#index'
-  get 'help/shortcuts' => 'help#shortcuts'
-  get 'help/ui'        => 'help#ui'
-  get 'help/*path'     => 'help#show', as: :help_page
-
   # Koding route
   get 'koding' => 'koding#index'
 
-  # Global snippets
-  resources :snippets, concerns: :awardable do
-    member do
-      get 'raw'
-    end
-  end
-
-  get '/s/:username', to: redirect('/u/%{username}/snippets'),
-                      constraints: { username: /[a-zA-Z.0-9_\-]+(?<!\.atom)/ }
+  draw :api
+  draw :sidekiq
+  draw :help
+  draw :snippets
 
   # Invites
   resources :invites, only: [:show], constraints: { id: /[A-Za-z0-9_-]+/ } do
diff --git a/config/routes/api.rb b/config/routes/api.rb
new file mode 100644
index 0000000000000000000000000000000000000000..69c8efc151c9c51b2d7e4415d1f262396c019906
--- /dev/null
+++ b/config/routes/api.rb
@@ -0,0 +1,2 @@
+API::API.logger Rails.logger
+mount API::API => '/api'
diff --git a/config/routes/ci.rb b/config/routes/ci.rb
new file mode 100644
index 0000000000000000000000000000000000000000..47a049d5b204381e417668808aebb9c79b201703
--- /dev/null
+++ b/config/routes/ci.rb
@@ -0,0 +1,15 @@
+namespace :ci do
+  # CI API
+  Ci::API::API.logger Rails.logger
+  mount Ci::API::API => '/api'
+
+  resource :lint, only: [:show, :create]
+
+  resources :projects, only: [:index, :show] do
+    member do
+      get :status, to: 'projects#badge'
+    end
+  end
+
+  root to: 'projects#index'
+end
diff --git a/config/routes/development.rb b/config/routes/development.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9b2b47c6a2129acf76f402d989c484fbde7b2cd6
--- /dev/null
+++ b/config/routes/development.rb
@@ -0,0 +1,13 @@
+if Rails.env.development?
+  # Make the built-in Rails routes available in development, otherwise they'd
+  # get swallowed by the `namespace/project` route matcher below.
+  #
+  # See https://git.io/va79N
+  get '/rails/mailers'         => 'rails/mailers#index'
+  get '/rails/mailers/:path'   => 'rails/mailers#preview'
+  get '/rails/info/properties' => 'rails/info#properties'
+  get '/rails/info/routes'     => 'rails/info#routes'
+  get '/rails/info'            => 'rails/info#index'
+
+  mount LetterOpenerWeb::Engine, at: '/rails/letter_opener'
+end
diff --git a/config/routes/help.rb b/config/routes/help.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d53822da9eca4ab0bb8828303cd5223dba6ade37
--- /dev/null
+++ b/config/routes/help.rb
@@ -0,0 +1,4 @@
+get 'help'           => 'help#index'
+get 'help/shortcuts' => 'help#shortcuts'
+get 'help/ui'        => 'help#ui'
+get 'help/*path'     => 'help#show', as: :help_page
diff --git a/config/routes/sherlock.rb b/config/routes/sherlock.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c9969f91c36eb3d2998d93501add36ae06646d65
--- /dev/null
+++ b/config/routes/sherlock.rb
@@ -0,0 +1,12 @@
+if Gitlab::Sherlock.enabled?
+  namespace :sherlock do
+    resources :transactions, only: [:index, :show] do
+      resources :queries, only: [:show]
+      resources :file_samples, only: [:show]
+
+      collection do
+        delete :destroy_all
+      end
+    end
+  end
+end
diff --git a/config/routes/sidekiq.rb b/config/routes/sidekiq.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d3e6bc4c2926794e3b728c9ece131c0da395b63e
--- /dev/null
+++ b/config/routes/sidekiq.rb
@@ -0,0 +1,4 @@
+constraint = lambda { |request| request.env['warden'].authenticate? and request.env['warden'].user.admin? }
+constraints constraint do
+  mount Sidekiq::Web, at: '/admin/sidekiq', as: :sidekiq
+end
diff --git a/config/routes/snippets.rb b/config/routes/snippets.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1949f215c66f379947eb37973cc323ca5bc4ed9e
--- /dev/null
+++ b/config/routes/snippets.rb
@@ -0,0 +1,8 @@
+resources :snippets, concerns: :awardable do
+  member do
+    get 'raw'
+  end
+end
+
+get '/s/:username', to: redirect('/u/%{username}/snippets'),
+                    constraints: { username: /[a-zA-Z.0-9_\-]+(?<!\.atom)/ }