diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs
index d7a2a4617e..3c25850cf5 100644
--- a/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs
+++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs
@@ -164,7 +164,7 @@ namespace BizHawk.Client.Common
 			if (!batch.Where(a => a.GetType() != typeof(MovieActionMarker)).Any())
 				return Movie.InputLogLength;
 
-			return PreviousUndoFrame;
+			return PreviousRedoFrame;
 		}
 
 		public bool CanUndo { get { return UndoIndex > -1; } }
@@ -180,7 +180,7 @@ namespace BizHawk.Client.Common
 				if (History[UndoIndex + 1].Count == 0)
 					return Movie.InputLogLength;
 
-				return History[UndoIndex + 1].Max(a => a.FirstFrame);
+				return History[UndoIndex + 1].Min(a => a.FirstFrame);
 			}
 		}
 		public int PreviousRedoFrame
@@ -193,7 +193,7 @@ namespace BizHawk.Client.Common
 				if (History[UndoIndex].Count == 0)
 					return Movie.InputLogLength;
 
-				return History[UndoIndex].Max(a => a.FirstFrame);
+				return History[UndoIndex].Min(a => a.FirstFrame);
 			}
 		}
 
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs
index 1f858029e8..0950e6d2f2 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs
@@ -61,7 +61,7 @@ namespace BizHawk.Client.EmuHawk
 		{
 			get
 			{
-				if (BranchView.SelectedRows.Any())
+				if (BranchView.AnyRowsSelected)
 				{
 					return Branches[BranchView.SelectedRows.First()];
 				}
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
index 9600f8d375..751eba5bb5 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
@@ -18,7 +18,7 @@ namespace BizHawk.Client.EmuHawk
 	public class InputRoll : Control
 	{
 		private readonly GDIRenderer Gdi;
-		private readonly List<Cell> SelectedItems = new List<Cell>();
+		private readonly SortedSet<Cell> SelectedItems = new SortedSet<Cell>(new sortCell());
 
 		private readonly VScrollBar VBar;
 		private readonly HScrollBar HBar;
@@ -448,8 +448,8 @@ namespace BizHawk.Client.EmuHawk
 				}
 				else
 				{
-					var items = SelectedItems.Where(cell => cell.RowIndex == index);
-					SelectedItems.RemoveAll(items.Contains);
+					IEnumerable<Cell> items = SelectedItems.Where(cell => cell.RowIndex == index);
+					SelectedItems.RemoveWhere(items.Contains);
 				}
 			}
 		}
@@ -471,7 +471,7 @@ namespace BizHawk.Client.EmuHawk
 		}
 		public void TruncateSelection(int index)
 		{
-			SelectedItems.RemoveAll(cell => cell.RowIndex > index);
+			SelectedItems.RemoveWhere(cell => cell.RowIndex > index);
 		}
 
 		[Browsable(false)]
