diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb
index 293fcd1e6767602eac8682a815fe40874ea59d50..975d3c8ea1417eae4e1608b67a0d316f6ace0856 100644
--- a/qa/qa/page/project/web_ide/edit.rb
+++ b/qa/qa/page/project/web_ide/edit.rb
@@ -109,6 +109,14 @@ class Edit < Page::Base
             element :file_to_commit_content
           end
 
+          # Used for stablility, due to feature_caching of vscode_web_ide
+          def wait_until_ide_loads
+            Support::Waiter.wait_until(sleep_interval: 2, max_duration: 60, reload_page: page,
+                                       retry_on_exception: true) do
+              has_element?(:commit_mode_tab)
+            end
+          end
+
           def has_file?(file_name)
             within_element(:file_list_container) do
               has_element?(:file_name_content, file_name: file_name)
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
index 8ea65e17e130978d746eb6cab26b6d62fbf44df9..93f804f1e39cd9356a21141862d7b27355f0c461 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Web IDE file templates' do
       include Runtime::Fixtures
 
@@ -11,6 +11,11 @@ module QA
           project.description = 'Add file templates via the Web IDE'
           project.initialize_with_readme = true
         end
+        Runtime::Feature.disable(:vscode_web_ide, project: @project)
+      end
+
+      after(:all) do
+        Runtime::Feature.enable(:vscode_web_ide, project: @project)
       end
 
       templates = [
@@ -54,6 +59,7 @@ module QA
 
           Page::Project::Show.perform(&:open_web_ide!)
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             ide.create_new_file_from_template template[:file_name], template[:name]
 
             expect(ide.has_file?(template[:file_name])).to be_truthy
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
index 1da9ed652fee35be0141a8acf5b67514127be19b..a001dee891ad87e3b472fe16461ddaa7fb100562 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Add a directory in Web IDE' do
       let(:project) do
         Resource::Project.fabricate_via_api! do |project|
@@ -11,11 +11,15 @@ module QA
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
-
         project.visit!
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       context 'when a directory with the same name already exists' do
         let(:directory_name) { 'first_directory' }
 
@@ -38,6 +42,11 @@ module QA
 
         it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347733' do
           Page::Project::WebIDE::Edit.perform do |ide|
+            # Support::Waiter.wait_until(sleep_interval: 2, max_duration: 60, reload_page: page,
+            # retry_on_exception: true) do
+            #   expect(ide).to have_element(:commit_mode_tab)
+            # end
+            ide.wait_until_ide_loads
             ide.add_directory(directory_name)
           end
 
@@ -54,6 +63,7 @@ module QA
 
         it 'shows in the tree view but cannot be committed', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347732' do
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             ide.add_directory(directory_name)
 
             expect(ide).to have_file(directory_name)
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
index 1dfda1608f4b9a9c3a7c3f64557bbb16c58ed328..cb0da601a88640aa2fa0d3676ac48d5b9a5dcf53 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'First file using Web IDE' do
       let(:project) do
         Resource::Project.fabricate_via_api! do |project|
@@ -13,14 +13,20 @@ module QA
       let(:file_name) { 'the very first file.txt' }
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       it "creates the first file in an empty project via Web IDE", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347803' do
         project.visit!
         Page::Project::Show.perform(&:create_first_new_file!)
 
         Page::Project::WebIDE::Edit.perform do |ide|
+          ide.wait_until_ide_loads
           ide.create_first_file(file_name)
           ide.commit_changes
         end
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
index 56cf2a08bd9c8aa5695ea835ffd8b4b28e26154d..2007fe4a667f68cc540df46cdff1d21d091fdbf6 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Link to line in Web IDE' do
       let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
       let(:project) do
@@ -11,10 +11,12 @@ module QA
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
       end
 
       after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
         project.remove_via_api!
       end
 
@@ -25,6 +27,7 @@ module QA
         Page::Project::Show.perform(&:open_web_ide_via_shortcut)
 
         Page::Project::WebIDE::Edit.perform do |ide|
+          ide.wait_until_ide_loads
           ide.select_file('app.js')
           @link = ide.link_line('26')
         end
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
index 820b47a31759abd9340eac38f96652f7828d4a59..dc9f68c5c734282a4ca656b2110b4da9bcb7ca6e 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Open a fork in Web IDE',
       skip: {
         issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/351696",
@@ -14,6 +14,14 @@ module QA
         end
       end
 
+      before do
+        Runtime::Feature.disable(:vscode_web_ide, project: parent_project)
+      end
+
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: parent_project)
+      end
+
       context 'when a user does not have permissions to commit to the project' do
         let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
 
@@ -57,6 +65,7 @@ module QA
 
         def submit_merge_request_upstream
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             expect(ide).to have_project_path("#{user.username}/#{parent_project.name}")
 
             ide.add_file('new file', 'some random text')
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
index 685cd2d4ad6336cd61ef347e2c3e9263bc6a9064..039d25477bf92316c4d0123f312aa47e3ca9ac00 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Open Web IDE from Diff Tab' do
       files = [
         {
@@ -44,11 +44,15 @@ module QA
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
-
         merge_request.visit!
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       it 'opens and edits a multi-file merge request in Web IDE from Diff Tab', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347724' do
         Page::MergeRequest::Show.perform do |show|
           show.click_diffs_tab
@@ -56,6 +60,7 @@ module QA
         end
 
         Page::Project::WebIDE::Edit.perform do |ide|
+          ide.wait_until_ide_loads
           files.each do |files|
             expect(ide).to have_file(files[:file_path])
             expect(ide).to have_file_content(files[:file_path], files[:content])
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
index 69557fb359a048a03bcd24428f62cddd1efc5467..fe0060e9bbc3590798f1b4cd37cfd1832591f60d 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb
@@ -1,31 +1,44 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Review a merge request in Web IDE' do
       let(:new_file) { 'awesome_new_file.txt' }
       let(:original_text) { 'Text' }
       let(:review_text) { 'Reviewed ' }
 
+      let(:project) do
+        Resource::Project.fabricate_via_api! do |project|
+          project.name = 'review-merge-request-spec-project'
+          project.initialize_with_readme = true
+        end
+      end
+
       let(:merge_request) do
         Resource::MergeRequest.fabricate_via_api! do |mr|
           mr.file_name = new_file
           mr.file_content = original_text
+          mr.project = project
         end
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
-
         merge_request.visit!
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       it 'opens and edits a merge request in Web IDE', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347786' do
         Page::MergeRequest::Show.perform do |show|
           show.click_open_in_web_ide
         end
 
         Page::Project::WebIDE::Edit.perform do |ide|
+          ide.wait_until_ide_loads
           ide.has_file?(new_file)
           ide.add_to_modified_content(review_text)
           ide.commit_changes
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
index 0972e4f3e3d85b935c641903cbf5934ebb7dc2eb..3cd14ecd7991c35a512fa9a78b322e7d954ee865 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/server_hooks_custom_error_message_spec.rb
@@ -1,7 +1,9 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' }, product_group: :editor do
+  RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' },
+                                           feature_flag: { name: 'vscode_web_ide', scope: :project },
+                                           product_group: :editor do
     describe 'Git Server Hooks' do
       let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', 'README.md')) }
 
@@ -14,15 +16,21 @@ module QA
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
         project.visit!
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       context 'Custom error messages' do
         it 'renders preconfigured error message when user hook failed on commit in WebIDE',
            testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/364751' do
           Page::Project::Show.perform(&:open_web_ide_via_shortcut)
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             ide.upload_file(file_path)
             ide.commit_changes(wait_for_success: false)
             expect(ide).to have_text('Custom error message rejecting prereceive hook for projects with GL_PROJECT_PATH')
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
index c0f65416a1cee28aded23a0cf2f40d1c29178bf6..c6e283f67e0751c3907f0c0b220616babd0aba68 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Create', product_group: :editor do
+  RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
     describe 'Upload a file in Web IDE' do
       let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', file_name)) }
 
@@ -13,17 +13,23 @@ module QA
       end
 
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         Flow::Login.sign_in
 
         project.visit!
         Page::Project::Show.perform(&:open_web_ide!)
       end
 
+      after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
+      end
+
       context 'when a file with the same name already exists' do
         let(:file_name) { 'README.md' }
 
         it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347850' do
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             ide.upload_file(file_path)
           end
 
@@ -36,6 +42,7 @@ module QA
 
         it 'shows the Edit tab with the text', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347852' do
           Page::Project::WebIDE::Edit.perform do |ide|
+            ide.wait_until_ide_loads
             ide.upload_file(file_path)
 
             expect(ide).to have_file(file_name)
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
index f90676ee15a9be9830b24e83889097fb7c2e9799..695b295bd867546d632b7409e484174ba3636b52 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
@@ -10,10 +10,12 @@ module QA
       issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179',
       type: :bug
     },
+    feature_flag: { name: 'vscode_web_ide', scope: :project },
     product_group: :editor
   ) do
     describe 'Web IDE web terminal' do
       before do
+        Runtime::Feature.disable(:vscode_web_ide, project: project)
         project = Resource::Project.fabricate_via_api! do |project|
           project.name = 'web-terminal-project'
         end
@@ -56,6 +58,7 @@ module QA
       end
 
       after do
+        Runtime::Feature.enable(:vscode_web_ide, project: project)
         @runner.remove_via_api! if @runner
       end
 
@@ -76,6 +79,7 @@ module QA
         # There are also FE specs
         # * spec/frontend/ide/components/terminal/terminal_controls_spec.js
         Page::Project::WebIDE::Edit.perform do |edit|
+          edit.wait_until_ide_loads
           edit.start_web_terminal
 
           expect(edit).to have_no_alert