diff --git a/app/assets/javascripts/ci/pipeline_details/components/jobs_shared/action_component.vue b/app/assets/javascripts/ci/common/private/job_action_component.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/jobs_shared/action_component.vue
rename to app/assets/javascripts/ci/common/private/job_action_component.vue
index ffb6ab71b222c31795e20bdcaed82724de3db33f..f649750ce8abaa0a1aaf6ac42ed7ba3814a2d9b5 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/jobs_shared/action_component.vue
+++ b/app/assets/javascripts/ci/common/private/job_action_component.vue
@@ -5,7 +5,7 @@ import axios from '~/lib/utils/axios_utils';
 import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
 import { dasherize } from '~/lib/utils/text_utility';
 import { __ } from '~/locale';
-import { reportToSentry } from '../../utils';
+import { reportToSentry } from '~/ci/utils';
 
 /**
  * Renders either a cancel, retry or play icon button and handles the post request
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_layer.vue b/app/assets/javascripts/ci/common/private/job_links_layer.vue
similarity index 88%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_layer.vue
rename to app/assets/javascripts/ci/common/private/job_links_layer.vue
index ef24694e494b274de1ae50a049e8a963ca7d0629..59260ca3f8167807706ebc8f0b47103082f23622 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_layer.vue
+++ b/app/assets/javascripts/ci/common/private/job_links_layer.vue
@@ -1,8 +1,8 @@
 <script>
 import { memoize } from 'lodash';
-import { reportToSentry } from '../../utils';
-import { parseData } from '../parsing_utils';
-import LinksInner from './links_inner.vue';
+import { reportToSentry } from '~/ci/utils';
+import { parseData } from '~/ci/pipeline_details/utils/parsing_utils';
+import LinksInner from '~/ci/pipeline_details/graph/components/links_inner.vue';
 
 const parseForLinksBare = (pipeline) => {
   const arrayOfJobs = pipeline.flatMap(({ groups }) => groups);
diff --git a/app/assets/javascripts/ci/pipeline_details/components/jobs_shared/job_name_component.vue b/app/assets/javascripts/ci/common/private/job_name_component.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/jobs_shared/job_name_component.vue
rename to app/assets/javascripts/ci/common/private/job_name_component.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/mutations/retry_mr_failed_job.mutation.graphql b/app/assets/javascripts/ci/merge_requests/graphql/mutations/retry_mr_failed_job.mutation.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/mutations/retry_mr_failed_job.mutation.graphql
rename to app/assets/javascripts/ci/merge_requests/graphql/mutations/retry_mr_failed_job.mutation.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_merge_request_pipelines.query.graphql b/app/assets/javascripts/ci/merge_requests/graphql/queries/get_merge_request_pipelines.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_merge_request_pipelines.query.graphql
rename to app/assets/javascripts/ci/merge_requests/graphql/queries/get_merge_request_pipelines.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/dag_annotations.vue b/app/assets/javascripts/ci/pipeline_details/dag/components/dag_annotations.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/dag_annotations.vue
rename to app/assets/javascripts/ci/pipeline_details/dag/components/dag_annotations.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/dag_graph.vue b/app/assets/javascripts/ci/pipeline_details/dag/components/dag_graph.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/dag_graph.vue
rename to app/assets/javascripts/ci/pipeline_details/dag/components/dag_graph.vue
index 7646c11773c9f291a3bfeea2f5168172f35ce378..67e80145e8360d72387adb892fab92bd146b2bf8 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/dag/dag_graph.vue
+++ b/app/assets/javascripts/ci/pipeline_details/dag/components/dag_graph.vue
@@ -1,10 +1,10 @@
 <script>
 import * as d3 from 'd3';
 import { uniqueId } from 'lodash';
+import { getMaxNodes, removeOrphanNodes } from '~/ci/pipeline_details/utils/parsing_utils';
 import { PARSE_FAILURE } from '../../constants';
-import { getMaxNodes, removeOrphanNodes } from '../parsing_utils';
-import { LINK_SELECTOR, NODE_SELECTOR, ADD_NOTE, REMOVE_NOTE, REPLACE_NOTES } from './constants';
-import { calculateClip, createLinkPath, createSankey, labelPosition } from './drawing_utils';
+import { LINK_SELECTOR, NODE_SELECTOR, ADD_NOTE, REMOVE_NOTE, REPLACE_NOTES } from '../constants';
+import { calculateClip, createLinkPath, createSankey, labelPosition } from '../drawing_utils';
 import {
   currentIsLive,
   getLiveLinksAsDict,
@@ -12,7 +12,7 @@ import {
   restoreLinks,
   toggleLinkHighlight,
   togglePathHighlights,
-} from './interactions';
+} from '../interactions';
 
 export default {
   viewOptions: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/constants.js b/app/assets/javascripts/ci/pipeline_details/dag/constants.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/constants.js
rename to app/assets/javascripts/ci/pipeline_details/dag/constants.js
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/dag.vue b/app/assets/javascripts/ci/pipeline_details/dag/dag.vue
similarity index 94%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/dag.vue
rename to app/assets/javascripts/ci/pipeline_details/dag/dag.vue
index afb5aa050987084e7389e67edc9410729afcf54b..5415340c956c05a968ec5fb2c768dad2187b2165 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/dag/dag.vue
+++ b/app/assets/javascripts/ci/pipeline_details/dag/dag.vue
@@ -4,12 +4,17 @@ import { GlAlert, GlButton, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
 import { isEmpty } from 'lodash';
 import { fetchPolicies } from '~/lib/graphql';
 import { __ } from '~/locale';
-import { DEFAULT, PARSE_FAILURE, LOAD_FAILURE, UNSUPPORTED_DATA } from '../../constants';
-import getDagVisData from '../../graphql/queries/get_dag_vis_data.query.graphql';
-import { parseData } from '../parsing_utils';
+import {
+  DEFAULT,
+  PARSE_FAILURE,
+  LOAD_FAILURE,
+  UNSUPPORTED_DATA,
+} from '~/ci/pipeline_details/constants';
+import { parseData } from '~/ci/pipeline_details/utils/parsing_utils';
+import getDagVisData from './graphql/queries/get_dag_vis_data.query.graphql';
 import { ADD_NOTE, REMOVE_NOTE, REPLACE_NOTES } from './constants';
-import DagAnnotations from './dag_annotations.vue';
-import DagGraph from './dag_graph.vue';
+import DagAnnotations from './components/dag_annotations.vue';
+import DagGraph from './components/dag_graph.vue';
 
 export default {
   // eslint-disable-next-line @gitlab/require-i18n-strings
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/drawing_utils.js b/app/assets/javascripts/ci/pipeline_details/dag/drawing_utils.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/drawing_utils.js
rename to app/assets/javascripts/ci/pipeline_details/dag/drawing_utils.js
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_dag_vis_data.query.graphql b/app/assets/javascripts/ci/pipeline_details/dag/graphql/queries/get_dag_vis_data.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_dag_vis_data.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/dag/graphql/queries/get_dag_vis_data.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/dag/interactions.js b/app/assets/javascripts/ci/pipeline_details/dag/interactions.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/dag/interactions.js
rename to app/assets/javascripts/ci/pipeline_details/dag/interactions.js
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/api.js b/app/assets/javascripts/ci/pipeline_details/graph/api_utils.js
similarity index 86%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/api.js
rename to app/assets/javascripts/ci/pipeline_details/graph/api_utils.js
index 0fe7d9ffda3ddb3344ed145ce85156863b8cf184..f9f47d1ea15a0e6ba703eb8c711144ddf8ccf727 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/api.js
+++ b/app/assets/javascripts/ci/pipeline_details/graph/api_utils.js
@@ -1,5 +1,5 @@
 import axios from '~/lib/utils/axios_utils';
-import { reportToSentry } from '../../utils';
+import { reportToSentry } from '~/ci/utils';
 
 export const reportPerformance = (path, stats) => {
   // FIXME: https://gitlab.com/gitlab-org/gitlab/-/issues/330245
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_component.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/graph_component.vue
similarity index 96%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/graph_component.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/graph_component.vue
index 49df71beeec2cdab0cd7579af610da4f81b0d8d0..f098d790736f4ecd48929237989356b5cff350e6 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_component.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/graph_component.vue
@@ -1,15 +1,15 @@
 <script>
-import { reportToSentry } from '../../utils';
-import LinkedGraphWrapper from '../graph_shared/linked_graph_wrapper.vue';
-import LinksLayer from '../graph_shared/links_layer.vue';
+import { reportToSentry } from '~/ci/utils';
 import {
   generateColumnsFromLayersListMemoized,
   keepLatestDownstreamPipelines,
-} from '../parsing_utils';
-import { DOWNSTREAM, MAIN, UPSTREAM, ONE_COL_WIDTH, STAGE_VIEW } from './constants';
+} from '~/ci/pipeline_details/utils/parsing_utils';
+import LinksLayer from '../../../common/private/job_links_layer.vue';
+import { DOWNSTREAM, MAIN, UPSTREAM, ONE_COL_WIDTH, STAGE_VIEW } from '../constants';
+import { validateConfigPaths } from '../utils';
+import LinkedGraphWrapper from './linked_graph_wrapper.vue';
 import LinkedPipelinesColumn from './linked_pipelines_column.vue';
 import StageColumnComponent from './stage_column_component.vue';
-import { validateConfigPaths } from './utils';
 
 export default {
   name: 'PipelineGraph',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_view_selector.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/graph_view_selector.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/graph_view_selector.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/graph_view_selector.vue
index 73143c981ed8b1f96a17261c1b374e7a7fb73c9b..fb7dcb300f1179bcfe83c9c7c9b3868bf8e38f0a 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_view_selector.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/graph_view_selector.vue
@@ -1,7 +1,7 @@
 <script>
 import { GlAlert, GlButton, GlButtonGroup, GlLoadingIcon, GlToggle } from '@gitlab/ui';
 import { __, s__ } from '~/locale';
-import { STAGE_VIEW, LAYER_VIEW } from './constants';
+import { STAGE_VIEW, LAYER_VIEW } from '../constants';
 
 export default {
   name: 'GraphViewSelector',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/job_group_dropdown.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/job_group_dropdown.vue
similarity index 96%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/job_group_dropdown.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/job_group_dropdown.vue
index d4852224df5be986489f68ab3c8e3adcf414f726..7538ad87af8650d2e19ef6aa0010e7a6e43f67e4 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/job_group_dropdown.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/job_group_dropdown.vue
@@ -1,6 +1,6 @@
 <script>
-import { reportToSentry } from '../../utils';
-import { JOB_DROPDOWN, SINGLE_JOB } from './constants';
+import { reportToSentry } from '~/ci/utils';
+import { JOB_DROPDOWN, SINGLE_JOB } from '../constants';
 import JobItem from './job_item.vue';
 
 /**
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/job_item.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/job_item.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
index 22895a310827d2e86f9d5f7f889c4f85b1b5464e..bab05d0c232d6d07147c9b36709f813c9cd87a15 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/job_item.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
@@ -1,14 +1,14 @@
 <script>
 import { GlBadge, GlForm, GlFormCheckbox, GlLink, GlModal, GlTooltipDirective } from '@gitlab/ui';
+import { reportToSentry } from '~/ci/utils';
 import delayedJobMixin from '~/jobs/mixins/delayed_job_mixin';
 import { helpPagePath } from '~/helpers/help_page_helper';
 import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
 import { __, s__, sprintf } from '~/locale';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import { reportToSentry } from '../../utils';
-import ActionComponent from '../jobs_shared/action_component.vue';
-import JobNameComponent from '../jobs_shared/job_name_component.vue';
-import { BRIDGE_KIND, RETRY_ACTION_TITLE, SINGLE_JOB, SKIP_RETRY_MODAL_KEY } from './constants';
+import ActionComponent from '../../../common/private/job_action_component.vue';
+import JobNameComponent from '../../../common/private/job_name_component.vue';
+import { BRIDGE_KIND, RETRY_ACTION_TITLE, SINGLE_JOB, SKIP_RETRY_MODAL_KEY } from '../constants';
 
 /**
  * Renders the badge for the pipeline graph and the job's dropdown.
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/linked_graph_wrapper.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_graph_wrapper.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/linked_graph_wrapper.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/linked_graph_wrapper.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipeline.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipeline.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue
index 8aa49e037185dfc8c0a55760364b28eb14f407a8..cc52ff57c132d001e4faf67bd15f8c8f1a6c236b 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipeline.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue
@@ -14,8 +14,8 @@ import { __, sprintf } from '~/locale';
 import CancelPipelineMutation from '~/ci/pipeline_details/graphql/mutations/cancel_pipeline.mutation.graphql';
 import RetryPipelineMutation from '~/ci/pipeline_details/graphql/mutations/retry_pipeline.mutation.graphql';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import { reportToSentry } from '../../utils';
-import { ACTION_FAILURE, DOWNSTREAM, UPSTREAM } from './constants';
+import { reportToSentry } from '~/ci/utils';
+import { ACTION_FAILURE, DOWNSTREAM, UPSTREAM } from '../constants';
 
 export default {
   directives: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipelines_column.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipelines_column.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipelines_column.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipelines_column.vue
index 02e426064c9474dbc7ba4ffb2df8c232ae034944..2de7e43c9b1eb4b62f6ea5ccab1caca9e6efae08 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipelines_column.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipelines_column.vue
@@ -1,9 +1,8 @@
 <script>
 import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
+import { reportToSentry } from '~/ci/utils';
 import { LOAD_FAILURE } from '../../constants';
-import { reportToSentry } from '../../utils';
-import { ONE_COL_WIDTH, UPSTREAM, LAYER_VIEW, STAGE_VIEW } from './constants';
-import LinkedPipeline from './linked_pipeline.vue';
+import { ONE_COL_WIDTH, UPSTREAM, LAYER_VIEW, STAGE_VIEW } from '../constants';
 import {
   calculatePipelineLayersInfo,
   getQueryHeaders,
@@ -11,7 +10,8 @@ import {
   toggleQueryPollingByVisibility,
   unwrapPipelineData,
   validateConfigPaths,
-} from './utils';
+} from '../utils';
+import LinkedPipeline from './linked_pipeline.vue';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_inner.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/links_inner.vue
similarity index 93%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_inner.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/links_inner.vue
index 1189c2ebad8be0551239453ec6d10e9541f91da2..09285525c3827282b68d44421d98221ebc0f8d42 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/links_inner.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/links_inner.vue
@@ -1,9 +1,10 @@
 <script>
 import { isEmpty } from 'lodash';
+import { STAGE_VIEW } from '~/ci/pipeline_details/graph/constants';
+import { createJobsHash, generateJobNeedsDict } from '~/ci/pipeline_details/utils';
+import { reportToSentry } from '~/ci/utils';
 import { DRAW_FAILURE } from '../../constants';
-import { createJobsHash, generateJobNeedsDict, reportToSentry } from '../../utils';
-import { STAGE_VIEW } from '../graph/constants';
-import { generateLinksData } from './drawing_utils';
+import { generateLinksData } from '../../utils/drawing_utils';
 
 export default {
   name: 'LinksInner',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/main_graph_wrapper.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/root_graph_layout.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/main_graph_wrapper.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/root_graph_layout.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/stage_column_component.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/stage_column_component.vue
similarity index 94%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/stage_column_component.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/components/stage_column_component.vue
index ffd0fec2ca81682fd4250163c46c798ddd08665d..1401bdba5ca21a890b1138a394094a27193a759b 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/stage_column_component.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/stage_column_component.vue
@@ -1,9 +1,9 @@
 <script>
 import { escape, isEmpty } from 'lodash';
+import ActionComponent from '~/ci/common/private/job_action_component.vue';
 import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { reportToSentry } from '../../utils';
-import MainGraphWrapper from '../graph_shared/main_graph_wrapper.vue';
-import ActionComponent from '../jobs_shared/action_component.vue';
+import { reportToSentry } from '~/ci/utils';
+import RootGraphLayout from './root_graph_layout.vue';
 import JobGroupDropdown from './job_group_dropdown.vue';
 import JobItem from './job_item.vue';
 
@@ -12,7 +12,7 @@ export default {
     ActionComponent,
     JobGroupDropdown,
     JobItem,
-    MainGraphWrapper,
+    RootGraphLayout,
   },
   mixins: [glFeatureFlagMixin()],
   props: {
@@ -135,7 +135,7 @@ export default {
 };
 </script>
 <template>
-  <main-graph-wrapper :class="columnSpacingClass" data-testid="stage-column">
+  <root-graph-layout :class="columnSpacingClass" data-testid="stage-column">
     <template #stages>
       <div
         data-testid="stage-column-title"
@@ -192,5 +192,5 @@ export default {
         </div>
       </div>
     </template>
-  </main-graph-wrapper>
+  </root-graph-layout>
 </template>
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/constants.js b/app/assets/javascripts/ci/pipeline_details/graph/constants.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/constants.js
rename to app/assets/javascripts/ci/pipeline_details/graph/constants.js
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_component_wrapper.vue b/app/assets/javascripts/ci/pipeline_details/graph/graph_component_wrapper.vue
similarity index 95%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/graph_component_wrapper.vue
rename to app/assets/javascripts/ci/pipeline_details/graph/graph_component_wrapper.vue
index b2cef7c37b98b76305de0c5f6637110cb8956b71..bd7325f7925189c2963f76b5eef8c94a3bcd5cb5 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/graph_component_wrapper.vue
@@ -4,10 +4,10 @@ import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.qu
 import getUserCallouts from '~/graphql_shared/queries/get_user_callouts.query.graphql';
 import { __, s__ } from '~/locale';
 import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '../../constants';
-import DismissPipelineGraphCallout from '../../graphql/mutations/dismiss_pipeline_notification.graphql';
-import getPipelineQuery from '../../graphql/queries/get_pipeline_header_data.query.graphql';
-import { reportToSentry, reportMessageToSentry } from '../../utils';
+import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '~/ci/pipeline_details/constants';
+import getPipelineQuery from '~/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql';
+import { reportToSentry, reportMessageToSentry } from '~/ci/utils';
+import DismissPipelineGraphCallout from './graphql/mutations/dismiss_pipeline_notification.graphql';
 import {
   ACTION_FAILURE,
   IID_FAILURE,
@@ -16,8 +16,8 @@ import {
   STAGE_VIEW,
   VIEW_TYPE_KEY,
 } from './constants';
-import PipelineGraph from './graph_component.vue';
-import GraphViewSelector from './graph_view_selector.vue';
+import PipelineGraph from './components/graph_component.vue';
+import GraphViewSelector from './components/graph_view_selector.vue';
 import {
   calculatePipelineLayersInfo,
   getQueryHeaders,
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/mutations/dismiss_pipeline_notification.graphql b/app/assets/javascripts/ci/pipeline_details/graph/graphql/mutations/dismiss_pipeline_notification.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/mutations/dismiss_pipeline_notification.graphql
rename to app/assets/javascripts/ci/pipeline_details/graph/graphql/mutations/dismiss_pipeline_notification.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/perf_utils.js b/app/assets/javascripts/ci/pipeline_details/graph/perf_utils.js
similarity index 96%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/perf_utils.js
rename to app/assets/javascripts/ci/pipeline_details/graph/perf_utils.js
index 3737a209f5c5c086bd8b3a45233b6f83dcc30503..511dcbe68899a77eff3b98c475b0ca08f5b1a37f 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/perf_utils.js
+++ b/app/assets/javascripts/ci/pipeline_details/graph/perf_utils.js
@@ -8,7 +8,7 @@ import {
 } from '~/performance/constants';
 
 import { performanceMarkAndMeasure } from '~/performance/utils';
-import { reportPerformance } from '../graph_shared/api';
+import { reportPerformance } from './api_utils';
 
 export const beginPerfMeasure = () => {
   performanceMarkAndMeasure({ mark: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START });
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph/utils.js b/app/assets/javascripts/ci/pipeline_details/graph/utils.js
similarity index 93%
rename from app/assets/javascripts/ci/pipeline_details/components/graph/utils.js
rename to app/assets/javascripts/ci/pipeline_details/graph/utils.js
index c888c8a553755ba2c492844ef66e86e965348a00..9a8d6440d4df2932673cf3a0a13f752d57005fd1 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/graph/utils.js
+++ b/app/assets/javascripts/ci/pipeline_details/graph/utils.js
@@ -1,8 +1,9 @@
 import { isEmpty } from 'lodash';
 import { getIdFromGraphQLId, etagQueryHeaders } from '~/graphql_shared/utils';
-import { reportToSentry } from '../../utils';
-import { listByLayers } from '../parsing_utils';
-import { unwrapStagesWithNeedsAndLookup } from '../unwrapping_utils';
+import { reportToSentry } from '~/ci/utils';
+
+import { listByLayers } from '~/ci/pipeline_details/utils/parsing_utils';
+import { unwrapStagesWithNeedsAndLookup } from '~/ci/pipeline_details/utils/unwrapping_utils';
 import { beginPerfMeasure, finishPerfMeasureAndSend } from './perf_utils';
 
 export { toggleQueryPollingByVisibility } from '~/graphql_shared/utils';
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql b/app/assets/javascripts/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_details_header.vue b/app/assets/javascripts/ci/pipeline_details/header/pipeline_details_header.vue
similarity index 99%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_details_header.vue
rename to app/assets/javascripts/ci/pipeline_details/header/pipeline_details_header.vue
index 98798d3b8ad05aaf459918115532051f615b8348..4a15f5b581a77bce3033e2727c8a06832cd0ca59 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_details_header.vue
+++ b/app/assets/javascripts/ci/pipeline_details/header/pipeline_details_header.vue
@@ -30,8 +30,8 @@ import {
 import cancelPipelineMutation from '../graphql/mutations/cancel_pipeline.mutation.graphql';
 import deletePipelineMutation from '../graphql/mutations/delete_pipeline.mutation.graphql';
 import retryPipelineMutation from '../graphql/mutations/retry_pipeline.mutation.graphql';
-import getPipelineQuery from '../graphql/queries/get_pipeline_header_data.query.graphql';
-import { getQueryHeaders } from './graph/utils';
+import { getQueryHeaders } from '../graph/utils';
+import getPipelineQuery from './graphql/queries/get_pipeline_header_data.query.graphql';
 
 const DELETE_MODAL_ID = 'pipeline-delete-modal';
 const POLL_INTERVAL = 10000;
diff --git a/app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_table.vue b/app/assets/javascripts/ci/pipeline_details/jobs/components/failed_jobs_table.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_table.vue
rename to app/assets/javascripts/ci/pipeline_details/jobs/components/failed_jobs_table.vue
index f84ae13180d50c96d92709e9c4d900211487db83..98431bd1fcc2132d552b42f3fb1f924b96bbbf39 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_table.vue
+++ b/app/assets/javascripts/ci/pipeline_details/jobs/components/failed_jobs_table.vue
@@ -6,7 +6,7 @@ import { createAlert } from '~/alert';
 import Tracking from '~/tracking';
 import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
 import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
-import RetryFailedJobMutation from '../../graphql/mutations/retry_failed_job.mutation.graphql';
+import RetryFailedJobMutation from '../graphql/mutations/retry_failed_job.mutation.graphql';
 import { DEFAULT_FIELDS, TRACKING_CATEGORIES } from '../../constants';
 
 export default {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_app.vue b/app/assets/javascripts/ci/pipeline_details/jobs/failed_jobs_app.vue
similarity index 89%
rename from app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_app.vue
rename to app/assets/javascripts/ci/pipeline_details/jobs/failed_jobs_app.vue
index c24862f828b9d59b13eaf8954bac21f923c0eef8..b946a40e590102048411c863346edb0ed3d6f9ae 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/jobs/failed_jobs_app.vue
+++ b/app/assets/javascripts/ci/pipeline_details/jobs/failed_jobs_app.vue
@@ -2,8 +2,8 @@
 import { GlLoadingIcon } from '@gitlab/ui';
 import { s__ } from '~/locale';
 import { createAlert } from '~/alert';
-import GetFailedJobsQuery from '../../graphql/queries/get_failed_jobs.query.graphql';
-import FailedJobsTable from './failed_jobs_table.vue';
+import GetFailedJobsQuery from './graphql/queries/get_failed_jobs.query.graphql';
+import FailedJobsTable from './components/failed_jobs_table.vue';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/mutations/retry_failed_job.mutation.graphql b/app/assets/javascripts/ci/pipeline_details/jobs/graphql/mutations/retry_failed_job.mutation.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/mutations/retry_failed_job.mutation.graphql
rename to app/assets/javascripts/ci/pipeline_details/jobs/graphql/mutations/retry_failed_job.mutation.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_failed_jobs.query.graphql b/app/assets/javascripts/ci/pipeline_details/jobs/graphql/queries/get_failed_jobs.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_failed_jobs.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/jobs/graphql/queries/get_failed_jobs.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_jobs.query.graphql b/app/assets/javascripts/ci/pipeline_details/jobs/graphql/queries/get_pipeline_jobs.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_jobs.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/jobs/graphql/queries/get_pipeline_jobs.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/jobs/jobs_app.vue b/app/assets/javascripts/ci/pipeline_details/jobs/jobs_app.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/jobs/jobs_app.vue
rename to app/assets/javascripts/ci/pipeline_details/jobs/jobs_app.vue
index 6174886098360a1cd21ba0f70f7022b4b351a4f7..7a09dd27ad8fa0c3e3c223cae8ef5fecf1eaaa93 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/jobs/jobs_app.vue
+++ b/app/assets/javascripts/ci/pipeline_details/jobs/jobs_app.vue
@@ -6,7 +6,7 @@ import { __ } from '~/locale';
 import eventHub from '~/jobs/components/table/event_hub';
 import JobsTable from '~/jobs/components/table/jobs_table.vue';
 import { JOBS_TAB_FIELDS } from '~/jobs/components/table/constants';
-import getPipelineJobs from '../../graphql/queries/get_pipeline_jobs.query.graphql';
+import getPipelineJobs from './graphql/queries/get_pipeline_jobs.query.graphql';
 
 export default {
   fields: JOBS_TAB_FIELDS,
diff --git a/app/assets/javascripts/ci/pipeline_details/mixins/stage_column_mixin.js b/app/assets/javascripts/ci/pipeline_details/mixins/stage_column_mixin.js
deleted file mode 100644
index 578ff4983584a1beaf3a3aecb75ab8f47fedf8f1..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/ci/pipeline_details/mixins/stage_column_mixin.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default {
-  props: {
-    hasUpstream: {
-      type: Boolean,
-      required: false,
-      default: false,
-    },
-  },
-  methods: {
-    buildConnnectorClass(index) {
-      return index === 0 && (!this.isFirstColumn || this.hasUpstream) ? 'left-connector' : '';
-    },
-  },
-};
diff --git a/app/assets/javascripts/ci/pipeline_details/pipeline_details_header.js b/app/assets/javascripts/ci/pipeline_details/pipeline_details_header.js
index c79aaef23e8bd0a69c9e7b13d727d2f3798d4d50..067ec3f305e49d1c5d19131eea82cf4bd774b27a 100644
--- a/app/assets/javascripts/ci/pipeline_details/pipeline_details_header.js
+++ b/app/assets/javascripts/ci/pipeline_details/pipeline_details_header.js
@@ -1,7 +1,7 @@
 import Vue from 'vue';
 import VueApollo from 'vue-apollo';
 import { parseBoolean } from '~/lib/utils/common_utils';
-import PipelineDetailsHeader from './components/pipeline_details_header.vue';
+import PipelineDetailsHeader from './header/pipeline_details_header.vue';
 
 Vue.use(VueApollo);
 
diff --git a/app/assets/javascripts/ci/pipeline_details/pipeline_tabs.js b/app/assets/javascripts/ci/pipeline_details/pipeline_tabs.js
index 8d4c9d1220ad68b593d7338222f3b5907dce0fa9..0ca9a68e70d51e8f9a7de43192397c8da0cd9bc2 100644
--- a/app/assets/javascripts/ci/pipeline_details/pipeline_tabs.js
+++ b/app/assets/javascripts/ci/pipeline_details/pipeline_tabs.js
@@ -4,10 +4,11 @@ import VueRouter from 'vue-router';
 import Vuex from 'vuex';
 import VueApollo from 'vue-apollo';
 import { GlToast } from '@gitlab/ui';
-import PipelineTabs from 'ee_else_ce/ci/pipeline_details/components/pipeline_tabs.vue';
+import PipelineTabs from 'ee_else_ce/ci/pipeline_details/tabs/pipeline_tabs.vue';
+import { reportToSentry } from '~/ci/utils';
 import { parseBoolean } from '~/lib/utils/common_utils';
 import createTestReportsStore from './stores/test_reports';
-import { getPipelineDefaultTab, reportToSentry } from './utils';
+import { getPipelineDefaultTab } from './utils';
 
 Vue.use(GlToast);
 Vue.use(VueApollo);
diff --git a/app/assets/javascripts/ci/pipeline_details/pipelines_index.js b/app/assets/javascripts/ci/pipeline_details/pipelines_index.js
index 20fd0915e28ec9e30ec70c565261fbf1057f0f82..86b565d7821fc72854a755fe60460bc592f1e514 100644
--- a/app/assets/javascripts/ci/pipeline_details/pipelines_index.js
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_index.js
@@ -10,7 +10,7 @@ import {
 import { doesHashExistInUrl } from '~/lib/utils/url_utility';
 import { __ } from '~/locale';
 import Translate from '~/vue_shared/translate';
-import Pipelines from './components/pipelines_list/pipelines.vue';
+import Pipelines from './pipelines_list/pipelines.vue';
 import PipelinesStore from './stores/pipelines_store';
 
 Vue.use(Translate);
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/nav_controls.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/nav_controls.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/nav_controls.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/nav_controls.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_labels.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_labels.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_labels.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_labels.vue
index f8b4299485e7bed6dbaaa9d95ccc02c670fe5647..082ede6024427964532f587cfecae4b7afb80213 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_labels.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_labels.vue
@@ -1,7 +1,7 @@
 <script>
 import { GlLink, GlPopover, GlSprintf, GlTooltipDirective, GlBadge } from '@gitlab/ui';
 import { helpPagePath } from '~/helpers/help_page_helper';
-import { SCHEDULE_ORIGIN } from '../../constants';
+import { SCHEDULE_ORIGIN } from '~/ci/pipeline_details/constants';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_multi_actions.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_multi_actions.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_multi_actions.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_multi_actions.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue
index caeee7edefe7e1c4736047f1e1070230bd17d025..8f275bee91f9919b13bc8ac8065f733b7f085531 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue
@@ -1,8 +1,8 @@
 <script>
 import { GlButton, GlTooltipDirective, GlModalDirective } from '@gitlab/ui';
 import Tracking from '~/tracking';
-import eventHub from '../../event_hub';
 import { BUTTON_TOOLTIP_RETRY, BUTTON_TOOLTIP_CANCEL, TRACKING_CATEGORIES } from '../../constants';
+import eventHub from '../../event_hub';
 import PipelineMultiActions from './pipeline_multi_actions.vue';
 import PipelinesManualActions from './pipelines_manual_actions.vue';
 
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_stop_modal.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_stop_modal.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_stop_modal.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_stop_modal.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_triggerer.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_triggerer.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_triggerer.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_triggerer.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_url.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_url.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_url.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_artifacts.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_artifacts.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_artifacts.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_filtered_search.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_filtered_search.vue
similarity index 89%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_filtered_search.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_filtered_search.vue
index 7dc1e60610ed7f98b6eacc1a3b8434fac44c0879..6aadb6b73c8c1cfd17b5999de7c152e6110fc7db 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_filtered_search.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_filtered_search.vue
@@ -5,11 +5,11 @@ import { s__ } from '~/locale';
 import Tracking from '~/tracking';
 import { OPERATORS_IS } from '~/vue_shared/components/filtered_search_bar/constants';
 import { TRACKING_CATEGORIES } from '../../constants';
-import PipelineBranchNameToken from './tokens/pipeline_branch_name_token.vue';
-import PipelineSourceToken from './tokens/pipeline_source_token.vue';
-import PipelineStatusToken from './tokens/pipeline_status_token.vue';
-import PipelineTagNameToken from './tokens/pipeline_tag_name_token.vue';
-import PipelineTriggerAuthorToken from './tokens/pipeline_trigger_author_token.vue';
+import PipelineBranchNameToken from '../tokens/pipeline_branch_name_token.vue';
+import PipelineSourceToken from '../tokens/pipeline_source_token.vue';
+import PipelineStatusToken from '../tokens/pipeline_status_token.vue';
+import PipelineTagNameToken from '../tokens/pipeline_tag_name_token.vue';
+import PipelineTriggerAuthorToken from '../tokens/pipeline_trigger_author_token.vue';
 
 export default {
   userType: 'username',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_manual_actions.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_manual_actions.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_manual_actions.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_manual_actions.vue
index 262e82677a74adf6be3ce4027cc47b1f510f236a..4dacd474bdec607e240c445a7d5ef10d0b62432d 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_manual_actions.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_manual_actions.vue
@@ -8,7 +8,7 @@ import Tracking from '~/tracking';
 import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
 import eventHub from '../../event_hub';
 import { TRACKING_CATEGORIES } from '../../constants';
-import getPipelineActionsQuery from '../../graphql/queries/get_pipeline_actions.query.graphql';
+import getPipelineActionsQuery from '../graphql/queries/get_pipeline_actions.query.graphql';
 
 export default {
   name: 'PipelinesManualActions',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_status_badge.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_status_badge.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_status_badge.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_status_badge.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_table.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_table.vue
similarity index 95%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_table.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_table.vue
index 2dadc78b9047398c09b614448a62c9094e344732..9784186ac673f57a28bc144f29c52170b3f2a31a 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_table.vue
@@ -4,9 +4,9 @@ import { cleanLeadingSeparator } from '~/lib/utils/url_utility';
 import { s__, __ } from '~/locale';
 import Tracking from '~/tracking';
 import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/components/parsing_utils';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
-import PipelineFailedJobsWidget from '~/ci/pipeline_details/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
+import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineFailedJobsWidget from '~/ci/pipeline_details/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
 import eventHub from '../../event_hub';
 import { TRACKING_CATEGORIES } from '../../constants';
 import PipelineOperations from './pipeline_operations.vue';
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/time_ago.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/components/time_ago.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/time_ago.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/components/time_ago.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/ci_templates.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/ci_templates.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/ci_templates.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/ci_templates.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/ios_templates.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/ios_templates.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/ios_templates.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/ios_templates.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/no_ci_empty_state.vue
similarity index 89%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/no_ci_empty_state.vue
index 3bbdfc73e1bd13e80019f4a4c8ebe4036213ad30..6e7d6908cd9d52bdc72aa3ab9972e8f2438b0074 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/no_ci_empty_state.vue
@@ -2,8 +2,8 @@
 import { GlEmptyState } from '@gitlab/ui';
 import { s__ } from '~/locale';
 import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-import PipelinesCiTemplates from './empty_state/pipelines_ci_templates.vue';
-import IosTemplates from './empty_state/ios_templates.vue';
+import PipelinesCiTemplates from './pipelines_ci_templates.vue';
+import IosTemplates from './ios_templates.vue';
 
 export default {
   i18n: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/pipelines_ci_templates.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/pipelines_ci_templates.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/empty_state/pipelines_ci_templates.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/empty_state/pipelines_ci_templates.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_job_details.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_job_details.vue
similarity index 96%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_job_details.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_job_details.vue
index edf397f47978c770bcea7cd0d2a271534d1307c8..82f1d57912a9422daaf57fdd051c509c40953401 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_job_details.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_job_details.vue
@@ -5,8 +5,8 @@ import { __, s__, sprintf } from '~/locale';
 import { getIdFromGraphQLId } from '~/graphql_shared/utils';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 import SafeHtml from '~/vue_shared/directives/safe_html';
-import { BRIDGE_KIND } from '~/ci/pipeline_details/components/graph/constants';
-import RetryMrFailedJobMutation from '../../../graphql/mutations/retry_mr_failed_job.mutation.graphql';
+import { BRIDGE_KIND } from '~/ci/pipeline_details/graph/constants';
+import RetryMrFailedJobMutation from '~/ci/merge_requests/graphql/mutations/retry_mr_failed_job.mutation.graphql';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_jobs_list.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_jobs_list.vue
similarity index 95%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_jobs_list.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_jobs_list.vue
index 343036d2049bdaf8d353df65686655848074c520..375f72bb72fbdc60e615716a0ab7a075b34a1e7b 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/failed_jobs_list.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/failed_jobs_list.vue
@@ -2,9 +2,9 @@
 import { GlLoadingIcon } from '@gitlab/ui';
 import { createAlert } from '~/alert';
 import { __, s__, sprintf } from '~/locale';
-import { getQueryHeaders } from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders } from '~/ci/pipeline_details/graph/utils';
 import { graphqlEtagPipelinePath } from '~/ci/pipeline_details/utils';
-import getPipelineFailedJobs from '../../../graphql/queries/get_pipeline_failed_jobs.query.graphql';
+import getPipelineFailedJobs from '~/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs.query.graphql';
 import { sortJobsByStatus } from './utils';
 import FailedJobDetails from './failed_job_details.vue';
 
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/utils.js b/app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/utils.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/failure_widget/utils.js
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/failure_widget/utils.js
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_actions.query.graphql b/app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_actions.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_actions.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_actions.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_failed_jobs.query.graphql b/app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_failed_jobs.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_failed_jobs_count.query.graphql b/app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs_count.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_failed_jobs_count.query.graphql
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs_count.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/pipelines.vue
similarity index 95%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/pipelines.vue
index 574d291a767ef9dad953c78fdbcb55b66f9cab9d..26db10505ef1295fecb61e95d7b9e907b40f3e94 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/pipelines.vue
@@ -17,19 +17,19 @@ import {
   FILTER_TAG_IDENTIFIER,
   PipelineKeyOptions,
   TRACKING_CATEGORIES,
-} from '../../constants';
-import PipelinesMixin from '../../mixins/pipelines_mixin';
-import PipelinesService from '../../services/pipelines_service';
-import { validateParams } from '../../utils';
-import EmptyState from './empty_state.vue';
-import NavigationControls from './nav_controls.vue';
-import PipelinesFilteredSearch from './pipelines_filtered_search.vue';
-import PipelinesTableComponent from './pipelines_table.vue';
+} from '../constants';
+import PipelinesMixin from '../mixins/pipelines_mixin';
+import PipelinesService from '../services/pipelines_service';
+import { validateParams } from '../utils';
+import NoCiEmptyState from './empty_state/no_ci_empty_state.vue';
+import NavigationControls from './components/nav_controls.vue';
+import PipelinesFilteredSearch from './components/pipelines_filtered_search.vue';
+import PipelinesTableComponent from './components/pipelines_table.vue';
 
 export default {
   PipelineKeyOptions,
   components: {
-    EmptyState,
+    NoCiEmptyState,
     GlCollapsibleListbox,
     GlEmptyState,
     GlIcon,
@@ -409,7 +409,7 @@ export default {
         class="prepend-top-20"
       />
 
-      <empty-state
+      <no-ci-empty-state
         v-else-if="stateToRender === $options.stateMap.emptyState"
         :empty-state-svg-path="emptyStateSvgPath"
         :can-set-ci="canCreatePipeline"
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/constants.js b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/constants.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/constants.js
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/constants.js
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_branch_name_token.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_branch_name_token.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_branch_name_token.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_branch_name_token.vue
index 81f46d5f2f994ea0d9fd5fc93e94ed059f8969c0..5c2c1aa03d515279d8a66352750f5fed1354575a 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_branch_name_token.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_branch_name_token.vue
@@ -3,7 +3,7 @@ import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlLoadingIcon } from
 import { debounce } from 'lodash';
 import Api from '~/api';
 import { createAlert } from '~/alert';
-import { FETCH_BRANCH_ERROR_MESSAGE, FILTER_PIPELINES_SEARCH_DELAY } from '../../../constants';
+import { FETCH_BRANCH_ERROR_MESSAGE, FILTER_PIPELINES_SEARCH_DELAY } from '../../constants';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_source_token.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_source_token.vue
similarity index 96%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_source_token.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_source_token.vue
index 28c2e28dd91167549b412edcb31c7e76055222ab..03d9e6478acf0357a5ba7d97e869864cdd6180d3 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_source_token.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_source_token.vue
@@ -1,6 +1,6 @@
 <script>
 import { GlFilteredSearchToken, GlFilteredSearchSuggestion } from '@gitlab/ui';
-import { PIPELINE_SOURCES } from 'ee_else_ce/ci/pipeline_details/components/pipelines_list/tokens/constants';
+import { PIPELINE_SOURCES } from 'ee_else_ce/ci/pipeline_details/pipelines_list/tokens/constants';
 
 export default {
   PIPELINE_SOURCES,
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_status_token.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_status_token.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_status_token.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_status_token.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_tag_name_token.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_tag_name_token.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_tag_name_token.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_tag_name_token.vue
index b32f5de2d7ef1c80ab58f77f3b88ae44ca733d8b..ceb6176df3d4619c8b5b4d45c371f01b82e7d631 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_tag_name_token.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_tag_name_token.vue
@@ -3,7 +3,7 @@ import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlLoadingIcon } from
 import { debounce } from 'lodash';
 import Api from '~/api';
 import { createAlert } from '~/alert';
-import { FETCH_TAG_ERROR_MESSAGE, FILTER_PIPELINES_SEARCH_DELAY } from '../../../constants';
+import { FETCH_TAG_ERROR_MESSAGE, FILTER_PIPELINES_SEARCH_DELAY } from '../../constants';
 
 export default {
   components: {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_trigger_author_token.vue b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_trigger_author_token.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
rename to app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_trigger_author_token.vue
index a89354c671a6f216dd49c85f6817263e5df22e4a..8c516cc8cb3f4b373ef82c8e4d85fc206a4c899a 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
+++ b/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/pipeline_trigger_author_token.vue
@@ -13,7 +13,7 @@ import {
   ANY_TRIGGER_AUTHOR,
   FETCH_AUTHOR_ERROR_MESSAGE,
   FILTER_PIPELINES_SEARCH_DELAY,
-} from '../../../constants';
+} from '../../constants';
 
 export default {
   anyTriggerAuthor: ANY_TRIGGER_AUTHOR,
diff --git a/app/assets/javascripts/ci/pipeline_details/routes.js b/app/assets/javascripts/ci/pipeline_details/routes.js
index 0e1414ec39058dded8a2ffbe3e99eb12f866a0cd..84207f3ab0cbae74b49e5dadbd533f326afcac91 100644
--- a/app/assets/javascripts/ci/pipeline_details/routes.js
+++ b/app/assets/javascripts/ci/pipeline_details/routes.js
@@ -1,8 +1,8 @@
-import PipelineGraphWrapper from './components/graph/graph_component_wrapper.vue';
-import Dag from './components/dag/dag.vue';
-import FailedJobsApp from './components/jobs/failed_jobs_app.vue';
-import JobsApp from './components/jobs/jobs_app.vue';
-import TestReports from './components/test_reports/test_reports.vue';
+import PipelineGraphWrapper from './graph/graph_component_wrapper.vue';
+import Dag from './dag/dag.vue';
+import FailedJobsApp from './jobs/failed_jobs_app.vue';
+import JobsApp from './jobs/jobs_app.vue';
+import TestReports from './test_reports/test_reports.vue';
 import {
   pipelineTabName,
   needsTabName,
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_tabs.vue b/app/assets/javascripts/ci/pipeline_details/tabs/pipeline_tabs.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_tabs.vue
rename to app/assets/javascripts/ci/pipeline_details/tabs/pipeline_tabs.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/empty_state.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/empty_state.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/empty_state.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/empty_state.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_case_details.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/test_case_details.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/test_case_details.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/test_case_details.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_reports.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/test_reports.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/test_reports.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/test_reports.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_suite_table.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/test_suite_table.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/test_suite_table.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/test_suite_table.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_summary.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/test_summary.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/test_summary.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/test_summary.vue
index 6b723ad548128baf801508aa4b5d7a449f23374c..f6090678ca4c1efa20e253338826a34d4ad52240 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_summary.vue
+++ b/app/assets/javascripts/ci/pipeline_details/test_reports/test_summary.vue
@@ -1,7 +1,7 @@
 <script>
 import { GlButton, GlProgressBar } from '@gitlab/ui';
 import { __ } from '~/locale';
-import { formattedTime } from '../../stores/test_reports/utils';
+import { formattedTime } from '../stores/test_reports/utils';
 
 export default {
   name: 'TestSummary',
diff --git a/app/assets/javascripts/ci/pipeline_details/components/test_reports/test_summary_table.vue b/app/assets/javascripts/ci/pipeline_details/test_reports/test_summary_table.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/test_reports/test_summary_table.vue
rename to app/assets/javascripts/ci/pipeline_details/test_reports/test_summary_table.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/graph_shared/drawing_utils.js b/app/assets/javascripts/ci/pipeline_details/utils/drawing_utils.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/graph_shared/drawing_utils.js
rename to app/assets/javascripts/ci/pipeline_details/utils/drawing_utils.js
diff --git a/app/assets/javascripts/ci/pipeline_details/utils.js b/app/assets/javascripts/ci/pipeline_details/utils/index.js
similarity index 89%
rename from app/assets/javascripts/ci/pipeline_details/utils.js
rename to app/assets/javascripts/ci/pipeline_details/utils/index.js
index f030ca943fd3cc34774f190b649046936cb789f9..9109342707e10b1974b4ea279bce0a32234db493 100644
--- a/app/assets/javascripts/ci/pipeline_details/utils.js
+++ b/app/assets/javascripts/ci/pipeline_details/utils/index.js
@@ -1,4 +1,3 @@
-import * as Sentry from '@sentry/browser';
 import { pickBy } from 'lodash';
 import { parseUrlPathname } from '~/lib/utils/url_utility';
 import {
@@ -6,7 +5,7 @@ import {
   SUPPORTED_FILTER_PARAMETERS,
   validPipelineTabNames,
   pipelineTabName,
-} from './constants';
+} from '../constants';
 /*
     The following functions are the main engine in transforming the data as
     received from the endpoint into the format the d3 graph expects.
@@ -128,22 +127,6 @@ export const generateJobNeedsDict = (jobs = {}) => {
   }, {});
 };
 
-export const reportToSentry = (component, failureType) => {
-  Sentry.withScope((scope) => {
-    scope.setTag('component', component);
-    Sentry.captureException(failureType);
-  });
-};
-
-export const reportMessageToSentry = (component, message, context) => {
-  Sentry.withScope((scope) => {
-    // eslint-disable-next-line @gitlab/require-i18n-strings
-    scope.setContext('Vue data', context);
-    scope.setTag('component', component);
-    Sentry.captureMessage(message);
-  });
-};
-
 export const getPipelineDefaultTab = (url) => {
   const strippedUrl = parseUrlPathname(url);
   const regexp = /\w*$/;
diff --git a/app/assets/javascripts/ci/pipeline_details/components/parsing_utils.js b/app/assets/javascripts/ci/pipeline_details/utils/parsing_utils.js
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/parsing_utils.js
rename to app/assets/javascripts/ci/pipeline_details/utils/parsing_utils.js
index e158f8809b515155faa2ecf4015a7085bb1846fa..cfe488b7d1413644e59bfb0f82834d14314a6c57 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/parsing_utils.js
+++ b/app/assets/javascripts/ci/pipeline_details/utils/parsing_utils.js
@@ -1,7 +1,7 @@
 import { memoize } from 'lodash';
-import { createNodeDict } from '../utils';
 import { EXPLICIT_NEEDS_PROPERTY, NEEDS_PROPERTY } from '../constants';
-import { createSankey } from './dag/drawing_utils';
+import { createSankey } from '../dag/drawing_utils';
+import { createNodeDict } from './index';
 
 /*
   A peformant alternative to lodash's isEqual. Because findIndex always finds
diff --git a/app/assets/javascripts/ci/pipeline_details/components/unwrapping_utils.js b/app/assets/javascripts/ci/pipeline_details/utils/unwrapping_utils.js
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/unwrapping_utils.js
rename to app/assets/javascripts/ci/pipeline_details/utils/unwrapping_utils.js
index d42a11c3aba1f8d16edd04a9bb9a3ebe9b35e0a1..7ac813bd527ffc8110b31f3efd7ba27dab7bef7a 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/unwrapping_utils.js
+++ b/app/assets/javascripts/ci/pipeline_details/utils/unwrapping_utils.js
@@ -1,4 +1,4 @@
-import { reportToSentry } from '../utils';
+import { reportToSentry } from '~/ci/utils';
 import { EXPLICIT_NEEDS_PROPERTY, NEEDS_PROPERTY } from '../constants';
 
 const unwrapGroups = (stages) => {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/job_pill.vue b/app/assets/javascripts/ci/pipeline_editor/components/graph/job_pill.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/job_pill.vue
rename to app/assets/javascripts/ci/pipeline_editor/components/graph/job_pill.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue b/app/assets/javascripts/ci/pipeline_editor/components/graph/pipeline_graph.vue
similarity index 97%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue
rename to app/assets/javascripts/ci/pipeline_editor/components/graph/pipeline_graph.vue
index 64210576b2942b76e8b6df55437ee14495962de6..eb906cfc48600f510d40e79fc923bfce66071157 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/graph/pipeline_graph.vue
@@ -1,8 +1,8 @@
 <script>
 import { GlAlert } from '@gitlab/ui';
 import { __ } from '~/locale';
-import { DRAW_FAILURE, DEFAULT } from '../../constants';
-import LinksLayer from '../graph_shared/links_layer.vue';
+import { DRAW_FAILURE, DEFAULT } from '~/ci/pipeline_details/constants';
+import LinksLayer from '~/ci/common/private/job_links_layer.vue';
 import JobPill from './job_pill.vue';
 import StageName from './stage_name.vue';
 
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/stage_name.vue b/app/assets/javascripts/ci/pipeline_editor/components/graph/stage_name.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_graph/stage_name.vue
rename to app/assets/javascripts/ci/pipeline_editor/components/graph/stage_name.vue
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue b/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
index d1c9439e4cd1f9f25897a0702f88c6101eabd539..f00098105d376dfa51e1f0c9ff8fd9eeb46233db 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
@@ -1,7 +1,7 @@
 <script>
 import { __ } from '~/locale';
-import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/components/parsing_utils';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
 import { PIPELINE_FAILURE } from '../../constants';
 
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_status.vue b/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_status.vue
index cdc5317572995d7a5728511244c09a6cdff38d13..5ce3c64514565784e08759f7201ee4abb1f64bb4 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_status.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/header/pipeline_status.vue
@@ -5,13 +5,10 @@ import { truncateSha } from '~/lib/utils/text_utility';
 import { s__ } from '~/locale';
 import getPipelineQuery from '~/ci/pipeline_editor/graphql/queries/pipeline.query.graphql';
 import getPipelineEtag from '~/ci/pipeline_editor/graphql/queries/client/pipeline_etag.query.graphql';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
 import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import PipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue';
+import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
 import PipelineEditorMiniGraph from './pipeline_editor_mini_graph.vue';
 
 const POLL_INTERVAL = 10000;
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue b/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue
index 265ca742275b98a2c91a4cfdb35a4afd3db80f85..c7c15cdd76e976b50fe1cff52193fa48596469eb 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/pipeline_editor_tabs.vue
@@ -2,7 +2,7 @@
 import { GlAlert, GlLoadingIcon, GlTabs } from '@gitlab/ui';
 import CiEditorHeader from 'ee_else_ce/ci/pipeline_editor/components/editor/ci_editor_header.vue';
 import { s__, __ } from '~/locale';
-import PipelineGraph from '~/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue';
+import PipelineGraph from '~/ci/pipeline_editor/components/graph/pipeline_graph.vue';
 import { getParameterValues, setUrlParams, updateHistory } from '~/lib/utils/url_utility';
 import {
   CREATE_TAB,
diff --git a/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_app.vue b/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_app.vue
index 0a1da8bcd11e8d42274bcf0b57aec6220f555797..49562b0be28fe08a2444b1811d6ca9cd2e36da24 100644
--- a/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_app.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/pipeline_editor_app.vue
@@ -4,7 +4,7 @@ import { fetchPolicies } from '~/lib/graphql';
 import { mergeUrlParams, queryToObject, redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
 import { __, s__ } from '~/locale';
 
-import { unwrapStagesWithNeeds } from '~/ci/pipeline_details/components/unwrapping_utils';
+import { unwrapStagesWithNeeds } from '~/ci/pipeline_details/utils/unwrapping_utils';
 
 import ConfirmUnsavedChangesDialog from './components/ui/confirm_unsaved_changes_dialog.vue';
 import PipelineEditorEmptyState from './components/ui/pipeline_editor_empty_state.vue';
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/accessors/linked_pipelines_accessors.js b/app/assets/javascripts/ci/pipeline_mini_graph/accessors/linked_pipelines_accessors.js
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/accessors/linked_pipelines_accessors.js
rename to app/assets/javascripts/ci/pipeline_mini_graph/accessors/linked_pipelines_accessors.js
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_stage.query.graphql b/app/assets/javascripts/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stage.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_stage.query.graphql
rename to app/assets/javascripts/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stage.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql b/app/assets/javascripts/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql
rename to app/assets/javascripts/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/job_item.vue b/app/assets/javascripts/ci/pipeline_mini_graph/job_item.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/job_item.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/job_item.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_job_item.vue b/app/assets/javascripts/ci/pipeline_mini_graph/legacy_job_item.vue
similarity index 94%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_job_item.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/legacy_job_item.vue
index d6e585d093b87ca699fc7bf020ded9927e3a4aef..27917d029b3e28288aed8d04cbfa98526133060d 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_job_item.vue
+++ b/app/assets/javascripts/ci/pipeline_mini_graph/legacy_job_item.vue
@@ -1,11 +1,11 @@
 <script>
 import { GlTooltipDirective, GlLink } from '@gitlab/ui';
+import ActionComponent from '~/ci/common/private/job_action_component.vue';
+import JobNameComponent from '~/ci/common/private/job_name_component.vue';
+import { ICONS } from '~/ci/pipeline_details/constants';
 import delayedJobMixin from '~/jobs/mixins/delayed_job_mixin';
 import { s__, sprintf } from '~/locale';
-import { reportToSentry } from '../../utils';
-import ActionComponent from '../jobs_shared/action_component.vue';
-import JobNameComponent from '../jobs_shared/job_name_component.vue';
-import { ICONS } from '../../constants';
+import { reportToSentry } from '../utils';
 
 /**
  * Renders the badge for the pipeline graph and the job's dropdown.
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue b/app/assets/javascripts/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_stage.vue b/app/assets/javascripts/ci/pipeline_mini_graph/legacy_pipeline_stage.vue
similarity index 98%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_stage.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/legacy_pipeline_stage.vue
index 048e42731c733c4d2865fa28d4e492f92664726a..682393d8901b532c5278e62f71f0247199704a2b 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_stage.vue
+++ b/app/assets/javascripts/ci/pipeline_mini_graph/legacy_pipeline_stage.vue
@@ -15,9 +15,9 @@
 import { GlDropdown, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 import { createAlert } from '~/alert';
+import eventHub from '~/ci/pipeline_details/event_hub';
 import axios from '~/lib/utils/axios_utils';
 import { __, s__, sprintf } from '~/locale';
-import eventHub from '../../event_hub';
 import LegacyJobItem from './legacy_job_item.vue';
 
 export default {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/linked_pipelines_mini_list.vue b/app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/linked_pipelines_mini_list.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue b/app/assets/javascripts/ci/pipeline_mini_graph/pipeline_mini_graph.vue
similarity index 93%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/pipeline_mini_graph.vue
index a4e6fec1625af0dd1f8640f6b1865d54e276280c..358d3dc826e13c569d171919640048b1f9cccfba 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue
+++ b/app/assets/javascripts/ci/pipeline_mini_graph/pipeline_mini_graph.vue
@@ -2,14 +2,11 @@
 import { GlLoadingIcon } from '@gitlab/ui';
 import { createAlert } from '~/alert';
 import { __ } from '~/locale';
-import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/components/parsing_utils';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
+import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
 import { PIPELINE_MINI_GRAPH_POLL_INTERVAL } from '~/ci/pipeline_details/constants';
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
-import getPipelineStagesQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql';
+import getPipelineStagesQuery from './graphql/queries/get_pipeline_stages.query.graphql';
 import LegacyPipelineMiniGraph from './legacy_pipeline_mini_graph.vue';
 
 export default {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stage.vue b/app/assets/javascripts/ci/pipeline_mini_graph/pipeline_stage.vue
similarity index 87%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stage.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/pipeline_stage.vue
index 44e2849cdac44f2e5195a8bf87aef93cb331354b..747b5d33b1afcba32a4d06cbd6e4a9f4bc34298b 100644
--- a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stage.vue
+++ b/app/assets/javascripts/ci/pipeline_mini_graph/pipeline_stage.vue
@@ -2,11 +2,8 @@
 import { createAlert } from '~/alert';
 import { __ } from '~/locale';
 import { PIPELINE_MINI_GRAPH_POLL_INTERVAL } from '~/ci/pipeline_details/constants';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
-import getPipelineStageQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stage.query.graphql';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
+import getPipelineStageQuery from './graphql/queries/get_pipeline_stage.query.graphql';
 import JobItem from './job_item.vue';
 
 export default {
diff --git a/app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stages.vue b/app/assets/javascripts/ci/pipeline_mini_graph/pipeline_stages.vue
similarity index 100%
rename from app/assets/javascripts/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stages.vue
rename to app/assets/javascripts/ci/pipeline_mini_graph/pipeline_stages.vue
diff --git a/app/assets/javascripts/ci/utils.js b/app/assets/javascripts/ci/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb9e9538b75641f9049e4236f847346c4238c693
--- /dev/null
+++ b/app/assets/javascripts/ci/utils.js
@@ -0,0 +1,17 @@
+import * as Sentry from '@sentry/browser';
+
+export const reportToSentry = (component, failureType) => {
+  Sentry.withScope((scope) => {
+    scope.setTag('component', component);
+    Sentry.captureException(failureType);
+  });
+};
+
+export const reportMessageToSentry = (component, message, context) => {
+  Sentry.withScope((scope) => {
+    // eslint-disable-next-line @gitlab/require-i18n-strings
+    scope.setContext('Vue data', context);
+    scope.setTag('component', component);
+    Sentry.captureMessage(message);
+  });
+};
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
index f398e5e5ac8dcf76cc52dbadb8dc22a6c7e15476..589acc7692621257be951903aee9e057dc7b3c29 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
@@ -2,7 +2,7 @@
 import { GlButton, GlEmptyState, GlLoadingIcon, GlModal, GlLink, GlSprintf } from '@gitlab/ui';
 import { helpPagePath } from '~/helpers/help_page_helper';
 import { getParameterByName } from '~/lib/utils/url_utility';
-import PipelinesTableComponent from '~/ci/pipeline_details/components/pipelines_list/pipelines_table.vue';
+import PipelinesTableComponent from '~/ci/pipeline_details/pipelines_list/components/pipelines_table.vue';
 import { PipelineKeyOptions } from '~/ci/pipeline_details/constants';
 import eventHub from '~/ci/pipeline_details/event_hub';
 import PipelinesMixin from '~/ci/pipeline_details/mixins/pipelines_mixin';
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table_wrapper.vue b/app/assets/javascripts/commit/pipelines/pipelines_table_wrapper.vue
index 2fa8060abb3038e1d63ef29ed41c5f723ae04cf5..f9b95c233adbd9df47161120e9452602eb644303 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table_wrapper.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table_wrapper.vue
@@ -1,9 +1,9 @@
 <script>
 import { GlLoadingIcon } from '@gitlab/ui';
-import getMergeRequestPipelines from '~/ci/pipeline_details/graphql/queries/get_merge_request_pipelines.query.graphql';
+import getMergeRequestPipelines from '~/ci/merge_requests/graphql/queries/get_merge_request_pipelines.query.graphql';
 import { createAlert } from '~/alert';
 import { __ } from '~/locale';
-import { getQueryHeaders } from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders } from '~/ci/pipeline_details/graph/utils';
 import { graphqlEtagMergeRequestPipelines } from '~/ci/pipeline_details/utils';
 
 export default {
diff --git a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
index c4ec8ea40332e16576707893fe44c6fe4d42b615..b7355b909a12727322eeda63527f6e3d93313ce6 100644
--- a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
+++ b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
@@ -2,16 +2,13 @@
 import { GlLoadingIcon } from '@gitlab/ui';
 import { createAlert } from '~/alert';
 import { __ } from '~/locale';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
-import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/components/parsing_utils';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
-import PipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
+import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
 import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
-import getPipelineStagesQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql';
+import getPipelineStagesQuery from '~/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql';
 import { formatStages } from '../utils';
 import { COMMIT_BOX_POLL_INTERVAL } from '../constants';
 
diff --git a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue
index b5cc2a320db2a0050ccc39722a51b16619e155c0..ccecc914cf178954b18d5775d2fc2bb22a50e1ab 100644
--- a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue
+++ b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue
@@ -2,10 +2,7 @@
 import { GlLoadingIcon, GlLink } from '@gitlab/ui';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 import { createAlert } from '~/alert';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
 import getLatestPipelineStatusQuery from '../graphql/queries/get_latest_pipeline_status.query.graphql';
 import { COMMIT_BOX_POLL_INTERVAL, PIPELINE_STATUS_FETCH_ERROR } from '../constants';
 
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index 6250bedb2ec2e61e28ba12d3da2cae7449143303..206b6c7699e50b30e0f729968598d7a3138f5790 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -11,9 +11,9 @@ import {
 import SafeHtml from '~/vue_shared/directives/safe_html';
 import { s__, n__ } from '~/locale';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/components/parsing_utils';
-import PipelineArtifacts from '~/ci/pipeline_details/components/pipelines_list/pipelines_artifacts.vue';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
+import PipelineArtifacts from '~/ci/pipeline_details/pipelines_list/components/pipelines_artifacts.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
 import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
 import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
 import { MT_MERGE_STRATEGY } from '../constants';
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.vue b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.vue
index a4637c2472693405f0a8993515c9d5dba76b6c44..1b03b9c04e1d3fcc1554b580353a87499e0d2d2a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.vue
@@ -3,7 +3,7 @@ import { uniqueId, uniq } from 'lodash';
 import { __ } from '~/locale';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
-import TestCaseDetails from '~/ci/pipeline_details/components/test_reports/test_case_details.vue';
+import TestCaseDetails from '~/ci/pipeline_details/test_reports/test_case_details.vue';
 import MrWidget from '~/vue_merge_request_widget/components/widget/widget.vue';
 import MrWidgetRow from '~/vue_merge_request_widget/components/widget/widget_content_row.vue';
 import { DynamicScroller, DynamicScrollerItem } from 'vendor/vue-virtual-scroller';
diff --git a/ee/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/constants.js b/ee/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/constants.js
similarity index 89%
rename from ee/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/constants.js
rename to ee/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/constants.js
index c21783ccc4a2c67ec7f287d6ba699b9954659276..0055370228f491fdc01d013fce1dbca608de60de 100644
--- a/ee/app/assets/javascripts/ci/pipeline_details/components/pipelines_list/tokens/constants.js
+++ b/ee/app/assets/javascripts/ci/pipeline_details/pipelines_list/tokens/constants.js
@@ -1,5 +1,5 @@
 import { s__ } from '~/locale';
-import { PIPELINE_SOURCES as CE_PIPELINE_SOURCES } from '~/ci/pipeline_details/components/pipelines_list/tokens/constants';
+import { PIPELINE_SOURCES as CE_PIPELINE_SOURCES } from '~/ci/pipeline_details/pipelines_list/tokens/constants';
 
 const EE_PIPELINE_SOURCES = [
   {
diff --git a/ee/app/assets/javascripts/ci/pipeline_details/components/pipeline_tabs.vue b/ee/app/assets/javascripts/ci/pipeline_details/tabs/pipeline_tabs.vue
similarity index 98%
rename from ee/app/assets/javascripts/ci/pipeline_details/components/pipeline_tabs.vue
rename to ee/app/assets/javascripts/ci/pipeline_details/tabs/pipeline_tabs.vue
index 290495af788a4b8030be15ac7450cead7538e40b..394621b6bf8d731db68dadf1e119184e307d5e14 100644
--- a/ee/app/assets/javascripts/ci/pipeline_details/components/pipeline_tabs.vue
+++ b/ee/app/assets/javascripts/ci/pipeline_details/tabs/pipeline_tabs.vue
@@ -1,7 +1,7 @@
 <script>
 import { GlTab, GlBadge } from '@gitlab/ui';
 import Api from '~/api';
-import BasePipelineTabs from '~/ci/pipeline_details/components/pipeline_tabs.vue';
+import BasePipelineTabs from '~/ci/pipeline_details/tabs/pipeline_tabs.vue';
 import {
   codeQualityTabName,
   licensesTabName,
diff --git a/ee/app/assets/javascripts/on_demand_scans/components/on_demand_scans.vue b/ee/app/assets/javascripts/on_demand_scans/components/on_demand_scans.vue
index 881c6651637991a0723af21305589cebb6f6ecdf..3557656b8763c26b074d5f18ab515d0569abadef 100644
--- a/ee/app/assets/javascripts/on_demand_scans/components/on_demand_scans.vue
+++ b/ee/app/assets/javascripts/on_demand_scans/components/on_demand_scans.vue
@@ -3,10 +3,7 @@ import { GlButton, GlLink, GlSprintf, GlScrollableTabs, GlAlert } from '@gitlab/
 import { s__ } from '~/locale';
 import { VARIANT_WARNING } from '~/alert';
 import ConfigurationPageLayout from 'ee/security_configuration/components/configuration_page_layout.vue';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
 import onDemandScanCounts from '../graphql/on_demand_scan_counts.query.graphql';
 import {
   HELP_PAGE_PATH,
diff --git a/ee/app/assets/javascripts/on_demand_scans/components/tabs/base_tab.vue b/ee/app/assets/javascripts/on_demand_scans/components/tabs/base_tab.vue
index 69f96dd4f484c0230d36b9b9045c097f19ea00b1..e1f637a46b67b77f2356baa7f9c275e3d05a8922 100644
--- a/ee/app/assets/javascripts/on_demand_scans/components/tabs/base_tab.vue
+++ b/ee/app/assets/javascripts/on_demand_scans/components/tabs/base_tab.vue
@@ -14,10 +14,7 @@ import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
 import { DAST_SHORT_NAME } from '~/security_configuration/components/constants';
 import { __, s__ } from '~/locale';
 import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import {
-  getQueryHeaders,
-  toggleQueryPollingByVisibility,
-} from '~/ci/pipeline_details/components/graph/utils';
+import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
 import handlesErrors from '../../mixins/handles_errors';
 import Actions from '../actions.vue';
 import EmptyState from '../empty_state.vue';
diff --git a/ee/spec/frontend/on_demand_scans/components/tabs/base_tab_spec.js b/ee/spec/frontend/on_demand_scans/components/tabs/base_tab_spec.js
index 686ecf7aca3b0f3ecfa1c8cbbd9aa68f33340a97..98347c60e6a76f0216ed7cb289b57b41ba5c56f8 100644
--- a/ee/spec/frontend/on_demand_scans/components/tabs/base_tab_spec.js
+++ b/ee/spec/frontend/on_demand_scans/components/tabs/base_tab_spec.js
@@ -18,7 +18,7 @@ import setWindowLocation from 'helpers/set_window_location_helper';
 import { getIdFromGraphQLId } from '~/graphql_shared/utils';
 import { BASE_TABS_TABLE_FIELDS, PIPELINES_POLL_INTERVAL } from 'ee/on_demand_scans/constants';
 import * as sharedGraphQLUtils from '~/graphql_shared/utils';
-import * as graphQlUtils from '~/ci/pipeline_details/components/graph/utils';
+import * as graphQlUtils from '~/ci/pipeline_details/graph/utils';
 import { PROJECT_ON_DEMAND_SCAN_COUNTS_ETAG_MOCK } from '../../mocks';
 
 jest.mock('~/lib/utils/common_utils');
diff --git a/ee/spec/frontend/pipelines/components/pipeline_tabs_spec.js b/ee/spec/frontend/pipelines/components/pipeline_tabs_spec.js
index e982875ee4c6ea2fbc8ef250ddcd1f1584652d44..78d17c11c03bd96dc6f0cf038277f93b3bc87fd1 100644
--- a/ee/spec/frontend/pipelines/components/pipeline_tabs_spec.js
+++ b/ee/spec/frontend/pipelines/components/pipeline_tabs_spec.js
@@ -3,8 +3,8 @@ import { nextTick } from 'vue';
 import { shallowMount } from '@vue/test-utils';
 import Api from '~/api';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import BasePipelineTabs from '~/ci/pipeline_details/components/pipeline_tabs.vue';
-import PipelineTabs from 'ee/ci/pipeline_details/components/pipeline_tabs.vue';
+import BasePipelineTabs from '~/ci/pipeline_details/tabs/pipeline_tabs.vue';
+import PipelineTabs from 'ee/ci/pipeline_details/tabs/pipeline_tabs.vue';
 import CodequalityReportApp from 'ee/codequality_report/codequality_report.vue';
 import { SERVICE_PING_PIPELINE_SECURITY_VISIT } from '~/tracking/constants';
 
diff --git a/qa/qa/page/project/pipeline/index.rb b/qa/qa/page/project/pipeline/index.rb
index 8547cc8790882c2ab52bb0c6eab984cde4258d13..435d2008d87b4333475cc6cdb5dd6fadba4550ec 100644
--- a/qa/qa/page/project/pipeline/index.rb
+++ b/qa/qa/page/project/pipeline/index.rb
@@ -5,23 +5,23 @@ module Page
     module Project
       module Pipeline
         class Index < QA::Page::Base
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_url.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_url.vue' do
             element :pipeline_url_link
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_status_badge.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_status_badge.vue' do
             element :pipeline_commit_status
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue' do
             element :pipeline_retry_button
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipelines_list/nav_controls.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/pipelines_list/components/nav_controls.vue' do
             element :run_pipeline_button
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipelines_list/pipelines_table.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/pipelines_list/components/pipelines_table.vue' do
             element :pipeline_row_container
           end
 
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index 25b82709511d8496d2d9a5275f6cb2f5c13cbf38..db678ab1285d682cd7c041030e9cf4f9ba4bf846 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -7,21 +7,21 @@ module Pipeline
         class Show < QA::Page::Base
           include Component::CiBadgeLink
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/pipeline_details_header.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/header/pipeline_details_header.vue' do
             element :pipeline_details_header, required: true
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/graph/graph_component.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/graph/components/graph_component.vue' do
             element :pipeline_graph, /class.*pipeline-graph.*/ # rubocop:disable QA/ElementWithPattern
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/graph/job_item.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue' do
             element :job_item_container, required: true
             element :job_link, required: true
             element :job_action_button
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/graph/linked_pipeline.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue' do
             element :expand_linked_pipeline_button
             element :linked_pipeline_container
             element :downstream_title_content
