diff --git a/src/com/t_oster/liblasercut/drivers/EpilogCutter.java b/src/com/t_oster/liblasercut/drivers/EpilogCutter.java
index b36b4bcdd4eb4d03d67b5636ceee81eb8bf6b328..864324c7e6e7930bee1bb99d63c1cd2632eb9f6e 100644
--- a/src/com/t_oster/liblasercut/drivers/EpilogCutter.java
+++ b/src/com/t_oster/liblasercut/drivers/EpilogCutter.java
@@ -310,27 +310,77 @@ abstract class EpilogCutter extends LaserCutter
     }
   }
 
-  @Override
-  public void sendJob(LaserJob job, ProgressListener pl) throws IllegalJobException, SocketTimeoutException, UnsupportedEncodingException, IOException, UnknownHostException, Exception
+  public void realSendJob(LaserJob job, ProgressListener pl, int number, int count) throws UnsupportedEncodingException, IOException, UnknownHostException, Exception
   {
-    pl.progressChanged(this, 0);
-    pl.taskChanged(this, "checking job");
-    //Perform santiy checks
-    checkJob(job);
-    pl.taskChanged(this, "generating data");
+    String nb = count > 1 ? "("+number+"/"+count+")" : "";
+    pl.taskChanged(this, "generating"+nb);
     //Generate all the data
     byte[] pjlData = generatePjlData(job);
-    pl.progressChanged(this, 40);
+    pl.progressChanged(this, (int) ((double) 40*number/count));
     //connect to lasercutter
-    pl.taskChanged(this, "connecting");
+    pl.taskChanged(this, "connecting"+nb);
     connect();
-    pl.progressChanged(this, 60);
+    pl.progressChanged(this, (int) ((double) 60*number/count));
     //send job
-    pl.taskChanged(this, "sending");
+    pl.taskChanged(this, "sending"+nb);
     sendPjlJob(job, pjlData);
-    pl.progressChanged(this, 90);
+    pl.progressChanged(this, (int) ((double) 90*number/count));
     //disconnect
     disconnect();
+  }
+  
+  @Override
+  public void sendJob(LaserJob job, ProgressListener pl) throws IllegalJobException, SocketTimeoutException, UnsupportedEncodingException, IOException, UnknownHostException, Exception
+  {
+    pl.progressChanged(this, 0);
+    pl.taskChanged(this, "checking job");
+    //Perform santiy checks
+    checkJob(job);
+    //split the job because epilog doesn't support many combinations
+    List<List<JobPart>> jobs = new LinkedList<List<JobPart>>();
+    List<JobPart> toDo = job.getParts();
+    while(!toDo.isEmpty())
+    {
+      List<JobPart> currentSplit = new LinkedList<JobPart>();
+      if (toDo.get(0) instanceof VectorPart)
+      {//we need an empty rasterPart before
+        currentSplit.add(new RasterPart(this.getLaserPropertyForRasterPart()));
+      }
+      else if (toDo.get(0) instanceof RasterPart)
+      {
+        currentSplit.add(toDo.get(0));
+        toDo.remove(0);
+      }
+      else if (toDo.get(0) instanceof Raster3dPart)
+      {
+        //we need an empty raster part with the same property
+        currentSplit.add(new RasterPart(((Raster3dPart) toDo.get(0)).getLaserProperty(0)));
+        currentSplit.add(toDo.get(0));
+        toDo.remove(0);
+        //and nothing else in that part
+        jobs.add(currentSplit);
+        continue;
+      }
+      //add all following vector parts
+      while (!toDo.isEmpty() && toDo.get(0) instanceof VectorPart)
+      {
+        currentSplit.add(toDo.get(0));
+        toDo.remove(0);
+      }
+      jobs.add(currentSplit);
+    }
+    int number = 0;
+    int size = jobs.size();
+    for(List<JobPart> current : jobs)
+    {
+      number++;
+      LaserJob j = new LaserJob("("+number+"/"+size+")"+job.getTitle(), job.getName(), job.getUser(), job.getResolution());
+      for (JobPart p:current)
+      {
+        j.addPart(p);
+      }
+      this.realSendJob(j, pl, number, size);
+    }
     pl.progressChanged(this, 100);
   }
 
@@ -708,6 +758,7 @@ abstract class EpilogCutter extends LaserCutter
     PrintStream wrt = new PrintStream(pjlJob, true, "US-ASCII");
 
     wrt.write(generatePjlHeader(job));
+    wrt.write(generateRasterPCL(job, null));
     for (JobPart p : job.getParts())
     {
       if (p instanceof VectorPart)