diff --git a/app/assets/javascripts/filtered_search/filtered_search_manager.js b/app/assets/javascripts/filtered_search/filtered_search_manager.js
index d0996c9200b3d5ab38a8b74a994a4da9104f01fa..707205a650266a448ced54152f8cc94e16c45474 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_manager.js
@@ -801,7 +801,7 @@ export default class FilteredSearchManager {
       paths.push(`search=${sanitized}`);
     }
 
-    let parameterizedUrl = `?scope=all&utf8=%E2%9C%93&${paths.join('&')}`;
+    let parameterizedUrl = `?scope=all&${paths.join('&')}`;
 
     if (this.anchor) {
       parameterizedUrl += `#${this.anchor}`;
diff --git a/app/assets/javascripts/incidents/components/incidents_list.vue b/app/assets/javascripts/incidents/components/incidents_list.vue
index af99341b11fdf558fc8e099539daa4554fe03df7..4d34daa43ba5872cc32fd23508f5d75fb65c5ebf 100644
--- a/app/assets/javascripts/incidents/components/incidents_list.vue
+++ b/app/assets/javascripts/incidents/components/incidents_list.vue
@@ -10,6 +10,7 @@ import {
   GlIcon,
   GlEmptyState,
 } from '@gitlab/ui';
+import { isValidSlaDueAt } from 'ee_else_ce/vue_shared/components/incidents/utils';
 import { visitUrl, mergeUrlParams, joinPaths } from '~/lib/utils/url_utility';
 import { s__ } from '~/locale';
 import { INCIDENT_SEVERITY } from '~/sidebar/components/severity/constants';
@@ -287,6 +288,7 @@ export default {
     errorAlertDismissed() {
       this.isErrorAlertDismissed = true;
     },
+    isValidSlaDueAt,
   },
 };
 </script>
@@ -367,7 +369,13 @@ export default {
           </template>
 
           <template v-if="slaFeatureAvailable" #cell(incidentSla)="{ item }">
-            <service-level-agreement-cell :sla-due-at="item.slaDueAt" data-testid="incident-sla" />
+            <service-level-agreement-cell
+              v-if="isValidSlaDueAt(item.slaDueAt)"
+              :issue-iid="item.iid"
+              :project-path="projectPath"
+              :sla-due-at="item.slaDueAt"
+              data-testid="incident-sla"
+            />
           </template>
 
           <template #cell(assignees)="{ item }">
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6c49a10ee843a4fce2d7ef13c658090d23ee77e
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js
@@ -0,0 +1,29 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import PackagesApp from '~/packages/details/components/app.vue';
+import createStore from '~/packages/details/store';
+import Translate from '~/vue_shared/translate';
+
+Vue.use(Translate);
+
+export default () => {
+  const el = document.querySelector('#js-vue-packages-detail');
+  const { package: packageJson, canDelete: canDeleteStr, ...rest } = el.dataset;
+  const packageEntity = JSON.parse(packageJson);
+  const canDelete = parseBoolean(canDeleteStr);
+
+  const store = createStore({
+    packageEntity,
+    packageFiles: packageEntity.package_files,
+    canDelete,
+    ...rest,
+  });
+
+  return new Vue({
+    el,
+    store,
+    render(createElement) {
+      return createElement(PackagesApp);
+    },
+  });
+};
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
index 4589c99f4f7907d9fbe14e488501144308e60ec3..292a70cd69ad8ab9a5a81a4ba454401ea7668457 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
@@ -113,7 +113,6 @@ export default {
         }),
         visibility: initFormField({
           value: this.projectVisibility,
-          skipValidation: true,
         }),
       },
     };
