diff -rupNw ../briss.orig/briss//src/main/java/at/laborg/briss/BrissCMD.java ./src/main/java/at/laborg/briss/BrissCMD.java
--- ../briss.orig/briss//src/main/java/at/laborg/briss/BrissCMD.java	2012-04-10 19:54:28.597753560 +0200
+++ ./src/main/java/at/laborg/briss/BrissCMD.java	2012-04-10 16:33:00.712336493 +0200
@@ -19,6 +19,8 @@ package at.laborg.briss;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import at.laborg.briss.exception.CropException;
 import at.laborg.briss.model.ClusterDefinition;
@@ -94,13 +96,81 @@ public class BrissCMD {
 		}
 	}
 
+	public static void customCrop(String[] args) {
+
+		CommandValues workDescription = CommandValues
+				.parseToWorkDescription(args);
+
+		if (!CommandValues.isValidJob(workDescription))
+			return;
+
+		System.out
+				.println("Clustering PDF: " + workDescription.getSourceFile());
+		ClusterDefinition clusterDefinition = null;
+		try {
+			clusterDefinition = ClusterCreator.clusterPages(
+					workDescription.getSourceFile(), null);
+		} catch (IOException e1) {
+			System.out.println("Error occured while clustering.");
+			e1.printStackTrace(System.out);
+			return;
+		}
+		System.out.println("Created "
+				+ clusterDefinition.getClusterList().size() + " clusters.");
+		if(workDescription.getCrop().size() != clusterDefinition.getClusterList().size()) {
+			System.err.println("You need to specify a crop definition for ALL clusters!");
+			return;
+		}
+		
+		ClusterRenderWorker cRW = new ClusterRenderWorker(
+				workDescription.getSourceFile(), clusterDefinition);
+		cRW.start();
+
+		System.out.print("Starting to render clusters.");
+		while (cRW.isAlive()) {
+			System.out.print(".");
+			try {
+				Thread.sleep(500);
+			} catch (InterruptedException e) {
+			}
+		}
+		System.out.println("finished!");
+		System.out.println("setting crop rectangles.");
+		try {
+			// the config cluster definition applies here
+			for(int i = 0; i < clusterDefinition.getClusterList().size(); i++) {
+				List<Float[]> cluserrat = workDescription.getCrop().get(i);
+				for(Float[] cur : cluserrat) {
+					clusterDefinition.getClusterList().get(i).addRatios(cur);
+				}
+			}
+			CropDefinition cropDefintion = CropDefinition.createCropDefinition(
+					workDescription.getSourceFile(),
+					workDescription.getDestFile(), clusterDefinition);
+			System.out.println("Starting to crop files.");
+			DocumentCropper.crop(cropDefintion);
+			System.out.println("Cropping succesful. Cropped to:"
+					+ workDescription.getDestFile().getAbsolutePath());
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		} catch (CropException e) {
+			System.out.println("Error while cropping:" + e.getMessage());
+		}
+	}
+
 	private static class CommandValues {
 
 		private final static String SOURCE_FILE_CMD = "-s";
 		private final static String DEST_FILE_CMD = "-d";
+		private final static String CROP_CMD = "-c";
 
 		private File sourceFile;
 		private File destFile;
+		private List<List<Float[]>> crop = null;
 
 		static CommandValues parseToWorkDescription(String[] args) {
 			CommandValues commandValues = new CommandValues();
@@ -114,6 +184,10 @@ public class BrissCMD {
 					if (i < (args.length - 1)) {
 						commandValues.setDestFile(new File(args[i + 1]));
 					}
+				} else if (args[i].trim().equalsIgnoreCase(CROP_CMD)) {
+					if (i < (args.length - 1)) {
+						commandValues.setCropDefinition(args[i + 1]);
+					}
 				}
 				i++;
 			}
@@ -121,6 +195,29 @@ public class BrissCMD {
 			return commandValues;
 		}
 
+		/**
+		 * each page part: top/left/bottom/right
+		 * part1_page1,part2_page1,...:part1_page2,part2_page2
+		 * syntax: 0/0/0.5/0,0.5/0/0/0:0/0/0.5/0,0.5/0/0/0
+		 * @param string the command parameter
+		 */
+		private void setCropDefinition(String string) {
+			crop = new ArrayList<List<Float[]>>();
+			for(String page : string.split(":")) {
+				List<Float[]> pageratios = new ArrayList<Float[]>();
+				crop.add(pageratios);
+				for(String part : page.split(",")) {
+					String[] parts = part.split("/");
+					Float[] ratios = new Float[parts.length];
+					for(int i = 0; i < ratios.length; i++) {
+						ratios[i] = Float.parseFloat(parts[i]);
+					}
+					pageratios.add(ratios);
+				}
+			}
+			
+		}
+
 		private static boolean isValidJob(CommandValues job) {
 			if (job.getSourceFile() == null) {
 				System.out
@@ -170,5 +267,12 @@ public class BrissCMD {
 			this.destFile = destFile;
 		}
 
+		/**
+		 * @return the crop
+		 */
+		public List<List<Float[]>> getCrop() {
+			return crop;
+		}
+
 	}
 }
diff -rupNw ../briss.orig/briss//src/main/java/at/laborg/briss/BrissGUI.java ./src/main/java/at/laborg/briss/BrissGUI.java
--- ../briss.orig/briss//src/main/java/at/laborg/briss/BrissGUI.java	2012-04-10 19:54:28.597753560 +0200
+++ ./src/main/java/at/laborg/briss/BrissGUI.java	2012-04-10 16:32:31.708337903 +0200
@@ -94,6 +94,7 @@ public class BrissGUI extends JFrame imp
 	private static final String SET_SIZE_DESCRIPTION = "Enter size in milimeters (width height)";
 	private static final String SET_POSITION_DESCRIPTION = "Enter position in milimeters (x y)";
 	private static final String LOAD = "Load File";
+	private static final String SHOW_CROP = "Show Crop Definition";
 	private static final String CROP = "Crop PDF";
 	private static final String EXIT = "Exit";
 	private static final String MAXIMIZE_WIDTH = "Maximize to width";
@@ -186,6 +187,13 @@ public class BrissGUI extends JFrame imp
 
 		fileMenu.addSeparator();
 
+		loadButton = new JMenuItem(SHOW_CROP);
+		loadButton.addActionListener(this);
+		loadButton.setEnabled(true);
+		fileMenu.add(loadButton);
+
+		fileMenu.addSeparator();
+
 		openDonationLinkButton = new JMenuItem(DONATE);
 		openDonationLinkButton.addActionListener(this);
 		fileMenu.add(openDonationLinkButton);
@@ -437,11 +445,41 @@ public class BrissGUI extends JFrame imp
 						JOptionPane.ERROR_MESSAGE);
 			}
 
