diff --git a/include/MainWindow.hpp b/include/MainWindow.hpp
index a5bdef0..6f356f4 100644
--- a/include/MainWindow.hpp
+++ b/include/MainWindow.hpp
@@ -24,13 +24,14 @@ protected:
     WORD GetQWERTYKeyCode(WORD wKeyCode);
     WORD GetRealKeyCode(WORD wQWERTYCode);
     virtual void PaintContent(PAINTSTRUCT *pps);
+    void OnReOpenMIDI();
 
     virtual HICON GetIcon();
     
     HWND m_volumeLabel, m_volumeBar;
     HWND m_forceLabel, m_forceBar;
     HWND m_instruLabel, m_instruSelect;
-    HWND m_saveCheck, m_saveLabel, m_saveFile, m_saveBrowse;
+    HWND m_saveCheck, m_saveLabel, m_saveFile, m_saveBrowse, m_reopen;
     int m_instrument, m_volume, m_force;
     HMIDIOUT m_midi;
     bool isQWERTY;
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index f47ba4e..2642a96 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -16,6 +16,7 @@
 #define KEYBOARD_SAVE       0xAB00
 #define KEYBOARD_SAVE_FILE  0xAB01
 #define KEYBOARD_BROWSE     0xAB02
+#define KEYBOARD_REOPEN     0xAB03
 #define MIDI_MESSAGE(handle, code, arg1, arg2) \
     midiOutShortMsg(handle, ((arg2 & 0x7F) << 16) |\
                     ((arg1 & 0x7F) << 8) | (code & 0xFF))
@@ -109,17 +110,20 @@ LRESULT MainWindow::OnCreate()
                     CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL, 0, 0, 0, 0,
             m_hwnd, (HMENU) KEYBOARD_INSTRUMENT, GetInstance(), NULL);
 
-    m_saveCheck = CreateWindow(WC_BUTTON, L"Save?", WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
+    m_saveCheck = CreateWindow(WC_BUTTON, L"&Save?", WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
             0, 0, 0, 0, m_hwnd, (HMENU) KEYBOARD_SAVE, GetInstance(), NULL);
     m_saveLabel = CreateWindow(WC_STATIC, L"File:",
             WS_CHILD | WS_VISIBLE | WS_DISABLED | SS_CENTERIMAGE, 0, 0, 0, 0,
             m_hwnd, NULL, GetInstance(), NULL);
     m_saveFile = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, NULL,
-            WS_CHILD | WS_VISIBLE | WS_DISABLED | ES_READONLY, 0, 0, 0, 0,
+            WS_CHILD | WS_VISIBLE | WS_DISABLED, 0, 0, 0, 0,
             m_hwnd, (HMENU) KEYBOARD_SAVE_FILE, GetInstance(), NULL);
-    m_saveBrowse = CreateWindow(WC_BUTTON, L"Browse...",
+    m_saveBrowse = CreateWindow(WC_BUTTON, L"&Browse...",
             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
             0, 0, 0, 0, m_hwnd, (HMENU) KEYBOARD_BROWSE, GetInstance(), NULL);
+    m_reopen = CreateWindow(WC_BUTTON, L"&Reopen",
+            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
+            0, 0, 0, 0, m_hwnd, (HMENU) KEYBOARD_REOPEN, GetInstance(), NULL);
     if (!m_saveLabel)
         MessageBox(m_hwnd, NULL, NULL, NULL);
 
@@ -158,6 +162,7 @@ LRESULT MainWindow::OnCreate()
     SETFONT(m_saveLabel);
     SETFONT(m_saveFile);
     SETFONT(m_saveBrowse);
+    SETFONT(m_reopen);
 #undef SETFONT
 
     if (midiOutOpen(&m_midi, 0, NULL, NULL, CALLBACK_NULL) != MMSYSERR_NOERROR)
@@ -233,6 +238,7 @@ LRESULT MainWindow::OnDestroy()
     DestroyWindow(m_saveLabel);
     DestroyWindow(m_saveFile);
     DestroyWindow(m_saveBrowse);
+    DestroyWindow(m_reopen);
     midiOutClose(m_midi);
     if (m_midifile)
         midiFileClose(m_midifile);
@@ -349,6 +355,32 @@ void MainWindow::PaintContent(PAINTSTRUCT *pps)
     SelectBrush(pps->hdc, hOldBrush);
 }
 
