Index: SVN/SVNPrompt.cpp
===================================================================
--- SVN/SVNPrompt.cpp	(revision 17056)
+++ SVN/SVNPrompt.cpp	(working copy)
@@ -28,8 +28,8 @@
 #include "AppUtils.h"
 #include "StringUtils.h"
 #include "TSVNAuth.h"
+#include "auto_buffer.h"
 
-
 SVNPrompt::SVNPrompt()
 {
 	m_app = NULL;
@@ -320,7 +320,7 @@
 	ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
 	CString sFilter;
 	sFilter.LoadString(IDS_CERTIFICATESFILEFILTER);
-	TCHAR * pszFilters = new TCHAR[sFilter.GetLength()+4];
+	auto_buffer<TCHAR> pszFilters(sFilter.GetLength()+4);
 	_tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter);
 	CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
 	ofn.lpstrFilter = pszFilters;
@@ -371,7 +371,6 @@
 	}
 	else
 		*cred = NULL;
-	delete [] pszFilters;
 	if (svn->m_app)
 		svn->m_app->DoWaitCursor(0);
 	return SVN_NO_ERROR;
Index: SVN/SVNStatusListCtrl.cpp
===================================================================
--- SVN/SVNStatusListCtrl.cpp	(revision 17056)
+++ SVN/SVNStatusListCtrl.cpp	(working copy)
@@ -51,6 +51,7 @@
 #include "SysInfo.h"
 #include "ProgressDlg.h"
 #include "StringUtils.h"
+#include "auto_buffer.h"
 
 const UINT CSVNStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED
 					= ::RegisterWindowMessage(_T("SVNSLNM_ITEMCOUNTCHANGED"));
@@ -3021,7 +3022,7 @@
 					}
 					filelist += _T("|");
 					int len = filelist.GetLength();
-					TCHAR * buf = new TCHAR[len+2];
+					auto_buffer<TCHAR> buf(len+2);
 					_tcscpy_s(buf, len+2, filelist);
 					CStringUtils::PipesToNulls(buf, len);
 					SHFILEOPSTRUCT fileop;
@@ -3032,7 +3033,7 @@
 					fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | ((GetAsyncKeyState(VK_SHIFT) & 0x8000) ? 0 : FOF_ALLOWUNDO);
 					fileop.lpszProgressTitle = _T("deleting file");
 					int result = SHFileOperation(&fileop);
-					delete [] buf;
+					buf.reset(0);
 
 					if ( (result==0) && (!fileop.fAnyOperationsAborted) )
 					{
Index: SVN/TSVNPath.cpp
===================================================================
--- SVN/TSVNPath.cpp	(revision 17056)
+++ SVN/TSVNPath.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include "PathUtils.h"
 #include "svn_dirent_uri.h"
 #include <regex>
+#include "auto_buffer.h"
 
 #if defined(_MFC_VER)
 #include "MessageBox.h"
@@ -313,7 +314,7 @@
 	{
 		if ((bTrash)||(IsDirectory()))
 		{
-			TCHAR * buf = new TCHAR[m_sBackslashPath.GetLength()+2];
+			auto_buffer<TCHAR> buf(m_sBackslashPath.GetLength()+2);
 			_tcscpy_s(buf, m_sBackslashPath.GetLength()+2, m_sBackslashPath);
 			buf[m_sBackslashPath.GetLength()] = 0;
 			buf[m_sBackslashPath.GetLength()+1] = 0;
@@ -324,7 +325,6 @@
 			if (bTrash)
 				shop.fFlags |= FOF_ALLOWUNDO;
 			bRet = (SHFileOperation(&shop) == 0);
-			delete [] buf;
 		}
 		else
 		{
Index: TortoiseMerge/DiffColors.cpp
===================================================================
--- TortoiseMerge/DiffColors.cpp	(revision 17056)
+++ TortoiseMerge/DiffColors.cpp	(working copy)
@@ -94,7 +94,7 @@
 	}
 }
 
-void CDiffColors::SetColors(DiffStates state, COLORREF &crBkgnd, COLORREF &crText)
+void CDiffColors::SetColors(DiffStates state, const COLORREF &crBkgnd, const COLORREF &crText)
 {
 	if ((state < DIFFSTATE_END)&&(state >= 0))
 	{
Index: TortoiseMerge/DiffColors.h
===================================================================
--- TortoiseMerge/DiffColors.h	(revision 17056)
+++ TortoiseMerge/DiffColors.h	(working copy)
@@ -76,7 +76,7 @@
 	static CDiffColors&			GetInstance();
 
 	void						GetColors(DiffStates state, COLORREF &crBkgnd, COLORREF &crText);
-	void						SetColors(DiffStates state, COLORREF &crBkgnd, COLORREF &crText);
+	void						SetColors(DiffStates state, const COLORREF &crBkgnd, const COLORREF &crText);
 	void						LoadRegistry();
 
 protected:
Index: TortoiseMerge/FilePatchesDlg.cpp
===================================================================
--- TortoiseMerge/FilePatchesDlg.cpp	(revision 17056)
+++ TortoiseMerge/FilePatchesDlg.cpp	(working copy)
@@ -282,102 +282,92 @@
 	DWORD ptW = GetMessagePos();
 	point.x = GET_X_LPARAM(ptW);
 	point.y = GET_Y_LPARAM(ptW);
-	if (popup.CreatePopupMenu())
-	{
-		UINT nFlags;
-		
-		nFlags = MF_STRING | (m_cFileList.GetSelectedCount()==1 ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
-		temp.LoadString(IDS_PATCH_PREVIEW);
-		popup.AppendMenu(nFlags, ID_PATCHPREVIEW, temp);
-		popup.SetDefaultItem(ID_PATCHPREVIEW, FALSE);
+	if (!popup.CreatePopupMenu())
+		return;
 
-		temp.LoadString(IDS_PATCH_ALL);
-		popup.AppendMenu(MF_STRING | MF_ENABLED, ID_PATCHALL, temp);
+	UINT nFlags = MF_STRING | (m_cFileList.GetSelectedCount()==1 ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
+	temp.LoadString(IDS_PATCH_PREVIEW);
+	popup.AppendMenu(nFlags, ID_PATCHPREVIEW, temp);
+	popup.SetDefaultItem(ID_PATCHPREVIEW, FALSE);
+
+	temp.LoadString(IDS_PATCH_ALL);
+	popup.AppendMenu(MF_STRING | MF_ENABLED, ID_PATCHALL, temp);
 		
-		nFlags = MF_STRING | (m_cFileList.GetSelectedCount()>0 ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
-		temp.LoadString(IDS_PATCH_SELECTED);
-		popup.AppendMenu(nFlags, ID_PATCHSELECTED, temp);
-		
-		// if the context menu is invoked through the keyboard, we have to use
-		// a calculated position on where to anchor the menu on
-		if ((point.x == -1) && (point.y == -1))
+	nFlags = MF_STRING | (m_cFileList.GetSelectedCount()>0 ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
+	temp.LoadString(IDS_PATCH_SELECTED);
+	popup.AppendMenu(nFlags, ID_PATCHSELECTED, temp);
+
+	// if the context menu is invoked through the keyboard, we have to use
+	// a calculated position on where to anchor the menu on
+	if ((point.x == -1) && (point.y == -1))
+	{
+		CRect rect;
+		GetWindowRect(&rect);
+		point = rect.CenterPoint();
+	}
+
+	int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
+	switch (cmd)
+	{
+	case ID_PATCHPREVIEW:
+		if (m_pCallBack)
 		{
-			CRect rect;
-			GetWindowRect(&rect);
-			point = rect.CenterPoint();
+			int nIndex = m_cFileList.GetSelectionMark();
+			if ( m_arFileStates.GetAt(nIndex)!=FPDLG_FILESTATE_PATCHED)
+			{
+				m_pCallBack->PatchFile(GetFullPath(nIndex), m_pPatch->GetRevision(nIndex));
+			}
 		}
-
-		int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
-		switch (cmd)
+		break;
+	case ID_PATCHALL:
+		if (m_pCallBack)
 		{
-		case ID_PATCHPREVIEW:
+			CProgressDlg progDlg;
+			progDlg.SetTitle(IDR_MAINFRAME);
+			progDlg.SetShowProgressBar(true);
+			progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_ALL)));
+			progDlg.ShowModeless(m_hWnd);
+			for (int i=0; i<m_arFileStates.GetCount() && !progDlg.HasUserCancelled(); i++)
 			{
-				if (m_pCallBack)
+				if (m_arFileStates.GetAt(i)!= FPDLG_FILESTATE_PATCHED)
 				{
-					int nIndex = m_cFileList.GetSelectionMark();
-					if ( m_arFileStates.GetAt(nIndex)!=FPDLG_FILESTATE_PATCHED)
-					{
-						m_pCallBack->PatchFile(GetFullPath(nIndex), m_pPatch->GetRevision(nIndex));
-					}
+					progDlg.SetLine(2, GetFullPath(i), true);
+					m_pCallBack->PatchFile(GetFullPath(i), m_pPatch->GetRevision(i), TRUE);
 				}
+				progDlg.SetProgress64(i, m_arFileStates.GetCount());
 			}
-			break;
-		case ID_PATCHALL:
+			progDlg.Stop();
+		}
+		break;
+	case ID_PATCHSELECTED:
+		if (m_pCallBack)
+		{
+			CProgressDlg progDlg;
+			progDlg.SetTitle(IDR_MAINFRAME);
+			progDlg.SetShowProgressBar(true);
+			progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_SELECTED)));
+			progDlg.ShowModeless(m_hWnd);
+			// The list cannot be sorted by user, so the order of the
+			// items in the list is identical to the order in the array
+			// m_arFileStates.
+			int selCount = m_cFileList.GetSelectedCount();
+			int count = 1;
+			POSITION pos = m_cFileList.GetFirstSelectedItemPosition();
+			int index;
+			while (((index = m_cFileList.GetNextSelectedItem(pos)) >= 0) && (!progDlg.HasUserCancelled()))
 			{
-				if (m_pCallBack)
+				if (m_arFileStates.GetAt(index)!= FPDLG_FILESTATE_PATCHED)
 				{
-					CProgressDlg progDlg;
-					progDlg.SetTitle(IDR_MAINFRAME);
-					progDlg.SetShowProgressBar(true);
-					progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_ALL)));
-					progDlg.ShowModeless(m_hWnd);
-
-					for (int i=0; i<m_arFileStates.GetCount() && !progDlg.HasUserCancelled(); i++)
-					{
-						if (m_arFileStates.GetAt(i)!= FPDLG_FILESTATE_PATCHED)
-						{
-							progDlg.SetLine(2, GetFullPath(i), true);
-							m_pCallBack->PatchFile(GetFullPath(i), m_pPatch->GetRevision(i), TRUE);
-						}
-						progDlg.SetProgress64(i, m_arFileStates.GetCount());
-					}
-					progDlg.Stop();
+					progDlg.SetLine(2, GetFullPath(index), true);
+					m_pCallBack->PatchFile(GetFullPath(index), m_pPatch->GetRevision(index), TRUE);
 				}
-			} 
-			break;
-		case ID_PATCHSELECTED:
-			{
-				if (m_pCallBack)
-				{
-					CProgressDlg progDlg;
-					progDlg.SetTitle(IDR_MAINFRAME);
-					progDlg.SetShowProgressBar(true);
-					progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_SELECTED)));
-					progDlg.ShowModeless(m_hWnd);
-
-					// The list cannot be sorted by user, so the order of the
-					// items in the list is identical to the order in the array
-					// m_arFileStates.
-					int selCount = m_cFileList.GetSelectedCount();
-					int count = 1;
-					POSITION pos = m_cFileList.GetFirstSelectedItemPosition();
-					int index;
-					while (((index = m_cFileList.GetNextSelectedItem(pos)) >= 0) && (!progDlg.HasUserCancelled()))
-					{
-						if (m_arFileStates.GetAt(index)!= FPDLG_FILESTATE_PATCHED)
-						{
-							progDlg.SetLine(2, GetFullPath(index), true);
-							m_pCallBack->PatchFile(GetFullPath(index), m_pPatch->GetRevision(index), TRUE);
-						}
-						progDlg.SetProgress64(count++, selCount);
-					}
-					progDlg.Stop();
-				}
-			} 
-			break;
-		default:
-			break;
+				progDlg.SetProgress64(count++, selCount);
+			}
+			progDlg.Stop();
 		}
