diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java
index c031ea8c690ac133da50793eb1e2f8e33372b696..881073d09f45fd560d8d5d4ce6d15c8986f281d1 100644
--- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java
+++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java
@@ -9,6 +9,8 @@ import java.net.Socket;
 import java.util.HashMap;
 import java.util.Map;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base32;
 import net.i2p.data.DataHelper;
@@ -37,15 +39,59 @@ public class SAMStreamSend {
     /** Connection id (Integer) to peer (Flooder) */
     private final Map<String, Sender> _remotePeers;
     
+    private static final String USAGE = "Usage: SAMStreamSend [-s] [-d] [-r] [-v version] [-b samHost] [-p samPort] peerDestFile dataDir";
+
     public static void main(String args[]) {
-        if (args.length < 4) {
-            System.err.println("Usage: SAMStreamSend samHost samPort peerDestFile dataFile [version]");
+        Getopt g = new Getopt("SAM", args, "drsb:p:v:");
+        boolean isSSL = false;
+        int mode = 0; // stream
+        String version = "1.0";
+        String host = "127.0.0.1";
+        String port = "7656";
+        int c;
+        while ((c = g.getopt()) != -1) {
+          switch (c) {
+            case 's':
+                isSSL = true;
+                break;
+
+            case 'd':
+                mode = 1;  // datagram
+                break;
+
+            case 'r':
+                mode = 2;  // raw
+                break;
+
+            case 'v':
+                version = g.getOptarg();
+                break;
+
+            case 'b':
+                host = g.getOptarg();
+                break;
+
+            case 'p':
+                port = g.getOptarg();
+                break;
+
+            case 'h':
+            case '?':
+            case ':':
+            default:
+                System.err.println(USAGE);
+                return;
+          }  // switch
+        } // while
+
+        int startArgs = g.getOptind();
+        if (args.length - startArgs != 2) {
+            System.err.println(USAGE);
             return;
         }
         I2PAppContext ctx = I2PAppContext.getGlobalContext();
-        //String files[] = new String[args.length - 3];
-        SAMStreamSend sender = new SAMStreamSend(ctx, args[0], args[1], args[2], args[3]);
-        String version = (args.length >= 5) ? args[4] : "1.0";
+        SAMStreamSend sender = new SAMStreamSend(ctx, host, port,
+                                                      args[startArgs], args[startArgs + 1]);
         sender.startup(version);
     }
     
diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java
index 24500eb62d889029bbfbeece66a51ffd4f8620ce..91c1f3893551a3310d2589eb1447684012b86e02 100644
--- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java
+++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java
@@ -10,6 +10,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base32;
 import net.i2p.data.DataHelper;
@@ -38,14 +40,59 @@ public class SAMStreamSink {
     /** Connection id (Integer) to peer (Flooder) */
     private final Map<String, Sink> _remotePeers;
     
+    private static final String USAGE = "Usage: SAMStreamSink [-s] [-d] [-r] [-v version] [-b samHost] [-p samPort] myDestFile sinkDir";
+
     public static void main(String args[]) {
-        if (args.length < 4) {
-            System.err.println("Usage: SAMStreamSink samHost samPort myDestFile sinkDir [version]");
+        Getopt g = new Getopt("SAM", args, "drsb:p:v:");
+        boolean isSSL = false;
+        int mode = 0; // stream
+        String version = "1.0";
+        String host = "127.0.0.1";
+        String port = "7656";
+        int c;
+        while ((c = g.getopt()) != -1) {
+          switch (c) {
+            case 's':
+                isSSL = true;
+                break;
+
+            case 'd':
+                mode = 1;  // datagram
+                break;
+
+            case 'r':
+                mode = 2;  // raw
+                break;
+
+            case 'v':
+                version = g.getOptarg();
+                break;
+
+            case 'b':
+                host = g.getOptarg();
+                break;
+
+            case 'p':
+                port = g.getOptarg();
+                break;
+
+            case 'h':
+            case '?':
+            case ':':
+            default:
+                System.err.println(USAGE);
+                return;
+          }  // switch
+        } // while
+
+        int startArgs = g.getOptind();
+        if (args.length - startArgs != 2) {
+            System.err.println(USAGE);
             return;
         }
         I2PAppContext ctx = I2PAppContext.getGlobalContext();
-        SAMStreamSink sink = new SAMStreamSink(ctx, args[0], args[1], args[2], args[3]);
-        String version = (args.length >= 5) ? args[4] : "1.0";
+        SAMStreamSink sink = new SAMStreamSink(ctx, host, port,
+                                                    args[startArgs], args[startArgs + 1]);
         sink.startup(version);
     }