diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index 9b5c43b17e250b03d14da3e7a98d5d189d1b1dbb..d5dc894e0bd725d78be7d9a822d2f8c68ac4fe02 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -12,13 +12,12 @@ class HelpController < ApplicationController
   end
 
   def show
-    @category = clean_path_info(path_params[:category])
-    @file = path_params[:file]
+    @path = path_params[:path]
 
     respond_to do |format|
       format.any(:markdown, :md, :html) do
         # Note: We are purposefully NOT using `Rails.root.join`
-        path = File.join(Rails.root, 'doc', @category, "#{@file}.md")
+        path = File.join(Rails.root, 'doc', "#{@path}.md")
 
         if File.exist?(path)
           @markdown = File.read(path)
@@ -33,7 +32,7 @@ class HelpController < ApplicationController
       # Allow access to images in the doc folder
       format.any(:png, :gif, :jpeg) do
         # Note: We are purposefully NOT using `Rails.root.join`
-        path = File.join(Rails.root, 'doc', @category, "#{@file}.#{params[:format]}")
+        path = File.join(Rails.root, 'doc', "#{@path}.#{params[:format]}")
 
         if File.exist?(path)
           send_file(path, disposition: 'inline')
@@ -57,8 +56,7 @@ class HelpController < ApplicationController
   private
 
   def path_params
-    params.require(:category)
-    params.require(:file)
+    params.require(:path)
 
     params
   end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index f9fc525df6fd8d81877fd37a34efff0f601bbb94..b165b569372ef6cc4005c6eaef4ae0e4c4da47e9 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -43,15 +43,15 @@ module SearchHelper
   # Autocomplete results for internal help pages
   def help_autocomplete
     [
-      { category: "Help", label: "API Help",           url: help_page_path("api", "README") },
-      { category: "Help", label: "Markdown Help",      url: help_page_path("markdown", "markdown") },
-      { category: "Help", label: "Permissions Help",   url: help_page_path("permissions", "permissions") },
-      { category: "Help", label: "Public Access Help", url: help_page_path("public_access", "public_access") },
-      { category: "Help", label: "Rake Tasks Help",    url: help_page_path("raketasks", "README") },
-      { category: "Help", label: "SSH Keys Help",      url: help_page_path("ssh", "README") },
-      { category: "Help", label: "System Hooks Help",  url: help_page_path("system_hooks", "system_hooks") },
-      { category: "Help", label: "Webhooks Help",      url: help_page_path("web_hooks", "web_hooks") },
-      { category: "Help", label: "Workflow Help",      url: help_page_path("workflow", "README") },
+      { category: "Help", label: "API Help",           url: help_page_path("api/README") },
+      { category: "Help", label: "Markdown Help",      url: help_page_path("markdown/markdown") },
+      { category: "Help", label: "Permissions Help",   url: help_page_path("permissions/permissions") },
+      { category: "Help", label: "Public Access Help", url: help_page_path("public_access/public_access") },
+      { category: "Help", label: "Rake Tasks Help",    url: help_page_path("raketasks/README") },
+      { category: "Help", label: "SSH Keys Help",      url: help_page_path("ssh/README") },
+      { category: "Help", label: "System Hooks Help",  url: help_page_path("system_hooks/system_hooks") },
+      { category: "Help", label: "Webhooks Help",      url: help_page_path("web_hooks/web_hooks") },
+      { category: "Help", label: "Workflow Help",      url: help_page_path("workflow/README") },
     ]
   end
 
diff --git a/app/views/admin/appearances/_form.html.haml b/app/views/admin/appearances/_form.html.haml
index dc083e50178352185f73ecae02ccaec6cf60f111..92e2dae48420edae270b92e52166b3bc05261250 100644
--- a/app/views/admin/appearances/_form.html.haml
+++ b/app/views/admin/appearances/_form.html.haml
@@ -13,7 +13,7 @@
     .col-sm-10
       = f.text_area :description, class: "form-control", rows: 10
       .hint