+		break;
+	default:
+		break;
 	}
 }
 
@@ -406,10 +396,10 @@
 
 void CFilePatchesDlg::OnMoving(UINT fwSide, LPRECT pRect)
 {
-#define STICKYSIZE 5
 	RECT parentRect;
 	m_pMainFrame->GetWindowRect(&parentRect);
-	if (abs(parentRect.left - pRect->right) < STICKYSIZE)
+	const int stickySize = 5;
+	if (abs(parentRect.left - pRect->right) < stickySize)
 	{
 		int width = pRect->right - pRect->left;
 		pRect->right = parentRect.left;
Index: TortoiseMerge/FileTextLines.cpp
===================================================================
--- TortoiseMerge/FileTextLines.cpp	(revision 17056)
+++ TortoiseMerge/FileTextLines.cpp	(working copy)
@@ -569,19 +569,19 @@
 
 void CFileTextLines::SetErrorString()
 {
-		LPVOID lpMsgBuf;
-		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
-			FORMAT_MESSAGE_FROM_SYSTEM | 
-			FORMAT_MESSAGE_IGNORE_INSERTS,
-			NULL,
-			::GetLastError(),
-			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
-			(LPTSTR) &lpMsgBuf,
-			0,
-			NULL 
-			);
-		m_sErrorString = (LPCTSTR)lpMsgBuf;
-		LocalFree( lpMsgBuf );
+	LPVOID lpMsgBuf;
+	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
+		FORMAT_MESSAGE_FROM_SYSTEM | 
+		FORMAT_MESSAGE_IGNORE_INSERTS,
+		NULL,
+		::GetLastError(),
+		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+		(LPTSTR) &lpMsgBuf,
+		0,
+		NULL 
+		);
+	m_sErrorString = (LPCTSTR)lpMsgBuf;
+	LocalFree( lpMsgBuf );
 }
 
 void CFileTextLines::CopySettings(CFileTextLines * pFileToCopySettingsTo)
Index: TortoiseMerge/LeftView.cpp
===================================================================
--- TortoiseMerge/LeftView.cpp	(revision 17056)
+++ TortoiseMerge/LeftView.cpp	(working copy)
@@ -39,8 +39,9 @@
 		return false;
 
 	CMenu popup;
-	if (popup.CreatePopupMenu())
-	{
+	if (!popup.CreatePopupMenu())
+		return false;
+
 #define ID_USEBLOCK 1
 #define ID_USEFILE 2
 #define ID_USETHEIRANDYOURBLOCK 3
@@ -48,225 +49,212 @@
 #define ID_USEBOTHTHISFIRST 5
 #define ID_USEBOTHTHISLAST 6
 
-		UINT uFlags = MF_ENABLED;
-		if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
-			uFlags |= MF_DISABLED | MF_GRAYED;
-		CString temp;
+	UINT uFlags = MF_ENABLED;
+	if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
+		uFlags |= MF_DISABLED | MF_GRAYED;
+	CString temp;
 		
-		bool bImportantBlock = true;
-		switch (state)
-		{
-		case DIFFSTATE_UNKNOWN:
-			bImportantBlock = false;
-			break;
-		}
-		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISBLOCK);
-		popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBLOCK, temp);
+	bool bImportantBlock = true;
+	switch (state)
+	{
+	case DIFFSTATE_UNKNOWN:
+		bImportantBlock = false;
+		break;
+	}
+	temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISBLOCK);
+	popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBLOCK, temp);
 
-		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISFILE);
-		popup.AppendMenu(MF_STRING | MF_ENABLED, ID_USEFILE, temp);
+	temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISFILE);
+	popup.AppendMenu(MF_STRING | MF_ENABLED, ID_USEFILE, temp);
 
-		if (m_pwndBottom->IsWindowVisible())
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEYOURANDTHEIRBLOCK);
-			popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEYOURANDTHEIRBLOCK, temp);
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USETHEIRANDYOURBLOCK);
-			popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USETHEIRANDYOURBLOCK, temp);
-		}
-		else
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISFIRST);
-			popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISFIRST, temp);
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISLAST);
-			popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISLAST, temp);
-		}
+	if (m_pwndBottom->IsWindowVisible())
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEYOURANDTHEIRBLOCK);
+		popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEYOURANDTHEIRBLOCK, temp);
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHEIRANDYOURBLOCK);
+		popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USETHEIRANDYOURBLOCK, temp);
+	}
+	else
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISFIRST);
+		popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISFIRST, temp);
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISLAST);
+		popup.AppendMenu(MF_STRING | uFlags | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISLAST, temp);
+	}
 
-		popup.AppendMenu(MF_SEPARATOR, NULL);
+	popup.AppendMenu(MF_SEPARATOR, NULL);
 
-		temp.LoadString(IDS_EDIT_COPY);
-		popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_COPY, temp);
-		if (!m_bCaretHidden)
-		{
-			temp.LoadString(IDS_EDIT_CUT);
-			popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_CUT, temp);
-			temp.LoadString(IDS_EDIT_PASTE);
-			popup.AppendMenu(MF_STRING | (CAppUtils::HasClipboardFormat(CF_UNICODETEXT)||CAppUtils::HasClipboardFormat(CF_TEXT) ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_PASTE, temp);
-		}
+	temp.LoadString(IDS_EDIT_COPY);
+	popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_COPY, temp);
+	if (!m_bCaretHidden)
+	{
+		temp.LoadString(IDS_EDIT_CUT);
+		popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_CUT, temp);
+		temp.LoadString(IDS_EDIT_PASTE);
+		popup.AppendMenu(MF_STRING | (CAppUtils::HasClipboardFormat(CF_UNICODETEXT)||CAppUtils::HasClipboardFormat(CF_TEXT) ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_PASTE, temp);
+	}
 
