Move issues to panels/issues

[email protected]
[email protected]

Bug: 1187573, 1191987
Change-Id: I31f7ec5f0be8c8914868edbfc86a17b9d5541dec
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2831449
Commit-Queue: Tim van der Lippe <[email protected]>
Reviewed-by: Paul Lewis <[email protected]>
diff --git a/BUILD.gn b/BUILD.gn
index 0e7267e..d2d941c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -129,7 +129,7 @@
   "ui/legacy/components/perf_ui/perf_ui_module.js",
   "panels/performance_monitor/performance_monitor_module.js",
   "panels/profiler/profiler_module.js",
-  "issues/issues_module.js",
+  "panels/issues/issues_module.js",
   "panels/developer_resources/developer_resources_module.js",
   "panels/protocol_monitor/protocol_monitor_module.js",
   "ui/legacy/components/quick_open/quick_open_module.js",
diff --git a/config/gni/all_devtools_files.gni b/config/gni/all_devtools_files.gni
index e02d324..1a742d1 100644
--- a/config/gni/all_devtools_files.gni
+++ b/config/gni/all_devtools_files.gni
@@ -200,7 +200,7 @@
   "front_end/panels/profiler/profileLauncherView.css",
   "front_end/panels/profiler/profilesPanel.css",
   "front_end/panels/profiler/profilesSidebarTree.css",
-  "front_end/issues/module.json",
+  "front_end/panels/issues/module.json",
   "front_end/models/issues_manager/descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md",
   "front_end/models/issues_manager/descriptions/CoepCorpNotSameSite.md",
   "front_end/models/issues_manager/descriptions/CoepCorpNotSameOrigin.md",
@@ -233,10 +233,10 @@
   "front_end/models/issues_manager/descriptions/TwaDigitalAssetLinksFailed.md",
   "front_end/models/issues_manager/descriptions/TwaHttpError.md",
   "front_end/models/issues_manager/descriptions/TwaPageUnavailableOffline.md",
-  "front_end/issues/issuesPane.css",
-  "front_end/issues/issuesTree.css",
-  "front_end/issues/cspViolationsView.css",
-  "front_end/issues/cspViolationsListView.css",
+  "front_end/panels/issues/issuesPane.css",
+  "front_end/panels/issues/issuesTree.css",
+  "front_end/panels/issues/cspViolationsView.css",
+  "front_end/panels/issues/cspViolationsListView.css",
   "front_end/panels/developer_resources/module.json",
   "front_end/panels/developer_resources/developerResourcesView.css",
   "front_end/panels/developer_resources/developerResourcesListView.css",
diff --git a/config/gni/all_devtools_modules.gni b/config/gni/all_devtools_modules.gni
index 382d827..0459612 100644
--- a/config/gni/all_devtools_modules.gni
+++ b/config/gni/all_devtools_modules.gni
@@ -147,22 +147,6 @@
   "generated/SupportedCSSProperties.js",
   "inspector_main/InspectorMain.js",
   "inspector_main/RenderingOptions.js",
-  "issues/AffectedBlockedByResponseView.js",
-  "issues/AffectedCookiesView.js",
-  "issues/AffectedElementsView.js",
-  "issues/AffectedElementsWithLowContrastView.js",
-  "issues/AffectedHeavyAdView.js",
-  "issues/AffectedResourcesView.js",
-  "issues/AffectedSharedArrayBufferIssueDetailsView.js",
-  "issues/AffectedTrustedWebActivityIssueDetailsView.js",
-  "issues/CSPViolationsListView.js",
-  "issues/CSPViolationsView.js",
-  "issues/ComboBoxOfCheckBoxes.js",
-  "issues/CorsIssueDetailsView.js",
-  "issues/IssueAggregator.js",
-  "issues/IssueRevealer.js",
-  "issues/IssueView.js",
-  "issues/IssuesPane.js",
   "legacy_test_runner/test_runner/TestRunner.js",
   "main/ExecutionContextSelector.js",
   "main/MainImpl.js",
@@ -387,6 +371,22 @@
   "panels/help/ReleaseNoteView.js",
   "panels/input/InputModel.js",
   "panels/input/InputTimeline.js",
+  "panels/issues/AffectedBlockedByResponseView.js",
+  "panels/issues/AffectedCookiesView.js",
+  "panels/issues/AffectedElementsView.js",
+  "panels/issues/AffectedElementsWithLowContrastView.js",
+  "panels/issues/AffectedHeavyAdView.js",
+  "panels/issues/AffectedResourcesView.js",
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.js",
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.js",
+  "panels/issues/CSPViolationsListView.js",
+  "panels/issues/CSPViolationsView.js",
+  "panels/issues/ComboBoxOfCheckBoxes.js",
+  "panels/issues/CorsIssueDetailsView.js",
+  "panels/issues/IssueAggregator.js",
+  "panels/issues/IssueRevealer.js",
+  "panels/issues/IssueView.js",
+  "panels/issues/IssuesPane.js",
   "panels/layer_viewer/LayerDetailsView.js",
   "panels/layer_viewer/LayerTreeOutline.js",
   "panels/layer_viewer/LayerViewHost.js",
diff --git a/config/gni/devtools_grd_files.gni b/config/gni/devtools_grd_files.gni
index ec07a81..104e489 100644
--- a/config/gni/devtools_grd_files.gni
+++ b/config/gni/devtools_grd_files.gni
@@ -202,9 +202,6 @@
   "front_end/inspector_main/inspector_main-meta.js",
   "front_end/inspector_main/inspector_main.js",
   "front_end/integration_test_runner.html",
-  "front_end/issues/issues-meta.js",
-  "front_end/issues/issues.js",
-  "front_end/issues/issues_module.js",
   "front_end/js_app.html",
   "front_end/js_profiler/js_profiler-meta.js",
   "front_end/js_profiler/js_profiler.js",
@@ -331,6 +328,9 @@
   "front_end/panels/input/input-meta.js",
   "front_end/panels/input/input.js",
   "front_end/panels/input/input_module.js",
+  "front_end/panels/issues/issues-meta.js",
+  "front_end/panels/issues/issues.js",
+  "front_end/panels/issues/issues_module.js",
   "front_end/panels/layer_viewer/layer_viewer-legacy.js",
   "front_end/panels/layer_viewer/layer_viewer-meta.js",
   "front_end/panels/layer_viewer/layer_viewer.js",
@@ -602,22 +602,6 @@
   "front_end/generated/SupportedCSSProperties.js",
   "front_end/inspector_main/InspectorMain.js",
   "front_end/inspector_main/RenderingOptions.js",
-  "front_end/issues/AffectedBlockedByResponseView.js",
-  "front_end/issues/AffectedCookiesView.js",
-  "front_end/issues/AffectedElementsView.js",
-  "front_end/issues/AffectedElementsWithLowContrastView.js",
-  "front_end/issues/AffectedHeavyAdView.js",
-  "front_end/issues/AffectedResourcesView.js",
-  "front_end/issues/AffectedSharedArrayBufferIssueDetailsView.js",
-  "front_end/issues/AffectedTrustedWebActivityIssueDetailsView.js",
-  "front_end/issues/CSPViolationsListView.js",
-  "front_end/issues/CSPViolationsView.js",
-  "front_end/issues/ComboBoxOfCheckBoxes.js",
-  "front_end/issues/CorsIssueDetailsView.js",
-  "front_end/issues/IssueAggregator.js",
-  "front_end/issues/IssueRevealer.js",
-  "front_end/issues/IssueView.js",
-  "front_end/issues/IssuesPane.js",
   "front_end/legacy_test_runner/test_runner/TestRunner.js",
   "front_end/main/ExecutionContextSelector.js",
   "front_end/main/MainImpl.js",
@@ -842,6 +826,22 @@
   "front_end/panels/help/ReleaseNoteView.js",
   "front_end/panels/input/InputModel.js",
   "front_end/panels/input/InputTimeline.js",
+  "front_end/panels/issues/AffectedBlockedByResponseView.js",
+  "front_end/panels/issues/AffectedCookiesView.js",
+  "front_end/panels/issues/AffectedElementsView.js",
+  "front_end/panels/issues/AffectedElementsWithLowContrastView.js",
+  "front_end/panels/issues/AffectedHeavyAdView.js",
+  "front_end/panels/issues/AffectedResourcesView.js",
+  "front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.js",
+  "front_end/panels/issues/AffectedTrustedWebActivityIssueDetailsView.js",
+  "front_end/panels/issues/CSPViolationsListView.js",
+  "front_end/panels/issues/CSPViolationsView.js",
+  "front_end/panels/issues/ComboBoxOfCheckBoxes.js",
+  "front_end/panels/issues/CorsIssueDetailsView.js",
+  "front_end/panels/issues/IssueAggregator.js",
+  "front_end/panels/issues/IssueRevealer.js",
+  "front_end/panels/issues/IssueView.js",
+  "front_end/panels/issues/IssuesPane.js",
   "front_end/panels/layer_viewer/LayerDetailsView.js",
   "front_end/panels/layer_viewer/LayerTreeOutline.js",
   "front_end/panels/layer_viewer/LayerViewHost.js",
diff --git a/config/gni/devtools_module_entrypoints.gni b/config/gni/devtools_module_entrypoints.gni
index 9e5aeae..fd24595 100644
--- a/config/gni/devtools_module_entrypoints.gni
+++ b/config/gni/devtools_module_entrypoints.gni
@@ -40,8 +40,6 @@
   "formatter/formatter.js",
   "inspector_main/inspector_main-meta.js",
   "inspector_main/inspector_main.js",
-  "issues/issues-meta.js",
-  "issues/issues.js",
   "js_profiler/js_profiler-meta.js",
   "js_profiler/js_profiler.js",
   "legacy_test_runner/legacy_test_runner.js",
@@ -118,6 +116,8 @@
   "panels/help/help.js",
   "panels/input/input-meta.js",
   "panels/input/input.js",
+  "panels/issues/issues-meta.js",
+  "panels/issues/issues.js",
   "panels/layer_viewer/layer_viewer-legacy.js",
   "panels/layer_viewer/layer_viewer-meta.js",
   "panels/layer_viewer/layer_viewer.js",
diff --git a/front_end/core/i18n/locales/en-US.json b/front_end/core/i18n/locales/en-US.json
index fc97483..3ee0bbf 100644
--- a/front_end/core/i18n/locales/en-US.json
+++ b/front_end/core/i18n/locales/en-US.json
@@ -1043,279 +1043,6 @@
   "inspector_main/RenderingOptions.ts | showsLayerBordersOrangeoliveAnd": {
     "message": "Shows layer borders (orange/olive) and tiles (cyan)."
   },