@@ -326,7 +325,11 @@ export default {
       />
     </gl-form-group>
 
-    <gl-form-group>
+    <gl-form-group
+      v-validation:[form.showValidation]
+      :invalid-feedback="s__('ForkProject|Please select a visibility level')"
+      :state="form.fields.visibility.state"
+    >
       <label>
         {{ s__('ForkProject|Visibility level') }}
         <gl-link :href="visibilityHelpPath" target="_blank">
diff --git a/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js b/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..44d9e2ffb6e1ff0d29b1973e7d3333c616e22907
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js
@@ -0,0 +1,3 @@
+import initDetails from '~/packages_and_registries/infrastructure_registry/details_app_bundle';
+
+initDetails();
diff --git a/app/assets/javascripts/projects/commit/components/form_modal.vue b/app/assets/javascripts/projects/commit/components/form_modal.vue
index 6eefa5f55e4262ed906fc9aeca5e2b835de8422a..ec7d37644a89f42bd7e854083c81c7174104b249 100644
--- a/app/assets/javascripts/projects/commit/components/form_modal.vue
+++ b/app/assets/javascripts/projects/commit/components/form_modal.vue
@@ -3,7 +3,6 @@ import { GlModal, GlForm, GlFormCheckbox, GlSprintf, GlFormGroup } from '@gitlab
 import { mapActions, mapState } from 'vuex';
 import { BV_SHOW_MODAL } from '~/lib/utils/constants';
 import csrf from '~/lib/utils/csrf';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
 import eventHub from '../event_hub';
 import BranchesDropdown from './branches_dropdown.vue';
 import ProjectsDropdown from './projects_dropdown.vue';
@@ -18,7 +17,6 @@ export default {
     GlSprintf,
     GlFormGroup,
   },
-  mixins: [glFeatureFlagsMixin()],
   inject: {
     prependedText: {
       default: '',
@@ -116,7 +114,7 @@ export default {
       <input type="hidden" name="authenticity_token" :value="$options.csrf.token" />
 
       <gl-form-group
-        v-if="glFeatures.pickIntoProject && isCherryPick"
+        v-if="isCherryPick"
         :label="i18n.projectLabel"
         label-for="start_project"
         data-testid="dropdown-group"
diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js
index 0c920ac927b1a75ab7f95ecbde4e6d37eec8847c..e0ba7dba97f16f514249ddca8b261613ed8b6519 100644
--- a/app/assets/javascripts/tracking/index.js
+++ b/app/assets/javascripts/tracking/index.js
@@ -48,7 +48,7 @@ const createEventPayload = (el, { suffix = '' } = {}) => {
 
   const action = (trackAction || trackEvent) + (suffix || '');
   let value = trackValue || el.value || undefined;
-  if (el.type === 'checkbox' && !el.checked) value = false;
+  if (el.type === 'checkbox' && !el.checked) value = 0;
 
   let extra = trackExtra;
 
diff --git a/app/assets/javascripts/vue_shared/components/incidents/utils.js b/app/assets/javascripts/vue_shared/components/incidents/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..bcb578a6ba64cc729414e27aad5d86f14f0a5ac9
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/incidents/utils.js
@@ -0,0 +1,3 @@
+import { noop } from 'lodash';
+
+export const isValidSlaDueAt = noop;
diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb
index 7bfcda67aa2703178fd2e994d34cf8c0006c5a51..0fb77e2aaf4b4628b94b0b24fae4a6cc933fa0d5 100644
--- a/app/controllers/concerns/creates_commit.rb
+++ b/app/controllers/concerns/creates_commit.rb
@@ -18,7 +18,7 @@ def create_commit(service, success_path:, failure_path:, failure_view: nil, succ
 
     @start_branch ||= @ref || @branch_name
 
-    start_project = Feature.enabled?(:pick_into_project, @project, default_enabled: :yaml) ? @project_to_commit_into : @project
+    start_project = @project_to_commit_into
 
     commit_params = @commit_params.merge(
       start_project: start_project,
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 863715429ffaecc8b23281cd2201c1a3ff68eae2..3d2398f7ee308bb8b9b43cc7870f3407baf1bbb2 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -19,9 +19,6 @@ class Projects::CommitController < Projects::ApplicationController
   before_action :define_commit_box_vars, only: [:show, :pipelines]
   before_action :define_note_vars, only: [:show, :diff_for_path, :diff_files]
   before_action :authorize_edit_tree!, only: [:revert, :cherry_pick]
-  before_action do
-    push_frontend_feature_flag(:pick_into_project, @project, default_enabled: :yaml)
-  end
 
   BRANCH_SEARCH_LIMIT = 1000
   COMMIT_DIFFS_PER_PAGE = 20
@@ -220,7 +217,6 @@ def assign_change_commit_vars
 
   def find_cherry_pick_target_project
     return @project if params[:target_project_id].blank?
-    return @project unless Feature.enabled?(:pick_into_project, @project, default_enabled: :yaml)
 
     MergeRequestTargetProjectFinder
       .new(current_user: current_user, source_project: @project, project_feature: :repository)
diff --git a/app/controllers/projects/packages/infrastructure_registry_controller.rb b/app/controllers/projects/packages/infrastructure_registry_controller.rb
index 22ae1d6501351fbdc57289360f4fdf7ae32c44cc..f6db314b475c3113146b75c34d163c7efe5dbf20 100644
--- a/app/controllers/projects/packages/infrastructure_registry_controller.rb
+++ b/app/controllers/projects/packages/infrastructure_registry_controller.rb
@@ -3,7 +3,19 @@
 module Projects
   module Packages
     class InfrastructureRegistryController < Projects::ApplicationController
+      before_action :verify_feature_enabled!
       feature_category :infrastructure_as_code
+
+      def show
+        @package = project.packages.find(params[:id])
+        @package_files = @package.package_files.recent
+      end
+
+      private
+
+      def verify_feature_enabled!
+        render_404 unless Feature.enabled?(:infrastructure_registry_page)
+      end
     end
   end
 end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index 7893ce76da1eba1a264bf50b5d2eb4b0175570a2..a7696ba4ea7cd097abcc62334511f5b8ba0b9c14 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -137,8 +137,6 @@ def conditionally_paginate_diff_files(diffs, paginate:, per:)
   end
 
   def cherry_pick_projects_data(project)
-    return [] unless Feature.enabled?(:pick_into_project, project, default_enabled: :yaml)
-
     [project, project.forked_from_project].compact.map do |project|
       {
         id: project.id.to_s,
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 0682f3013d42462a698797fb4a24e8b4acf560e7..e27ea7c07e574bb75bb32a193b2c0b527f16b384 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -116,7 +116,7 @@ def destroy_project_related_records(project)
       log_destroy_event
       trash_relation_repositories!
       trash_project_repositories!
-      destroy_web_hooks! if Feature.enabled?(:destroy_webhooks_before_the_project, project, default_enabled: :yaml)
+      destroy_web_hooks!
 
       # Rails attempts to load all related records into memory before
       # destroying: https://github.com/rails/rails/issues/22510
diff --git a/app/views/projects/packages/infrastructure_registry/show.html.haml b/app/views/projects/packages/infrastructure_registry/show.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..a36dd685f45cc74e78fce805c880f17b8f9315fe
--- /dev/null
+++ b/app/views/projects/packages/infrastructure_registry/show.html.haml
@@ -0,0 +1,13 @@
+- add_to_breadcrumbs _("Infrastructure Registry"), project_packages_path(@project)
+- add_to_breadcrumbs @package.name, project_packages_path(@project)
+- breadcrumb_title @package.version
+- page_title _("Infrastructure Registry")
+- @content_class = "limit-container-width" unless fluid_layout
+
+.row
+  .col-12
+    #js-vue-packages-detail{ data: { package: package_from_presenter(@package),
+      can_delete: can?(current_user, :destroy_package, @project).to_s,
+      svg_path: image_path('illustrations/no-packages.svg'),
+      project_name: @project.name,
+      project_list_url: project_infrastructure_registry_index_path(@project)} }
diff --git a/config/feature_flags/development/destroy_webhooks_before_the_project.yml b/config/feature_flags/development/destroy_webhooks_before_the_project.yml
deleted file mode 100644
index 7493822d641a72d6d5d11e777cad7e557d49f2a2..0000000000000000000000000000000000000000
--- a/config/feature_flags/development/destroy_webhooks_before_the_project.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: destroy_webhooks_before_the_project
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59754
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328393
-milestone: '13.12'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/pick_into_project.yml b/config/feature_flags/development/pick_into_project.yml
deleted file mode 100644
index fc28527d5a3760bf4976ce7d6690485290e75f76..0000000000000000000000000000000000000000
--- a/config/feature_flags/development/pick_into_project.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pick_into_project
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55970
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324154
-milestone: '13.10'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7617173348331b5836e97dca11e2684a502fa365
--- /dev/null
+++ b/config/initializers/action_view.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+# This file was introduced during upgrading Rails from 5.2 to 6.0.
+# This file can be removed when `config.load_defaults 6.0` is introduced.
+
+# Don't force requests from old versions of IE to be UTF-8 encoded.
+Rails.application.config.action_view.default_enforce_utf8 = false
diff --git a/config/routes.rb b/config/routes.rb
index 2f0dcc3b856e85d17b2b1d71d20e242577bcbea4..bc85fe440a145b00f750bc6b3e49dcecf2799c8f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -279,9 +279,13 @@
 
   # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/210024
   scope as: 'deprecated' do
-    draw :snippets
+    # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719
+    get '/snippets/:id/raw',
+      to: 'snippets#raw',
+      format: false,
+      constraints: { id: /\d+/ }
 
-    Gitlab::Routing.redirect_legacy_paths(self, :profile)
+    Gitlab::Routing.redirect_legacy_paths(self, :profile, :snippets)
   end
 
   Gitlab.ee do
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 4213febc1fc4d11d9cd159f48bad6269e1cb5e89..9a77e7a98ac0feb2e3ed9aa7742e71cde6fd3aa7 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -50,7 +50,7 @@
           end
         end
 
-        resources :infrastructure_registry, only: [:index], module: :packages
+        resources :infrastructure_registry, only: [:index, :show], module: :packages
 
         resources :jobs, only: [:index, :show], constraints: { id: /\d+/ } do
           collection do
@@ -567,13 +567,13 @@
         # Issue https://gitlab.com/gitlab-org/gitlab/issues/118849
         draw :repository
 
-        # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/29572
-        resources :snippets, concerns: :awardable, constraints: { id: /\d+/ } do # rubocop: disable Cop/PutProjectRoutesUnderScope
-          member do
-            get :raw # rubocop:todo Cop/PutProjectRoutesUnderScope
-            post :mark_as_spam # rubocop:todo Cop/PutProjectRoutesUnderScope
-          end
-        end
+        # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719
+        # rubocop: disable Cop/PutProjectRoutesUnderScope
+        get '/snippets/:id/raw',
+          to: 'snippets#raw',
+          format: false,
+          constraints: { id: /\d+/ }
+        # rubocop: enable Cop/PutProjectRoutesUnderScope
       end
 
       # All new routes should go under /-/ scope.
@@ -589,7 +589,7 @@
                                             :tracing,
                                             :serverless, :clusters, :audit_events, :wikis, :merge_requests,
                                             :vulnerability_feedback, :security, :dependencies, :issues,
-                                            :pipelines, :pipeline_schedules)
+                                            :pipelines, :pipeline_schedules, :snippets)
     end
 
     # rubocop: disable Cop/PutProjectRoutesUnderScope
diff --git a/doc/api/group_wikis.md b/doc/api/group_wikis.md
index f0c38d4d4b9ab352199a57a4d73fad8f5fa8beab..7d5f8ec641d654b75984bf3a63bac0354d834e89 100644
--- a/doc/api/group_wikis.md
+++ b/doc/api/group_wikis.md
@@ -64,7 +64,7 @@ GET /groups/:id/wikis/:slug
 | Attribute | Type           | Required | Description                                                                   |
 | --------- | -------        | -------- | ---------------------                                                         |
 | `id`      | integer/string | yes      | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
-| `slug`    | string         | yes      | The slug (a unique string) of the wiki page                                   |
+| `slug`    | string         | yes      | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name`      |
 
 ```shell
 curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/wikis/home"
@@ -127,7 +127,7 @@ PUT /groups/:id/wikis/:slug
 | `content`       | string         | yes if `title` is not provided    | The content of the wiki page                                                                           |
 | `title`         | string         | yes if `content` is not provided  | The title of the wiki page                                                                             |
 | `format`        | string         | no                                | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
-| `slug`          | string         | yes                               | The slug (a unique identifier) of the wiki page                                                        |
+| `slug`          | string         | yes                               | URL encoded slug (a unique string) of the wiki page. Ex. dir%2Fpage_name                                                        |
 
 ```shell
 curl --request PUT --data "format=rdoc&content=documentation&title=Docs" \
@@ -157,7 +157,7 @@ DELETE /groups/:id/wikis/:slug
 | Attribute | Type           | Required | Description                                                                   |
 | --------- | -------        | -------- | ---------------------                                                         |
 | `id`      | integer/string | yes      | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
-| `slug`    | string         | yes      | The slug (a unique identifier) of the wiki page                               |
+| `slug`    | string         | yes      | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name`      |
 
 ```shell
 curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/wikis/foo"
diff --git a/doc/api/templates/dockerfiles.md b/doc/api/templates/dockerfiles.md
index 6eedf8d2bc06ddf667ce41863ae6a9a47322529a..2d7e926561f6b8b853bcc46af367c5a4e3613de0 100644
--- a/doc/api/templates/dockerfiles.md
+++ b/doc/api/templates/dockerfiles.md
@@ -74,10 +74,6 @@ Example response:
     "key": "OpenJDK",
     "name": "OpenJDK"
   },
-  {
-    "key": "OpenJDK-alpine",
-    "name": "OpenJDK-alpine"
-  },
   {
     "key": "PHP",
     "name": "PHP"
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index 569708cdfcc10201ddb94c4f228563c24022dae8..791eba460937f4d290d9fa2992f1bb99439a0ed3 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -64,7 +64,7 @@ GET /projects/:id/wikis/:slug
 | Attribute | Type    | Required | Description           |
 | --------- | ------- | -------- | --------------------- |
 | `id`      | integer/string    | yes      | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `slug` | string  | yes       | The slug (a unique string) of the wiki page |
+| `slug` | string  | yes       | URLencoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name`  |
 
 ```shell
 curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/home"
@@ -125,7 +125,7 @@ PUT /projects/:id/wikis/:slug
 | `content`       | string  | yes if `title` is not provided     | The content of the wiki page |
 | `title`        | string  | yes if `content` is not provided      | The title of the wiki page        |
 | `format` | string  | no       | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
-| `slug` | string  | yes       | The slug (a unique string) of the wiki page |
+| `slug` | string  | yes       | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
 
 ```shell
 curl --request PUT --data "format=rdoc&content=documentation&title=Docs" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/foo"
@@ -153,7 +153,7 @@ DELETE /projects/:id/wikis/:slug
 | Attribute | Type    | Required | Description           |
 | --------- | ------- | -------- | --------------------- |
 | `id`      | integer/string    | yes      | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `slug` | string  | yes       | The slug (a unique string) of the wiki page |
+| `slug` | string  | yes       | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
 
 ```shell
 curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/foo"
diff --git a/doc/user/project/merge_requests/cherry_pick_changes.md b/doc/user/project/merge_requests/cherry_pick_changes.md
index b71c7386301b82d3edc3ac49b5718950dacd8e5b..710638128f3557a8822fcbf4f9fc09da51f0a5f3 100644
--- a/doc/user/project/merge_requests/cherry_pick_changes.md
+++ b/doc/user/project/merge_requests/cherry_pick_changes.md
@@ -63,10 +63,7 @@ git cherry-pick -m 2 7a39eb0
 ### Cherry-pick into a project
 
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21268) in GitLab 13.11.
-> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-cherry-picking-into-a-project). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/324154) in GitLab 14.0
 
 WARNING:
 This feature might not be available to you. Check the **version history** note above for details.
@@ -81,25 +78,6 @@ merge request is from a fork:
 1. (Optional) Select **Start a new merge request** if you're ready to create a merge request.
 1. Click **Cherry-pick**.
 
-### Enable or disable cherry-picking into a project **(FREE SELF)**
-
-Cherry-picking into a project is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:pick_into_project)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:pick_into_project)
-```
-
 ## Related links
 
 - The [Commits API](../../../api/commits.md) enables you to add custom messages
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index a5eaf76c47b1ddff0a140a009f3859313cc6a25b..e8e9b56b456595d566f2af925a7a361f98176a5a 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -14341,6 +14341,9 @@ msgstr ""
 msgid "ForkProject|Please select a namespace"
 msgstr ""
 
+msgid "ForkProject|Please select a visibility level"
+msgstr ""
+
 msgid "ForkProject|Private"
 msgstr ""
 
@@ -15745,13 +15748,16 @@ msgstr ""
 msgid "GroupActivityMetrics|Issues opened"
 msgstr ""
 
+msgid "GroupActivityMetrics|Last 90 days"
+msgstr ""
+
 msgid "GroupActivityMetrics|Members added"
 msgstr ""
 
 msgid "GroupActivityMetrics|Merge Requests opened"
 msgstr ""
 
-msgid "GroupActivityMetrics|Recent activity (last 90 days)"
+msgid "GroupActivityMetrics|Recent activity"
 msgstr ""
 
 msgid "GroupImport|Failed to import group."
@@ -17357,6 +17363,9 @@ msgstr ""
 msgid "IncidentManagement|%{minutes} minutes remaining"
 msgstr ""
 
+msgid "IncidentManagement|Achieved SLA"
+msgstr ""
+
 msgid "IncidentManagement|All"
 msgstr ""
 
@@ -17396,6 +17405,9 @@ msgstr ""
 msgid "IncidentManagement|Medium - S3"
 msgstr ""
 
+msgid "IncidentManagement|Missed SLA"
+msgstr ""
+
 msgid "IncidentManagement|No incidents to display."
 msgstr ""
 
diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb
index a231b54419e7bc8adcaa318138ea73393c71822f..c650d145bef0c984cb815cffd7208c542bde4bf1 100644
--- a/spec/controllers/projects/commit_controller_spec.rb
+++ b/spec/controllers/projects/commit_controller_spec.rb
@@ -380,18 +380,6 @@ def merge_request_url(source_project, branch)
           expect(response).to have_gitlab_http_status(:not_found)
         end
       end
-
-      context 'disable pick_into_project feature flag' do
-        before do
-          stub_feature_flags(pick_into_project: false)
-        end
-
-        it 'does not cherry pick a commit from fork to upstream' do
-          send_request
-
-          expect(project.commit('feature').message).not_to include(forked_project.commit.id)
-        end
-      end
     end
   end
 
diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9cab4ebeb3ad4496f4d7117d4659da1de9776b41
--- /dev/null
+++ b/spec/features/projects/infrastructure_registry_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Infrastructure Registry' do
+  let_it_be(:user) { create(:user) }
+  let_it_be(:project) { create(:project) }
+
+  before do
+    sign_in(user)
+    project.add_maintainer(user)
+  end
+
+  context 'when feature is not available' do
+    before do
+      stub_feature_flags(infrastructure_registry_page: false)
+    end
+
+    it 'gives 404' do
+      visit_project_infrastructure_registry
+
+      expect(status_code).to eq(404)
+    end
+  end
+
+  context 'when feature is available', :js do
+    before do
+      visit_project_infrastructure_registry
+    end
+
+    context 'when there are packages' do
+      let_it_be(:terraform_module) { create(:terraform_module_package, project: project, created_at: 1.day.ago, version: '1.0.0') }
+      let_it_be(:terraform_module2) { create(:terraform_module_package, project: project, created_at: 2.days.ago, version: '2.0.0') }
+      let_it_be(:packages) { [terraform_module, terraform_module2] }
+
+      it_behaves_like 'packages list'
+
+      context 'deleting a package' do
+        let_it_be(:project) { create(:project) }
+        let_it_be(:terraform_module) { create(:terraform_module_package, project: project) }
+
+        it 'allows you to delete a module', :aggregate_failures do
+          # this is still using the package copy in the UI too
+          click_button('Remove package')
+          click_button('Delete package')
+
+          expect(page).to have_content 'Package deleted successfully'
+          expect(page).not_to have_content(terraform_module.name)
+        end
+      end
+    end
+
+    it 'displays the empty message' do
+      expect(page).to have_content('You have no Terraform modules in your project')
+    end
+  end
+
+  def visit_project_infrastructure_registry
+    visit project_infrastructure_registry_index_path(project)
+  end
+end
diff --git a/spec/frontend/filtered_search/filtered_search_manager_spec.js b/spec/frontend/filtered_search/filtered_search_manager_spec.js
index 465e1ee1ef1ae8ced9708ecb0fd292608fb3ef3a..c03c8f6c529a5b7233d6d54013ec0efcd707ea59 100644
--- a/spec/frontend/filtered_search/filtered_search_manager_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_manager_spec.js
@@ -185,7 +185,7 @@ describe('Filtered Search Manager', () => {
   });
 
   describe('search', () => {
-    const defaultParams = '?scope=all&utf8=%E2%9C%93';
+    const defaultParams = '?scope=all';
     const defaultState = '&state=opened';
 
     it('should search with a single word', (done) => {
diff --git a/spec/frontend/incidents/components/incidents_list_spec.js b/spec/frontend/incidents/components/incidents_list_spec.js
index c7286d70b9460e7f0506d8052d476f9cff312fa5..8d4ccab2a409df45cae6a37302cce7c8eb0ef28f 100644
--- a/spec/frontend/incidents/components/incidents_list_spec.js
+++ b/spec/frontend/incidents/components/incidents_list_spec.js
@@ -43,12 +43,10 @@ describe('Incidents List', () => {
   const findLoader = () => wrapper.find(GlLoadingIcon);
   const findTimeAgo = () => wrapper.findAll(TimeAgoTooltip);
   const findAssignees = () => wrapper.findAll('[data-testid="incident-assignees"]');
-  const findIncidentSlaHeader = () => wrapper.find('[data-testid="incident-management-sla"]');
   const findCreateIncidentBtn = () => wrapper.find('[data-testid="createIncidentBtn"]');
   const findClosedIcon = () => wrapper.findAll("[data-testid='incident-closed']");
   const findEmptyState = () => wrapper.find(GlEmptyState);
   const findSeverity = () => wrapper.findAll(SeverityToken);
-  const findIncidentSla = () => wrapper.findAll("[data-testid='incident-sla']");
 
   function mountComponent({ data = {}, loading = false, provide = {} } = {}) {
     wrapper = mount(IncidentsList, {
@@ -188,35 +186,6 @@ describe('Incidents List', () => {
         joinPaths(`/project/issues/incident`, mockIncidents[0].iid),
       );
     });
-
-    describe('Incident SLA field', () => {
-      it('displays the column when the feature is available', () => {
-        mountComponent({
-          data: { incidents: { list: mockIncidents } },
-          provide: { slaFeatureAvailable: true },
-        });
-
-        expect(findIncidentSlaHeader().text()).toContain('Time to SLA');
-      });
-
-      it('does not display the column when the feature is not available', () => {
-        mountComponent({
-          data: { incidents: { list: mockIncidents } },
-          provide: { slaFeatureAvailable: false },
-        });
-
-        expect(findIncidentSlaHeader().exists()).toBe(false);
-      });
-
-      it('renders an SLA for each incident', () => {
-        mountComponent({
-          data: { incidents: { list: mockIncidents } },
-          provide: { slaFeatureAvailable: true },
-        });
-
-        expect(findIncidentSla().length).toBe(mockIncidents.length);
-      });
-    });
   });
 
   describe('Create Incident', () => {
diff --git a/spec/frontend/issues_list/components/issuables_list_app_spec.js b/spec/frontend/issues_list/components/issuables_list_app_spec.js
index fe3d2114463b390b8eb9ffbd48da0f3abd5f2163..a7f3dd81517c117f51f1551ba5e6a414faf0921d 100644
--- a/spec/frontend/issues_list/components/issuables_list_app_spec.js
+++ b/spec/frontend/issues_list/components/issuables_list_app_spec.js
@@ -302,7 +302,6 @@ describe('Issuables list component', () => {
       my_reaction_emoji: 'airplane',
       scope: 'all',
       state: 'opened',
-      utf8: '✓',
       weight: '0',
       milestone: 'v3.0',
       labels: 'Aquapod,Astro',
@@ -312,7 +311,7 @@ describe('Issuables list component', () => {
 
     describe('when page is not present in params', () => {
       const query =
-        '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&utf8=%E2%9C%93&weight=0&not[label_name][]=Afterpod&not[milestone_title][]=13';
+        '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&weight=0&not[label_name][]=Afterpod&not[milestone_title][]=13';
 
       beforeEach(() => {
         setUrl(query);
@@ -356,7 +355,7 @@ describe('Issuables list component', () => {
 
     describe('when page is present in the param', () => {
       const query =
-        '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&utf8=%E2%9C%93&weight=0&page=3';
+        '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&weight=0&page=3';
 
       beforeEach(() => {
         setUrl(query);
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
index 3a0e899ada3c2f1d2e74720d2e12d58c814aed83..79a0ab006dae61d33ee322e71b6179d2e49bb7bb 100644
--- a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
@@ -261,7 +261,7 @@ describe('ForkForm component', () => {
   });
 
   describe('onSubmit', () => {
-    beforeEach(() => {
+    const setupComponent = (fields = {}) => {
       jest.spyOn(urlUtility, 'redirectTo').mockImplementation();
 
       mockGetRequest();
@@ -271,9 +271,14 @@ describe('ForkForm component', () => {
           namespaces: MOCK_NAMESPACES_RESPONSE,
           form: {
             state: true,
+            ...fields,
           },
         },
       );
+    };
+
+    beforeEach(() => {
+      setupComponent();
     });
 
     const selectedMockNamespaceIndex = 1;
@@ -305,6 +310,23 @@ describe('ForkForm component', () => {
 
         expect(urlUtility.redirectTo).not.toHaveBeenCalled();
       });
+
+      it('does not make POST request if no visbility is checked', async () => {
+        jest.spyOn(axios, 'post');
+
+        setupComponent({
+          fields: {
+            visibility: {
+              value: null,
+            },
+          },
+        });
+
+        await submitForm();
+
+        expect(wrapper.find('[name="visibility"]:checked').exists()).toBe(false);
+        expect(axios.post).not.toHaveBeenCalled();
+      });
     });
 
     describe('with valid form', () => {
diff --git a/spec/frontend/projects/commit/components/form_modal_spec.js b/spec/frontend/projects/commit/components/form_modal_spec.js
index 9688cb47799611d281b4e951bd6c24f3b6325e98..0c8089430d08000fdc58094a33fec22a13ceca3e 100644
--- a/spec/frontend/projects/commit/components/form_modal_spec.js
+++ b/spec/frontend/projects/commit/components/form_modal_spec.js
@@ -159,12 +159,7 @@ describe('CommitFormModal', () => {
     });
 
     it('Changes the target_project_id input value', async () => {
-      createComponent(
-        shallowMount,
-        {},
-        { glFeatures: { pickIntoProject: true } },
-        { isCherryPick: true },
-      );
+      createComponent(shallowMount, {}, {}, { isCherryPick: true });
       findProjectsDropdown().vm.$emit('selectProject', '_changed_project_value_');
 
       await wrapper.vm.$nextTick();
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
index 9d60f9232ebb9990b4ad5080727f16efbf9be43a..ac1bb57d7da7e2127dc2f6bf923260b08a2bb649 100644
--- a/spec/frontend/tracking_spec.js
+++ b/spec/frontend/tracking_spec.js
@@ -232,7 +232,7 @@ describe('Tracking', () => {
       Tracking.bindDocument('_category_'); // only happens once
       setHTMLFixture(`
         <input data-track-${term}="click_input1" data-track-label="_label_" value="_value_"/>
-        <input data-track-${term}="click_input2" data-track-value="_value_override_" value="_value_"/>
+        <input data-track-${term}="click_input2" data-track-value="_value_override_" value=0/>
         <input type="checkbox" data-track-${term}="toggle_checkbox" value="_value_" checked/>
         <input class="dropdown" data-track-${term}="toggle_dropdown"/>
         <div data-track-${term}="nested_event"><span class="nested"></span></div>
@@ -272,7 +272,7 @@ describe('Tracking', () => {
       checkbox.click(); // unchecking
 
       expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_checkbox', {
-        value: false,
+        value: 0,
       });
 
       checkbox.click(); // checking
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 01493b0bad907f25336e77d09c6373ea7979b8ce..4e94636ba45cd072a58a70af3430d6316030baae 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -205,16 +205,6 @@
         { id: forked_project.id.to_s, name: forked_project.full_path, refsUrl: refs_project_path(forked_project) }
       ])
     end
-
-    context 'pick_into_project is disabled' do
-      before do
-        stub_feature_flags(pick_into_project: false)
-      end
-
-      it 'does not calculate target projects' do
-        expect(helper.cherry_pick_projects_data(project)).to eq([])
-      end
-    end
   end
 
   describe "#commit_options_dropdown_data" do
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index 957a680189ec81dd7280d7b564f282fd5e1858e8..54c866b4a6d28a4b1c572e6658d7dcd6ce43f03a 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -113,7 +113,7 @@ def failure_message(constant_name, migration_helper, missing_words: [], addition
 
   let(:deprecated_routes) do
     # profile was deprecated in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51646
-    %w(profile)
+    %w(profile s)
   end
 
   let(:ee_top_level_words) do
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 43d7c31d87f6937d25d7b576469429d28937ab47..fe04a1d7c4a63af6a37101eac0baa4d2f486a3d5 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -320,9 +320,11 @@
       expect(get('/gitlab/gitlabhq/-/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
     end
 
-    it 'to #show from unscope routing' do
-      expect(get('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
+    it 'to #raw from unscope routing' do
+      expect(get('/gitlab/gitlabhq/snippets/1/raw')).to route_to('projects/snippets#raw', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
     end
+
+    it_behaves_like 'redirecting a legacy path', '/gitlab/gitlabhq/snippets/1', '/gitlab/gitlabhq/-/snippets/1'
   end
 
   # test_project_hook POST   /:project_id/-/hooks/:id/test(.:format) hooks#test
diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb
index 69c0ae7a945e85b5b0b8402352c8cffa65b237e9..4d95d5631e422725912f74ce7e60d2e987936da3 100644
--- a/spec/routing/routing_spec.rb
+++ b/spec/routing/routing_spec.rb
@@ -96,9 +96,11 @@
     expect(get("/-/snippets/1")).to route_to('snippets#show', id: '1')
   end
 
-  it 'to #show from unscoped routing' do
-    expect(get("/snippets/1")).to route_to('snippets#show', id: '1')
+  it 'to #raw from unscoped routing' do
+    expect(get("/snippets/1/raw")).to route_to('snippets#raw', id: '1')
   end
+
+  it_behaves_like 'redirecting a legacy path', '/snippets/1', '/-/snippets/1'
 end
 
 #            help GET /help(.:format)                 help#index
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index ff582279d717a8c37f53a60bec33d37b94785529..c6b2b1e2b21730e596813da3c4da89270b9e0af6 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -447,23 +447,6 @@
 
       it_behaves_like 'handles errors thrown during async destroy', "Failed to remove webhooks"
     end
-
-    context 'when "destroy_webhooks_before_the_project" flag is disabled' do
-      before do
-        stub_feature_flags(destroy_webhooks_before_the_project: false)
-      end
-
-      it 'does not call WebHooks::DestroyService' do
-        expect(WebHooks::DestroyService).not_to receive(:new)
-
-        expect do
-          destroy_project(project, user)
-        end.to change(WebHook, :count).by(-2)
-           .and change(WebHookLog, :count).by(-1)
-
-        expect(another_project_web_hook.reload).to be
-      end
-    end
   end
 
   context 'error while destroying', :sidekiq_inline do
diff --git a/vendor/Dockerfile/OpenJDK-alpine.Dockerfile b/vendor/Dockerfile/OpenJDK-alpine.Dockerfile
deleted file mode 100644
index ee853d9cfd26f798b4b2901a2c0095930b3b91dc..0000000000000000000000000000000000000000
--- a/vendor/Dockerfile/OpenJDK-alpine.Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM openjdk:8-alpine
-
-COPY . /usr/src/myapp
-WORKDIR /usr/src/myapp
-
-RUN javac Main.java
-
-CMD ["java", "Main"]