-		// if the context menu is invoked through the keyboard, we have to use
-		// a calculated position on where to anchor the menu on
-		if ((point.x == -1) && (point.y == -1))
+	// if the context menu is invoked through the keyboard, we have to use
+	// a calculated position on where to anchor the menu on
+	if ((point.x == -1) && (point.y == -1))
+	{
+		CRect rect;
+		GetWindowRect(&rect);
+		point = rect.CenterPoint();
+	}
+	int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
+	viewstate leftstate;
+	viewstate bottomstate;
+	viewstate rightstate;
+	switch (cmd)
+	{
+	case ID_EDIT_COPY:
+		OnEditCopy();
+		return true;
+	case ID_EDIT_CUT:
+		OnEditCopy();
+		RemoveSelectedText();
+		return false;
+	case ID_EDIT_PASTE:
+		PasteText();
+		return false;
+	case ID_USEFILE:
+		if (m_pwndBottom->IsWindowVisible())
 		{
-			CRect rect;
-			GetWindowRect(&rect);
-			point = rect.CenterPoint();
+			for (int i=0; i<GetLineCount(); i++)
+			{
+				bottomstate.difflines[i] = m_pwndBottom->m_pViewData->GetLine(i);
+				m_pwndBottom->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
+				bottomstate.linestates[i] = m_pwndBottom->m_pViewData->GetState(i);
+				m_pwndBottom->m_pViewData->SetState(i, m_pViewData->GetState(i));
+				m_pwndBottom->m_pViewData->SetLineEnding(i, m_pViewData->GetLineEnding(i));
+				if (m_pwndBottom->IsLineConflicted(i))
+				{
+					if (m_pViewData->GetState(i) == DIFFSTATE_CONFLICTEMPTY)
+						m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVEDEMPTY);
+					else
+						m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVED);
+				}
+			}
+			m_pwndBottom->SetModified();
 		}
-		int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
-		viewstate leftstate;
-		viewstate bottomstate;
-		viewstate rightstate;
-		switch (cmd)
+		else
 		{
-		case ID_EDIT_COPY:
-			OnEditCopy();
-			return true;
-		case ID_EDIT_CUT:
-			OnEditCopy();
-			RemoveSelectedText();
-			return false;
-		case ID_EDIT_PASTE:
-			PasteText();
-			return false;
-		case ID_USEFILE:
+			for (int i=0; i<GetLineCount(); i++)
 			{
-				if (m_pwndBottom->IsWindowVisible())
+				rightstate.difflines[i] = m_pwndRight->m_pViewData->GetLine(i);
+				m_pwndRight->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
+				m_pwndRight->m_pViewData->SetLineEnding(i, m_pViewData->GetLineEnding(i));
+				DiffStates state2 = m_pViewData->GetState(i);
+				switch (state2)
 				{
-					for (int i=0; i<GetLineCount(); i++)
-					{
-						bottomstate.difflines[i] = m_pwndBottom->m_pViewData->GetLine(i);
-						m_pwndBottom->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
-						bottomstate.linestates[i] = m_pwndBottom->m_pViewData->GetState(i);
-						m_pwndBottom->m_pViewData->SetState(i, m_pViewData->GetState(i));
-						m_pwndBottom->m_pViewData->SetLineEnding(i, m_pViewData->GetLineEnding(i));
-						if (m_pwndBottom->IsLineConflicted(i))
-						{
-							if (m_pViewData->GetState(i) == DIFFSTATE_CONFLICTEMPTY)
-								m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVEDEMPTY);
-							else
-								m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVED);
-						}
-					}
-					m_pwndBottom->SetModified();
+				case DIFFSTATE_CONFLICTEMPTY:
+				case DIFFSTATE_UNKNOWN:
+				case DIFFSTATE_EMPTY:
+					rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
+					m_pwndRight->m_pViewData->SetState(i, state2);
+					break;
+				case DIFFSTATE_YOURSADDED:
+				case DIFFSTATE_IDENTICALADDED:
+				case DIFFSTATE_NORMAL:
+				case DIFFSTATE_THEIRSADDED:
+				case DIFFSTATE_ADDED:
+				case DIFFSTATE_CONFLICTADDED:
+				case DIFFSTATE_CONFLICTED:
+				case DIFFSTATE_CONFLICTED_IGNORED:
+				case DIFFSTATE_IDENTICALREMOVED:
+				case DIFFSTATE_REMOVED:
+				case DIFFSTATE_THEIRSREMOVED:
+				case DIFFSTATE_YOURSREMOVED:
+					rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
+					m_pwndRight->m_pViewData->SetState(i, DIFFSTATE_NORMAL);
+					leftstate.linestates[i] = m_pViewData->GetState(i);
+					m_pViewData->SetState(i, DIFFSTATE_NORMAL);
+					break;
+				default:
+					break;
 				}
-				else
-				{
-					for (int i=0; i<GetLineCount(); i++)
-					{
-						rightstate.difflines[i] = m_pwndRight->m_pViewData->GetLine(i);
-						m_pwndRight->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
-						m_pwndRight->m_pViewData->SetLineEnding(i, m_pViewData->GetLineEnding(i));
-						DiffStates state2 = m_pViewData->GetState(i);
-						switch (state2)
-						{
-						case DIFFSTATE_CONFLICTEMPTY:
-						case DIFFSTATE_UNKNOWN:
-						case DIFFSTATE_EMPTY:
-							rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
-							m_pwndRight->m_pViewData->SetState(i, state2);
-							break;
-						case DIFFSTATE_YOURSADDED:
-						case DIFFSTATE_IDENTICALADDED:
-						case DIFFSTATE_NORMAL:
-						case DIFFSTATE_THEIRSADDED:
-						case DIFFSTATE_ADDED:
-						case DIFFSTATE_CONFLICTADDED:
-						case DIFFSTATE_CONFLICTED:
-						case DIFFSTATE_CONFLICTED_IGNORED:
-						case DIFFSTATE_IDENTICALREMOVED:
-						case DIFFSTATE_REMOVED:
-						case DIFFSTATE_THEIRSREMOVED:
-						case DIFFSTATE_YOURSREMOVED:
-							rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
-							m_pwndRight->m_pViewData->SetState(i, DIFFSTATE_NORMAL);
-							leftstate.linestates[i] = m_pViewData->GetState(i);
-							m_pViewData->SetState(i, DIFFSTATE_NORMAL);
-							break;
-						default:
-							break;
-						}
-					}
-					m_pwndRight->SetModified();
-					if (m_pwndLocator)
-						m_pwndLocator->DocumentUpdated();
-				}
 			}
+			m_pwndRight->SetModified();
+			if (m_pwndLocator)
+				m_pwndLocator->DocumentUpdated();
+		}
+		break;
+	case ID_USEBLOCK:
+		if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
 			break;
-		case ID_USEBLOCK:
+		if (m_pwndBottom->IsWindowVisible())
+		{
+			for (int i=m_nSelBlockStart; i<=m_nSelBlockEnd; i++)
 			{
-                if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
-                    break;
-				if (m_pwndBottom->IsWindowVisible())
+				bottomstate.difflines[i] = m_pwndBottom->m_pViewData->GetLine(i);
+				m_pwndBottom->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
+				bottomstate.linestates[i] = m_pwndBottom->m_pViewData->GetState(i);
+				m_pwndBottom->m_pViewData->SetState(i, m_pViewData->GetState(i));
+				m_pwndBottom->m_pViewData->SetLineEnding(i, EOL_AUTOLINE);
+				if (m_pwndBottom->IsLineConflicted(i))
 				{
-					for (int i=m_nSelBlockStart; i<=m_nSelBlockEnd; i++)
-					{
-						bottomstate.difflines[i] = m_pwndBottom->m_pViewData->GetLine(i);
-						m_pwndBottom->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
-						bottomstate.linestates[i] = m_pwndBottom->m_pViewData->GetState(i);
-						m_pwndBottom->m_pViewData->SetState(i, m_pViewData->GetState(i));
-						m_pwndBottom->m_pViewData->SetLineEnding(i, EOL_AUTOLINE);
-						if (m_pwndBottom->IsLineConflicted(i))
-						{
-							if (m_pViewData->GetState(i) == DIFFSTATE_CONFLICTEMPTY)
-								m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVEDEMPTY);
-							else
-								m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVED);
-						}
-					}
-					m_pwndBottom->SetModified();
+					if (m_pViewData->GetState(i) == DIFFSTATE_CONFLICTEMPTY)
+						m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVEDEMPTY);
+					else
+						m_pwndBottom->m_pViewData->SetState(i, DIFFSTATE_CONFLICTRESOLVED);
 				}
