diff --git a/cmds/dumpsys/dumpsys.cpp b/cmds/dumpsys/dumpsys.cpp
new file mode 100644
index 0000000..7dad6b6
--- /dev/null
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -0,0 +1,85 @@
+/*
+ * Command that dumps interesting system state to the log.
+ *
+ */
+
+#define LOG_TAG "dumpsys"
+
+#include <utils/Log.h>
+#include <binder/Parcel.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <utils/TextOutput.h>
+#include <utils/Vector.h>
+
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+using namespace android;
+
+static int sort_func(const String16* lhs, const String16* rhs)
+{
+    return lhs->compare(*rhs);
+}
+
+int main(int argc, char* const argv[])
+{
+    sp<IServiceManager> sm = defaultServiceManager();
+    fflush(stdout);
+    if (sm == NULL) {
+		ALOGE("Unable to get default service manager!");
+        aerr << "dumpsys: Unable to get default service manager!" << endl;
+        return 20;
+    }
+
+    Vector<String16> services;
+    Vector<String16> args;
+    if (argc == 1) {
+        services = sm->listServices();
+        services.sort(sort_func);
+        args.add(String16("-a"));
+    } else {
+        services.add(String16(argv[1]));
+        for (int i=2; i<argc; i++) {
+            args.add(String16(argv[i]));
+        }
+    }
+
+    const size_t N = services.size();
+
+    if (N > 1) {
+        // first print a list of the current services
+        aout << "Currently running services:" << endl;
+    
+        for (size_t i=0; i<N; i++) {
+            sp<IBinder> service = sm->checkService(services[i]);
+            if (service != NULL) {
+                aout << "  " << services[i] << endl;
+            }
+        }
+    }
+
+    for (size_t i=0; i<N; i++) {
+        sp<IBinder> service = sm->checkService(services[i]);
+        if (service != NULL) {
+            if (N > 1) {
+                aout << "------------------------------------------------------------"
+                        "-------------------" << endl;
+                aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
+            }
+            int err = service->dump(STDOUT_FILENO, args);
+            if (err != 0) {
+                aerr << "Error dumping service info: (" << strerror(err)
+                        << ") " << services[i] << endl;
+            }
+        } else {
+            aerr << "Can't find service: " << services[i] << endl;
+        }
+    }
+
+    return 0;
+}
