diff --git a/loader/src/ui/mods/popups/ModPopup.cpp b/loader/src/ui/mods/popups/ModPopup.cpp
index 578067e2..226c0fd8 100644
--- a/loader/src/ui/mods/popups/ModPopup.cpp
+++ b/loader/src/ui/mods/popups/ModPopup.cpp
@@ -182,10 +182,14 @@ bool ModPopup::setup(ModSource&& src) {
             to3B(ColorProvider::get()->color("mod-list-restart-required-label-bg"_spr))
         }}
     );
-    m_restartRequiredLabel->setLayoutOptions(AxisLayoutOptions::create()->setMaxScale(.75f));
     m_restartRequiredLabel->setScale(.3f);
     manageContainer->addChildAtPosition(m_restartRequiredLabel, Anchor::Right, ccp(0, 0), ccp(1, .5f));
 
+    m_enabledStatusLabel = CCLabelBMFont::create("", "bigFont.fnt");
+    m_enabledStatusLabel->setScale(.25f);
+    m_enabledStatusLabel->setOpacity(140);
+    manageContainer->addChildAtPosition(m_enabledStatusLabel, Anchor::Right, ccp(0, 0), ccp(1, .5f));
+
     leftColumn->addChild(manageContainer);
 
     auto installContainer = CCNode::create();
@@ -202,6 +206,17 @@ bool ModPopup::setup(ModSource&& src) {
     m_installMenu->setContentSize(installContainer->getContentSize() - ccp(10, 10));
     m_installMenu->setAnchorPoint({ .5f, .5f });
 
+    auto updateModSpr = createGeodeButton(
+        CCSprite::createWithSpriteFrameName("update.png"_spr),
+        "Update",
+        "GE_button_01.png"_spr
+    );
+    updateModSpr->setScale(.5f);
+    m_updateBtn = CCMenuItemSpriteExtra::create(
+        updateModSpr, this, nullptr
+    );
+    m_installMenu->addChild(m_updateBtn);
+
     auto enableModOffSpr = createGeodeButton(
         CCSprite::createWithSpriteFrameName("GJ_completesIcon_001.png"),
         "Enable",
@@ -264,6 +279,7 @@ bool ModPopup::setup(ModSource&& src) {
 
     m_installStatusLabel = CCLabelBMFont::create("", "bigFont.fnt");
     m_installStatusLabel->setOpacity(120);
+    m_installStatusLabel->setVisible(false);
     m_installMenu->addChild(m_installStatusLabel);
 
     m_installMenu->setLayout(
@@ -436,6 +452,7 @@ void ModPopup::updateState() {
     m_reenableBtn->toggle(m_enableBtn->isToggled());
     m_reenableBtn->setVisible(asMod && modRequestedActionIsToggle(asMod->getRequestedAction()));
 
+    m_updateBtn->setVisible(m_source.hasUpdates().has_value() && asMod->getRequestedAction() == ModRequestedAction::None);
     m_installBtn->setVisible(asServer);
     m_uninstallBtn->setVisible(asMod && asMod->getRequestedAction() == ModRequestedAction::None);
 
@@ -443,11 +460,48 @@ void ModPopup::updateState() {
     m_installBG->setOpacity(wantsRestart ? 40 : 75);
     m_restartRequiredLabel->setVisible(wantsRestart);
 
+    if (!wantsRestart && asMod) {
+        if (asMod->isEnabled()) {
+            m_enabledStatusLabel->setString("Enabled");
+            m_enabledStatusLabel->setColor(to3B(ColorProvider::get()->color("mod-list-enabled"_spr)));
+        }
+        else {
+            m_enabledStatusLabel->setString("Disabled");
+            m_enabledStatusLabel->setColor(to3B(ColorProvider::get()->color("mod-list-disabled"_spr)));
+        }
+        m_enabledStatusLabel->setVisible(true);
+    }
+    else {
+        m_enabledStatusLabel->setVisible(false);
+    }
+
     if (asMod && modRequestedActionIsUninstall(asMod->getRequestedAction())) {
         m_installStatusLabel->setString("Mod has been uninstalled");
+        m_installStatusLabel->setVisible(true);
     }
     else {
         m_installStatusLabel->setString("");
+        m_installStatusLabel->setVisible(false);
+    }
+
+    if (m_enableBtn->isVisible() && m_updateBtn->isVisible() && m_uninstallBtn->isVisible()) {
+        static_cast<IconButtonSprite*>(m_enableBtn->m_onButton->getNormalImage())->setString("");
+        static_cast<IconButtonSprite*>(m_enableBtn->m_offButton->getNormalImage())->setString("");
+        static_cast<IconButtonSprite*>(m_uninstallBtn->getNormalImage())->setString("");
+    }
+    else {
+        static_cast<IconButtonSprite*>(m_enableBtn->m_onButton->getNormalImage())->setString("Disable");
+        static_cast<IconButtonSprite*>(m_enableBtn->m_offButton->getNormalImage())->setString("Enable");
+        static_cast<IconButtonSprite*>(m_uninstallBtn->getNormalImage())->setString("Uninstall");
+    }
+    m_enableBtn->updateSprite();
+    m_uninstallBtn->updateSprite();
+
+    if (asMod && asMod->isInternal()) {
+        m_enableBtn->setVisible(false);
+        m_uninstallBtn->setVisible(false);
+        m_installStatusLabel->setString("N/A");
+        m_installStatusLabel->setVisible(true);
     }
 
     m_installMenu->updateLayout();
@@ -539,12 +593,19 @@ void ModPopup::onCheckUpdates(typename server::ServerRequest<std::optional<serve
         auto updatesStat = m_stats->getChildByID("update-check");
         if (resolved.has_value()) {
             this->setStatIcon(updatesStat, "updates-available.png"_spr);
-            this->setStatLabel(updatesStat, "Update Found", false, ccc3(99, 250, 255));
+            this->setStatLabel(
+                updatesStat, "Update Found", false,
+                ColorProvider::get()->color3b("mod-list-version-label-updates-available"_spr)
+            );
             this->setStatValue(updatesStat, resolved.value().version.toString());
+            this->updateState();
         }
         else {
             this->setStatIcon(updatesStat, "GJ_completesIcon_001.png");
-            this->setStatLabel(updatesStat, "Up to Date!", true, ccc3(78, 245, 0));
+            this->setStatLabel(
+                updatesStat, "Up to Date!", true,
+                ColorProvider::get()->color3b("mod-list-version-label"_spr)
+            );
         }
     }
     else if (event->isCancelled() || (event->getValue() && event->getValue()->isErr())) {
diff --git a/loader/src/ui/mods/popups/ModPopup.hpp b/loader/src/ui/mods/popups/ModPopup.hpp
index 6975886c..28750dff 100644
--- a/loader/src/ui/mods/popups/ModPopup.hpp
+++ b/loader/src/ui/mods/popups/ModPopup.hpp
@@ -24,8 +24,10 @@ protected:
     CCMenuItemToggler* m_reenableBtn;
     CCMenuItemSpriteExtra* m_uninstallBtn;
     CCMenuItemSpriteExtra* m_installBtn;
+    CCMenuItemSpriteExtra* m_updateBtn;
     CCLabelBMFont* m_installStatusLabel;
     CCScale9Sprite* m_installBG;
+    CCLabelBMFont* m_enabledStatusLabel;
     ButtonSprite* m_restartRequiredLabel;
     CCNode* m_rightColumn;
     CCNode* m_currentTabPage = nullptr;