-				else
+			}
+			m_pwndBottom->SetModified();
+		}
+		else
+		{
+			for (int i=m_nSelBlockStart; i<=m_nSelBlockEnd; i++)
+			{
+				rightstate.difflines[i] = m_pwndRight->m_pViewData->GetLine(i);
+				m_pwndRight->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
+				m_pwndRight->m_pViewData->SetLineEnding(i, EOL_AUTOLINE);
+				DiffStates state2 = m_pViewData->GetState(i);
+				switch (state2)
 				{
-					for (int i=m_nSelBlockStart; i<=m_nSelBlockEnd; i++)
-					{
-						rightstate.difflines[i] = m_pwndRight->m_pViewData->GetLine(i);
-						m_pwndRight->m_pViewData->SetLine(i, m_pViewData->GetLine(i));
-						m_pwndRight->m_pViewData->SetLineEnding(i, EOL_AUTOLINE);
-						DiffStates state2 = m_pViewData->GetState(i);
-						switch (state2)
-						{
-						case DIFFSTATE_ADDED:
-						case DIFFSTATE_CONFLICTADDED:
-						case DIFFSTATE_CONFLICTED:
-						case DIFFSTATE_CONFLICTED_IGNORED:
-						case DIFFSTATE_CONFLICTEMPTY:
-						case DIFFSTATE_IDENTICALADDED:
-						case DIFFSTATE_NORMAL:
-						case DIFFSTATE_THEIRSADDED:
-						case DIFFSTATE_UNKNOWN:
-						case DIFFSTATE_YOURSADDED:
-						case DIFFSTATE_EMPTY:
-							rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
-							m_pwndRight->m_pViewData->SetState(i, state2);
-							break;
-						case DIFFSTATE_IDENTICALREMOVED:
-						case DIFFSTATE_REMOVED:
-						case DIFFSTATE_THEIRSREMOVED:
-						case DIFFSTATE_YOURSREMOVED:
-							rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
-							m_pwndRight->m_pViewData->SetState(i, DIFFSTATE_ADDED);
-							break;
-						default:
-							break;
-						}
-					}
-					m_pwndRight->SetModified();
+				case DIFFSTATE_ADDED:
+				case DIFFSTATE_CONFLICTADDED:
+				case DIFFSTATE_CONFLICTED:
+				case DIFFSTATE_CONFLICTED_IGNORED:
+				case DIFFSTATE_CONFLICTEMPTY:
+				case DIFFSTATE_IDENTICALADDED:
+				case DIFFSTATE_NORMAL:
+				case DIFFSTATE_THEIRSADDED:
+				case DIFFSTATE_UNKNOWN:
+				case DIFFSTATE_YOURSADDED:
+				case DIFFSTATE_EMPTY:
+					rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
+					m_pwndRight->m_pViewData->SetState(i, state2);
+					break;
+				case DIFFSTATE_IDENTICALREMOVED:
+				case DIFFSTATE_REMOVED:
+				case DIFFSTATE_THEIRSREMOVED:
+				case DIFFSTATE_YOURSREMOVED:
+					rightstate.linestates[i] = m_pwndRight->m_pViewData->GetState(i);
+					m_pwndRight->m_pViewData->SetState(i, DIFFSTATE_ADDED);
+					break;
+				default:
+					break;
 				}
-			} 
-			break;
-		case ID_USEYOURANDTHEIRBLOCK:
-			{
-				UseYourAndTheirBlock(rightstate, bottomstate, leftstate);
 			}
-			break;
-		case ID_USETHEIRANDYOURBLOCK:
-			{
-				UseTheirAndYourBlock(rightstate, bottomstate, leftstate);
-			}
-			break;
-		case ID_USEBOTHTHISLAST:
-			{
-				UseBothRightFirst(rightstate, leftstate);
-			}
-			break;
-		case ID_USEBOTHTHISFIRST:
-			{
-				UseBothLeftFirst(rightstate, leftstate);
-			}
-			break;
-		default:
-			return false;
-		} // switch (cmd) 
-		CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
-	} // if (popup.CreatePopupMenu()) 
+			m_pwndRight->SetModified();
+		}
+		break;
+	case ID_USEYOURANDTHEIRBLOCK:
+		UseYourAndTheirBlock(rightstate, bottomstate, leftstate);
+		break;
+	case ID_USETHEIRANDYOURBLOCK:
+		UseTheirAndYourBlock(rightstate, bottomstate, leftstate);
+		break;
+	case ID_USEBOTHTHISLAST:
+		UseBothRightFirst(rightstate, leftstate);
+		break;
+	case ID_USEBOTHTHISFIRST:
+		UseBothLeftFirst(rightstate, leftstate);
+		break;
+	default:
+		return false;
+	} // switch (cmd) 
+	CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
 	return false;
 }
Index: TortoiseMerge/MainFrm.cpp
===================================================================
--- TortoiseMerge/MainFrm.cpp	(revision 17056)
+++ TortoiseMerge/MainFrm.cpp	(working copy)
@@ -576,7 +576,8 @@
 	LoadViews();
 }
 