+void MainWindow::OnReOpenMIDI()
+{
+    char cpath[MAX_PATH * 2] = { 0 };
+    WCHAR path[MAX_PATH] = { 0 };
+
+    if (!GetDlgItemText(m_hwnd, KEYBOARD_SAVE_FILE, path, MAX_PATH))
+        return;
+
+    WideCharToMultiByte(CP_ACP, 0, path, -1, cpath, MAX_PATH * 2, NULL, NULL);
+    
+    if (m_midifile)
+        midiFileClose(m_midifile);
+    deltaTime = (DWORD) -1;
+    m_midifile = midiFileCreate(cpath, TRUE);
+    if (!m_midifile) {
+        MessageBox(m_hwnd, L"Can't open the file!\r\n\r\n"
+                           L"Check if another program is using it.",
+                   L"Error", MB_ICONERROR);
+        return;
+    }
+    midiSongAddTempo(m_midifile, 1, 150);
+    midiFileSetTracksDefaultChannel(m_midifile, 1, MIDI_CHANNEL_1);
+    midiTrackAddProgramChange(m_midifile, 1, m_instrument);
+    midiSongAddSimpleTimeSig(m_midifile, 1, 4, MIDI_NOTE_CROCHET);
+}
+
 LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     switch (uMsg) {
@@ -374,8 +406,9 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
         REPOS(m_volumeBar,      BOTTOM(82, client.bottom - 67, client.right - 94, 25));
         REPOS(m_saveCheck,      BOTTOM(22, client.bottom - 42, 50, 20));
         REPOS(m_saveLabel,      BOTTOM(27, client.bottom - 19, 30, 20));
-        REPOS(m_saveFile,       BOTTOM(62, client.bottom - 17, client.right - 164, 25));
-        REPOS(m_saveBrowse,     BOTTOMRIGHT(client.right - 17, client.bottom - 17, 80, 25));
+        REPOS(m_saveFile,       BOTTOM(62, client.bottom - 17, client.right - 249, 25));
+        REPOS(m_saveBrowse,     BOTTOMRIGHT(client.right - 102, client.bottom - 17, 80, 25));
+        REPOS(m_reopen,         BOTTOMRIGHT(client.right - 17, client.bottom - 17, 80, 25));
         EndDeferWindowPos(hdwp);
 #undef REPOS
         return 0;
@@ -399,13 +432,13 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
                     EnableWindow(m_saveLabel, checked);
                     EnableWindow(m_saveFile, checked);
                     EnableWindow(m_saveBrowse, checked);
+                    EnableWindow(m_reopen, Edit_GetTextLength(m_saveFile) > 0 ? checked : FALSE);
                     saving = checked == TRUE;
                     break;
                 }
                 case KEYBOARD_BROWSE: {
                     OPENFILENAME ofn = { sizeof(OPENFILENAME), 0 };
                     WCHAR path[MAX_PATH] = { 0 };
-                    char cpath[MAX_PATH * 2] = { 0 };
                     
                     ofn.hwndOwner = m_hwnd;
                     ofn.lpstrFilter = L"Standard MIDI Files (*.mid)\0*.mid\0All Files (*.*)\0*.*\0";
@@ -418,19 +451,20 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
                     if (!GetSaveFileName(&ofn))
                         break;
                     
-                    WideCharToMultiByte(CP_ACP, 0, path, -1, cpath, MAX_PATH * 2, NULL, NULL);
                     SetDlgItemText(m_hwnd, KEYBOARD_SAVE_FILE, path);
                     
-                    if (m_midifile)
-                        midiFileClose(m_midifile);
-                    m_midifile = midiFileCreate(cpath, TRUE);
-                    midiSongAddTempo(m_midifile, 1, 150);
-                    midiFileSetTracksDefaultChannel(m_midifile, 1, MIDI_CHANNEL_1);
-                    midiTrackAddProgramChange(m_midifile, 1, m_instrument);
-                    midiSongAddSimpleTimeSig(m_midifile, 1, 4, MIDI_NOTE_CROCHET);
+                    OnReOpenMIDI();
                     break;
                 }
+                case KEYBOARD_REOPEN:
+                    OnReOpenMIDI();
+                    break;
             }
+        case EN_CHANGE:
+            if (LOWORD(wParam) == KEYBOARD_SAVE_FILE &&
+                    IsDlgButtonChecked(m_hwnd, KEYBOARD_SAVE) &&
+                    Edit_GetTextLength(m_saveFile) > 0)
+                EnableWindow(m_reopen, TRUE);
         }
         break;
     case WM_HSCROLL: