diff --git a/app/assets/javascripts/ide/components/external_link.vue b/app/assets/javascripts/ide/components/external_link.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cf3316a81793dd998170bfdf11174d716703ceaf
--- /dev/null
+++ b/app/assets/javascripts/ide/components/external_link.vue
@@ -0,0 +1,41 @@
+<script>
+import Icon from '~/vue_shared/components/icon.vue';
+
+export default {
+  components: {
+    Icon,
+  },
+  props: {
+    file: {
+      type: Object,
+      required: true,
+    },
+  },
+  computed: {
+    showButtons() {
+      return this.file.permalink;
+    },
+  },
+};
+</script>
+
+<template>
+  <div
+    v-if="showButtons"
+    class="pull-right ide-btn-group"
+  >
+    <a
+      :href="file.permalink"
+      target="_blank"
+      :title="s__('IDE|Open in file view')"
+      rel="noopener noreferrer"
+    >
+      <span class="vertical-align-middle">Open in file view</span>
+      <icon
+        name="external-link"
+        css-classes="vertical-align-middle space-right"
+        :size="16"
+      />
+    </a>
+  </div>
+</template>
diff --git a/app/assets/javascripts/ide/components/ide_file_buttons.vue b/app/assets/javascripts/ide/components/ide_file_buttons.vue
deleted file mode 100644
index 30b00abf6ed68e4d3a47c8cf248c7c02d964d334..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/ide/components/ide_file_buttons.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-<script>
-import { __ } from '~/locale';
-import tooltip from '~/vue_shared/directives/tooltip';
-import Icon from '~/vue_shared/components/icon.vue';
-
-export default {
-  components: {
-    Icon,
-  },
-  directives: {
-    tooltip,
-  },
-  props: {
-    file: {
-      type: Object,
-      required: true,
-    },
-  },
-  computed: {
-    showButtons() {
-      return (
-        this.file.rawPath || this.file.blamePath || this.file.commitsPath || this.file.permalink
-      );
-    },
-    rawDownloadButtonLabel() {
-      return this.file.binary ? __('Download') : __('Raw');
-    },
-  },
-};
-</script>
-
-<template>
-  <div
-    v-if="showButtons"
-    class="float-right ide-btn-group"
-  >
-    <a
-      v-tooltip
-      v-if="!file.binary"
-      :href="file.blamePath"
-      :title="__('Blame')"
-      class="btn btn-sm btn-transparent blame"
-    >
-      <icon
-        name="blame"
-        :size="16"
-      />
-    </a>
-    <a
-      v-tooltip
-      :href="file.commitsPath"
-      :title="__('History')"
-      class="btn btn-sm btn-transparent history"
-    >
-      <icon
-        name="history"
-        :size="16"
-      />
-    </a>
-    <a
-      v-tooltip
-      :href="file.permalink"
-      :title="__('Permalink')"
-      class="btn btn-sm btn-transparent permalink"
-    >
-      <icon
-        name="link"
-        :size="16"
-      />
-    </a>
-    <a
-      v-tooltip
-      :href="file.rawPath"
-      target="_blank"
-      class="btn btn-sm btn-transparent prepend-left-10 raw"
-      rel="noopener noreferrer"
-      :title="rawDownloadButtonLabel">
-      <icon
-        name="download"
-        :size="16"
-      />
-    </a>
-  </div>
-</template>
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index a281ecb95c85bcc6f1374fd31cccda2c97f75971..93453989c08e0af8f614fe181898060341f051de 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -6,12 +6,12 @@ import ContentViewer from '~/vue_shared/components/content_viewer/content_viewer
 import { activityBarViews, viewerTypes } from '../constants';
 import monacoLoader from '../monaco_loader';
 import Editor from '../lib/editor';