-void CMainFrame::ClearViewNamesAndPaths() {
+void CMainFrame::ClearViewNamesAndPaths()
+{
 	m_pwndLeftView->m_sWindowName.Empty();
 	m_pwndLeftView->m_sFullFilePath.Empty();
 	m_pwndRightView->m_sWindowName.Empty();
@@ -1137,10 +1138,9 @@
 	ofn.nFilterIndex = 1;
 
 	// Display the Open dialog box. 
-	CString sFile;
 	if (GetSaveFileName(&ofn)==TRUE)
 	{
-		sFile = CString(ofn.lpstrFile);
+		CString sFile = CString(ofn.lpstrFile);
 		SaveFile(sFile);
 		return true;
 	}
@@ -1275,18 +1275,14 @@
 void CMainFrame::OnEditFind()
 {
 	if (m_pFindDialog)
-	{
 		return;
-	}
-	else
-	{
-		// start searching from the start again
-		// if no line is selected, otherwise start from
-		// the selected line
-		m_nSearchIndex = FindSearchStart(0);
-		m_pFindDialog = new CFindDlg();
-		m_pFindDialog->Create(this);
-	}
+
+	// start searching from the start again
+	// if no line is selected, otherwise start from
+	// the selected line
+	m_nSearchIndex = FindSearchStart(0);
+	m_pFindDialog = new CFindDlg();
+	m_pFindDialog->Create(this);
 }
 
 LRESULT CMainFrame::OnFindDialogMessage(WPARAM /*wParam*/, LPARAM /*lParam*/)
@@ -1353,113 +1349,113 @@
 {
 	if (m_sFindText.IsEmpty())
 		return;
+	if (!m_pwndLeftView)
+		return;
+	if(!m_pwndLeftView->m_pViewData)
+		return;
 
-	if ((m_pwndLeftView)&&(m_pwndLeftView->m_pViewData))
-	{
-		bool bFound = FALSE;
+	bool bFound = FALSE;
 
-		CString left;
-		CString right;
-		CString bottom;
-		DiffStates leftstate = DIFFSTATE_NORMAL;
-		DiffStates rightstate = DIFFSTATE_NORMAL;
-		DiffStates bottomstate = DIFFSTATE_NORMAL;
-		int i = 0;
-		
-		m_nSearchIndex = FindSearchStart(m_nSearchIndex);
-		m_nSearchIndex++;
-		if (m_nSearchIndex >= m_pwndLeftView->m_pViewData->GetCount())
-			m_nSearchIndex = 0;
-		if (srchDir == SearchPrevious)
-		{
-			// SearchIndex points 1 past where we found the last match, 
-			// so if we are searching backwards we need to adjust accordingly
-			m_nSearchIndex -= 2;
-			// if at the top, start again from the end
-			if (m_nSearchIndex < 0)
-				m_nSearchIndex += m_pwndLeftView->m_pViewData->GetCount();
-		}
-		const int idxLimits[2][2][2]={{{m_nSearchIndex, m_pwndLeftView->m_pViewData->GetCount()},
+	CString left;
+	CString right;
+	CString bottom;
+	DiffStates leftstate = DIFFSTATE_NORMAL;
+	DiffStates rightstate = DIFFSTATE_NORMAL;
+	DiffStates bottomstate = DIFFSTATE_NORMAL;
+	int i = 0;
+	
+	m_nSearchIndex = FindSearchStart(m_nSearchIndex);
+	m_nSearchIndex++;
+	if (m_nSearchIndex >= m_pwndLeftView->m_pViewData->GetCount())
+		m_nSearchIndex = 0;
+	if (srchDir == SearchPrevious)
+	{
+		// SearchIndex points 1 past where we found the last match, 
+		// so if we are searching backwards we need to adjust accordingly
+		m_nSearchIndex -= 2;
+		// if at the top, start again from the end
+		if (m_nSearchIndex < 0)
+			m_nSearchIndex += m_pwndLeftView->m_pViewData->GetCount();
+	}
+	const int idxLimits[2][2][2]={{{m_nSearchIndex, m_pwndLeftView->m_pViewData->GetCount()},
 									   {0, m_nSearchIndex}},
-									  {{m_nSearchIndex, -1},
+								  {{m_nSearchIndex, -1},
 									   {m_pwndLeftView->m_pViewData->GetCount()-1, m_nSearchIndex}}};
-		const int offsets[2]={+1, -1};
-		
-		for (int j=0; j != 2 && !bFound; ++j)
+	const int offsets[2]={+1, -1};
+	
+	for (int j=0; j != 2 && !bFound; ++j)
+	{
+		for (i=idxLimits[srchDir][j][0]; i != idxLimits[srchDir][j][1]; i += offsets[srchDir])
 		{
-			for (i=idxLimits[srchDir][j][0]; i != idxLimits[srchDir][j][1]; i += offsets[srchDir])
+			left = m_pwndLeftView->m_pViewData->GetLine(i);
+			leftstate = m_pwndLeftView->m_pViewData->GetState(i);
+			if ((!m_bOneWay)&&(m_pwndRightView->m_pViewData))
 			{
-				left = m_pwndLeftView->m_pViewData->GetLine(i);
-				leftstate = m_pwndLeftView->m_pViewData->GetState(i);
-				if ((!m_bOneWay)&&(m_pwndRightView->m_pViewData))
-				{
-					right = m_pwndRightView->m_pViewData->GetLine(i);
-					rightstate = m_pwndRightView->m_pViewData->GetState(i);
-				}
-				if ((m_pwndBottomView)&&(m_pwndBottomView->m_pViewData))
-				{
-					bottom = m_pwndBottomView->m_pViewData->GetLine(i);
-					bottomstate = m_pwndBottomView->m_pViewData->GetState(i);
-				}
+				right = m_pwndRightView->m_pViewData->GetLine(i);
+				rightstate = m_pwndRightView->m_pViewData->GetState(i);
+			}
+			if ((m_pwndBottomView)&&(m_pwndBottomView->m_pViewData))
+			{
+				bottom = m_pwndBottomView->m_pViewData->GetLine(i);
+				bottomstate = m_pwndBottomView->m_pViewData->GetState(i);
+			}
 
-				if (!m_bMatchCase)
-				{
-					left = left.MakeLower();
-					right = right.MakeLower();
-					bottom = bottom.MakeLower();
-					m_sFindText = m_sFindText.MakeLower();
-				}
-				if (StringFound(left))
-				{
-					if ((!m_bLimitToDiff)||(leftstate != DIFFSTATE_NORMAL))
-					{
-						bFound = TRUE;
-						break;
-					}
-				} 
-				else if (StringFound(right))
-				{
-					if ((!m_bLimitToDiff)||(rightstate != DIFFSTATE_NORMAL))
-					{
-						bFound = TRUE;
-						break;
-					}
-				} 
-				else if (StringFound(bottom))
-				{
-					if ((!m_bLimitToDiff)||(bottomstate != DIFFSTATE_NORMAL))
-					{
-						bFound = TRUE;
-						break;
-					}
-				} 
+			if (!m_bMatchCase)
+			{
+				left = left.MakeLower();
+				right = right.MakeLower();
+				bottom = bottom.MakeLower();
+				m_sFindText = m_sFindText.MakeLower();
 			}
-		}
-		if (bFound)
-		{
-			m_nSearchIndex = i;
-			m_pwndLeftView->GoToLine(m_nSearchIndex);
 			if (StringFound(left))
 			{
-				m_pwndLeftView->SetFocus();
-				m_pwndLeftView->HiglightLines(m_nSearchIndex);
-			}
+				if ((!m_bLimitToDiff)||(leftstate != DIFFSTATE_NORMAL))
+				{
+					bFound = TRUE;
+					break;
+				}
+			} 
 			else if (StringFound(right))
 			{
-				m_pwndRightView->SetFocus();
-				m_pwndRightView->HiglightLines(m_nSearchIndex);
-			}
+				if ((!m_bLimitToDiff)||(rightstate != DIFFSTATE_NORMAL))
+				{
+					bFound = TRUE;
+					break;
+				}
+			} 
 			else if (StringFound(bottom))
 			{
-				m_pwndBottomView->SetFocus();
-				m_pwndBottomView->HiglightLines(m_nSearchIndex);
-			}
+				if ((!m_bLimitToDiff)||(bottomstate != DIFFSTATE_NORMAL))
+				{
+					bFound = TRUE;
+					break;
+				}
+			} 
 		}
-		else
-		{
-			m_nSearchIndex = 0;
-		}
 	}
+	if (!bFound)
+	{
+		m_nSearchIndex = 0;
+		return;
+	}
+
+	m_nSearchIndex = i;
+	m_pwndLeftView->GoToLine(m_nSearchIndex);
+	if (StringFound(left))
+	{
+		m_pwndLeftView->SetFocus();
+		m_pwndLeftView->HiglightLines(m_nSearchIndex);
+	}
+	else if (StringFound(right))
+	{
+		m_pwndRightView->SetFocus();
+		m_pwndRightView->HiglightLines(m_nSearchIndex);
+	}
+	else if (StringFound(bottom))
+	{
+		m_pwndBottomView->SetFocus();
+		m_pwndBottomView->HiglightLines(m_nSearchIndex);
+	}
 }
 
 int CMainFrame::FindSearchStart(int nDefault)
@@ -1617,7 +1613,7 @@
 
 void CMainFrame::OnUpdateEditUseblockfromleftbeforeright(CCmdUI *pCmdUI)
 {
-	pCmdUI->Enable(m_pwndRightView && m_pwndRightView->IsWindowVisible() && m_pwndRightView->HasCaret() && m_pwndRightView->HasSelection());
+	OnUpdateEditUseleftblock(pCmdUI);
 }
 
 void CMainFrame::OnEditUseblockfromrightbeforeleft()
@@ -1628,7 +1624,7 @@
 
 void CMainFrame::OnUpdateEditUseblockfromrightbeforeleft(CCmdUI *pCmdUI)
 {
-	pCmdUI->Enable(m_pwndRightView && m_pwndRightView->IsWindowVisible() && m_pwndRightView->HasCaret() && m_pwndRightView->HasSelection());
+	OnUpdateEditUseleftblock(pCmdUI);
 }
 
 void CMainFrame::OnFileReload()
@@ -1909,7 +1905,6 @@
 	if (CUndo::GetInstance().CanUndo())
 	{
 		CUndo::GetInstance().Undo(m_pwndLeftView, m_pwndRightView, m_pwndBottomView);
-
 	}
 }
 
@@ -1980,40 +1975,39 @@
 
 void CMainFrame::OnEditCreateunifieddifffile()
 {
-	CString origFile, modifiedFile, outputFile;
+	CString origFile, modifiedFile;
 	// the original file is the one on the left
 	if (m_pwndLeftView)
 		origFile = m_pwndLeftView->m_sFullFilePath;
 	if (m_pwndRightView)
 		modifiedFile = m_pwndRightView->m_sFullFilePath;
-	if (!origFile.IsEmpty() && !modifiedFile.IsEmpty())
-	{
-		// ask for the path to save the unified diff file to
-		OPENFILENAME ofn = {0};			// common dialog box structure
-		TCHAR szFile[MAX_PATH] = {0};	// buffer for file name
-		ofn.lStructSize = sizeof(OPENFILENAME);
-		ofn.lpstrFile = szFile;
-		ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
-		CString temp;
-		temp.LoadString(IDS_SAVEASTITLE);
-		if (!temp.IsEmpty())
-			ofn.lpstrTitle = temp;
-		ofn.Flags = OFN_OVERWRITEPROMPT;
-		CString sFilter;
-		sFilter.LoadString(IDS_COMMONFILEFILTER);
-		auto_buffer<TCHAR> pszFilters(sFilter.GetLength()+4);
-		_tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter);
-		CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
-		ofn.lpstrFilter = pszFilters;
-		ofn.nFilterIndex = 1;
+	if (origFile.IsEmpty() || modifiedFile.IsEmpty())
+		return;
 
-		// Display the Save dialog box. 
-		CString sFile;
-		if (GetSaveFileName(&ofn)==TRUE)
-		{
-			outputFile = CString(ofn.lpstrFile);
-			CAppUtils::CreateUnifiedDiff(origFile, modifiedFile, outputFile, true);
-		}
+	// ask for the path to save the unified diff file to
+	OPENFILENAME ofn = {0};			// common dialog box structure
+	TCHAR szFile[MAX_PATH] = {0};	// buffer for file name
+	ofn.lStructSize = sizeof(OPENFILENAME);
+	ofn.lpstrFile = szFile;
+	ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
+	CString temp;
+	temp.LoadString(IDS_SAVEASTITLE);
+	if (!temp.IsEmpty())
+		ofn.lpstrTitle = temp;
+	ofn.Flags = OFN_OVERWRITEPROMPT;
+	CString sFilter;
+	sFilter.LoadString(IDS_COMMONFILEFILTER);
+	auto_buffer<TCHAR> pszFilters(sFilter.GetLength()+4);
+	_tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter);
+	CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
+	ofn.lpstrFilter = pszFilters;
+	ofn.nFilterIndex = 1;
+
+	// Display the Save dialog box. 
+	if (GetSaveFileName(&ofn)==TRUE)
+	{
+		CString outputFile = CString(ofn.lpstrFile);
+		CAppUtils::CreateUnifiedDiff(origFile, modifiedFile, outputFile, true);
 	}
 }
 
Index: TortoiseMerge/RightView.cpp
===================================================================
--- TortoiseMerge/RightView.cpp	(revision 17056)
+++ TortoiseMerge/RightView.cpp	(working copy)
@@ -39,8 +39,9 @@
 		return false;
 
 	CMenu popup;
-	if (popup.CreatePopupMenu())
-	{
+	if (!popup.CreatePopupMenu())
+		return false;
+
 #define ID_USEBLOCK 1
 #define ID_USEFILE 2
 #define ID_USETHEIRANDYOURBLOCK 3
@@ -48,124 +49,111 @@
 #define ID_USEBOTHTHISFIRST 5
 #define ID_USEBOTHTHISLAST 6
 
-		UINT uEnabled = MF_ENABLED;
-		if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
-			uEnabled |= MF_DISABLED | MF_GRAYED;
-		CString temp;
+	UINT uEnabled = MF_ENABLED;
+	if ((m_nSelBlockStart == -1)||(m_nSelBlockEnd == -1))
+		uEnabled |= MF_DISABLED | MF_GRAYED;
+	CString temp;
 
-		bool bImportantBlock = true;
-		switch (state)
-		{
-		case DIFFSTATE_UNKNOWN:
-			bImportantBlock = false;
-			break;
-		}
+	bool bImportantBlock = true;
+	switch (state)
+	{
+	case DIFFSTATE_UNKNOWN:
+		bImportantBlock = false;
+		break;
+	}
 
-		if (!m_pwndBottom->IsWindowVisible())
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEOTHERBLOCK);
-		}
-		else
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISBLOCK);
-		popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBLOCK, temp);
+	if (!m_pwndBottom->IsWindowVisible())
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEOTHERBLOCK);
+	}
+	else
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISBLOCK);
+	popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBLOCK, temp);
 