-  "issues/AffectedBlockedByResponseView.ts | blockedResource": {
-    "message": "Blocked Resource"
-  },
-  "issues/AffectedBlockedByResponseView.ts | nRequests": {
-    "message": "{n, plural, =1 { request} other { requests}}"
-  },
-  "issues/AffectedBlockedByResponseView.ts | parentFrame": {
-    "message": "Parent Frame"
-  },
-  "issues/AffectedBlockedByResponseView.ts | requestC": {
-    "message": "Request"
-  },
-  "issues/AffectedCookiesView.ts | domain": {
-    "message": "Domain"
-  },
-  "issues/AffectedCookiesView.ts | name": {
-    "message": "Name"
-  },
-  "issues/AffectedCookiesView.ts | nCookies": {
-    "message": "{n, plural, =1 { cookie} other { cookies}}"
-  },
-  "issues/AffectedCookiesView.ts | path": {
-    "message": "Path"
-  },
-  "issues/AffectedElementsView.ts | nElements": {
-    "message": "{n, plural, =1 { element} other { elements}}"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | contrastRatio": {
-    "message": "Contrast ratio"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | element": {
-    "message": "Element"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | minimumAA": {
-    "message": "Minimum AA ratio"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | minimumAAA": {
-    "message": "Minimum AAA ratio"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | textSize": {
-    "message": "Text size"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | textWeight": {
-    "message": "Text weight"
-  },
-  "issues/AffectedHeavyAdView.ts | cpuPeakLimit": {
-    "message": "CPU peak limit"
-  },
-  "issues/AffectedHeavyAdView.ts | cpuTotalLimit": {
-    "message": "CPU total limit"
-  },
-  "issues/AffectedHeavyAdView.ts | frameUrl": {
-    "message": "Frame URL"
-  },
-  "issues/AffectedHeavyAdView.ts | limitExceeded": {
-    "message": "Limit exceeded"
-  },
-  "issues/AffectedHeavyAdView.ts | networkLimit": {
-    "message": "Network limit"
-  },
-  "issues/AffectedHeavyAdView.ts | nResources": {
-    "message": "{n, plural, =1 { resource} other { resources}}"
-  },
-  "issues/AffectedHeavyAdView.ts | removed": {
-    "message": "Removed"
-  },
-  "issues/AffectedHeavyAdView.ts | resolutionStatus": {
-    "message": "Resolution Status"
-  },
-  "issues/AffectedHeavyAdView.ts | warned": {
-    "message": "Warned"
-  },
-  "issues/AffectedResourcesView.ts | clickToRevealTheFramesDomNodeIn": {
-    "message": "Click to reveal the frame's DOM node in the Elements panel"
-  },
-  "issues/AffectedResourcesView.ts | clickToShowRequestInTheNetwork": {
-    "message": "Click to show request in the network panel"
-  },
-  "issues/AffectedResourcesView.ts | requestUnavailableInTheNetwork": {
-    "message": "Request unavailable in the network panel, try reloading the inspected page"
-  },
-  "issues/AffectedResourcesView.ts | unknown": {
-    "message": "unknown"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | aSharedarraybufferWas": {
-    "message": "A SharedArrayBuffer was instantiated in a context that is not cross-origin isolated"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | blocked": {
-    "message": "blocked"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | instantiation": {
-    "message": "Instantiation"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | nViolations": {
-    "message": "{n, plural, =1 { violation} other { violations}}"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | sharedarraybufferWasTransferedTo": {
-    "message": "SharedArrayBuffer was transfered to a context that is not cross-origin isolated"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | sourceLocation": {
-    "message": "Source Location"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | status": {
-    "message": "Status"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | transfer": {
-    "message": "Transfer"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | trigger": {
-    "message": "Trigger"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | warning": {
-    "message": "warning"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | nResources": {
-    "message": "{n, plural, =1 { resource} other { resources}}"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageName": {
-    "message": "Package name"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageSignature": {
-    "message": "Package signature"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | statusCode": {
-    "message": "Status code"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | url": {
-    "message": "Url"
-  },
-  "issues/CorsIssueDetailsView.ts | blocked": {
-    "message": "blocked"
-  },
-  "issues/CorsIssueDetailsView.ts | initiatorAddressSpace": {
-    "message": "Initiator Address"
-  },
-  "issues/CorsIssueDetailsView.ts | initiatorContext": {
-    "message": "Initiator Context"
-  },
-  "issues/CorsIssueDetailsView.ts | insecure": {
-    "message": "insecure"
-  },
-  "issues/CorsIssueDetailsView.ts | nItems": {
-    "message": "{n, plural, =1 { item} other { items}}"
-  },
-  "issues/CorsIssueDetailsView.ts | request": {
-    "message": "Request"
-  },
-  "issues/CorsIssueDetailsView.ts | resourceAddressSpace": {
-    "message": "Resource Address"
-  },
-  "issues/CorsIssueDetailsView.ts | secure": {
-    "message": "secure"
-  },
-  "issues/CorsIssueDetailsView.ts | status": {
-    "message": "Status"
-  },
-  "issues/CorsIssueDetailsView.ts | warning": {
-    "message": "warning"
-  },
-  "issues/CSPViolationsView.ts | filter": {
-    "message": "Filter"
-  },
-  "issues/issues-meta.ts | cspViolations": {
-    "message": "CSP Violations"
-  },
-  "issues/issues-meta.ts | issues": {
-    "message": "Issues"
-  },
-  "issues/issues-meta.ts | showCspViolations": {
-    "message": "Show CSP Violations"
-  },
-  "issues/issues-meta.ts | showIssues": {
-    "message": "Show Issues"
-  },
-  "issues/IssuesPane.ts | contentSecurityPolicy": {
-    "message": "Content Security Policy"
-  },
-  "issues/IssuesPane.ts | cors": {
-    "message": "Cross Origin Resource Sharing"
-  },
-  "issues/IssuesPane.ts | crossOriginEmbedderPolicy": {
-    "message": "Cross Origin Embedder Policy"
-  },
-  "issues/IssuesPane.ts | groupByCategory": {
-    "message": "Group by category"
-  },
-  "issues/IssuesPane.ts | groupDisplayedIssuesUnder": {
-    "message": "Group displayed issues under associated categories"
-  },
-  "issues/IssuesPane.ts | heavyAds": {
-    "message": "Heavy Ads"
-  },
-  "issues/IssuesPane.ts | includeCookieIssuesCausedBy": {
-    "message": "Include cookie Issues caused by third-party sites"
-  },
-  "issues/IssuesPane.ts | includeThirdpartyCookieIssues": {
-    "message": "Include third-party cookie issues"
-  },
-  "issues/IssuesPane.ts | lowTextContrast": {
-    "message": "Low Text Contrast"
-  },
-  "issues/IssuesPane.ts | mixedContent": {
-    "message": "Mixed Content"
-  },
-  "issues/IssuesPane.ts | noIssuesDetectedSoFar": {
-    "message": "No issues detected so far"
-  },
-  "issues/IssuesPane.ts | onlyThirdpartyCookieIssues": {
-    "message": "Only third-party cookie issues detected so far"
-  },
-  "issues/IssuesPane.ts | other": {
-    "message": "Other"
-  },
-  "issues/IssuesPane.ts | samesiteCookie": {
-    "message": "SameSite Cookie"
-  },
-  "issues/IssuesPane.ts | trustedWebActivity": {
-    "message": "Trusted Web Activity"
-  },
-  "issues/IssueView.ts | affectedResources": {
-    "message": "Affected Resources"
-  },
-  "issues/IssueView.ts | automaticallyUpgraded": {
-    "message": "automatically upgraded"
-  },
-  "issues/IssueView.ts | blocked": {
-    "message": "blocked"
-  },
-  "issues/IssueView.ts | clickToRevealTheViolatingDomNode": {
-    "message": "Click to reveal the violating DOM node in the Elements panel"
-  },
-  "issues/IssueView.ts | directiveC": {
-    "message": "Directive"
-  },
-  "issues/IssueView.ts | element": {
-    "message": "Element"
-  },
-  "issues/IssueView.ts | learnMoreS": {
-    "message": "Learn more: {PH1}"
-  },
-  "issues/IssueView.ts | name": {
-    "message": "Name"
-  },
-  "issues/IssueView.ts | nDirectives": {
-    "message": "{n, plural, =1 { directive} other { directives}}"
-  },
-  "issues/IssueView.ts | nRequests": {
-    "message": "{n, plural, =1 { request} other { requests}}"
-  },
-  "issues/IssueView.ts | nResources": {
-    "message": "{n, plural, =1 { resource} other { resources}}"
-  },
-  "issues/IssueView.ts | nSources": {
-    "message": "{n, plural, =1 { source} other { sources}}"
-  },
-  "issues/IssueView.ts | reportonly": {
-    "message": "report-only"
-  },
-  "issues/IssueView.ts | resourceC": {
-    "message": "Resource"
-  },
-  "issues/IssueView.ts | restrictionStatus": {
-    "message": "Restriction Status"
-  },
-  "issues/IssueView.ts | sourceLocation": {
-    "message": "Source Location"
-  },
-  "issues/IssueView.ts | status": {
-    "message": "Status"
-  },
-  "issues/IssueView.ts | warned": {
-    "message": "Warned"
-  },
   "js_profiler/js_profiler-meta.ts | profiler": {
     "message": "Profiler"
   },
@@ -5150,6 +4877,279 @@
   "panels/input/InputTimeline.ts | saveProfile": {
     "message": "Save profile…"
   },