-        Description parsed with #{link_to "GitLab Flavored Markdown", help_page_path('markdown', 'markdown'), target: '_blank'}.
+        Description parsed with #{link_to "GitLab Flavored Markdown", help_page_path('markdown/markdown'), target: '_blank'}.
   .form-group
     = f.label :logo, class: 'control-label'
     .col-sm-10
diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml
index 8de28528cda4593e9bdd0cc44c708b8063a54bf4..538d8176ce7c28c1cc0af538f864c4aaa5a6b0b7 100644
--- a/app/views/admin/application_settings/_form.html.haml
+++ b/app/views/admin/application_settings/_form.html.haml
@@ -38,11 +38,11 @@
             = source
         %span.help-block#import-sources-help
           Enabled sources for code import during project creation. OmniAuth must be configured for GitHub
-          = link_to "(?)", help_page_path("integration", "github")
+          = link_to "(?)", help_page_path("integration/github")
           , Bitbucket
-          = link_to "(?)", help_page_path("integration", "bitbucket")
+          = link_to "(?)", help_page_path("integration/bitbucket")
           and GitLab.com
-          = link_to "(?)", help_page_path("integration", "gitlab")
+          = link_to "(?)", help_page_path("integration/gitlab")
     .form-group
       %label.control-label.col-sm-2 Enabled Git access protocols
       .col-sm-10
diff --git a/app/views/admin/deploy_keys/new.html.haml b/app/views/admin/deploy_keys/new.html.haml
index 15aa059c93d0b5f82a329537e92a02d7189fd452..5c410a695bf12457b1402ab5f7e1a8ab0a6540c3 100644
--- a/app/views/admin/deploy_keys/new.html.haml
+++ b/app/views/admin/deploy_keys/new.html.haml
@@ -14,7 +14,7 @@
       .col-sm-10
         %p.light
           Paste a machine public key here. Read more about how to generate it
-          = link_to "here", help_page_path("ssh", "README")
+          = link_to "here", help_page_path("ssh/README")
         = f.text_area :key, class: "form-control thin_area", rows: 5
 
     .form-actions
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index 522153b37e3d30aab8aa2cd79a85caa80193c408..40c8169ad9d46409cbe38bb6db55e39e3c98eb7e 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -79,7 +79,7 @@
         .panel-body.form-holder
           %p.light
             Read more about project permissions
-            %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink"
+            %strong= link_to "here", help_page_path("permissions/permissions"), class: "vlink"
 
           = form_tag members_update_admin_group_path(@group), id: "new_project_member", class: "bulk_import", method: :put  do
             %div
diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml
index 7b388cf7862dcfeecc0df872943ac156ffe49c40..c217490963f1215cddf3579526cb6d5abe2c0530 100644
--- a/app/views/admin/hooks/index.html.haml
+++ b/app/views/admin/hooks/index.html.haml
@@ -3,7 +3,7 @@
   System hooks
 
 %p.light
-  #{link_to "System hooks ", help_page_path("system_hooks", "system_hooks"), class: "vlink"} can be
+  #{link_to "System hooks ", help_page_path("system_hooks/system_hooks"), class: "vlink"} can be
   used for binding events when GitLab creates a User or Project.
 
 %hr
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 2c5aba7169938ed99de898e46a6902509820e209..b2c607361b3d417e9b9755efc11893abcda1a69d 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -132,7 +132,7 @@
               - else
                 passed.
 
-            = link_to icon('question-circle'), help_page_path('administration', 'repository_checks')
+            = link_to icon('question-circle'), help_page_path('administration/repository_checks')
 
           .form-group
             = f.submit 'Trigger repository check', class: 'btn btn-primary'
diff --git a/app/views/errors/access_denied.html.haml b/app/views/errors/access_denied.html.haml
index 012e9857642ca898cec37e0f05b4f14e78fedf52..2febeef99d3f8326231fad01c79ed8b60f8a9f3e 100644
--- a/app/views/errors/access_denied.html.haml
+++ b/app/views/errors/access_denied.html.haml
@@ -3,4 +3,4 @@
 %h3 Access Denied
 %hr
 %p You are not allowed to access this page.