-		if (!m_pwndBottom->IsWindowVisible())
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEOTHERFILE);
-		}
-		else
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISFILE);
-		popup.AppendMenu(MF_STRING | MF_ENABLED, ID_USEFILE, temp);
+	if (!m_pwndBottom->IsWindowVisible())
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEOTHERFILE);
+	}
+	else
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHISFILE);
+	popup.AppendMenu(MF_STRING | MF_ENABLED, ID_USEFILE, temp);
 
-		if (m_pwndBottom->IsWindowVisible())
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEYOURANDTHEIRBLOCK);
-			popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEYOURANDTHEIRBLOCK, temp);
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USETHEIRANDYOURBLOCK);
-			popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USETHEIRANDYOURBLOCK, temp);
-		}
-		else
-		{
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISFIRST);
-			popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISFIRST, temp);
-			temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISLAST);
-			popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISLAST, temp);
-		}
+	if (m_pwndBottom->IsWindowVisible())
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEYOURANDTHEIRBLOCK);
+		popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEYOURANDTHEIRBLOCK, temp);
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USETHEIRANDYOURBLOCK);
+		popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USETHEIRANDYOURBLOCK, temp);
+	}
+	else
+	{
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISFIRST);
+		popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISFIRST, temp);
+		temp.LoadString(IDS_VIEWCONTEXTMENU_USEBOTHTHISLAST);
+		popup.AppendMenu(MF_STRING | uEnabled | (bImportantBlock ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_USEBOTHTHISLAST, temp);
+	}
 
-		popup.AppendMenu(MF_SEPARATOR, NULL);
+	popup.AppendMenu(MF_SEPARATOR, NULL);
 
-		temp.LoadString(IDS_EDIT_COPY);
-		popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_COPY, temp);
-		if (!m_bCaretHidden)
-		{
-			temp.LoadString(IDS_EDIT_CUT);
-			popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_CUT, temp);
-			temp.LoadString(IDS_EDIT_PASTE);
-			popup.AppendMenu(MF_STRING | (CAppUtils::HasClipboardFormat(CF_UNICODETEXT)||CAppUtils::HasClipboardFormat(CF_TEXT) ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_PASTE, temp);
-		}
+	temp.LoadString(IDS_EDIT_COPY);
+	popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_COPY, temp);
+	if (!m_bCaretHidden)
+	{
+		temp.LoadString(IDS_EDIT_CUT);
+		popup.AppendMenu(MF_STRING | (HasTextSelection() ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_CUT, temp);
+		temp.LoadString(IDS_EDIT_PASTE);
+		popup.AppendMenu(MF_STRING | (CAppUtils::HasClipboardFormat(CF_UNICODETEXT)||CAppUtils::HasClipboardFormat(CF_TEXT) ? MF_ENABLED : MF_DISABLED|MF_GRAYED), ID_EDIT_PASTE, temp);
+	}
 
-		// if the context menu is invoked through the keyboard, we have to use
-		// a calculated position on where to anchor the menu on
-		if ((point.x == -1) && (point.y == -1))
-		{
-			CRect rect;
-			GetWindowRect(&rect);
-			point = rect.CenterPoint();
-		}
-		int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
-		viewstate rightstate;
-		viewstate bottomstate;
-		viewstate leftstate;
-		switch (cmd)
-		{
-		case ID_EDIT_COPY:
-			OnEditCopy();
-			return true;
-		case ID_EDIT_CUT:
-			OnEditCopy();
-			RemoveSelectedText();
-			return false;
-		case ID_EDIT_PASTE:
-			PasteText();
-			return false;
-		case ID_USEFILE:
-			{
-				UseFile(false);
-			} 
-			break;
-		case ID_USEBLOCK:
-			{
-				UseBlock(false);
-			} 
+	// if the context menu is invoked through the keyboard, we have to use
+	// a calculated position on where to anchor the menu on
+	if ((point.x == -1) && (point.y == -1))
+	{
+		CRect rect;
+		GetWindowRect(&rect);
+		point = rect.CenterPoint();
+	}
+	int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
+	viewstate rightstate;
+	viewstate bottomstate;
+	viewstate leftstate;
+	switch (cmd)
+	{
+	case ID_EDIT_COPY:
+		OnEditCopy();
+		return true;
+	case ID_EDIT_CUT:
+		OnEditCopy();
+		RemoveSelectedText();
+		return false;
+	case ID_EDIT_PASTE:
+		PasteText();
+		return false;
+	case ID_USEFILE:
+		UseFile(false);
 		break;
-		case ID_USEYOURANDTHEIRBLOCK:
-			{
-				UseYourAndTheirBlock(rightstate, bottomstate, leftstate);
-				CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
-			}
-			break;
-		case ID_USETHEIRANDYOURBLOCK:
-			{
-				UseTheirAndYourBlock(rightstate, bottomstate, leftstate);
-				CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
-			}
-			break;
-		case ID_USEBOTHTHISFIRST:
-			{
-				UseBothRightFirst(rightstate, leftstate);
-				CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
-			}
-			break;
-		case ID_USEBOTHTHISLAST:
-			{
-				UseBothLeftFirst(rightstate, leftstate);
-				CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
-			}
-			break;
-		default:
-			return false;
-		} // switch (cmd) 
-	} // if (popup.CreatePopupMenu()) 
+	case ID_USEBLOCK:
+		UseBlock(false);
+		break;
+	case ID_USEYOURANDTHEIRBLOCK:
+		UseYourAndTheirBlock(rightstate, bottomstate, leftstate);
+		CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
+		break;
+	case ID_USETHEIRANDYOURBLOCK:
+		UseTheirAndYourBlock(rightstate, bottomstate, leftstate);
+		CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
+		break;
+	case ID_USEBOTHTHISFIRST:
+		UseBothRightFirst(rightstate, leftstate);
+		CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
+		break;
+	case ID_USEBOTHTHISLAST:
+		UseBothLeftFirst(rightstate, leftstate);
+		CUndo::GetInstance().AddState(leftstate, rightstate, bottomstate, m_ptCaretPos);
+		break;
+	default:
+		return false;
+	} // switch (cmd) 
 	return false;
 }
 
Index: TortoiseMerge/SetColorPage.cpp
===================================================================
--- TortoiseMerge/SetColorPage.cpp	(revision 17056)
+++ TortoiseMerge/SetColorPage.cpp	(working copy)
@@ -44,70 +44,67 @@
 
 void CSetColorPage::SaveData()
 {
-	if (m_bInit)
-	{
-		COLORREF cBk;
-		COLORREF cFg;
+	if (!m_bInit)
+		return;
 
-		cFg = ::GetSysColor(COLOR_WINDOWTEXT);
+	COLORREF cFg = ::GetSysColor(COLOR_WINDOWTEXT);
 
-		cBk = m_cBkNormal.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkNormal.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_NORMAL, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_UNKNOWN, cBk, cFg);
+	COLORREF cBk = m_cBkNormal.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkNormal.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_NORMAL, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_UNKNOWN, cBk, cFg);
 
-		cBk = m_cBkRemoved.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkRemoved.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_REMOVED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_IDENTICALREMOVED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_THEIRSREMOVED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_YOURSREMOVED, cBk, cFg);
+	cBk = m_cBkRemoved.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkRemoved.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_REMOVED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_IDENTICALREMOVED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_THEIRSREMOVED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_YOURSREMOVED, cBk, cFg);
 
-		cBk = m_cBkAdded.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkAdded.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_ADDED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_IDENTICALADDED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_THEIRSADDED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_YOURSADDED, cBk, cFg);
+	cBk = m_cBkAdded.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkAdded.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_ADDED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_IDENTICALADDED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_THEIRSADDED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_YOURSADDED, cBk, cFg);
 
-		if ((DWORD)m_regInlineAdded != (DWORD)m_cBkInlineAdded.GetColor())
-			m_bReloadNeeded = true;
-		m_regInlineAdded = (m_cBkInlineAdded.GetColor() == -1 ? m_cBkInlineAdded.GetAutomaticColor() : m_cBkInlineAdded.GetColor());
-		if ((DWORD)m_regInlineRemoved != (DWORD)m_cBkInlineRemoved.GetColor())
-			m_bReloadNeeded = true;
-		m_regInlineRemoved = (m_cBkInlineRemoved.GetColor() == -1 ? m_cBkInlineRemoved.GetAutomaticColor() : m_cBkInlineRemoved.GetColor());
-		if ((DWORD)m_regModifiedBackground != (DWORD)m_cBkModified.GetColor())
-			m_bReloadNeeded = true;
-		m_regModifiedBackground = (m_cBkModified.GetColor() == -1 ? m_cBkModified.GetAutomaticColor() : m_cBkModified.GetColor());
+	if ((DWORD)m_regInlineAdded != (DWORD)m_cBkInlineAdded.GetColor())
+		m_bReloadNeeded = true;
+	m_regInlineAdded = (m_cBkInlineAdded.GetColor() == -1 ? m_cBkInlineAdded.GetAutomaticColor() : m_cBkInlineAdded.GetColor());
+	if ((DWORD)m_regInlineRemoved != (DWORD)m_cBkInlineRemoved.GetColor())
+		m_bReloadNeeded = true;
+	m_regInlineRemoved = (m_cBkInlineRemoved.GetColor() == -1 ? m_cBkInlineRemoved.GetAutomaticColor() : m_cBkInlineRemoved.GetColor());
+	if ((DWORD)m_regModifiedBackground != (DWORD)m_cBkModified.GetColor())
+		m_bReloadNeeded = true;
+	m_regModifiedBackground = (m_cBkModified.GetColor() == -1 ? m_cBkModified.GetAutomaticColor() : m_cBkModified.GetColor());
 
