diff --git a/src/main/cpp/ide/.dep.inc b/src/main/cpp/ide/.dep.inc
new file mode 100644
index 0000000..08c0aeb
--- /dev/null
+++ b/src/main/cpp/ide/.dep.inc
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+# This code depends on make tool being used
+DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES}))
+ifneq (${DEPFILES},)
+include ${DEPFILES}
+endif
diff --git a/src/main/cpp/ide/Makefile b/src/main/cpp/ide/Makefile
new file mode 100644
index 0000000..ff8bc92
--- /dev/null
+++ b/src/main/cpp/ide/Makefile
@@ -0,0 +1,106 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+
+#  Main targets can be executed directly, and they are:
+#  
+#     build                    build a specific configuration
+#     clean                    remove built files from a configuration
+#     clobber                  remove all built files
+#     all                      build all configurations
+#     help                     print help mesage
+#  
+#  Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
+#  .help-impl are implemented in nbproject/makefile-impl.mk.
+#
+# NOCDDL
+
+
+
+# Environment 
+MKDIR=mkdir
+CP=cp
+CCADMIN=CCadmin
+RANLIB=ranlib
+
+
+
+# build
+build: .build-post-$(CONF)
+
+.build-pre: .build-pre-$(CONF)
+# Add your pre 'build' code here...
+
+.build-pre-netbeans.exe: netbeans.rc
+	windres -DMANIFEST_FILE="netbeans.exe.manifest" -onetbeans.res -Ocoff netbeans.rc
+
+.build-pre-netbeans64.exe: netbeans.rc
+	x86_64-w64-mingw32-windres.exe -DMANIFEST_FILE="netbeans64.exe.manifest" -onetbeans64.res -Ocoff netbeans.rc
+
+.build-post-netbeans.exe: .build-impl
+	cp netbeans.exe ../../../nbbuild/netbeans/bin/netbeans.exe
+	
+.build-post-netbeans64.exe: .build-impl
+	cp netbeans64.exe ../../../nbbuild/netbeans/bin/netbeans64.exe
+
+											
+
+# clean
+clean: .clean-post
+
+.clean-pre:
+# Add your pre 'clean' code here...
+
+.clean-post: .clean-impl
+# Add your post 'clean' code here...
+
+
+
+# clobber
+clobber: .clobber-post
+
+.clobber-pre:
+# Add your pre 'clobber' code here...
+
+.clobber-post: .clobber-impl
+# Add your post 'clobber' code here...
+
+
+
+# all
+all: .all-post
+
+.all-pre:
+# Add your pre 'all' code here...
+
+.all-post: .all-impl
+# Add your post 'all' code here...
+
+
+
+# help
+help: .help-post
+
+.help-pre:
+# Add your pre 'help' code here...
+
+.help-post: .help-impl
+# Add your post 'help' code here...
+
+
+
+# include project implementation makefile
+include nbproject/Makefile-impl.mk
diff --git a/src/main/cpp/ide/Makefile.mingw b/src/main/cpp/ide/Makefile.mingw
new file mode 100644
index 0000000..791d71b
--- /dev/null
+++ b/src/main/cpp/ide/Makefile.mingw
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+
+all: netbeans64.exe netbeans.exe
+
+clean:
+	rm -f *.res *.exe
+
+netbeans64.res: netbeans.rc netbeans64.exe.manifest
+	x86_64-w64-mingw32-windres -onetbeans64.res -Ocoff -DMANIFEST_FILE=netbeans64.exe.manifest netbeans.rc
+
+netbeans64.exe: netbeans.cpp  nblauncher.cpp netbeans64.res ../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp
+	x86_64-w64-mingw32-gcc -s -DNBEXEC_DLL='"/lib/nbexec64.dll"' -DARCHITECTURE=64 -Wl,--nxcompat -Wl,--dynamicbase -Wl,--no-seh -mwindows netbeans.cpp nblauncher.cpp netbeans64.res ../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp -I ../../../platform/o.n.bootstrap/launcher/windows/ -onetbeans64.exe -static -lstdc++ -static-libstdc++ -static-libgcc
+
+netbeans.res: netbeans.rc netbeans.exe.manifest
+	i686-w64-mingw32-windres -onetbeans.res -Ocoff  -DMANIFEST_FILE=netbeans.exe.manifest netbeans.rc
+
+netbeans.exe: netbeans.cpp  nblauncher.cpp netbeans.res ../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp
+	i686-w64-mingw32-gcc -s -DNBEXEC_DLL='"/lib/nbexec.dll"' -DARCHITECTURE=32 -Wl,--nxcompat -Wl,--dynamicbase -Wl,--no-seh -mwindows netbeans.cpp nblauncher.cpp netbeans.res ../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp -I ../../../platform/o.n.bootstrap/launcher/windows/ -onetbeans.exe -static -lstdc++ -static-libstdc++ -static-libgcc
diff --git a/src/main/cpp/ide/cmdargs.h b/src/main/cpp/ide/cmdargs.h
new file mode 100644
index 0000000..acf56a4
--- /dev/null
+++ b/src/main/cpp/ide/cmdargs.h
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+ /*
+ * Author: Tomas Holy
+ */
+
+#ifndef _CMDARGS_H
+#define	_CMDARGS_H
+
+class CmdArgs {
+public:
+
+    CmdArgs(int _count) {
+        used = 0;
+        size = _count;
+        args = new char*[size];
+        memset(args, 0, size * sizeof (char*));
+    }
+
+    ~CmdArgs() {
+        if (args) {
+            for (int i = 0; i < size; i++) {
+                delete[] args[i];
+            }
+            delete[] args;
+        }
+    }
+
+    void add(const char *arg) {
+        if (used + 1 > size) {
+            int newSize = size + size / 2 + 1;
+            char **newArgs = new char*[newSize];
+            memcpy(newArgs, args, size * sizeof (char*));
+            memset(newArgs + size, 0, (newSize - size) * sizeof (char*));
+            delete[] args;
+            args = newArgs;
+            size = newSize;
+        }
+        args[used] = new char[strlen(arg) + 1];
+        strcpy(args[used++], arg);
+    }
+
+    void addCmdLine(const char *cmdLine) {
+        char arg[1024] = "";
+        bool inQuotes = false;
+        bool inText = false;
+        int i = 0;
+        int j = 0;
+        char c;
+        while (c = cmdLine[i]) {
+            if (inQuotes) {
+                if (c == '\"') {
+                    inQuotes = false;
+                } else {
+                    arg[j++] = c;
+                }
+            } else {
+                switch (c) {
+                    case '\"':
+                        inQuotes = true;
+                        inText = true;
+                        break;
+                    case ' ':
+                    case '\t':
+                    case '\n':
+                    case '\r':
+                        if (inText) {
+                            arg[j] = '\0';
+                            add(arg);
+                            j = 0;
+                        }
+                        inText = false;
+                        break;
+                    default:
+                        inText = true;
+                        arg[j++] = c;
+                        break;
+                }
+            }
+            i++;
+        }
+        if (j > 0) {
+            arg[j] = '\0';
+            add(arg);
+        }
+    }
+
+    int getCount() {
+        return used;
+    }
+
+    char **getArgs() {
+        return args;
+    }
+
+private:
+    int used;
+    int size;
+    char **args;
+};
+
+#endif	/* _CMDARGS_H */
+
diff --git a/src/main/cpp/ide/nblauncher.cpp b/src/main/cpp/ide/nblauncher.cpp
new file mode 100644
index 0000000..dda65af
--- /dev/null
+++ b/src/main/cpp/ide/nblauncher.cpp
@@ -0,0 +1,532 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+ /*
+ * Author: Tomas Holy
+ */
+
+#ifndef _WIN32_WINNT        
+#define _WIN32_WINNT 0x05010100
+#endif
+
+#include <shlobj.h>
+#include "nblauncher.h"
+#include "../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.h"
+#include "../../../platform/o.n.bootstrap/launcher/windows/argnames.h"
+#include "../../../platform/o.n.bootstrap/launcher/windows/nbexecloader.h"
+
+using namespace std;
+
+const char *NbLauncher::NBEXEC_FILE_PATH = NBEXEC_DLL;
+const char *NbLauncher::OPT_NB_DEFAULT_USER_DIR = "netbeans_default_userdir=";
+const char *NbLauncher::OPT_NB_DEFAULT_CACHE_DIR = "netbeans_default_cachedir=";
+const char *NbLauncher::OPT_NB_DEFAULT_OPTIONS = "netbeans_default_options=";
+const char *NbLauncher::OPT_NB_EXTRA_CLUSTERS = "netbeans_extraclusters=";
+const char *NbLauncher::OPT_NB_JDK_HOME = "netbeans_jdkhome=";
+const char *NbLauncher::ENV_USER_PROFILE = "USERPROFILE";
+const char *NbLauncher::HOME_TOKEN = "${HOME}";
+const char *NbLauncher::DEFAULT_USERDIR_ROOT_TOKEN = "${DEFAULT_USERDIR_ROOT}";
+const char *NbLauncher::DEFAULT_CACHEDIR_ROOT_TOKEN = "${DEFAULT_CACHEDIR_ROOT}";
+const char *NbLauncher::NETBEANS_DIRECTORY = "\\NetBeans\\";
+const char *NbLauncher::NETBEANS_CACHES_DIRECTORY = "\\NetBeans\\Cache\\";
+
+const char *NbLauncher::CON_ATTACH_MSG = 
+"\n\nThe launcher has determined that the parent process has a console and will reuse it for its own console output.\n"
+"Closing the console will result in termination of the running program.\n"
+"Use '--console suppress' to suppress console output.\n"
+"Use '--console new' to create a separate console window.\n";
+
+const char *NbLauncher::staticOptions[] = {
+    "-J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade",
+    "--branding",
+    "nb"
+};
+
+NbLauncher::NbLauncher() {
+}
+
+NbLauncher::NbLauncher(const NbLauncher& orig) {
+}
+
+NbLauncher::~NbLauncher() {
+}
+
+int NbLauncher::start(char *cmdLine) {
+    CmdArgs args(50);
+    args.addCmdLine(cmdLine);
+    return start(args.getCount(), args.getArgs());
+}
+
+int NbLauncher::start(int argc, char *argv[]) {
+    SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+    
+    DWORD parentProcID = 0;
+    if (!checkLoggingArg(argc, argv, true) || !setupProcess(argc, argv, parentProcID, CON_ATTACH_MSG) || !initBaseNames() || !readClusterFile()) {
+        return -1;
+    }
+
+    parseConfigFile((baseDir + "\\etc\\" + getAppName() + ".conf").c_str());
+
+    if (!parseArgs(argc, argv)) {
+        return -1;
+    }
+    string oldUserDir = userDir;
+    parseConfigFile((userDir + "\\etc\\" + getAppName() + ".conf").c_str());
+    userDir = oldUserDir;
+
+    addExtraClusters();
+    string nbexecPath;
+    SetDllDirectory(baseDir.c_str());
+    if (dirExists(platformDir.c_str())) {
+        nbexecPath = platformDir;
+    } else {
+        nbexecPath = baseDir + '\\' + platformDir;
+    }
+    if (!dirExists(nbexecPath.c_str())) {
+        logErr(false, true, "Could not find platform cluster:\n%s", nbexecPath.c_str());
+        return false;
+    }
+
+    CmdArgs newArgs(argc + 20);
+    addSpecificOptions(newArgs);
+    
+    if (!clusters.empty()) {
+        newArgs.add(ARG_NAME_CLUSTERS);
+        newArgs.add(clusters.c_str());
+    }
+    if (!userDir.empty()) {
+        newArgs.add(ARG_NAME_USER_DIR);
+        newArgs.add(userDir.c_str());
+    }
+    if (!defUserDirRoot.empty()) {
+        newArgs.add(ARG_DEFAULT_USER_DIR_ROOT);
+        newArgs.add(defUserDirRoot.c_str());
+    }
+    if (!cacheDir.empty() && !customUserDirFound) {
+        newArgs.add(ARG_NAME_CACHE_DIR);
+        newArgs.add(cacheDir.c_str());
+    }
+    if (!nbOptions.empty()) {
+        newArgs.addCmdLine(nbOptions.c_str());
+    }
+    for (int i = 0; i < argc; i++) {
+        newArgs.add(argv[i]);
+    }
+    if (!jdkHome.empty()) {
+        newArgs.add(ARG_NAME_JDKHOME);
+        newArgs.add(jdkHome.c_str());
+    }
+    if (parentProcID) {
+        newArgs.add(ARG_NAME_LA_PPID);
+        char tmp[16] = "";
+        newArgs.add(itoa(parentProcID, tmp, 10));
+    }
+    nbexecPath += NBEXEC_FILE_PATH;
+
+    const char *curDir = getCurrentDir();
+    if (curDir) {
+        char olddir[MAX_PATH];
+        DWORD rc = GetCurrentDirectory(MAX_PATH, olddir);
+        if (rc == 0) {
+            logErr(true, false, "Failed to get current directory");
+        } else {
+            string od = string(olddir);
+            od.insert(0, "-J-Dnetbeans.user.dir=");
+            newArgs.add(od.c_str());
+        }
+        logMsg("Changing current directory to: \"%s\"", curDir);
+        SetCurrentDirectory(curDir);
+    }
+
+    NBExecLoader loader;
+    return loader.start(nbexecPath.c_str(), newArgs.getCount(), newArgs.getArgs());
+}
+
+bool NbLauncher::initBaseNames() {
+    char path[MAX_PATH] = "";
+    getCurrentModulePath(path, MAX_PATH);
+    logMsg("Executable: %s", path);
+    char *bslash = strrchr(path, '\\');
+    if (!bslash) {
+        return false;
+    }
+    appName = bslash + 1;
+    appName.erase(appName.rfind('.'));
+    
+    if (ARCHITECTURE == 64) {
+        appName = appName.erase(appName.length() - 2);
+    }
+    
+    logMsg("Application name: %s", appName.c_str());
+
+    *bslash = '\0';
+    bslash = strrchr(path, '\\');
+    if (!bslash) {
+        return false;
+    }
+    *bslash = '\0';        
+
+    baseDir = path;
+    
+    //check baseDir for non-ASCII chars
+    for (size_t i = 0; i < baseDir.size(); ++i) {
+        if (!(baseDir[i]>=' ' && baseDir[i]<='~')) {
+            logErr(false, true, "Cannot be run from folder that contains non-ASCII characters in path.");
+            return false;
+        }
+    }
+    
+    logMsg("Base dir: %s", baseDir.c_str());
+    return true;
+}
+
+void NbLauncher::addCluster(const char *cluster) {
+
+    class SetCurDir {
+    public:
+        SetCurDir(const char *dir) {
+            oldCurDir[0] = '\0';
+            DWORD rc = GetCurrentDirectory(MAX_PATH, oldCurDir);
+            if (rc == 0) {
+                logErr(true, false, "Failed to get current directory");
+                return;
+            }
+            if (rc > MAX_PATH) {
+                logMsg("Failed to get current directory, buffer is too small.");
+                return;
+            }
+            if (!SetCurrentDirectory(dir)) {
+                logErr(true, true, "Failed to set current directory to \"%s\"", dir);
+                oldCurDir[0] = '\0';
+            }
+        }
+
+        ~SetCurDir() {
+            if (oldCurDir[0]) {
+                if (!SetCurrentDirectory(oldCurDir)) {
+                    logErr(true, true, "Failed to set current directory to \"%s\"", oldCurDir);
+                }
+            }
+        }
+    private:
+        char oldCurDir[MAX_PATH];
+    };
+
+    logMsg("addCluster: %s", cluster);
+    SetCurDir setCurDir(baseDir.c_str());
+    char clusterPath[MAX_PATH + 1] = {0};
+    strncpy(clusterPath, cluster, MAX_PATH);
+    if (!normalizePath(clusterPath, MAX_PATH)) {
+        logMsg("Invalid cluster path: %s", cluster);
+        return;
+    }
+    if (!clusters.empty()) {
+        clusters += ';';
+    }
+    logMsg("Adding cluster %s", clusterPath);
+    clusters += clusterPath;
+}
+
+void NbLauncher::addExtraClusters() {
+    logMsg("addExtraClusters()");
+    const char delim = ';';
+    string::size_type start = extraClusters.find_first_not_of(delim, 0);
+    string::size_type end = extraClusters.find_first_of(delim, start);
+    while (string::npos != end || string::npos != start) {
+        string cluster = extraClusters.substr(start, end - start);
+        addCluster(cluster.c_str());
+        start = extraClusters.find_first_not_of(delim, end);
+        end = extraClusters.find_first_of(delim, start);
+    }
+}
+
+bool NbLauncher::readClusterFile() {
+    clusters = "";
+    string clusterFile = baseDir + "\\etc\\" + getAppName() + ".clusters";
+    logMsg("readClusterFile() file: %s", clusterFile.c_str());
+
+    FILE* file = fopen(clusterFile.c_str(), "r");
+    if (!file) {
+        logErr(true, true, "Cannot open file \"%s\" for reading.", clusterFile.c_str());
+        return false;
+    }
+
+    char line[4096] = "";
+    while (fgets(line, sizeof(line), file)) {
+        char *str = skipWhitespaces(line);
+        if (*str == '#' || *str == '\0') {
+            continue;
+        }
+        char *pc = str;
+        while (*pc != '\0' && *pc != '\t' && *pc != '\n' && *pc != '\r') {
+            pc++;
+        }
+        *pc = '\0';
+
+        if (platformDir.empty()) {
+            char *slash = strrchr(str, '\\');
+            if (!slash) {
+                slash = strrchr(str, '/');
+            }
+            char *dir = slash ? slash + 1 : str;
+            if (strncmp(dir, "platform", strlen("platform")) == 0) {
+                platformDir = str;
+            } else {
+                addCluster(str);
+            }
+        } else {
+            addCluster(str);
+        }
+    }
+    bool ok = ferror(file) == 0;
+    if (!ok) {
+        logErr(true, true, "Error while reading file \"%s\".", clusterFile.c_str());
+    }
+    fclose(file);
+    return ok;
+}
+
+bool NbLauncher::parseArgs(int argc, char *argv[]) {
+#define CHECK_ARG \
+    if (i+1 == argc) {\
+        logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]);\
+        return false;\
+    }
+
+    logMsg("parseArgs():");
+    for (int i = 0; i < argc; i++) {
+        logMsg("\t%s", argv[i]);
+    }
+    customUserDirFound = 0;
+    for (int i = 0; i < argc; i++) {
+        if (strcmp(ARG_NAME_USER_DIR, argv[i]) == 0) {
+            CHECK_ARG;
+            char tmp[MAX_PATH + 1] = {0};
+            strncpy(tmp, argv[++i], MAX_PATH);
+            if (!normalizePath(tmp, MAX_PATH)) {
+                logErr(false, true, "User directory path \"%s\" is not valid.", argv[i]);
+                return false;
+            }
+            customUserDirFound = 1;
+            userDir = tmp;
+            logMsg("User dir: %s", userDir.c_str());
+        }
+        if (strcmp(ARG_NAME_CACHE_DIR, argv[i]) == 0) {
+            CHECK_ARG;
+            char tmp[MAX_PATH + 1] = {0};
+            strncpy(tmp, argv[++i], MAX_PATH);
+            if (!normalizePath(tmp, MAX_PATH)) {
+                logErr(false, true, "Cache directory path \"%s\" is not valid.", argv[i]);
+                return false;
+            }
+            cacheDir = tmp;
+            logMsg("Cache dir: %s", cacheDir.c_str());
+        }
+    }
+    logMsg("parseArgs() finished");
+    return true;
+}
+
+bool NbLauncher::findUserDir(const char *str) {
+    logMsg("NbLauncher::findUserDir()");    
+    if (strncmp(str, HOME_TOKEN, strlen(HOME_TOKEN)) == 0) {
+        if (userHome.empty()) {
+            char *userProfile = getenv(ENV_USER_PROFILE);
+            if (userProfile) {
+                userHome = userProfile;
+            } else {
+                TCHAR userHomeChar[MAX_PATH]; 
+                if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, userHomeChar))) {    
+                    return false;
+                }
+                userHome = userHomeChar;
+                userHome.erase(userHome.rfind('\\'));
+            }
+            logMsg("User home: %s", userHome.c_str());
+        }
+        userDir = userHome + (str + strlen(HOME_TOKEN));
+    } else if (strncmp(str, DEFAULT_USERDIR_ROOT_TOKEN, strlen(DEFAULT_USERDIR_ROOT_TOKEN)) == 0) {       
+        std::string s = std::string("Replacing ") + DEFAULT_USERDIR_ROOT_TOKEN;
+        logMsg(s.c_str());
+        userDir = getDefaultUserDirRoot() + (str + strlen(DEFAULT_USERDIR_ROOT_TOKEN));
+    } else {
+        getDefaultUserDirRoot();
+        userDir = str;
+    }
+    return true;
+}
+
+bool NbLauncher::findCacheDir(const char *str) {
+    logMsg("NbLauncher::findCacheDir()");
+    if (strncmp(str, HOME_TOKEN, strlen(HOME_TOKEN)) == 0) {
+        if (userHome.empty()) {
+            char *userProfile = getenv(ENV_USER_PROFILE);
+            if (userProfile) {
+                userHome = userProfile;
+            } else {
+                TCHAR userHomeChar[MAX_PATH]; 
+                if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, userHomeChar))) {    
+                    return false;
+                }
+                userHome = userHomeChar;
+                userHome.erase(userHome.rfind('\\'));
+            }
+            logMsg("User home: %s", userHome.c_str());
+        }
+        cacheDir = userHome + (str + strlen(HOME_TOKEN));
+    } else if (strncmp(str, DEFAULT_CACHEDIR_ROOT_TOKEN, strlen(DEFAULT_CACHEDIR_ROOT_TOKEN)) == 0) {   
+        std::string s = std::string("Replacing ") + DEFAULT_CACHEDIR_ROOT_TOKEN;
+        logMsg(s.c_str());
+        cacheDir = getDefaultCacheDirRoot() + (str + strlen(DEFAULT_CACHEDIR_ROOT_TOKEN));
+    } else {
+        getDefaultCacheDirRoot();
+        cacheDir = str;
+    }
+    return true;
+}
+
+string NbLauncher::getDefaultUserDirRoot() {
+    TCHAR defUserDirRootChar[MAX_PATH];
+    if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, defUserDirRootChar))) {
+        return std::string();
+    }
+    defUserDirRoot = constructApplicationDir((string) defUserDirRootChar, false);
+    defUserDirRoot.erase(defUserDirRoot.rfind('\\'));
+    logMsg("Default Userdir Root: %s", defUserDirRoot.c_str());
+    return defUserDirRoot;
+}
+
+string NbLauncher::getDefaultCacheDirRoot() {
+    TCHAR defCacheDirRootChar[MAX_PATH];
+    if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, defCacheDirRootChar))) {
+        return std::string();
+    }
+    defCacheDirRoot = constructApplicationDir((string) defCacheDirRootChar, true);
+    defCacheDirRoot.erase(defCacheDirRoot.rfind('\\'));
+    logMsg("Default Cachedir Root: %s", defCacheDirRoot.c_str());
+    return defCacheDirRoot;
+}
+
+bool NbLauncher::getOption(char *&str, const char *opt) {
+    if (strncmp(str, opt, strlen(opt)) == 0) {
+        str += strlen(opt);
+        char *end = trimWhitespaces(str);
+        if (*str == '"') {
+            str++;
+        }
+        if (end >= str && *end == '"') {
+            *end = '\0';
+        }
+        logMsg("Option found: %s%s", opt, str);
+        return true;
+    }
+    return false;
+}
+
+bool NbLauncher::parseConfigFile(const char* path) {
+    logMsg("parseConfigFile(%s)", path);
+    FILE *file = fopen(path, "r");
+    if (!file) {
+        logErr(true, false, "Cannot open file \"%s\" for reading.", path);
+        return false;
+    }
+    
+    char line[4096] = "";
+    while (fgets(line, sizeof(line), file)) {
+        char *str = skipWhitespaces(line);
+        if (*str == '#') {
+            continue;
+        }
+        if (getOption(str, getDefUserDirOptName())) {
+             findUserDir(str);
+             logMsg("User dir: %s", userDir.c_str());
+        } else if (getOption(str, getDefCacheDirOptName())) {
+             findCacheDir(str);
+             logMsg("Cache dir: %s", cacheDir.c_str());
+        } else if (getOption(str, getDefOptionsOptName())) {
+            // replace \" by "
+            int len = strlen(str);
+            int k = 0;
+            for (int i = 0; i < len; i++) {
+                if (str[i] == '\\' && str[i+1] == '\"') {
+                    continue;
+                }
+                str[k++] = str[i];
+            }
+            str[k] = '\0';
+            nbOptions = str;
+            logMsg("After replacement: %s", nbOptions.c_str());
+
+        } else if (getOption(str, getExtraClustersOptName())) {
+            extraClusters = str;
+        } else if (getOption(str, getJdkHomeOptName())) {
+            jdkHome = str;
+        }
+    }
+    bool ok = ferror(file) == 0;
+    if (!ok) {
+        logErr(true, false, "Error while reading file \"%s\".", path);
+    }
+    fclose(file);
+    return true;
+}
+
+typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
+
+const char * NbLauncher::getAppName() {
+    return "netbeans";
+}
+
+void NbLauncher::addSpecificOptions(CmdArgs &args) {
+    for (unsigned i = 0; i < sizeof (staticOptions) / sizeof (char*); i++) {
+        args.add(staticOptions[i]);
+    }
+}
+
+const char * NbLauncher::getDefUserDirOptName() {
+    return OPT_NB_DEFAULT_USER_DIR;
+}
+
+const char * NbLauncher::getDefCacheDirOptName() {
+    return OPT_NB_DEFAULT_CACHE_DIR;
+}
+
+
+const char * NbLauncher::getDefOptionsOptName() {
+    return OPT_NB_DEFAULT_OPTIONS;
+}
+
+const char * NbLauncher::getExtraClustersOptName() {
+    return OPT_NB_EXTRA_CLUSTERS;
+}
+
+const char * NbLauncher::getJdkHomeOptName() {
+    return OPT_NB_JDK_HOME;
+}
+
+const char * NbLauncher::getCurrentDir() {
+    return 0;
+}
+
+std::string NbLauncher::constructApplicationDir(const std::string& dir, bool cache) {
+   if (cache) {
+       return dir + NETBEANS_CACHES_DIRECTORY;
+   } else {
+       return dir + NETBEANS_DIRECTORY;
+   }
+}
diff --git a/src/main/cpp/ide/nblauncher.h b/src/main/cpp/ide/nblauncher.h
new file mode 100644
index 0000000..469a21f
--- /dev/null
+++ b/src/main/cpp/ide/nblauncher.h
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+ /*
+ * Author: Tomas Holy
+ */
+
+#ifndef _NBLAUNCHER_H
+#define	_NBLAUNCHER_H
+
+#include <string>
+#include <windows.h>
+#include <cstddef>
+#include "cmdargs.h"
+
+class NbLauncher {
+protected:
+    static const char *NBEXEC_FILE_PATH;
+    static const char *OPT_NB_DEFAULT_USER_DIR;
+    static const char *OPT_NB_DEFAULT_CACHE_DIR;
+    static const char *OPT_NB_DEFAULT_OPTIONS;
+    static const char *OPT_NB_EXTRA_CLUSTERS;
+    static const char *OPT_NB_JDK_HOME;
+    static const char *REG_SHELL_FOLDERS_KEY;
+    static const char *HOME_TOKEN;
+    static const char *DEFAULT_USERDIR_ROOT_TOKEN;
+    static const char *DEFAULT_CACHEDIR_ROOT_TOKEN;
+    static const char *CON_ATTACH_MSG;
+    static const char *NETBEANS_DIRECTORY;
+    static const char *NETBEANS_CACHES_DIRECTORY;
+
+private:
+    static const char *ENV_USER_PROFILE;
+    static const char *REG_DESKTOP_NAME;
+    static const char *REG_DEFAULT_USERDIR_ROOT;
+    static const char *REG_DEFAULT_CACHEDIR_ROOT;
+    static const char* staticOptions[];
+
+    typedef int (*StartPlatform)(int argc, char *argv[]);
+
+public:
+    NbLauncher();
+    virtual ~NbLauncher();
+
+    int start(int argc, char *argv[]);
+    int start(char *cmdLine);
+
+protected:
+    virtual bool initBaseNames();
+    virtual void addSpecificOptions(CmdArgs &args);
+    virtual bool findUserDir(const char *str);
+    virtual bool findCacheDir(const char *str);
+    virtual const char * getAppName();
+    virtual const char * getDefUserDirOptName();
+    virtual const char * getDefCacheDirOptName();
+    virtual const char * getDefOptionsOptName();
+    virtual const char * getExtraClustersOptName();
+    virtual const char * getJdkHomeOptName();
+    virtual const char * getCurrentDir();
+    virtual std::string constructApplicationDir(const std::string& dir, bool cache);
+
+private:
+    NbLauncher(const NbLauncher& orig);
+    bool readClusterFile();
+    bool parseArgs(int argc, char *argv[]);
+    bool parseConfigFile(const char* path);    
+    bool getOption(char *&str, const char *opt);
+    void addCluster(const char *cl);
+    void addExtraClusters();
+    std::string getDefaultUserDirRoot();
+    std::string getDefaultCacheDirRoot();
+
+protected:
+    std::string baseDir;
+    std::string appName;
+    std::string platformDir;
+    std::string userHome;
+    std::string userDir;
+    std::string cacheDir;
+    std::string defUserDirRoot;
+    std::string defCacheDirRoot;
+    std::string clusters;
+    std::string extraClusters;
+    std::string nbOptions;
+    std::string jdkHome;
+    
+private:
+    bool customUserDirFound;
+};
+
+#endif	/* _NBLAUNCHER_H */
+
diff --git a/src/main/cpp/ide/nbproject/configurations.xml b/src/main/cpp/ide/nbproject/configurations.xml
new file mode 100644
index 0000000..9e0bf6a
--- /dev/null
+++ b/src/main/cpp/ide/nbproject/configurations.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+
+-->
+<configurationDescriptor version="100">
+  <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
+    <logicalFolder name="HeaderFiles"
+                   displayName="Header Files"
+                   projectFiles="true">
+      <itemPath>cmdargs.h</itemPath>
+      <itemPath>nblauncher.h</itemPath>
+      <itemPath>../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.h</itemPath>
+      <itemPath>version.h</itemPath>
+    </logicalFolder>
+    <logicalFolder name="ResourceFiles"
+                   displayName="Resource Files"
+                   projectFiles="true">
+      <itemPath>netbeans.exe.manifest</itemPath>
+      <itemPath>netbeans.rc</itemPath>
+      <itemPath>netbeans64.exe.manifest</itemPath>
+      <itemPath>version.rc</itemPath>
+    </logicalFolder>
+    <logicalFolder name="SourceFiles"
+                   displayName="Source Files"
+                   projectFiles="true">
+      <itemPath>nblauncher.cpp</itemPath>
+      <itemPath>netbeans.cpp</itemPath>
+      <itemPath>../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp</itemPath>
+    </logicalFolder>
+    <logicalFolder name="ExternalFiles"
+                   displayName="Important Files"
+                   projectFiles="false">
+      <itemPath>Makefile</itemPath>
+    </logicalFolder>
+  </logicalFolder>
+  <projectmakefile>Makefile</projectmakefile>
+  <confs>
+    <conf name="netbeans.exe" type="1">
+      <toolsSet>
+        <compilerSet>Cygwin|Cygwin</compilerSet>
+        <dependencyChecking>true</dependencyChecking>
+        <rebuildPropChanged>false</rebuildPropChanged>
+      </toolsSet>
+      <compileType>
+        <ccTool>
+          <developmentMode>5</developmentMode>
+          <stripSymbols>true</stripSymbols>
+          <architecture>1</architecture>
+          <commandLine>-mno-cygwin</commandLine>
+          <preprocessorList>
+            <Elem>ARCHITECTURE=32</Elem>
+            <Elem>NBEXEC_DLL="/lib/nbexec.dll"</Elem>
+          </preprocessorList>
+        </ccTool>
+        <linkerTool>
+          <output>netbeans.exe</output>
+          <linkerLibItems>
+            <linkerOptionItem>netbeans.res</linkerOptionItem>
+          </linkerLibItems>
+          <commandLine>-mwindows -Wl,--nxcompat -Wl,--dynamicbase -Wl,--no-seh</commandLine>
+        </linkerTool>
+      </compileType>
+      <item path="../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp"
+            ex="false"
+            tool="1"
+            flavor2="0">
+      </item>
+      <item path="../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.h"
+            ex="false"
+            tool="3"
+            flavor2="0">
+      </item>
+      <item path="cmdargs.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="nblauncher.cpp" ex="false" tool="1" flavor2="0">
+      </item>
+      <item path="nblauncher.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans.cpp" ex="false" tool="1" flavor2="0">
+      </item>
+      <item path="netbeans.exe.manifest" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans.rc" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans64.exe.manifest" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="version.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="version.rc" ex="false" tool="3" flavor2="0">
+      </item>
+    </conf>
+    <conf name="netbeans64.exe" type="1">
+      <toolsSet>
+        <compilerSet>Cygwin64|Cygwin</compilerSet>
+        <dependencyChecking>true</dependencyChecking>
+        <rebuildPropChanged>false</rebuildPropChanged>
+      </toolsSet>
+      <compileType>
+        <ccTool>
+          <developmentMode>5</developmentMode>
+          <stripSymbols>true</stripSymbols>
+          <architecture>2</architecture>
+          <commandLine>-mno-cygwin -static-libgcc -static-libstdc++</commandLine>
+          <preprocessorList>
+            <Elem>ARCHITECTURE=64</Elem>
+            <Elem>NBEXEC_DLL="/lib/nbexec64.dll"</Elem>
+          </preprocessorList>
+        </ccTool>
+        <linkerTool>
+          <output>netbeans64.exe</output>
+          <linkerLibItems>
+            <linkerOptionItem>netbeans64.res</linkerOptionItem>
+          </linkerLibItems>
+          <commandLine>-mwindows -Wl,--nxcompat -Wl,--dynamicbase</commandLine>
+        </linkerTool>
+      </compileType>
+      <item path="../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.cpp"
+            ex="false"
+            tool="1"
+            flavor2="0">
+      </item>
+      <item path="../../../platform/o.n.bootstrap/launcher/windows/utilsfuncs.h"
+            ex="false"
+            tool="3"
+            flavor2="0">
+      </item>
+      <item path="cmdargs.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="nblauncher.cpp" ex="false" tool="1" flavor2="0">
+      </item>
+      <item path="nblauncher.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans.cpp" ex="false" tool="1" flavor2="0">
+      </item>
+      <item path="netbeans.exe.manifest" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans.rc" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="netbeans64.exe.manifest" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="version.h" ex="false" tool="3" flavor2="0">
+      </item>
+      <item path="version.rc" ex="false" tool="3" flavor2="0">
+      </item>
+    </conf>
+  </confs>
+</configurationDescriptor>
diff --git a/src/main/cpp/ide/nbproject/project.properties b/src/main/cpp/ide/nbproject/project.properties
new file mode 100644
index 0000000..2456923
--- /dev/null
+++ b/src/main/cpp/ide/nbproject/project.properties
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+
diff --git a/src/main/cpp/ide/nbproject/project.xml b/src/main/cpp/ide/nbproject/project.xml
new file mode 100644
index 0000000..2a78a99
--- /dev/null
+++ b/src/main/cpp/ide/nbproject/project.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.cnd.makeproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/make-project/1">
+            <name>NB Launcher Win</name>
+            <make-project-type>0</make-project-type>
+            <c-extensions/>
+            <cpp-extensions>cpp</cpp-extensions>
+            <header-extensions>h</header-extensions>
+            <sourceEncoding>UTF-8</sourceEncoding>
+            <make-dep-projects/>
+            <sourceRootList/>
+            <confList>
+                <confElem>
+                    <name>netbeans.exe</name>
+                    <type>1</type>
+                </confElem>
+                <confElem>
+                    <name>netbeans64.exe</name>
+                    <type>1</type>
+                </confElem>
+            </confList>
+            <formatting>
+                <project-formatting-style>false</project-formatting-style>
+            </formatting>
+        </data>
+    </configuration>
+</project>
diff --git a/src/main/cpp/ide/netbeans.cpp b/src/main/cpp/ide/netbeans.cpp
new file mode 100644
index 0000000..c14972f
--- /dev/null
+++ b/src/main/cpp/ide/netbeans.cpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+ /*
+ * Author: Tomas Holy
+ */
+
+
+#include "nblauncher.h"
+
+int main(int argc, char *argv[]) {
+    NbLauncher launcher;
+    return launcher.start(argc - 1, argv + 1);
+}
diff --git a/src/main/cpp/ide/netbeans.exe.manifest b/src/main/cpp/ide/netbeans.exe.manifest
new file mode 100644
index 0000000..71b1164
--- /dev/null
+++ b/src/main/cpp/ide/netbeans.exe.manifest
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+
+-->
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity version="9.0.0.0"
+   processorArchitecture="x86"
+   name="netbeans.exe"
+   type="win32"/>
+
+<description>NetBeans IDE process</description>
+<dependency>
+  <dependentAssembly>
+    <assemblyIdentity
+      type="win32"
+      name="Microsoft.Windows.Common-Controls"
+      version="6.0.0.0"
+      processorArchitecture="*"
+      publicKeyToken="6595b64144ccf1df"
+      language="*"
+    />
+  </dependentAssembly>
+</dependency>
+<!-- Identify the application security requirements. -->
+<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+  <security>
+    <requestedPrivileges>
+      <requestedExecutionLevel
+        level="asInvoker"
+        uiAccess="false"/>
+      </requestedPrivileges>
+     </security>
+</trustInfo>
+<!-- NETBEANS-1227: Indicate the same HiDPI capabilities as javaw.exe from JDK 11. -->
+<!-- Note that even 32-bit Java 10.0.2 indicates HiDPI-awareness, so it should
+     be fine to include it here as well. -->
+<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+  <asmv3:windowsSettings xmlns:dpi1="http://schemas.microsoft.com/SMI/2005/WindowsSettings" xmlns:dpi2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
+    <dpi1:dpiAware>true/PM</dpi1:dpiAware>
+    <dpi2:dpiAwareness>PerMonitorV2, PerMonitor, system</dpi2:dpiAwareness>
+  </asmv3:windowsSettings>
+</asmv3:application>
+<!-- List of explicitly supported Windows versions. This is the list from
+     javaw.exe on JDK 8.0.172, which is the same as that of JDK 11ea. -->
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+  </application>
+</compatibility>
+</assembly>
diff --git a/src/main/cpp/ide/netbeans.ico b/src/main/cpp/ide/netbeans.ico
new file mode 100644
index 0000000..ec123c0
--- /dev/null
+++ b/src/main/cpp/ide/netbeans.ico
Binary files differ
diff --git a/src/main/cpp/ide/netbeans.rc b/src/main/cpp/ide/netbeans.rc
new file mode 100644
index 0000000..348a320
--- /dev/null
+++ b/src/main/cpp/ide/netbeans.rc
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#include <winuser.h>
+
+#include "version.rc"
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+
+100 ICON "netbeans.ico"
+
+// Value MANIFEST_FILE id taken from windres parameter -DMANIFEST_FILE
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST MANIFEST_FILE
+
diff --git a/src/main/cpp/ide/netbeans64.exe.manifest b/src/main/cpp/ide/netbeans64.exe.manifest
new file mode 100644
index 0000000..3f7dc6e
--- /dev/null
+++ b/src/main/cpp/ide/netbeans64.exe.manifest
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+
+-->
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<!-- Use processorArchitecture="x86", which is the value used by the 64-bit
+     javaw.exe on Java 10.0.2 and Java 11ea. -->
+<assemblyIdentity version="9.0.0.0"
+   processorArchitecture="x86"
+   name="netbeans64.exe"
+   type="win32"/>
+
+<description>NetBeans IDE process</description>
+<dependency>
+  <dependentAssembly>
+    <assemblyIdentity
+      type="win32"
+      name="Microsoft.Windows.Common-Controls"
+      version="6.0.0.0"
+      processorArchitecture="*"
+      publicKeyToken="6595b64144ccf1df"
+      language="*"
+    />
+  </dependentAssembly>
+</dependency>
+<!-- Identify the application security requirements. -->
+<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+  <security>
+    <requestedPrivileges>
+      <requestedExecutionLevel
+        level="asInvoker"
+        uiAccess="false"/>
+      </requestedPrivileges>
+     </security>
+</trustInfo>
+<!-- NETBEANS-1227: Indicate the same HiDPI capabilities as javaw.exe from JDK 11. -->
+<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+  <asmv3:windowsSettings xmlns:dpi1="http://schemas.microsoft.com/SMI/2005/WindowsSettings" xmlns:dpi2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
+    <dpi1:dpiAware>true/PM</dpi1:dpiAware>
+    <dpi2:dpiAwareness>PerMonitorV2, PerMonitor, system</dpi2:dpiAwareness>
+  </asmv3:windowsSettings>
+</asmv3:application>
+<!-- List of explicitly supported Windows versions. This is the list from
+     javaw.exe on JDK 8.0.172, which is the same as that of JDK 11ea. -->
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+  </application>
+</compatibility>
+</assembly>
diff --git a/src/main/cpp/ide/version.h b/src/main/cpp/ide/version.h
new file mode 100644
index 0000000..3d8adef
--- /dev/null
+++ b/src/main/cpp/ide/version.h
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#define COMPANY ""
+#define COMPONENT "NetBeans IDE"
+#define VER "9.0.0.0"
+#define FVER 9,0,0,0
+#define BUILD_ID "03062018"
+#define INTERNAL_NAME "netbeans"
+#define COPYRIGHT "Based on Apache NetBeans from the Apache Software Foundation and is licensed under Apache License Version 2.0"
+#define NAME "NetBeans IDE 9.0"
+
diff --git a/src/main/cpp/ide/version.rc b/src/main/cpp/ide/version.rc
new file mode 100644
index 0000000..0bb79bf
--- /dev/null
+++ b/src/main/cpp/ide/version.rc
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#include <winuser.h>
+#include <winver.h>
+#include "version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    FVER
+ PRODUCTVERSION FVER
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ // FILEOS 0x4 is Win32, 0x40004 is Win32 NT only
+ FILEOS 0x4L
+ // FILETYPE should be 0x1 for .exe and 0x2 for .dll
+ FILETYPE 0x1
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "000004b0"
+        BEGIN
+            VALUE "CompanyName",      COMPANY       "\0"
+            VALUE "FileDescription",  COMPONENT     "\0"
+            VALUE "FileVersion",      VER           "\0"
+            VALUE "Full Version",     BUILD_ID      "\0"
+            VALUE "InternalName",     INTERNAL_NAME "\0"
+            VALUE "LegalCopyright",   COPYRIGHT     "\0"
+            VALUE "ProductName",      NAME          "\0"
+            VALUE "ProductVersion",   VER           "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0, 1200
+    END
+END
