diff --git a/src/com/t_oster/liblasercut/drivers/IModelaMill.java b/src/com/t_oster/liblasercut/drivers/IModelaMill.java
index db41bafeb2ed2b2942365a33bcf1dfbdba50136d..db951ffd60e7a95d4dc26bc5fabebc05e47bd9a9 100644
--- a/src/com/t_oster/liblasercut/drivers/IModelaMill.java
+++ b/src/com/t_oster/liblasercut/drivers/IModelaMill.java
@@ -72,6 +72,7 @@ public class IModelaMill extends LaserCutter
   private static String PORT = "port";
   private static String BED_WIDTH = "bed width";
   private static String BED_HEIGHT = "bed height";
+  private static String FLIP_YAXIS = "flip y axis";
   private static String HOME_ON_END = "move home after job";
 
   private Map<String, Object> properties = new LinkedHashMap<String, Object>();
@@ -82,6 +83,17 @@ public class IModelaMill extends LaserCutter
     properties.put(HOSTNAME, "file:///dev/usb/lp0");
     properties.put(PORT, (Integer) 5000);
     properties.put(HOME_ON_END, (Boolean) true);
+    properties.put(FLIP_YAXIS, (Boolean) false);
+  }
+  
+  private boolean spindleOn = false;
+  private void setSpindleOn(PrintStream out, boolean spindleOn)
+  {
+    if (spindleOn != this.spindleOn)
+    {
+      this.spindleOn = spindleOn;
+      out.println(spindleOn ? "M03" : "M05");//start/stop spindle
+    }
   }
   
   private void writeInitializationCode(PrintStream out)
@@ -90,12 +102,11 @@ public class IModelaMill extends LaserCutter
     out.println("O00000001");//program number 00000001 - can be changed to any number, must be 8 digits
     out.println("G90");//absolute positioning
     out.println("G21");//select mm as input unit
-    out.println("M03");//start spindle
   }
   
   private void writeFinalizationCode(PrintStream out)
   {
-    out.println("M05");//stop spindle
+    this.setSpindleOn(out, false);
     out.println("G0 Z0");//head up
     if ((Boolean) properties.get(HOME_ON_END))
     {
@@ -135,16 +146,17 @@ public class IModelaMill extends LaserCutter
     moveHead(out, movedepth);
     //TODO: check if last command was also move and lies on the 
     //same line. If so, replace the last move command
-    out.print(String.format(Locale.ENGLISH, "G00 X%f Y%f%s\n", x, getBedHeight()-y, parameters));
+    out.print(String.format(Locale.ENGLISH, "G00 X%f Y%f%s\n", x, properties.get(FLIP_YAXIS) == Boolean.TRUE ? getBedHeight()-y : y, parameters));
     parameters = "";
   }
   
   private void line(PrintStream out, double x, double y)
   {
+    setSpindleOn(out, true);
     moveHead(out, linedepth);
     //TODO: check if last command was also line and lies on the 
     //same line. If so, replace the last move command
-    out.print(String.format(Locale.ENGLISH, "G01 X%f Y%f%s\n", x, getBedHeight()-y, parameters));
+    out.print(String.format(Locale.ENGLISH, "G01 X%f Y%f%s\n", x, properties.get(FLIP_YAXIS) == Boolean.TRUE ? getBedHeight()-y : y, parameters));
     parameters = "";
   }
   
@@ -154,7 +166,7 @@ public class IModelaMill extends LaserCutter
     if (pr.getSpindleSpeed() != spindleSpeed)
     {
       spindleSpeed = pr.getSpindleSpeed();
-      parameters += String.format(Locale.ENGLISH, " S%d\n", spindleSpeed);
+      parameters += String.format(Locale.ENGLISH, " S%f\n", spindleSpeed);
     }
     if (pr.getFeedRate() != feedRate)
     {
@@ -309,6 +321,12 @@ public class IModelaMill extends LaserCutter
     }
   }
 
+  @Override
+  public LaserProperty getLaserPropertyForRaster3dPart()
+  {
+    return new IModelaProperty();
+  }
+  
   @Override
   public LaserProperty getLaserPropertyForVectorPart()
   {