-		cBk = m_cBkEmpty.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkEmpty.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_EMPTY, cBk, cFg);
+	cBk = m_cBkEmpty.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkEmpty.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_EMPTY, cBk, cFg);
 
-		COLORREF adjustedcolor;
-		cBk = m_cBkConflict.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkConflict.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTED_IGNORED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTADDED, cBk, cFg);
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTEMPTY, adjustedcolor, cFg);
-		
-		cBk = m_cBkConflictResolved.GetColor();
-		if (cBk == -1)
-			cBk = m_cBkConflictResolved.GetAutomaticColor();
-		CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTRESOLVED, cBk, cFg);
+	COLORREF adjustedcolor;
+	cBk = m_cBkConflict.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkConflict.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTED_IGNORED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTADDED, cBk, cFg);
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTEMPTY, adjustedcolor, cFg);
 
-		cFg = m_cFgWhitespaces.GetColor();
-		if (cFg == -1)
-			cFg = m_cFgWhitespaces.GetAutomaticColor();
-		CRegDWORD regWhitespaceColor(_T("Software\\TortoiseMerge\\Colors\\Whitespace"), GetSysColor(COLOR_GRAYTEXT));
-		regWhitespaceColor = cFg;
-	}
+	cBk = m_cBkConflictResolved.GetColor();
+	if (cBk == -1)
+		cBk = m_cBkConflictResolved.GetAutomaticColor();
+	CDiffColors::GetInstance().SetColors(DIFFSTATE_CONFLICTRESOLVED, cBk, cFg);
+
+	cFg = m_cFgWhitespaces.GetColor();
+	if (cFg == -1)
+		cFg = m_cFgWhitespaces.GetAutomaticColor();
+	CRegDWORD regWhitespaceColor(_T("Software\\TortoiseMerge\\Colors\\Whitespace"), GetSysColor(COLOR_GRAYTEXT));
+	regWhitespaceColor = cFg;
 }
 
 void CSetColorPage::DoDataExchange(CDataExchange* pDX)
Index: TortoiseMerge/Settings.cpp
===================================================================
--- TortoiseMerge/Settings.cpp	(revision 17056)
+++ TortoiseMerge/Settings.cpp	(working copy)
@@ -50,7 +50,9 @@
 void CSettings::RemovePropPages()
 {
 	delete m_pMainPage;
+	m_pMainPage = 0;
 	delete m_pColorPage;
+	m_pColorPage = 0;
 }
 
 void CSettings::SaveData()
Index: TortoiseMerge/TortoiseMerge.cpp
===================================================================
--- TortoiseMerge/TortoiseMerge.cpp	(revision 17056)
+++ TortoiseMerge/TortoiseMerge.cpp	(working copy)
@@ -284,7 +284,6 @@
 		ofn.nFilterIndex = 1;
 
 		// Display the Open dialog box. 
-		CString tempfile;
 		if (GetOpenFileName(&ofn)==FALSE)
 		{
 			return FALSE;
@@ -400,7 +399,6 @@
 				ofn.nFilterIndex = 1;
 
 				// Display the Save dialog box. 
-				CString sFile;
 				if (GetSaveFileName(&ofn)==TRUE)
 				{
 					outfile = CString(ofn.lpstrFile);
Index: TortoiseMerge/Undo.cpp
===================================================================
--- TortoiseMerge/Undo.cpp	(revision 17056)
+++ TortoiseMerge/Undo.cpp	(working copy)
@@ -131,42 +131,32 @@
 	if (!pView)
 		return;
 
+	CViewData* viewData = pView->m_pViewData;
+	if (!viewData)
+		return;
+
 	for (std::list<int>::const_iterator it = state.addedlines.begin(); it != state.addedlines.end(); ++it)
 	{
-		if (pView->m_pViewData)
-			pView->m_pViewData->RemoveData(*it);
+		viewData->RemoveData(*it);
 	}
 	for (std::map<int, DWORD>::const_iterator it = state.linelines.begin(); it != state.linelines.end(); ++it)
 	{
-		if (pView->m_pViewData)
-		{
-			pView->m_pViewData->SetLineNumber(it->first, it->second);
-		}
+		viewData->SetLineNumber(it->first, it->second);
 	}
 	for (std::map<int, DWORD>::const_iterator it = state.linestates.begin(); it != state.linestates.end(); ++it)
 	{
-		if (pView->m_pViewData)
-		{
-			pView->m_pViewData->SetState(it->first, (DiffStates)it->second);
-		}
+		viewData->SetState(it->first, (DiffStates)it->second);
 	}
 	for (std::map<int, CString>::const_iterator it = state.difflines.begin(); it != state.difflines.end(); ++it)
 	{
-		if (pView->m_pViewData)
-		{
-			pView->m_pViewData->SetLine(it->first, it->second);
-		}
+		viewData->SetLine(it->first, it->second);
 	}
 	for (std::map<int, viewdata>::const_iterator it = state.removedlines.begin(); it != state.removedlines.end(); ++it)
 	{
-		if (pView->m_pViewData)
-		{
-			pView->m_pViewData->InsertData(it->first, it->second.sLine, it->second.state, it->second.linenumber, it->second.ending);
-		}
+		viewData->InsertData(it->first, it->second.sLine, it->second.state, it->second.linenumber, it->second.ending);
 	}
 }
 
-
 void CUndo::Clear()
 {
 	m_viewstates.clear();
Index: TortoiseUDiff/FindBar.cpp
===================================================================
--- TortoiseUDiff/FindBar.cpp	(revision 17056)
+++ TortoiseUDiff/FindBar.cpp	(working copy)
@@ -22,6 +22,7 @@
 #include "Registry.h"
 #include <string>
 #include <Commdlg.h>
+#include "auto_buffer.h"
 
 using namespace std;
 
@@ -85,13 +86,10 @@
 void CFindBar::DoFind(bool bFindPrev)
 {
 	int len = ::GetWindowTextLength(GetDlgItem(*this, IDC_FINDTEXT));
-	TCHAR * findtext = new TCHAR[len+1];
+	auto_buffer<TCHAR> findtext(len+1);
 	::GetWindowText(GetDlgItem(*this, IDC_FINDTEXT), findtext, len+1);
 	wstring ft = wstring(findtext);
-	delete [] findtext;
-	bool bCaseSensitive = !!SendMessage(GetDlgItem(*this, IDC_MATCHCASECHECK), BM_GETCHECK, 0, NULL);
-	if (bFindPrev)
-		::SendMessage(m_hParent, COMMITMONITOR_FINDMSGPREV, (WPARAM)bCaseSensitive, (LPARAM)ft.c_str());
-	else
-		::SendMessage(m_hParent, COMMITMONITOR_FINDMSGNEXT, (WPARAM)bCaseSensitive, (LPARAM)ft.c_str());
-}
\ No newline at end of file
+	const bool bCaseSensitive = !!SendMessage(GetDlgItem(*this, IDC_MATCHCASECHECK), BM_GETCHECK, 0, NULL);
+	const UINT message = bFindPrev ? COMMITMONITOR_FINDMSGPREV : COMMITMONITOR_FINDMSGNEXT;
+	::SendMessage(m_hParent, message, (WPARAM)bCaseSensitive, (LPARAM)ft.c_str());
+}
Index: TortoiseUDiff/MainWindow.cpp
===================================================================
--- TortoiseUDiff/MainWindow.cpp	(revision 17056)
+++ TortoiseUDiff/MainWindow.cpp	(working copy)
@@ -20,6 +20,7 @@
 #include "MainWindow.h"
 #include "UnicodeUtils.h"
 #include "StringUtils.h"
+#include "auto_buffer.h"
 
 CMainWindow::CMainWindow(HINSTANCE hInst, const WNDCLASSEX* wcx /* = NULL*/) 
 	: CWindow(hInst, wcx)
@@ -190,62 +191,10 @@
 	switch (id) 
 	{
 	case ID_FILE_OPEN:
-		{
-			OPENFILENAME ofn = {0};				// common dialog box structure
-			TCHAR szFile[MAX_PATH] = {0};		// buffer for file name
-			// Initialize OPENFILENAME
-			ofn.lStructSize = sizeof(OPENFILENAME);
-			ofn.hwndOwner = *this;
-			ofn.lpstrFile = szFile;
-			ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
-			TCHAR filter[1024];
-			LoadString(hResource, IDS_PATCHFILEFILTER, filter, sizeof(filter)/sizeof(TCHAR));
-			TCHAR * pszFilters = filter;
-			CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
-			ofn.lpstrFilter = pszFilters;
-			ofn.nFilterIndex = 1;
-			ofn.lpstrFileTitle = NULL;
-			ofn.nMaxFileTitle = 0;
-			ofn.lpstrInitialDir = NULL;
-			TCHAR opentitle[1024];
-			LoadString(hResource, IDS_OPENPATCH, opentitle, sizeof(opentitle)/sizeof(TCHAR));
-			ofn.lpstrTitle = opentitle;
-			ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ENABLESIZING | OFN_EXPLORER;
-			// Display the Open dialog box. 
-			if (GetOpenFileName(&ofn)==TRUE)
-			{
-				LoadFile(ofn.lpstrFile);
-			}
-		}
+		loadOrSaveFile(true);
 		break;
 	case ID_FILE_SAVEAS:
-		{
-			OPENFILENAME ofn = {0};				// common dialog box structure
-			TCHAR szFile[MAX_PATH] = {0};		// buffer for file name
-			// Initialize OPENFILENAME
-			ofn.lStructSize = sizeof(OPENFILENAME);
-			ofn.hwndOwner = *this;
-			ofn.lpstrFile = szFile;
-			ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
-			TCHAR filter[1024];
-			LoadString(hResource, IDS_PATCHFILEFILTER, filter, sizeof(filter)/sizeof(TCHAR));
-			TCHAR * pszFilters = filter;
-			CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
-			ofn.lpstrFilter = pszFilters;
-			ofn.nFilterIndex = 1;
-			ofn.lpstrFileTitle = NULL;
-			ofn.nMaxFileTitle = 0;
-			ofn.lpstrInitialDir = NULL;
-			TCHAR savetitle[1024];
-			LoadString(hResource, IDS_SAVEPATCH, savetitle, sizeof(savetitle)/sizeof(TCHAR));
-			ofn.lpstrTitle = savetitle;
-			ofn.Flags = OFN_OVERWRITEPROMPT | OFN_ENABLESIZING | OFN_EXPLORER;
-			// Display the Open dialog box. 
-			if (GetSaveFileName(&ofn)==TRUE)
-			{
-				SaveFile(ofn.lpstrFile);
-			}
-		}
+		loadOrSaveFile(false);
 		break;
 	case ID_FILE_EXIT:
 		::PostQuitMessage(0);
@@ -282,21 +231,19 @@
 		SendEditor(SCI_SCROLLCARET);
 		break;
 	case IDM_FINDEXIT:
+		if (IsWindowVisible(m_FindBar))
 		{
-			if (IsWindowVisible(m_FindBar))
-			{
-				RECT rect;
-				GetClientRect(*this, &rect);
-				m_bShowFindBar = false;
-				::ShowWindow(m_FindBar, SW_HIDE);
-				::SetWindowPos(m_hWndEdit, HWND_TOP, 
-					rect.left, rect.top,
-					rect.right-rect.left, rect.bottom-rect.top,
-					SWP_SHOWWINDOW);
-			}
-			else
-				PostQuitMessage(0);
+			RECT rect;
+			GetClientRect(*this, &rect);
+			m_bShowFindBar = false;
+			::ShowWindow(m_FindBar, SW_HIDE);
+			::SetWindowPos(m_hWndEdit, HWND_TOP, 
+				rect.left, rect.top,
+				rect.right-rect.left, rect.bottom-rect.top,
+				SWP_SHOWWINDOW);
 		}
+		else
+			PostQuitMessage(0);
 		break;
 	default:
 		break;
@@ -462,10 +409,9 @@
 void CMainWindow::SetTitle(LPCTSTR title)
 {
 	size_t len = _tcslen(title);
-	TCHAR * pBuf = new TCHAR[len+40];
+	auto_buffer<TCHAR> pBuf(len+40);
 	_stprintf_s(pBuf, len+40, _T("%s - TortoiseUDiff"), title);
 	SetWindowTitle(std::wstring(pBuf));
-	delete [] pBuf;
 }
 
 void CMainWindow::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face) 
@@ -549,3 +495,46 @@
 		return true;
 	return false;
 }
