diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 31884782d26e919594f9a883f21d027c8fbcdf0e..da5372021ec383aebf305ec5a9362bce8d171d79 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -80,7 +80,7 @@
 // This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
 // You should use MINTEMP for thermistor short/failure protection.
 #define HEATER_0_MAXTEMP 275
-//#define_HEATER_1_MAXTEMP 275
+//#define HEATER_1_MAXTEMP 275
 //#define BED_MAXTEMP 150
 
 
diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index 857814732bff36e95342c246a66432d13b636317..f5df6f617bf3c1d4505859b85f02f79cf79c9f73 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -90,50 +90,12 @@ static unsigned long previous_millis_heater, previous_millis_bed_heater;
 #endif //WATCHPERIOD
 
 // Init min and max temp with extreme values to prevent false errors during startup
-#ifdef HEATER_0_MINTEMP
-  #ifdef HEATER_0_USES_AD595
-    static int minttemp_0 = 0;
-  #else
-    static int minttemp_0 = 16383;
-  #endif
-#endif //MINTEMP
-#ifdef HEATER_0_MAXTEMP
-  #ifdef HEATER_0_USES_AD595
-    static int maxttemp_0 = 16383;
-  #else
-    static int maxttemp_0 = 0;
-  #endif
-#endif //MAXTEMP
-
-#ifdef HEATER_1_MINTEMP
-  #ifdef HEATER_1_USES_AD595
-    static int minttemp_1 = 0;
-  #else
-    static int minttemp_1 = 16383;
-  #endif
-#endif //MINTEMP
-#ifdef HEATER_1_MAXTEMP
-  #ifdef HEATER_1_USES_AD595
-    static int maxttemp_1 = 16383;
-  #else
-    static int maxttemp_1 = 0;
-  #endif
-#endif //MAXTEMP
-
-#ifdef BED_MINTEMP
-  #ifdef BED_USES_AD595
-    static int bed_minttemp = 0;
-  #else
-    static int bed_minttemp = 16383;
-  #endif
-#endif //BED_MINTEMP
-#ifdef BED_MAXTEMP
-  #ifdef BED_USES_AD595
-    static int bed_maxttemp = 16383;
-  #else
-    static int bed_maxttemp = 0;
-  #endif
-#endif //BED_MAXTEMP
+  static int minttemp_0   = 0;
+  static int maxttemp_0   = 16383;
+  static int minttemp_1   = 0;
+  static int maxttemp_1   = 16383;
+  static int bed_minttemp = 0;
+  static int bed_maxttemp = 16383;
 
 //===========================================================================
 //=============================functions         ============================
@@ -198,18 +160,28 @@ void manage_heater()
      //SERIAL_ECHOLN(" PIDDEBUG Input "<<pid_input<<" Output "<<pid_output" pTerm "<<pTerm<<" iTerm "<<iTerm<<" dTerm "<<dTerm);  
     #endif //PID_DEBUG
     HeaterPower=pid_output;
-    analogWrite(HEATER_0_PIN, pid_output);
+    // Check if temperature is within the correct range
+    if((current_raw[TEMPSENSOR_HOTEND_0] > minttemp_0) && (current_raw[TEMPSENSOR_HOTEND_0] < maxttemp_0)) {
+      analogWrite(HEATER_0_PIN, pid_output);
+    }
+    else {
+      analogWrite(HEATER_0_PIN, 0);
+    }
   #endif //PIDTEMP
 
   #ifndef PIDTEMP
