diff --git a/find_java2/src/FindJava2Dlg.cpp b/find_java2/src/FindJava2Dlg.cpp
new file mode 100755
index 0000000..fbdd899
--- /dev/null
+++ b/find_java2/src/FindJava2Dlg.cpp
@@ -0,0 +1,268 @@
+/*
+* Copyright (C) 2014 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.
+*/
+
+
+#include "stdafx.h"
+#include "utils.h"
+#include "FindJava2Dlg.h"
+#include "afxdialogex.h"
+#include <atlpath.h>                            // ATL CPath
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+#define COL_PATH 1
+
+
+CFindJava2Dlg::CFindJava2Dlg(CWnd* pParent /*=NULL*/)
+    : CDialog(CFindJava2Dlg::IDD, pParent), mSelectedIndex(-1) {
+    m_hIcon = AfxGetApp()->LoadIcon(IDI_ANDROID_ICON);
+}
+
+void CFindJava2Dlg::DoDataExchange(CDataExchange* pDX) {
+    CDialog::DoDataExchange(pDX);
+    DDX_Control(pDX, IDC_PATH_LIST, mPathsListCtrl);
+    DDX_Control(pDX, IDOK, mOkButton);
+}
+
+BEGIN_MESSAGE_MAP(CFindJava2Dlg, CDialog)
+    ON_WM_PAINT()
+    ON_WM_QUERYDRAGICON()
+    ON_BN_CLICKED(IDC_BUTTON_ADD, &CFindJava2Dlg::OnBnClickedButtonAdd)
+    ON_NOTIFY(NM_CLICK, IDC_PATH_LIST, &CFindJava2Dlg::OnNMClickPathList)
+    ON_NOTIFY(LVN_ITEMCHANGED, IDC_PATH_LIST, &CFindJava2Dlg::OnLvnItemchangedPathList)
+END_MESSAGE_MAP()
+
+
+// -----
+// CFindJava2Dlg message handlers
+
+BOOL CFindJava2Dlg::OnInitDialog() {
+    CDialog::OnInitDialog();
+
+    SetWindowText(getAppName());
+
+    // Set the icon for this dialog.  The framework does this automatically
+    //  when the application's main window is not a dialog
+    SetIcon(m_hIcon, TRUE);			// Set big icon
+    SetIcon(m_hIcon, FALSE);		// Set small icon
+
+    // Initialize list controls
+    mPathsListCtrl.SetExtendedStyle(
+        mPathsListCtrl.GetExtendedStyle() |
+        LVS_EX_CHECKBOXES | 
+        LVS_EX_FULLROWSELECT | 
+        LVS_EX_GRIDLINES);
+
+    // We want 2 columns: Java version and path
+    mPathsListCtrl.InsertColumn(0, _T("Version"), LVCFMT_RIGHT, 60,  0);
+    mPathsListCtrl.InsertColumn(1, _T("Path"),     LVCFMT_LEFT, 386, 0);
+
+    mJavaFinder->findJavaPaths(&mPaths);
+    fillPathsList();
+    adjustButtons();
+
+    return TRUE;  // return TRUE  unless you set the focus to a control
+}
+
+// If you add a minimize button to your dialog, you will need the code below
+// to draw the icon.  For MFC applications using the document/view model,
+// this is automatically done for you by the framework.
+// [Note: MFC boilerplate, keep as-is]
+void CFindJava2Dlg::OnPaint() {
+    if (IsIconic()) {
+        CPaintDC dc(this); // device context for painting
+
+        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
+
+        // Center icon in client rectangle
+        int cxIcon = GetSystemMetrics(SM_CXICON);
+        int cyIcon = GetSystemMetrics(SM_CYICON);
+        CRect rect;
+        GetClientRect(&rect);
+        int x = (rect.Width() - cxIcon + 1) / 2;
+        int y = (rect.Height() - cyIcon + 1) / 2;
+
+        // Draw the icon
+        dc.DrawIcon(x, y, m_hIcon);
+    } else {
+        CDialog::OnPaint();
+    }
+}
+
+// The system calls this function to obtain the cursor to display while the user drags
+// the minimized window. [Note: MFC boilerplate, keep as-is]
+HCURSOR CFindJava2Dlg::OnQueryDragIcon() {
+    return static_cast<HCURSOR>(m_hIcon);
+}
+
+// Button add has been pressed; use file dialog and add path if it's a valid java.exe
+void CFindJava2Dlg::OnBnClickedButtonAdd() {
+    CFileDialog fileDlg(
+        TRUE,           // true=open dialog,  false=save-as dialog
+        _T("exe"),      // lpszDefExt 
+        _T("java.exe"), // lpszFileName 
+        OFN_FILEMUSTEXIST || OFN_PATHMUSTEXIST,
+        NULL,           // lpszFilter
+        this);          // pParentWnd
+
+    if (fileDlg.DoModal() == IDOK) {
+        CString path = fileDlg.GetPathName();
+
+        CJavaPath javaPath;
+        if (!mJavaFinder->checkJavaPath(path, &javaPath)) {
+            CString msg;
+            if (javaPath.mVersion > 0) {
+                msg.Format(_T("Insufficient Java Version found: expected %s, got %s"), 
+                           CJavaPath(mJavaFinder->getMinVersion(), CPath()).getVersion(),
+                           javaPath.getVersion());
+            } else {
+                msg.Format(_T("No valid Java Version found for %s"), path);
+            }
+            AfxMessageBox(msg, MB_OK);
+
+        } else {
+            if (mPaths.find(javaPath) == mPaths.end()) {
+                // Path isn't known yet so add it and refresh the list.
+                mPaths.insert(javaPath);
+                fillPathsList();
+            }
+
+            // Select item in list and set mSelectedIndex
+            selectPath(-1 /*index*/, &javaPath);
+        }
+    }
+}
+
+// An item in the list has been selected, select checkmark and set mSelectedIndex.
+void CFindJava2Dlg::OnNMClickPathList(NMHDR *pNMHDR, LRESULT *pResult) {
+    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+    int index = pNMItemActivate->iItem;
+    selectPath(index, nullptr);
+    *pResult = TRUE;
+}
+
+// An item in the list has changed, toggle checkmark as needed.
+void CFindJava2Dlg::OnLvnItemchangedPathList(NMHDR *pNMHDR, LRESULT *pResult) {
+    *pResult = FALSE;
+    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
+
+    if ((pNMLV->uChanged & LVIF_STATE) != 0) {
+        // Item's state has changed. Check the selection to see if it needs to be adjusted.
+        int index = pNMLV->iItem;
+
+        UINT oldState = pNMLV->uOldState;
+        UINT newState = pNMLV->uNewState;
+
+        if ((oldState & LVIS_STATEIMAGEMASK) != 0 || (newState & LVIS_STATEIMAGEMASK) != 0) {
+            // Checkbox uses the STATEIMAGE: 1 for unchecked, 2 for checked.
+            // Checkbox is checked when (old/new-state & state-image-mask) == INDEXTOSTATEIMAGEMASK(2).
+
+            bool oldChecked = (oldState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2);
+            bool newChecked = (newState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2);
+
+            if (oldChecked && !newChecked && index == mSelectedIndex) {
+                mSelectedIndex = -1;
+                adjustButtons();
+            } else if (!oldChecked && newChecked && index != mSelectedIndex) {
+                // Uncheck any checked rows if any
+                for (int n = mPathsListCtrl.GetItemCount() - 1; n >= 0; --n) {
+                    if (n != index && mPathsListCtrl.GetCheck(n)) {
+                        mPathsListCtrl.SetCheck(n, FALSE);
+                    }
+                }
+
+                mSelectedIndex = index;
+                adjustButtons();
+            }
+            // We handled this case, don't dispatch it further
+            *pResult = TRUE;
+        }
+    }
+}
+
+// -----
+
+const CJavaPath& CFindJava2Dlg::getSelectedPath() {
+    int i = 0;
+    for (const CJavaPath &p : mPaths) {
+        if (i == mSelectedIndex) {
+            return p;
+        }
+        ++i;
+    }
+
+    return CJavaPath::sEmpty;
+}
+
+
+void CFindJava2Dlg::fillPathsList() {
+    mPathsListCtrl.DeleteAllItems();
+    int index = 0;
+
+    for (const CJavaPath& pv : mPaths) {
+        mPathsListCtrl.InsertItem(index, pv.getVersion());        // column 0 = version
+        mPathsListCtrl.SetItemText(index, COL_PATH, pv.mPath);    // column 1 = path
+        mPathsListCtrl.SetCheck(index, mSelectedIndex == index);
+        ++index;
+    }
+}
+
+// Checks the given index if valid. Unchecks all other items.
+//
+// If index >= 0, it is used to select that item from the ListControl.
+// Otherwise if path != nullptr, it is used to find the item and select it.
+//
+// Side effect: in both cases, mSelectedIndex is set to the matching index or -1.
+//
+// If index is invalid and path isn't in the mPaths list, all items are unselected
+// so calling this with (0, nullptr) will clear the current selection.
+void CFindJava2Dlg::selectPath(int index, const CJavaPath *path) {
+
+    const CJavaPath *foundPath;
+    // If index is not defined, find the given path in the internal list.
+    // If path is not defined, find its index in the internal list.
+    int i = 0;
+    int n = mPathsListCtrl.GetItemCount();
+    for (const CJavaPath &p : mPaths) {
+        if (index < 0 && path != nullptr && p == *path) {
+            index = i;
+            foundPath = path;
+        } else if (index == i) {
+            foundPath = &p;
+        }
+
+        // uncheck any marked path
+        if (i != index && i < n && mPathsListCtrl.GetCheck(i)) {
+            mPathsListCtrl.SetCheck(i, FALSE);
+        }
+
+        ++i;
+    }
+
+    mSelectedIndex = index;
+    if (index >= 0 && index <= n) {
+        mPathsListCtrl.SetCheck(index, TRUE);
+    }
+
+    adjustButtons();
+}
+
+void CFindJava2Dlg::adjustButtons() {
+    int n = mPathsListCtrl.GetItemCount();
+    mOkButton.EnableWindow(mSelectedIndex >= 0 && mSelectedIndex < n);
+}
