diff --git a/src/baserunning.lua b/src/baserunning.lua
index 7e91680..f976218 100644
--- a/src/baserunning.lua
+++ b/src/baserunning.lua
@@ -80,8 +80,17 @@ function Baserunning:outEligibleRunners(fielder)
     local touchedBase = utils.isTouchingBase(fielder.x, fielder.y)
     local didOutRunner = false
 
+    local runnerBaseBiMap = {}
+    for _, runner in pairs(self.runners) do
+        local theTouchedBase = utils.isTouchingBase(runner.x, runner.y)
+        if theTouchedBase ~= nil and runnerBaseBiMap[theTouchedBase] == nil then
+            runnerBaseBiMap[runner] = theTouchedBase
+            runnerBaseBiMap[theTouchedBase] = runner
+        end
+    end
+
     for i, runner in pairs(self.runners) do
-        local runnerOnBase = utils.isTouchingBase(runner.x, runner.y)
+        local runnerOnBase = runnerBaseBiMap[runner]
         if -- Force out
             touchedBase
                 and runner.prevBase -- Make sure the runner is not standing at home
diff --git a/src/graphics.lua b/src/graphics.lua
index 7b2130e..6698e5e 100644
--- a/src/graphics.lua
+++ b/src/graphics.lua
@@ -2,9 +2,11 @@ local gfx <const> = playdate.graphics
 
 local ButtonFont <const> = gfx.font.new("fonts/font-full-circle.pft")
 
---- Assumes that background image is of size
+--- Assumes that background image is of size:
+---
 --- XXX
 --- XOX
+---
 --- Where each character is the size of the screen, and 'O' is the default view.
 function getDrawOffset(ballX, ballY)
     local offsetX, offsetY
diff --git a/src/test/setup.lua b/src/test/setup.lua
index a66116b..d90a619 100644
--- a/src/test/setup.lua
+++ b/src/test/setup.lua
@@ -11,3 +11,28 @@ local _f = require("fielding")
 Fielding, newFielder = _f[1], _f[2]
 
 HomeTeamSpriteGroup = {}
+
+-- Print contents of `tbl`, with indentation.
+-- `indent` sets the initial level of indentation.
+function str(tbl, indent, nl)
+    if not indent then
+        indent = 1
+    end
+    nl = nl or "\n"
+
+    if type(tbl) == "table" then
+        local indentStr = string.rep("  ", indent)
+        local ret = "{" .. nl
+        for k, v in pairs(tbl) do
+            --ret = ret .. indentStr .. "[" .. str(k, -9999, "") .. "]" .. ": " .. str(v, indent + 1, nl) .. "," .. nl
+            ret = ret .. indentStr .. "[" .. tostring(k) .. "]" .. ": " .. tostring(v) .. "," .. nl
+        end
+        return ret .. indentStr .. nl .. "}"
+    else
+        return tostring(tbl)
+    end
+end
+
+function printTable(tbl)
+    print(str(tbl))
+end
diff --git a/src/test/testBaserunning.lua b/src/test/testBaserunning.lua
index d2d2692..16974d3 100644
--- a/src/test/testBaserunning.lua
+++ b/src/test/testBaserunning.lua
@@ -42,22 +42,21 @@ end
 
 ---@alias Condition { fielderWithBallAt: XyPair, outWhen: BaseIndexOrXyPair[][], safeWhen: BaseIndexOrXyPair[][] }
 
----@param expected boolean
+---@param expectedOuts number
 ---@param fielderWithBallAt XyPair
 ---@param when number[][]
-function assertRunnerOutCondition(expected, when, fielderWithBallAt)
-    local msg = expected and "out" or "safe"
+function assertRunnerOutCondition(expectedOuts, when, fielderWithBallAt)
     for _, runnersOn in ipairs(when) do
         local baserunning = buildRunnersOn(runnersOn)
-        local outedSomeRunner = baserunning:outEligibleRunners(fielderWithBallAt)
-        luaunit.failIf(outedSomeRunner ~= expected, "Runner should have been " .. msg .. ", but was not!")
+        baserunning:outEligibleRunners(fielderWithBallAt)
+        luaunit.assertEquals(expectedOuts, baserunning.outs, "Incorrect number of outs.")
     end
 end
 
 ---@param condition Condition
 function assertRunnerStatuses(condition)
-    assertRunnerOutCondition(true, condition.outWhen, condition.fielderWithBallAt)
-    assertRunnerOutCondition(false, condition.safeWhen, condition.fielderWithBallAt)
+    assertRunnerOutCondition(1, condition.outWhen, condition.fielderWithBallAt)
+    assertRunnerOutCondition(0, condition.safeWhen, condition.fielderWithBallAt)
 end
 
 function testForceOutsAtFirst()
@@ -157,4 +156,18 @@ function testTagOutsShouldNotHappenOnBase()
     })
 end
 
+function testTagOutsWithMultipleRunnersOnOneBase()
+    assertRunnerStatuses({
+        fielderWithBallAt = C.Bases[C.Third],
+        outWhen = {
+            { 3, 3 },
+        },
+        safeWhen = {
+            { 1, 1 },
+            { 2, 2 },
+            { 4, 4 },
+        },
+    })
+end
+
 os.exit(luaunit.LuaUnit.run())
diff --git a/src/test/testGraphics.lua b/src/test/testGraphics.lua
index 0adfd75..dc5da05 100644
--- a/src/test/testGraphics.lua
+++ b/src/test/testGraphics.lua
@@ -3,9 +3,9 @@ require("graphics")
 
 local function assertSmallDifference(previous, current, ballValue, ballLabel)
     local difference = math.abs(previous - current)
-    local baseError = "Expected a small difference, but received a difference of "
+    local baseError = "Expected a small difference, but received a difference of " .. difference
     local fullDetails = luaunit.prettystr({ previous = previous, current = current, [ballLabel] = ballValue })
-    luaunit.assertIsTrue(difference < 2, baseError .. difference .. ":\n  " .. luaunit.prettystr(fullDetails))
+    luaunit.assertIsTrue(difference < 2, baseError .. ":\n  " .. luaunit.prettystr(fullDetails))
 end
 
 function testNoJumpsInYOffset()