diff --git a/Android.mk b/Android.mk
index 02cc7da..9e2de52 100644
--- a/Android.mk
+++ b/Android.mk
@@ -27,7 +27,8 @@
 LOCAL_STATIC_LIBRARIES += \
     libvncserver
 
-LOCAL_CFLAGS := -Ofast -Werror -std=c++11
+LOCAL_CFLAGS := -DVNCFLINGER_VERSION="0.1"
+LOCAL_CFLAGS += -Ofast -Werror -std=c++11
 
 #LOCAL_CFLAGS += -DLOG_NDEBUG=0
 #LOCAL_CXX := /usr/bin/include-what-you-use
diff --git a/TODO b/TODO
index a86b824..a4020a7 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,4 @@
 Various things that need done:
 
-FPS reporting
+Binder interface
 Copy/paste
-Commandline args for tuning (port, encodings, etc)
-Authentication
-
diff --git a/src/VNCFlinger.cpp b/src/VNCFlinger.cpp
index 084bfa2..a637c47 100644
--- a/src/VNCFlinger.cpp
+++ b/src/VNCFlinger.cpp
@@ -31,15 +31,67 @@
 
 using namespace android;
 
+VNCFlinger::VNCFlinger() {
+    mOrientation = -1;
+    mMainDpy = SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
+    updateDisplayProjection();
+
+    createVNCServer();
+
+    String8 v4("127.0.0.1");
+    String8 v6("::1");
+
+    setListenAddress(v4, false);
+    setListenAddress(v6, true);
+}
+
+status_t VNCFlinger::setListenAddress(String8& address, bool v6) {
+    if (v6) {
+        mVNCScreen->listen6Interface = const_cast<char *>(address.string());
+        return NO_ERROR;
+    }
+    if (!rfbStringToAddr(const_cast<char *>(address.string()), &(mVNCScreen->listenInterface))) {
+        return BAD_VALUE;
+    }
+    return NO_ERROR;
+}
+
+status_t VNCFlinger::setPort(unsigned int port) {
+    if (port > 65535) {
+        port = 0;
+    }
+    if (port == 0) {
+        mVNCScreen->autoPort = 1;
+    } else {
+        mVNCScreen->autoPort = 0;
+        mVNCScreen->port = port;
+        mVNCScreen->ipv6port = port;
+    }
+    return NO_ERROR;
+}
+
+status_t VNCFlinger::clearPassword() {
+    std::remove(VNC_AUTH_FILE);
+    ALOGW("Password authentication disabled");
+    return OK;
+}
+
+status_t VNCFlinger::setPassword(String8& passwd) {
+    String8 path(VNC_AUTH_FILE);
+    if (rfbEncryptAndStorePasswd(const_cast<char *>(passwd.string()),
+                                 const_cast<char *>(path.string())) != 0) {
+        ALOGE("Failed to set password");
+        return BAD_VALUE;
+    }
+    ALOGI("Password has been set");
+    return OK;
+}
+
 status_t VNCFlinger::start() {
     sp<ProcessState> self = ProcessState::self();
     self->startThreadPool();
 
-    mMainDpy = SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
-
-    updateDisplayProjection();
-
-    status_t err = createVNCServer();
+    status_t err = startVNCServer();
     if (err != NO_ERROR) {
         ALOGE("Failed to start VNCFlinger: err=%d", err);
         return err;
@@ -61,6 +113,8 @@
 
     ALOGV("Shutting down");
 
+    rfbShutdownServer(mVNCScreen, true);
+
     destroyVirtualDisplayLocked();
     mClientCount = 0;
     mRunning = false;
@@ -154,7 +208,7 @@
     rfbErr = VNCFlinger::rfbLogger;
 
     // 32-bit color
-    mVNCScreen = rfbGetScreen(&mArgc, mArgv, mWidth, mHeight, 8, 3, 4);
+    mVNCScreen = rfbGetScreen(0, NULL, mWidth, mHeight, 8, 3, 4);
     if (mVNCScreen == NULL) {
         ALOGE("Unable to create VNCScreen");
         return NO_INIT;
@@ -168,7 +222,7 @@
     mVNCScreen->desktopName = "VNCFlinger";
     mVNCScreen->alwaysShared = TRUE;
     mVNCScreen->httpDir = NULL;
-    mVNCScreen->port = VNC_PORT;
+    mVNCScreen->authPasswdData = (void *)VNC_AUTH_FILE;
     mVNCScreen->newClientHook = (rfbNewClientHookPtr)VNCFlinger::onNewClient;
     mVNCScreen->kbdAddEvent = InputDevice::onKeyEvent;
     mVNCScreen->ptrAddEvent = InputDevice::onPointerEvent;
@@ -179,12 +233,17 @@
     mVNCScreen->handleEventsEagerly = true;
     mVNCScreen->deferUpdateTime = 1;
     mVNCScreen->screenData = this;
+
+    return err;
+}
+
+status_t VNCFlinger::startVNCServer() {
     rfbInitServer(mVNCScreen);
 
     /* Mark as dirty since we haven't sent any updates at all yet. */
     rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
 
-    return err;
+    return NO_ERROR;
 }
 
 size_t VNCFlinger::addClient() {
diff --git a/src/VNCFlinger.h b/src/VNCFlinger.h
index fe4a34b..7433f0c 100644
--- a/src/VNCFlinger.h
+++ b/src/VNCFlinger.h
@@ -20,18 +20,18 @@
 
 #include <gui/CpuConsumer.h>
 #include <ui/DisplayInfo.h>
+#include <utils/String8.h>
 
 #include <rfb/rfb.h>
 
-#define VNC_PORT 5901
+#define VNC_AUTH_FILE "/data/system/vncauth"
 #define NUM_BUFS 1
 
 namespace android {
 
-class VNCFlinger {
+class VNCFlinger : public RefBase {
   public:
-    VNCFlinger(int argc, char** argv) : mArgc(argc), mArgv(argv), mOrientation(-1) {
-    }
+    VNCFlinger();
 
     virtual ~VNCFlinger() {
     }
@@ -42,6 +42,12 @@
     virtual size_t addClient();
     virtual size_t removeClient();
 
+    virtual status_t setListenAddress(String8& address, bool v6);
+    virtual status_t setPort(unsigned int port);
+
+    virtual status_t clearPassword();
+    virtual status_t setPassword(String8& passwd);
+
   private:
     class FrameListener : public CpuConsumer::FrameAvailableListener {
       public:
@@ -60,7 +66,9 @@
 
     virtual status_t createVirtualDisplay();
     virtual status_t destroyVirtualDisplayLocked();
+
     virtual status_t createVNCServer();
+    virtual status_t startVNCServer();
 
     virtual void processFrame();
 
@@ -75,9 +83,6 @@
     static void onFrameDone(rfbClientPtr cl, int result);
     static void rfbLogger(const char* format, ...);
 
-    int mArgc;
-    char** mArgv;
-
     bool mRunning;
     bool mFrameAvailable;
     bool mRotate;
diff --git a/src/main.cpp b/src/main.cpp
index dc34921..8ef24fb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -14,23 +14,118 @@
 // You should have received a copy of the GNU General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //
+#include <getopt.h>
 
 #include <csignal>
+#include <iostream>
 
 #include "VNCFlinger.h"
 
 using namespace android;
 
-static VNCFlinger* VNC;
+static sp<VNCFlinger> gVNC;
+
+static const char* const shortOpts = "4:6:p:s:vh";
+static const option longOpts[] = {
+    {"listen", 1, nullptr, '4'},
+    {"listen6", 1, nullptr, '6'},
+    {"port", 1, nullptr, 'p'},
+    {"password", 1, nullptr, 's'},
+    {"version", 0, nullptr, 'v'},
+    {"help", 0, nullptr, 'h'},
+};
 
 static void onSignal(int /* signal */) {
-    VNC->stop();
+    gVNC->stop();
+}
+
+static void printVersion() {
+    std::cout << "VNCFlinger-" << VNCFLINGER_VERSION << std::endl;
+    exit(0);
+}
+
+static void printHelp() {
+    std::cout << "Usage: vncflinger [OPTIONS]\n\n"
+              << "  -4 <addr>        IPv4 address to listen (default: localhost)\n"
+              << "  -6 <addr>        IPv6 address to listen (default: localhost)\n"
+              << "  -p <num>         Port to listen on (default: 5900)\n"
+              << "  -s <pass>        Store server password\n"
+              << "  -c               Clear server password\n"
+              << "  -v               Show server version\n"
+              << "  -h               Show help\n\n";
+    exit(1);
+}
+
+static void parseArgs(int argc, char** argv) {
+    String8 arg;
+
+    while (true) {
+        const auto opt = getopt_long(argc, argv, shortOpts, longOpts, nullptr);
+
+        if (opt < 0) {
+            break;
+        }
+
+        switch (opt) {
+            case 's':
+                arg = optarg;
+                if (gVNC->setPassword(arg) != OK) {
+                    std::cerr << "Failed to set password\n";
+                    exit(1);
+                }
+                exit(0);
+
+            case 'c':
+                if (gVNC->clearPassword() != OK) {
+                    std::cerr << "Failed to clear password\n";
+                    exit(1);
+                }
+                exit(0);
+
+            case '4':
+                arg = optarg;
+                if (gVNC->setListenAddress(arg, false) != OK) {
+                    std::cerr << "Failed to set IPv4 address\n";
+                    exit(1);
+                }
+                break;
+
+            case '6':
+                arg = optarg;
+                if (gVNC->setListenAddress(arg, true) != OK) {
+                    std::cerr << "Failed to set IPv6 address\n";
+                    exit(1);
+                }
+                break;
+
+            case 'p':
+                std::cerr << "port=" << optarg << std::endl;
+                if (gVNC->setPort(std::stoi(optarg)) != OK) {
+                    std::cerr << "Failed to set port\n";
+                    exit(1);
+                }
+                break;
+
+            case 'v':
+                printVersion();
+                break;
+
+            case 'h':
+            case '?':
+            default:
+                printHelp();
+                break;
+        }
+    }
 }
 
 int main(int argc, char** argv) {
     std::signal(SIGINT, onSignal);
     std::signal(SIGHUP, onSignal);
 
-    VNC = new VNCFlinger(argc, argv);
-    VNC->start();
+    gVNC = new VNCFlinger();
+
+    parseArgs(argc, argv);
+
+    gVNC->start();
 }