+  "panels/issues/AffectedBlockedByResponseView.ts | blockedResource": {
+    "message": "Blocked Resource"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | nRequests": {
+    "message": "{n, plural, =1 { request} other { requests}}"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | parentFrame": {
+    "message": "Parent Frame"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | requestC": {
+    "message": "Request"
+  },
+  "panels/issues/AffectedCookiesView.ts | domain": {
+    "message": "Domain"
+  },
+  "panels/issues/AffectedCookiesView.ts | name": {
+    "message": "Name"
+  },
+  "panels/issues/AffectedCookiesView.ts | nCookies": {
+    "message": "{n, plural, =1 { cookie} other { cookies}}"
+  },
+  "panels/issues/AffectedCookiesView.ts | path": {
+    "message": "Path"
+  },
+  "panels/issues/AffectedElementsView.ts | nElements": {
+    "message": "{n, plural, =1 { element} other { elements}}"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | contrastRatio": {
+    "message": "Contrast ratio"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | element": {
+    "message": "Element"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | minimumAA": {
+    "message": "Minimum AA ratio"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | minimumAAA": {
+    "message": "Minimum AAA ratio"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | textSize": {
+    "message": "Text size"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | textWeight": {
+    "message": "Text weight"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | cpuPeakLimit": {
+    "message": "CPU peak limit"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | cpuTotalLimit": {
+    "message": "CPU total limit"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | frameUrl": {
+    "message": "Frame URL"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | limitExceeded": {
+    "message": "Limit exceeded"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | networkLimit": {
+    "message": "Network limit"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | nResources": {
+    "message": "{n, plural, =1 { resource} other { resources}}"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | removed": {
+    "message": "Removed"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | resolutionStatus": {
+    "message": "Resolution Status"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | warned": {
+    "message": "Warned"
+  },
+  "panels/issues/AffectedResourcesView.ts | clickToRevealTheFramesDomNodeIn": {
+    "message": "Click to reveal the frame's DOM node in the Elements panel"
+  },
+  "panels/issues/AffectedResourcesView.ts | clickToShowRequestInTheNetwork": {
+    "message": "Click to show request in the network panel"
+  },
+  "panels/issues/AffectedResourcesView.ts | requestUnavailableInTheNetwork": {
+    "message": "Request unavailable in the network panel, try reloading the inspected page"
+  },
+  "panels/issues/AffectedResourcesView.ts | unknown": {
+    "message": "unknown"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | aSharedarraybufferWas": {
+    "message": "A SharedArrayBuffer was instantiated in a context that is not cross-origin isolated"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | blocked": {
+    "message": "blocked"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | instantiation": {
+    "message": "Instantiation"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | nViolations": {
+    "message": "{n, plural, =1 { violation} other { violations}}"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | sharedarraybufferWasTransferedTo": {
+    "message": "SharedArrayBuffer was transfered to a context that is not cross-origin isolated"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | sourceLocation": {
+    "message": "Source Location"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | status": {
+    "message": "Status"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | transfer": {
+    "message": "Transfer"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | trigger": {
+    "message": "Trigger"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | warning": {
+    "message": "warning"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | nResources": {
+    "message": "{n, plural, =1 { resource} other { resources}}"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageName": {
+    "message": "Package name"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageSignature": {
+    "message": "Package signature"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | statusCode": {
+    "message": "Status code"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | url": {
+    "message": "Url"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | blocked": {
+    "message": "blocked"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | initiatorAddressSpace": {
+    "message": "Initiator Address"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | initiatorContext": {
+    "message": "Initiator Context"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | insecure": {
+    "message": "insecure"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | nItems": {
+    "message": "{n, plural, =1 { item} other { items}}"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | request": {
+    "message": "Request"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | resourceAddressSpace": {
+    "message": "Resource Address"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | secure": {
+    "message": "secure"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | status": {
+    "message": "Status"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | warning": {
+    "message": "warning"
+  },
+  "panels/issues/CSPViolationsView.ts | filter": {
+    "message": "Filter"
+  },
+  "panels/issues/issues-meta.ts | cspViolations": {
+    "message": "CSP Violations"
+  },
+  "panels/issues/issues-meta.ts | issues": {
+    "message": "Issues"
+  },
+  "panels/issues/issues-meta.ts | showCspViolations": {
+    "message": "Show CSP Violations"
+  },
+  "panels/issues/issues-meta.ts | showIssues": {
+    "message": "Show Issues"
+  },
+  "panels/issues/IssuesPane.ts | contentSecurityPolicy": {
+    "message": "Content Security Policy"
+  },
+  "panels/issues/IssuesPane.ts | cors": {
+    "message": "Cross Origin Resource Sharing"
+  },
+  "panels/issues/IssuesPane.ts | crossOriginEmbedderPolicy": {
+    "message": "Cross Origin Embedder Policy"
+  },
+  "panels/issues/IssuesPane.ts | groupByCategory": {
+    "message": "Group by category"
+  },
+  "panels/issues/IssuesPane.ts | groupDisplayedIssuesUnder": {
+    "message": "Group displayed issues under associated categories"
+  },
+  "panels/issues/IssuesPane.ts | heavyAds": {
+    "message": "Heavy Ads"
+  },
+  "panels/issues/IssuesPane.ts | includeCookieIssuesCausedBy": {
+    "message": "Include cookie Issues caused by third-party sites"
+  },
+  "panels/issues/IssuesPane.ts | includeThirdpartyCookieIssues": {
+    "message": "Include third-party cookie issues"
+  },
+  "panels/issues/IssuesPane.ts | lowTextContrast": {
+    "message": "Low Text Contrast"
+  },
+  "panels/issues/IssuesPane.ts | mixedContent": {
+    "message": "Mixed Content"
+  },
+  "panels/issues/IssuesPane.ts | noIssuesDetectedSoFar": {
+    "message": "No issues detected so far"
+  },
+  "panels/issues/IssuesPane.ts | onlyThirdpartyCookieIssues": {
+    "message": "Only third-party cookie issues detected so far"
+  },
+  "panels/issues/IssuesPane.ts | other": {
+    "message": "Other"
+  },
+  "panels/issues/IssuesPane.ts | samesiteCookie": {
+    "message": "SameSite Cookie"
+  },
+  "panels/issues/IssuesPane.ts | trustedWebActivity": {
+    "message": "Trusted Web Activity"
+  },
+  "panels/issues/IssueView.ts | affectedResources": {
+    "message": "Affected Resources"
+  },
+  "panels/issues/IssueView.ts | automaticallyUpgraded": {
+    "message": "automatically upgraded"
+  },
+  "panels/issues/IssueView.ts | blocked": {
+    "message": "blocked"
+  },
+  "panels/issues/IssueView.ts | clickToRevealTheViolatingDomNode": {
+    "message": "Click to reveal the violating DOM node in the Elements panel"
+  },
+  "panels/issues/IssueView.ts | directiveC": {
+    "message": "Directive"
+  },
+  "panels/issues/IssueView.ts | element": {
+    "message": "Element"
+  },
+  "panels/issues/IssueView.ts | learnMoreS": {
+    "message": "Learn more: {PH1}"
+  },
+  "panels/issues/IssueView.ts | name": {
+    "message": "Name"
+  },
+  "panels/issues/IssueView.ts | nDirectives": {
+    "message": "{n, plural, =1 { directive} other { directives}}"
+  },
+  "panels/issues/IssueView.ts | nRequests": {
+    "message": "{n, plural, =1 { request} other { requests}}"
+  },
+  "panels/issues/IssueView.ts | nResources": {
+    "message": "{n, plural, =1 { resource} other { resources}}"
+  },
+  "panels/issues/IssueView.ts | nSources": {
+    "message": "{n, plural, =1 { source} other { sources}}"
+  },
+  "panels/issues/IssueView.ts | reportonly": {
+    "message": "report-only"
+  },
+  "panels/issues/IssueView.ts | resourceC": {
+    "message": "Resource"
+  },
+  "panels/issues/IssueView.ts | restrictionStatus": {
+    "message": "Restriction Status"
+  },
+  "panels/issues/IssueView.ts | sourceLocation": {
+    "message": "Source Location"
+  },
+  "panels/issues/IssueView.ts | status": {
+    "message": "Status"
+  },
+  "panels/issues/IssueView.ts | warned": {
+    "message": "Warned"
+  },
   "panels/layer_viewer/layer_viewer-meta.ts | panOrRotateDown": {
     "message": "Pan or rotate down"
   },
diff --git a/front_end/core/i18n/locales/en-XL.json b/front_end/core/i18n/locales/en-XL.json
index 8e64099..9a9c3ab 100644
--- a/front_end/core/i18n/locales/en-XL.json
+++ b/front_end/core/i18n/locales/en-XL.json
@@ -1043,279 +1043,6 @@
   "inspector_main/RenderingOptions.ts | showsLayerBordersOrangeoliveAnd": {
     "message": "Ŝh́ôẃŝ ĺâýêŕ b̂ór̂d́êŕŝ (ór̂án̂ǵê/ól̂ív̂é) âńd̂ t́îĺêś (ĉýâń)."
   },
