diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 2bcfc728335e303dcdcb3a275154dfa44ca9cc17..0a1c1194468f5a8dbba03e7ce859a819af884e38 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -95,7 +95,6 @@
 // PID settings:
 // Comment the following line to disable PID and enable bang-bang.
 #define PIDTEMP
-#define PIDTEMPBED
 #define PID_MAX 255 // limits current to nozzle; 255=full current
 #ifdef PIDTEMP
   //#define PID_DEBUG // Sends debug data to the serial port. 
@@ -115,21 +114,49 @@
 //    #define  DEFAULT_Ki 0.1  
 //    #define  DEFAULT_Kd 12  
 
+// Mendel Parts V9 on 12V    
+//    #define  DEFAULT_Kp 63.0
+//    #define  DEFAULT_Ki 2.25
+//    #define  DEFAULT_Kd 440
+#endif // PIDTEMP
+
+// Bed Temperature Control
+// Select PID or bang-bang with PIDTEMPBED.  If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis
+//
+// uncomment this to enable PID on the bed.   It uses the same ferquency PWM as the extruder. 
+// If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz,
+// which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating.
+// This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater. 
+// If your configuration is significantly different than this and you don't understand the issues involved, you proabaly 
+// shouldn't use bed PID until someone else verifies your hardware works.
+// If this is enabled, find your own PID constants below.
+//#define PIDTEMPBED
+//
+//#define BED_LIMIT_SWITCHING
+
+// This sets the max power delived to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option.
+// all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis)
+// setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did,
+// so you shouldn't use it unless you are OK with PWM on your bed.  (see the comment on enabling PIDTEMPBED)
+#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current
+
+#ifdef PIDTEMPBED
+//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
 //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, argressive factor of .15 (vs .1, 1, 10)
     #define  DEFAULT_bedKp 10.00
     #define  DEFAULT_bedKi .023
     #define  DEFAULT_bedKd 305.4
 
-//mark from pidautotune
+//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
+//from pidautotune
 //    #define  DEFAULT_bedKp 97.1
 //    #define  DEFAULT_bedKi 1.41
 //    #define  DEFAULT_bedKd 1675.16
 
-// Mendel Parts V9 on 12V    
-//    #define  DEFAULT_Kp 63.0
-//    #define  DEFAULT_Ki 2.25
-//    #define  DEFAULT_Kd 440
-#endif // PIDTEMP
+// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
+#endif // PIDTEMPBED
+
+
 
 //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit
 //can be software-disabled for whatever purposes by
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 0182c9375a402b7a4e88277b6367a300fbd6c888..281da70bc0457dc73d2779f9ffa3e2d246dcf88b 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -5,13 +5,10 @@
 //=============================Thermal Settings  ============================
 //===========================================================================
 
-// Select one of these only to define how the bed temp is read.
-//
-//#define BED_LIMIT_SWITCHING
 #ifdef BED_LIMIT_SWITCHING
   #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS
 #endif
-#define BED_CHECK_INTERVAL 5000 //ms
+#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control
 
 //// Heating sanity check:
 // This waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index f31f84b260bb3122b8345a63255ec5cb502c5448..f25b462ab6dd270d1bb484505019af9eef6d9e8b 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -153,8 +153,7 @@ void PID_autotune(float temp, int extruder, int ncycles)
   long t_high;
   long t_low;
 
-  long bias=PID_MAX/2;
-  long d = PID_MAX/2;
+  long bias, d;
   float Ku, Tu;
   float Kp, Ki, Kd;
   float max, min;
@@ -173,9 +172,15 @@ void PID_autotune(float temp, int extruder, int ncycles)
   disable_heater(); // switch off all heaters.
 
 	if (extruder<0)
-	  soft_pwm_bed = PID_MAX/2;
+	{
+	 	soft_pwm_bed = (PID_MAX_BED)/2;
+		bias = d = (PID_MAX_BED)/2;
+  }
 	else
-	  soft_pwm[extruder] = PID_MAX/2;
+	{
+	  soft_pwm[extruder] = (PID_MAX)/2;
+		bias = d = (PID_MAX)/2;
+  }
 
 
 
@@ -209,8 +214,8 @@ void PID_autotune(float temp, int extruder, int ncycles)
           t_low=t2 - t1;
           if(cycles > 0) {
             bias += (d*(t_high - t_low))/(t_low + t_high);
-            bias = constrain(bias, 20 ,PID_MAX-20);
-            if(bias > PID_MAX/2) d = PID_MAX - 1 - bias;
+            bias = constrain(bias, 20 ,(extruder<0?(PID_MAX_BED):(PID_MAX))-20);
+            if(bias > (extruder<0?(PID_MAX_BED):(PID_MAX))/2) d = (extruder<0?(PID_MAX_BED):(PID_MAX)) - 1 - bias;
             else d = bias;
 
             SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias);
@@ -414,10 +419,10 @@ void manage_heater()
 		  dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed);
 		  temp_dState_bed = pid_input;
 
-		  pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, PID_MAX);
+		  pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, PID_MAX_BED);
 
     #else 
-      pid_output = constrain(pid_setpoint_bed, 0, PID_MAX);
+      pid_output = constrain(pid_setpoint_bed, 0, PID_MAX_BED);
     #endif //PID_OPENLOOP
 
 	  if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) 
@@ -437,7 +442,7 @@ void manage_heater()
         }
         else 
         {
-					soft_pwm_bed = 100;
+					soft_pwm_bed = PID_MAX_BED>>1;
         }
       }
       else {
@@ -454,7 +459,7 @@ void manage_heater()
         else 
           if(current_raw_bed <= target_bed_low_temp)
         {
-					soft_pwm_bed = 100;
+					soft_pwm_bed = PID_MAX_BED>>1;
         }
       }
       else {