diff --git a/config/example.cfg b/config/example.cfg
index 860cbb621..ec383d752 100644
--- a/config/example.cfg
+++ b/config/example.cfg
@@ -135,6 +135,9 @@ pid_deriv_time: 2.0
 #   will be smoothed to reduce the impact of measurement noise
 pid_integral_max: 255
 #   The maximum "windup" the integral term may accumulate
+min_extrude_temp: 170
+#   The minimum temperature (in Celsius) at which extruder move
+#   commands may be issued
 min_temp: 0
 #   Minimum temperature in Celsius (mcu will shutdown if not met)
 max_temp: 210
diff --git a/klippy/extruder.py b/klippy/extruder.py
index 9cc9376c5..94686fdde 100644
--- a/klippy/extruder.py
+++ b/klippy/extruder.py
@@ -4,7 +4,7 @@
 #
 # This file may be distributed under the terms of the GNU GPLv3 license.
 import logging
-import stepper, heater
+import stepper, heater, homing
 
 class PrinterExtruder:
     def __init__(self, printer, config):
@@ -20,6 +20,8 @@ class PrinterExtruder:
     def motor_off(self, move_time):
         self.stepper.motor_enable(move_time, 0)
     def check_move(self, move):
+        if not self.heater.can_extrude:
+            raise homing.EndstopError(move.pos, "Extrude below minimum temp")
         if (not move.do_calc_junction
             and not move.axes_d[0] and not move.axes_d[1]
             and not move.axes_d[2]):
diff --git a/klippy/heater.py b/klippy/heater.py
index c66b251e6..3797b917d 100644
--- a/klippy/heater.py
+++ b/klippy/heater.py
@@ -28,6 +28,8 @@ class PrinterHeater:
         self.mcu_pwm = self.mcu_adc = None
         self.thermistor_c = Thermistors.get(config.get('thermistor_type'))
         self.pullup_r = config.getfloat('pullup_resistor', 4700.)
+        self.min_extrude_temp = config.getfloat('min_extrude_temp', 170.)
+        self.can_extrude = False
         self.lock = threading.Lock()
         self.last_temp = 0.
         self.last_temp_time = 0.
@@ -49,6 +51,8 @@ class PrinterHeater:
         control_algo = self.config.get('control', 'watermark')
         algos = {'watermark': ControlBangBang, 'pid': ControlPID}
         self.control = algos[control_algo](self, self.config)
+        if self.printer.mcu.output_file_mode:
+            self.can_extrude = True
     def run(self):
         self.mcu_adc.query_analog_in(REPORT_TIME)
     def set_pwm(self, read_time, value):
@@ -87,12 +91,16 @@ class PrinterHeater:
         with self.lock:
             self.last_temp = temp
             self.last_temp_time = read_time
+            self.can_extrude = (self.last_temp >= self.min_extrude_temp
+                                and self.target_temp >= self.min_extrude_temp)
             self.control.adc_callback(read_time, temp)
         #logging.debug("temp: %.3f %f = %f" % (read_time, read_value, temp))
     # External commands
     def set_temp(self, print_time, degrees):
         with self.lock:
             self.target_temp = degrees
+            if self.target_temp < self.min_extrude_temp:
+                self.can_extrude = False
     def get_temp(self):
         with self.lock:
             return self.last_temp, self.target_temp