-  "issues/AffectedBlockedByResponseView.ts | blockedResource": {
-    "message": "B̂ĺôćk̂éd̂ Ŕêśôúr̂ćê"
-  },
-  "issues/AffectedBlockedByResponseView.ts | nRequests": {
-    "message": "{n, plural, =1 { r̂éq̂úêśt̂} other { ŕêq́ûéŝt́ŝ}}"
-  },
-  "issues/AffectedBlockedByResponseView.ts | parentFrame": {
-    "message": "P̂ár̂én̂t́ F̂ŕâḿê"
-  },
-  "issues/AffectedBlockedByResponseView.ts | requestC": {
-    "message": "R̂éq̂úêśt̂"
-  },
-  "issues/AffectedCookiesView.ts | domain": {
-    "message": "D̂óm̂áîń"
-  },
-  "issues/AffectedCookiesView.ts | name": {
-    "message": "N̂ám̂é"
-  },
-  "issues/AffectedCookiesView.ts | nCookies": {
-    "message": "{n, plural, =1 { ĉóôḱîé} other { ĉóôḱîéŝ}}"
-  },
-  "issues/AffectedCookiesView.ts | path": {
-    "message": "P̂át̂h́"
-  },
-  "issues/AffectedElementsView.ts | nElements": {
-    "message": "{n, plural, =1 { êĺêḿêńt̂} other { él̂ém̂én̂t́ŝ}}"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | contrastRatio": {
-    "message": "Ĉón̂t́r̂áŝt́ r̂át̂íô"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | element": {
-    "message": "Êĺêḿêńt̂"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | minimumAA": {
-    "message": "M̂ín̂ím̂úm̂ ÁÂ ŕât́îó"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | minimumAAA": {
-    "message": "M̂ín̂ím̂úm̂ ÁÂÁ r̂át̂íô"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | textSize": {
-    "message": "T̂éx̂t́ ŝíẑé"
-  },
-  "issues/AffectedElementsWithLowContrastView.ts | textWeight": {
-    "message": "T̂éx̂t́ ŵéîǵĥt́"
-  },
-  "issues/AffectedHeavyAdView.ts | cpuPeakLimit": {
-    "message": "ĈṔÛ ṕêák̂ ĺîḿît́"
-  },
-  "issues/AffectedHeavyAdView.ts | cpuTotalLimit": {
-    "message": "ĈṔÛ t́ôt́âĺ l̂ím̂ít̂"
-  },
-  "issues/AffectedHeavyAdView.ts | frameUrl": {
-    "message": "F̂ŕâḿê ÚR̂Ĺ"
-  },
-  "issues/AffectedHeavyAdView.ts | limitExceeded": {
-    "message": "L̂ím̂ít̂ éx̂ćêéd̂éd̂"
-  },
-  "issues/AffectedHeavyAdView.ts | networkLimit": {
-    "message": "N̂ét̂ẃôŕk̂ ĺîḿît́"
-  },
-  "issues/AffectedHeavyAdView.ts | nResources": {
-    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
-  },
-  "issues/AffectedHeavyAdView.ts | removed": {
-    "message": "R̂ém̂óv̂éd̂"
-  },
-  "issues/AffectedHeavyAdView.ts | resolutionStatus": {
-    "message": "R̂éŝól̂út̂íôń Ŝt́ât́ûś"
-  },
-  "issues/AffectedHeavyAdView.ts | warned": {
-    "message": "Ŵár̂ńêd́"
-  },
-  "issues/AffectedResourcesView.ts | clickToRevealTheFramesDomNodeIn": {
-    "message": "Ĉĺîćk̂ t́ô ŕêv́êál̂ t́ĥé f̂ŕâḿê'ś D̂ÓM̂ ńôd́ê ín̂ t́ĥé Êĺêḿêńt̂ś p̂án̂él̂"
-  },
-  "issues/AffectedResourcesView.ts | clickToShowRequestInTheNetwork": {
-    "message": "Ĉĺîćk̂ t́ô śĥóŵ ŕêq́ûéŝt́ îń t̂h́ê ńêt́ŵór̂ḱ p̂án̂él̂"
-  },
-  "issues/AffectedResourcesView.ts | requestUnavailableInTheNetwork": {
-    "message": "R̂éq̂úêśt̂ ún̂áv̂áîĺâb́l̂é îń t̂h́ê ńêt́ŵór̂ḱ p̂án̂él̂, t́r̂ý r̂él̂óâd́îńĝ t́ĥé îńŝṕêćt̂éd̂ ṕâǵê"
-  },
-  "issues/AffectedResourcesView.ts | unknown": {
-    "message": "ûńk̂ńôẃn̂"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | aSharedarraybufferWas": {
-    "message": "Â SharedArrayBuffer ẃâś îńŝt́âńt̂íât́êd́ îń â ćôńt̂éx̂t́ t̂h́ât́ îś n̂ót̂ ćr̂óŝś-ôŕîǵîń îśôĺât́êd́"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | blocked": {
-    "message": "b̂ĺôćk̂éd̂"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | instantiation": {
-    "message": "Îńŝt́âńt̂íât́îón̂"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | nViolations": {
-    "message": "{n, plural, =1 { v̂íôĺât́îón̂} other { v́îól̂át̂íôńŝ}}"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | sharedarraybufferWasTransferedTo": {
-    "message": "SharedArrayBuffer ŵáŝ t́r̂án̂śf̂ér̂éd̂ t́ô á ĉón̂t́êx́t̂ t́ĥát̂ íŝ ńôt́ ĉŕôśŝ-ór̂íĝín̂ íŝól̂át̂éd̂"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | sourceLocation": {
-    "message": "Ŝóûŕĉé L̂óĉát̂íôń"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | status": {
-    "message": "Ŝt́ât́ûś"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | transfer": {
-    "message": "T̂ŕâńŝf́êŕ"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | trigger": {
-    "message": "T̂ŕîǵĝér̂"
-  },
-  "issues/AffectedSharedArrayBufferIssueDetailsView.ts | warning": {
-    "message": "ŵár̂ńîńĝ"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | nResources": {
-    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageName": {
-    "message": "P̂áĉḱâǵê ńâḿê"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageSignature": {
-    "message": "P̂áĉḱâǵê śîǵn̂át̂úr̂é"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | statusCode": {
-    "message": "Ŝt́ât́ûś ĉód̂é"
-  },
-  "issues/AffectedTrustedWebActivityIssueDetailsView.ts | url": {
-    "message": "Ûŕl̂"
-  },
-  "issues/CorsIssueDetailsView.ts | blocked": {
-    "message": "b̂ĺôćk̂éd̂"
-  },
-  "issues/CorsIssueDetailsView.ts | initiatorAddressSpace": {
-    "message": "Îńît́îát̂ór̂ Ád̂d́r̂éŝś"
-  },
-  "issues/CorsIssueDetailsView.ts | initiatorContext": {
-    "message": "Îńît́îát̂ór̂ Ćôńt̂éx̂t́"
-  },
-  "issues/CorsIssueDetailsView.ts | insecure": {
-    "message": "îńŝéĉúr̂é"
-  },
-  "issues/CorsIssueDetailsView.ts | nItems": {
-    "message": "{n, plural, =1 { ît́êḿ} other { ît́êḿŝ}}"
-  },
-  "issues/CorsIssueDetailsView.ts | request": {
-    "message": "R̂éq̂úêśt̂"
-  },
-  "issues/CorsIssueDetailsView.ts | resourceAddressSpace": {
-    "message": "R̂éŝóûŕĉé Âd́d̂ŕêśŝ"
-  },
-  "issues/CorsIssueDetailsView.ts | secure": {
-    "message": "ŝéĉúr̂é"
-  },
-  "issues/CorsIssueDetailsView.ts | status": {
-    "message": "Ŝt́ât́ûś"
-  },
-  "issues/CorsIssueDetailsView.ts | warning": {
-    "message": "ŵár̂ńîńĝ"
-  },
-  "issues/CSPViolationsView.ts | filter": {
-    "message": "F̂íl̂t́êŕ"
-  },
-  "issues/issues-meta.ts | cspViolations": {
-    "message": "ĈŚP̂ V́îól̂át̂íôńŝ"
-  },
-  "issues/issues-meta.ts | issues": {
-    "message": "Îśŝúêś"
-  },
-  "issues/issues-meta.ts | showCspViolations": {
-    "message": "Ŝh́ôẃ ĈŚP̂ V́îól̂át̂íôńŝ"
-  },
-  "issues/issues-meta.ts | showIssues": {
-    "message": "Ŝh́ôẃ Îśŝúêś"
-  },
-  "issues/IssuesPane.ts | contentSecurityPolicy": {
-    "message": "Ĉón̂t́êńt̂ Śêćûŕît́ŷ Ṕôĺîćŷ"
-  },
-  "issues/IssuesPane.ts | cors": {
-    "message": "Ĉŕôśŝ Ór̂íĝín̂ Ŕêśôúr̂ćê Śĥár̂ín̂ǵ"
-  },
-  "issues/IssuesPane.ts | crossOriginEmbedderPolicy": {
-    "message": "Ĉŕôśŝ Ór̂íĝín̂ Ém̂b́êd́d̂ér̂ Ṕôĺîćŷ"
-  },
-  "issues/IssuesPane.ts | groupByCategory": {
-    "message": "Ĝŕôúp̂ b́ŷ ćât́êǵôŕŷ"
-  },
-  "issues/IssuesPane.ts | groupDisplayedIssuesUnder": {
-    "message": "Ĝŕôúp̂ d́îśp̂ĺâýêd́ îśŝúêś ûńd̂ér̂ áŝśôćîát̂éd̂ ćât́êǵôŕîéŝ"
-  },
-  "issues/IssuesPane.ts | heavyAds": {
-    "message": "Ĥéâv́ŷ Ád̂ś"
-  },
-  "issues/IssuesPane.ts | includeCookieIssuesCausedBy": {
-    "message": "Îńĉĺûd́ê ćôók̂íê Íŝśûéŝ ćâúŝéd̂ b́ŷ t́ĥír̂d́-p̂ár̂t́ŷ śît́êś"
-  },
-  "issues/IssuesPane.ts | includeThirdpartyCookieIssues": {
-    "message": "Îńĉĺûd́ê t́ĥír̂d́-p̂ár̂t́ŷ ćôók̂íê íŝśûéŝ"
-  },
-  "issues/IssuesPane.ts | lowTextContrast": {
-    "message": "L̂óŵ T́êx́t̂ Ćôńt̂ŕâśt̂"
-  },
-  "issues/IssuesPane.ts | mixedContent": {
-    "message": "M̂íx̂éd̂ Ćôńt̂én̂t́"
-  },
-  "issues/IssuesPane.ts | noIssuesDetectedSoFar": {
-    "message": "N̂ó îśŝúêś d̂ét̂éĉt́êd́ ŝó f̂ár̂"
-  },
-  "issues/IssuesPane.ts | onlyThirdpartyCookieIssues": {
-    "message": "Ôńl̂ý t̂h́îŕd̂-ṕâŕt̂ý ĉóôḱîé îśŝúêś d̂ét̂éĉt́êd́ ŝó f̂ár̂"
-  },
-  "issues/IssuesPane.ts | other": {
-    "message": "Ôt́ĥér̂"
-  },
-  "issues/IssuesPane.ts | samesiteCookie": {
-    "message": "Ŝám̂éŜít̂é Ĉóôḱîé"
-  },
-  "issues/IssuesPane.ts | trustedWebActivity": {
-    "message": "T̂ŕûśt̂éd̂ Ẃêb́ Âćt̂ív̂ít̂ý"
-  },
-  "issues/IssueView.ts | affectedResources": {
-    "message": "Âf́f̂éĉt́êd́ R̂éŝóûŕĉéŝ"
-  },
-  "issues/IssueView.ts | automaticallyUpgraded": {
-    "message": "âút̂óm̂át̂íĉál̂ĺŷ úp̂ǵr̂ád̂éd̂"
-  },
-  "issues/IssueView.ts | blocked": {
-    "message": "b̂ĺôćk̂éd̂"
-  },
-  "issues/IssueView.ts | clickToRevealTheViolatingDomNode": {
-    "message": "Ĉĺîćk̂ t́ô ŕêv́êál̂ t́ĥé v̂íôĺât́îńĝ D́ÔḾ n̂ód̂é îń t̂h́ê Él̂ém̂én̂t́ŝ ṕâńêĺ"
-  },
-  "issues/IssueView.ts | directiveC": {
-    "message": "D̂ír̂éĉt́îv́ê"
-  },
-  "issues/IssueView.ts | element": {
-    "message": "Êĺêḿêńt̂"
-  },
-  "issues/IssueView.ts | learnMoreS": {
-    "message": "L̂éâŕn̂ ḿôŕê: {PH1}"
-  },
-  "issues/IssueView.ts | name": {
-    "message": "N̂ám̂é"
-  },
-  "issues/IssueView.ts | nDirectives": {
-    "message": "{n, plural, =1 { d̂ír̂éĉt́îv́ê} other { d́îŕêćt̂ív̂éŝ}}"
-  },
-  "issues/IssueView.ts | nRequests": {
-    "message": "{n, plural, =1 { r̂éq̂úêśt̂} other { ŕêq́ûéŝt́ŝ}}"
-  },
-  "issues/IssueView.ts | nResources": {
-    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
-  },
-  "issues/IssueView.ts | nSources": {
-    "message": "{n, plural, =1 { ŝóûŕĉé} other { ŝóûŕĉéŝ}}"
-  },
-  "issues/IssueView.ts | reportonly": {
-    "message": "r̂ép̂ór̂t́-ôńl̂ý"
-  },
-  "issues/IssueView.ts | resourceC": {
-    "message": "R̂éŝóûŕĉé"
-  },
-  "issues/IssueView.ts | restrictionStatus": {
-    "message": "R̂éŝt́r̂íĉt́îón̂ Śt̂át̂úŝ"
-  },
-  "issues/IssueView.ts | sourceLocation": {
-    "message": "Ŝóûŕĉé L̂óĉát̂íôń"
-  },
-  "issues/IssueView.ts | status": {
-    "message": "Ŝt́ât́ûś"
-  },
-  "issues/IssueView.ts | warned": {
-    "message": "Ŵár̂ńêd́"
-  },
   "js_profiler/js_profiler-meta.ts | profiler": {
     "message": "P̂ŕôf́îĺêŕ"
   },
@@ -5150,6 +4877,279 @@
   "panels/input/InputTimeline.ts | saveProfile": {
     "message": "Ŝáv̂é p̂ŕôf́îĺê…"
   },
