diff --git a/opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratAnnService.java b/opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderAnnService.java
similarity index 60%
rename from opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratAnnService.java
rename to opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderAnnService.java
index 6bfbb5c..926730f 100644
--- a/opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratAnnService.java
+++ b/opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderAnnService.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package opennlp.bratannotator;
+package opennlp.bratann;
 
 import java.io.File;
-import java.net.URI;
-import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
 
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletContextHandler;
@@ -38,54 +38,53 @@
 import opennlp.tools.tokenize.TokenizerModel;
 import opennlp.tools.tokenize.WhitespaceTokenizer;
 
-public class BratAnnService {
-  
-  public static SentenceDetector sentenceDetector;
-  public static Tokenizer tokenizer;
+public class NameFinderAnnService {
+
+  public static SentenceDetector sentenceDetector = new NewlineSentenceDetector();;
+  public static Tokenizer tokenizer = WhitespaceTokenizer.INSTANCE;
   public static TokenNameFinder nameFinders[];
-  
+
   public static void main(String[] args) throws Exception {
-    
-    if (args.length < 3) {
-      System.out.println("sentenceDetectorURI tokenizerURI namefinderURI_1 ... nameFinderURI_n");
+
+    if (args.length == 0) {
+      System.out.println(
+          "[-tokenizerModel file] [-ruleBasedTokenizer whitespace|simple] [-sentenceDetectorModel file] "
+              + "namefinderFile|nameFinderURI");
       return;
     }
 
-    URI sentenceDetectorUri = URI.create(args[0]);
-    if ("sentenceDetector".equals(sentenceDetectorUri.getScheme())) {
-      
-      if ("newline".equals(sentenceDetectorUri.getSchemeSpecificPart())) {
-        sentenceDetector = new NewlineSentenceDetector();
-      }
-      else {
-        System.out.println("unkown sentence detector");
-        return;
-      }
-    }
-    else {
-      sentenceDetector = new SentenceDetectorME(new SentenceModel(new File(args[0])));
-    }
-    
-    URI tokenizerUri = URI.create(args[1]);
-    if ("tokenizer".equals(tokenizerUri.getScheme())) {
-      if ("whitespace".equals(tokenizerUri.getSchemeSpecificPart())) {
-        tokenizer = WhitespaceTokenizer.INSTANCE;
-      }
-      else if ("simple".equals(tokenizerUri.getSchemeSpecificPart())) {
-        tokenizer = SimpleTokenizer.INSTANCE;
-      } 
-      else {
-        System.out.println("unkown tokenizer");
-        return;
-      }
+    List<String> argList = Arrays.asList(args);
 
+    int sentenceModelIndex = argList.indexOf("-sentenceDetectorModel")
+        + 1;
+    if (sentenceModelIndex > 0 && sentenceModelIndex < args.length) {
+      sentenceDetector = new SentenceDetectorME(
+          new SentenceModel(new File(args[sentenceModelIndex])));
     }
-    else {
-      tokenizer = new TokenizerME(new TokenizerModel(new File(args[1])));
+
+    int ruleBasedTokenizerIndex = argList.indexOf("-ruleBasedTokenizer") + 1;
+
+    if (ruleBasedTokenizerIndex > 0 && ruleBasedTokenizerIndex < args.length) {
+      if ("whitespace".equals(args[ruleBasedTokenizerIndex])) {
+        tokenizer = WhitespaceTokenizer.INSTANCE;
+      } else if ("simple".equals(args[ruleBasedTokenizerIndex])) {
+        tokenizer = SimpleTokenizer.INSTANCE;
+      } else {
+        System.out
+            .println("unkown tokenizer: " + args[ruleBasedTokenizerIndex]);
+        return;
+      }
     }
-    
-    nameFinders = new TokenNameFinder[] {new NameFinderME(new TokenNameFinderModel(new URL(args[2])))};
-    
+
+    int tokenizerModelIndex = argList.indexOf("-tokenizerModel") + 1;
+    if (tokenizerModelIndex > 0 && tokenizerModelIndex < args.length) {
+      tokenizer = new TokenizerME(
+          new TokenizerModel(new File(args[tokenizerModelIndex])));
+    }
+
+    nameFinders = new TokenNameFinder[] { new NameFinderME(
+        new TokenNameFinderModel(new File(args[args.length - 1]))) };
+
     ServletContextHandler context = new ServletContextHandler(
         ServletContextHandler.SESSIONS);
     context.setContextPath("/");
@@ -95,12 +94,13 @@
 
     ServletHolder jerseyServlet = context
         .addServlet(com.sun.jersey.spi.container.servlet.ServletContainer.class, "/*");
-    jerseyServlet.setInitParameter("com.sun.jersey.config.property.packages", "opennlp.bratannotator");
+    jerseyServlet.setInitParameter("com.sun.jersey.config.property.packages",
+        "opennlp.bratann");
     jerseyServlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
     jerseyServlet.setInitOrder(0);
 
     jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
-        BratNameFinderResource.class.getCanonicalName());
+        NameFinderResource.class.getCanonicalName());
 
     try {
       jettyServer.start();
diff --git a/opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratNameFinderResource.java b/opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderResource.java
similarity index 93%
rename from opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratNameFinderResource.java
rename to opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderResource.java
index 88dacc6..39cec0e 100644
--- a/opennlp-brat-annotator/src/main/java/opennlp/bratannotator/BratNameFinderResource.java
+++ b/opennlp-brat-annotator/src/main/java/opennlp/bratann/NameFinderResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package opennlp.bratannotator;
+package opennlp.bratann;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -35,7 +35,7 @@
 import opennlp.tools.util.Span;
 
 @Path("/ner")
-public class BratNameFinderResource {
+public class NameFinderResource {
 
   public static class NameAnn {
     public int[][] offsets;
@@ -43,9 +43,9 @@
     public String type;
   }
 
-  private SentenceDetector sentDetect = BratAnnService.sentenceDetector;
-  private Tokenizer tokenizer = BratAnnService.tokenizer;
-  private TokenNameFinder nameFinders[] = BratAnnService.nameFinders;
+  private SentenceDetector sentDetect = NameFinderAnnService.sentenceDetector;
+  private Tokenizer tokenizer = NameFinderAnnService.tokenizer;
+  private TokenNameFinder nameFinders[] = NameFinderAnnService.nameFinders;
 
   private static int findNextNonWhitespaceChar(CharSequence s, int beginOffset,
       int endOffset) {