+
+void CMainWindow::loadOrSaveFile(bool doLoad)
+{
+	OPENFILENAME ofn = {0};				// common dialog box structure
+	TCHAR szFile[MAX_PATH] = {0};		// buffer for file name
+	// Initialize OPENFILENAME
+	ofn.lStructSize = sizeof(OPENFILENAME);
+	ofn.hwndOwner = *this;
+	ofn.lpstrFile = szFile;
+	ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
+	TCHAR filter[1024];
+	LoadString(hResource, IDS_PATCHFILEFILTER, filter, sizeof(filter)/sizeof(TCHAR));
+	TCHAR * pszFilters = filter;
+	CStringUtils::PipesToNulls(pszFilters, _tcslen(pszFilters));
+	ofn.lpstrFilter = pszFilters;
+	ofn.nFilterIndex = 1;
+	ofn.lpstrFileTitle = NULL;
+	ofn.nMaxFileTitle = 0;
+	ofn.lpstrInitialDir = NULL;
+	TCHAR fileTitle[1024];
+	LoadString(hResource, doLoad ? IDS_OPENPATCH : IDS_SAVEPATCH, fileTitle, sizeof(fileTitle)/sizeof(TCHAR));
+	ofn.lpstrTitle = fileTitle;
+	ofn.Flags = OFN_ENABLESIZING | OFN_EXPLORER;
+	if(doLoad)
+		ofn.Flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+	else
+		ofn.Flags |= OFN_OVERWRITEPROMPT;
+	// Display the Open dialog box.
+	if( doLoad )
+	{
+		if (GetOpenFileName(&ofn)==TRUE)
+		{
+			LoadFile(ofn.lpstrFile);
+		}
+	}
+	else
+	{
+		if (GetSaveFileName(&ofn)==TRUE)
+		{
+			SaveFile(ofn.lpstrFile);
+		}
+	}
+}
Index: TortoiseUDiff/MainWindow.h
===================================================================
--- TortoiseUDiff/MainWindow.h	(revision 17056)
+++ TortoiseUDiff/MainWindow.h	(working copy)
@@ -72,4 +72,6 @@
 	bool				m_bShowFindBar;
 	bool				m_bMatchCase;
 	wstring				m_findtext;
+
+	void loadOrSaveFile( bool doLoad );
 };
Index: Utils/MiscUI/ProgressDlg.cpp
===================================================================
--- Utils/MiscUI/ProgressDlg.cpp	(revision 17056)
+++ Utils/MiscUI/ProgressDlg.cpp	(working copy)
@@ -43,18 +43,18 @@
 
 bool CProgressDlg::EnsureValid()
 {
-	if (!m_bValid)
-	{
-		HRESULT hr;
+	if(m_bValid)
+		return true;
 
-		hr = CoCreateInstance (CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER,
-			IID_IProgressDialog, (void**)&m_pIDlg);
+	HRESULT hr = CoCreateInstance (CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER,
+		IID_IProgressDialog, (void**)&m_pIDlg);
 
-		if (SUCCEEDED(hr))
-			m_bValid = true;				//instance successfully created
-	}
+	if (SUCCEEDED(hr))
+		m_bValid = true;				//instance successfully created
+
 	return m_bValid;
 }
+
 void CProgressDlg::SetTitle(LPCTSTR szTitle)
 {
     USES_CONVERSION;
@@ -188,34 +188,32 @@
 HRESULT CProgressDlg::ShowModeless(HWND hWndParent, BOOL immediately)
 {
 	EnsureValid();
-	HRESULT hr = E_FAIL;
 	m_hWndProgDlg = NULL;
-	if (m_bValid)
-	{
-		hr = m_pIDlg->StartProgressDialog(hWndParent, NULL, m_dwDlgFlags, NULL);
+	if (!m_bValid)
+		return E_FAIL;
 
-		if (SUCCEEDED(hr))
-		{
-			m_isVisible = true;
+	HRESULT hr = m_pIDlg->StartProgressDialog(hWndParent, NULL, m_dwDlgFlags, NULL);
+	if(FAILED(hr))
+		return hr;
 
-			if (immediately)
-			{
-				// The progress window can be remarkably slow to display, particularly
-				// if its parent is blocked.
-				// This process finds the hwnd for the progress window and gives it a kick...
-				IOleWindow *pOleWindow;
-				HRESULT hr2 = m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);
-				if(SUCCEEDED(hr2))
-				{
-					hr2 = pOleWindow->GetWindow(&m_hWndProgDlg);
-					if(SUCCEEDED(hr2))
-					{
-						ShowWindow(m_hWndProgDlg, SW_NORMAL);
-					}
-					pOleWindow->Release();
-				}
-			}
+	m_isVisible = true;
+
+	if (!immediately)
+		return hr;
+
+	// The progress window can be remarkably slow to display, particularly
+	// if its parent is blocked.
+	// This process finds the hwnd for the progress window and gives it a kick...
+	IOleWindow *pOleWindow;
+	HRESULT hr2 = m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);
+	if(SUCCEEDED(hr2))
+	{
+		hr2 = pOleWindow->GetWindow(&m_hWndProgDlg);
+		if(SUCCEEDED(hr2))
+		{
+			ShowWindow(m_hWndProgDlg, SW_NORMAL);
 		}
+		pOleWindow->Release();
 	}
 	return hr;
 }
@@ -228,7 +226,6 @@
 	}
 }
 
-
 void CProgressDlg::SetProgress64(ULONGLONG u64Progress, ULONGLONG u64ProgressMax)
 {
 	if (m_bValid)
@@ -237,14 +234,12 @@
 	}
 }
 
-
 bool CProgressDlg::HasUserCancelled()
 {
-	if (m_bValid)
-	{
-		return (0 != m_pIDlg->HasUserCancelled());
-	}
-	return FALSE;
+	if (!m_bValid)
+		return false;
+
+	return (0 != m_pIDlg->HasUserCancelled());
 }
 
 void CProgressDlg::Stop()
