diff --git a/src/env/components/Dumps/Dumps.vue b/src/env/components/Dumps/Dumps.vue
deleted file mode 100644
index 8181c5b..0000000
--- a/src/env/components/Dumps/Dumps.vue
+++ /dev/null
@@ -1,332 +0,0 @@
-<template>
-  <b-container fluid="xl">
-    <page-title />
-    <b-row>
-      <b-col sm="6" lg="5" xl="4">
-        <page-section :section-title="$t('pageDumps.initiateDump')">
-          <dumps-form />
-        </page-section>
-      </b-col>
-    </b-row>
-    <b-row>
-      <b-col xl="10">
-        <page-section :section-title="$t('pageDumps.dumpsAvailableOnBmc')">
-          <b-row class="align-items-start">
-            <b-col sm="8" xl="6" class="d-sm-flex align-items-end">
-              <search
-                :placeholder="$t('pageDumps.table.searchDumps')"
-                @change-search="onChangeSearchInput"
-                @clear-search="onClearSearchInput"
-              />
-              <div class="ml-sm-4">
-                <table-cell-count
-                  :filtered-items-count="filteredItemCount"
-                  :total-number-of-cells="tableItems.length"
-                ></table-cell-count>
-              </div>
-            </b-col>
-            <b-col sm="8" md="7" xl="6">
-              <table-date-filter @change="onChangeDateTimeFilter" />
-            </b-col>
-          </b-row>
-          <table-toolbar
-            :selected-items-count="selectedRows.length"
-            :actions="batchActions"
-            @clear-selected="clearSelectedRows($refs.table)"
-            @batch-action="onTableBatchAction"
-          />
-          <b-table
-            ref="table"
-            show-empty
-            hover
-            sort-icon-left
-            no-sort-reset
-            sort-desc
-            selectable
-            no-select-on-click
-            responsive="md"
-            sort-by="dateTime"
-            :fields="fields"
-            :items="filteredTableItems"
-            :empty-text="$t('global.table.emptyMessage')"
-            :empty-filtered-text="$t('global.table.emptySearchMessage')"
-            :filter="searchFilter"
-            @filtered="onChangeSearchFilter"
-            @row-selected="onRowSelected($event, filteredTableItems.length)"
-          >
-            <!-- Checkbox column -->
-            <template #head(checkbox)>
-              <b-form-checkbox
-                v-model="tableHeaderCheckboxModel"
-                :indeterminate="tableHeaderCheckboxIndeterminate"
-                @change="onChangeHeaderCheckbox($refs.table)"
-              >
-                <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
-              </b-form-checkbox>
-            </template>
-            <template #cell(checkbox)="row">
-              <b-form-checkbox
-                v-model="row.rowSelected"
-                @change="toggleSelectRow($refs.table, row.index)"
-              >
-                <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
-              </b-form-checkbox>
-            </template>
-
-            <!-- Date and Time column -->
-            <template #cell(dateTime)="{ value }">
-              <p class="mb-0">{{ value | formatDate }}</p>
-              <p class="mb-0">{{ value | formatTime }}</p>
-            </template>
-
-            <!-- Size column -->
-            <template #cell(size)="{ value }">
-              {{ convertBytesToMegabytes(value) }} MB
-            </template>
-
-            <!-- Actions column -->
-            <template #cell(actions)="row">
-              <table-row-action
-                v-for="(action, index) in row.item.actions"
-                :key="index"
-                :value="action.value"
-                :title="action.title"
-                :download-location="row.item.data"
-                :export-name="`${row.item.dumpType} ${row.item.id}`"
-                @click-table-action="onTableRowAction($event, row.item)"
-              >
-                <template #icon>
-                  <icon-download v-if="action.value === 'download'" />
-                  <icon-delete v-if="action.value === 'delete'" />
-                </template>
-              </table-row-action>
-            </template>
-          </b-table>
-        </page-section>
-      </b-col>
-    </b-row>
-  </b-container>
-</template>
-
-<script>
-import IconDelete from '@carbon/icons-vue/es/trash-can/20';
-import IconDownload from '@carbon/icons-vue/es/download/20';
-
-import DumpsForm from './DumpsForm';
-import PageSection from '@/components/Global/PageSection';
-import PageTitle from '@/components/Global/PageTitle';
-import Search from '@/components/Global/Search';
-import TableCellCount from '@/components/Global/TableCellCount';
-import TableDateFilter from '@/components/Global/TableDateFilter';
-import TableRowAction from '@/components/Global/TableRowAction';
-import TableToolbar from '@/components/Global/TableToolbar';
-
-import BVTableSelectableMixin, {
-  selectedRows,
-  tableHeaderCheckboxModel,
-  tableHeaderCheckboxIndeterminate,
-} from '@/components/Mixins/BVTableSelectableMixin';
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
-import SearchFilterMixin, {
-  searchFilter,
-} from '@/components/Mixins/SearchFilterMixin';
-import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
-
-export default {
-  components: {
-    DumpsForm,
-    IconDelete,
-    IconDownload,
-    PageSection,
-    PageTitle,
-    Search,
-    TableCellCount,
-    TableDateFilter,
-    TableRowAction,
-    TableToolbar,
-  },
-  mixins: [
-    BVTableSelectableMixin,
-    BVToastMixin,
-    LoadingBarMixin,
-    SearchFilterMixin,
-    TableFilterMixin,
-  ],
-  beforeRouteLeave(to, from, next) {
-    // Hide loader if the user navigates to another page
-    // before request is fulfilled.
-    this.hideLoader();
-    next();
-  },
-  data() {
-    return {
-      fields: [
-        {
-          key: 'checkbox',
-          sortable: false,
-        },
-        {
-          key: 'dateTime',
-          label: this.$t('pageDumps.table.dateAndTime'),
-          sortable: true,
-        },
-        {
-          key: 'dumpType',
-          label: this.$t('pageDumps.table.dumpType'),
-          sortable: true,
-        },
-        {
-          key: 'id',
-          label: this.$t('pageDumps.table.id'),
-          sortable: true,
-        },
-        {
-          key: 'size',
-          label: this.$t('pageDumps.table.size'),
-          sortable: true,
-        },
-        {
-          key: 'actions',
-          sortable: false,
-          label: '',
-          tdClass: 'text-right text-nowrap',
-        },
-      ],
-      batchActions: [
-        {
-          value: 'delete',
-          label: this.$t('global.action.delete'),
-        },
-      ],
-      filterEndDate: null,
-      filterStartDate: null,
-      searchFilter,
-      searchFilteredItemsCount: 0,
-      selectedRows,
-      tableHeaderCheckboxIndeterminate,
-      tableHeaderCheckboxModel,
-    };
-  },
-  computed: {
-    dumps() {
-      return this.$store.getters['dumps/bmcDumps'];
-    },
-    tableItems() {
-      return this.dumps.map((item) => {
-        return {
-          ...item,
-          actions: [
-            {
-              value: 'download',
-              title: this.$t('global.action.download'),
-            },
-            {
-              value: 'delete',
-              title: this.$t('global.action.delete'),
-            },
-          ],
-        };
-      });
-    },
-    filteredTableItems() {
-      return this.getFilteredTableDataByDate(
-        this.tableItems,
-        this.filterStartDate,
-        this.filterEndDate,
-        'dateTime'
-      );
-    },
-    filteredItemCount() {
-      return this.searchFilter
-        ? this.searchFilteredItemsCount
-        : this.filteredTableItems.length;
-    },
-  },
-  created() {
-    this.startLoader();
-    this.$store.dispatch('dumps/getBmcDumps').finally(() => this.endLoader());
-  },
-  methods: {
-    convertBytesToMegabytes(bytes) {
-      return parseFloat((bytes / 1000000).toFixed(3));
-    },
-    onChangeSearchFilter(items) {
-      this.searchFilteredItemsCount = items.length;
-    },
-    onChangeDateTimeFilter({ fromDate, toDate }) {
-      this.filterStartDate = fromDate;
-      this.filterEndDate = toDate;
-    },
-    onTableRowAction(action, dump) {
-      if (action === 'delete') {
-        this.$bvModal
-          .msgBoxConfirm(this.$tc('pageDumps.modal.deleteDumpConfirmation'), {
-            title: this.$tc('pageDumps.modal.deleteDump'),
-            okTitle: this.$tc('pageDumps.modal.deleteDump'),
-            cancelTitle: this.$t('global.action.cancel'),
-          })
-          .then((deleteConfrimed) => {
-            if (deleteConfrimed) {
-              this.$store
-                .dispatch('dumps/deleteDumps', [dump])
-                .then((messages) => {
-                  messages.forEach(({ type, message }) => {
-                    if (type === 'success') {
-                      this.successToast(message);
-                    } else if (type === 'error') {
-                      this.errorToast(message);
-                    }
-                  });
-                });
-            }
-          });
-      }
-    },
-    onTableBatchAction(action) {
-      if (action === 'delete') {
-        this.$bvModal
-          .msgBoxConfirm(
-            this.$tc(
-              'pageDumps.modal.deleteDumpConfirmation',
-              this.selectedRows.length
-            ),
-            {
-              title: this.$tc(
-                'pageDumps.modal.deleteDump',
-                this.selectedRows.length
-              ),
-              okTitle: this.$tc(
-                'pageDumps.modal.deleteDump',
-                this.selectedRows.length
-              ),
-              cancelTitle: this.$t('global.action.cancel'),
-            }
-          )
-          .then((deleteConfrimed) => {
-            if (deleteConfrimed) {
-              if (this.selectedRows.length === this.dumps.length) {
-                this.$store
-                  .dispatch('dumps/deleteAllDumps')
-                  .then((success) => this.successToast(success))
-                  .catch(({ message }) => this.errorToast(message));
-              } else {
-                this.$store
-                  .dispatch('dumps/deleteDumps', this.selectedRows)
-                  .then((messages) => {
-                    messages.forEach(({ type, message }) => {
-                      if (type === 'success') {
-                        this.successToast(message);
-                      } else if (type === 'error') {
-                        this.errorToast(message);
-                      }
-                    });
-                  });
-              }
-            }
-          });
-      }
-    },
-  },
-};
-</script>
diff --git a/src/env/components/Dumps/DumpsForm.vue b/src/env/components/Dumps/DumpsForm.vue
deleted file mode 100644
index 02ec186..0000000
--- a/src/env/components/Dumps/DumpsForm.vue
+++ /dev/null
@@ -1,95 +0,0 @@
-<template>
-  <div class="form-background p-3">
-    <b-form id="form-new-dump" novalidate @submit.prevent="handleSubmit">
-      <b-form-group
-        :label="$t('pageDumps.form.selectDumpType')"
-        label-for="selectDumpType"
-      >
-        <b-form-select
-          id="selectDumpType"
-          v-model="selectedDumpType"
-          :options="dumpTypeOptions"
-          :state="getValidationState($v.selectedDumpType)"
-        >
-          <template #first>
-            <b-form-select-option :value="null" disabled>
-              {{ $t('global.form.selectAnOption') }}
-            </b-form-select-option>
-          </template>
-        </b-form-select>
-        <b-form-invalid-feedback role="alert">
-          {{ $t('global.form.required') }}
-        </b-form-invalid-feedback>
-      </b-form-group>
-      <alert variant="info" class="mb-3" :show="selectedDumpType === 'system'">
-        {{ $t('pageDumps.form.systemDumpInfo') }}
-      </alert>
-      <b-button variant="primary" type="submit" form="form-new-dump">
-        {{ $t('pageDumps.form.initiateDump') }}
-      </b-button>
-    </b-form>
-    <modal-confirmation @ok="createSystemDump" />
-  </div>
-</template>
-
-<script>
-import { required } from 'vuelidate/lib/validators';
-
-import ModalConfirmation from './DumpsModalConfirmation';
-import Alert from '@/components/Global/Alert';
-
-import BVToastMixin from '@/components/Mixins/BVToastMixin';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-
-export default {
-  components: { Alert, ModalConfirmation },
-  mixins: [BVToastMixin, VuelidateMixin],
-  data() {
-    return {
-      selectedDumpType: null,
-      dumpTypeOptions: [
-        { value: 'bmc', text: this.$t('pageDumps.form.bmcDump') },
-        { value: 'system', text: this.$t('pageDumps.form.systemDump') },
-      ],
-    };
-  },
-  validations() {
-    return {
-      selectedDumpType: { required },
-    };
-  },
-  methods: {
-    handleSubmit() {
-      this.$v.$touch();
-      if (this.$v.$invalid) return;
-      if (this.selectedDumpType === 'system') {
-        this.showConfirmationModal();
-      } else {
-        this.$store
-          .dispatch('dumps/createBmcDump')
-          .then(() =>
-            this.infoToast(this.$t('pageDumps.toast.successStartBmcDump'), {
-              title: this.$t('pageDumps.toast.successStartBmcDumpTitle'),
-              timestamp: true,
-            })
-          )
-          .catch(({ message }) => this.errorToast(message));
-      }
-    },
-    showConfirmationModal() {
-      this.$bvModal.show('modal-confirmation');
-    },
-    createSystemDump() {
-      this.$store
-        .dispatch('dumps/createSystemDump')
-        .then(() =>
-          this.infoToast(this.$t('pageDumps.toast.successStartSystemDump'), {
-            title: this.$t('pageDumps.toast.successStartSystemDumpTitle'),
-            timestamp: true,
-          })
-        )
-        .catch(({ message }) => this.errorToast(message));
-    },
-  },
-};
-</script>
diff --git a/src/env/components/Dumps/DumpsModalConfirmation.vue b/src/env/components/Dumps/DumpsModalConfirmation.vue
deleted file mode 100644
index f8e20cf..0000000
--- a/src/env/components/Dumps/DumpsModalConfirmation.vue
+++ /dev/null
@@ -1,75 +0,0 @@
-<template>
-  <b-modal
-    id="modal-confirmation"
-    ref="modal"
-    :title="$t('pageDumps.modal.initiateSystemDump')"
-    @hidden="resetForm"
-  >
-    <p>
-      <strong>
-        {{ $t('pageDumps.modal.initiateSystemDumpMessage1') }}
-      </strong>
-    </p>
-    <p>
-      {{ $t('pageDumps.modal.initiateSystemDumpMessage2') }}
-    </p>
-    <p>
-      <status-icon status="danger" />
-      {{ $t('pageDumps.modal.initiateSystemDumpMessage3') }}
-    </p>
-    <b-form-checkbox v-model="confirmed" @input="$v.confirmed.$touch()">
-      {{ $t('pageDumps.modal.initiateSystemDumpMessage4') }}
-    </b-form-checkbox>
-    <b-form-invalid-feedback
-      :state="getValidationState($v.confirmed)"
-      role="alert"
-    >
-      {{ $t('global.form.required') }}
-    </b-form-invalid-feedback>
-    <template #modal-footer="{ cancel }">
-      <b-button variant="secondary" @click="cancel()">
-        {{ $t('global.action.cancel') }}
-      </b-button>
-      <b-button variant="danger" @click="handleSubmit">
-        {{ $t('pageDumps.form.initiateDump') }}
-      </b-button>
-    </template>
-  </b-modal>
-</template>
-
-<script>
-import StatusIcon from '@/components/Global/StatusIcon';
-import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
-
-export default {
-  components: { StatusIcon },
-  mixins: [VuelidateMixin],
-  data() {
-    return {
-      confirmed: false,
-    };
-  },
-  validations: {
-    confirmed: {
-      mustBeTrue: (value) => value === true,
-    },
-  },
-  methods: {
-    closeModal() {
-      this.$nextTick(() => {
-        this.$refs.modal.hide();
-      });
-    },
-    handleSubmit() {
-      this.$v.$touch();
-      if (this.$v.$invalid) return;
-      this.$emit('ok');
-      this.closeModal();
-    },
-    resetForm() {
-      this.confirmed = false;
-      this.$v.$reset();
-    },
-  },
-};
-</script>
diff --git a/src/env/components/Dumps/index.js b/src/env/components/Dumps/index.js
deleted file mode 100644
index 65525fb..0000000
--- a/src/env/components/Dumps/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import Dumps from './Dumps.vue';
-export default Dumps;
diff --git a/src/env/router/ibm.js b/src/env/router/ibm.js
index c4e1a69..317125e 100644
--- a/src/env/router/ibm.js
+++ b/src/env/router/ibm.js
@@ -27,7 +27,7 @@
 import i18n from '@/i18n';
 
 // Custom components
-import Dumps from '../components/Dumps';
+import Dumps from '@/views/Health/Dumps';
 
 const routes = [
   {
diff --git a/src/env/store/Dumps/DumpsStore.js b/src/env/store/Dumps/DumpsStore.js
deleted file mode 100644
index 3b91354..0000000
--- a/src/env/store/Dumps/DumpsStore.js
+++ /dev/null
@@ -1,117 +0,0 @@
-import api, { getResponseCount } from '@/store/api';
-import i18n from '@/i18n';
-
-const DumpsStore = {
-  namespaced: true,
-  state: {
-    bmcDumps: [],
-  },
-  getters: {
-    bmcDumps: (state) => state.bmcDumps,
-  },
-  mutations: {
-    setBmcDumps: (state, dumps) => {
-      state.bmcDumps = dumps.map((dump) => ({
-        data: dump.AdditionalDataURI,
-        dateTime: new Date(dump.Created),
-        dumpType: dump.Name,
-        id: dump.Id,
-        location: dump['@odata.id'],
-        size: dump.AdditionalDataSizeBytes,
-      }));
-    },
-  },
-  actions: {
-    async getBmcDumps({ commit }) {
-      return await api
-        .get('/redfish/v1/Managers/bmc/LogServices/Dump/Entries')
-        .then(({ data = {} }) => commit('setBmcDumps', data.Members || []))
-        .catch((error) => console.log(error));
-    },
-    async createBmcDump() {
-      return await api
-        .post(
-          '/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData',
-          {
-            DiagnosticDataType: 'Manager',
-            OEMDiagnosticDataType: '',
-          }
-        )
-        .catch((error) => {
-          console.log(error);
-          throw new Error(i18n.t('pageDumps.toast.errorStartBmcDump'));
-        });
-    },
-    async createSystemDump() {
-      return await api
-        .post(
-          '/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.CollectDiagnosticData',
-          {
-            DiagnosticDataType: 'OEM',
-            OEMDiagnosticDataType: 'System',
-          }
-        )
-        .catch((error) => {
-          console.log(error);
-          throw new Error(i18n.t('pageDumps.toast.errorStartSystemDump'));
-        });
-    },
-    async deleteDumps({ dispatch }, dumps) {
-      const promises = dumps.map(({ location }) =>
-        api.delete(location).catch((error) => {
-          console.log(error);
-          return error;
-        })
-      );
-      return await api
-        .all(promises)
-        .then((response) => {
-          dispatch('getBmcDumps');
-          return response;
-        })
-        .then(
-          api.spread((...responses) => {
-            const { successCount, errorCount } = getResponseCount(responses);
-            const toastMessages = [];
-
-            if (successCount) {
-              const message = i18n.tc(
-                'pageDumps.toast.successDeleteDump',
-                successCount
-              );
-              toastMessages.push({ type: 'success', message });
-            }
-
-            if (errorCount) {
-              const message = i18n.tc(
-                'pageDumps.toast.errorDeleteDump',
-                errorCount
-              );
-              toastMessages.push({ type: 'error', message });
-            }
-
-            return toastMessages;
-          })
-        );
-    },
-    async deleteAllDumps({ commit, state }) {
-      const totalDumpCount = state.bmcDumps.length;
-      return await api
-        .post(
-          '/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.ClearLog'
-        )
-        .then(() => {
-          commit('setBmcDumps', []);
-          return i18n.tc('pageDumps.toast.successDeleteDump', totalDumpCount);
-        })
-        .catch((error) => {
-          console.log(error);
-          throw new Error(
-            i18n.tc('pageDumps.toast.errorDeleteDump', totalDumpCount)
-          );
-        });
-    },
-  },
-};
-
-export default DumpsStore;
diff --git a/src/env/store/ibm.js b/src/env/store/ibm.js
index 980236f..ff20b9c 100644
--- a/src/env/store/ibm.js
+++ b/src/env/store/ibm.js
@@ -1,5 +1,5 @@
 import store from '@/store';
-import DumpsStore from './Dumps/DumpsStore';
+import DumpsStore from '@/store/modules/Health/DumpsStore';
 
 store.unregisterModule('virtualMedia');
 
