diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
index 0f692f231428dcc1e9f9ff291f9e0e4a0e333911..c2d61478e998a406358a0eabb56d2d9498829cde 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
@@ -10,10 +10,10 @@ import { normalizeHeaders } from '~/lib/utils/common_utils';
 import { EXTENSION_ICON_CLASS, EXTENSION_ICONS } from '../../constants';
 import Actions from '../action_buttons.vue';
 import StateContainer from '../state_container.vue';
+import { generateText } from '../widget/utils';
+import { createTelemetryHub } from '../widget/telemetry';
 import StatusIcon from './status_icon.vue';
 import ChildContent from './child_content.vue';
-import { createTelemetryHub } from './telemetry';
-import { generateText } from './utils';
 
 export const LOADING_STATES = {
   collapsedLoading: 'collapsedLoading',
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
index 5f0fd973e84022d93c39c3cc06d6933265c79896..bb0d53fd60d983a1c88c617f17c88da81ad59fd5 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
@@ -3,8 +3,8 @@ import { GlBadge, GlLink, GlModalDirective } from '@gitlab/ui';
 import { isArray } from 'lodash';
 import SafeHtml from '~/vue_shared/directives/safe_html';
 import Actions from '../action_buttons.vue';
+import { generateText } from '../widget/utils';
 import StatusIcon from './status_icon.vue';
-import { generateText } from './utils';
 
 export default {
   name: 'ChildContent',
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/README.md b/app/assets/javascripts/vue_merge_request_widget/components/widget/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..45ebafec8bf505d06752366a621979a6ff28bb40
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/README.md
@@ -0,0 +1 @@
+Please see [the Widget Extensions documentation](development/merge_request_concepts/widget_extensions.md) for necessary information regarding development of new MR Widgets.
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
index cbc7b91922b00fd17068ad1cf03a87f885c17e6f..4c4aac2ee7f4a4253e000dfb00990f3b32b29a07 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
@@ -1,7 +1,7 @@
 <script>
 import { GlBadge, GlLink, GlTooltipDirective } from '@gitlab/ui';
 import SafeHtml from '~/vue_shared/directives/safe_html';
-import { generateText } from '../extensions/utils';
+import { generateText } from './utils';
 import ContentRow from './widget_content_row.vue';
 import Actions from './action_buttons.vue';
 
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js b/app/assets/javascripts/vue_merge_request_widget/components/widget/telemetry.js
similarity index 100%
rename from app/assets/javascripts/vue_merge_request_widget/components/extensions/telemetry.js
rename to app/assets/javascripts/vue_merge_request_widget/components/widget/telemetry.js
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js b/app/assets/javascripts/vue_merge_request_widget/components/widget/utils.js
similarity index 100%
rename from app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
rename to app/assets/javascripts/vue_merge_request_widget/components/widget/utils.js
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
index d85ba5374d32c2e439b4d01918dd4cc9c3b33057..cea7f732e215d9655a5dc50fe5dd763ae124e317 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
@@ -10,8 +10,8 @@ import Poll from '~/lib/utils/poll';
 import HelpPopover from '~/vue_shared/components/help_popover.vue';
 import { DynamicScroller, DynamicScrollerItem } from 'vendor/vue-virtual-scroller';
 import { EXTENSION_ICONS } from '../../constants';
-import { createTelemetryHub } from '../extensions/telemetry';
-import { generateText } from '../extensions/utils';
+import { generateText } from './utils';
+import { createTelemetryHub } from './telemetry';
 import ContentRow from './widget_content_row.vue';
 import DynamicContent from './dynamic_content.vue';
 import StatusIcon from './status_icon.vue';
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
index afdb9e9ff0866a11d803d84e853795e67530ed0b..bd2a669a312f7432d63a1bf101f2f83db08f7af0 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue
@@ -4,7 +4,7 @@ import { __ } from '~/locale';
 import HelpPopover from '~/vue_shared/components/help_popover.vue';
 import SafeHtml from '~/vue_shared/directives/safe_html';
 import { EXTENSION_ICONS } from '../../constants';
-import { generateText } from '../extensions/utils';
+import { generateText } from './utils';
 import ActionButtons from './action_buttons.vue';
 import StatusIcon from './status_icon.vue';
 
diff --git a/spec/frontend/vue_merge_request_widget/components/extensions/utils_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/utils_spec.js
similarity index 98%
rename from spec/frontend/vue_merge_request_widget/components/extensions/utils_spec.js
rename to spec/frontend/vue_merge_request_widget/components/widget/utils_spec.js
index 5799799ad5e83a90aa40ef865340253ba1dd7ab4..ef74dd59106d229fcaebf2ad85436b50b37e56dd 100644
--- a/spec/frontend/vue_merge_request_widget/components/extensions/utils_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/widget/utils_spec.js
@@ -1,4 +1,4 @@
-import { generateText } from '~/vue_merge_request_widget/components/extensions/utils';
+import { generateText } from '~/vue_merge_request_widget/components/widget/utils';
 
 describe('generateText', () => {
   it.each`
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
index 87c1ad7947e8573b00a27dc80a8239458cac264e..921cf341b192c0089a6321f85d3b47ab7e8f6463 100644
--- a/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
@@ -4,7 +4,7 @@ import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_help
 import HelpPopover from '~/vue_shared/components/help_popover.vue';
 import waitForPromises from 'helpers/wait_for_promises';
 import { assertProps } from 'helpers/assert_props';
-import StatusIcon from '~/vue_merge_request_widget/components/extensions/status_icon.vue';
+import StatusIcon from '~/vue_merge_request_widget/components/widget/status_icon.vue';
 import ActionButtons from '~/vue_merge_request_widget/components/widget/action_buttons.vue';
 import Widget from '~/vue_merge_request_widget/components/widget/widget.vue';
 import WidgetContentRow from '~/vue_merge_request_widget/components/widget/widget_content_row.vue';
@@ -12,7 +12,7 @@ import * as logger from '~/lib/logger';
 import axios from '~/lib/utils/axios_utils';
 import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
 
-jest.mock('~/vue_merge_request_widget/components/extensions/telemetry', () => ({
+jest.mock('~/vue_merge_request_widget/components/widget/telemetry', () => ({
   createTelemetryHub: jest.fn().mockReturnValue({
     viewed: jest.fn(),
     expanded: jest.fn(),