Moved ActiveVessel check from UpdateModules to FixedUpdate
Moved ActiveVessel check from UpdateModules to FixedUpdate

 Binary files a/Assets/Plugins/KerbalEngineer.Unity.dll and b/Assets/Plugins/KerbalEngineer.Unity.dll differ
--- a/Documents/CHANGES.txt
+++ b/Documents/CHANGES.txt
@@ -1,6 +1,13 @@
-1.1.0.2
+1.1.0.2, 2016-04-19, KSP Build #1230
     Added: Altitude (terrain) readout now shows the altitude above underwater terrain when splashed down.
+    Added: Usage of the stock IPartMassModifier for handling the modifying of part module staged mass.
+    Added: Support for thrustTranformMultipliers
+    Changed: Fairing specific mass adjustments now make use of the generic staged mass modifier implementation.
+    Changed: App launcher button handling works with KSP build 1205 changes.
+    Changed: Impact lat/long readouts to use DMS form.
     Fixed: Log spam and physics issue caused when using the EngineerChip part due to a convex mesh collider (now uses a box collider).
+    Fixed: Issues with the disabling/enabling of the toolbar app launcher button in flight when in career mode.
+    Fixed: Bug with impact calculations.
 
 1.1.0.1, 2016-04-01, KSP Build #1179
     Fixed: Heat shields acting as staged decouplers when not set to be staged.

--- a/KerbalEngineer/AppLauncherButton.cs
+++ b/KerbalEngineer/AppLauncherButton.cs
@@ -28,6 +28,17 @@
         private ApplicationLauncherButton m_Button;
 
         /// <summary>
+        ///     Gets the wrapped application launcher button object.
+        /// </summary>
+        public ApplicationLauncherButton Button
+        {
+            get
+            {
+                return m_Button;
+            }
+        }
+
+        /// <summary>
         ///     Gets or sets the toggle button state.
         /// </summary>
         public bool IsOn
@@ -35,7 +46,7 @@
             get
             {
                 return m_Button != null &&
-                       m_Button.toggleButton.Button.interactable &&
+                       m_Button.IsEnabled &&
                        m_Button.toggleButton.CurrentState == UIRadioButton.State.True;
             }
             set
