diff --git a/app/controllers/groups/work_items_controller.rb b/app/controllers/groups/work_items_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d1e15c81471edac4e4b9c43a3c15ec1bf8985a66
--- /dev/null
+++ b/app/controllers/groups/work_items_controller.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Groups
+  class WorkItemsController < Groups::ApplicationController
+    feature_category :team_planning
+
+    def index
+      not_found unless Feature.enabled?(:namespace_level_work_items, group)
+    end
+  end
+end
diff --git a/app/views/groups/work_items/index.html.haml b/app/views/groups/work_items/index.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..9aa90b913a21590a47e8a56cb70d952307ea9dce
--- /dev/null
+++ b/app/views/groups/work_items/index.html.haml
@@ -0,0 +1 @@
+- page_title s_('WorkItem|Work items')
diff --git a/config/feature_flags/development/namespace_level_work_items.yml b/config/feature_flags/development/namespace_level_work_items.yml
new file mode 100644
index 0000000000000000000000000000000000000000..794e56cf425eafdfe653bf0828b31d7dbe92f298
--- /dev/null
+++ b/config/feature_flags/development/namespace_level_work_items.yml
@@ -0,0 +1,8 @@
+---
+name: namespace_level_work_items
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127124
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/419186
+milestone: '16.3'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/routes/group.rb b/config/routes/group.rb
index 9b346867f78ce3715f861bea45d886f55f8c1d2c..16371fca89e3fd1762455d6c6006bf76aa1168f9 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -160,6 +160,8 @@
     end
 
     resources :achievements, only: [:index, :new, :edit]
+
+    resources :work_items, only: [:index]
   end
 
   scope(
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 7960d24b762e392f307f3976ba324fb97b5eb230..23df88425ca016911012a16c9952d896f0b53e2b 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -52541,6 +52541,9 @@ msgstr ""
 msgid "WorkItem|Work item not found"
 msgstr ""
 
+msgid "WorkItem|Work items"
+msgstr ""
+
 msgid "WorkItem|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
 msgstr ""
 
diff --git a/spec/requests/groups/work_items_controller_spec.rb b/spec/requests/groups/work_items_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c47b3f03ec1184e10b742b8cb370470f89136e5f
--- /dev/null
+++ b/spec/requests/groups/work_items_controller_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Group Level Work Items', feature_category: :team_planning do
+  let_it_be(:group) { create(:group, :private) }
+  let_it_be(:project) { create(:project, group: group) }
+  let_it_be(:developer) { create(:user).tap { |u| group.add_developer(u) } }
+
+  describe 'GET /groups/:group/-/work_items' do
+    let(:work_items_path) { url_for(controller: 'groups/work_items', action: :index, group_id: group.full_path) }
+
+    before do
+      sign_in(current_user)
+    end
+
+    context 'when the user can read the group' do
+      let(:current_user) { developer }
+
+      it 'renders index' do
+        get work_items_path
+
+        expect(response).to have_gitlab_http_status(:ok)
+      end
+
+      context 'when the namespace_level_work_items feature flag is disabled' do
+        before do
+          stub_feature_flags(namespace_level_work_items: false)
+        end
+
+        it 'returns not found' do
+          get work_items_path
+
+          expect(response).to have_gitlab_http_status(:not_found)
+        end
+      end
+    end
+
+    context 'when the user cannot read the group' do
+      let(:current_user) { create(:user) }
+
+      it 'returns not found' do
+        get work_items_path
+
+        expect(response).to have_gitlab_http_status(:not_found)
+      end
+    end
+  end
+end