@@ -490,11 +490,9 @@ namespace BizHawk.Client.EmuHawk
 		{
 			get
 			{
-				if (SelectedRows.Any())
+				if (AnyRowsSelected)
 				{
-					return SelectedRows
-						.OrderBy(x => x)
-						.First();
+					return SelectedRows.Min();
 				}
 
 				return null;
@@ -507,11 +505,9 @@ namespace BizHawk.Client.EmuHawk
 		{
 			get
 			{
-				if (SelectedRows.Any())
+				if (AnyRowsSelected)
 				{
-					return SelectedRows
-						.OrderBy(x => x)
-						.Last();
+					return SelectedRows.Max();
 				}
 
 				return null;
@@ -852,6 +848,13 @@ namespace BizHawk.Client.EmuHawk
 					.Distinct();
 			}
 		}
+		public bool AnyRowsSelected
+		{
+			get
+			{
+				return SelectedItems.Any(cell => cell.RowIndex.HasValue);
+			}
+		}
 
 		public void ClearSelectedRows()
 		{
@@ -998,7 +1001,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void DrawData(PaintEventArgs e)
 		{
-			var columns = _columns.VisibleColumns.ToList();
+			List<RollColumn> columns = _columns.VisibleColumns.ToList();
 			if (QueryItemText != null)
 			{
 				if (HorizontalOrientation)
@@ -1300,12 +1303,12 @@ namespace BizHawk.Client.EmuHawk
 		{
 			// SuuperW: This allows user to see other colors in selected frames.
 			Color Highlight_Color = new Color();
-			foreach (var cell in SelectedItems)
+			foreach (Cell cell in SelectedItems)
 			{
 				if (cell.RowIndex > LastVisibleRow || cell.RowIndex < FirstVisibleRow)
 					continue;
 
-				var relativeCell = new Cell
+				Cell relativeCell = new Cell
 				{
 					RowIndex = cell.RowIndex - FirstVisibleRow,
 					Column = cell.Column,
@@ -1366,7 +1369,7 @@ namespace BizHawk.Client.EmuHawk
 		/// <param name="e"></param>
 		private void DoBackGroundCallback(PaintEventArgs e)
 		{
-			var columns = _columns.VisibleColumns.ToList();
+			List<RollColumn> columns = _columns.VisibleColumns.ToList();
 
 			if (HorizontalOrientation)
 			{
@@ -2588,6 +2591,33 @@ namespace BizHawk.Client.EmuHawk
 			}
 		}
 
+		private class sortCell : IComparer<Cell>
+		{
+			int IComparer<Cell>.Compare(Cell a, Cell b)
+			{
+				Cell c1 = a as Cell;
+				Cell c2 = b as Cell;
+				if (c1.RowIndex.HasValue)
+				{
+					if (c2.RowIndex.HasValue)
+					{
+						int row = c1.RowIndex.Value.CompareTo(c2.RowIndex.Value);
+						if (row == 0)
+						{
+							return c1.Column.Name.CompareTo(c2.Column.Name);
+						}
+						else
+							return row;
+					}
+					else
+						return 1;
+				}
+				else if (c2.RowIndex.HasValue)
+					return -1;
+				else
+					return c1.Column.Name.CompareTo(c2.Column.Name);
+			}
+		}
 		#endregion
 	}
 }
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
index b2d6d99bcf..bf16f2b32b 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
@@ -156,7 +156,7 @@ namespace BizHawk.Client.EmuHawk
 
 		public void EditMarker()
 		{
-			if (MarkerView.SelectedRows.Any())
+			if (MarkerView.AnyRowsSelected)
 			{
 				var index = MarkerView.SelectedRows.First();
 				var marker = Tastudio.CurrentTasMovie.Markers[index];
@@ -179,7 +179,7 @@ namespace BizHawk.Client.EmuHawk
 
 		public int SelectedMarkerFrame()
 		{
-			if (MarkerView.SelectedRows.Any())
+			if (MarkerView.AnyRowsSelected)
 			{
 				var index = MarkerView.SelectedRows.First();
 				var marker = Tastudio.CurrentTasMovie.Markers[index];
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
index aa935dfabd..db867a0d46 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
@@ -228,7 +228,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void TasView_ColumnClick(object sender, InputRoll.ColumnClickEventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var columnName = e.Column.Name;
 
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs
index 6325904708..6aa951a17a 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs
@@ -123,7 +123,7 @@ namespace BizHawk.Client.EmuHawk
 			if (TasView.LastSelectedIndex == CurrentTasMovie.InputLogLength)
 				TasView.SelectRow(CurrentTasMovie.InputLogLength, false);
 
-			if (!TasView.SelectedRows.Any())
+			if (!TasView.AnyRowsSelected)
 				return;
 
 			MovieZone macro = new MovieZone(CurrentTasMovie, TasView.FirstSelectedIndex.Value,
@@ -132,7 +132,7 @@ namespace BizHawk.Client.EmuHawk
 		}
 		private void placeMacroAtSelectionToolStripMenuItem_Click(object sender, EventArgs e)
 		{
-			if (!TasView.SelectedRows.Any())
+			if (!TasView.AnyRowsSelected)
 				return;
 
 			MovieZone macro = MacroInputTool.LoadMacro();
@@ -207,7 +207,7 @@ namespace BizHawk.Client.EmuHawk
 			DeleteFramesMenuItem.Enabled =
 			CloneMenuItem.Enabled =
 			TruncateMenuItem.Enabled =
-				TasView.SelectedRows.Any();
+				TasView.AnyRowsSelected;
 			ReselectClipboardMenuItem.Enabled =
 				PasteMenuItem.Enabled =
 				PasteInsertMenuItem.Enabled =
@@ -235,7 +235,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var prevMarker = CurrentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex.Value);
 				var nextMarker = CurrentTasMovie.Markers.Next(TasView.LastSelectedIndex.Value);
@@ -265,7 +265,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void CopyMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				_tasClipboard.Clear();
 				var list = TasView.SelectedRows.ToList();
@@ -348,7 +348,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void CutMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var wasPaused = GlobalWin.MainForm.EmulatorPaused;
 				var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@@ -392,7 +392,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void ClearMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				bool wasPaused = GlobalWin.MainForm.EmulatorPaused;
 				bool needsToRollback = !(TasView.FirstSelectedIndex > Emulator.Frame);
@@ -426,7 +426,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void DeleteFramesMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var wasPaused = GlobalWin.MainForm.EmulatorPaused;
 				var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@@ -461,7 +461,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void CloneMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var wasPaused = GlobalWin.MainForm.EmulatorPaused;
 				var framesToInsert = TasView.SelectedRows.ToList();
@@ -496,7 +496,7 @@ namespace BizHawk.Client.EmuHawk
 		private void InsertFrameMenuItem_Click(object sender, EventArgs e)
 		{
 			var wasPaused = GlobalWin.MainForm.EmulatorPaused;
-			var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
+			var insertionFrame = TasView.AnyRowsSelected ? TasView.FirstSelectedIndex.Value : 0;
 			var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
 
 			CurrentTasMovie.InsertEmptyFrame(insertionFrame);
@@ -522,7 +522,7 @@ namespace BizHawk.Client.EmuHawk
 		private void InsertNumFramesMenuItem_Click(object sender, EventArgs e)
 		{
 			bool wasPaused = GlobalWin.MainForm.EmulatorPaused;
-			int insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
+			int insertionFrame = TasView.AnyRowsSelected ? TasView.FirstSelectedIndex.Value : 0;
 			bool needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
 
 			FramesPrompt framesPrompt = new FramesPrompt();
@@ -552,7 +552,7 @@ namespace BizHawk.Client.EmuHawk
 
 		private void TruncateMenuItem_Click(object sender, EventArgs e)
 		{
-			if (TasView.SelectedRows.Any())
+			if (TasView.AnyRowsSelected)
 			{
 				var rollbackFrame = TasView.LastSelectedIndex.Value;
 				var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@@ -981,7 +981,7 @@ namespace BizHawk.Client.EmuHawk
 				InsertFrameContextMenuItem.Enabled =
 				InsertNumFramesContextMenuItem.Enabled =
 				TruncateContextMenuItem.Enabled =
-				TasView.SelectedRows.Any();
+				TasView.AnyRowsSelected;
 
 			StartFromNowSeparator.Visible =
 				StartNewProjectFromNowMenuItem.Visible =
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
index 1c2feb91de..afe0ecbcce 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
@@ -469,7 +469,7 @@ namespace BizHawk.Client.EmuHawk
 		}
 		private void DummyLoadMacro(string path)
 		{
-			if (!TasView.SelectedRows.Any())
+			if (!TasView.AnyRowsSelected)
 				return;
 
 			MovieZone loadZone = new MovieZone(path);
@@ -803,7 +803,7 @@ namespace BizHawk.Client.EmuHawk
 			EditMarkerContextMenuItem.Enabled =
 			RemoveMarkerContextMenuItem.Enabled =
 			ScrollToMarkerToolStripMenuItem.Enabled =
-				MarkerControl.MarkerInputRoll.SelectedRows.Any();
+				MarkerControl.MarkerInputRoll.AnyRowsSelected;
 		}
 
 		private void ScrollToMarkerToolStripMenuItem_Click(object sender, EventArgs e)