-		} else if (action.getActionCommand().equals(CROP)) {
+		}
+		else if (action.getActionCommand().equals(SHOW_CROP)) {
+			ClusterDefinition clusters = workingSet.getClusterDefinition();
+			StringBuilder crop = new StringBuilder();
+			
+			for (int i = 0; i < clusters.getClusterList().size(); i++) {
+				PageCluster cluster = clusters.getClusterList().get(i);
+				for(int j = 0; j < cluster.getRatiosList().size(); j++) {
+					Float[] parts = cluster.getRatiosList().get(j);
+					for(int k = 0; k < parts.length; k++) {
+						// cut away those huge decimals
+						if(0.0 == parts[k])
+							crop.append('0');
+						else
+							crop.append(String.valueOf(parts[k].floatValue()));
+						if(k != parts.length - 1) {
+							crop.append('/');
+						}
+					}
+					
+					if(j != cluster.getRatiosList().size() - 1) {
+						crop.append(',');
+					}
+				}
+				
+				if(i != clusters.getClusterList().size() - 1) {
+					crop.append(":");
+				}
+			}
+			JOptionPane.showInputDialog(this, "Crop Option: ", crop.toString());
+		}
+		else if (action.getActionCommand().equals(CROP)) {
 			try {
 				setWorkingState("loading PDF");
-				File result = createAndExecuteCropJob(workingSet
-						.getSourceFile());
+				File result = createAndExecuteCropJob(workingSet.getSourceFile());
 				if (result != null) {
 					DesktopHelper.openFileWithDesktopApp(result);
 					lastOpenDir = result.getParentFile();
diff -rupNw ../briss.orig/briss//src/main/java/at/laborg/briss/Briss.java ./src/main/java/at/laborg/briss/Briss.java
--- ../briss.orig/briss//src/main/java/at/laborg/briss/Briss.java	2012-04-10 19:54:28.597753560 +0200
+++ ./src/main/java/at/laborg/briss/Briss.java	2012-04-10 16:32:39.388337529 +0200
@@ -25,7 +25,32 @@ public class Briss {
 		System.setProperty("org.jpedal.jai", "true");
 
 		// check if args are present, if so try to start commandline briss
-		if (args.length > 1) {
+		boolean gui = true;
+		boolean customcrop = false;
+		
+		for(String a : args) {
+			if(a.equalsIgnoreCase("-h") || a.equalsIgnoreCase("--help")) {
+				System.out.println("Usage:\n\tbriss [-s SOURCE] [-d DESTINATION] [-c CROPARGS]");
+				System.out.println("CROPARGS are in the format: part1_page1,part2_page1,...!part1_page2,part2_page2 \n where each part consists of 4 numbers: top/left/bottom/right");
+				System.out.println("You can use the GUI to get these (use File/Show Crop Command)");
+				System.out.println("split an a4 page into 2 a5:\n -c 0/0/0.5/0,0.5/0/0/0:0/0/0.5/0,0.5/0/0/0");
+				return;
+			}
+			else
+			if(a.equals("-c")) {
+				customcrop = true;
+			}
+			else
+			if(a.equals("-d")) {
+				gui = false;
+			}
+		}
+		
+
+		if (!gui) {
+			if(customcrop)
+				BrissCMD.customCrop(args);
+			else
 			BrissCMD.autoCrop(args);
 		} else {
 			new BrissGUI(args);