-%p Read more about project permissions #{link_to "here", help_page_path("permissions", "permissions"), class: "vlink"}
+%p Read more about project permissions #{link_to "here", help_page_path("permissions/permissions"), class: "vlink"}
diff --git a/app/views/groups/group_members/_new_group_member.html.haml b/app/views/groups/group_members/_new_group_member.html.haml
index e7ab4f2409bb941ffb9bd020891200fb7496e53f..13ded2bc455ade914d7acd6482fed16aa9673747 100644
--- a/app/views/groups/group_members/_new_group_member.html.haml
+++ b/app/views/groups/group_members/_new_group_member.html.haml
@@ -12,7 +12,7 @@
       = select_tag :access_level, options_for_select(GroupMember.access_level_roles, @group_member.access_level), class: "project-access-select select2"
       .help-block
         Read more about role permissions
-        %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink"
+        %strong= link_to "here", help_page_path("permissions/permissions"), class: "vlink"
 
   .form-actions
     = f.submit 'Add users to group', class: "btn btn-create"
diff --git a/app/views/help/show.html.haml b/app/views/help/show.html.haml
index 0398afb4c1d92968a06ad4060a6e69e22863d89a..be257b51b9ee2414ae5c303bcae85bfd12f34d8d 100644
--- a/app/views/help/show.html.haml
+++ b/app/views/help/show.html.haml
@@ -1,3 +1,3 @@
-- page_title @file.humanize, *@category.split("/").reverse.map(&:humanize)
+- page_title @path.split("/").reverse.map(&:humanize)
 .documentation.wiki
   = markdown @markdown.gsub('$your_email', current_user.try(:email) || "email@example.com")
diff --git a/app/views/help/ui.html.haml b/app/views/help/ui.html.haml
index d676bc28c89dcaa71f298d60bb58278a18287273..431d312b4ca3c0b21d97642def227d62ad256b31 100644
--- a/app/views/help/ui.html.haml
+++ b/app/views/help/ui.html.haml
@@ -549,4 +549,4 @@
     %li wiki page
     %li help page
 
-  You can check how markdown rendered at #{link_to 'Markdown help page', help_page_path("markdown", "markdown")}.
+  You can check how markdown rendered at #{link_to 'Markdown help page', help_page_path("markdown/markdown")}.
diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml
index 435ed7bd4cb5c7b339a9cf5112f06dae345e9fbe..4c6af0b7908fce8ea9db1984d745f39a13f26222 100644
--- a/app/views/import/github/new.html.haml
+++ b/app/views/import/github/new.html.haml
@@ -38,6 +38,6 @@
       As an administrator you may like to configure
     - else
       Consider asking your GitLab administrator to configure
-    = link_to 'GitHub integration', help_page_path("integration", "github")
+    = link_to 'GitHub integration', help_page_path("integration/github")
     which will allow login via GitHub and allow importing projects without
     generating a Personal Access Token.
diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml
index 6a067a03535023e0efdb8d882fa69ec8aa6d83cc..a42b3b8eb3830cea042ab454a3d0e0c06ad826d7 100644
--- a/app/views/profiles/keys/index.html.haml
+++ b/app/views/profiles/keys/index.html.haml
@@ -11,7 +11,7 @@
       Add an SSH key
     %p.profile-settings-content
       Before you can add an SSH key you need to
-      = link_to "generate it.", help_page_path("ssh", "README")
+      = link_to "generate it.", help_page_path("ssh/README")
     = render 'form'
     %hr
     %h5
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index b4d35dc9a3e4d9ae47c3b1ce6461c6098eb41d11..2afa026847a8a45a54bbc40c35d78f49da6c8ec7 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -43,12 +43,12 @@
     .form-group
       = f.label :dashboard, class: 'label-light' do
         Default Dashboard
-        = link_to('(?)', help_page_path('profile', 'preferences') + '#default-dashboard', target: '_blank')
+        = link_to('(?)', help_page_path('profile/preferences') + '#default-dashboard', target: '_blank')
       = f.select :dashboard, dashboard_choices, {}, class: 'form-control'
     .form-group
       = f.label :project_view, class: 'label-light' do
         Project view
