diff --git a/sdklauncher/src/source/sdklauncher.c b/sdklauncher/src/source/sdklauncher.c
new file mode 100644
index 0000000..6b2c45c
--- /dev/null
+++ b/sdklauncher/src/source/sdklauncher.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * The "SDK Manager" is for Windows only.
+ * This simple .exe will sit at the root of the Windows SDK
+ * and currently simply executes tools\android.bat.
+ *
+ * TODO: replace by a jar-exe wrapper.
+ */
+
+#ifdef _WIN32
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <windows.h>
+
+
+int _enable_dprintf = 0;
+
+void dprintf(char *msg, ...) {
+    va_list ap;
+    va_start(ap, msg);
+
+    if (_enable_dprintf) {
+        vfprintf(stderr, msg, ap);
+    }
+
+    va_end(ap);
+}
+
+void display_error(LPSTR description) {
+    DWORD err = GetLastError();
+    LPSTR s, s2;
+
+    fprintf(stderr, "%s, error %ld\n", description, err);
+
+    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
+                      FORMAT_MESSAGE_FROM_SYSTEM,
+                      NULL,                             /* lpSource */
+                      err,                              /* dwMessageId */
+                      0,                                /* dwLanguageId */
+                      (LPSTR)&s,                        /* lpBuffer */
+                      0,                                /* nSize */
+                      NULL) != 0) {                     /* va_list args */
+        fprintf(stderr, "%s", s);
+
+        s2 = (LPSTR) malloc(strlen(description) + strlen(s) + 5);
+        sprintf(s2, "%s\r\n%s", description, s);
+        MessageBox(NULL, s2, "Android SDK Manager - Error", MB_OK);
+        free(s2);
+        LocalFree(s);
+    }
+}
+
+
+int sdk_launcher() {
+    int                   result = 0;
+    STARTUPINFO           startup;
+    PROCESS_INFORMATION   pinfo;
+    CHAR                  program_dir[MAX_PATH];
+    int                   ret, pos;
+
+    ZeroMemory(&pinfo, sizeof(pinfo));
+
+    ZeroMemory(&startup, sizeof(startup));
+    startup.cb = sizeof(startup);
+    startup.dwFlags     = STARTF_USESHOWWINDOW;
+    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
+
+    /* get path of current program, to switch dirs here when executing the command. */
+    ret = GetModuleFileName(NULL, program_dir, sizeof(program_dir));
+    if (ret == 0) {
+        display_error("Failed to get program's filename:");
+        result = 1;
+    } else {
+        /* Remove the last segment to keep only the directory. */
+        pos = ret - 1;
+        while (pos > 0 && program_dir[pos] != '\\') {
+            --pos;
+        }
+        program_dir[pos] = 0;
+    }
+
+    if (!result) {
+        dprintf("Program dir: %s\n", program_dir);
+
+        // SDK Manager.exe is installed by the Windows Installer just below
+        // the tools directory and needs to access tools\android.bat
+        ret = CreateProcess(
+                NULL,                                       /* program path */
+                "tools\\android.bat sdk",                   /* command-line */
+                NULL,                  /* process handle is not inheritable */
+                NULL,                   /* thread handle is not inheritable */
+                TRUE,                          /* yes, inherit some handles */
+                CREATE_NO_WINDOW,                /* we don't want a console */
+                NULL,                     /* use parent's environment block */
+                program_dir,             /* use parent's starting directory */
+                &startup,                 /* startup info, i.e. std handles */
+                &pinfo);
+
+        if (!ret) {
+            dprintf("CreateProcess returned %d\n", ret);
+
+            // In the ADT bundle, SDK Manager.exe is located in the sdk folder
+            // and needs to access sdk\tools\android.bat
+            ret = CreateProcess(
+                    NULL,                                   /* program path */
+                    "sdk\\tools\\android.bat sdk",          /* command-line */
+                    NULL,              /* process handle is not inheritable */
+                    NULL,               /* thread handle is not inheritable */
+                    TRUE,                      /* yes, inherit some handles */
+                    CREATE_NO_WINDOW,            /* we don't want a console */
+                    NULL,                 /* use parent's environment block */
+                    program_dir,         /* use parent's starting directory */
+                    &startup,             /* startup info, i.e. std handles */
+                    &pinfo);
+        }
+
+        dprintf("CreateProcess returned %d\n", ret);
+
+        if (!ret) {
+            display_error("Failed to execute tools\\android.bat:");
+            result = 1;
+        }
+    }
+
+    dprintf("Cleanup.\n");
+
+    return result;
+}
+
+int main(int argc, char **argv) {
+    _enable_dprintf = argc > 1 && strcmp(argv[1], "-v") == 0;
+    dprintf("Verbose debug mode.\n");
+
+    return sdk_launcher();
+}
+
+#endif /* _WIN32 */