@@ -61,7 +72,7 @@
         /// </summary>
         public void Disable()
         {
-            if (m_Button != null && m_Button.toggleButton.Button.interactable)
+            if (m_Button != null && m_Button.IsEnabled)
             {
                 m_Button.Disable();
             }
@@ -72,7 +83,7 @@
         /// </summary>
         public void Enable()
         {
-            if (m_Button != null && m_Button.toggleButton.Button.interactable == false)
+            if (m_Button != null && !m_Button.IsEnabled)
             {
                 m_Button.Enable();
             }

--- a/KerbalEngineer/EngineerGlobals.cs
+++ b/KerbalEngineer/EngineerGlobals.cs
@@ -25,7 +25,7 @@
         /// <summary>
         ///     Current version of the Kerbal Engineer assembly.
         /// </summary>
-        public const string ASSEMBLY_VERSION = "1.1.0.1";
+        public const string ASSEMBLY_VERSION = "1.1.0.2";
 
         private static string assemblyFile;
         private static string assemblyName;

--- a/KerbalEngineer/Extensions/PartExtensions.cs
+++ b/KerbalEngineer/Extensions/PartExtensions.cs
@@ -100,7 +100,7 @@
             {
                 PartModule pm = part.Modules[i];
                 if (pm is IPartCostModifier)
-                    cost += (pm as IPartCostModifier).GetModuleCost(defaultCost);
+                    cost += (pm as IPartCostModifier).GetModuleCost(defaultCost, ModifierStagingSituation.CURRENT);
             }
             return cost;
         }

--- a/KerbalEngineer/Flight/FlightAppLauncher.cs
+++ b/KerbalEngineer/Flight/FlightAppLauncher.cs
@@ -27,7 +27,7 @@
     [KSPAddon(KSPAddon.Startup.Flight, false)]
     public class FlightAppLauncher : AppLauncherButton, IFlightAppLauncher
     {
-        private static FlightAppLauncher m_Instance;
+        private static FlightAppLauncher s_Instance;
         private FlightMenu m_FlightMenu;
         private GameObject m_MenuObject;
         private GameObject m_MenuPrefab;
@@ -39,7 +39,7 @@
         {
             get
             {
-                return m_Instance;
+                return s_Instance;
             }
         }
 
@@ -145,7 +145,7 @@
             base.Awake();
 
             // set singleton instance
-            m_Instance = this;
+            s_Instance = this;
 
             // cache menu prefab
             if (m_MenuPrefab == null && AssetBundleLoader.Prefabs != null)
@@ -175,6 +175,21 @@
         protected override void OnTrue()
         {
             Open();
+        }
+
+        protected virtual void Update()
+        {
+            if (Button == null)
+                return;
+
+            if (FlightEngineerCore.IsDisplayable && Button.IsEnabled == false)
+            {
+                Enable();
+            }
+            else if (FlightEngineerCore.IsDisplayable == false && Button.IsEnabled)
+            {
+                Disable();
+            }
         }
 
         /// <summary>

--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -290,6 +290,9 @@
         /// </summary>
         private void FixedUpdate()
         {
+            if (FlightGlobals.ActiveVessel == null)
+                return;
+
             try
             {
                 SectionLibrary.FixedUpdate();
@@ -351,6 +354,9 @@
         /// </summary>
         private void Update()
         {
+            if (FlightGlobals.ActiveVessel == null)
+                return;
+
             try
             {
                 SectionLibrary.Update();

--- a/KerbalEngineer/VesselSimulator/AttachNodeSim.cs
+++ b/KerbalEngineer/VesselSimulator/AttachNodeSim.cs
@@ -51,7 +51,10 @@
             return nodeSim;
         }
 
-        static private void Reset(AttachNodeSim attachNodeSim) { }
+        static private void Reset(AttachNodeSim attachNodeSim)
+        {
+            attachNodeSim.attachedPartSim = null;
+        }
 
 
         public void Release()

--- a/KerbalEngineer/VesselSimulator/EngineSim.cs
+++ b/KerbalEngineer/VesselSimulator/EngineSim.cs
@@ -54,6 +54,7 @@
         {
             engineSim.resourceConsumptions.Reset();
             engineSim.resourceFlowModes.Reset();
+            engineSim.partSim = null;
             engineSim.actualThrust = 0;
             engineSim.isActive = false;
             engineSim.isp = 0;

--- a/KerbalEngineer/VesselSimulator/PartSim.cs
+++ b/KerbalEngineer/VesselSimulator/PartSim.cs
@@ -56,8 +56,8 @@
         public bool isLanded;
         public bool isNoPhysics;
         public bool isSepratron;
-        public bool isFairing;
-        public float fairingMass;
+        //public bool isFairing;
+        public float postStageMassAdjust;
         public int stageIndex;
         public String name;
         public String noCrossFeedNodeKey;
@@ -86,9 +86,11 @@
             }
             partSim.attachNodes.Clear();
             partSim.fuelTargets.Clear();
+            partSim.surfaceMountFuelTargets.Clear();
             partSim.resourceDrains.Reset();
             partSim.resourceFlowStates.Reset();
             partSim.resources.Reset();
+            partSim.parent = null;
             partSim.baseCost = 0d;
             partSim.baseMass = 0d;
             partSim.baseMassForCoM = 0d;
@@ -100,61 +102,77 @@
             pool.Release(this);
         }
 
-        public static PartSim New(Part thePart, int id, double atmosphere, LogMsg log)
+        public static PartSim New(Part p, int id, double atmosphere, LogMsg log)
         {
             PartSim partSim = pool.Borrow();
 
-            partSim.part = thePart;
-            partSim.centerOfMass = thePart.transform.TransformPoint(thePart.CoMOffset);
+            partSim.part = p;
+            partSim.centerOfMass = p.transform.TransformPoint(p.CoMOffset);
             partSim.partId = id;
-            partSim.name = partSim.part.partInfo.name;
+            partSim.name = p.partInfo.name;
 
             if (log != null) log.buf.AppendLine("Create PartSim for " + partSim.name);
 
             partSim.parent = null;
-            partSim.parentAttach = partSim.part.attachMode;
-            partSim.fuelCrossFeed = partSim.part.fuelCrossFeed;
-            partSim.noCrossFeedNodeKey = partSim.part.NoCrossFeedNodeKey;
-            partSim.decoupledInStage = partSim.DecoupledInStage(partSim.part);
-            partSim.isFuelLine = partSim.part.HasModule<CModuleFuelLine>();
-            partSim.isFuelTank = partSim.part is FuelTank;
+            partSim.parentAttach = p.attachMode;
+            partSim.fuelCrossFeed = p.fuelCrossFeed;
+            partSim.noCrossFeedNodeKey = p.NoCrossFeedNodeKey;
+            partSim.decoupledInStage = partSim.DecoupledInStage(p);
+            partSim.isFuelLine = p.HasModule<CModuleFuelLine>();
+            partSim.isFuelTank = p is FuelTank;
             partSim.isSepratron = partSim.IsSepratron();
-            partSim.inverseStage = partSim.part.inverseStage;
+            partSim.inverseStage = p.inverseStage;
             //MonoBehaviour.print("inverseStage = " + inverseStage);
 
-            partSim.baseCost = partSim.part.GetCostDry();
+            partSim.baseCost = p.GetCostDry();
 
             if (log != null)
             {
-                log.buf.AppendLine("Parent part = " + (partSim.part.parent == null ? "null" : partSim.part.parent.partInfo.name));
-                log.buf.AppendLine("physicalSignificance = " + partSim.part.physicalSignificance);
-                log.buf.AppendLine("PhysicsSignificance = " + partSim.part.PhysicsSignificance);
+                log.buf.AppendLine("Parent part = " + (p.parent == null ? "null" : p.parent.partInfo.name));
+                log.buf.AppendLine("physicalSignificance = " + p.physicalSignificance);
+                log.buf.AppendLine("PhysicsSignificance = " + p.PhysicsSignificance);
             }
 
             // Work out if the part should have no physical significance
             // The root part is never "no physics"
-            partSim.isNoPhysics = partSim.part.physicalSignificance == Part.PhysicalSignificance.NONE ||
-                                    partSim.part.PhysicsSignificance == 1;
-
-            if (partSim.part.HasModule<LaunchClamp>())
+            partSim.isNoPhysics = p.physicalSignificance == Part.PhysicalSignificance.NONE ||
+                                    p.PhysicsSignificance == 1;
+
+            if (p.HasModule<LaunchClamp>())
             {
                 partSim.realMass = 0d;
                 if (log != null) log.buf.AppendLine("Ignoring mass of launch clamp");
             }
             else
             {
-                partSim.realMass = partSim.part.mass;
-                if (log != null)
-                {
-                    log.buf.AppendLine("Using part.mass" + partSim.part.mass);
-                }
-            }
-
-            partSim.fairingMass = partSim.part.GetModule<ModuleProceduralFairing>()?.GetModuleMass(partSim.part.mass) ?? 0.0f;
-
-            for (int i = 0; i < partSim.part.Resources.Count; i++)
-            {
-                PartResource resource = partSim.part.Resources[i];
+                partSim.realMass = p.mass;
+                if (log != null) log.buf.AppendLine("Using part.mass of " + p.mass);
+            }
+
+            partSim.postStageMassAdjust = 0f;
+            if (log != null) log.buf.AppendLine("Calculating postStageMassAdjust, prefabMass = " + p.prefabMass);
+            int count = p.Modules.Count;
+            for (int i = 0; i < count; i++)
+            {
+                if (log != null) log.buf.AppendLine("Module: " + p.Modules[i].moduleName);
+                IPartMassModifier partMassModifier = p.Modules[i] as IPartMassModifier;
+                if (partMassModifier != null)
+                {
+                    if (log != null) log.buf.AppendLine("ChangeWhen = " + partMassModifier.GetModuleMassChangeWhen());
+                    if (partMassModifier.GetModuleMassChangeWhen() == ModifierChangeWhen.STAGED)
+                    {
+                        float preStage = partMassModifier.GetModuleMass(p.prefabMass, ModifierStagingSituation.UNSTAGED);
+                        float postStage = partMassModifier.GetModuleMass(p.prefabMass, ModifierStagingSituation.STAGED);
+                        if (log != null) log.buf.AppendLine("preStage = " + preStage + "   postStage = " + postStage);
+                        partSim.postStageMassAdjust += (postStage - preStage);
+                    }
+                }
+            }
+            if (log != null) log.buf.AppendLine("postStageMassAdjust = " + partSim.postStageMassAdjust);
+
+            for (int i = 0; i < p.Resources.Count; i++)
+            {
+                PartResource resource = p.Resources[i];
 
                 // Make sure it isn't NaN as this messes up the part mass and hence most of the values
                 // This can happen if a resource capacity is 0 and tweakable
@@ -172,17 +190,17 @@
                 }
             }
 
-            partSim.hasVessel = (partSim.part.vessel != null);
-            partSim.isLanded = partSim.hasVessel && partSim.part.vessel.Landed;
+            partSim.hasVessel = (p.vessel != null);
+            partSim.isLanded = partSim.hasVessel && p.vessel.Landed;
             if (partSim.hasVessel)
             {
-                partSim.vesselName = partSim.part.vessel.vesselName;
-                partSim.vesselType = partSim.part.vesselType;
-            }
-            partSim.initialVesselName = partSim.part.initialVesselName;
-
-            partSim.hasMultiModeEngine = partSim.part.HasModule<MultiModeEngine>();
-            partSim.hasModuleEngines = partSim.part.HasModule<ModuleEngines>();
+                partSim.vesselName = p.vessel.vesselName;
+                partSim.vesselType = p.vesselType;
+            }
+            partSim.initialVesselName = p.initialVesselName;
+
+            partSim.hasMultiModeEngine = p.HasModule<MultiModeEngine>();
+            partSim.hasModuleEngines = p.HasModule<ModuleEngines>();
 
             partSim.isEngine = partSim.hasMultiModeEngine || partSim.hasModuleEngines;
 
@@ -388,9 +406,9 @@
                 mass += resources.GetResourceMass(resources.Types[i]);
             }
 
-            if (fairingMass > 0.0 && currentStage <= inverseStage)
-            {
-                mass -= fairingMass;
+            if (postStageMassAdjust != 0.0 && currentStage <= inverseStage)
+            {
+                mass += postStageMassAdjust;
             }
 
             return mass;
@@ -610,6 +628,17 @@
                     this.fuelTargets[i] = null;
                 }
             }
+
+            // Loop through the surface attached fuel targets (surface attached parts for new flow modes)
+            for (int i = 0; i < this.surfaceMountFuelTargets.Count; i++)
+            {
+                PartSim fuelTargetSim = this.surfaceMountFuelTargets[i];
+                // If the part is in the set then "remove" it by clearing the PartSim reference
+                if (fuelTargetSim != null && partSims.Contains(fuelTargetSim))
+                {
+                    this.surfaceMountFuelTargets[i] = null;
+                }
+            }
         }
 
         public void SetupAttachNodes(Dictionary<Part, PartSim> partSimLookup, LogMsg log)

 Binary files a/Output/KerbalEngineer/KerbalEngineer.Unity.dll and b/Output/KerbalEngineer/KerbalEngineer.Unity.dll differ
 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
--- a/Output/KerbalEngineer/KerbalEngineer.version
+++ b/Output/KerbalEngineer/KerbalEngineer.version
@@ -6,7 +6,7 @@
 		"MAJOR":1,
 		"MINOR":1,
 		"PATCH":0,
-		"BUILD":1
+		"BUILD":2
 	},
 	"KSP_VERSION":
 	{

 Binary files a/Output/KerbalEngineer/MiniAVC.dll and b/Output/KerbalEngineer/MiniAVC.dll differ