-        = link_to('(?)', help_page_path('profile', 'preferences') + '#default-project-view', target: '_blank')
+        = link_to('(?)', help_page_path('profile/preferences') + '#default-project-view', target: '_blank')
       = f.select :project_view, project_view_choices, {}, class: 'form-control'
       .help-block
         Choose what content you want to see on a project's home page.
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 5890456bee274f1c7b2873d2d6ad02804f034d13..8780da1dec4c591099d0c1ac72ee509ad9d3e35e 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -14,7 +14,7 @@
     - else
       %p
         Download the Google Authenticator application from App Store or Google Play Store and scan this code.
-        More information is available in the #{link_to('documentation', help_page_path('profile', 'two_factor_authentication'))}.
+        More information is available in the #{link_to('documentation', help_page_path('profile/two_factor_authentication'))}.
       .row.append-bottom-10
         .col-md-3
           = raw @qr_code
diff --git a/app/views/projects/_bitbucket_import_modal.html.haml b/app/views/projects/_bitbucket_import_modal.html.haml
index 2987f6b5b226be7e572768187050408192ed8985..e74fd5b93eaae8f289c2c3dd2ddb5f817b8112a5 100644
--- a/app/views/projects/_bitbucket_import_modal.html.haml
+++ b/app/views/projects/_bitbucket_import_modal.html.haml
@@ -10,4 +10,4 @@
           as administrator you need to configure
         - else
           ask your GitLab administrator to configure
-        == #{link_to 'OAuth integration', help_page_path("integration", "bitbucket")}.
+        == #{link_to 'OAuth integration', help_page_path("integration/bitbucket")}.
diff --git a/app/views/projects/_builds_settings.html.haml b/app/views/projects/_builds_settings.html.haml
index d411da85ab0e6324d1417bc5a868f80a5320c8bd..fff30f11d822c85fb758dee89f19a7726e99f80e 100644
--- a/app/views/projects/_builds_settings.html.haml
+++ b/app/views/projects/_builds_settings.html.haml
@@ -4,7 +4,7 @@
   - unless @repository.gitlab_ci_yml
     .form-group
       %p Builds need to be configured before you can begin using Continuous Integration.
-      = link_to 'Get started with Builds', help_page_path('ci', 'quick_start', 'README'), class: 'btn btn-info'
+      = link_to 'Get started with Builds', help_page_path('ci/quick_start/README'), class: 'btn btn-info'
   .form-group
     %p Get recent application code using the following command:
     .radio
diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml
index 377cf0187b880d03126a5e4b8f3e30f3e53776f5..e9f39b16aa7b1e0eb346b47e69285182ebe26068 100644
--- a/app/views/projects/_gitlab_import_modal.html.haml
+++ b/app/views/projects/_gitlab_import_modal.html.haml
@@ -10,4 +10,4 @@
           as administrator you need to configure
         - else
           ask your GitLab administrator to configure
-        == #{link_to 'OAuth integration', help_page_path("integration", "gitlab")}.
+        == #{link_to 'OAuth integration', help_page_path("integration/gitlab")}.
diff --git a/app/views/projects/_merge_request_settings.html.haml b/app/views/projects/_merge_request_settings.html.haml
index 771a2e0df7d7767fa5522ad2386ea24277221f3b..19b4249374b2d65caca94a15925e8258b6e6f33a 100644
--- a/app/views/projects/_merge_request_settings.html.haml
+++ b/app/views/projects/_merge_request_settings.html.haml
@@ -8,4 +8,4 @@
         %strong Only allow merge requests to be merged if the build succeeds
       .help-block
         Builds need to be configured to enable this feature.
