diff --git a/compiler/C_CodeGen.jrag b/compiler/C_CodeGen.jrag
index eea099bb1a41eddc589b49d986484fdd672f0663..25d5fedac7f383c1721d62d9219759417aa81d21 100644
--- a/compiler/C_CodeGen.jrag
+++ b/compiler/C_CodeGen.jrag
@@ -56,7 +56,10 @@ aspect C_CodeGenEnv {
       this.qualid = qualid;
       this.lcName = lcName;
       this.rawPrefix = rawPrefix;
-      if (rawPrefix.equals("")) {
+      if (rawPrefix == null) {
+        System.err.println("WARNING: prefix==null");
+        this.prefix = ""; 
+      } else if (rawPrefix.equals("")) {
         this.prefix = rawPrefix;
       } else {
         this.prefix = rawPrefix + "_";
diff --git a/compiler/LabComm.java b/compiler/LabComm.java
index d646563572ed6db40bc3fe842dedc526b423c645..3eb15a70e29ccdb79ece5d3fee71d7bf31f55550 100644
--- a/compiler/LabComm.java
+++ b/compiler/LabComm.java
@@ -37,25 +37,6 @@ public class LabComm {
     println(" --typeinfo=TIFILE       Generates typeinfo in TIFILE");
   }
     
-  private static String getCoreName(String s) {
-    int i = s.lastIndexOf('.');
-    return s.substring(0, i > 0 ? i : s.length());
-  }
-
-  private static String getFileName(String s) {
-    return s.substring(s.lastIndexOf('/') + 1, s.length());
-  }
-
-  private static String getBaseName(String s) {
-    s = getFileName(s);
-    int i = s.lastIndexOf('.');
-    return s.substring(0, i > 0 ? i : s.length());
-  }
-
-  private static String getPrefix(String s) {
-    return s.substring(s.lastIndexOf('/') + 1, s.length());
-  }
-
   /** To be cleaned up.
    */
   private static void checkVersion(int v) {
@@ -66,199 +47,6 @@ public class LabComm {
      }
   }
 
-  public static void main(String[] args) {
-    String fileName = null;
-    // Scan for first non-option
-    for (int i = 0 ; i < args.length ; i++) {
-      if (! args[i].startsWith("-")) {
-	fileName = args[i];
-	break;
-      }
-    }
-    String coreName = null;
-    String prefix = null;
-    if (fileName != null) {
-      coreName = getBaseName(fileName);
-      prefix = getPrefix(coreName);
-    }
-    boolean verbose = false;
-    int ver = 2013; //Version 2013 as default
-    String cFile = null;
-    String hFile = null;
-    Vector cIncludes = new Vector();
-    String cPrefix = prefix;
-    String csFile = null;
-    String csNamespace = null;
-    String javaDir = null;
-    String javaPackage = "";
-    String pythonFile = null;
-    String prettyFile = null;
-    String typeinfoFile = null;
-    String rapidFile = null;
-
-    for (int i = 0 ; i < args.length ; i++) {
-      if (fileName == null ||
-	  args[i].equals("-help") || 
-	  args[i].equals("-h") || 
-	  args[i].equals("--help")) {
-	print_help();
-	System.exit(0);
-      } else if (args[i].equals("-v")) {
-	verbose=true;
-      } else if (args[i].startsWith("--ver=")) {
-	ver = Integer.parseInt(args[i].substring(6));
-        checkVersion(ver);
-      } else if (args[i].equals("-C")) {
-	cFile = coreName + ".c";
-	hFile = coreName + ".h";
-      } else if (args[i].startsWith("--cinclude=")) {
-	cIncludes.add(args[i].substring(11));
-      } else if (args[i].startsWith("--cprefix=")) {
-	cPrefix = args[i].substring(10);
-      } else if (args[i].startsWith("--c=")) {
-	cFile = args[i].substring(4);
-      } else if (args[i].startsWith("--h=")) {
-	hFile = args[i].substring(4);
-      } else if (args[i].equals("--cs")) {
-	csFile = coreName + ".cs";
-      } else if (args[i].startsWith("--cs=")) {
-	csFile = args[i].substring(5);
-      } else if (args[i].startsWith("--csnamespace=")) {
-	csNamespace = args[i].substring(14);
-      } else if (args[i].startsWith("--java=")) {
-	javaDir = args[i].substring(7);
-      } else if (args[i].startsWith("--javapackage=")) {
-	javaPackage = args[i].substring(14);
-      } else if (args[i].equals("-P")) {
-	pythonFile = coreName + ".py";
-      } else if (args[i].startsWith("--python=")) {
-	pythonFile = args[i].substring(9);
-      } else if (args[i].startsWith("--pretty=")) {
-	prettyFile = args[i].substring(9);
-      } else if (args[i].startsWith("--typeinfo=")) {
-	typeinfoFile = args[i].substring(11);
-      } else if (args[i].equals("--rapid")) {
-	rapidFile = coreName + ".sys";
-      } else if (i == args.length - 1) {
-	fileName = args[i];
-      } else {
-	System.err.println(" Unknown argument " + args[i]);
-	print_help();
-	System.exit(2);
-      }
-    }
-    if (fileName == null) {
-      print_help();
-      System.exit(1);
-    } else {
-
-      Program ast = null;
-
-      try {
-	// Check for errors
-	LabCommScanner scanner = new LabCommScanner(new FileReader(fileName));
-	LabCommParser parser = new LabCommParser();
-	Program p = (Program)parser.parse(scanner);
-	Collection errors = new LinkedList();
-	p.errorCheck(errors);
-	  
-	if (errors.isEmpty()) {
-	  ast = p;
-	} else {
-	  for (Iterator iter = errors.iterator(); iter.hasNext(); ) {
-	    String s = (String)iter.next();
-	    System.out.println(s);
-	  }
-	}
-      } catch (FileNotFoundException e) {
-	System.err.println("Could not find file: " + fileName);
-      } catch (IOException e) {
-	System.err.println("IOException: " + fileName + " " + e);
-      } catch (beaver.Parser.Exception e) {
-	System.err.println(e.getMessage());
-      }
-      if (ast != null) {
-	
-	Vector hIncludes = new Vector(cIncludes);
-	if (hFile != null) {
-	  cIncludes.add(hFile);
-	}
-	  
-	boolean prettyOnStdout = true;
-	if (cFile != null) {
-	  if (verbose) { System.err.println("Generating C: " + cFile); }
-	  genC(ast, cFile, cIncludes, coreName, cPrefix, ver);
-	  prettyOnStdout = false;
-	}
-	if (hFile != null) {
-	  if (verbose) { System.err.println("Generating H: " + hFile); }
-	  genH(ast, hFile, hIncludes, coreName, cPrefix, ver);
-	  prettyOnStdout = false;
-	}
-	if (csFile != null) {
-	  if (verbose) { System.err.println("Generating C#: " + csFile); }
-	  genCS(ast, csFile, csNamespace, ver);
-	  prettyOnStdout = false;
-	}
-	if (javaDir != null) {
-	  if (verbose) { System.err.println("Generating Java: " + javaDir); }
-	  genJava(ast, javaDir, javaPackage, ver);
-	  prettyOnStdout = false;
-	}
-	if (pythonFile != null) {
-	  if (verbose) { 
-	    System.err.println("Generating Python: " + pythonFile); 
-	  }
-	  genPython(ast, pythonFile, prefix, ver);
-	  prettyOnStdout = false;
-	}
-	if (rapidFile != null) {
-		if (verbose) {
-			System.err.println("Generating RAPID: " + rapidFile);
-		}
-		genRAPID(ast, rapidFile, coreName, ver);
-		prettyOnStdout = false;
-	}
-	if (prettyFile != null) {
-	  if (verbose) { 
-	    System.err.println("Generating Pretty: " + prettyFile); 
-	  }
-	  try {
-	    FileOutputStream f = new FileOutputStream(prettyFile);
-	    PrintStream out = new PrintStream(f);
-	    ast.pp(out);
-	    out.close();
-	    prettyOnStdout = false;
-	  } catch (IOException e) {
-	    System.err.println("IOException: " + prettyFile + " " + e);
-	  } 
-	}
-	if (typeinfoFile != null) {
-	  if (verbose) { 
-	    System.err.println("Generating TypeInfo: " + typeinfoFile); 
-	  }
-	  try {
-	    FileOutputStream f = new FileOutputStream(typeinfoFile);
-	    PrintStream out = new PrintStream(f);
-	    ast.C_info(out, cPrefix, ver);
-	    ast.Java_info(out, ver);
-	    ast.CS_info(out, csNamespace, ver);
-	    prettyOnStdout = false;
-	  } catch (IOException e) {
-	    System.err.println("IOException: " + typeinfoFile + " " + e);
-	  }
-	}
-	if (prettyOnStdout) {
-	  ast.pp(System.out);
-	}
-      } else {
-          // Catch-all for compilation errors
-          System.err.println("Error in specification");
-          System.exit(3);
-      }
-    }
-  } 
-
   private static void genH(Program p, String hName, 
 			   Vector cIncludes, String coreName, String prefix, int ver) {
     try {
@@ -328,4 +116,289 @@ public class LabComm {
       System.err.println("IOException: " + filename + " " + e);
     }
   }
+
+  /** Helper class to contain command line options 
+      and their associated behaviour
+   **/
+  private static class Opts {
+    final String[] args;
+    String coreName = null;
+    String prefix = null;
+    boolean verbose = false;
+    int ver = 2013; //Version 2013 as default
+    String cFile = null;
+    String hFile = null;
+    Vector cIncludes = new Vector();
+    String cPrefix; // gets default value (prefix) in processFilename
+    String csFile = null;
+    String csNamespace = null;
+    String javaDir = null;
+    String javaPackage = "";
+    String pythonFile = null;
+    String prettyFile = null;
+    String typeinfoFile = null;
+    String rapidFile = null;
+    String fileName = null;
+
+   Opts(String[] args) {
+     this.args = args;
+   }
+
+    private static String getCoreName(String s) {
+      int i = s.lastIndexOf('.');
+      return s.substring(0, i > 0 ? i : s.length());
+    }
+  
+    private static String getFileName(String s) {
+      return s.substring(s.lastIndexOf('/') + 1, s.length());
+    }
+  
+    private static String getBaseName(String s) {
+      s = getFileName(s);
+      int i = s.lastIndexOf('.');
+      return s.substring(0, i > 0 ? i : s.length());
+    }
+  
+    private static String getPrefix(String s) {
+      return s.substring(s.lastIndexOf('/') + 1, s.length());
+    }
+  
+    boolean processFilename(){
+      // Scan for first non-option
+      for (int i = 0 ; i < args.length ; i++) {
+        if (! args[i].startsWith("-")) {
+  	fileName = args[i];
+  	break;
+        }
+      }
+      if (fileName != null) {
+        coreName = getBaseName(fileName);
+        prefix = getPrefix(coreName);
+       cPrefix = prefix;
+      }
+      return fileName != null;
+    }
+    
+    void processArgs(){
+      for (int i = 0 ; i < args.length ; i++) {
+        if (fileName == null ||
+  	  args[i].equals("-help") || 
+  	  args[i].equals("-h") || 
+  	  args[i].equals("--help")) {
+  	print_help();
+  	System.exit(0);
+        } else if (args[i].equals("-v")) {
+  	verbose=true;
+        } else if (args[i].startsWith("--ver=")) {
+  	ver = Integer.parseInt(args[i].substring(6));
+          checkVersion(ver);
+        } else if (args[i].equals("-C")) {
+  	cFile = coreName + ".c";
+  	hFile = coreName + ".h";
+        } else if (args[i].startsWith("--cinclude=")) {
+  	cIncludes.add(args[i].substring(11));
+        } else if (args[i].startsWith("--cprefix=")) {
+  	cPrefix = args[i].substring(10);
+        } else if (args[i].startsWith("--c=")) {
+  	cFile = args[i].substring(4);
+        } else if (args[i].startsWith("--h=")) {
+  	hFile = args[i].substring(4);
+        } else if (args[i].equals("--cs")) {
+  	csFile = coreName + ".cs";
+        } else if (args[i].startsWith("--cs=")) {
+  	csFile = args[i].substring(5);
+        } else if (args[i].startsWith("--csnamespace=")) {
+  	csNamespace = args[i].substring(14);
+        } else if (args[i].startsWith("--java=")) {
+  	javaDir = args[i].substring(7);
+        } else if (args[i].startsWith("--javapackage=")) {
+  	javaPackage = args[i].substring(14);
+        } else if (args[i].equals("-P")) {
+  	pythonFile = coreName + ".py";
+        } else if (args[i].startsWith("--python=")) {
+  	pythonFile = args[i].substring(9);
+        } else if (args[i].startsWith("--pretty=")) {
+  	prettyFile = args[i].substring(9);
+        } else if (args[i].startsWith("--typeinfo=")) {
+  	typeinfoFile = args[i].substring(11);
+        } else if (args[i].equals("--rapid")) {
+  	rapidFile = coreName + ".sys";
+        } else if (i == args.length - 1) {
+  	fileName = args[i];
+        } else {
+  	System.err.println(" Unknown argument " + args[i]);
+  	print_help();
+  	System.exit(2);
+        }
+      }
+     if(prefix==null){
+  	System.err.println("   WARNING! prefix==null");
+        prefix="";
+     }
+   }
+
+   Program parseFile(){
+     Program ast = null;
+     try {
+       // Check for errors
+       LabCommScanner scanner = new LabCommScanner(
+                                  new FileReader(fileName));
+       LabCommParser parser = new LabCommParser();
+       Program p = (Program)parser.parse(scanner);
+       Collection errors = new LinkedList();
+       p.errorCheck(errors);
+         
+       if (errors.isEmpty()) {
+         ast = p;
+       } else {
+         for (Iterator iter = errors.iterator(); iter.hasNext(); ) {
+           String s = (String)iter.next();
+           System.out.println(s);
+         }
+       }
+     } catch (FileNotFoundException e) {
+       System.err.println("Could not find file: " + fileName);
+     } catch (IOException e) {
+       System.err.println("IOException: " + fileName + " " + e);
+     } catch (beaver.Parser.Exception e) {
+       System.err.println(e.getMessage());
+     }
+     return ast;
+   }
+
+   boolean generateC(Program ast) {
+     boolean wroteFile = false; 
+     Vector hIncludes = new Vector(cIncludes);
+     if (hFile != null) {
+       cIncludes.add(hFile);
+     }
+     if (cFile != null) {
+       if (verbose) { System.err.println("Generating C: " + cFile); }
+       genC(ast, cFile, cIncludes, coreName, cPrefix, ver);
+       wroteFile = true;
+     }
+     if (hFile != null) {
+       if (verbose) { System.err.println("Generating H: " + hFile); }
+       genH(ast, hFile, hIncludes, coreName, cPrefix, ver);
+       wroteFile = true;
+     }
+     return wroteFile;
+   }
+  
+   boolean generateCS(Program ast) {
+     boolean wroteFile = false; 
+     if (csFile != null) {
+       if (verbose) { System.err.println("Generating C#: " + csFile); }
+       genCS(ast, csFile, csNamespace, ver);
+       wroteFile = true;
+     }
+     return wroteFile;
+   }
+  
+   boolean generateJava(Program ast) {
+     boolean wroteFile = false; 
+     if (javaDir != null) {
+       if (verbose) { System.err.println("Generating Java: " + javaDir); }
+       genJava(ast, javaDir, javaPackage, ver);
+       wroteFile = true;
+     }
+     return wroteFile;
+   }
+  
+   boolean generatePython(Program ast) {
+     boolean wroteFile = false; 
+     if (pythonFile != null) {
+       if (verbose) { 
+         System.err.println("Generating Python: " + pythonFile); 
+       }
+       genPython(ast, pythonFile, prefix, ver);
+       wroteFile = true;
+     }
+     return wroteFile;
+   }
+  
+   boolean generateRAPID(Program ast) {
+     boolean wroteFile = false; 
+     if (rapidFile != null) {
+       if (verbose) {
+         System.err.println("Generating RAPID: " + rapidFile);
+       }
+       genRAPID(ast, rapidFile, coreName, ver);
+       wroteFile = true;
+     }
+     return wroteFile;
+   }
+   boolean generatePrettyPrint(Program ast) {
+     boolean wroteFile = false; 
+     if (prettyFile != null) {
+       if (verbose) { 
+         System.err.println("Generating Pretty: " + prettyFile); 
+       }
+       try {
+         FileOutputStream f = new FileOutputStream(prettyFile);
+         PrintStream out = new PrintStream(f);
+         ast.pp(out);
+         out.close();
+         wroteFile = true;
+       } catch (IOException e) {
+         System.err.println("IOException: " + prettyFile + " " + e);
+       } 
+     }
+     return wroteFile;
+   }
+  
+   boolean generateTypeinfo(Program ast) {
+     boolean wroteFile = false; 
+     if (typeinfoFile != null) {
+       if (verbose) { 
+         System.err.println("Generating TypeInfo: " + typeinfoFile); 
+       }
+       try {
+         FileOutputStream f = new FileOutputStream(typeinfoFile);
+         PrintStream out = new PrintStream(f);
+         ast.C_info(out, cPrefix, ver);
+         ast.Java_info(out, ver);
+         ast.CS_info(out, csNamespace, ver);
+         wroteFile = true;
+       } catch (IOException e) {
+         System.err.println("IOException: " + typeinfoFile + " " + e);
+       }
+     }
+     return wroteFile;
+    }
+  }
+
+
+  public static void main(String[] args) {
+    Opts opts = new Opts(args);
+    if(!opts.processFilename()) {
+      print_help();
+      System.exit(1);
+    } else {
+      opts.processArgs();
+      Program ast =  opts.parseFile();
+
+      if (ast != null) {
+	
+	boolean fileWritten = false;
+
+        fileWritten |= opts.generateC(ast);
+        fileWritten |= opts.generateCS(ast);
+        fileWritten |= opts.generateJava(ast);
+        fileWritten |= opts.generatePython(ast);
+        fileWritten |= opts.generateRAPID(ast);
+        fileWritten |= opts.generatePrettyPrint(ast);
+        fileWritten |= opts.generateTypeinfo(ast);
+
+        // if no output to files, prettyprint on stdout
+	if (!fileWritten) {
+	  ast.pp(System.out);
+	}
+      } else {
+          // Catch-all for compilation errors
+          System.err.println("Error in specification");
+          System.exit(3);
+      }
+    }
+  } 
 }