-    if(current_raw[0] >= target_raw[0])
-    {
-      WRITE(HEATER_0_PIN,LOW);
-    }
-    else 
-    {
-      WRITE(HEATER_0_PIN,HIGH);
+    // Check if temperature is within the correct range
+    if((current_raw[TEMPSENSOR_HOTEND_0] > minttemp_0) && (current_raw[TEMPSENSOR_HOTEND_0] < maxttemp_0)) {
+      if(current_raw[TEMPSENSOR_HOTEND_0] >= target_raw[TEMPSENSOR_HOTEND_0]) {
+        WRITE(HEATER_0_PIN,LOW);
+      }
+      else {
+        WRITE(HEATER_0_PIN,HIGH);
+      }
     }
+    else {
+      WRITE(HEATER_0_PIN,LOW);
+    }    
   #endif
     
   if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
@@ -217,14 +189,20 @@ void manage_heater()
   previous_millis_bed_heater = millis();
   
   #if TEMP_1_PIN > -1
-    if(current_raw[TEMPSENSOR_BED] >= target_raw[TEMPSENSOR_BED])
-    {
-      WRITE(HEATER_1_PIN,LOW);
-    }
-    else 
-    {
-      WRITE(HEATER_1_PIN,HIGH);
+    // Check if temperature is within the correct range
+    if((current_raw[TEMPSENSOR_BED] > bed_minttemp) && (current_raw[TEMPSENSOR_BED] < bed_maxttemp)) {
+      if(current_raw[TEMPSENSOR_BED] >= target_raw[TEMPSENSOR_BED])
+      {
+        WRITE(HEATER_1_PIN,LOW);
+      }
+      else 
+      {
+        WRITE(HEATER_1_PIN,HIGH);
+      }
     }
+    else {
+      WRITE(HEATER_1_PIN,LOW);
+    }  
   #endif
 }
 
@@ -370,6 +348,34 @@ void tp_init()
 
   // Set analog inputs
   ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADIF | 0x07;
+  DIDR0 = 0;
+  #ifdef DIDR2
+    DIDR2 = 0;
+  #endif
+  #if (TEMP_0_PIN > -1)
+    #if TEMP_0_PIN < 8
+       DIDR0 |= 1 << TEMP_0_PIN; 
+    #else
+       DIDR2 |= 1<<(TEMP_0_PIN - 8); 
+       ADCSRB = 1<<MUX5;
+    #endif
+  #endif
+  #if (TEMP_1_PIN > -1)
+    #if TEMP_1_PIN < 8
+       DIDR0 |= 1<<TEMP_1_PIN; 
+    #else
+       DIDR2 |= 1<<(TEMP_1_PIN - 8); 
+       ADCSRB = 1<<MUX5;
+    #endif
+  #endif
+  #if (TEMP_2_PIN > -1)
+    #if TEMP_2_PIN < 8
+       DIDR0 |= 1 << TEMP_2_PIN; 
+    #else
+       DIDR2 = 1<<(TEMP_2_PIN - 8); 
+       ADCSRB = 1<<MUX5;
+    #endif
+  #endif
   
   // Use timer0 for temperature measurement
   // Interleave temperature interrupt with millies interrupt
@@ -456,10 +462,7 @@ ISR(TIMER0_COMPB_vect)
   switch(temp_state) {
     case 0: // Prepare TEMP_0
       #if (TEMP_0_PIN > -1)
-        #if TEMP_0_PIN < 8
-          DIDR0 = 1 << TEMP_0_PIN; 
-        #else
-          DIDR2 = 1<<(TEMP_0_PIN - 8); 
+        #if TEMP_0_PIN > 7
           ADCSRB = 1<<MUX5;
         #endif
         ADMUX = ((1 << REFS0) | (TEMP_0_PIN & 0x07));
@@ -478,10 +481,7 @@ ISR(TIMER0_COMPB_vect)
       break;
     case 2: // Prepare TEMP_1
       #if (TEMP_1_PIN > -1)
-        #if TEMP_1_PIN < 7
-          DIDR0 = 1<<TEMP_1_PIN; 
-        #else
-          DIDR2 = 1<<(TEMP_1_PIN - 8); 
+        #if TEMP_1_PIN > 7
           ADCSRB = 1<<MUX5;
         #endif
         ADMUX = ((1 << REFS0) | (TEMP_1_PIN & 0x07));
@@ -500,10 +500,7 @@ ISR(TIMER0_COMPB_vect)
       break;
     case 4: // Prepare TEMP_2
       #if (TEMP_2_PIN > -1)
-        #if TEMP_2_PIN < 7
-          DIDR0 = 1 << TEMP_2_PIN; 
-        #else
-          DIDR2 = 1<<(TEMP_2_PIN - 8); 
+        #if TEMP_2_PIN > 7
           ADCSRB = 1<<MUX5;
         #endif
         ADMUX = ((1 << REFS0) | (TEMP_2_PIN & 0x07));
@@ -556,7 +553,7 @@ ISR(TIMER0_COMPB_vect)
       #if (HEATER_0_PIN > -1)
         if(current_raw[TEMPSENSOR_HOTEND_0] >= maxttemp_0) {
           target_raw[TEMPSENSOR_HOTEND_0] = 0;
-          analogWrite(HEATER_0_PIN, 0);
+          digitalWrite(HEATER_0_PIN, 0);
           SERIAL_ERROR_START;
           SERIAL_ERRORLNPGM("Temperature extruder 0 switched off. MAXTEMP triggered !!");
           kill();
@@ -567,11 +564,10 @@ ISR(TIMER0_COMPB_vect)
     #if (HEATER_1_PIN > -1)
       if(current_raw[TEMPSENSOR_HOTEND_1] >= maxttemp_1) {
         target_raw[TEMPSENSOR_HOTEND_1] = 0;
-      if(current_raw[2] >= maxttemp_1) {
-        analogWrite(HEATER_2_PIN, 0);
+        digitalWrite(HEATER_2_PIN, 0);
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperature extruder 1 switched off. MAXTEMP triggered !!");
-        kill()
+        kill();
       }
     #endif
   #endif //MAXTEMP
@@ -580,7 +576,7 @@ ISR(TIMER0_COMPB_vect)
     #if (HEATER_0_PIN > -1)
       if(current_raw[TEMPSENSOR_HOTEND_0] <= minttemp_0) {
         target_raw[TEMPSENSOR_HOTEND_0] = 0;
-        analogWrite(HEATER_0_PIN, 0);
+        digitalWrite(HEATER_0_PIN, 0);
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperature extruder 0 switched off. MINTEMP triggered !!");
         kill();
@@ -592,7 +588,7 @@ ISR(TIMER0_COMPB_vect)
     #if (HEATER_2_PIN > -1)
       if(current_raw[TEMPSENSOR_HOTEND_1] <= minttemp_1) {
         target_raw[TEMPSENSOR_HOTEND_1] = 0;
-        analogWrite(HEATER_2_PIN, 0);
+        digitalWrite(HEATER_2_PIN, 0);
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperature extruder 1 switched off. MINTEMP triggered !!");
         kill();
@@ -604,7 +600,7 @@ ISR(TIMER0_COMPB_vect)
     #if (HEATER_1_PIN > -1)
       if(current_raw[1] <= bed_minttemp) {
         target_raw[1] = 0;
-        WRITE(HEATER_1_PIN, 0);
+        digitalWrite(HEATER_1_PIN, 0);
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperatur heated bed switched off. MINTEMP triggered !!");
         kill();
@@ -616,7 +612,7 @@ ISR(TIMER0_COMPB_vect)
     #if (HEATER_1_PIN > -1)
       if(current_raw[1] >= bed_maxttemp) {
         target_raw[1] = 0;
-        WRITE(HEATER_1_PIN, 0);
+        digitalWrite(HEATER_1_PIN, 0);
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
         kill();
diff --git a/README.md b/README.md
index 5b1ead20390a013e41c5153d621d79c12de547b4..988bf9a6e6c9f74fff919bc3d76a0a12d7081f74 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ This RepRap firmware is a mashup between <a href="https://github.com/kliment/Spr
 
 Derived from Sprinter and Grbl by Erik van der Zalm.
 Sprinters lead developers are Kliment and caru.
-Grbls lead developer is Simen Svale Skogsrud.
+Grbls lead developer is Simen Svale Skogsrud. Sonney Jeon (Chamnit) improved some parts of grbl
 A fork by bkubicek for the Ultimaker was merged, and further development was aided by him.
 Some features have been added by:
 Lampmaker, Bradley Feldman, and others...
@@ -23,7 +23,7 @@ Features:
 *   Look ahead (Keep the speed high when possible. High cornering speed)
 *   Interrupt based temperature protection
 *   preliminary support for Matthew Roberts advance algorithm 
-*   For more info see: http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
+    For more info see: http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
 *   Full endstop support
 *   SD Card support
 *   SD Card folders (works in pronterface)
@@ -39,8 +39,6 @@ Features:
 *   Updated sdcardlib
 *   Heater power reporting. Useful for PID monitoring.
 
-This firmware is optimized for Ultimaker's gen6 electronics (including the Ultimaker 1.5.x daughterboard and Arduino Mega 2560).
-
 The default baudrate is 250000. This baudrate has less jitter and hence errors than the usual 115200 baud, but is less supported by drivers and host-environments.
 
 
@@ -156,13 +154,16 @@ EEPROM:
 *   M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).  
 *   M502 - reverts to the default "factory settings".  You still need to store them in EEPROM afterwards if you want to.
 
+
 Configuring and compilation:
 ============================
 
-
 Install the arduino software IDE/toolset v22
    http://www.arduino.cc/en/Main/Software
 
+For gen6 and sanguinololu the Sanguino directory in the Marlin dir needs to be copied to the arduino environment.
+  copy Marlin\sanguino <arduino home>\hardware\Sanguino
+
 Install Ultimaker's RepG 25 build
     http://software.ultimaker.com
 For SD handling and as better substitute (apart from stl manipulation) download