-        = link_to icon('question-circle'), help_page_path('workflow', 'merge_requests', anchor: 'only-allow-merge-requests-to-be-merged-if-the-build-succeeds')
+        = link_to icon('question-circle'), help_page_path('workflow/merge_requests', anchor: 'only-allow-merge-requests-to-be-merged-if-the-build-succeeds')
diff --git a/app/views/projects/builds/index.html.haml b/app/views/projects/builds/index.html.haml
index a131289ee97d9e0767c3fb15a24d795a95928e21..381b3754cd532199cca4617099c8c5b68de87778 100644
--- a/app/views/projects/builds/index.html.haml
+++ b/app/views/projects/builds/index.html.haml
@@ -31,7 +31,7 @@
             data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
 
         - unless @repository.gitlab_ci_yml
-          = link_to 'Get started with Builds', help_page_path('ci/quick_start', 'README'), class: 'btn btn-info'
+          = link_to 'Get started with Builds', help_page_path('ci/quick_start/README'), class: 'btn btn-info'
 
         = link_to ci_lint_path, class: 'btn btn-default' do
           %span CI Lint
diff --git a/app/views/projects/deploy_keys/_form.html.haml b/app/views/projects/deploy_keys/_form.html.haml
index 894c36a96dfbec510539b72e6f52c4280ed99789..901605f7ca3bc05c1f2d757c40ab926f9dafa905 100644
--- a/app/views/projects/deploy_keys/_form.html.haml
+++ b/app/views/projects/deploy_keys/_form.html.haml
@@ -9,5 +9,5 @@
   .form-group
     %p.light.append-bottom-0
       Paste a machine public key here. Read more about how to generate it
-      = link_to "here", help_page_path("ssh", "README")
+      = link_to "here", help_page_path("ssh/README")
   = f.submit "Add key", class: "btn-create btn"
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index 27a94fe02dc92d64c4f63fa0a94cfb1b0c64b192..57af167180b254673b29ce1c10d55c3c2b3d0e8b 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -23,7 +23,7 @@
         .form-group.project-visibility-level-holder
           = f.label :visibility_level, class: 'label-light' do
             Visibility Level
-            = link_to "(?)", help_page_path("public_access", "public_access")
+            = link_to "(?)", help_page_path("public_access/public_access")
           - if can_change_visibility_level?(@project, current_user)
             = render('shared/visibility_radios', model_method: :visibility_level, form: f, selected_level: @project.visibility_level, form_model: @project)
           - else
diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml
index 5242021243e7d5b5debe12886f0ab38bc510f92f..303d7c23d01b7203af1486e64078880389ba936f 100644
--- a/app/views/projects/environments/index.html.haml
+++ b/app/views/projects/environments/index.html.haml
@@ -17,7 +17,7 @@
         Environments are places where code gets deployed, such as staging or production.
         %br
         = succeed "." do
-          = link_to "Read more about environments", help_page_path("ci", "environments")
+          = link_to "Read more about environments", help_page_path("ci/environments")
       - if can?(current_user, :create_environment, @project)
         = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do
           New environment
diff --git a/app/views/projects/environments/new.html.haml b/app/views/projects/environments/new.html.haml
index da325efecd24a9f15a019549cbdf9185effd9761..89e06567196efa9c39ddc8922d5f265cce708724 100644
--- a/app/views/projects/environments/new.html.haml
+++ b/app/views/projects/environments/new.html.haml
@@ -7,6 +7,6 @@
     %p
       Environments allow you to track deployments of your application
       = succeed "." do
-        = link_to "Read more about environments", help_page_path("ci", "environments")
+        = link_to "Read more about environments", help_page_path("ci/environments")
 
   = render 'form'
diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml
index 53c62ef234d4549ac7cb3582932ebaf79489cca2..b17aba2431fd30db3b4e0f3a2f13aa42844e7ca3 100644
--- a/app/views/projects/environments/show.html.haml
+++ b/app/views/projects/environments/show.html.haml
@@ -20,7 +20,7 @@
         Define environments in the deploy stage(s) in
         %code .gitlab-ci.yml
         to track deployments here.
-      = link_to "Read more", help_page_path("ci", "environments"), class: "btn btn-success"
+      = link_to "Read more", help_page_path("ci/environments"), class: "btn btn-success"
   - else
     .table-holder
       %table.table.environments
diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml
index 05f33b78a47e4e0394b1a17a91c4543acc0c1055..9b00bdedc277002834513e297c66b161cc0a6fb7 100644
--- a/app/views/projects/new.html.haml
+++ b/app/views/projects/new.html.haml
@@ -107,7 +107,7 @@
         .form-group.project-visibility-level-holder
           = f.label :visibility_level, class: 'label-light' do
             Visibility Level
-            = link_to "(?)", help_page_path("public_access", "public_access")
+            = link_to "(?)", help_page_path("public_access/public_access")
           = render('shared/visibility_radios', model_method: :visibility_level, form: f, selected_level: @project.visibility_level, form_model: @project)
 
         = f.submit 'Create project', class: "btn btn-create project-submit", tabindex: 4
diff --git a/app/views/projects/notes/_hints.html.haml b/app/views/projects/notes/_hints.html.haml
index 7d1cbc62e86dc83ecfee4471cd42529363fa4f4f..25466e7562e04e8bf19d92e1190f6c3fc516e12b 100644
--- a/app/views/projects/notes/_hints.html.haml
+++ b/app/views/projects/notes/_hints.html.haml
@@ -1,7 +1,7 @@
 .comment-toolbar.clearfix
   .toolbar-text
     Styling with
-    = link_to 'Markdown', help_page_path('markdown', 'markdown'), target: '_blank', tabindex: -1
+    = link_to 'Markdown', help_page_path('markdown/markdown'), target: '_blank', tabindex: -1
     is supported
   %button.toolbar-button.markdown-selector{ type: 'button', tabindex: '-1' }
     = icon('file-image-o', class: 'toolbar-button-icon')
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index 6a127afa410f1fb4138d061a53b8c07f1ef50dde..7c225e2b2823030b8bf62ef0b2b9ca1bb48360b4 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -31,7 +31,7 @@
           New pipeline
 
         - unless @repository.gitlab_ci_yml
-          = link_to 'Get started with Pipelines', help_page_path('ci/quick_start', 'README'), class: 'btn btn-info'
+          = link_to 'Get started with Pipelines', help_page_path('ci/quick_start/README'), class: 'btn btn-info'
 
         = link_to ci_lint_path, class: 'btn btn-default' do
           %span CI Lint
diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml
index 82892a3335828e877ba7510598c6fe34bca68e4d..ea3d82d858ea70186b8c1ef83148eee254f03de5 100644
--- a/app/views/projects/project_members/_new_project_member.html.haml
+++ b/app/views/projects/project_members/_new_project_member.html.haml
@@ -12,7 +12,7 @@
       = select_tag :access_level, options_for_select(ProjectMember.access_level_roles, @project_member.access_level), class: "project-access-select select2"
       .help-block
         Read more about role permissions
-        %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink"
+        %strong= link_to "here", help_page_path("permissions/permissions"), class: "vlink"
 
   .form-actions
     = f.submit 'Add users to project', class: "btn btn-create"
diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml
index 5669713d9a15038f12fa078910b0021ac269dcec..4da43488daca26c3630fd6d156f68d4f2fa50e34 100644
--- a/app/views/projects/protected_branches/index.html.haml
+++ b/app/views/projects/protected_branches/index.html.haml
@@ -8,10 +8,10 @@
     %p.prepend-top-20
       Protected branches are designed to:
       %ul
-        %li prevent pushes from everybody except #{link_to "masters", help_page_path("permissions", "permissions"), class: "vlink"}
+        %li prevent pushes from everybody except #{link_to "masters", help_page_path("permissions/permissions"), class: "vlink"}
         %li prevent anyone from force pushing to the branch
         %li prevent anyone from deleting the branch
-      %p.append-bottom-0 Read more about #{link_to "project permissions", help_page_path("permissions", "permissions"), class: "underlined-link"}
+      %p.append-bottom-0 Read more about #{link_to "project permissions", help_page_path("permissions/permissions"), class: "underlined-link"}
   .col-lg-9
     %h5.prepend-top-0
       Protect a branch
