diff --git a/src/GvimExt/gvimext.cpp b/src/GvimExt/gvimext.cpp
index 24ad941..e56379c 100644
--- a/src/GvimExt/gvimext.cpp
+++ b/src/GvimExt/gvimext.cpp
@@ -35,6 +35,15 @@
  * enough */
 #define BUFSIZE 1100
 
+// The "Edit with Vim" shell extension provides these choices when
+// a new instance of Gvim is selected:
+//   - use tabpages
+//   - enable diff mode
+//   - none of the above
+#define EDIT_WITH_VIM_USE_TABPAGES (2)
+#define EDIT_WITH_VIM_IN_DIFF_MODE (1)
+#define EDIT_WITH_VIM_NO_OPTIONS   (0)
+
 //
 // Get the name of the Gvim executable to use, with the path.
 // When "runtime" is non-zero, we were called to find the runtime directory.
@@ -613,7 +622,7 @@
     if (cbFiles > 1)
     {
 	mii.wID = idCmd++;
-	mii.dwTypeData = _("Edit with &multiple Vims");
+	mii.dwTypeData = _("Edit with Vim using &tabpages");
 	mii.cch = lstrlen(mii.dwTypeData);
 	InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
 
@@ -726,6 +735,7 @@
 STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
 {
     HRESULT hr = E_INVALIDARG;
+    int gvimExtraOptions;
 
     // If HIWORD(lpcmi->lpVerb) then we have been called programmatically
     // and lpVerb is a command that should be invoked.  Otherwise, the shell
@@ -750,29 +760,28 @@
 	    switch (idCmd)
 	    {
 		case 0:
-		    hr = InvokeGvim(lpcmi->hwnd,
-			    lpcmi->lpDirectory,
-			    lpcmi->lpVerb,
-			    lpcmi->lpParameters,
-			    lpcmi->nShow);
+		    gvimExtraOptions = EDIT_WITH_VIM_USE_TABPAGES;
 		    break;
 		case 1:
-		    hr = InvokeSingleGvim(lpcmi->hwnd,
-			    lpcmi->lpDirectory,
-			    lpcmi->lpVerb,
-			    lpcmi->lpParameters,
-			    lpcmi->nShow,
-			    0);
+		    gvimExtraOptions = EDIT_WITH_VIM_NO_OPTIONS;
 		    break;
 		case 2:
-		    hr = InvokeSingleGvim(lpcmi->hwnd,
-			    lpcmi->lpDirectory,
-			    lpcmi->lpVerb,
-			    lpcmi->lpParameters,
-			    lpcmi->nShow,
-			    1);
+		    gvimExtraOptions = EDIT_WITH_VIM_IN_DIFF_MODE;
 		    break;
+		default:
+		    // If execution reaches this point we likely have an
+		    // inconsistency between the code that setup the menus
+		    // and this code that determines what the user
+		    // selected.  This should be detected and fixed during 
+		    // development.
+		    return E_FAIL;
 	    }
+	    hr = InvokeSingleGvim(lpcmi->hwnd,
+		    lpcmi->lpDirectory,
+		    lpcmi->lpVerb,
+		    lpcmi->lpParameters,
+		    lpcmi->nShow,
+		    gvimExtraOptions);
 	}
     }
     return hr;
@@ -873,82 +882,13 @@
     return (char *)"";
 }
 
-STDMETHODIMP CShellExt::InvokeGvim(HWND hParent,
-				   LPCSTR  /* pszWorkingDir */,
-				   LPCSTR  /* pszCmd */,
-				   LPCSTR  /* pszParam */,
-				   int  /* iShowCmd */)
-{
-    wchar_t m_szFileUserClickedOn[BUFSIZE];
-    wchar_t cmdStrW[BUFSIZE];
-    UINT i;
-
-    for (i = 0; i < cbFiles; i++)
-    {
-	DragQueryFileW((HDROP)medium.hGlobal,
-		i,
-		m_szFileUserClickedOn,
-		sizeof(m_szFileUserClickedOn));
-
-	getGvimInvocationW(cmdStrW);
-	wcscat(cmdStrW, L" \"");
-
-	if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) < BUFSIZE)
-	{
-	    wcscat(cmdStrW, m_szFileUserClickedOn);
-	    wcscat(cmdStrW, L"\"");
-
-	    STARTUPINFOW si;
-	    PROCESS_INFORMATION pi;
-
-	    ZeroMemory(&si, sizeof(si));
-	    si.cb = sizeof(si);
-
-	    // Start the child process.
-	    if (!CreateProcessW(NULL,	// No module name (use command line).
-			cmdStrW,	// Command line.
-			NULL,		// Process handle not inheritable.
-			NULL,		// Thread handle not inheritable.
-			FALSE,		// Set handle inheritance to FALSE.
-			0,		// No creation flags.
-			NULL,		// Use parent's environment block.
-			NULL,		// Use parent's starting directory.
-			&si,		// Pointer to STARTUPINFO structure.
-			&pi)		// Pointer to PROCESS_INFORMATION structure.
-	       )
-	    {
-		MessageBox(
-		    hParent,
-		    _("Error creating process: Check if gvim is in your path!"),
-		    _("gvimext.dll error"),
-		    MB_OK);
-	    }
-	    else
-	    {
-		CloseHandle( pi.hProcess );
-		CloseHandle( pi.hThread );
-	    }
-	}
-	else
-	{
-	    MessageBox(
-		hParent,
-		_("Path length too long!"),
-		_("gvimext.dll error"),
-		MB_OK);
-	}
-    }
-
-    return NOERROR;
-}
-
 
 STDMETHODIMP CShellExt::InvokeSingleGvim(HWND hParent,
 				   LPCSTR  /* pszWorkingDir */,
 				   LPCSTR  /* pszCmd */,
 				   LPCSTR  /* pszParam */,
 				   int  /* iShowCmd */,
-				   int useDiff)
+				   int gvimExtraOptions)
 {
     wchar_t	m_szFileUserClickedOn[BUFSIZE];
     wchar_t	*cmdStrW;
@@ -962,8 +902,10 @@
 	return E_FAIL;
     getGvimInvocationW(cmdStrW);
 
-    if (useDiff)
+    if (gvimExtraOptions == EDIT_WITH_VIM_IN_DIFF_MODE)
 	wcscat(cmdStrW, L" -d");
+    else if (gvimExtraOptions == EDIT_WITH_VIM_USE_TABPAGES)
+	wcscat(cmdStrW, L" -p");
     for (i = 0; i < cbFiles; i++)
     {
 	DragQueryFileW((HDROP)medium.hGlobal,
diff --git a/src/GvimExt/gvimext.h b/src/GvimExt/gvimext.h
index e43e75f..3ad797e 100644
--- a/src/GvimExt/gvimext.h
+++ b/src/GvimExt/gvimext.h
@@ -129,18 +129,12 @@
 	    int iShowCmd,
 	    int idHWnd);
 
-    STDMETHODIMP InvokeGvim(HWND hParent,
-	    LPCSTR pszWorkingDir,
-	    LPCSTR pszCmd,
-	    LPCSTR pszParam,
-	    int iShowCmd);
-
     STDMETHODIMP InvokeSingleGvim(HWND hParent,
 	    LPCSTR pszWorkingDir,
 	    LPCSTR pszCmd,
 	    LPCSTR pszParam,
 	    int iShowCmd,
-	    int useDiff);
+	    int gvimExtraOptions);
 
 public:
     int		 m_cntOfHWnd;
diff --git a/src/version.c b/src/version.c
index 7f0d8c8..c0aa0d9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3243,
+/**/
     3242,
 /**/
     3241,
