diff --git a/src/shared/Modules/Tabs/TabsModule.cpp b/src/shared/Modules/Tabs/TabsModule.cpp
index ea7d6c16566d9f82a40cac8a009050f2d87952cf..5b3c075c67cb419bda1a1c6a5972b58678a28d46 100644
--- a/src/shared/Modules/Tabs/TabsModule.cpp
+++ b/src/shared/Modules/Tabs/TabsModule.cpp
@@ -43,11 +43,21 @@ XmlObject TabsModule::toXmlObject()
 {
     XmlObject obj = Module::toXmlObject();
 
-    for (int i = 0; i != contentModules.size(); i++)
+    for (int i = 0; i != tabContents->count(); i++)
     {
         XmlObject tab("tab");
         tab.addAttribute("name", tabNames->item(i)->text());
-        tab.addChild(contentModules.at(i)->toXmlObject());
+        if (auto module = qobject_cast<Module*>(tabContents->widget(i)))
+        {
+            tab.addChild(module->toXmlObject());
+        }
+        else
+        {
+            qCritical() << "Unable to save tab " << tabNames->item(i)->text()
+                        << " due to failed when casting widget to Module*";
+            continue;  // Skip this tab
+        }
+
         obj.addChild(tab);
     }
 
@@ -58,13 +68,8 @@ void TabsModule::fromXmlObject(const XmlObject& xmlObject)
 {
     // Discard previous content
     tabNames->clear();
-    for (int i = contentModules.size() - 1; i >= 0; i--)
-    {
-        auto* module = contentModules[i];
-        contentModules.pop_back();
-        tabContents->removeWidget(tabContents->widget(i));
-        delete module;
-    }
+    for (int i = tabContents->count() - 1; i >= 0; i--)
+        delete tabContents->widget(i);
 
     for (int i = 0; i < xmlObject.childCount(); ++i)
     {
@@ -84,12 +89,14 @@ void TabsModule::fromXmlObject(const XmlObject& xmlObject)
         }
         else
         {
-            // TODO: what should we do?
+            qCritical() << "Failed to instantiate module"
+                        << tabNode.getAttribute("name",
+                                                generateUniqueTabName());
         }
     }
 
     // If the tabs are left empty, add a single tab with an empty module
-    if (contentModules.size() == 0)
+    if (tabNames->count() == 0)
         addTab(generateUniqueTabName(),
                ModulesList::getInstance().instantiateModule(ModuleId::EMPTY));
 
@@ -107,7 +114,6 @@ void TabsModule::addTab(const QString& tabName, Module* module)
     tabNames->addItem(listItem);
 
     tabContents->addWidget(module);
-    contentModules.append(module);
 
     // We set the correct tabName after the widget is added
     tabNames->setCurrentItem(listItem);
@@ -128,45 +134,39 @@ void TabsModule::replaceTab(Module* oldModule, Module* newModule)
     if (oldModule == newModule)
         return;
 
-    int index = contentModules.indexOf(oldModule);
-
-    // Check if the old module is a child
+    // Get the index of the old module
+    int index = tabContents->indexOf(oldModule);
     if (index == -1)
         return;
 
-    // Can replace only current tab
-    tabNames->setCurrentItem(tabNames->item(index));
-
-    contentModules.replace(index, newModule);
+    // Replace the module
     tabContents->insertWidget(index, newModule);
-    tabContents->removeWidget(oldModule);
     tabContents->setCurrentWidget(newModule);
+    tabContents->removeWidget(oldModule);
+    delete oldModule;
     tabContents->update();
 
     connect(newModule, &Module::replaceMe, this, &TabsModule::replaceTab);
     connect(newModule, &Module::closeMe, this, &TabsModule::closeTab);
-
-    delete oldModule;
 }
 
 void TabsModule::closeTab(Module* module)
 {
-    int index = contentModules.indexOf(module);
+    int index = tabContents->indexOf(module);
 
     // Check if the given module is a child
     if (index == -1)
         return;
 
     // If there is only one child, then close the entire tabs module
-    if (contentModules.count() == 1)
+    if (tabContents->count() == 1)
     {
         emit closeMe(this);
         return;
     }
 
-    contentModules.removeAt(index);
-    tabContents->removeWidget(tabContents->widget(index));
-    tabNames->takeItem(index);
+    tabContents->removeWidget(module);
+    delete tabNames->item(index);
     tabNames->setCurrentItem(tabNames->item(index == 0 ? 0 : index - 1));
 }
 
@@ -202,8 +202,11 @@ void TabsModule::onMenuNewTabClick()
 
 void TabsModule::onMenuDeleteTabClick()
 {
-    delete contentModules.at(tabNames->currentRow());
-    tabNames->removeItemWidget(tabNames->currentItem());
+    if (auto module = qobject_cast<Module*>(tabContents->currentWidget()))
+        closeTab(module);
+    else
+        qCritical() << "Unable to close tab  due to failed when casting widget "
+                       "to Module*";
 }
 
 void TabsModule::onMenuRenameTabClick()
@@ -231,7 +234,6 @@ void TabsModule::setupUi()
     QBoxLayout* outerLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
     outerLayout->setContentsMargins(0, 0, 0, 0);
     outerLayout->setSpacing(0);
-
     outerLayout->addWidget(tabNames);
     outerLayout->addWidget(tabContents);
 }
diff --git a/src/shared/Modules/Tabs/TabsModule.h b/src/shared/Modules/Tabs/TabsModule.h
index d06ba6c804c502de20b0852e35e0a97bc07f1997..025946acca6452ece8dc0b535f70a18d2383c747 100644
--- a/src/shared/Modules/Tabs/TabsModule.h
+++ b/src/shared/Modules/Tabs/TabsModule.h
@@ -53,5 +53,4 @@ private:
 
     QListWidget* tabNames;
     QStackedWidget* tabContents;
-    QList<Module*> contentModules;
 };