diff --git a/app/views/shared/_visibility_level.html.haml b/app/views/shared/_visibility_level.html.haml
index 1c6ec198d3d460425f73702aa7cbb92eeb303623..107ad19177c9e1a314923ef3109db4dc12cf403a 100644
--- a/app/views/shared/_visibility_level.html.haml
+++ b/app/views/shared/_visibility_level.html.haml
@@ -1,7 +1,7 @@
 .form-group.project-visibility-level-holder
   = f.label :visibility_level, class: 'control-label' do
     Visibility Level
-    = link_to "(?)", help_page_path("public_access", "public_access")
+    = link_to "(?)", help_page_path("public_access/public_access")
   .col-sm-10
     - if can_change_visibility_level
       = render('shared/visibility_radios', model_method: :visibility_level, form: f, selected_level: visibility_level, form_model: form_model)
diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml
index d1e861ca80c8640e27c5df5c7009dd22ea1debcb..2585ed9360bf5f5ec55dbeb902a495b9dc0edb6c 100644
--- a/app/views/shared/web_hooks/_form.html.haml
+++ b/app/views/shared/web_hooks/_form.html.haml
@@ -6,7 +6,7 @@
     %h4.prepend-top-0
       = page_title
     %p
-      #{link_to "Webhooks", help_page_path("web_hooks", "web_hooks")} can be
+      #{link_to "Webhooks", help_page_path("web_hooks/web_hooks")} can be
       used for binding events when something is happening within the project.
   .col-lg-9.append-bottom-default
     = form_for hook, as: :hook, url: polymorphic_path(url_components + [:hooks]) do |f|
diff --git a/config/routes.rb b/config/routes.rb
index 5ee0bd422fa6f649d50d6d120755c89c0d2071d2..3160fd767b84a43baa42b8b6a8e5c30faff18f50 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -89,9 +89,9 @@ Rails.application.routes.draw do
   mount Grack::AuthSpawner, at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\/(info\/lfs|gitlab-lfs)/.match(request.path_info) }, via: [:get, :post, :put]
 
   # Help
+  
   get 'help'                  => 'help#index'
-  get 'help/:category/:file'  => 'help#show', as: :help_page, constraints: { category: /.*/, file: /[^\/\.]+/ }
-  get 'help/:category/:subcategory/:file'  => 'help#show', as: :deep_help_page, constraints: { category: /.*/, subcategory: /.*/, file: /[^\/\.]+/ }
+  get 'help/*path'            => 'help#show', as: :help_page
   get 'help/shortcuts'
   get 'help/ui' => 'help#ui'
 
diff --git a/features/steps/dashboard/help.rb b/features/steps/dashboard/help.rb
index 800e869533e927f12fb2bd99e1db30535e69f30e..9c94dc70df0bda915ec42b9d9e3cd0366c265dff 100644
--- a/features/steps/dashboard/help.rb
+++ b/features/steps/dashboard/help.rb
@@ -8,7 +8,7 @@ class Spinach::Features::DashboardHelp < Spinach::FeatureSteps
   end
 
   step 'I visit the "Rake Tasks" help page' do
-    visit help_page_path("raketasks", "maintenance")
+    visit help_page_path("raketasks/maintenance")
   end
 
   step 'I should see "Rake Tasks" page markdown rendered' do
diff --git a/spec/features/help_pages_spec.rb b/spec/features/help_pages_spec.rb
index 8c6b669ce78283393c053393d32e2ad83a7cab23..1e2306d7f5930b9f7c67ce0094195141b25878e6 100644
--- a/spec/features/help_pages_spec.rb
+++ b/spec/features/help_pages_spec.rb
@@ -6,7 +6,7 @@ describe 'Help Pages', feature: true do
       login_as :user
     end
     it 'replace the variable $your_email with the email of the user' do
-      visit help_page_path('ssh', 'README')
+      visit help_page_path('ssh/README')
       expect(page).to have_content("ssh-keygen -t rsa -C \"#{@user.email}\"")
     end
   end