-import IdeFileButtons from './ide_file_buttons.vue';
+import ExternalLink from './external_link.vue';
 
 export default {
   components: {
     ContentViewer,
-    IdeFileButtons,
+    ExternalLink,
   },
   props: {
     file: {
@@ -224,7 +224,7 @@ export default {
           </a>
         </li>
       </ul>
-      <ide-file-buttons
+      <external-link
         :file="file"
       />
     </div>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
index 8c7e06645592b8e9c30f1c8499f3ef2715b4f156..eb581b807a2b47e5a74266afca79259bab35607d 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
@@ -168,8 +168,8 @@
           <a
             :href="mr.mergeCommitPath"
             class="commit-sha js-mr-merged-commit-sha"
+            v-text="mr.shortMergeCommitSha"
           >
-            {{ mr.shortMergeCommitSha }}
           </a>
           <clipboard-button
             :title="__('Copy commit SHA to clipboard')"
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 93d19bf4823bdf0871f4d75c6e095f2dbc4f1fdb..c5db314944fc1628057e272bd27c2722844944fc 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -306,14 +306,14 @@ def merge!
       elsif @merge_request.actual_head_pipeline.success?
         # This can be triggered when a user clicks the auto merge button while
         # the tests finish at about the same time
-        @merge_request.merge_async(current_user.id, params)
+        @merge_request.merge_async(current_user.id, merge_params)
 
         :success
       else
         :failed
       end
     else
-      @merge_request.merge_async(current_user.id, params)
+      @merge_request.merge_async(current_user.id, merge_params)
 
       :success
     end
diff --git a/app/views/peek/_bar.html.haml b/app/views/peek/_bar.html.haml
index cb0cccb8f8a15551f6bc775c976df9dcac0b1601..89d3b931f88f164cadaa8eeddcfcbb6f42709eaf 100644
--- a/app/views/peek/_bar.html.haml
+++ b/app/views/peek/_bar.html.haml
@@ -2,6 +2,6 @@
 
 #js-peek{ data: { env: Peek.env,
          request_id: Peek.request_id,
-         peek_url: peek_routes.results_url,
+         peek_url: "#{peek_routes_path}/results",
          profile_url: url_for(safe_params.merge(lineprofiler: 'true')) },
          class: Peek.env }
diff --git a/changelogs/unreleased/45520-remove-links-from-web-ide.yml b/changelogs/unreleased/45520-remove-links-from-web-ide.yml
new file mode 100644
index 0000000000000000000000000000000000000000..81d5c26992ffeed8b5419147a2fd118de1e984b5
--- /dev/null
+++ b/changelogs/unreleased/45520-remove-links-from-web-ide.yml
@@ -0,0 +1,5 @@
+---
+title: Change the IDE file buttons for an "Open in file view" button
+merge_request: 19129
+author: Sam Beckham
+type: changed
diff --git a/changelogs/unreleased/46903-osw-fix-permitted-params-filtering-on-merge-scheduling.yml b/changelogs/unreleased/46903-osw-fix-permitted-params-filtering-on-merge-scheduling.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b3c8c8e4045942576fafce9d95cf3f4435fd3232
--- /dev/null
+++ b/changelogs/unreleased/46903-osw-fix-permitted-params-filtering-on-merge-scheduling.yml
@@ -0,0 +1,5 @@
+---
+title: Adjust permitted params filtering on merge scheduling
+merge_request:
+author:
+type: fixed
diff --git a/config/initializers/console_message.rb b/config/initializers/console_message.rb
index 41b404d9c22aadf62f5714dcd710cd4002f7f298..31a5485d443a16f83c27fec487b814854aa5eec5 100644
--- a/config/initializers/console_message.rb
+++ b/config/initializers/console_message.rb
@@ -3,8 +3,8 @@
   # note that this will not print out when using `spring`
   justify = 15
   puts "-------------------------------------------------------------------------------------"
-  puts " Gitlab:".ljust(justify) + "#{Gitlab::VERSION} (#{Gitlab.revision})"
-  puts " Gitlab Shell:".ljust(justify) + Gitlab::Shell.new.version
+  puts " GitLab:".ljust(justify) + "#{Gitlab::VERSION} (#{Gitlab.revision})"
+  puts " GitLab Shell:".ljust(justify) + "#{Gitlab::VersionInfo.parse(Gitlab::Shell.new.version)}"
   puts " #{Gitlab::Database.adapter_name}:".ljust(justify) + Gitlab::Database.version
 
   # EE-specific start
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index 8397c0b00ef6ff1d221572f78ee10d29830d934f..7efb6bafee797675368ee3f2d6b93ed4c5a45244 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -1,34 +1,51 @@
 # Snippets
 
-Snippets are little bits of code or text.
+With GitLab Snippets you can store and share bits of code and text with other users.
 
 ![GitLab Snippet](img/gitlab_snippet.png)
 
-There are 2 types of snippets - project snippets and personal snippets.
+There are 2 types of snippets, personal snippets and project snippets.
 
-## Comments
-
-With GitLab Snippets you engage in a conversation about that piece of code,
-facilitating the collaboration among users.
+## Personal snippets
 
-> **Note:**
-Comments on snippets was [introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/12910) in [GitLab Community Edition 9.2](https://about.gitlab.com/2017/05/22/gitlab-9-2-released/#comments-for-personal-snippets).
+Personal snippets are not related to any project and can be created completely
+independently. There are 3 visibility levels that can be set, public, internal
+and private. See [Public access](../public_access/public_access.md) for more information.
 
 ## Project snippets
 
-Project snippets are always related to a specific project - see [Project's features](project/index.md#project-39-s-features) for more information.
+Project snippets are always related to a specific project.
+See [Project's features](project/index.md#project-39-s-features) for more information.
 
-## Personal snippets
+## Discover snippets
+
+There are two main ways of how you can discover snippets in GitLab.
 
-Personal snippets are not related to any project and can be created completely independently. There are 3 visibility levels that can be set (public, internal, private - see [Public Access](../public_access/public_access.md) for more information).
+For exploring all snippets that are visible to you, you can go to the Snippets
+dashboard of your GitLab instance via the top navigation. For GitLab.com you can
+find it [here](https://gitlab.com/dashboard/snippets). This navigates you to an
+overview that shows snippets you created and allows you to explore all snippets.
+
+If you want to discover snippets that belong to a specific project, you can navigate
+to the Snippets page via the left side navigation on the project page.
+
+## Snippet comments
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/12910) in GitLab 9.2.
+
+With GitLab Snippets you engage in a conversation about that piece of code,
+facilitating the collaboration among users.
 
 ## Downloading snippets
 
 You can download the raw content of a snippet.
 
-By default snippets will be downloaded with Linux-style line endings (`LF`). If you want to preserve the original line endings you need to add a parameter `line_ending=raw` (eg. `https://gitlab.com/snippets/SNIPPET_ID/raw?line_ending=raw`). In case a snippet was created using the GitLab web interface the original line ending is Windows-like (`CRLF`).
+By default snippets will be downloaded with Linux-style line endings (`LF`). If
+you want to preserve the original line endings you need to add a parameter `line_ending=raw`
+(e.g., `https://gitlab.com/snippets/SNIPPET_ID/raw?line_ending=raw`). In case a
+snippet was created using the GitLab web interface the original line ending is Windows-like (`CRLF`).
 
-## Embedded Snippets
+## Embedded snippets
 
 > Introduced in GitLab 10.8.
 
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 0d31934347fe450b966554e26f1e5d5c71a82e37..deaa14c8434879d4f34241fb65595cac942e89b2 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -11,7 +11,7 @@ def add_gon_variables
       gon.asset_host             = ActionController::Base.asset_host
       gon.webpack_public_path    = webpack_public_path
       gon.relative_url_root      = Gitlab.config.gitlab.relative_url_root
-      gon.shortcuts_path         = help_page_path('shortcuts')
+      gon.shortcuts_path         = Gitlab::Routing.url_helpers.help_page_path('shortcuts')
       gon.user_color_scheme      = Gitlab::ColorSchemes.for_user(current_user).css_class
       gon.sentry_dsn             = Gitlab::CurrentSettings.clientside_sentry_dsn if Gitlab::CurrentSettings.clientside_sentry_enabled
       gon.gitlab_url             = Gitlab.config.gitlab.url
diff --git a/lib/gitlab/webpack/dev_server_middleware.rb b/lib/gitlab/webpack/dev_server_middleware.rb
index b9a75eaac63bcb298e0068c50f80381adce68d3b..529f7d6a8d6a512db302a9c87d38b2695bd12761 100644
--- a/lib/gitlab/webpack/dev_server_middleware.rb
+++ b/lib/gitlab/webpack/dev_server_middleware.rb
@@ -15,6 +15,11 @@ def initialize(app = nil, opts = {})
 
       def perform_request(env)
         if @proxy_path && env['PATH_INFO'].start_with?("/#{@proxy_path}")
+          if relative_url_root = Rails.application.config.relative_url_root
+            env['SCRIPT_NAME'] = ""
+            env['REQUEST_PATH'].sub!(/\A#{Regexp.escape(relative_url_root)}/, '')
+          end
+
           super(env)
         else
           @app.call(env)
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 5efaaf2bb3ad9b40d53c1e4f00b1ebda70c63461..6e8de6db9c3dff3e5b346d05fdc7ae18c085696e 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -326,8 +326,8 @@ def merge_with_sha(params = {})
         expect(json_response).to eq('status' => 'success')
       end
 
-      it 'starts the merge immediately' do
-        expect(MergeWorker).to receive(:perform_async).with(merge_request.id, anything, anything)
+      it 'starts the merge immediately with permitted params' do
+        expect(MergeWorker).to receive(:perform_async).with(merge_request.id, anything, { 'squash' => false })
 
         merge_with_sha
       end
diff --git a/spec/javascripts/ide/components/external_link_spec.js b/spec/javascripts/ide/components/external_link_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3d94c041fad93b2da40193d447d17a4f994380c
--- /dev/null
+++ b/spec/javascripts/ide/components/external_link_spec.js
@@ -0,0 +1,35 @@
+import Vue from 'vue';
+import externalLink from '~/ide/components/external_link.vue';
+import createVueComponent from '../../helpers/vue_mount_component_helper';
+import { file } from '../helpers';
+
+describe('ExternalLink', () => {
+  const activeFile = file();
+  let vm;
+
+  function createComponent() {
+    const ExternalLink = Vue.extend(externalLink);
+
+    activeFile.permalink = 'test';
+
+    return createVueComponent(ExternalLink, {
+      file: activeFile,
+    });
+  }
+
+  afterEach(() => {
+    vm.$destroy();
+  });
+
+  it('renders the external link with the correct href', done => {
+    activeFile.binary = true;
+    vm = createComponent();
+
+    vm.$nextTick(() => {
+      const openLink = vm.$el.querySelector('a');
+
+      expect(openLink.href).toMatch(`/${activeFile.permalink}`);
+      done();
+    });
+  });
+});
diff --git a/spec/javascripts/ide/components/ide_file_buttons_spec.js b/spec/javascripts/ide/components/ide_file_buttons_spec.js
deleted file mode 100644
index 8ac8d1b2acf22a001686eacbd13f2d9bc17e1e41..0000000000000000000000000000000000000000
--- a/spec/javascripts/ide/components/ide_file_buttons_spec.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import Vue from 'vue';
-import repoFileButtons from '~/ide/components/ide_file_buttons.vue';
-import createVueComponent from '../../helpers/vue_mount_component_helper';
-import { file } from '../helpers';
-
-describe('RepoFileButtons', () => {
-  const activeFile = file();
-  let vm;
-
-  function createComponent() {
-    const RepoFileButtons = Vue.extend(repoFileButtons);
-
-    activeFile.rawPath = 'test';
-    activeFile.blamePath = 'test';
-    activeFile.commitsPath = 'test';
-
-    return createVueComponent(RepoFileButtons, {
-      file: activeFile,
-    });
-  }
-
-  afterEach(() => {
-    vm.$destroy();
-  });
-
-  it('renders Raw, Blame, History and Permalink', done => {
-    vm = createComponent();
-
-    vm.$nextTick(() => {
-      const raw = vm.$el.querySelector('.raw');
-      const blame = vm.$el.querySelector('.blame');
-      const history = vm.$el.querySelector('.history');
-
-      expect(raw.href).toMatch(`/${activeFile.rawPath}`);
-      expect(raw.getAttribute('data-original-title')).toEqual('Raw');
-      expect(blame.href).toMatch(`/${activeFile.blamePath}`);
-      expect(blame.getAttribute('data-original-title')).toEqual('Blame');
-      expect(history.href).toMatch(`/${activeFile.commitsPath}`);
-      expect(history.getAttribute('data-original-title')).toEqual('History');
-      expect(vm.$el.querySelector('.permalink').getAttribute('data-original-title')).toEqual(
-        'Permalink',
-      );
-
-      done();
-    });
-  });
-
-  it('renders Download', done => {
-    activeFile.binary = true;
-    vm = createComponent();
-
-    vm.$nextTick(() => {
-      const raw = vm.$el.querySelector('.raw');
-
-      expect(raw.href).toMatch(`/${activeFile.rawPath}`);
-      expect(raw.getAttribute('data-original-title')).toEqual('Download');
-
-      done();
-    });
-  });
-});
diff --git a/spec/workers/concerns/waitable_worker_spec.rb b/spec/workers/concerns/waitable_worker_spec.rb
index 54ab07981a4100d827467604a6ef1dcc215fd074..199825b5097b425baa0c9491fbc82c6aeaba519b 100644
--- a/spec/workers/concerns/waitable_worker_spec.rb
+++ b/spec/workers/concerns/waitable_worker_spec.rb
@@ -7,9 +7,7 @@ def self.name
         'Gitlab::Foo::Bar::DummyWorker'
       end
 
-      class << self
-        cattr_accessor(:counter) { 0 }
-      end
+      cattr_accessor(:counter) { 0 }
 
       include ApplicationWorker
       prepend WaitableWorker