@@ -35,7 +35,7 @@ class Show < QA::Page::Base
             element :status_icon, 'ci-status-icon-${status}' # rubocop:disable QA/ElementWithPattern
           end
 
-          view 'app/assets/javascripts/ci/pipeline_details/components/graph/job_group_dropdown.vue' do
+          view 'app/assets/javascripts/ci/pipeline_details/graph/components/job_group_dropdown.vue' do
             element :job_dropdown_container
             element :jobs_dropdown_menu
           end
diff --git a/spec/contracts/consumer/resources/graphql/pipelines.js b/spec/contracts/consumer/resources/graphql/pipelines.js
index 2675597e10ac0795279e1e03480bf78f0359e9fd..201045e011fb2ee814e19ad7bd2066f1ecc96ec7 100644
--- a/spec/contracts/consumer/resources/graphql/pipelines.js
+++ b/spec/contracts/consumer/resources/graphql/pipelines.js
@@ -5,7 +5,7 @@ import { extractGraphQLQuery } from '../../helpers/graphql_query_extractor';
 export async function getPipelineHeaderDataRequest(endpoint) {
   const { url } = endpoint;
   const query = await extractGraphQLQuery(
-    'app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql',
+    'app/assets/javascripts/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql',
   );
   const graphqlQuery = {
     query,
diff --git a/spec/contracts/consumer/specs/project/pipelines/show.spec.js b/spec/contracts/consumer/specs/project/pipelines/show.spec.js
index 423d85f21eb1b529596396aac2da28efffc2ae84..d2743b1037fef8260edeef79b3ebd0f5a2fca0ec 100644
--- a/spec/contracts/consumer/specs/project/pipelines/show.spec.js
+++ b/spec/contracts/consumer/specs/project/pipelines/show.spec.js
@@ -27,7 +27,7 @@ pactWith(
     describe(GET_PIPELINE_HEADER_DATA_PROVIDER_NAME, () => {
       beforeEach(async () => {
         const query = await extractGraphQLQuery(
-          'app/assets/javascripts/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql',
+          'app/assets/javascripts/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql',
         );
         const graphqlQuery = new GraphQLInteraction()
           .given(PipelineHeaderData.scenario.state)
diff --git a/spec/frontend/ci/pipeline_editor/components/header/pipeline_editor_mini_graph_spec.js b/spec/frontend/ci/pipeline_editor/components/header/pipeline_editor_mini_graph_spec.js
index 57220dfbd74b2773a31587f23420cad5f1b5a041..4ec1dd4b605d72c12123944eb3348383cca47f74 100644
--- a/spec/frontend/ci/pipeline_editor/components/header/pipeline_editor_mini_graph_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/header/pipeline_editor_mini_graph_spec.js
@@ -4,7 +4,7 @@ import VueApollo from 'vue-apollo';
 import createMockApollo from 'helpers/mock_apollo_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import PipelineEditorMiniGraph from '~/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
 import { PIPELINE_FAILURE } from '~/ci/pipeline_editor/constants';
 import { mockLinkedPipelines, mockProjectFullPath, mockProjectPipeline } from '../../mock_data';
diff --git a/spec/frontend/ci/pipeline_editor/components/header/pipeline_status_spec.js b/spec/frontend/ci/pipeline_editor/components/header/pipeline_status_spec.js
index 5423e7d4e409dac3c511769bbff272308ca4fc3b..1a2ed60a6f4b2d29691ea3e52f09bfbf334de0f9 100644
--- a/spec/frontend/ci/pipeline_editor/components/header/pipeline_status_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/header/pipeline_status_spec.js
@@ -6,8 +6,9 @@ import createMockApollo from 'helpers/mock_apollo_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import PipelineStatus, { i18n } from '~/ci/pipeline_editor/components/header/pipeline_status.vue';
 import getPipelineQuery from '~/ci/pipeline_editor/graphql/queries/pipeline.query.graphql';
-import PipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue';
+import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
 import PipelineEditorMiniGraph from '~/ci/pipeline_editor/components/header/pipeline_editor_mini_graph.vue';
+import getPipelineEtag from '~/ci/pipeline_editor/graphql/queries/client/pipeline_etag.query.graphql';
 import { mockCommitSha, mockProjectPipeline, mockProjectFullPath } from '../../mock_data';
 
 Vue.use(VueApollo);
@@ -21,6 +22,16 @@ describe('Pipeline Status', () => {
     const handlers = [[getPipelineQuery, mockPipelineQuery]];
     mockApollo = createMockApollo(handlers);
 
+    mockApollo.clients.defaultClient.cache.writeQuery({
+      query: getPipelineEtag,
+      data: {
+        etags: {
+          __typename: 'EtagValues',
+          pipeline: 'pipelines/1',
+        },
+      },
+    });
+
     wrapper = shallowMount(PipelineStatus, {
       apolloProvider: mockApollo,
       propsData: {
diff --git a/spec/frontend/ci/pipeline_editor/components/pipeline_editor_tabs_spec.js b/spec/frontend/ci/pipeline_editor/components/pipeline_editor_tabs_spec.js
index 914fdfbcc375111dfdc37dbfeab371ea3329e053..69e91f11309757909ba83e88f8c45c9e610c819e 100644
--- a/spec/frontend/ci/pipeline_editor/components/pipeline_editor_tabs_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/pipeline_editor_tabs_spec.js
@@ -19,7 +19,7 @@ import {
   VALIDATE_TAB,
   VALIDATE_TAB_BADGE_DISMISSED_KEY,
 } from '~/ci/pipeline_editor/constants';
-import PipelineGraph from '~/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue';
+import PipelineGraph from '~/ci/pipeline_editor/components/graph/pipeline_graph.vue';
 import getBlobContent from '~/ci/pipeline_editor/graphql/queries/blob_content.query.graphql';
 import {
   mockBlobContentQueryResponse,
diff --git a/spec/frontend/ci/pipeline_editor/mock_data.js b/spec/frontend/ci/pipeline_editor/mock_data.js
index 245cdfa70435d745b2b3c77420396ec1f2233b30..e08c35f1555ca4a041051c0c83abf175a49f2777 100644
--- a/spec/frontend/ci/pipeline_editor/mock_data.js
+++ b/spec/frontend/ci/pipeline_editor/mock_data.js
@@ -1,5 +1,5 @@
 import { CI_CONFIG_STATUS_INVALID, CI_CONFIG_STATUS_VALID } from '~/ci/pipeline_editor/constants';
-import { unwrapStagesWithNeeds } from '~/ci/pipeline_details/components/unwrapping_utils';
+import { unwrapStagesWithNeeds } from '~/ci/pipeline_details/utils/unwrapping_utils';
 import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
 
 export const commonOptions = {
diff --git a/spec/frontend/ci/pipeline_schedules/mock_data.js b/spec/frontend/ci/pipeline_schedules/mock_data.js
index 8d4e0f1bea660f9467ce5c3c68b83eb6c7aa1ec3..711b120c61e8df55912136ab7d1ec059078a6439 100644
--- a/spec/frontend/ci/pipeline_schedules/mock_data.js
+++ b/spec/frontend/ci/pipeline_schedules/mock_data.js
@@ -1,8 +1,8 @@
 // Fixture located at spec/frontend/fixtures/pipeline_schedules.rb
+import mockGetSinglePipelineScheduleGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.single.json';
 import mockGetPipelineSchedulesGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.json';
 import mockGetPipelineSchedulesAsGuestGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.as_guest.json';
 import mockGetPipelineSchedulesTakeOwnershipGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.take_ownership.json';
-import mockGetSinglePipelineScheduleGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.single.json';
 
 const {
   data: {
diff --git a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
index 6b0286bbbf36a80a293ee2cb74b3b2cdb72afa96..891cd0a6b83127c09e49b83d3e2e31d99db9872c 100644
--- a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
+++ b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
@@ -7,11 +7,11 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { createAlert } from '~/alert';
 import CommitBoxPipelineMiniGraph from '~/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue';
-import PipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
 import { COMMIT_BOX_POLL_INTERVAL } from '~/projects/commit_box/info/constants';
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
-import getPipelineStagesQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql';
+import getPipelineStagesQuery from '~/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql';
 import * as sharedGraphQlUtils from '~/graphql_shared/utils';
 import {
   mockDownstreamQueryResponse,
diff --git a/spec/frontend/commit/pipelines/pipelines_table_wrapper_spec.js b/spec/frontend/commit/pipelines/pipelines_table_wrapper_spec.js
index f639c5f86a0adb34d94bd5133d467b709a52371c..78e303bd6aa732fde5684ccaf98ee2302e3a6e41 100644
--- a/spec/frontend/commit/pipelines/pipelines_table_wrapper_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_table_wrapper_spec.js
@@ -8,7 +8,7 @@ import waitForPromises from 'helpers/wait_for_promises';
 
 import { createAlert } from '~/alert';
 import PipelinesTableWrapper from '~/commit/pipelines/pipelines_table_wrapper.vue';
-import getMergeRequestsPipelines from '~/ci/pipeline_details/graphql/queries/get_merge_request_pipelines.query.graphql';
+import getMergeRequestsPipelines from '~/ci/merge_requests/graphql/queries/get_merge_request_pipelines.query.graphql';
 
 import { mergeRequestPipelinesResponse } from '../mock_data';
 
diff --git a/spec/frontend/fixtures/pipeline_header.rb b/spec/frontend/fixtures/pipeline_header.rb
index 25abfe47dc7147d40b7cdc45cfcec66992a3047f..744df18a4035f716b63dbf45f0e62547e75e98bd 100644
--- a/spec/frontend/fixtures/pipeline_header.rb
+++ b/spec/frontend/fixtures/pipeline_header.rb
@@ -12,7 +12,7 @@
   let_it_be(:user) { project.first_owner }
   let_it_be(:commit) { create(:commit, project: project) }
 
-  let(:query_path) { 'ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql' }
+  let(:query_path) { 'ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql' }
 
   context 'with successful pipeline' do
     let_it_be(:pipeline) do
diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb
index 44911e93dd10f05000fb6f28f1bd5ca65dd9ff31..61433363ce7df86a6c975e8f58977c848eed2734 100644
--- a/spec/frontend/fixtures/pipelines.rb
+++ b/spec/frontend/fixtures/pipelines.rb
@@ -71,7 +71,7 @@
     end
 
     let_it_be(:query) do
-      get_graphql_query_as_string("ci/pipeline_details/graphql/queries/#{get_pipeline_actions_query}")
+      get_graphql_query_as_string("ci/pipeline_details/pipelines_list/graphql/queries/#{get_pipeline_actions_query}")
     end
 
     it "#{fixtures_path}#{get_pipeline_actions_query}.json" do
diff --git a/spec/frontend/pipelines/components/dag/dag_annotations_spec.js b/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
index 03e4b79ca4a08bd60dc1b8a5a0f2797c0296d772..be9d7a8b714d8e1897aa7b326a4fa5325796d899 100644
--- a/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
+++ b/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
@@ -1,7 +1,7 @@
 import { GlButton } from '@gitlab/ui';
 import { shallowMount, mount } from '@vue/test-utils';
 import { nextTick } from 'vue';
-import DagAnnotations from '~/ci/pipeline_details/components/dag/dag_annotations.vue';
+import DagAnnotations from '~/ci/pipeline_details/dag/components/dag_annotations.vue';
 import { singleNote, multiNote } from './mock_data';
 
 describe('The DAG annotations', () => {
diff --git a/spec/frontend/pipelines/components/dag/dag_graph_spec.js b/spec/frontend/pipelines/components/dag/dag_graph_spec.js
index e7d632bdeebc4f1d310e131f4bd4952e81fd2e0b..23f62ab9d934bb3f3a068e5d1a10d02cb82ce242 100644
--- a/spec/frontend/pipelines/components/dag/dag_graph_spec.js
+++ b/spec/frontend/pipelines/components/dag/dag_graph_spec.js
@@ -1,13 +1,9 @@
 import { shallowMount } from '@vue/test-utils';
-import {
-  IS_HIGHLIGHTED,
-  LINK_SELECTOR,
-  NODE_SELECTOR,
-} from '~/ci/pipeline_details/components/dag/constants';
-import DagGraph from '~/ci/pipeline_details/components/dag/dag_graph.vue';
-import { createSankey } from '~/ci/pipeline_details/components/dag/drawing_utils';
-import { highlightIn, highlightOut } from '~/ci/pipeline_details/components/dag/interactions';
-import { removeOrphanNodes } from '~/ci/pipeline_details/components/parsing_utils';
+import { IS_HIGHLIGHTED, LINK_SELECTOR, NODE_SELECTOR } from '~/ci/pipeline_details/dag/constants';
+import DagGraph from '~/ci/pipeline_details/dag/components/dag_graph.vue';
+import { createSankey } from '~/ci/pipeline_details/dag/drawing_utils';
+import { highlightIn, highlightOut } from '~/ci/pipeline_details/dag/interactions';
+import { removeOrphanNodes } from '~/ci/pipeline_details/utils/parsing_utils';
 import { parsedData } from './mock_data';
 
 describe('The DAG graph', () => {
diff --git a/spec/frontend/pipelines/components/dag/dag_spec.js b/spec/frontend/pipelines/components/dag/dag_spec.js
index 2cc1e9cd48f74aabe0e6b191ac3ee363ada9aeb1..de9490be6073b9cae676d091406a64e644f22ea1 100644
--- a/spec/frontend/pipelines/components/dag/dag_spec.js
+++ b/spec/frontend/pipelines/components/dag/dag_spec.js
@@ -1,14 +1,10 @@
 import { GlAlert, GlEmptyState } from '@gitlab/ui';
 import { mount, shallowMount } from '@vue/test-utils';
 import { nextTick } from 'vue';
-import {
-  ADD_NOTE,
-  REMOVE_NOTE,
-  REPLACE_NOTES,
-} from '~/ci/pipeline_details/components/dag/constants';
-import Dag from '~/ci/pipeline_details/components/dag/dag.vue';
-import DagAnnotations from '~/ci/pipeline_details/components/dag/dag_annotations.vue';
-import DagGraph from '~/ci/pipeline_details/components/dag/dag_graph.vue';
+import { ADD_NOTE, REMOVE_NOTE, REPLACE_NOTES } from '~/ci/pipeline_details/dag/constants';
+import Dag from '~/ci/pipeline_details/dag/dag.vue';
+import DagAnnotations from '~/ci/pipeline_details/dag/components/dag_annotations.vue';
+import DagGraph from '~/ci/pipeline_details/dag/components/dag_graph.vue';
 
 import { PARSE_FAILURE, UNSUPPORTED_DATA } from '~/ci/pipeline_details/constants';
 import {
diff --git a/spec/frontend/pipelines/components/dag/drawing_utils_spec.js b/spec/frontend/pipelines/components/dag/drawing_utils_spec.js
index 41daf7065d5b37ff49413de7bce7604f3b3c27a8..6f3fd05ae4bef0832285eb85f84f6f9386a0276e 100644
--- a/spec/frontend/pipelines/components/dag/drawing_utils_spec.js
+++ b/spec/frontend/pipelines/components/dag/drawing_utils_spec.js
@@ -1,5 +1,5 @@
-import { createSankey } from '~/ci/pipeline_details/components/dag/drawing_utils';
-import { parseData } from '~/ci/pipeline_details/components/parsing_utils';
+import { createSankey } from '~/ci/pipeline_details/dag/drawing_utils';
+import { parseData } from '~/ci/pipeline_details/utils/parsing_utils';
 import { mockParsedGraphQLNodes } from './mock_data';
 
 describe('DAG visualization drawing utilities', () => {
diff --git a/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
index c58b09871b98ee002325b67e194ce9a5c8d6e36b..b2d443c18ca8afd949d46ab640a4314099026a84 100644
--- a/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
+++ b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
@@ -5,9 +5,9 @@ import VueApollo from 'vue-apollo';
 import createMockApollo from 'helpers/mock_apollo_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { createAlert } from '~/alert';
-import FailedJobsApp from '~/ci/pipeline_details/components/jobs/failed_jobs_app.vue';
-import FailedJobsTable from '~/ci/pipeline_details/components/jobs/failed_jobs_table.vue';
-import GetFailedJobsQuery from '~/ci/pipeline_details/graphql/queries/get_failed_jobs.query.graphql';
+import FailedJobsApp from '~/ci/pipeline_details/jobs/failed_jobs_app.vue';
+import FailedJobsTable from '~/ci/pipeline_details/jobs/components/failed_jobs_table.vue';
+import GetFailedJobsQuery from '~/ci/pipeline_details/jobs/graphql/queries/get_failed_jobs.query.graphql';
 import { mockFailedJobsQueryResponse } from '../../mock_data';
 
 Vue.use(VueApollo);
diff --git a/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js b/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js
index 16f8cd1ea19361be2657d10bcf875949be3bbe0c..cb2d8ad85d564bb70c8a9f76245b7c03fbc9d604 100644
--- a/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js
+++ b/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js
@@ -7,8 +7,8 @@ import waitForPromises from 'helpers/wait_for_promises';
 import { mountExtended } from 'helpers/vue_test_utils_helper';
 import { createAlert } from '~/alert';
 import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import FailedJobsTable from '~/ci/pipeline_details/components/jobs/failed_jobs_table.vue';
-import RetryFailedJobMutation from '~/ci/pipeline_details/graphql/mutations/retry_failed_job.mutation.graphql';
+import FailedJobsTable from '~/ci/pipeline_details/jobs/components/failed_jobs_table.vue';
+import RetryFailedJobMutation from '~/ci/pipeline_details/jobs/graphql/mutations/retry_failed_job.mutation.graphql';
 import { TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 import {
   successRetryMutationResponse,
diff --git a/spec/frontend/pipelines/components/jobs/jobs_app_spec.js b/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
index 4e48d20d7e2d2090446a28f8d494afeed015009d..bdbbec15e1e18557461c14b74ec3d9a1b8e629c8 100644
--- a/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
+++ b/spec/frontend/pipelines/components/jobs/jobs_app_spec.js
@@ -5,9 +5,9 @@ import VueApollo from 'vue-apollo';
 import createMockApollo from 'helpers/mock_apollo_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { createAlert } from '~/alert';
-import JobsApp from '~/ci/pipeline_details/components/jobs/jobs_app.vue';
+import JobsApp from '~/ci/pipeline_details/jobs/jobs_app.vue';
 import JobsTable from '~/jobs/components/table/jobs_table.vue';
-import getPipelineJobsQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_jobs.query.graphql';
+import getPipelineJobsQuery from '~/ci/pipeline_details/jobs/graphql/queries/get_pipeline_jobs.query.graphql';
 import { mockPipelineJobsQueryResponse } from '../../mock_data';
 
 Vue.use(VueApollo);
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/job_item_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/job_item_spec.js
index e7607325602b5074e983a68da771f5b3ffdd9193..9c14e75caa487f1b8a510d553f9a649d386b77e7 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/job_item_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/job_item_spec.js
@@ -1,5 +1,5 @@
 import { shallowMount } from '@vue/test-utils';
-import JobItem from '~/ci/pipeline_details/components/pipeline_mini_graph/job_item.vue';
+import JobItem from '~/ci/pipeline_mini_graph/job_item.vue';
 
 describe('JobItem', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_mini_graph_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_mini_graph_spec.js
index fa2fd1d648f04252d62e6c947425a9faefc8ac5a..916f3053153af16a9accf690636c35baa48befaf 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_mini_graph_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_mini_graph_spec.js
@@ -1,7 +1,7 @@
 import { mount } from '@vue/test-utils';
 import { pipelines } from 'test_fixtures/pipelines/pipelines.json';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
-import PipelineStages from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stages.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineStages from '~/ci/pipeline_mini_graph/pipeline_stages.vue';
 import mockLinkedPipelines from './linked_pipelines_mock_data';
 
 const mockStages = pipelines[0].details.stages;
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_stage_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_stage_spec.js
index b6ab8fa1ebebb729ef11f25fc249763e641cbde5..6573aaf39fafcb84e800c6da4975b43939d591b1 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_stage_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/legacy_pipeline_stage_spec.js
@@ -5,7 +5,7 @@ import MockAdapter from 'axios-mock-adapter';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import LegacyPipelineStage from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_stage.vue';
+import LegacyPipelineStage from '~/ci/pipeline_mini_graph/legacy_pipeline_stage.vue';
 import eventHub from '~/ci/pipeline_details/event_hub';
 import waitForPromises from 'helpers/wait_for_promises';
 import { stageReply } from '../../mock_data';
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/linked_pipelines_mini_list_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
index 513acab1874aa62a35fcb2908dd1172f73506c85..0396029cdafa079542d49588dca3d99aebcea1dc 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
@@ -1,7 +1,7 @@
 import { mount } from '@vue/test-utils';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import LinkedPipelinesMiniList from '~/ci/pipeline_details/components/pipeline_mini_graph/linked_pipelines_mini_list.vue';
+import LinkedPipelinesMiniList from '~/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue';
 import mockData from './linked_pipelines_mock_data';
 
 describe('Linked pipeline mini list', () => {
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_mini_graph_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_mini_graph_spec.js
index 98b19535a86622233c6e1c08486d35f78fe3586c..6833726a29793f4402f75294004cb685dab3e64a 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_mini_graph_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_mini_graph_spec.js
@@ -8,9 +8,9 @@ import waitForPromises from 'helpers/wait_for_promises';
 import createMockApollo from 'helpers/mock_apollo_helper';
 
 import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
-import getPipelineStagesQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stages.query.graphql';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
-import PipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_mini_graph.vue';
+import getPipelineStagesQuery from '~/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
 import * as sharedGraphQlUtils from '~/graphql_shared/utils';
 
 import {
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stage_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stage_spec.js
index ec1f3fb61c9d821cd6393954314259f0974b502f..96966bcbb84f4fdfc302668e64ba2cb0b086da46 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stage_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stage_spec.js
@@ -4,8 +4,8 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import createMockApollo from 'helpers/mock_apollo_helper';
 
-import getPipelineStageQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_stage.query.graphql';
-import PipelineStage from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stage.vue';
+import getPipelineStageQuery from '~/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stage.query.graphql';
+import PipelineStage from '~/ci/pipeline_mini_graph/pipeline_stage.vue';
 
 Vue.use(VueApollo);
 
diff --git a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stages_spec.js b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stages_spec.js
index 717e66b2e3156bec24b2c043a11a484d4f92d249..bbd39c6fcd9293c1c117740e69c79b7bf463a5ec 100644
--- a/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stages_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_mini_graph/pipeline_stages_spec.js
@@ -1,7 +1,7 @@
 import { shallowMount } from '@vue/test-utils';
 import { pipelines } from 'test_fixtures/pipelines/pipelines.json';
-import LegacyPipelineStage from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_stage.vue';
-import PipelineStages from '~/ci/pipeline_details/components/pipeline_mini_graph/pipeline_stages.vue';
+import LegacyPipelineStage from '~/ci/pipeline_mini_graph/legacy_pipeline_stage.vue';
+import PipelineStages from '~/ci/pipeline_mini_graph/pipeline_stages.vue';
 
 const mockStages = pipelines[0].details.stages;
 
diff --git a/spec/frontend/pipelines/components/pipeline_tabs_spec.js b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
index 2974f4fb916fd2664ab34809d4a946341b38ba43..700d51930dd930bd79c4e45b9fdc32db1dc1cf74 100644
--- a/spec/frontend/pipelines/components/pipeline_tabs_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
@@ -1,7 +1,7 @@
 import { GlTab } from '@gitlab/ui';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import PipelineTabs from '~/ci/pipeline_details/components/pipeline_tabs.vue';
+import PipelineTabs from '~/ci/pipeline_details/tabs/pipeline_tabs.vue';
 import { TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 
 describe('The Pipeline Tabs', () => {
diff --git a/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js b/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
index c2afeb2ccb97aa955d7117b754a827fe604476bb..431f32ce24fffc4cc076d8841e86f43a8a624dc3 100644
--- a/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
@@ -5,7 +5,7 @@ import { nextTick } from 'vue';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
 import Api from '~/api';
 import axios from '~/lib/utils/axios_utils';
-import PipelinesFilteredSearch from '~/ci/pipeline_details/components/pipelines_list/pipelines_filtered_search.vue';
+import PipelinesFilteredSearch from '~/ci/pipeline_details/pipelines_list/components/pipelines_filtered_search.vue';
 import {
   FILTERED_SEARCH_TERM,
   OPERATORS_IS,
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js
index d83d536017e33da690bf20c748c1a9cb09e31d2c..558063ecba5ef3831bca72940a7d5dce1598eb77 100644
--- a/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js
@@ -1,6 +1,6 @@
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import CiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/ci_templates.vue';
+import CiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/ci_templates.vue';
 
 const pipelineEditorPath = '/-/ci/editor';
 const suggestedCiTemplates = [
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js
index ffb3cf2a294d05d458952a31e2c989fddbf3737b..cdd3053d66a304b4582599f6094cbe00956a43d7 100644
--- a/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js
@@ -3,8 +3,8 @@ import { nextTick } from 'vue';
 import { GlPopover, GlButton } from '@gitlab/ui';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue';
-import IosTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/ios_templates.vue';
-import CiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/ci_templates.vue';
+import IosTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/ios_templates.vue';
+import CiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/ci_templates.vue';
 
 const pipelineEditorPath = '/-/ci/editor';
 const registrationToken = 'SECRET_TOKEN';
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js
index fc4020c7f6ad3dc0fa8a1c2bd0efdc23c1be9fae..76b4cc163b281a1fd3fbf851f6feaec6eb770b9a 100644
--- a/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js
@@ -1,8 +1,8 @@
 import '~/commons';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import PipelinesCiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
-import CiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/ci_templates.vue';
+import PipelinesCiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import CiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/ci_templates.vue';
 
 const pipelineEditorPath = '/-/ci/editor';
 
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js
index 2e76da7ed66a9faf4d50312a453c022d8db3e72c..cc68af4f7f36e4a9a5283b91b89fa9649e4e488a 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js
@@ -6,9 +6,9 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { createAlert } from '~/alert';
 import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import FailedJobDetails from '~/ci/pipeline_details/components/pipelines_list/failure_widget/failed_job_details.vue';
-import RetryMrFailedJobMutation from '~/ci/pipeline_details/graphql/mutations/retry_mr_failed_job.mutation.graphql';
-import { BRIDGE_KIND } from '~/ci/pipeline_details/components/graph/constants';
+import FailedJobDetails from '~/ci/pipeline_details/pipelines_list/failure_widget/failed_job_details.vue';
+import RetryMrFailedJobMutation from '~/ci/merge_requests/graphql/mutations/retry_mr_failed_job.mutation.graphql';
+import { BRIDGE_KIND } from '~/ci/pipeline_details/graph/constants';
 import { job } from './mock';
 
 Vue.use(VueApollo);
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js
index 6865b63d0551ed75e01af7c6cce26001fde17d3a..6c1c5f9c223b1f9fd3eb29fdd3f7ee25200223a8 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js
@@ -6,10 +6,10 @@ import createMockApollo from 'helpers/mock_apollo_helper';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { createAlert } from '~/alert';
-import FailedJobsList from '~/ci/pipeline_details/components/pipelines_list/failure_widget/failed_jobs_list.vue';
-import FailedJobDetails from '~/ci/pipeline_details/components/pipelines_list/failure_widget/failed_job_details.vue';
-import * as utils from '~/ci/pipeline_details/components/pipelines_list/failure_widget/utils';
-import getPipelineFailedJobs from '~/ci/pipeline_details/graphql/queries/get_pipeline_failed_jobs.query.graphql';
+import FailedJobsList from '~/ci/pipeline_details/pipelines_list/failure_widget/failed_jobs_list.vue';
+import FailedJobDetails from '~/ci/pipeline_details/pipelines_list/failure_widget/failed_job_details.vue';
+import * as utils from '~/ci/pipeline_details/pipelines_list/failure_widget/utils';
+import getPipelineFailedJobs from '~/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_failed_jobs.query.graphql';
 import { failedJobsMock, failedJobsMock2, failedJobsMockEmpty, activeFailedJobsMock } from './mock';
 
 Vue.use(VueApollo);
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
index 7bcde4d57d8ca2f779bf626076d397afa9598325..5135bf57b22598fd7bcc3ebc1d5340997e9171df 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
@@ -1,7 +1,7 @@
 import { GlButton, GlCard, GlIcon, GlPopover } from '@gitlab/ui';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import PipelineFailedJobsWidget from '~/ci/pipeline_details/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
-import FailedJobsList from '~/ci/pipeline_details/components/pipelines_list/failure_widget/failed_jobs_list.vue';
+import PipelineFailedJobsWidget from '~/ci/pipeline_details/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
+import FailedJobsList from '~/ci/pipeline_details/pipelines_list/failure_widget/failed_jobs_list.vue';
 
 jest.mock('~/alert');
 
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/utils_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/utils_spec.js
index 731150914565942aec5a7670038aa12f4120451e..16a0da4e0548c218fdfcbdfe3e7d40bff8e4078b 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/utils_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/utils_spec.js
@@ -1,7 +1,7 @@
 import {
   isFailedJob,
   sortJobsByStatus,
-} from '~/ci/pipeline_details/components/pipelines_list/failure_widget/utils';
+} from '~/ci/pipeline_details/pipelines_list/failure_widget/utils';
 
 describe('isFailedJob', () => {
   describe('when the job argument is undefined', () => {
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_stop_modal_spec.js
similarity index 85%
rename from spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js
rename to spec/frontend/pipelines/components/pipelines_list/pipeline_stop_modal_spec.js
index 9314522282f449b707c2521daeda3e7bc2e0ca87..15a202424d01f2908ff1e4b33e7b98d21fa091e4 100644
--- a/spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_stop_modal_spec.js
@@ -1,6 +1,6 @@
 import { shallowMount } from '@vue/test-utils';
 import { GlSprintf } from '@gitlab/ui';
-import PipelineStopModal from '~/ci/pipeline_details/components/pipelines_list/pipeline_stop_modal.vue';
+import PipelineStopModal from '~/ci/pipeline_details/pipelines_list/components/pipeline_stop_modal.vue';
 import { mockPipelineHeader } from '../../mock_data';
 
 describe('PipelineStopModal', () => {
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index f264b21f6a3be82f0be9bed41d04abaec6fbf98c..6ef37f59f666b541c4b36e29c19a19399e81764a 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -2,10 +2,10 @@ import '~/commons';
 import { shallowMount } from '@vue/test-utils';
 import { GlEmptyState } from '@gitlab/ui';
 import { stubExperiments } from 'helpers/experimentation_helper';
-import EmptyState from '~/ci/pipeline_details/components/pipelines_list/empty_state.vue';
+import EmptyState from '~/ci/pipeline_details/pipelines_list/empty_state/no_ci_empty_state.vue';
 import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-import PipelinesCiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
-import IosTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/ios_templates.vue';
+import PipelinesCiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import IosTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/ios_templates.vue';
 
 describe('Pipelines Empty State', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/graph/action_component_spec.js b/spec/frontend/pipelines/graph/action_component_spec.js
index c0774f2def2e5b90ce9e8342ce59952ae047624c..9e177156d0e5303e2fe2a5227d4c577c2e8cdc71 100644
--- a/spec/frontend/pipelines/graph/action_component_spec.js
+++ b/spec/frontend/pipelines/graph/action_component_spec.js
@@ -5,7 +5,7 @@ import { nextTick } from 'vue';
 import waitForPromises from 'helpers/wait_for_promises';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import ActionComponent from '~/ci/pipeline_details/components/jobs_shared/action_component.vue';
+import ActionComponent from '~/ci/common/private/job_action_component.vue';
 
 describe('pipeline graph action component', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/graph/graph_component_spec.js b/spec/frontend/pipelines/graph/graph_component_spec.js
index 8ff54b063349cbf6e4788db852f0e8a4f4c1674b..e468adada0fa4c3d448add0abff02dd2472ed85b 100644
--- a/spec/frontend/pipelines/graph/graph_component_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_spec.js
@@ -1,13 +1,13 @@
 import { shallowMount } from '@vue/test-utils';
 import mockPipelineResponse from 'test_fixtures/pipelines/pipeline_details.json';
 import { mountExtended } from 'helpers/vue_test_utils_helper';
-import { LAYER_VIEW, STAGE_VIEW } from '~/ci/pipeline_details/components/graph/constants';
-import PipelineGraph from '~/ci/pipeline_details/components/graph/graph_component.vue';
-import JobItem from '~/ci/pipeline_details/components/graph/job_item.vue';
-import LinkedPipelinesColumn from '~/ci/pipeline_details/components/graph/linked_pipelines_column.vue';
-import StageColumnComponent from '~/ci/pipeline_details/components/graph/stage_column_component.vue';
-import { calculatePipelineLayersInfo } from '~/ci/pipeline_details/components/graph/utils';
-import LinksLayer from '~/ci/pipeline_details/components/graph_shared/links_layer.vue';
+import { LAYER_VIEW, STAGE_VIEW } from '~/ci/pipeline_details/graph/constants';
+import PipelineGraph from '~/ci/pipeline_details/graph/components/graph_component.vue';
+import JobItem from '~/ci/pipeline_details/graph/components/job_item.vue';
+import LinkedPipelinesColumn from '~/ci/pipeline_details/graph/components/linked_pipelines_column.vue';
+import StageColumnComponent from '~/ci/pipeline_details/graph/components/stage_column_component.vue';
+import { calculatePipelineLayersInfo } from '~/ci/pipeline_details/graph/utils';
+import LinksLayer from '~/ci/common/private/job_links_layer.vue';
 
 import { generateResponse, pipelineWithUpstreamDownstream } from './mock_data';
 
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index 8a7ee82b2ef78b2062bd4f0631eac2a2e47b8c3d..372ed2a4e1cc979eab5f90d029d4639af8080f81 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -23,15 +23,15 @@ import {
   LAYER_VIEW,
   STAGE_VIEW,
   VIEW_TYPE_KEY,
-} from '~/ci/pipeline_details/components/graph/constants';
-import PipelineGraph from '~/ci/pipeline_details/components/graph/graph_component.vue';
-import PipelineGraphWrapper from '~/ci/pipeline_details/components/graph/graph_component_wrapper.vue';
-import GraphViewSelector from '~/ci/pipeline_details/components/graph/graph_view_selector.vue';
-import * as Api from '~/ci/pipeline_details/components/graph_shared/api';
-import LinksLayer from '~/ci/pipeline_details/components/graph_shared/links_layer.vue';
-import * as parsingUtils from '~/ci/pipeline_details/components/parsing_utils';
-import getPipelineHeaderData from '~/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql';
-import * as sentryUtils from '~/ci/pipeline_details/utils';
+} from '~/ci/pipeline_details/graph/constants';
+import PipelineGraph from '~/ci/pipeline_details/graph/components/graph_component.vue';
+import PipelineGraphWrapper from '~/ci/pipeline_details/graph/graph_component_wrapper.vue';
+import GraphViewSelector from '~/ci/pipeline_details/graph/components/graph_view_selector.vue';
+import * as Api from '~/ci/pipeline_details/graph/api_utils';
+import LinksLayer from '~/ci/common/private/job_links_layer.vue';
+import * as parsingUtils from '~/ci/pipeline_details/utils/parsing_utils';
+import getPipelineHeaderData from '~/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql';
+import * as sentryUtils from '~/ci/utils';
 import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
 import { mockRunningPipelineHeaderData } from '../mock_data';
 import {
diff --git a/spec/frontend/pipelines/graph/graph_view_selector_spec.js b/spec/frontend/pipelines/graph/graph_view_selector_spec.js
index e42e8271fa003e9c31d48ca1884c25c7b5b0bd87..bf98995de9c82e2e9022e815b5c2a8318d85f111 100644
--- a/spec/frontend/pipelines/graph/graph_view_selector_spec.js
+++ b/spec/frontend/pipelines/graph/graph_view_selector_spec.js
@@ -1,7 +1,7 @@
 import { GlAlert, GlButton, GlButtonGroup, GlLoadingIcon } from '@gitlab/ui';
 import { mount, shallowMount } from '@vue/test-utils';
-import { LAYER_VIEW, STAGE_VIEW } from '~/ci/pipeline_details/components/graph/constants';
-import GraphViewSelector from '~/ci/pipeline_details/components/graph/graph_view_selector.vue';
+import { LAYER_VIEW, STAGE_VIEW } from '~/ci/pipeline_details/graph/constants';
+import GraphViewSelector from '~/ci/pipeline_details/graph/components/graph_view_selector.vue';
 
 describe('the graph view selector component', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/graph/job_group_dropdown_spec.js b/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
index 6f19f9fa2ae92937595ae88f6d43f6dfd3436ba2..d5a1cfffe68d2bbff96fe142c84d5b771b9995d1 100644
--- a/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
+++ b/spec/frontend/pipelines/graph/job_group_dropdown_spec.js
@@ -1,5 +1,5 @@
 import { shallowMount, mount } from '@vue/test-utils';
-import JobGroupDropdown from '~/ci/pipeline_details/components/graph/job_group_dropdown.vue';
+import JobGroupDropdown from '~/ci/pipeline_details/graph/components/job_group_dropdown.vue';
 
 describe('job group dropdown component', () => {
   const group = {
diff --git a/spec/frontend/pipelines/graph/job_item_spec.js b/spec/frontend/pipelines/graph/job_item_spec.js
index b1f55f278c32c7d5c9b0a34bbb348b4da5759652..fd45dc7193f045e715ed54aec78cac0506bf3cd4 100644
--- a/spec/frontend/pipelines/graph/job_item_spec.js
+++ b/spec/frontend/pipelines/graph/job_item_spec.js
@@ -1,10 +1,10 @@
 import MockAdapter from 'axios-mock-adapter';
 import Vue, { nextTick } from 'vue';
 import { GlBadge, GlModal, GlToast } from '@gitlab/ui';
-import JobItem from '~/ci/pipeline_details/components/graph/job_item.vue';
+import JobItem from '~/ci/pipeline_details/graph/components/job_item.vue';
 import axios from '~/lib/utils/axios_utils';
 import { useLocalStorageSpy } from 'helpers/local_storage_helper';
-import ActionComponent from '~/ci/pipeline_details/components/jobs_shared/action_component.vue';
+import ActionComponent from '~/ci/common/private/job_action_component.vue';
 
 import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import {
diff --git a/spec/frontend/pipelines/graph/job_name_component_spec.js b/spec/frontend/pipelines/graph/job_name_component_spec.js
index 3d2f54c9f10c39191ba54964835ef1376af0586a..ca201aee648df13fdab6e6981086dc5bdb59aec1 100644
--- a/spec/frontend/pipelines/graph/job_name_component_spec.js
+++ b/spec/frontend/pipelines/graph/job_name_component_spec.js
@@ -1,5 +1,5 @@
 import { mount } from '@vue/test-utils';
-import jobNameComponent from '~/ci/pipeline_details/components/jobs_shared/job_name_component.vue';
+import jobNameComponent from '~/ci/common/private/job_name_component.vue';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
 
 describe('job name component', () => {
diff --git a/spec/frontend/pipelines/graph/linked_pipeline_spec.js b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
index 14aacf1066568e6aafcdcae8f678f1e7b98e8532..5541b0db54ade3aae7971bec69d44fc32b51eb5c 100644
--- a/spec/frontend/pipelines/graph/linked_pipeline_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
@@ -6,12 +6,8 @@ import createMockApollo from 'helpers/mock_apollo_helper';
 import { mountExtended } from 'helpers/vue_test_utils_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
-import {
-  ACTION_FAILURE,
-  UPSTREAM,
-  DOWNSTREAM,
-} from '~/ci/pipeline_details/components/graph/constants';
-import LinkedPipelineComponent from '~/ci/pipeline_details/components/graph/linked_pipeline.vue';
+import { ACTION_FAILURE, UPSTREAM, DOWNSTREAM } from '~/ci/pipeline_details/graph/constants';
+import LinkedPipelineComponent from '~/ci/pipeline_details/graph/components/linked_pipeline.vue';
 import CancelPipelineMutation from '~/ci/pipeline_details/graphql/mutations/cancel_pipeline.mutation.graphql';
 import RetryPipelineMutation from '~/ci/pipeline_details/graphql/mutations/retry_pipeline.mutation.graphql';
 import CiIcon from '~/vue_shared/components/ci_icon.vue';
diff --git a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
index 4bc757ee42a9a6ab34ebc9ca26bf41bc79c81888..cc4e4172657b413ddfac4bb3fb5e1b092e75a885 100644
--- a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
@@ -10,11 +10,11 @@ import {
   UPSTREAM,
   LAYER_VIEW,
   STAGE_VIEW,
-} from '~/ci/pipeline_details/components/graph/constants';
-import PipelineGraph from '~/ci/pipeline_details/components/graph/graph_component.vue';
-import LinkedPipeline from '~/ci/pipeline_details/components/graph/linked_pipeline.vue';
-import LinkedPipelinesColumn from '~/ci/pipeline_details/components/graph/linked_pipelines_column.vue';
-import * as parsingUtils from '~/ci/pipeline_details/components/parsing_utils';
+} from '~/ci/pipeline_details/graph/constants';
+import PipelineGraph from '~/ci/pipeline_details/graph/components/graph_component.vue';
+import LinkedPipeline from '~/ci/pipeline_details/graph/components/linked_pipeline.vue';
+import LinkedPipelinesColumn from '~/ci/pipeline_details/graph/components/linked_pipelines_column.vue';
+import * as parsingUtils from '~/ci/pipeline_details/utils/parsing_utils';
 import { LOAD_FAILURE } from '~/ci/pipeline_details/constants';
 
 import { pipelineWithUpstreamDownstream, wrappedPipelineReturn } from './mock_data';
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index c3ab2c756f03480fb6106be5120e03a48b923761..a880a9cf4b0a22f69e24160ef91fea36ee21433d 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -1,10 +1,6 @@
 import mockPipelineResponse from 'test_fixtures/pipelines/pipeline_details.json';
-import { unwrapPipelineData } from '~/ci/pipeline_details/components/graph/utils';
-import {
-  BUILD_KIND,
-  BRIDGE_KIND,
-  RETRY_ACTION_TITLE,
-} from '~/ci/pipeline_details/components/graph/constants';
+import { unwrapPipelineData } from '~/ci/pipeline_details/graph/utils';
+import { BUILD_KIND, BRIDGE_KIND, RETRY_ACTION_TITLE } from '~/ci/pipeline_details/graph/constants';
 
 // We mock this instead of using fixtures for performance reason.
 const mockPipelineResponseCopy = JSON.parse(JSON.stringify(mockPipelineResponse));
diff --git a/spec/frontend/pipelines/graph/stage_column_component_spec.js b/spec/frontend/pipelines/graph/stage_column_component_spec.js
index 7b19ac439b366880c3b2b20382263ffa6da80670..cc79205ec41167205849ee2af1f1428604b5514c 100644
--- a/spec/frontend/pipelines/graph/stage_column_component_spec.js
+++ b/spec/frontend/pipelines/graph/stage_column_component_spec.js
@@ -1,7 +1,7 @@
 import { mount, shallowMount } from '@vue/test-utils';
-import JobItem from '~/ci/pipeline_details/components/graph/job_item.vue';
-import StageColumnComponent from '~/ci/pipeline_details/components/graph/stage_column_component.vue';
-import ActionComponent from '~/ci/pipeline_details/components/jobs_shared/action_component.vue';
+import JobItem from '~/ci/pipeline_details/graph/components/job_item.vue';
+import StageColumnComponent from '~/ci/pipeline_details/graph/components/stage_column_component.vue';
+import ActionComponent from '~/ci/common/private/job_action_component.vue';
 
 const mockJob = {
   id: 4250,
diff --git a/spec/frontend/pipelines/graph_shared/links_inner_spec.js b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
index 5c79ca00702d81fcbc69bd9a12faa918a9655094..8d1964726e4e3a891c371fba89924919c9ef64b8 100644
--- a/spec/frontend/pipelines/graph_shared/links_inner_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
@@ -1,7 +1,7 @@
 import { shallowMount } from '@vue/test-utils';
 import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-import LinksInner from '~/ci/pipeline_details/components/graph_shared/links_inner.vue';
-import { parseData } from '~/ci/pipeline_details/components/parsing_utils';
+import LinksInner from '~/ci/pipeline_details/graph/components/links_inner.vue';
+import { parseData } from '~/ci/pipeline_details/utils/parsing_utils';
 import { createJobsHash } from '~/ci/pipeline_details/utils';
 import {
   jobRect,
diff --git a/spec/frontend/pipelines/graph_shared/links_layer_spec.js b/spec/frontend/pipelines/graph_shared/links_layer_spec.js
index 16dfb103cf0127e2e43f411d1e76964cd3685785..ccda2b8078d6af2b601241c1187506fd98324454 100644
--- a/spec/frontend/pipelines/graph_shared/links_layer_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_layer_spec.js
@@ -1,7 +1,7 @@
 import { shallowMount } from '@vue/test-utils';
 import mockPipelineResponse from 'test_fixtures/pipelines/pipeline_details.json';
-import LinksInner from '~/ci/pipeline_details/components/graph_shared/links_inner.vue';
-import LinksLayer from '~/ci/pipeline_details/components/graph_shared/links_layer.vue';
+import LinksInner from '~/ci/pipeline_details/graph/components/links_inner.vue';
+import LinksLayer from '~/ci/common/private/job_links_layer.vue';
 
 import { generateResponse } from '../graph/mock_data';
 
diff --git a/spec/frontend/pipelines/nav_controls_spec.js b/spec/frontend/pipelines/nav_controls_spec.js
index a4567734c34c0bfa5c5f4121c7028fb384751dcc..cefe0c9f0a3a7132843af6b7610aed9f0a0e688a 100644
--- a/spec/frontend/pipelines/nav_controls_spec.js
+++ b/spec/frontend/pipelines/nav_controls_spec.js
@@ -1,5 +1,5 @@
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import NavControls from '~/ci/pipeline_details/components/pipelines_list/nav_controls.vue';
+import NavControls from '~/ci/pipeline_details/pipelines_list/components/nav_controls.vue';
 
 describe('Pipelines Nav Controls', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/pipeline_details_header_spec.js b/spec/frontend/pipelines/pipeline_details_header_spec.js
index 6ea5d603111a6ef9c0f8a2f1053f910bd8d167e5..81a8914f0130b22d4b9a3827bfd2a3fd1d732b9a 100644
--- a/spec/frontend/pipelines/pipeline_details_header_spec.js
+++ b/spec/frontend/pipelines/pipeline_details_header_spec.js
@@ -5,13 +5,13 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import createMockApollo from 'helpers/mock_apollo_helper';
 import waitForPromises from 'helpers/wait_for_promises';
 import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import PipelineDetailsHeader from '~/ci/pipeline_details/components/pipeline_details_header.vue';
+import PipelineDetailsHeader from '~/ci/pipeline_details/header/pipeline_details_header.vue';
 import { BUTTON_TOOLTIP_RETRY, BUTTON_TOOLTIP_CANCEL } from '~/ci/pipeline_details/constants';
 import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
 import cancelPipelineMutation from '~/ci/pipeline_details/graphql/mutations/cancel_pipeline.mutation.graphql';
 import deletePipelineMutation from '~/ci/pipeline_details/graphql/mutations/delete_pipeline.mutation.graphql';
 import retryPipelineMutation from '~/ci/pipeline_details/graphql/mutations/retry_pipeline.mutation.graphql';
-import getPipelineDetailsQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_header_data.query.graphql';
+import getPipelineDetailsQuery from '~/ci/pipeline_details/header/graphql/queries/get_pipeline_header_data.query.graphql';
 import {
   pipelineHeaderSuccess,
   pipelineHeaderRunning,
diff --git a/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js b/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
index ed49aeeb1a00f5f7bb44a7f5fc4206f8666b7f35..95edfb01cf094b58405aee406e9c1e2e451be060 100644
--- a/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
+++ b/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
@@ -2,11 +2,11 @@ import { GlAlert } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import { setHTMLFixture } from 'helpers/fixtures';
 import { CI_CONFIG_STATUS_VALID } from '~/ci/pipeline_editor/constants';
-import LinksInner from '~/ci/pipeline_details/components/graph_shared/links_inner.vue';
-import LinksLayer from '~/ci/pipeline_details/components/graph_shared/links_layer.vue';
-import JobPill from '~/ci/pipeline_details/components/pipeline_graph/job_pill.vue';
-import PipelineGraph from '~/ci/pipeline_details/components/pipeline_graph/pipeline_graph.vue';
-import StageName from '~/ci/pipeline_details/components/pipeline_graph/stage_name.vue';
+import LinksInner from '~/ci/pipeline_details/graph/components/links_inner.vue';
+import LinksLayer from '~/ci/common/private/job_links_layer.vue';
+import JobPill from '~/ci/pipeline_editor/components/graph/job_pill.vue';
+import PipelineGraph from '~/ci/pipeline_editor/components/graph/pipeline_graph.vue';
+import StageName from '~/ci/pipeline_editor/components/graph/stage_name.vue';
 import { pipelineData, singleStageData } from './mock_data';
 
 describe('pipeline graph component', () => {
diff --git a/spec/frontend/pipelines/pipeline_labels_spec.js b/spec/frontend/pipelines/pipeline_labels_spec.js
index 9a65cad4cba96ad1090e30ed95e88bac4f371214..b90f7d035e0c666895ed9149028e5b75af9de016 100644
--- a/spec/frontend/pipelines/pipeline_labels_spec.js
+++ b/spec/frontend/pipelines/pipeline_labels_spec.js
@@ -1,6 +1,6 @@
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 import { trimText } from 'helpers/text_helper';
-import PipelineLabelsComponent from '~/ci/pipeline_details/components/pipelines_list/pipeline_labels.vue';
+import PipelineLabelsComponent from '~/ci/pipeline_details/pipelines_list/components/pipeline_labels.vue';
 import { mockPipeline } from './mock_data';
 
 const projectPath = 'test/test';
diff --git a/spec/frontend/pipelines/pipeline_multi_actions_spec.js b/spec/frontend/pipelines/pipeline_multi_actions_spec.js
index b35ffaff4dc06b9f9199bd6578c8ed39aedaeb0d..6827aea7b1c326c8512ff9729b4fb8063e7d2bf7 100644
--- a/spec/frontend/pipelines/pipeline_multi_actions_spec.js
+++ b/spec/frontend/pipelines/pipeline_multi_actions_spec.js
@@ -10,7 +10,7 @@ import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
 import PipelineMultiActions, {
   i18n,
-} from '~/ci/pipeline_details/components/pipelines_list/pipeline_multi_actions.vue';
+} from '~/ci/pipeline_details/pipelines_list/components/pipeline_multi_actions.vue';
 import { TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 
 describe('Pipeline Multi Actions Dropdown', () => {
diff --git a/spec/frontend/pipelines/pipeline_operations_spec.js b/spec/frontend/pipelines/pipeline_operations_spec.js
index 1952d704b9ce025e14fe1deac36f4b9b994fa772..3e2005236bb6e1852301ad5d42f63ee275482cb5 100644
--- a/spec/frontend/pipelines/pipeline_operations_spec.js
+++ b/spec/frontend/pipelines/pipeline_operations_spec.js
@@ -1,7 +1,7 @@
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import PipelinesManualActions from '~/ci/pipeline_details/components/pipelines_list/pipelines_manual_actions.vue';
-import PipelineMultiActions from '~/ci/pipeline_details/components/pipelines_list/pipeline_multi_actions.vue';
-import PipelineOperations from '~/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue';
+import PipelinesManualActions from '~/ci/pipeline_details/pipelines_list/components/pipelines_manual_actions.vue';
+import PipelineMultiActions from '~/ci/pipeline_details/pipelines_list/components/pipeline_multi_actions.vue';
+import PipelineOperations from '~/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue';
 import eventHub from '~/ci/pipeline_details/event_hub';
 
 describe('Pipeline operations', () => {
diff --git a/spec/frontend/pipelines/pipeline_triggerer_spec.js b/spec/frontend/pipelines/pipeline_triggerer_spec.js
index 5e2a7df6fe95773e8df1549d228cc3ce69ceed7d..4c8a43598ad1c320be7c0392e9f99c0a44bfd79c 100644
--- a/spec/frontend/pipelines/pipeline_triggerer_spec.js
+++ b/spec/frontend/pipelines/pipeline_triggerer_spec.js
@@ -1,6 +1,6 @@
 import { GlAvatar, GlAvatarLink } from '@gitlab/ui';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import pipelineTriggerer from '~/ci/pipeline_details/components/pipelines_list/pipeline_triggerer.vue';
+import pipelineTriggerer from '~/ci/pipeline_details/pipelines_list/components/pipeline_triggerer.vue';
 import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
 
 describe('Pipelines Triggerer', () => {
diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js
index be24ae809500d8e7f9efc8e7ba5d63e2ce5cf8ae..c1be2b096f664beb68597c7261cf6b9fcef46bb5 100644
--- a/spec/frontend/pipelines/pipeline_url_spec.js
+++ b/spec/frontend/pipelines/pipeline_url_spec.js
@@ -1,7 +1,7 @@
 import { merge } from 'lodash';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import PipelineUrlComponent from '~/ci/pipeline_details/components/pipelines_list/pipeline_url.vue';
+import PipelineUrlComponent from '~/ci/pipeline_details/pipelines_list/components/pipeline_url.vue';
 import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
 import { TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 import { mockPipeline, mockPipelineBranch, mockPipelineTag } from './mock_data';
diff --git a/spec/frontend/pipelines/pipelines_artifacts_spec.js b/spec/frontend/pipelines/pipelines_artifacts_spec.js
index 9b092a70965c72438f045aa0d58833de91474ce7..7ef3513cbceba5d8dbab6fbd595a41097dce6bf5 100644
--- a/spec/frontend/pipelines/pipelines_artifacts_spec.js
+++ b/spec/frontend/pipelines/pipelines_artifacts_spec.js
@@ -5,7 +5,7 @@ import {
   GlSprintf,
 } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
-import PipelineArtifacts from '~/ci/pipeline_details/components/pipelines_list/pipelines_artifacts.vue';
+import PipelineArtifacts from '~/ci/pipeline_details/pipelines_list/components/pipelines_artifacts.vue';
 
 describe('Pipelines Artifacts dropdown', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/pipelines_manual_actions_spec.js b/spec/frontend/pipelines/pipelines_manual_actions_spec.js
index 15cdceed850294081ebfd113175fa9b2fa9537c3..c0ea0fda4df149a8245fe2ccadec12abf2af1a87 100644
--- a/spec/frontend/pipelines/pipelines_manual_actions_spec.js
+++ b/spec/frontend/pipelines/pipelines_manual_actions_spec.js
@@ -11,8 +11,8 @@ import { createAlert } from '~/alert';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
 import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
-import PipelinesManualActions from '~/ci/pipeline_details/components/pipelines_list/pipelines_manual_actions.vue';
-import getPipelineActionsQuery from '~/ci/pipeline_details/graphql/queries/get_pipeline_actions.query.graphql';
+import PipelinesManualActions from '~/ci/pipeline_details/pipelines_list/components/pipelines_manual_actions.vue';
+import getPipelineActionsQuery from '~/ci/pipeline_details/pipelines_list/graphql/queries/get_pipeline_actions.query.graphql';
 import { TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
 
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index 62e2e28f311692dcc6020344e2b16051bb97905b..dd12286f71cbed2eaab2ffffe819c7b260f20044 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -24,10 +24,10 @@ import { createAlert, VARIANT_WARNING } from '~/alert';
 import setSortPreferenceMutation from '~/issues/list/queries/set_sort_preference.mutation.graphql';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import NavigationControls from '~/ci/pipeline_details/components/pipelines_list/nav_controls.vue';
-import PipelinesComponent from '~/ci/pipeline_details/components/pipelines_list/pipelines.vue';
-import PipelinesCiTemplates from '~/ci/pipeline_details/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
-import PipelinesTableComponent from '~/ci/pipeline_details/components/pipelines_list/pipelines_table.vue';
+import NavigationControls from '~/ci/pipeline_details/pipelines_list/components/nav_controls.vue';
+import PipelinesComponent from '~/ci/pipeline_details/pipelines_list/pipelines.vue';
+import PipelinesCiTemplates from '~/ci/pipeline_details/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import PipelinesTableComponent from '~/ci/pipeline_details/pipelines_list/components/pipelines_table.vue';
 import { RAW_TEXT_WARNING, TRACKING_CATEGORIES } from '~/ci/pipeline_details/constants';
 import Store from '~/ci/pipeline_details/stores/pipelines_store';
 import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index 508e1eb833f5f64c5a054fa56e8bb1abd532c21d..2ae8475f38d7e83114ff784b145de5a7b245033c 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -4,13 +4,13 @@ import { mount } from '@vue/test-utils';
 import fixture from 'test_fixtures/pipelines/pipelines.json';
 import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
-import PipelineFailedJobsWidget from '~/ci/pipeline_details/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
-import PipelineOperations from '~/ci/pipeline_details/components/pipelines_list/pipeline_operations.vue';
-import PipelineTriggerer from '~/ci/pipeline_details/components/pipelines_list/pipeline_triggerer.vue';
-import PipelineUrl from '~/ci/pipeline_details/components/pipelines_list/pipeline_url.vue';
-import PipelinesTable from '~/ci/pipeline_details/components/pipelines_list/pipelines_table.vue';
-import PipelinesTimeago from '~/ci/pipeline_details/components/pipelines_list/time_ago.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import PipelineFailedJobsWidget from '~/ci/pipeline_details/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
+import PipelineOperations from '~/ci/pipeline_details/pipelines_list/components/pipeline_operations.vue';
+import PipelineTriggerer from '~/ci/pipeline_details/pipelines_list/components/pipeline_triggerer.vue';
+import PipelineUrl from '~/ci/pipeline_details/pipelines_list/components/pipeline_url.vue';
+import PipelinesTable from '~/ci/pipeline_details/pipelines_list/components/pipelines_table.vue';
+import PipelinesTimeago from '~/ci/pipeline_details/pipelines_list/components/time_ago.vue';
 import {
   PipelineKeyOptions,
   BUTTON_TOOLTIP_RETRY,
diff --git a/spec/frontend/pipelines/test_reports/empty_state_spec.js b/spec/frontend/pipelines/test_reports/empty_state_spec.js
index c5879bbf0c007e6f8af84dd8b11d3f2e0b441a3d..ed1d6bc7d3753294e539f45ff96080c09452613e 100644
--- a/spec/frontend/pipelines/test_reports/empty_state_spec.js
+++ b/spec/frontend/pipelines/test_reports/empty_state_spec.js
@@ -1,6 +1,6 @@
 import { GlEmptyState } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
-import EmptyState, { i18n } from '~/ci/pipeline_details/components/test_reports/empty_state.vue';
+import EmptyState, { i18n } from '~/ci/pipeline_details/test_reports/empty_state.vue';
 
 describe('Test report empty state', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/test_reports/test_case_details_spec.js b/spec/frontend/pipelines/test_reports/test_case_details_spec.js
index e4058e6b1dcf024d2439e6a35b14e49da8068b71..0f651b9d4567bc64809a8311ebdf1c20a10942d5 100644
--- a/spec/frontend/pipelines/test_reports/test_case_details_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_case_details_spec.js
@@ -1,7 +1,7 @@
 import { GlModal, GlLink } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import TestCaseDetails from '~/ci/pipeline_details/components/test_reports/test_case_details.vue';
+import TestCaseDetails from '~/ci/pipeline_details/test_reports/test_case_details.vue';
 import CodeBlock from '~/vue_shared/components/code_block.vue';
 import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
 
diff --git a/spec/frontend/pipelines/test_reports/test_reports_spec.js b/spec/frontend/pipelines/test_reports/test_reports_spec.js
index 73c07e660d494379a6bf029b57330acbc9ac36ce..8ff060026da1d644643c75bbc04aefa4a25daa49 100644
--- a/spec/frontend/pipelines/test_reports/test_reports_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_reports_spec.js
@@ -5,10 +5,10 @@ import Vue from 'vue';
 import Vuex from 'vuex';
 import testReports from 'test_fixtures/pipelines/test_report.json';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import EmptyState from '~/ci/pipeline_details/components/test_reports/empty_state.vue';
-import TestReports from '~/ci/pipeline_details/components/test_reports/test_reports.vue';
-import TestSummary from '~/ci/pipeline_details/components/test_reports/test_summary.vue';
-import TestSummaryTable from '~/ci/pipeline_details/components/test_reports/test_summary_table.vue';
+import EmptyState from '~/ci/pipeline_details/test_reports/empty_state.vue';
+import TestReports from '~/ci/pipeline_details/test_reports/test_reports.vue';
+import TestSummary from '~/ci/pipeline_details/test_reports/test_summary.vue';
+import TestSummaryTable from '~/ci/pipeline_details/test_reports/test_summary_table.vue';
 import * as getters from '~/ci/pipeline_details/stores/test_reports/getters';
 
 Vue.use(Vuex);
diff --git a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
index bb29be5343a2335574ae95728781996d8cb9c7e2..5bdea6bbcbf0784a18e88a1dc75223bc7132d073 100644
--- a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
@@ -4,9 +4,7 @@ import Vue from 'vue';
 import Vuex from 'vuex';
 import testReports from 'test_fixtures/pipelines/test_report.json';
 import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import SuiteTable, {
-  i18n,
-} from '~/ci/pipeline_details/components/test_reports/test_suite_table.vue';
+import SuiteTable, { i18n } from '~/ci/pipeline_details/test_reports/test_suite_table.vue';
 import { TestStatus } from '~/ci/pipeline_details/constants';
 import * as getters from '~/ci/pipeline_details/stores/test_reports/getters';
 import { formatFilePath } from '~/ci/pipeline_details/stores/test_reports/utils';
diff --git a/spec/frontend/pipelines/test_reports/test_summary_spec.js b/spec/frontend/pipelines/test_reports/test_summary_spec.js
index ecb81838627a8e58fbaca828ce057f0abc340558..f9182d52c8a8eee00152bfc9204c91b0526963c9 100644
--- a/spec/frontend/pipelines/test_reports/test_summary_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_summary_spec.js
@@ -1,6 +1,6 @@
 import { mount } from '@vue/test-utils';
 import testReports from 'test_fixtures/pipelines/test_report.json';
-import Summary from '~/ci/pipeline_details/components/test_reports/test_summary.vue';
+import Summary from '~/ci/pipeline_details/test_reports/test_summary.vue';
 import { formattedTime } from '~/ci/pipeline_details/stores/test_reports/utils';
 
 describe('Test reports summary', () => {
diff --git a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
index 55cb0a7566abedf2d254d51d6bba79b6cc9bd229..bb62fbcb32cbebe08773d2389a18b1790780be4e 100644
--- a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
 // eslint-disable-next-line no-restricted-imports
 import Vuex from 'vuex';
 import testReports from 'test_fixtures/pipelines/test_report.json';
-import SummaryTable from '~/ci/pipeline_details/components/test_reports/test_summary_table.vue';
+import SummaryTable from '~/ci/pipeline_details/test_reports/test_summary_table.vue';
 import * as getters from '~/ci/pipeline_details/stores/test_reports/getters';
 
 Vue.use(Vuex);
diff --git a/spec/frontend/pipelines/time_ago_spec.js b/spec/frontend/pipelines/time_ago_spec.js
index 68597a1f59b05c662d377e8c3f4c00ab56734a90..e651427fb78ccb9d6834753988273dd19ffafdfe 100644
--- a/spec/frontend/pipelines/time_ago_spec.js
+++ b/spec/frontend/pipelines/time_ago_spec.js
@@ -1,7 +1,7 @@
 import { GlIcon } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import TimeAgo from '~/ci/pipeline_details/components/pipelines_list/time_ago.vue';
+import TimeAgo from '~/ci/pipeline_details/pipelines_list/components/time_ago.vue';
 
 describe('Timeago component', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
index 2b97130a264d258c298956cc40d0f3c804b8e61d..bf58e337a7991166c1b4fe12a24566ebe7fd67a2 100644
--- a/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
@@ -3,7 +3,7 @@ import { nextTick } from 'vue';
 import { shallowMount } from '@vue/test-utils';
 import waitForPromises from 'helpers/wait_for_promises';
 import Api from '~/api';
-import PipelineBranchNameToken from '~/ci/pipeline_details/components/pipelines_list/tokens/pipeline_branch_name_token.vue';
+import PipelineBranchNameToken from '~/ci/pipeline_details/pipelines_list/tokens/pipeline_branch_name_token.vue';
 import { branches, mockBranchesAfterMap } from '../mock_data';
 
 describe('Pipeline Branch Name Token', () => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
index 096174d8c3621f78e522213ace52655280467edf..180fdee8353cf93533cc2253e8c76ac4b124ed90 100644
--- a/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
@@ -1,8 +1,8 @@
 import { GlFilteredSearchToken, GlFilteredSearchSuggestion } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
-import { PIPELINE_SOURCES } from 'ee_else_ce/ci/pipeline_details/components/pipelines_list/tokens/constants';
+import { PIPELINE_SOURCES } from 'ee_else_ce/ci/pipeline_details/pipelines_list/tokens/constants';
 import { stubComponent } from 'helpers/stub_component';
-import PipelineSourceToken from '~/ci/pipeline_details/components/pipelines_list/tokens/pipeline_source_token.vue';
+import PipelineSourceToken from '~/ci/pipeline_details/pipelines_list/tokens/pipeline_source_token.vue';
 
 describe('Pipeline Source Token', () => {
   let wrapper;
diff --git a/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
index 17c038a1e5833654cdd3580acf714d5b061ec6cc..4b9d4fb7a943f8f84cfdd29e8127fcaf40a150e0 100644
--- a/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
@@ -1,7 +1,7 @@
 import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlIcon } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import { stubComponent } from 'helpers/stub_component';
-import PipelineStatusToken from '~/ci/pipeline_details/components/pipelines_list/tokens/pipeline_status_token.vue';
+import PipelineStatusToken from '~/ci/pipeline_details/pipelines_list/tokens/pipeline_status_token.vue';
 import {
   TOKEN_TITLE_STATUS,
   TOKEN_TYPE_STATUS,
diff --git a/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
index fbd5d6dd9a35d2355a93ff39e30f7ae5fd3042f8..a40c6f5c8f883116858713e5cba9f448b1558e56 100644
--- a/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
@@ -1,7 +1,7 @@
 import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlLoadingIcon } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 import Api from '~/api';
-import PipelineTagNameToken from '~/ci/pipeline_details/components/pipelines_list/tokens/pipeline_tag_name_token.vue';
+import PipelineTagNameToken from '~/ci/pipeline_details/pipelines_list/tokens/pipeline_tag_name_token.vue';
 import { tags, mockTagsAfterMap } from '../mock_data';
 
 describe('Pipeline Branch Name Token', () => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
index dcb7d51e1aebb0aba2bacae266540ba523204143..cc1303f4abc950dded397706ffab96d4c948da78 100644
--- a/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
@@ -2,7 +2,7 @@ import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlLoadingIcon } from
 import { shallowMount } from '@vue/test-utils';
 import { stubComponent } from 'helpers/stub_component';
 import Api from '~/api';
-import PipelineTriggerAuthorToken from '~/ci/pipeline_details/components/pipelines_list/tokens/pipeline_trigger_author_token.vue';
+import PipelineTriggerAuthorToken from '~/ci/pipeline_details/pipelines_list/tokens/pipeline_trigger_author_token.vue';
 import { users } from '../mock_data';
 
 describe('Pipeline Trigger Author Token', () => {
diff --git a/spec/frontend/pipelines/unwrapping_utils_spec.js b/spec/frontend/pipelines/unwrapping_utils_spec.js
index 3f7abe3f024e6185ec09dee205f7fc0258bd8af0..99ee2eff1e4cfaba2e785f8d2c2f127746f5e445 100644
--- a/spec/frontend/pipelines/unwrapping_utils_spec.js
+++ b/spec/frontend/pipelines/unwrapping_utils_spec.js
@@ -2,7 +2,7 @@ import {
   unwrapGroups,
   unwrapNodesWithName,
   unwrapStagesWithNeeds,
-} from '~/ci/pipeline_details/components/unwrapping_utils';
+} from '~/ci/pipeline_details/utils/unwrapping_utils';
 
 const groupsArray = [
   {
diff --git a/spec/frontend/pipelines/utils_spec.js b/spec/frontend/pipelines/utils_spec.js
index 1853d6ea703a82524e4d9935822e611319cdb9c6..b52a646cefcf037c48afc9e400790ce9906c2562 100644
--- a/spec/frontend/pipelines/utils_spec.js
+++ b/spec/frontend/pipelines/utils_spec.js
@@ -1,5 +1,5 @@
 import mockPipelineResponse from 'test_fixtures/pipelines/pipeline_details.json';
-import { createSankey } from '~/ci/pipeline_details/components/dag/drawing_utils';
+import { createSankey } from '~/ci/pipeline_details/dag/drawing_utils';
 import {
   makeLinksFromNodes,
   filterByAncestors,
@@ -9,7 +9,7 @@ import {
   parseData,
   removeOrphanNodes,
   getMaxNodes,
-} from '~/ci/pipeline_details/components/parsing_utils';
+} from '~/ci/pipeline_details/utils/parsing_utils';
 import { createNodeDict } from '~/ci/pipeline_details/utils';
 
 import { mockDownstreamPipelinesRest } from '../vue_merge_request_widget/mock_data';
diff --git a/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js b/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
index dd2537448c024c44b6603b131e0fb87bb2117a01..35b4e222e01f37a8a5c226ab77959c50ea3b52cd 100644
--- a/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
@@ -6,7 +6,7 @@ import { trimText } from 'helpers/text_helper';
 import { extendedWrapper } from 'helpers/vue_test_utils_helper';
 import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
 import MRWidgetPipelineComponent from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue';
-import LegacyPipelineMiniGraph from '~/ci/pipeline_details/components/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
+import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
 import { SUCCESS } from '~/vue_merge_request_widget/constants';
 import mockData from '../mock_data';
 
diff --git a/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js b/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
index 1c5a4e508bba0e2510a9f84ece8786779c5ca3b7..88c348629cb40ac0e970366ea367ec926b1c1596 100644
--- a/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
+++ b/spec/frontend/vue_merge_request_widget/extensions/test_report/index_spec.js
@@ -11,7 +11,7 @@ import {
   HTTP_STATUS_NO_CONTENT,
   HTTP_STATUS_OK,
 } from '~/lib/utils/http_status';
-import TestCaseDetails from '~/ci/pipeline_details/components/test_reports/test_case_details.vue';
+import TestCaseDetails from '~/ci/pipeline_details/test_reports/test_case_details.vue';
 
 import { failedReport } from 'jest/ci/reports/mock_data/mock_data';
 import mixedResultsTestReports from 'jest/ci/reports/mock_data/new_and_fixed_failures_report.json';