diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/ScoreboardUpdater.java b/connector/src/main/java/org/geysermc/connector/scoreboard/ScoreboardUpdater.java
index 2fb21337e..a7d936513 100644
--- a/connector/src/main/java/org/geysermc/connector/scoreboard/ScoreboardUpdater.java
+++ b/connector/src/main/java/org/geysermc/connector/scoreboard/ScoreboardUpdater.java
@@ -62,82 +62,88 @@ public final class ScoreboardUpdater extends Thread {
     @Override
     public void run() {
         while (!connector.isShuttingDown()) {
-            long timeTillAction = getTimeTillNextAction();
-            if (timeTillAction > 0) {
-                sleepFor(timeTillAction);
-                continue;
-            }
+            try {
+                long timeTillAction = getTimeTillNextAction();
+                if (timeTillAction > 0) {
+                    sleepFor(timeTillAction);
+                    continue;
+                }
 
-            long currentTime = System.currentTimeMillis();
+                long currentTime = System.currentTimeMillis();
 
-            // reset score-packets per second every second
-            if (currentTime - lastPacketsPerSecondUpdate >= 1000) {
-                lastPacketsPerSecondUpdate = currentTime;
-                for (GeyserSession session : connector.getPlayers()) {
-                    ScoreboardSession scoreboardSession = session.getWorldCache().getScoreboardSession();
+                // reset score-packets per second every second
+                if (currentTime - lastPacketsPerSecondUpdate >= 1000) {
+                    lastPacketsPerSecondUpdate = currentTime;
+                    for (GeyserSession session : connector.getPlayers()) {
+                        ScoreboardSession scoreboardSession = session.getWorldCache().getScoreboardSession();
 
-                    int oldPps = scoreboardSession.getPacketsPerSecond();
-                    int newPps = scoreboardSession.getPendingPacketsPerSecond().get();
+                        int oldPps = scoreboardSession.getPacketsPerSecond();
+                        int newPps = scoreboardSession.getPendingPacketsPerSecond().get();
 
-                    scoreboardSession.packetsPerSecond = newPps;
-                    scoreboardSession.pendingPacketsPerSecond.set(0);
+                        scoreboardSession.packetsPerSecond = newPps;
+                        scoreboardSession.pendingPacketsPerSecond.set(0);
 
-                    // just making sure that all updates are pushed before giving up control
-                    if (oldPps >= FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD &&
-                            newPps < FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD) {
-                        session.getWorldCache().getScoreboard().onUpdate();
+                        // just making sure that all updates are pushed before giving up control
+                        if (oldPps >= FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD &&
+                                newPps < FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD) {
+                            session.getWorldCache().getScoreboard().onUpdate();
+                        }
                     }
                 }
-            }
 
-            if (currentTime - lastUpdate >= FIRST_MILLIS_BETWEEN_UPDATES) {
-                lastUpdate = currentTime;
+                if (currentTime - lastUpdate >= FIRST_MILLIS_BETWEEN_UPDATES) {
+                    lastUpdate = currentTime;
 
-                for (GeyserSession session : connector.getPlayers()) {
-                    WorldCache worldCache = session.getWorldCache();
-                    ScoreboardSession scoreboardSession = worldCache.getScoreboardSession();
+                    for (GeyserSession session : connector.getPlayers()) {
+                        WorldCache worldCache = session.getWorldCache();
+                        ScoreboardSession scoreboardSession = worldCache.getScoreboardSession();
 
-                    int pps = scoreboardSession.getPacketsPerSecond();
-                    if (pps >= FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD) {
-                        boolean reachedSecondThreshold = pps >= SECOND_SCORE_PACKETS_PER_SECOND_THRESHOLD;
+                        int pps = scoreboardSession.getPacketsPerSecond();
+                        if (pps >= FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD) {
+                            boolean reachedSecondThreshold = pps >= SECOND_SCORE_PACKETS_PER_SECOND_THRESHOLD;
 
-                        int millisBetweenUpdates = reachedSecondThreshold ?
-                                SECOND_MILLIS_BETWEEN_UPDATES :
-                                FIRST_MILLIS_BETWEEN_UPDATES;
+                            int millisBetweenUpdates = reachedSecondThreshold ?
+                                    SECOND_MILLIS_BETWEEN_UPDATES :
+                                    FIRST_MILLIS_BETWEEN_UPDATES;
 
-                        if (currentTime - scoreboardSession.lastUpdate >= millisBetweenUpdates) {
-                            worldCache.getScoreboard().onUpdate();
-                            scoreboardSession.lastUpdate = currentTime;
+                            if (currentTime - scoreboardSession.lastUpdate >= millisBetweenUpdates) {
+                                worldCache.getScoreboard().onUpdate();
+                                scoreboardSession.lastUpdate = currentTime;
 
-                            if (DEBUG_ENABLED && (currentTime - scoreboardSession.lastLog >= 60000)) { // one minute
-                                int threshold = reachedSecondThreshold ?
-                                        SECOND_SCORE_PACKETS_PER_SECOND_THRESHOLD :
-                                        FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD;
+                                if (DEBUG_ENABLED && (currentTime - scoreboardSession.lastLog >= 60000)) { // one minute
+                                    int threshold = reachedSecondThreshold ?
+                                            SECOND_SCORE_PACKETS_PER_SECOND_THRESHOLD :
+                                            FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD;
 
-                                connector.getLogger().info(
-                                        LanguageUtils.getLocaleStringLog("geyser.scoreboard.updater.threshold_reached.log", session.getName(), threshold, pps) +
-                                                LanguageUtils.getLocaleStringLog("geyser.scoreboard.updater.threshold_reached", (millisBetweenUpdates / 1000.0))
-                                );
+                                    connector.getLogger().info(
+                                            LanguageUtils.getLocaleStringLog("geyser.scoreboard.updater.threshold_reached.log", session.getName(), threshold, pps) +
+                                                    LanguageUtils.getLocaleStringLog("geyser.scoreboard.updater.threshold_reached", (millisBetweenUpdates / 1000.0))
+                                    );
 
-                                scoreboardSession.lastLog = currentTime;
+                                    scoreboardSession.lastLog = currentTime;
+                                }
                             }
                         }
                     }
                 }
-            }
 
-            if (DEBUG_ENABLED) {
-                long timeSpent = System.currentTimeMillis() - currentTime;
-                if (timeSpent > 0) {
-                    connector.getLogger().info(String.format(
-                            "Scoreboard updater: took %s ms. Updated %s players",
-                            timeSpent, connector.getPlayers().size()
-                    ));
+                if (DEBUG_ENABLED) {
+                    long timeSpent = System.currentTimeMillis() - currentTime;
+                    if (timeSpent > 0) {
+                        connector.getLogger().info(String.format(
+                                "Scoreboard updater: took %s ms. Updated %s players",
+                                timeSpent, connector.getPlayers().size()
+                        ));
+                    }
                 }
-            }
 
-            long timeTillNextAction = getTimeTillNextAction();
-            sleepFor(timeTillNextAction);
+                long timeTillNextAction = getTimeTillNextAction();
+                sleepFor(timeTillNextAction);
+            } catch (Throwable e) {
+                connector.getLogger().error("Error while translating scoreboard information!", e);
+                // Wait so we don't try to run the scoreboard immediately after this
+                sleepFor(FIRST_MILLIS_BETWEEN_UPDATES);
+            }
         }
     }