+  "panels/issues/AffectedBlockedByResponseView.ts | blockedResource": {
+    "message": "B̂ĺôćk̂éd̂ Ŕêśôúr̂ćê"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | nRequests": {
+    "message": "{n, plural, =1 { r̂éq̂úêśt̂} other { ŕêq́ûéŝt́ŝ}}"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | parentFrame": {
+    "message": "P̂ár̂én̂t́ F̂ŕâḿê"
+  },
+  "panels/issues/AffectedBlockedByResponseView.ts | requestC": {
+    "message": "R̂éq̂úêśt̂"
+  },
+  "panels/issues/AffectedCookiesView.ts | domain": {
+    "message": "D̂óm̂áîń"
+  },
+  "panels/issues/AffectedCookiesView.ts | name": {
+    "message": "N̂ám̂é"
+  },
+  "panels/issues/AffectedCookiesView.ts | nCookies": {
+    "message": "{n, plural, =1 { ĉóôḱîé} other { ĉóôḱîéŝ}}"
+  },
+  "panels/issues/AffectedCookiesView.ts | path": {
+    "message": "P̂át̂h́"
+  },
+  "panels/issues/AffectedElementsView.ts | nElements": {
+    "message": "{n, plural, =1 { êĺêḿêńt̂} other { él̂ém̂én̂t́ŝ}}"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | contrastRatio": {
+    "message": "Ĉón̂t́r̂áŝt́ r̂át̂íô"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | element": {
+    "message": "Êĺêḿêńt̂"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | minimumAA": {
+    "message": "M̂ín̂ím̂úm̂ ÁÂ ŕât́îó"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | minimumAAA": {
+    "message": "M̂ín̂ím̂úm̂ ÁÂÁ r̂át̂íô"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | textSize": {
+    "message": "T̂éx̂t́ ŝíẑé"
+  },
+  "panels/issues/AffectedElementsWithLowContrastView.ts | textWeight": {
+    "message": "T̂éx̂t́ ŵéîǵĥt́"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | cpuPeakLimit": {
+    "message": "ĈṔÛ ṕêák̂ ĺîḿît́"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | cpuTotalLimit": {
+    "message": "ĈṔÛ t́ôt́âĺ l̂ím̂ít̂"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | frameUrl": {
+    "message": "F̂ŕâḿê ÚR̂Ĺ"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | limitExceeded": {
+    "message": "L̂ím̂ít̂ éx̂ćêéd̂éd̂"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | networkLimit": {
+    "message": "N̂ét̂ẃôŕk̂ ĺîḿît́"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | nResources": {
+    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | removed": {
+    "message": "R̂ém̂óv̂éd̂"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | resolutionStatus": {
+    "message": "R̂éŝól̂út̂íôń Ŝt́ât́ûś"
+  },
+  "panels/issues/AffectedHeavyAdView.ts | warned": {
+    "message": "Ŵár̂ńêd́"
+  },
+  "panels/issues/AffectedResourcesView.ts | clickToRevealTheFramesDomNodeIn": {
+    "message": "Ĉĺîćk̂ t́ô ŕêv́êál̂ t́ĥé f̂ŕâḿê'ś D̂ÓM̂ ńôd́ê ín̂ t́ĥé Êĺêḿêńt̂ś p̂án̂él̂"
+  },
+  "panels/issues/AffectedResourcesView.ts | clickToShowRequestInTheNetwork": {
+    "message": "Ĉĺîćk̂ t́ô śĥóŵ ŕêq́ûéŝt́ îń t̂h́ê ńêt́ŵór̂ḱ p̂án̂él̂"
+  },
+  "panels/issues/AffectedResourcesView.ts | requestUnavailableInTheNetwork": {
+    "message": "R̂éq̂úêśt̂ ún̂áv̂áîĺâb́l̂é îń t̂h́ê ńêt́ŵór̂ḱ p̂án̂él̂, t́r̂ý r̂él̂óâd́îńĝ t́ĥé îńŝṕêćt̂éd̂ ṕâǵê"
+  },
+  "panels/issues/AffectedResourcesView.ts | unknown": {
+    "message": "ûńk̂ńôẃn̂"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | aSharedarraybufferWas": {
+    "message": "Â SharedArrayBuffer ẃâś îńŝt́âńt̂íât́êd́ îń â ćôńt̂éx̂t́ t̂h́ât́ îś n̂ót̂ ćr̂óŝś-ôŕîǵîń îśôĺât́êd́"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | blocked": {
+    "message": "b̂ĺôćk̂éd̂"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | instantiation": {
+    "message": "Îńŝt́âńt̂íât́îón̂"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | nViolations": {
+    "message": "{n, plural, =1 { v̂íôĺât́îón̂} other { v́îól̂át̂íôńŝ}}"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | sharedarraybufferWasTransferedTo": {
+    "message": "SharedArrayBuffer ŵáŝ t́r̂án̂śf̂ér̂éd̂ t́ô á ĉón̂t́êx́t̂ t́ĥát̂ íŝ ńôt́ ĉŕôśŝ-ór̂íĝín̂ íŝól̂át̂éd̂"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | sourceLocation": {
+    "message": "Ŝóûŕĉé L̂óĉát̂íôń"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | status": {
+    "message": "Ŝt́ât́ûś"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | transfer": {
+    "message": "T̂ŕâńŝf́êŕ"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | trigger": {
+    "message": "T̂ŕîǵĝér̂"
+  },
+  "panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts | warning": {
+    "message": "ŵár̂ńîńĝ"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | nResources": {
+    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageName": {
+    "message": "P̂áĉḱâǵê ńâḿê"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | packageSignature": {
+    "message": "P̂áĉḱâǵê śîǵn̂át̂úr̂é"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | statusCode": {
+    "message": "Ŝt́ât́ûś ĉód̂é"
+  },
+  "panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts | url": {
+    "message": "Ûŕl̂"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | blocked": {
+    "message": "b̂ĺôćk̂éd̂"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | initiatorAddressSpace": {
+    "message": "Îńît́îát̂ór̂ Ád̂d́r̂éŝś"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | initiatorContext": {
+    "message": "Îńît́îát̂ór̂ Ćôńt̂éx̂t́"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | insecure": {
+    "message": "îńŝéĉúr̂é"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | nItems": {
+    "message": "{n, plural, =1 { ît́êḿ} other { ît́êḿŝ}}"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | request": {
+    "message": "R̂éq̂úêśt̂"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | resourceAddressSpace": {
+    "message": "R̂éŝóûŕĉé Âd́d̂ŕêśŝ"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | secure": {
+    "message": "ŝéĉúr̂é"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | status": {
+    "message": "Ŝt́ât́ûś"
+  },
+  "panels/issues/CorsIssueDetailsView.ts | warning": {
+    "message": "ŵár̂ńîńĝ"
+  },
+  "panels/issues/CSPViolationsView.ts | filter": {
+    "message": "F̂íl̂t́êŕ"
+  },
+  "panels/issues/issues-meta.ts | cspViolations": {
+    "message": "ĈŚP̂ V́îól̂át̂íôńŝ"
+  },
+  "panels/issues/issues-meta.ts | issues": {
+    "message": "Îśŝúêś"
+  },
+  "panels/issues/issues-meta.ts | showCspViolations": {
+    "message": "Ŝh́ôẃ ĈŚP̂ V́îól̂át̂íôńŝ"
+  },
+  "panels/issues/issues-meta.ts | showIssues": {
+    "message": "Ŝh́ôẃ Îśŝúêś"
+  },
+  "panels/issues/IssuesPane.ts | contentSecurityPolicy": {
+    "message": "Ĉón̂t́êńt̂ Śêćûŕît́ŷ Ṕôĺîćŷ"
+  },
+  "panels/issues/IssuesPane.ts | cors": {
+    "message": "Ĉŕôśŝ Ór̂íĝín̂ Ŕêśôúr̂ćê Śĥár̂ín̂ǵ"
+  },
+  "panels/issues/IssuesPane.ts | crossOriginEmbedderPolicy": {
+    "message": "Ĉŕôśŝ Ór̂íĝín̂ Ém̂b́êd́d̂ér̂ Ṕôĺîćŷ"
+  },
+  "panels/issues/IssuesPane.ts | groupByCategory": {
+    "message": "Ĝŕôúp̂ b́ŷ ćât́êǵôŕŷ"
+  },
+  "panels/issues/IssuesPane.ts | groupDisplayedIssuesUnder": {
+    "message": "Ĝŕôúp̂ d́îśp̂ĺâýêd́ îśŝúêś ûńd̂ér̂ áŝśôćîát̂éd̂ ćât́êǵôŕîéŝ"
+  },
+  "panels/issues/IssuesPane.ts | heavyAds": {
+    "message": "Ĥéâv́ŷ Ád̂ś"
+  },
+  "panels/issues/IssuesPane.ts | includeCookieIssuesCausedBy": {
+    "message": "Îńĉĺûd́ê ćôók̂íê Íŝśûéŝ ćâúŝéd̂ b́ŷ t́ĥír̂d́-p̂ár̂t́ŷ śît́êś"
+  },
+  "panels/issues/IssuesPane.ts | includeThirdpartyCookieIssues": {
+    "message": "Îńĉĺûd́ê t́ĥír̂d́-p̂ár̂t́ŷ ćôók̂íê íŝśûéŝ"
+  },
+  "panels/issues/IssuesPane.ts | lowTextContrast": {
+    "message": "L̂óŵ T́êx́t̂ Ćôńt̂ŕâśt̂"
+  },
+  "panels/issues/IssuesPane.ts | mixedContent": {
+    "message": "M̂íx̂éd̂ Ćôńt̂én̂t́"
+  },
+  "panels/issues/IssuesPane.ts | noIssuesDetectedSoFar": {
+    "message": "N̂ó îśŝúêś d̂ét̂éĉt́êd́ ŝó f̂ár̂"
+  },
+  "panels/issues/IssuesPane.ts | onlyThirdpartyCookieIssues": {
+    "message": "Ôńl̂ý t̂h́îŕd̂-ṕâŕt̂ý ĉóôḱîé îśŝúêś d̂ét̂éĉt́êd́ ŝó f̂ár̂"
+  },
+  "panels/issues/IssuesPane.ts | other": {
+    "message": "Ôt́ĥér̂"
+  },
+  "panels/issues/IssuesPane.ts | samesiteCookie": {
+    "message": "Ŝám̂éŜít̂é Ĉóôḱîé"
+  },
+  "panels/issues/IssuesPane.ts | trustedWebActivity": {
+    "message": "T̂ŕûśt̂éd̂ Ẃêb́ Âćt̂ív̂ít̂ý"
+  },
+  "panels/issues/IssueView.ts | affectedResources": {
+    "message": "Âf́f̂éĉt́êd́ R̂éŝóûŕĉéŝ"
+  },
+  "panels/issues/IssueView.ts | automaticallyUpgraded": {
+    "message": "âút̂óm̂át̂íĉál̂ĺŷ úp̂ǵr̂ád̂éd̂"
+  },
+  "panels/issues/IssueView.ts | blocked": {
+    "message": "b̂ĺôćk̂éd̂"
+  },
+  "panels/issues/IssueView.ts | clickToRevealTheViolatingDomNode": {
+    "message": "Ĉĺîćk̂ t́ô ŕêv́êál̂ t́ĥé v̂íôĺât́îńĝ D́ÔḾ n̂ód̂é îń t̂h́ê Él̂ém̂én̂t́ŝ ṕâńêĺ"
+  },
+  "panels/issues/IssueView.ts | directiveC": {
+    "message": "D̂ír̂éĉt́îv́ê"
+  },
+  "panels/issues/IssueView.ts | element": {
+    "message": "Êĺêḿêńt̂"
+  },
+  "panels/issues/IssueView.ts | learnMoreS": {
+    "message": "L̂éâŕn̂ ḿôŕê: {PH1}"
+  },
+  "panels/issues/IssueView.ts | name": {
+    "message": "N̂ám̂é"
+  },
+  "panels/issues/IssueView.ts | nDirectives": {
+    "message": "{n, plural, =1 { d̂ír̂éĉt́îv́ê} other { d́îŕêćt̂ív̂éŝ}}"
+  },
+  "panels/issues/IssueView.ts | nRequests": {
+    "message": "{n, plural, =1 { r̂éq̂úêśt̂} other { ŕêq́ûéŝt́ŝ}}"
+  },
+  "panels/issues/IssueView.ts | nResources": {
+    "message": "{n, plural, =1 { r̂éŝóûŕĉé} other { r̂éŝóûŕĉéŝ}}"
+  },
+  "panels/issues/IssueView.ts | nSources": {
+    "message": "{n, plural, =1 { ŝóûŕĉé} other { ŝóûŕĉéŝ}}"
+  },
+  "panels/issues/IssueView.ts | reportonly": {
+    "message": "r̂ép̂ór̂t́-ôńl̂ý"
+  },
+  "panels/issues/IssueView.ts | resourceC": {
+    "message": "R̂éŝóûŕĉé"
+  },
+  "panels/issues/IssueView.ts | restrictionStatus": {
+    "message": "R̂éŝt́r̂íĉt́îón̂ Śt̂át̂úŝ"
+  },
+  "panels/issues/IssueView.ts | sourceLocation": {
+    "message": "Ŝóûŕĉé L̂óĉát̂íôń"
+  },
+  "panels/issues/IssueView.ts | status": {
+    "message": "Ŝt́ât́ûś"
+  },
+  "panels/issues/IssueView.ts | warned": {
+    "message": "Ŵár̂ńêd́"
+  },
   "panels/layer_viewer/layer_viewer-meta.ts | panOrRotateDown": {
     "message": "P̂án̂ ór̂ ŕôt́ât́ê d́ôẃn̂"
   },
