diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index b718640c1c..98d0da2756 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -66,6 +66,11 @@
 //#define CONTROLLERFAN_PIN 23 //Pin used for the fan to cool controller, comment out to disable this function
 #define CONTROLLERFAN_SEC 60 //How many seconds, after all motors were disabled, the fan should run
 
+// When first starting the main fan, run it at full speed for the
+// given number of milliseconds.  This gets the fan spinning reliably
+// before setting a PWM value.  Set to zero to disable.
+#define FAN_KICKSTART_TIME 100
+
 //===========================================================================
 //=============================Mechanical Settings===========================
 //===========================================================================
diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp
index 66809a10af..6173bcea3a 100644
--- a/Marlin/planner.cpp
+++ b/Marlin/planner.cpp
@@ -438,8 +438,7 @@ void check_axes_activity()
   unsigned char y_active = 0;  
   unsigned char z_active = 0;
   unsigned char e_active = 0;
-  unsigned char fan_speed = 0;
-  unsigned char tail_fan_speed = 0;
+  unsigned char tail_fan_speed = fanSpeed;
   block_t *block;
 
   if(block_buffer_tail != block_buffer_head)
@@ -453,20 +452,9 @@ void check_axes_activity()
       if(block->steps_y != 0) y_active++;
       if(block->steps_z != 0) z_active++;
       if(block->steps_e != 0) e_active++;
-      if(block->fan_speed != 0) fan_speed++;
       block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1);
     }
   }
-  else
-  {
-    #if FAN_PIN > -1
-    #ifndef FAN_SOFT_PWM
-    if (fanSpeed != 0){
-      analogWrite(FAN_PIN,fanSpeed); // If buffer is empty use current fan speed
-    }
-    #endif
-	#endif
-  }
   if((DISABLE_X) && (x_active == 0)) disable_x();
   if((DISABLE_Y) && (y_active == 0)) disable_y();
   if((DISABLE_Z) && (z_active == 0)) disable_z();
@@ -478,15 +466,21 @@ void check_axes_activity()
   }
 #if FAN_PIN > -1
   #ifndef FAN_SOFT_PWM
-  if((fanSpeed == 0) && (fan_speed ==0))
-  {
-    analogWrite(FAN_PIN, 0);
-  }
-
-  if (fanSpeed != 0 && tail_fan_speed !=0)
-  {
-    analogWrite(FAN_PIN,tail_fan_speed);
+  if (FAN_KICKSTART_TIME) {
+    static unsigned long FanKickEnd;
+    if (tail_fan_speed) {
+      if (FanKickEnd == 0) {
+        // Just starting up fan - run at full power.
+        FanKickEnd = millis() + FAN_KICKSTART_TIME;
+        tail_fan_speed = 255;
+      } else if (FanKickEnd > millis())
+        // Fan still spinning up.
+        tail_fan_speed = 255;
+    } else {
+      FanKickEnd = 0;
+    }
   }
+  analogWrite(FAN_PIN,tail_fan_speed);
   #endif
 #endif
 #ifdef AUTOTEMP
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 32398354ff..5758ac1268 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -221,10 +221,7 @@ void lcd_preheat_pla()
     setTargetHotend1(plaPreheatHotendTemp);
     setTargetHotend2(plaPreheatHotendTemp);
     setTargetBed(plaPreheatHPBTemp);
-#if FAN_PIN > -1
     fanSpeed = plaPreheatFanSpeed;
-    analogWrite(FAN_PIN,  fanSpeed);
-#endif
     lcd_return_to_status();
 }
 
@@ -234,10 +231,7 @@ void lcd_preheat_abs()
     setTargetHotend1(absPreheatHotendTemp);
     setTargetHotend2(absPreheatHotendTemp);
     setTargetBed(absPreheatHPBTemp);
-#if FAN_PIN > -1
     fanSpeed = absPreheatFanSpeed;
-    analogWrite(FAN_PIN,  fanSpeed);
-#endif
     lcd_return_to_status();
 }