diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp
index fa398950d6..f28e2cc522 100644
--- a/apps/openmw/mwmechanics/actors.cpp
+++ b/apps/openmw/mwmechanics/actors.cpp
@@ -425,7 +425,9 @@ namespace MWMechanics
 
         DynamicStat<float> magicka = creatureStats.getMagicka();
         float diff = (static_cast<int>(magickaFactor*intelligence)) - magicka.getBase();
-        magicka.modify(diff);
+        float currentToBaseRatio = (magicka.getCurrent() / magicka.getBase());
+        magicka.setModified(magicka.getModified() + diff, 0);
+        magicka.setCurrent(magicka.getBase() * currentToBaseRatio);
         creatureStats.setMagicka(magicka);
     }
 
@@ -553,8 +555,9 @@ namespace MWMechanics
             DynamicStat<float> stat = creatureStats.getDynamic(i);
             stat.setModifier(effects.get(ESM::MagicEffect::FortifyHealth+i).getMagnitude() -
                              effects.get(ESM::MagicEffect::DrainHealth+i).getMagnitude(),
+                             // Magicka can be decreased below zero due to a fortify effect wearing off
                              // Fatigue can be decreased below zero meaning the actor will be knocked out
-                             i == 2);
+                             i == 1 || i == 2);
 
             creatureStats.setDynamic(i, stat);
         }
diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp
index e33a6f7bdc..be51cea25d 100644
--- a/apps/openmw/mwmechanics/creaturestats.cpp
+++ b/apps/openmw/mwmechanics/creaturestats.cpp
@@ -157,7 +157,9 @@ namespace MWMechanics
                 int endurance    = getAttribute(ESM::Attribute::Endurance).getModified();
                 DynamicStat<float> fatigue = getFatigue();
                 float diff = (strength+willpower+agility+endurance) - fatigue.getBase();
-                fatigue.modify(diff);
+                float currentToBaseRatio = (fatigue.getCurrent() / fatigue.getBase());
+                fatigue.setModified(fatigue.getModified() + diff, 0);
+                fatigue.setCurrent(fatigue.getBase() * currentToBaseRatio);
                 setFatigue(fatigue);
             }
         }
diff --git a/apps/openmw/mwmechanics/stat.cpp b/apps/openmw/mwmechanics/stat.cpp
index 6eb5e0246d..cf1f228c08 100644
--- a/apps/openmw/mwmechanics/stat.cpp
+++ b/apps/openmw/mwmechanics/stat.cpp
@@ -33,18 +33,6 @@ namespace MWMechanics
         mBase = mModified = value;
     }
     template<typename T>
-    void Stat<T>::modify(const T& diff)
-    {
-        mBase += diff;
-        if(mBase >= static_cast<T>(0))
-            mModified += diff;
-        else
-        {
-            mModified += diff - mBase;
-            mBase = static_cast<T>(0);
-        }
-    }
-    template<typename T>
     void Stat<T>::setBase (const T& value)
     {
         T diff = value - mBase;
@@ -139,12 +127,6 @@ namespace MWMechanics
             mCurrent = getModified();
     }
     template<typename T>
-    void DynamicStat<T>::modify (const T& diff, bool allowCurrentDecreaseBelowZero)
-    {
-        mStatic.modify (diff);
-        setCurrent (getCurrent()+diff, allowCurrentDecreaseBelowZero);
-    }
-    template<typename T>
     void DynamicStat<T>::setCurrent (const T& value, bool allowDecreaseBelowZero)
     {
         if (value > mCurrent)
diff --git a/apps/openmw/mwmechanics/stat.hpp b/apps/openmw/mwmechanics/stat.hpp
index c075f5fa7b..5b58006344 100644
--- a/apps/openmw/mwmechanics/stat.hpp
+++ b/apps/openmw/mwmechanics/stat.hpp
@@ -32,7 +32,6 @@ namespace MWMechanics
 
             /// Set base and modified to \a value.
             void set (const T& value);
-            void modify(const T& diff);
 
             /// Set base and adjust modified accordingly.
             void setBase (const T& value);
@@ -85,9 +84,6 @@ namespace MWMechanics
             /// Set modified value an adjust base accordingly.
             void setModified (T value, const T& min, const T& max = std::numeric_limits<T>::max());
 
-            /// Change modified relatively.
-            void modify (const T& diff, bool allowCurrentDecreaseBelowZero=false);
-
             void setCurrent (const T& value, bool allowDecreaseBelowZero = false);
             void setModifier (const T& modifier, bool allowCurrentDecreaseBelowZero=false);