diff --git a/front_end/entrypoints/devtools_app/BUILD.gn b/front_end/entrypoints/devtools_app/BUILD.gn
index bb77de9..16fd1ff 100644
--- a/front_end/entrypoints/devtools_app/BUILD.gn
+++ b/front_end/entrypoints/devtools_app/BUILD.gn
@@ -9,7 +9,6 @@
 
   deps = [
     "../../inspector_main:meta",
-    "../../issues:meta",
     "../../panels/accessibility:meta",
     "../../panels/animation:meta",
     "../../panels/application:meta",
@@ -19,6 +18,7 @@
     "../../panels/elements:meta",
     "../../panels/emulation:meta",
     "../../panels/help:meta",
+    "../../panels/issues:meta",
     "../../panels/layer_viewer:meta",
     "../../panels/layers:meta",
     "../../panels/lighthouse:meta",
diff --git a/front_end/entrypoints/devtools_app/devtools_app-meta-files.ts b/front_end/entrypoints/devtools_app/devtools_app-meta-files.ts
index 27c0115..33e9a4d 100644
--- a/front_end/entrypoints/devtools_app/devtools_app-meta-files.ts
+++ b/front_end/entrypoints/devtools_app/devtools_app-meta-files.ts
@@ -13,7 +13,7 @@
 import '../../panels/developer_resources/developer_resources-meta.js';
 import '../../inspector_main/inspector_main-meta.js';
 import '../../panels/application/application-meta.js';
-import '../../issues/issues-meta.js';
+import '../../panels/issues/issues-meta.js';
 import '../../panels/help/help-meta.js';
 import '../../panels/layers/layers-meta.js';
 import '../../panels/lighthouse/lighthouse-meta.js';
diff --git a/front_end/entrypoints/devtools_app/devtools_app.json b/front_end/entrypoints/devtools_app/devtools_app.json
index 972837c..819fc53 100644
--- a/front_end/entrypoints/devtools_app/devtools_app.json
+++ b/front_end/entrypoints/devtools_app/devtools_app.json
@@ -12,7 +12,7 @@
     { "name": "ui/legacy/components/cookie_table" },
     { "name": "panels/elements" },
     { "name": "emulated_devices" },
-    { "name": "issues" },
+    { "name": "panels/issues" },
     { "name": "panels/developer_resources" },
     { "name": "panels/help" },
     { "name": "panels/layers" },
diff --git a/front_end/entrypoints/worker_app/BUILD.gn b/front_end/entrypoints/worker_app/BUILD.gn
index d25ca29..973245d 100644
--- a/front_end/entrypoints/worker_app/BUILD.gn
+++ b/front_end/entrypoints/worker_app/BUILD.gn
@@ -9,12 +9,12 @@
 
   deps = [
     "../../entrypoints/startup:bundle",
-    "../../issues:meta",
     "../../panels/application:meta",
     "../../panels/browser_debugger:meta",
     "../../panels/developer_resources:meta",
     "../../panels/elements:meta",
     "../../panels/help:meta",
+    "../../panels/issues:meta",
     "../../panels/layer_viewer:meta",
     "../../panels/mobile_throttling:meta",
     "../../panels/network:meta",
diff --git a/front_end/entrypoints/worker_app/worker_app.js b/front_end/entrypoints/worker_app/worker_app.js
index 53cfd62..7485cea 100644
--- a/front_end/entrypoints/worker_app/worker_app.js
+++ b/front_end/entrypoints/worker_app/worker_app.js
@@ -6,7 +6,7 @@
 import '../../panels/developer_resources/developer_resources-meta.js';
 import '../../panels/elements/elements-meta.js';
 import '../../panels/help/help-meta.js';
-import '../../issues/issues-meta.js';
+import '../../panels/issues/issues-meta.js';
 import '../../panels/layer_viewer/layer_viewer-meta.js';
 import '../../panels/mobile_throttling/mobile_throttling-meta.js';
 import '../../panels/network/network-meta.js';
diff --git a/front_end/entrypoints/worker_app/worker_app.json b/front_end/entrypoints/worker_app/worker_app.json
index 00b66ca..df359b9 100644
--- a/front_end/entrypoints/worker_app/worker_app.json
+++ b/front_end/entrypoints/worker_app/worker_app.json
@@ -7,7 +7,7 @@
     { "name": "ui/legacy/components/cookie_table" },
     { "name": "panels/elements" },
     { "name": "panels/help" },
-    { "name": "issues" },
+    { "name": "panels/issues" },
     { "name": "panels/developer_resources" },
     { "name": "panels/layer_viewer" },
     { "name": "panels/network" },
diff --git a/front_end/issues/BUILD.gn b/front_end/issues/BUILD.gn
deleted file mode 100644
index 677422a..0000000
--- a/front_end/issues/BUILD.gn
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("../../scripts/build/ninja/devtools_entrypoint.gni")
-import("../../scripts/build/ninja/devtools_module.gni")
-
-devtools_module("issues") {
-  sources = [
-    "AffectedBlockedByResponseView.ts",
-    "AffectedCookiesView.ts",
-    "AffectedElementsView.ts",
-    "AffectedElementsWithLowContrastView.ts",
-    "AffectedHeavyAdView.ts",
-    "AffectedResourcesView.ts",
-    "AffectedSharedArrayBufferIssueDetailsView.ts",
-    "AffectedTrustedWebActivityIssueDetailsView.ts",
-    "CSPViolationsListView.ts",
-    "CSPViolationsView.ts",
-    "ComboBoxOfCheckBoxes.ts",
-    "CorsIssueDetailsView.ts",
-    "IssueAggregator.ts",
-    "IssueRevealer.ts",
-    "IssueView.ts",
-    "IssuesPane.ts",
-  ]
-
-  deps = [
-    "../components:bundle",
-    "../core/common:bundle",
-    "../core/i18n:bundle",
-    "../core/sdk:bundle",
-    "../models/issues_manager:bundle",
-    "../panels/console_counters:bundle",
-    "../panels/elements:bundle",
-    "../panels/network:bundle",
-    "../third_party/lit-html:bundle",
-    "../ui/components/data_grid:bundle",
-    "../ui/components/linkifier:bundle",
-    "../ui/components/markdown_view:bundle",
-    "../ui/legacy:bundle",
-  ]
-
-  visibility = [ "../../test/unittests/front_end/issues" ]
-}
-
-devtools_entrypoint("bundle") {
-  entrypoint = "issues.ts"
-
-  deps = [ ":issues" ]
-}
-
-devtools_entrypoint("meta") {
-  entrypoint = "issues-meta.ts"
-
-  deps = [ ":bundle" ]
-}
diff --git a/front_end/issues/AffectedBlockedByResponseView.ts b/front_end/panels/issues/AffectedBlockedByResponseView.ts
similarity index 90%
rename from front_end/issues/AffectedBlockedByResponseView.ts
rename to front_end/panels/issues/AffectedBlockedByResponseView.ts
index 5aa5779..bae8e1f 100644
--- a/front_end/issues/AffectedBlockedByResponseView.ts
+++ b/front_end/panels/issues/AffectedBlockedByResponseView.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedResourcesView} from './AffectedResourcesView.js';
 
@@ -28,7 +28,7 @@
   */
   blockedResource: 'Blocked Resource',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedBlockedByResponseView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedBlockedByResponseView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 export class AffectedBlockedByResponseView extends AffectedResourcesView {
diff --git a/front_end/issues/AffectedCookiesView.ts b/front_end/panels/issues/AffectedCookiesView.ts
similarity index 91%
rename from front_end/issues/AffectedCookiesView.ts
rename to front_end/panels/issues/AffectedCookiesView.ts
index dd82ebd..d52b813 100644
--- a/front_end/issues/AffectedCookiesView.ts
+++ b/front_end/panels/issues/AffectedCookiesView.ts
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as Host from '../core/host/host.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as Network from '../panels/network/network.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as Host from '../../core/host/host.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as UI from '../../ui/legacy/legacy.js';
+import * as Network from '../network/network.js';
 
 import {AffectedItem, AffectedResourcesView} from './AffectedResourcesView.js';
 
@@ -31,7 +31,7 @@
   */
   path: 'Path',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedCookiesView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedCookiesView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 export class AffectedCookiesView extends AffectedResourcesView {
diff --git a/front_end/issues/AffectedElementsView.ts b/front_end/panels/issues/AffectedElementsView.ts
similarity index 85%
rename from front_end/issues/AffectedElementsView.ts
rename to front_end/panels/issues/AffectedElementsView.ts
index 55e8141..caf31e3 100644
--- a/front_end/issues/AffectedElementsView.ts
+++ b/front_end/panels/issues/AffectedElementsView.ts
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as Common from '../core/common/common.js';
-import * as Host from '../core/host/host.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as SDK from '../core/sdk/sdk.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as Common from '../../core/common/common.js';
+import * as Host from '../../core/host/host.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as SDK from '../../core/sdk/sdk.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedItem, AffectedResourcesView} from './AffectedResourcesView.js';
 import {IssueView} from './IssueView.js';
@@ -18,7 +18,7 @@
   */
   nElements: '{n, plural, =1 { element} other { elements}}',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedElementsView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedElementsView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 export class AffectedElementsView extends AffectedResourcesView {
   private issue: IssuesManager.Issue.Issue;
diff --git a/front_end/issues/AffectedElementsWithLowContrastView.ts b/front_end/panels/issues/AffectedElementsWithLowContrastView.ts
similarity index 92%
rename from front_end/issues/AffectedElementsWithLowContrastView.ts
rename to front_end/panels/issues/AffectedElementsWithLowContrastView.ts
index 917f156..a18c063 100644
--- a/front_end/issues/AffectedElementsWithLowContrastView.ts
+++ b/front_end/panels/issues/AffectedElementsWithLowContrastView.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedElementsView} from './AffectedElementsView.js';
 import {AggregatedIssue} from './IssueAggregator.js';
@@ -94,5 +94,5 @@
   */
   textWeight: 'Text weight',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedElementsWithLowContrastView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedElementsWithLowContrastView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
diff --git a/front_end/issues/AffectedHeavyAdView.ts b/front_end/panels/issues/AffectedHeavyAdView.ts
similarity index 93%
rename from front_end/issues/AffectedHeavyAdView.ts
rename to front_end/panels/issues/AffectedHeavyAdView.ts
index 6196556..16cf3aa 100644
--- a/front_end/issues/AffectedHeavyAdView.ts
+++ b/front_end/panels/issues/AffectedHeavyAdView.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedResourcesView} from './AffectedResourcesView.js';
 
@@ -54,7 +54,7 @@
   */
   networkLimit: 'Network limit',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedHeavyAdView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedHeavyAdView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 export class AffectedHeavyAdView extends AffectedResourcesView {
diff --git a/front_end/issues/AffectedResourcesView.ts b/front_end/panels/issues/AffectedResourcesView.ts
similarity index 94%
rename from front_end/issues/AffectedResourcesView.ts
rename to front_end/panels/issues/AffectedResourcesView.ts
index ce55d09..2f9354d 100644
--- a/front_end/issues/AffectedResourcesView.ts
+++ b/front_end/panels/issues/AffectedResourcesView.ts
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../ui/components/icon_button/icon_button.js';
+import '../../ui/components/icon_button/icon_button.js';
 
-import * as Components from '../components/components.js';
-import * as Common from '../core/common/common.js';
-import * as Host from '../core/host/host.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as SDK from '../core/sdk/sdk.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as Network from '../panels/network/network.js';
-import * as IconButton from '../ui/components/icon_button/icon_button.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as Components from '../../components/components.js';
+import * as Common from '../../core/common/common.js';
+import * as Host from '../../core/host/host.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as SDK from '../../core/sdk/sdk.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as IconButton from '../../ui/components/icon_button/icon_button.js';
+import * as UI from '../../ui/legacy/legacy.js';
+import * as Network from '../network/network.js';
 
 import {IssueView} from './IssueView.js';
 
@@ -34,7 +34,7 @@
   */
   requestUnavailableInTheNetwork: 'Request unavailable in the network panel, try reloading the inspected page',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedResourcesView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedResourcesView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 export const enum AffectedItem {
diff --git a/front_end/issues/AffectedSharedArrayBufferIssueDetailsView.ts b/front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts
similarity index 92%
rename from front_end/issues/AffectedSharedArrayBufferIssueDetailsView.ts
rename to front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts
index a0038c7..8b8c467 100644
--- a/front_end/issues/AffectedSharedArrayBufferIssueDetailsView.ts
+++ b/front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 import {AffectedResourcesView} from './AffectedResourcesView.js';
 import {AggregatedIssue} from './IssueAggregator.js';
@@ -53,7 +53,7 @@
   */
   status: 'Status',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedSharedArrayBufferIssueDetailsView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 export class AffectedSharedArrayBufferIssueDetailsView extends AffectedResourcesView {
   private issue: AggregatedIssue;
diff --git a/front_end/issues/AffectedTrustedWebActivityIssueDetailsView.ts b/front_end/panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts
similarity index 91%
rename from front_end/issues/AffectedTrustedWebActivityIssueDetailsView.ts
rename to front_end/panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts
index c522a3b..6efe5e5 100644
--- a/front_end/issues/AffectedTrustedWebActivityIssueDetailsView.ts
+++ b/front_end/panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedResourcesView} from './AffectedResourcesView.js';
 import {AggregatedIssue} from './IssueAggregator.js';
@@ -32,7 +32,7 @@
   */
   packageSignature: 'Package signature',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/AffectedTrustedWebActivityIssueDetailsView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/AffectedTrustedWebActivityIssueDetailsView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 export class AffectedTrustedWebActivityIssueDetailsView extends AffectedResourcesView {
   private issue: AggregatedIssue;
diff --git a/front_end/panels/issues/BUILD.gn b/front_end/panels/issues/BUILD.gn
new file mode 100644
index 0000000..c167c28
--- /dev/null
+++ b/front_end/panels/issues/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("../../../scripts/build/ninja/devtools_entrypoint.gni")
+import("../../../scripts/build/ninja/devtools_module.gni")
+
+devtools_module("issues") {
+  sources = [
+    "AffectedBlockedByResponseView.ts",
+    "AffectedCookiesView.ts",
+    "AffectedElementsView.ts",
+    "AffectedElementsWithLowContrastView.ts",
+    "AffectedHeavyAdView.ts",
+    "AffectedResourcesView.ts",
+    "AffectedSharedArrayBufferIssueDetailsView.ts",
+    "AffectedTrustedWebActivityIssueDetailsView.ts",
+    "CSPViolationsListView.ts",
+    "CSPViolationsView.ts",
+    "ComboBoxOfCheckBoxes.ts",
+    "CorsIssueDetailsView.ts",
+    "IssueAggregator.ts",
+    "IssueRevealer.ts",
+    "IssueView.ts",
+    "IssuesPane.ts",
+  ]
+
+  deps = [
+    "../../components:bundle",
+    "../../core/common:bundle",
+    "../../core/i18n:bundle",
+    "../../core/sdk:bundle",
+    "../../models/issues_manager:bundle",
+    "../../panels/console_counters:bundle",
+    "../../panels/elements:bundle",
+    "../../panels/network:bundle",
+    "../../third_party/lit-html:bundle",
+    "../../ui/components/data_grid:bundle",
+    "../../ui/components/linkifier:bundle",
+    "../../ui/components/markdown_view:bundle",
+    "../../ui/legacy:bundle",
+  ]
+
+  visibility = [ "../../../test/unittests/front_end/issues" ]
+}
+
+devtools_entrypoint("bundle") {
+  entrypoint = "issues.ts"
+
+  deps = [ ":issues" ]
+}
+
+devtools_entrypoint("meta") {
+  entrypoint = "issues-meta.ts"
+
+  deps = [ ":bundle" ]
+}
diff --git a/front_end/issues/CSPViolationsListView.ts b/front_end/panels/issues/CSPViolationsListView.ts
similarity index 87%
rename from front_end/issues/CSPViolationsListView.ts
rename to front_end/panels/issues/CSPViolationsListView.ts
index db5a129..0d3d17b 100644
--- a/front_end/issues/CSPViolationsListView.ts
+++ b/front_end/panels/issues/CSPViolationsListView.ts
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../ui/components/linkifier/linkifier.js';
-import '../ui/components/data_grid/data_grid.js';
+import '../../ui/components/linkifier/linkifier.js';
+import '../../ui/components/data_grid/data_grid.js';
 
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as LitHtml from '../third_party/lit-html/lit-html.js';
-import * as DataGrid from '../ui/components/data_grid/data_grid.js';
-import * as Linkifier from '../ui/components/linkifier/linkifier.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as LitHtml from '../../third_party/lit-html/lit-html.js';
+import * as DataGrid from '../../ui/components/data_grid/data_grid.js';
+import * as Linkifier from '../../ui/components/linkifier/linkifier.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 export class CSPViolationsListView extends UI.Widget.VBox {
   private table = new DataGrid.DataGridController.DataGridController();
@@ -19,7 +19,7 @@
 
   constructor() {
     super(true);
-    this.registerRequiredCSS('issues/cspViolationsListView.css', {enableLegacyPatching: false});
+    this.registerRequiredCSS('panels/issues/cspViolationsListView.css', {enableLegacyPatching: false});
 
     this.table.data = {
       columns: [
diff --git a/front_end/issues/CSPViolationsView.ts b/front_end/panels/issues/CSPViolationsView.ts
similarity index 89%
rename from front_end/issues/CSPViolationsView.ts
rename to front_end/panels/issues/CSPViolationsView.ts
index f3bafa5..45cabec 100644
--- a/front_end/issues/CSPViolationsView.ts
+++ b/front_end/panels/issues/CSPViolationsView.ts
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import type * as Common from '../core/common/common.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import type * as Common from '../../core/common/common.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 import {ComboBoxOfCheckBoxes} from './ComboBoxOfCheckBoxes.js';
 import {CSPViolationsListView} from './CSPViolationsListView.js';
@@ -16,7 +16,7 @@
   */
   filter: 'Filter',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/CSPViolationsView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/CSPViolationsView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 let cspViolationsViewInstance: CSPViolationsView;
 export class CSPViolationsView extends UI.Widget.VBox {
@@ -28,7 +28,7 @@
    */
   constructor() {
     super(true);
-    this.registerRequiredCSS('issues/cspViolationsView.css', {enableLegacyPatching: false});
+    this.registerRequiredCSS('panels/issues/cspViolationsView.css', {enableLegacyPatching: false});
     this.contentElement.classList.add('csp-violations-pane');
 
     const topToolbar = new UI.Toolbar.Toolbar('csp-violations-toolbar', this.contentElement);
diff --git a/front_end/issues/ComboBoxOfCheckBoxes.ts b/front_end/panels/issues/ComboBoxOfCheckBoxes.ts
similarity index 95%
rename from front_end/issues/ComboBoxOfCheckBoxes.ts
rename to front_end/panels/issues/ComboBoxOfCheckBoxes.ts
index 4e07616..e1f6c63 100644
--- a/front_end/issues/ComboBoxOfCheckBoxes.ts
+++ b/front_end/panels/issues/ComboBoxOfCheckBoxes.ts
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import type * as Common from '../core/common/common.js';
-import * as UI from '../ui/legacy/legacy.js';
+import type * as Common from '../../core/common/common.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 export class ComboBoxOfCheckBoxes extends UI.Toolbar.ToolbarButton {
   private options = new Array<MenuOption>();
diff --git a/front_end/issues/CorsIssueDetailsView.ts b/front_end/panels/issues/CorsIssueDetailsView.ts
similarity index 93%
rename from front_end/issues/CorsIssueDetailsView.ts
rename to front_end/panels/issues/CorsIssueDetailsView.ts
index fc9224e..64a78c2 100644
--- a/front_end/issues/CorsIssueDetailsView.ts
+++ b/front_end/panels/issues/CorsIssueDetailsView.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 import {AffectedResourcesView} from './AffectedResourcesView.js';
 import {AggregatedIssue} from './IssueAggregator.js';
@@ -52,7 +52,7 @@
   */
   initiatorContext: 'Initiator Context',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/CorsIssueDetailsView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/CorsIssueDetailsView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 export class CorsIssueDetailsView extends AffectedResourcesView {
diff --git a/front_end/issues/IssueAggregator.ts b/front_end/panels/issues/IssueAggregator.ts
similarity index 97%
rename from front_end/issues/IssueAggregator.ts
rename to front_end/panels/issues/IssueAggregator.ts
index f9b3603..b5d3944 100644
--- a/front_end/issues/IssueAggregator.ts
+++ b/front_end/panels/issues/IssueAggregator.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as Common from '../core/common/common.js';
-import * as SDK from '../core/sdk/sdk.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
+import * as Common from '../../core/common/common.js';
+import * as SDK from '../../core/sdk/sdk.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 
 /**
  * An `AggregatedIssue` representes a number of `IssuesManager.Issue.Issue` objects that are displayed together.
diff --git a/front_end/issues/IssueRevealer.ts b/front_end/panels/issues/IssueRevealer.ts
similarity index 85%
rename from front_end/issues/IssueRevealer.ts
rename to front_end/panels/issues/IssueRevealer.ts
index 9dfd332..d338052 100644
--- a/front_end/issues/IssueRevealer.ts
+++ b/front_end/panels/issues/IssueRevealer.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import type * as Common from '../core/common/common.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as UI from '../ui/legacy/legacy.js';
+import type * as Common from '../../core/common/common.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as UI from '../../ui/legacy/legacy.js';
 import {IssuesPane} from './IssuesPane.js';
 
 let issueRevealerInstance: IssueRevealer;
diff --git a/front_end/issues/IssueView.ts b/front_end/panels/issues/IssueView.ts
similarity index 95%
rename from front_end/issues/IssueView.ts
rename to front_end/panels/issues/IssueView.ts
index 187b304..3851042 100644
--- a/front_end/issues/IssueView.ts
+++ b/front_end/panels/issues/IssueView.ts
@@ -4,22 +4,22 @@
 
 /* eslint-disable rulesdir/no_underscored_properties */
 
-import '../ui/components/icon_button/icon_button.js';
-import '../ui/components/markdown_view/markdown_view.js';
+import '../../ui/components/icon_button/icon_button.js';
+import '../../ui/components/markdown_view/markdown_view.js';
 
-import * as Components from '../components/components.js';
-import * as Common from '../core/common/common.js';
-import * as Host from '../core/host/host.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as Platform from '../core/platform/platform.js';
-import * as SDK from '../core/sdk/sdk.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as ConsoleCounters from '../panels/console_counters/console_counters.js';
-import * as Elements from '../panels/elements/elements.js';
-import * as Network from '../panels/network/network.js';
-import * as IconButton from '../ui/components/icon_button/icon_button.js';
-import * as MarkdownView from '../ui/components/markdown_view/markdown_view.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as Components from '../../components/components.js';
+import * as Common from '../../core/common/common.js';
+import * as Host from '../../core/host/host.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as Platform from '../../core/platform/platform.js';
+import * as SDK from '../../core/sdk/sdk.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as IconButton from '../../ui/components/icon_button/icon_button.js';
+import * as MarkdownView from '../../ui/components/markdown_view/markdown_view.js';
+import * as UI from '../../ui/legacy/legacy.js';
+import * as ConsoleCounters from '../console_counters/console_counters.js';
+import * as Elements from '../elements/elements.js';
+import * as Network from '../network/network.js';
 
 import {AffectedBlockedByResponseView} from './AffectedBlockedByResponseView.js';
 import {AffectedCookiesView} from './AffectedCookiesView.js';
@@ -109,7 +109,7 @@
  */
   automaticallyUpgraded: 'automatically upgraded',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/IssueView.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/IssueView.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 class AffectedDirectivesView extends AffectedResourcesView {
diff --git a/front_end/issues/IssuesPane.ts b/front_end/panels/issues/IssuesPane.ts
similarity index 95%
rename from front_end/issues/IssuesPane.ts
rename to front_end/panels/issues/IssuesPane.ts
index f624846..7b2e320 100644
--- a/front_end/issues/IssuesPane.ts
+++ b/front_end/panels/issues/IssuesPane.ts
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as Common from '../core/common/common.js';
-import * as i18n from '../core/i18n/i18n.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as ConsoleCounters from '../panels/console_counters/console_counters.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as Common from '../../core/common/common.js';
+import * as i18n from '../../core/i18n/i18n.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as UI from '../../ui/legacy/legacy.js';
+import * as ConsoleCounters from '../console_counters/console_counters.js';
 
 import type {AggregatedIssue} from './IssueAggregator.js';
 import {Events as IssueAggregatorEvents, IssueAggregator} from './IssueAggregator.js';
@@ -77,7 +77,7 @@
    */
   noIssuesDetectedSoFar: 'No issues detected so far',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/IssuesPane.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/IssuesPane.ts', UIStrings);
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 
 class IssueCategoryView extends UI.TreeOutline.TreeElement {
@@ -151,7 +151,7 @@
 
   private constructor() {
     super(true);
-    this.registerRequiredCSS('issues/issuesPane.css', {enableLegacyPatching: false});
+    this.registerRequiredCSS('panels/issues/issuesPane.css', {enableLegacyPatching: false});
     this.contentElement.classList.add('issues-pane');
 
     this.categoryViews = new Map();
@@ -161,7 +161,7 @@
     this.createToolbars();
 
     this.issuesTree = new UI.TreeOutline.TreeOutlineInShadow();
-    this.issuesTree.registerRequiredCSS('issues/issuesTree.css', {enableLegacyPatching: false});
+    this.issuesTree.registerRequiredCSS('panels/issues/issuesTree.css', {enableLegacyPatching: false});
     this.issuesTree.setShowSelectionOnKeyboardFocus(true);
     this.issuesTree.contentElement.classList.add('issues');
     this.contentElement.appendChild(this.issuesTree.element);
diff --git a/front_end/issues/OWNERS b/front_end/panels/issues/OWNERS
similarity index 100%
rename from front_end/issues/OWNERS
rename to front_end/panels/issues/OWNERS
diff --git a/front_end/issues/cspViolationsListView.css b/front_end/panels/issues/cspViolationsListView.css
similarity index 100%
rename from front_end/issues/cspViolationsListView.css
rename to front_end/panels/issues/cspViolationsListView.css
diff --git a/front_end/issues/cspViolationsView.css b/front_end/panels/issues/cspViolationsView.css
similarity index 100%
rename from front_end/issues/cspViolationsView.css
rename to front_end/panels/issues/cspViolationsView.css
diff --git a/front_end/issues/issues-legacy.ts b/front_end/panels/issues/issues-legacy.ts
similarity index 100%
rename from front_end/issues/issues-legacy.ts
rename to front_end/panels/issues/issues-legacy.ts
diff --git a/front_end/issues/issues-meta.ts b/front_end/panels/issues/issues-meta.ts
similarity index 83%
rename from front_end/issues/issues-meta.ts
rename to front_end/panels/issues/issues-meta.ts
index bff0383..012f36e 100644
--- a/front_end/issues/issues-meta.ts
+++ b/front_end/panels/issues/issues-meta.ts
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import * as Common from '../core/common/common.js';
-import * as Root from '../core/root/root.js';
-import * as IssuesManager from '../models/issues_manager/issues_manager.js';
-import * as UI from '../ui/legacy/legacy.js';
+import * as Common from '../../core/common/common.js';
+import * as Root from '../../core/root/root.js';
+import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 // eslint-disable-next-line rulesdir/es_modules_import
 import type * as Issues from './issues.js';
 
-import * as i18n from '../core/i18n/i18n.js';
+import * as i18n from '../../core/i18n/i18n.js';
 const UIStrings = {
   /**
   *@description Label for the issues pane
@@ -29,14 +29,14 @@
   */
   showCspViolations: 'Show CSP Violations',
 };
-const str_ = i18n.i18n.registerUIStrings('issues/issues-meta.ts', UIStrings);
+const str_ = i18n.i18n.registerUIStrings('panels/issues/issues-meta.ts', UIStrings);
 const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
 let loadedIssuesModule: (typeof Issues|undefined);
 
 async function loadIssuesModule(): Promise<typeof Issues> {
   if (!loadedIssuesModule) {
     // Side-effect import resources in module.json
-    await Root.Runtime.Runtime.instance().loadModulePromise('issues');
+    await Root.Runtime.Runtime.instance().loadModulePromise('panels/issues');
     loadedIssuesModule = await import('./issues.js');
   }
   return loadedIssuesModule;
diff --git a/front_end/issues/issues.ts b/front_end/panels/issues/issues.ts
similarity index 100%
rename from front_end/issues/issues.ts
rename to front_end/panels/issues/issues.ts
diff --git a/front_end/issues/issuesPane.css b/front_end/panels/issues/issuesPane.css
similarity index 100%
rename from front_end/issues/issuesPane.css
rename to front_end/panels/issues/issuesPane.css
diff --git a/front_end/issues/issuesTree.css b/front_end/panels/issues/issuesTree.css
similarity index 100%
rename from front_end/issues/issuesTree.css
rename to front_end/panels/issues/issuesTree.css
diff --git a/front_end/issues/module.json b/front_end/panels/issues/module.json
similarity index 100%
rename from front_end/issues/module.json
rename to front_end/panels/issues/module.json
diff --git a/test/unittests/front_end/issues/BUILD.gn b/test/unittests/front_end/issues/BUILD.gn
index 4274420..5bd7179 100644
--- a/test/unittests/front_end/issues/BUILD.gn
+++ b/test/unittests/front_end/issues/BUILD.gn
@@ -11,7 +11,7 @@
   deps = [
     "../../../../front_end/core/host:bundle",
     "../../../../front_end/core/sdk:bundle",
-    "../../../../front_end/issues:bundle",
+    "../../../../front_end/panels/issues:bundle",
     "../helpers",
     "../issues_manager",
     "../sdk",
diff --git a/test/unittests/front_end/issues/IssueAggregator_test.ts b/test/unittests/front_end/issues/IssueAggregator_test.ts
index 843f2ea..a8fdf2a 100644
--- a/test/unittests/front_end/issues/IssueAggregator_test.ts
+++ b/test/unittests/front_end/issues/IssueAggregator_test.ts
@@ -4,7 +4,7 @@
 
 const {assert} = chai;
 
-import type * as IssuesModule from '../../../../front_end/issues/issues.js';
+import type * as IssuesModule from '../../../../front_end/panels/issues/issues.js';
 import type * as IssuesManagerModule from '../../../../front_end/models/issues_manager/issues_manager.js';
 import type * as SDKModule from '../../../../front_end/core/sdk/sdk.js';
 import {describeWithEnvironment} from '../helpers/EnvironmentHelpers.js';
@@ -15,7 +15,7 @@
 describeWithEnvironment('AggregatedIssue', async () => {
   let Issues: typeof IssuesModule;
   before(async () => {
-    Issues = await import('../../../../front_end/issues/issues.js');
+    Issues = await import('../../../../front_end/panels/issues/issues.js');
   });
 
   it('deduplicates network requests across issues', () => {
@@ -49,7 +49,7 @@
   let IssuesManager: typeof IssuesManagerModule;
   let Issues: typeof IssuesModule;
   before(async () => {
-    Issues = await import('../../../../front_end/issues/issues.js');
+    Issues = await import('../../../../front_end/panels/issues/issues.js');
     IssuesManager = await import('../../../../front_end/models/issues_manager/issues_manager.js');
   });
 
@@ -165,7 +165,7 @@
   let IssuesManager: typeof IssuesManagerModule;
   before(async () => {
     IssuesManager = await import('../../../../front_end/models/issues_manager/issues_manager.js');
-    Issues = await import('../../../../front_end/issues/issues.js');
+    Issues = await import('../../../../front_end/panels/issues/issues.js');
   });
 
   it('aggregates heavy ad issues correctly', () => {
diff --git a/test/unittests/front_end/issues/LowContrastIssuesAggregation_test.ts b/test/unittests/front_end/issues/LowContrastIssuesAggregation_test.ts
index 559160e..d217944 100644
--- a/test/unittests/front_end/issues/LowContrastIssuesAggregation_test.ts
+++ b/test/unittests/front_end/issues/LowContrastIssuesAggregation_test.ts
@@ -4,7 +4,7 @@
 
 const {assert} = chai;
 
-import type * as IssuesModule from '../../../../front_end/issues/issues.js';
+import type * as IssuesModule from '../../../../front_end/panels/issues/issues.js';
 import type * as IssuesManagerModule from '../../../../front_end/models/issues_manager/issues_manager.js';
 import type * as SDKModule from '../../../../front_end/core/sdk/sdk.js';
 import {describeWithEnvironment} from '../helpers/EnvironmentHelpers.js';
@@ -15,7 +15,7 @@
   let Issues: typeof IssuesModule;
   let IssuesManager: typeof IssuesManagerModule;
   before(async () => {
-    Issues = await import('../../../../front_end/issues/issues.js');
+    Issues = await import('../../../../front_end/panels/issues/issues.js');
     IssuesManager = await import('../../../../front_end/models/issues_manager/issues_manager.js');
   });
 
diff --git a/test/unittests/front_end/issues/TrustedWebActivityIssuesAggregation_test.ts b/test/unittests/front_end/issues/TrustedWebActivityIssuesAggregation_test.ts
index 1929e01..8edbc6b 100644
--- a/test/unittests/front_end/issues/TrustedWebActivityIssuesAggregation_test.ts
+++ b/test/unittests/front_end/issues/TrustedWebActivityIssuesAggregation_test.ts
@@ -4,7 +4,7 @@
 
 const {assert} = chai;
 
-import type * as IssuesModule from '../../../../front_end/issues/issues.js';
+import type * as IssuesModule from '../../../../front_end/panels/issues/issues.js';
 import type * as IssuesManagerModule from '../../../../front_end/models/issues_manager/issues_manager.js';
 import type * as SDKModule from '../../../../front_end/core/sdk/sdk.js';
 import {describeWithEnvironment} from '../helpers/EnvironmentHelpers.js';
@@ -15,7 +15,7 @@
   let IssuesManager: typeof IssuesManagerModule;
   let Issues: typeof IssuesModule;
   before(async () => {
-    Issues = await import('../../../../front_end/issues/issues.js');
+    Issues = await import('../../../../front_end/panels/issues/issues.js');
     IssuesManager = await import('../../../../front_end/models/issues_manager/issues_manager.js');
   });