diff --git a/build.gradle b/build.gradle
index 0aa9636cc9da06da2e607cad10e85b5f8d8f2a2b..60840d773e633ab408c265545b847af5605dce21 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,6 +15,7 @@ repositories {
 
 apply plugin: 'java'
 apply plugin: 'jastadd'
+apply plugin: 'maven'
 
 version = '1.3.0'
 group = 'org.extendj'
diff --git a/src/java/org/extendj/ragdoc/RagDocBuilder.java b/src/java/org/extendj/ragdoc/RagDocBuilder.java
index c15759033c3b2b6bf926edbcb5cc0607c02a29cf..cc8eba21ea7fef31116c6f68e3d4ed6b86e98d26 100644
--- a/src/java/org/extendj/ragdoc/RagDocBuilder.java
+++ b/src/java/org/extendj/ragdoc/RagDocBuilder.java
@@ -73,15 +73,6 @@ public class RagDocBuilder extends Frontend {
    * @return {@code true} if documentation generation succeeds
    */
   public int compile(String[] args) {
-    // TODO use command-line arg for ragRoot!
-    // TODO add package exclude argument.
-    File userDir = new File(System.getProperty("user.dir"));
-    if (userDir.isDirectory()) {
-      jsonBuilder = new JsonBuilder(userDir);
-    } else {
-      jsonBuilder = new JsonBuilder(new File("."));
-    }
-    ASTNode.jsonBuilder = jsonBuilder;
     return run(args, Program.defaultBytecodeReader(), Program.defaultJavaParser());
   }
 
@@ -90,7 +81,7 @@ public class RagDocBuilder extends Frontend {
     long start = System.currentTimeMillis();
     int result = super.run(args, reader, parser);
     long time = System.currentTimeMillis() - start;
-    System.out.format("Analysis took %fs%n", time / 1000.0);
+    System.out.format("Analysis took %.1fs.%n", time / 1000.0);
     try {
       File outputDir;
       if (program.options().hasValueForOption("-d")) {
@@ -105,6 +96,7 @@ public class RagDocBuilder extends Frontend {
         System.err.format("Error: not a valid output directory: '%s'\n", outputDir.getName());
         return EXIT_CONFIG_ERROR;
       }
+      System.out.println("Writing ragdoc metadata to: " + outputDir.getPath());
       System.out.println("Writing package summary.");
       outputJson(outputDir, "packages.json", jsonBuilder.packageIndex());
 
@@ -121,7 +113,7 @@ public class RagDocBuilder extends Frontend {
       for (Map.Entry<String, File> entry : jsonBuilder.sourceFiles.entrySet()) {
         File file = entry.getValue();
         String path = entry.getKey();
-        path = path.replace('/', '_').replace('\\', '_');
+        path = path.replace('/', '_').replace('\\', '_').replace('.', '_');
         copyFile(outputDir, path, file);
       }
     } catch (IOException e) {
@@ -181,6 +173,30 @@ public class RagDocBuilder extends Frontend {
 
   @Override protected void initOptions() {
     super.initOptions();
+    program.options().addKeyValueOption("-ragroot");
+  }
+
+  @Override protected int processArgs(String[] args) {
+    int result = super.processArgs(args);
+    if (result == 0) {
+      // TODO add package exclude argument.
+      File ragRoot;
+      if (program.options().hasValueForOption("-ragroot")) {
+        ragRoot = new File(program.options().getValueForOption("-ragroot"));
+      } else {
+        System.out.println("No ragroot directory specified. Using default.");
+        File userDir = new File(System.getProperty("user.dir"));
+        if (userDir.isDirectory()) {
+          ragRoot = userDir;
+        } else {
+          ragRoot = new File(".");
+        }
+      }
+      System.out.println("Using ragroot directory: " + ragRoot.getAbsolutePath());
+      jsonBuilder = new JsonBuilder(ragRoot);
+      ASTNode.jsonBuilder = jsonBuilder;
+    }
+    return result;
   }
 
 }