---
 .../freecol/client/control/InGameController.java   |  36 ++++---
 .../freecol/client/control/PreGameController.java  |   3 +-
 src/net/sf/freecol/client/gui/GrayLayer.java       |   4 +-
 src/net/sf/freecol/client/gui/ModifierFormat.java  |   3 +-
 .../freecol/client/gui/dialog/PreCombatDialog.java |   3 +-
 .../sf/freecol/client/gui/menu/InGameMenuBar.java  |   3 +-
 .../freecol/client/gui/panel/BuildQueuePanel.java  |   6 +-
 .../client/gui/panel/WorkProductionPanel.java      |   3 +-
 .../gui/panel/colopedia/FatherDetailPanel.java     |   6 +-
 .../report/ReportContinentalCongressPanel.java     |   8 +-
 .../gui/panel/report/ReportExplorationPanel.java   |   6 +-
 .../gui/panel/report/ReportHistoryPanel.java       |   3 +-
 .../freecol/client/gui/tooltip/RebelToolTip.java   |   3 +-
 src/net/sf/freecol/common/model/Building.java      |  10 +-
 src/net/sf/freecol/common/model/BuildingType.java  |   2 +-
 src/net/sf/freecol/common/model/Colony.java        |  16 +--
 src/net/sf/freecol/common/model/ColonyTile.java    |   2 +-
 src/net/sf/freecol/common/model/Europe.java        |   2 +-
 src/net/sf/freecol/common/model/Feature.java       |  69 +++++++------
 .../sf/freecol/common/model/FeatureContainer.java  |  18 ++--
 src/net/sf/freecol/common/model/FreeColObject.java |  23 +++--
 src/net/sf/freecol/common/model/Game.java          |  14 ++-
 src/net/sf/freecol/common/model/HighScore.java     |   4 +-
 src/net/sf/freecol/common/model/HistoryEvent.java  |  14 +--
 src/net/sf/freecol/common/model/LastSale.java      |  12 +--
 .../sf/freecol/common/model/LostCityRumour.java    |   4 +-
 src/net/sf/freecol/common/model/Modifier.java      |  14 +--
 src/net/sf/freecol/common/model/Monarch.java       |   6 +-
 src/net/sf/freecol/common/model/Operand.java       |   2 +-
 src/net/sf/freecol/common/model/Player.java        |  10 +-
 .../sf/freecol/common/model/ProductionCache.java   |   2 +-
 src/net/sf/freecol/common/model/Region.java        |  15 ++-
 src/net/sf/freecol/common/model/Resource.java      |   2 +-
 src/net/sf/freecol/common/model/Role.java          |   4 +-
 src/net/sf/freecol/common/model/Settlement.java    |   2 +-
 .../sf/freecol/common/model/SimpleCombatModel.java |   8 +-
 src/net/sf/freecol/common/model/Specification.java |   3 +-
 src/net/sf/freecol/common/model/Tile.java          |   4 +-
 .../freecol/common/model/TileImprovementType.java  |   2 +-
 src/net/sf/freecol/common/model/TileType.java      |   2 +-
 src/net/sf/freecol/common/model/Turn.java          | 111 ++-------------------
 src/net/sf/freecol/common/model/Unit.java          |  13 ++-
 src/net/sf/freecol/common/model/UnitType.java      |   5 +-
 src/net/sf/freecol/common/model/WorkLocation.java  |   2 +-
 .../freecol/common/networking/NewTurnMessage.java  |   5 +-
 src/net/sf/freecol/server/ai/AIColony.java         |  16 +--
 src/net/sf/freecol/server/ai/EuropeanAIPlayer.java |  20 ++--
 src/net/sf/freecol/server/ai/NativeAIPlayer.java   |  10 +-
 src/net/sf/freecol/server/ai/goal/Goal.java        |   5 +-
 .../freecol/server/control/InGameController.java   |  10 +-
 src/net/sf/freecol/server/model/ServerGame.java    |   2 +-
 .../server/model/ServerIndianSettlement.java       |   2 +-
 src/net/sf/freecol/server/model/ServerPlayer.java  |  12 +--
 src/net/sf/freecol/server/model/ServerRegion.java  |   4 +-
 src/net/sf/freecol/server/model/ServerUnit.java    |   2 +-
 .../net/sf/freecol/common/model/BuildingTest.java  |   4 +-
 .../net/sf/freecol/common/model/ColonyTest.java    |   2 +-
 test/src/net/sf/freecol/common/model/GameTest.java |  10 +-
 .../net/sf/freecol/common/model/ModifierTest.java  |  47 +++++----
 .../net/sf/freecol/common/model/MonarchTest.java   |   2 +-
 test/src/net/sf/freecol/common/model/TileTest.java |   2 +-
 .../freecol/server/generator/MapGeneratorTest.java |   2 +-
 .../sf/freecol/server/model/ServerPlayerTest.java  |   8 +-
 63 files changed, 274 insertions(+), 375 deletions(-)

diff --git a/src/net/sf/freecol/client/control/InGameController.java 
b/src/net/sf/freecol/client/control/InGameController.java
index e8ba77ef074..c68d418a4d5 100644
--- a/src/net/sf/freecol/client/control/InGameController.java
+++ b/src/net/sf/freecol/client/control/InGameController.java
@@ -510,10 +510,10 @@ public final class InGameController extends 
FreeColClientHolder {
     private String getSaveGameString(Game game) {
         final Player player = getMyPlayer();
         final String gid = Integer.toHexString(game.getUUID().hashCode());
-        final Turn turn = game.getTurn();
+        final int turn = game.getTurn();
         return (/* player.getName() + "_" */ gid
             + "_" + Messages.message(player.getNationLabel())
-            + "_" + turn.getSaveGameSuffix()
+            + "_" + Turn.getSaveGameSuffix(turn)
             + "." + FreeCol.FREECOL_SAVE_EXTENSION)
             .replaceAll(" ", "_");
     }
@@ -561,7 +561,7 @@ public final class InGameController extends 
FreeColClientHolder {
 
         // conditional save after user-set period
         int saveGamePeriod = options.getInteger(ClientOptions.AUTOSAVE_PERIOD);
-        int turnNumber = game.getTurn().getNumber();
+        int turnNumber = game.getTurn();
         if (saveGamePeriod >= 1 && turnNumber % saveGamePeriod == 0) {
             String fileName = prefix + "-" + getSaveGameString(game);
             saveGame(FreeColDirectories.getAutosaveFile(fileName));
@@ -613,8 +613,8 @@ public final class InGameController extends 
FreeColClientHolder {
      * @param key The key for a message to ignore.
      * @param turn The current {@code Turn}.
      */
-    private synchronized void startIgnoringMessage(String key, Turn turn) {
-        messagesToIgnore.put(key, turn.getNumber());
+    private synchronized void startIgnoringMessage(String key, int turn) {
+        messagesToIgnore.put(key, turn);
         logger.finer("Ignore message start: " + key);
     }
 
@@ -633,8 +633,8 @@ public final class InGameController extends 
FreeColClientHolder {
      *
      * @param turn The {@code Turn} value to test against.
      */
-    private synchronized void reapIgnoredMessages(Turn turn) {
-        removeInPlace(messagesToIgnore, e -> e.getValue() < turn.getNumber());
+    private synchronized void reapIgnoredMessages(int turn) {
+        removeInPlace(messagesToIgnore, e -> e.getValue() < turn);
     }
 
     /**
@@ -645,11 +645,11 @@ public final class InGameController extends 
FreeColClientHolder {
      * @param turn The current {@code Turn}.
      * @return True if the message should continue to be ignored.
      */
-    private synchronized boolean continueIgnoreMessage(String key, Turn turn) {
+    private synchronized boolean continueIgnoreMessage(String key, int turn) {
         Integer value;
         if (key != null
             && (value = messagesToIgnore.get(key)) != null
-            && value + 1 == turn.getNumber()) {
+            && value + 1 == turn) {
             messagesToIgnore.put(key, value + 1);
             logger.finer("Ignore message continue: " + key);
             return true;
@@ -674,7 +674,7 @@ public final class InGameController extends 
FreeColClientHolder {
     public boolean displayModelMessages(final boolean allMessages,
                                         final boolean endOfTurn) {
         final Player player = getMyPlayer();
-        final Turn thisTurn = getGame().getTurn();
+        final int thisTurn = getGame().getTurn();
         final ArrayList<ModelMessage> messages = new ArrayList<>();
 
         for (ModelMessage m : ((allMessages) ? player.getModelMessages()
@@ -3328,7 +3328,7 @@ public final class InGameController extends 
FreeColClientHolder {
             || (key = message.getIgnoredMessageKey()) == null) return false;
 
         if (flag) {
-            final Turn turn = getGame().getTurn();
+            final int turn = getGame().getTurn();
             if (!continueIgnoreMessage(key, turn)) {
                 startIgnoringMessage(key, turn);
             }
@@ -4094,20 +4094,18 @@ public final class InGameController extends 
FreeColClientHolder {
             logger.warning("Bad turn in newTurn: " + turn);
             return false;
         }
-        Turn newTurn = new Turn(turn);
-        game.setTurn(newTurn);
-        logger.info("New turn: " + newTurn + "/" + turn);
+        game.setTurn(turn);
+        logger.info("New turn: " + turn);
 
         if (getClientOptions().getBoolean(ClientOptions.AUDIO_ALERTS)) {
             sound("sound.event.alertSound");
         }
 
-        final Turn currTurn = game.getTurn();
-        if (currTurn.isFirstSeasonTurn()) {
+        if (turn == Turn.FIRST_TURN) {
             player.addModelMessage(new ModelMessage(MessageType.WARNING,
                                                     "twoTurnsPerYear", player)
-                .addStringTemplate("%year%", currTurn.getLabel())
-                .addAmount("%amount%", currTurn.getSeasonNumber()));
+                .addStringTemplate("%year%", Turn.getLabel(turn))
+                .addAmount("%amount%", Turn.getSeasonNumber()));
         }
         player.clearNationCache();
         return true;
@@ -4597,7 +4595,7 @@ public final class InGameController extends 
FreeColClientHolder {
 
             // Save the game (if it isn't newly loaded)
             if (getFreeColServer() != null
-                && game.getTurn().getNumber() > 0) autoSaveGame();
+                && game.getTurn() > 0) autoSaveGame();
 
             // Get turn report out quickly before more message display occurs.
             player.removeDisplayedModelMessages();
diff --git a/src/net/sf/freecol/client/control/PreGameController.java 
b/src/net/sf/freecol/client/control/PreGameController.java
index 3db4269c65f..33709012e08 100644
--- a/src/net/sf/freecol/client/control/PreGameController.java
+++ b/src/net/sf/freecol/client/control/PreGameController.java
@@ -37,6 +37,7 @@ import net.sf.freecol.common.model.NationType;
 import net.sf.freecol.common.model.Player;
 import net.sf.freecol.common.model.StringTemplate;
 import net.sf.freecol.common.model.Tile;
+import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.model.Unit;
 import net.sf.freecol.common.option.GameOptions;
 import net.sf.freecol.common.option.MapGeneratorOptions;
@@ -188,7 +189,7 @@ public final class PreGameController extends 
FreeColClientHolder {
         }
 
         // Tutorial message if needed
-        if (game.getTurn().getNumber() == 1) {
+        if (game.getTurn() == Turn.FIRST_TURN) {
             player.addStartGameMessage();
         }
         igc().nextModelMessage();
diff --git a/src/net/sf/freecol/client/gui/GrayLayer.java 
b/src/net/sf/freecol/client/gui/GrayLayer.java
index 1d3c9e34741..99af3fe0c35 100644
--- a/src/net/sf/freecol/client/gui/GrayLayer.java
+++ b/src/net/sf/freecol/client/gui/GrayLayer.java
@@ -34,6 +34,7 @@ import net.sf.freecol.client.FreeColClient;
 import net.sf.freecol.client.gui.panel.InfoPanel;
 import net.sf.freecol.common.i18n.Messages;
 import net.sf.freecol.common.model.Player;
+import net.sf.freecol.common.model.Turn;
 
 
 /**
@@ -101,8 +102,7 @@ public class GrayLayer extends Component {
         Color colour = null;
 
         if (player == null) {
-            message = Messages.message(freeColClient.getGame().getTurn()
-                .getLabel());
+            message = 
Messages.message(Turn.getLabel(freeColClient.getGame().getTurn()));
             colour = Color.WHITE;
 
         } else {
diff --git a/src/net/sf/freecol/client/gui/ModifierFormat.java 
b/src/net/sf/freecol/client/gui/ModifierFormat.java
index c15c78808dd..8483f51b16c 100644
--- a/src/net/sf/freecol/client/gui/ModifierFormat.java
+++ b/src/net/sf/freecol/client/gui/ModifierFormat.java
@@ -34,7 +34,6 @@ import net.sf.freecol.common.model.Modifier.ModifierType;
 import net.sf.freecol.common.model.Nameable;
 import net.sf.freecol.common.model.Named;
 import net.sf.freecol.common.model.Scope;
-import net.sf.freecol.common.model.Turn;
 import static net.sf.freecol.common.util.CollectionUtils.*;
 
 
@@ -100,7 +99,7 @@ public class ModifierFormat {
 
     public static JLabel[] getModifierLabels(Modifier modifier,
                                              FreeColSpecObjectType fcgot,
-                                             Turn turn) {
+                                             int turn) {
         String sourceName = getSourceName(modifier.getSource());
         if (fcgot != null && modifier.appliesTo(fcgot)) {
             sourceName += " (" + Messages.getName(fcgot) + ")";
diff --git a/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java 
b/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java
index cd4161a6c63..3a9c6fdb200 100644
--- a/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java
+++ b/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java
@@ -42,7 +42,6 @@ import net.sf.freecol.common.model.FreeColGameObject;
 import net.sf.freecol.common.model.Game;
 import net.sf.freecol.common.model.Modifier;
 import net.sf.freecol.common.model.Settlement;
-import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.model.Unit;
 import static net.sf.freecol.common.util.CollectionUtils.*;
 
@@ -68,7 +67,7 @@ public class PreCombatDialog extends FreeColConfirmDialog {
         final ImageLibrary lib = freeColClient.getGUI().getImageLibrary();
         final Game game = attacker.getGame();
         final CombatModel combatModel = game.getCombatModel();
-        final Turn turn = game.getTurn();
+        final int turn = game.getTurn();
         final Set<Modifier> attackModifiers
             = combatModel.getOffensiveModifiers(attacker, defender);
         final Set<Modifier> defenceModifiers
diff --git a/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java 
b/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java
index 856ee5f4142..ba8ffcf4437 100644
--- a/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java
+++ b/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java
@@ -97,6 +97,7 @@ import net.sf.freecol.common.debug.FreeColDebugger;
 import net.sf.freecol.common.i18n.Messages;
 import net.sf.freecol.common.model.StringTemplate;
 import net.sf.freecol.common.model.TileImprovementType;
+import net.sf.freecol.common.model.Turn;
 
 
 /**
@@ -333,7 +334,7 @@ public class InGameMenuBar extends FreeColMenuBar {
                     .addAmount("%score%",
                         freeColClient.getMyPlayer().getScore())
                     .addStringTemplate("%year%",
-                        freeColClient.getGame().getTurn().getLabel()));
+                        Turn.getLabel(freeColClient.getGame().getTurn())));
             Rectangle2D displayStringBounds
                 = g2d.getFontMetrics().getStringBounds(displayString, g);
             int y = 
Math.round(12f*freeColClient.getGUI().getImageLibrary().getScaleFactor())
diff --git a/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java 
b/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java
index b68c3b05add..f1b6237fbd9 100644
--- a/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java
+++ b/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java
@@ -738,7 +738,7 @@ public class BuildQueuePanel extends FreeColPanel 
implements ItemListener {
         forEachMapEntry(bt.getRequiredAbilities(), e -> {
                 final String id = e.getKey();
                 final boolean value = e.getValue();
-                if (this.featureContainer.hasAbility(id, null, null) != value
+                if (this.featureContainer.hasAbility(id, null, Turn.UNDEFINED) 
!= value
                     && this.colony.hasAbility(id) != value) {
                     FreeColSpecObjectType source
                         = first(spec.getTypesProviding(id, value));
@@ -839,7 +839,7 @@ public class BuildQueuePanel extends FreeColPanel 
implements ItemListener {
      */
     private void updateUnitList() {
         final Specification spec = getSpecification();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         DefaultListModel<UnitType> units
             = (DefaultListModel<UnitType>)this.unitList.getModel();
         units.clear();
@@ -869,7 +869,7 @@ public class BuildQueuePanel extends FreeColPanel 
implements ItemListener {
             if (!checkAbilities(ut, reasons)) unbuildableTypes.add(ut);
 
             // Missing unit build ability?
-            if (!this.featureContainer.hasAbility(Ability.BUILD, ut, null)
+            if (!this.featureContainer.hasAbility(Ability.BUILD, ut, 
Turn.UNDEFINED)
                 && !this.colony.hasAbility(Ability.BUILD, ut, turn)) {
                 Ability buildAbility = find(spec.getAbilities(Ability.BUILD),
                     a -> (a.appliesTo(ut)
diff --git a/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java 
b/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java
index b6e97ba4339..db0d21a1a76 100644
--- a/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java
@@ -38,7 +38,6 @@ import net.sf.freecol.common.model.GoodsType;
 import net.sf.freecol.common.model.Modifier;
 import net.sf.freecol.common.model.Tile;
 import net.sf.freecol.common.model.TileType;
-import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.model.Unit;
 import net.sf.freecol.common.model.UnitType;
 import net.sf.freecol.common.model.WorkLocation;
@@ -50,7 +49,7 @@ import static net.sf.freecol.common.util.CollectionUtils.*;
  */
 public class WorkProductionPanel extends FreeColPanel {
 
-    private final Turn turn = getGame().getTurn();
+    private final int turn = getGame().getTurn();
 
 
     /**
diff --git 
a/src/net/sf/freecol/client/gui/panel/colopedia/FatherDetailPanel.java 
b/src/net/sf/freecol/client/gui/panel/colopedia/FatherDetailPanel.java
index 6cd2769876c..ae317b0e155 100644
--- a/src/net/sf/freecol/client/gui/panel/colopedia/FatherDetailPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/colopedia/FatherDetailPanel.java
@@ -153,13 +153,13 @@ public class FatherDetailPanel
             .add(father.getId() + ".birthAndDeath")
             .addName("] ")
             .add(father.getId() + ".text");
-        final Turn turn = getMyPlayer().getElectionTurns().get(name);
-        if (turn != null) {
+        final int turn = getMyPlayer().getElectionTurns().get(name);
+        if (turn != Turn.UNDEFINED) {
             template
                 .addName("\n\n")
                 .add("report.continentalCongress.elected")
                 .addName(" ")
-                .addStringTemplate(turn.getLabel());
+                .addStringTemplate(Turn.getLabel(turn));
         }
 
         panel.add(header, "span, align center, wrap 40");
diff --git 
a/src/net/sf/freecol/client/gui/panel/report/ReportContinentalCongressPanel.java
 
b/src/net/sf/freecol/client/gui/panel/report/ReportContinentalCongressPanel.java
index 5bfbde184bd..dad5b540479 100644
--- 
a/src/net/sf/freecol/client/gui/panel/report/ReportContinentalCongressPanel.java
+++ 
b/src/net/sf/freecol/client/gui/panel/report/ReportContinentalCongressPanel.java
@@ -109,12 +109,12 @@ public final class ReportContinentalCongressPanel extends 
ReportPanel {
                         imageScrollPane, null);
         }
         final int age = getGame().getAge();
-        Map<String, Turn> electionTurns = getMyPlayer().getElectionTurns();
+        Map<String, Integer> electionTurns = getMyPlayer().getElectionTurns();
         for (FoundingFather father : getSpecification().getFoundingFathers()) {
             String name = Messages.getName(father);
             JPanel panel = panels.get(father.getType());
             Image image;
-            Turn turn = null;
+            int turn = Turn.UNDEFINED;
             if (player.hasFather(father)) {
                 image = ImageLibrary.getFoundingFatherImage(father, false);
                 turn = electionTurns.get(Messages.nameKey(father));
@@ -126,10 +126,10 @@ public final class ReportContinentalCongressPanel extends 
ReportPanel {
                                                    null, father.getId());
             button.addActionListener(this);
             panel.add(button);
-            panel.add((turn != null)
+            panel.add((turn != Turn.UNDEFINED)
                 ? Utility.localizedLabel(StringTemplate
                     .template("report.continentalCongress.elected")
-                    .addStringTemplate("%turn%", turn.getLabel()))
+                    .addStringTemplate("%turn%", Turn.getLabel(turn)))
                 : (father == currentFather)
                 ? 
Utility.localizedLabel("report.continentalCongress.recruiting")
                 : 
Utility.localizedLabel("report.continentalCongress.available"));
diff --git 
a/src/net/sf/freecol/client/gui/panel/report/ReportExplorationPanel.java 
b/src/net/sf/freecol/client/gui/panel/report/ReportExplorationPanel.java
index e314fd6a064..7ebd2363eca 100644
--- a/src/net/sf/freecol/client/gui/panel/report/ReportExplorationPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/report/ReportExplorationPanel.java
@@ -31,6 +31,7 @@ import net.sf.freecol.client.FreeColClient;
 import net.sf.freecol.client.gui.FontLibrary;
 import net.sf.freecol.client.gui.panel.*;
 import net.sf.freecol.common.model.Region;
+import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.util.*;
 
 import static net.sf.freecol.common.util.CollectionUtils.*;
@@ -44,7 +45,7 @@ public final class ReportExplorationPanel extends ReportPanel 
{
     /** Comparator for discovered regions, by descending turn and score. */
     private static final Comparator<Region> regionComparator
         = Comparator.comparingInt((Region r) ->
-            r.getDiscoveredIn().getNumber()).reversed()
+            r.getDiscoveredIn()).reversed()
                 .thenComparingInt(Region::getScoreValue).reversed();
 
 
@@ -86,8 +87,7 @@ public final class ReportExplorationPanel extends ReportPanel 
{
                                        Function.identity(), regionComparator)) 
{
             reportPanel.add(new JLabel(region.getName()));
             
reportPanel.add(Utility.localizedLabel(region.getType().getNameKey()));
-            reportPanel.add(Utility.localizedLabel(region.getDiscoveredIn()
-                    .getLabel()));
+            
reportPanel.add(Utility.localizedLabel(Turn.getLabel(region.getDiscoveredIn())));
             reportPanel.add(Utility.localizedLabel(region.getDiscoveredBy()
                     .getCountryLabel()));
             reportPanel.add(new 
JLabel(String.valueOf(region.getScoreValue())));
diff --git a/src/net/sf/freecol/client/gui/panel/report/ReportHistoryPanel.java 
b/src/net/sf/freecol/client/gui/panel/report/ReportHistoryPanel.java
index 0b1e7d01a44..a3cf39d947c 100644
--- a/src/net/sf/freecol/client/gui/panel/report/ReportHistoryPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/report/ReportHistoryPanel.java
@@ -26,6 +26,7 @@ import net.miginfocom.swing.MigLayout;
 import net.sf.freecol.client.FreeColClient;
 import net.sf.freecol.client.gui.panel.*;
 import net.sf.freecol.common.model.HistoryEvent;
+import net.sf.freecol.common.model.Turn;
 
 
 /**
@@ -50,7 +51,7 @@ public final class ReportHistoryPanel extends ReportPanel {
         reportPanel.setLayout(new MigLayout("wrap 2", "[]20[fill]", ""));
 
         for (HistoryEvent event : history) {
-            
reportPanel.add(Utility.localizedLabel(event.getTurn().getLabel()));
+            
reportPanel.add(Utility.localizedLabel(Turn.getLabel(event.getTurn())));
             reportPanel.add(Utility.localizedTextArea(event, 40));
         }
     }
diff --git a/src/net/sf/freecol/client/gui/tooltip/RebelToolTip.java 
b/src/net/sf/freecol/client/gui/tooltip/RebelToolTip.java
index 797e6214641..dc58b8e6c84 100644
--- a/src/net/sf/freecol/client/gui/tooltip/RebelToolTip.java
+++ b/src/net/sf/freecol/client/gui/tooltip/RebelToolTip.java
@@ -38,7 +38,6 @@ import net.sf.freecol.common.model.GoodsType;
 import net.sf.freecol.common.model.Modifier;
 import net.sf.freecol.common.model.Specification;
 import net.sf.freecol.common.model.StringTemplate;
-import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.option.GameOptions;
 
 import static net.sf.freecol.common.util.CollectionUtils.*;
@@ -60,7 +59,7 @@ public class RebelToolTip extends JToolTip {
         final int population = colony.getUnitCount();
         final int solPercent = colony.getSoL();
         final int rebels = Colony.calculateRebels(population, solPercent);
-        final Turn turn = colony.getGame().getTurn();
+        final int turn = colony.getGame().getTurn();
         StringTemplate t;
 
         setLayout(new MigLayout("fill, wrap 3", "[300px][50px, right][50px, 
right]", ""));
diff --git a/src/net/sf/freecol/common/model/Building.java 
b/src/net/sf/freecol/common/model/Building.java
index e07c180fc93..cb8bf9a1935 100644
--- a/src/net/sf/freecol/common/model/Building.java
+++ b/src/net/sf/freecol/common/model/Building.java
@@ -148,7 +148,7 @@ public class Building extends WorkLocation
      * @return A stream of the applicable modifiers.
      */
     public Stream<Modifier> getCompetenceModifiers(String id,
-        UnitType unitType, Turn turn) {
+        UnitType unitType, int turn) {
         final float competence = getCompetenceFactor();
         return (competence == 1.0f) // Floating comparison OK!
             ? unitType.getModifiers(id, getType(), turn)
@@ -246,7 +246,7 @@ public class Building extends WorkLocation
         ProductionInfo result = new ProductionInfo();
         if (!hasOutputs()) return result;
         final Specification spec = getSpecification();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final boolean avoidOverflow
             = hasAbility(Ability.AVOID_EXCESS_PRODUCTION);
         final int capacity = getColony().getWarehouseCapacity();
@@ -566,7 +566,7 @@ public class Building extends WorkLocation
         final String id = (goodsType == null) ? null : goodsType.getId();
         final Colony colony = getColony();
         final Player owner = getOwner();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
 
         return (unitType != null)
             // With a unit, unit specific bonuses apply
@@ -642,7 +642,7 @@ public class Building extends WorkLocation
      */
     @Override
     public Stream<Ability> getAbilities(String id, FreeColSpecObjectType type,
-                                        Turn turn) {
+                                        int turn) {
         // Buildings have no abilities independent of their type (for now).
         return getType().getAbilities(id, type, turn);
     }
@@ -652,7 +652,7 @@ public class Building extends WorkLocation
      */
     @Override
     public Stream<Modifier> getModifiers(String id, FreeColSpecObjectType 
fcgot,
-                                         Turn turn) {
+                                         int turn) {
         // Buildings have no modifiers independent of type
         return getType().getModifiers(id, fcgot, turn);
     }
diff --git a/src/net/sf/freecol/common/model/BuildingType.java 
b/src/net/sf/freecol/common/model/BuildingType.java
index 60d7d83efa5..9c6556fbde9 100644
--- a/src/net/sf/freecol/common/model/BuildingType.java
+++ b/src/net/sf/freecol/common/model/BuildingType.java
@@ -337,7 +337,7 @@ public final class BuildingType extends BuildableType
                                       UnitType unitType) {
         if (goodsType == null) return 0;
         int amount = getBaseProduction(null, goodsType, unitType);
-        amount = (int)applyModifiers(amount, null, goodsType.getId(),
+        amount = (int)applyModifiers(amount, Turn.UNDEFINED, goodsType.getId(),
                 unitType);
         return (amount < 0) ? 0 : amount;
     }
diff --git a/src/net/sf/freecol/common/model/Colony.java 
b/src/net/sf/freecol/common/model/Colony.java
index c471e6971b8..62d557aa6d8 100644
--- a/src/net/sf/freecol/common/model/Colony.java
+++ b/src/net/sf/freecol/common/model/Colony.java
@@ -134,7 +134,7 @@ public class Colony extends Settlement implements Nameable, 
TradeLocation {
     protected int immigration;
 
     /** The turn in which this colony was established. */
-    protected Turn established = new Turn(0);
+    protected int established = 0;
 
     /** A list of items to be built. */
     protected final BuildQueue<BuildableType> buildQueue
@@ -316,7 +316,7 @@ public class Colony extends Settlement implements Nameable, 
TradeLocation {
      *
      * @return The establishment {@code Turn}.
      */
-    public Turn getEstablished() {
+    public int getEstablished() {
         return established;
     }
 
@@ -325,7 +325,7 @@ public class Colony extends Settlement implements Nameable, 
TradeLocation {
      *
      * @param newEstablished The new {@code Turn} of establishment.
      */
-    public void setEstablished(final Turn newEstablished) {
+    public void setEstablished(final int newEstablished) {
         this.established = newEstablished;
     }
 
@@ -2317,7 +2317,7 @@ public class Colony extends Settlement implements 
Nameable, TradeLocation {
      * @param amount The amount of modification.
      */
     private void modifySpecialGoods(GoodsType goodsType, int amount) {
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         List<Modifier> mods;
 
         mods = toList(goodsType.getModifiers(Modifier.LIBERTY));
@@ -2399,8 +2399,8 @@ public class Colony extends Settlement implements 
Nameable, TradeLocation {
      */
     @Override
     public Stream<Ability> getAbilities(String id, FreeColSpecObjectType type,
-                                        Turn turn) {
-        if (turn == null) turn = getGame().getTurn();
+                                        int turn) {
+        if (turn == Turn.UNDEFINED) turn = getGame().getTurn();
         return concat(super.getAbilities(id, type, turn),
                 ((owner == null) ? Stream.<Ability>empty()
                         : owner.getAbilities(id, type, turn)));
@@ -2902,7 +2902,7 @@ public class Colony extends Settlement implements 
Nameable, TradeLocation {
         // Delegated from Settlement
         xw.writeAttribute(NAME_TAG, getName());
 
-        xw.writeAttribute(ESTABLISHED_TAG, established.getNumber());
+        xw.writeAttribute(ESTABLISHED_TAG, established);
 
         // SoL has to be visible for the popular support bonus to be
         // visible to an attacking rebel player.
@@ -2987,7 +2987,7 @@ public class Colony extends Settlement implements 
Nameable, TradeLocation {
     public void readAttributes(FreeColXMLReader xr) throws XMLStreamException {
         super.readAttributes(xr);
 
-        established = new Turn(xr.getAttribute(ESTABLISHED_TAG, 0));
+        established = xr.getAttribute(ESTABLISHED_TAG, 0);
 
         sonsOfLiberty = xr.getAttribute(SONS_OF_LIBERTY_TAG, 0);
 
diff --git a/src/net/sf/freecol/common/model/ColonyTile.java 
b/src/net/sf/freecol/common/model/ColonyTile.java
index c6411f593b0..a422065d766 100644
--- a/src/net/sf/freecol/common/model/ColonyTile.java
+++ b/src/net/sf/freecol/common/model/ColonyTile.java
@@ -459,7 +459,7 @@ public class ColonyTile extends WorkLocation {
         final String id = goodsType.getId();
         final Colony colony = getColony();
         final Player owner = colony.getOwner();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         return (unitType != null)
             // Unit modifiers apply
             ? concat(workTile.getProductionModifiers(goodsType, unitType),
diff --git a/src/net/sf/freecol/common/model/Europe.java 
b/src/net/sf/freecol/common/model/Europe.java
index 9c6c3bb0c43..47ba746c0f4 100644
--- a/src/net/sf/freecol/common/model/Europe.java
+++ b/src/net/sf/freecol/common/model/Europe.java
@@ -506,7 +506,7 @@ public class Europe extends UnitLocation
      */
     @Override
     public Stream<Ability> getAbilities(String id, FreeColSpecObjectType fcgot,
-                                        Turn turn) {
+                                        int turn) {
         return concat(super.getAbilities(id, fcgot, turn),
             // Always able to dress a missionary.
             ((id == null || Ability.DRESS_MISSIONARY.equals(id))
diff --git a/src/net/sf/freecol/common/model/Feature.java 
b/src/net/sf/freecol/common/model/Feature.java
index 80819246769..8d38e15f2b2 100644
--- a/src/net/sf/freecol/common/model/Feature.java
+++ b/src/net/sf/freecol/common/model/Feature.java
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException;
 import net.sf.freecol.common.i18n.Messages;
 import net.sf.freecol.common.io.FreeColXMLReader;
 import net.sf.freecol.common.io.FreeColXMLWriter;
+import net.sf.freecol.common.model.Turn;
 import static net.sf.freecol.common.util.CollectionUtils.*;
 import net.sf.freecol.common.util.Utils;
 
@@ -45,10 +46,10 @@ public abstract class Feature extends FreeColSpecObject
     private FreeColObject source;
 
     /** The first Turn in which this Feature applies. */
-    private Turn firstTurn;
+    private int firstTurn;
 
     /** The last Turn in which this Feature applies. */
-    private Turn lastTurn;
+    private int lastTurn;
 
     /** The duration of this Feature. By default, the duration is unlimited. */
     private int duration = 0;
@@ -99,7 +100,7 @@ public abstract class Feature extends FreeColSpecObject
      * @return True if the feature is time limited.
      */
     public final boolean hasTimeLimit() {
-        return (firstTurn != null || lastTurn != null);
+        return (firstTurn != Turn.UNDEFINED || lastTurn != Turn.UNDEFINED);
     }
 
     /**
@@ -107,7 +108,7 @@ public abstract class Feature extends FreeColSpecObject
      *
      * @return The first turn, or null if none.
      */
-    public final Turn getFirstTurn() {
+    public final int getFirstTurn() {
         return firstTurn;
     }
 
@@ -116,7 +117,7 @@ public abstract class Feature extends FreeColSpecObject
      *
      * @param newFirstTurn The new first turn value.
      */
-    public final void setFirstTurn(final Turn newFirstTurn) {
+    public final void setFirstTurn(final int newFirstTurn) {
         this.firstTurn = newFirstTurn;
     }
 
@@ -125,7 +126,7 @@ public abstract class Feature extends FreeColSpecObject
      *
      * @return The last turn, or null if none.
      */
-    public final Turn getLastTurn() {
+    public final int getLastTurn() {
         return lastTurn;
     }
 
@@ -134,7 +135,7 @@ public abstract class Feature extends FreeColSpecObject
      *
      * @param newLastTurn The new last turn value.
      */
-    public final void setLastTurn(final Turn newLastTurn) {
+    public final void setLastTurn(final int newLastTurn) {
         this.lastTurn = newLastTurn;
     }
 
@@ -210,10 +211,10 @@ public abstract class Feature extends FreeColSpecObject
      * @param turn The {@code Turn} to test.
      * @return True if the turn is null or not outside a valid time limit.
      */
-    protected boolean appliesTo(final Turn turn) {
-        return !(turn != null
-            && (firstTurn != null && turn.getNumber() < firstTurn.getNumber()
-                || lastTurn != null && turn.getNumber() > 
lastTurn.getNumber()));
+    protected boolean appliesTo(final int turn) {
+        return !(turn != Turn.UNDEFINED
+            && (firstTurn != Turn.UNDEFINED && turn < firstTurn
+                || lastTurn != Turn.UNDEFINED && turn > lastTurn));
     }
 
     /**
@@ -224,7 +225,7 @@ public abstract class Feature extends FreeColSpecObject
      * @return True if the feature applies.
      */
     protected boolean appliesTo(final FreeColSpecObjectType objectType,
-                                final Turn turn) {
+                                final int turn) {
         return appliesTo(turn) && appliesTo(objectType);
     }
 
@@ -235,9 +236,9 @@ public abstract class Feature extends FreeColSpecObject
      * @return True if the Feature has an lastTurn turn smaller than the
      *     given turn.
      */
-    public boolean isOutOfDate(Turn turn) {
-        return turn != null && lastTurn != null
-            && turn.getNumber() > lastTurn.getNumber();
+    public boolean isOutOfDate(int turn) {
+        return turn != Turn.UNDEFINED && lastTurn != Turn.UNDEFINED
+            && turn > lastTurn;
     }
 
     /**
@@ -332,13 +333,11 @@ public abstract class Feature extends FreeColSpecObject
             xw.writeAttribute(SOURCE_TAG, getSource());
         }
 
-        if (getFirstTurn() != null) {
-            xw.writeAttribute(FIRST_TURN_TAG, getFirstTurn().getNumber());
-        }
+        if (getFirstTurn() != Turn.UNDEFINED)
+            xw.writeAttribute(FIRST_TURN_TAG, getFirstTurn());
 
-        if (getLastTurn() != null) {
-            xw.writeAttribute(LAST_TURN_TAG, getLastTurn().getNumber());
-        }
+        if (getLastTurn() != Turn.UNDEFINED)
+            xw.writeAttribute(LAST_TURN_TAG, getLastTurn());
 
         if (duration != 0) {
             xw.writeAttribute(DURATION_TAG, duration);
@@ -375,11 +374,11 @@ public abstract class Feature extends FreeColSpecObject
             setSource(spec.findType(str));
         }
 
-        int firstTurn = xr.getAttribute(FIRST_TURN_TAG, UNDEFINED);
-        if (firstTurn != UNDEFINED) setFirstTurn(new Turn(firstTurn));
+        int firstTurn = xr.getAttribute(FIRST_TURN_TAG, Turn.UNDEFINED);
+        if (firstTurn != Turn.UNDEFINED) setFirstTurn(firstTurn);
 
-        int lastTurn = xr.getAttribute(LAST_TURN_TAG, UNDEFINED);
-        if (lastTurn != UNDEFINED) setLastTurn(new Turn(lastTurn));
+        int lastTurn = xr.getAttribute(LAST_TURN_TAG, Turn.UNDEFINED);
+        if (lastTurn != Turn.UNDEFINED) setLastTurn(lastTurn);
 
         duration = xr.getAttribute(DURATION_TAG, 0);
 
@@ -431,18 +430,18 @@ public abstract class Feature extends FreeColSpecObject
                 || this.duration != feature.duration
                 || this.temporary != feature.temporary)
                 return false;
-            if (firstTurn == null) {
-                if (feature.firstTurn != null) return false;
-            } else if (feature.firstTurn == null) {
+            if (firstTurn == Turn.UNDEFINED) {
+                if (feature.firstTurn != Turn.UNDEFINED) return false;
+            } else if (feature.firstTurn == Turn.UNDEFINED) {
                 return false;
-            } else if (firstTurn.getNumber() != feature.firstTurn.getNumber()) 
{
+            } else if (firstTurn != feature.firstTurn) {
                 return false;
             }
-            if (lastTurn == null) {
-                if (feature.lastTurn != null) return false;
-            } else if (feature.lastTurn == null) {
+            if (lastTurn == Turn.UNDEFINED) {
+                if (feature.lastTurn != Turn.UNDEFINED) return false;
+            } else if (feature.lastTurn == Turn.UNDEFINED) {
                 return false;
-            } else if (lastTurn.getNumber() != feature.lastTurn.getNumber()) {
+            } else if (lastTurn != feature.lastTurn) {
                 return false;
             }
             List<Scope> tScopes = getScopeList();
@@ -464,8 +463,8 @@ public abstract class Feature extends FreeColSpecObject
     public int hashCode() {
         int hash = super.hashCode();
         hash += 31 * hash + Utils.hashCode(source);
-        hash += 31 * hash + ((firstTurn == null) ? 0 : firstTurn.getNumber());
-        hash += 31 * hash + ((lastTurn == null) ? 0 : lastTurn.getNumber());
+        hash += 31 * hash + ((firstTurn == Turn.UNDEFINED) ? 0 : firstTurn);
+        hash += 31 * hash + ((lastTurn == Turn.UNDEFINED) ? 0 : lastTurn);
         hash += 31 * hash + duration;
         hash += 31 * ((temporary) ? 1 : 0);
         // FIXME: is this safe?  It is an easy way to ignore
diff --git a/src/net/sf/freecol/common/model/FeatureContainer.java 
b/src/net/sf/freecol/common/model/FeatureContainer.java
index c76a4969a17..69eec27393c 100644
--- a/src/net/sf/freecol/common/model/FeatureContainer.java
+++ b/src/net/sf/freecol/common/model/FeatureContainer.java
@@ -124,7 +124,7 @@ public final class FeatureContainer {
      * @return True if the ability is present.
      */
     public boolean hasAbility(String id, FreeColSpecObjectType fcgot,
-                              Turn turn) {
+                              int turn) {
         return FeatureContainer.hasAbility(getAbilities(id, fcgot, turn));
     }
 
@@ -139,7 +139,7 @@ public final class FeatureContainer {
      * @return A stream of abilities.
      */
     public Stream<Ability> getAbilities(String id, FreeColSpecObjectType fcgot,
-                                        Turn turn) {
+                                        int turn) {
         Set<Ability> result = new HashSet<>();
         if (abilitiesPresent()) {
             synchronized (abilitiesLock) {
@@ -220,7 +220,7 @@ public final class FeatureContainer {
      */
     public Stream<Modifier> getModifiers(String id,
                                          FreeColSpecObjectType fcgot,
-                                         Turn turn) {
+                                         int turn) {
         if (!modifiersPresent()) return Stream.<Modifier>empty();
         Set<Modifier> mset = new HashSet<>();
         synchronized (modifiersLock) {
@@ -246,7 +246,7 @@ public final class FeatureContainer {
      *     modifier applies to.
      * @return The modified number.
      */
-    public final float applyModifiers(float number, Turn turn,
+    public final float applyModifiers(float number, int turn,
                                       String id, FreeColSpecObjectType fcgot) {
         return applyModifiers(number, turn, getModifiers(id, fcgot, turn));
     }
@@ -259,7 +259,7 @@ public final class FeatureContainer {
      * @param mods The {@code Modifier}s to apply.
      * @return The modified number.
      */
-    public static float applyModifiers(float number, Turn turn,
+    public static float applyModifiers(float number, int turn,
                                        Collection<Modifier> mods) {
         return (mods == null || mods.isEmpty()) ? number
             : applyModifiers_internal(number, turn,
@@ -466,7 +466,7 @@ public final class FeatureContainer {
      */
     public void replaceSource(FreeColSpecObjectType oldSource,
                               FreeColSpecObjectType newSource) {
-        for (Ability ability : transform(getAbilities(null, null, null),
+        for (Ability ability : transform(getAbilities(null, null, 
Turn.UNDEFINED),
                 a -> oldSource == null || a.getSource() == oldSource)) {
             removeAbility(ability);
             Ability newAbility = new Ability(ability);
@@ -474,7 +474,7 @@ public final class FeatureContainer {
             addAbility(newAbility);
         }
 
-        for (Modifier modifier : transform(getModifiers(null, null, null),
+        for (Modifier modifier : transform(getModifiers(null, null, 
Turn.UNDEFINED),
                 m -> oldSource == null || m.getSource() == oldSource)) {
             removeModifier(modifier);
             Modifier newModifier = new Modifier(modifier);
@@ -494,7 +494,7 @@ public final class FeatureContainer {
         StringBuilder sb = new StringBuilder(256);
         sb.append("[FeatureContainer");
         int siz = sb.length();
-        for (Ability ability : iterable(getAbilities(null, null, null))) {
+        for (Ability ability : iterable(getAbilities(null, null, 
Turn.UNDEFINED))) {
             sb.append(' ').append(ability);
         }
         if (sb.length() > siz) {
@@ -502,7 +502,7 @@ public final class FeatureContainer {
             sb.append(']');
         }
         siz = sb.length();
-        for (Modifier modifier : iterable(getModifiers(null, null, null))) {
+        for (Modifier modifier : iterable(getModifiers(null, null, 
Turn.UNDEFINED))) {
             sb.append(' ').append(modifier);
         }
         if (sb.length() > siz) {
diff --git a/src/net/sf/freecol/common/model/FreeColObject.java 
b/src/net/sf/freecol/common/model/FreeColObject.java
index 72af78d16f8..45dd1d8a85b 100644
--- a/src/net/sf/freecol/common/model/FreeColObject.java
+++ b/src/net/sf/freecol/common/model/FreeColObject.java
@@ -42,6 +42,7 @@ import net.sf.freecol.common.ObjectWithId;
 import net.sf.freecol.common.io.FreeColXMLReader;
 import net.sf.freecol.common.io.FreeColXMLWriter;
 import net.sf.freecol.common.io.FreeColXMLWriter.WriteScope;
+import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.util.Introspector;
 import net.sf.freecol.common.util.LogBuilder;
 import static net.sf.freecol.common.util.CollectionUtils.*;
@@ -394,7 +395,7 @@ public abstract class FreeColObject
      * @return True if the ability is present.
      */
     public final boolean hasAbility(String id, FreeColSpecObjectType fcgot) {
-        return hasAbility(id, fcgot, null);
+        return hasAbility(id, fcgot, Turn.UNDEFINED);
     }
 
     /**
@@ -407,7 +408,7 @@ public abstract class FreeColObject
      * @return True if the ability is present.
      */
     public final boolean hasAbility(String id, FreeColSpecObjectType fcgot,
-                                    Turn turn) {
+                                    int turn) {
         return FeatureContainer.hasAbility(getAbilities(id, fcgot, turn));
     }
 
@@ -449,7 +450,7 @@ public abstract class FreeColObject
      */
     public final Stream<Ability> getAbilities(String id,
                                               FreeColSpecObjectType fcgot) {
-        return getAbilities(id, fcgot, null);
+        return getAbilities(id, fcgot, Turn.UNDEFINED);
     }
 
     /**
@@ -465,7 +466,7 @@ public abstract class FreeColObject
      */
     public Stream<Ability> getAbilities(String id,
                                         FreeColSpecObjectType fcgot,
-                                        Turn turn) {
+                                        int turn) {
         FeatureContainer fc = getFeatureContainer();
         return (fc == null) ? Stream.<Ability>empty()
             : fc.getAbilities(id, fcgot, turn);
@@ -523,7 +524,7 @@ public abstract class FreeColObject
      * @return True if the modifier is present.
      */
     public final boolean hasModifier(String id, FreeColSpecObjectType fcgot) {
-        return hasModifier(id, fcgot, null);
+        return hasModifier(id, fcgot, Turn.UNDEFINED);
     }
 
     /**
@@ -536,7 +537,7 @@ public abstract class FreeColObject
      * @return True if the modifier is present.
      */
     public boolean hasModifier(String id, FreeColSpecObjectType fcgot,
-                               Turn turn) {
+                               int turn) {
         return any(getModifiers(id, fcgot, turn));
     }
 
@@ -605,7 +606,7 @@ public abstract class FreeColObject
      */
     public Stream<Modifier> getModifiers(String id,
                                          FreeColSpecObjectType fcgot,
-                                         Turn turn) {
+                                         int turn) {
         FeatureContainer fc = getFeatureContainer();
         return (fc == null) ? Stream.<Modifier>empty()
             : fc.getModifiers(id, fcgot, turn);
@@ -620,7 +621,7 @@ public abstract class FreeColObject
      * @param id The object identifier.
      * @return The modified number.
      */
-    public final float applyModifiers(float number, Turn turn, String id) {
+    public final float applyModifiers(float number, int turn, String id) {
         return applyModifiers(number, turn, id, null);
     }
 
@@ -635,7 +636,7 @@ public abstract class FreeColObject
      *     modifier applies to.
      * @return The modified number.
      */
-    public final float applyModifiers(float number, Turn turn,
+    public final float applyModifiers(float number, int turn,
                                       String id, FreeColSpecObjectType fcgot) {
         return applyModifiers(number, turn, getModifiers(id, fcgot, turn));
     }
@@ -648,7 +649,7 @@ public abstract class FreeColObject
      * @param mods The {@code Modifier}s to apply.
      * @return The modified number.
      */
-    public static final float applyModifiers(float number, Turn turn,
+    public static final float applyModifiers(float number, int turn,
                                              Collection<Modifier> mods) {
         return FeatureContainer.applyModifiers(number, turn, mods);
     }
@@ -661,7 +662,7 @@ public abstract class FreeColObject
      * @param mods The {@code Modifier}s to apply.
      * @return The modified number.
      */
-    public static final float applyModifiers(float number, Turn turn,
+    public static final float applyModifiers(float number, int turn,
                                              Stream<Modifier> mods) {
         return FeatureContainer.applyModifiers(number, turn, mods);
     }
diff --git a/src/net/sf/freecol/common/model/Game.java 
b/src/net/sf/freecol/common/model/Game.java
index b49ac365718..aafd4181cc2 100644
--- a/src/net/sf/freecol/common/model/Game.java
+++ b/src/net/sf/freecol/common/model/Game.java
@@ -161,7 +161,7 @@ public class Game extends FreeColGameObject {
     protected Player currentPlayer = null;
 
     /** The current turn. */
-    private Turn turn = new Turn(1);
+    private int turn = 1;
 
     /** Whether the War of Spanish Succession has already taken place. */
     private boolean spanishSuccession = false;
@@ -927,16 +927,20 @@ public class Game extends FreeColGameObject {
      *
      * @return The current {@code Turn}.
      */
-    public Turn getTurn() {
+    public int getTurn() {
         return turn;
     }
 
+    public int getYear() {
+        return Turn.getYear(turn);
+    }
+
     /**
      * Sets the current turn in this game.
      *
      * @param newTurn The new {@code Turn} to set.
      */
-    public void setTurn(Turn newTurn) {
+    public void setTurn(final int newTurn) {
         turn = newTurn;
     }
 
@@ -1338,7 +1342,7 @@ public class Game extends FreeColGameObject {
 
         xw.writeAttribute(UUID_TAG, getUUID());
 
-        xw.writeAttribute(TURN_TAG, getTurn().getNumber());
+        xw.writeAttribute(TURN_TAG, getTurn());
 
         xw.writeAttribute(SPANISH_SUCCESSION_TAG, spanishSuccession);
 
@@ -1411,7 +1415,7 @@ public class Game extends FreeColGameObject {
             }
         }
 
-        turn = new Turn(xr.getAttribute(TURN_TAG, 1));
+        turn = xr.getAttribute(TURN_TAG, 1);
 
         spanishSuccession = xr.getAttribute(SPANISH_SUCCESSION_TAG, false);
 
diff --git a/src/net/sf/freecol/common/model/HighScore.java 
b/src/net/sf/freecol/common/model/HighScore.java
index 5c55dbab06a..384b89abfc1 100644
--- a/src/net/sf/freecol/common/model/HighScore.java
+++ b/src/net/sf/freecol/common/model/HighScore.java
@@ -156,7 +156,7 @@ public class HighScore extends FreeColObject {
     private HighScore(Player player) {
         Game game = player.getGame();
         this.date = new Date();
-        this.retirementTurn = game.getTurn().getNumber();
+        this.retirementTurn = game.getTurn();
         this.score = player.getScore();
         this.level = find(ScoreLevel.values(),
                           sl -> sl.getMinimumScore() <= this.score,
@@ -167,7 +167,7 @@ public class HighScore extends FreeColObject {
         this.nColonies = count(player.getColonies());
         this.nUnits = player.getUnitCount();
         this.independenceTurn = (player.getPlayerType()
-            == Player.PlayerType.INDEPENDENT) ? game.getTurn().getNumber()
+            == Player.PlayerType.INDEPENDENT) ? game.getTurn()
             : -1;
         this.nationName = Messages.message(player.getNationLabel());
         this.difficulty = game.getSpecification().getDifficultyLevel();
diff --git a/src/net/sf/freecol/common/model/HistoryEvent.java 
b/src/net/sf/freecol/common/model/HistoryEvent.java
index 91e68321e85..39bf2cd063b 100644
--- a/src/net/sf/freecol/common/model/HistoryEvent.java
+++ b/src/net/sf/freecol/common/model/HistoryEvent.java
@@ -84,7 +84,7 @@ public class HistoryEvent extends StringTemplate {
 
 
     /** The turn in which the event took place */
-    private Turn turn;
+    private int turn;
 
     /** The type of event. */
     private HistoryEventType eventType;
@@ -109,7 +109,7 @@ public class HistoryEvent extends StringTemplate {
      * @param player An optional {@code Player} responsible for
      *     this event.
      */
-    public HistoryEvent(Turn turn, HistoryEventType eventType, Player player) {
+    public HistoryEvent(int turn, HistoryEventType eventType, Player player) {
         super(eventType.getDescriptionKey(), null, TemplateType.TEMPLATE);
         this.turn = turn;
         this.eventType = eventType;
@@ -132,7 +132,7 @@ public class HistoryEvent extends StringTemplate {
      *
      * @return The turn.
      */
-    public final Turn getTurn() {
+    public final int getTurn() {
         return turn;
     }
 
@@ -219,7 +219,7 @@ public class HistoryEvent extends StringTemplate {
     protected void writeAttributes(FreeColXMLWriter xw) throws 
XMLStreamException {
         super.writeAttributes(xw);
 
-        xw.writeAttribute(TURN_TAG, this.turn.getNumber());
+        xw.writeAttribute(TURN_TAG, this.turn);
 
         xw.writeAttribute(EVENT_TYPE_TAG, this.eventType);
 
@@ -235,7 +235,7 @@ public class HistoryEvent extends StringTemplate {
     protected void readAttributes(FreeColXMLReader xr) throws 
XMLStreamException {
         super.readAttributes(xr);
 
-        turn = new Turn(xr.getAttribute(TURN_TAG, 0));
+        turn = xr.getAttribute(TURN_TAG, 0);
 
         eventType = xr.getAttribute(EVENT_TYPE_TAG,
                                     HistoryEventType.class, 
(HistoryEventType)null);
@@ -274,7 +274,7 @@ public class HistoryEvent extends StringTemplate {
     @Override
     public int hashCode() {
         int hash = super.hashCode();
-        hash = 31 * hash + this.turn.hashCode();
+        hash = 31 * hash + this.turn;
         hash = 31 * hash + this.eventType.ordinal();
         if (this.playerId != null) hash = 31 * hash + this.playerId.hashCode();
         hash = 31 * hash + this.score;
@@ -289,7 +289,7 @@ public class HistoryEvent extends StringTemplate {
         StringBuilder sb = new StringBuilder(32);
         sb.append('[').append(getId())
             .append(' ').append(eventType)
-            .append(" (").append(turn.getYear()).append(')');
+            .append(" (").append(Turn.getYear(turn)).append(')');
         if (playerId != null) {
             sb.append(" playerId=").append(playerId)
                 .append(" score=").append(score);
diff --git a/src/net/sf/freecol/common/model/LastSale.java 
b/src/net/sf/freecol/common/model/LastSale.java
index 59c8edf1065..23102b43d0f 100644
--- a/src/net/sf/freecol/common/model/LastSale.java
+++ b/src/net/sf/freecol/common/model/LastSale.java
@@ -34,7 +34,7 @@ public final class LastSale extends FreeColObject {
     public static final String TAG = "lastSale";
 
     /** When a sale was made. */
-    private Turn when;
+    private int when;
 
     /** The price per unit returned from the sale. */
     private int price;
@@ -54,7 +54,7 @@ public final class LastSale extends FreeColObject {
      * @param price The per-unit price of the sale.
      */
     public LastSale(Location where, GoodsType what,
-                    Turn when, int price) {
+                    int when, int price) {
         this(makeKey(where, what), when, price);
     }
 
@@ -65,7 +65,7 @@ public final class LastSale extends FreeColObject {
      * @param when In which {@code Turn} the sale occurred.
      * @param price The per-unit price of the sale.
      */
-    public LastSale(String id, Turn when, int price) {
+    public LastSale(String id, int when, int price) {
         setId(id);
         this.when = when;
         this.price = price;
@@ -87,7 +87,7 @@ public final class LastSale extends FreeColObject {
      *
      * @return The {@code Turn} when the sale was made.
      */
-    public Turn getWhen() {
+    public int getWhen() {
         return when;
     }
 
@@ -126,7 +126,7 @@ public final class LastSale extends FreeColObject {
     protected void writeAttributes(FreeColXMLWriter xw) throws 
XMLStreamException {
         super.writeAttributes(xw);
 
-        xw.writeAttribute(WHEN_TAG, when.getNumber());
+        xw.writeAttribute(WHEN_TAG, when);
 
         xw.writeAttribute(PRICE_TAG, price);
     }
@@ -138,7 +138,7 @@ public final class LastSale extends FreeColObject {
     public void readAttributes(FreeColXMLReader xr) throws XMLStreamException {
         super.readAttributes(xr);
 
-        when = new Turn(xr.getAttribute(WHEN_TAG, 0));
+        when = xr.getAttribute(WHEN_TAG, 0);
 
         price = xr.getAttribute(PRICE_TAG, 0);
     }
diff --git a/src/net/sf/freecol/common/model/LostCityRumour.java 
b/src/net/sf/freecol/common/model/LostCityRumour.java
index 12526637a2c..07158bbcf1b 100644
--- a/src/net/sf/freecol/common/model/LostCityRumour.java
+++ b/src/net/sf/freecol/common/model/LostCityRumour.java
@@ -278,13 +278,13 @@ public class LostCityRumour extends TileItem {
             ? new ModelMessage(ModelMessage.MessageType.LOST_CITY_RUMOUR,
                                
RumourType.NOTHING.getAlternateDescriptionKey("mounds"),
                                player)
-            : (game.getTurn().getYear() % 100 == 12
+            : (game.getYear() % 100 == 12
                 && randomInt(logger, "Mayans?", random, 4) == 0)
             ? new ModelMessage(ModelMessage.MessageType.LOST_CITY_RUMOUR,
                                
RumourType.NOTHING.getAlternateDescriptionKey("mayans"),
                                player)
                 .addAmount("%years%",
-                    MAYAN_PROPHESY_YEAR - game.getTurn().getYear())
+                    MAYAN_PROPHESY_YEAR - game.getYear())
             : new ModelMessage(ModelMessage.MessageType.LOST_CITY_RUMOUR,
                                NameCache.getRumourNothingKey(random),
                                player);
diff --git a/src/net/sf/freecol/common/model/Modifier.java 
b/src/net/sf/freecol/common/model/Modifier.java
index 0d42e3039aa..755cc58c3de 100644
--- a/src/net/sf/freecol/common/model/Modifier.java
+++ b/src/net/sf/freecol/common/model/Modifier.java
@@ -294,7 +294,7 @@ public class Modifier extends Feature {
      * @return A new timed modifier.
      */
     public static Modifier makeTimedModifier(String id, Modifier template,
-                                             Turn start) {
+                                             int start) {
         Modifier modifier = new Modifier(id, template);
         float inc = template.getIncrement();
         int duration = template.getDuration();
@@ -304,7 +304,7 @@ public class Modifier extends Feature {
             duration = (int)(template.getValue()/-inc);
         }
         modifier.setIncrement(template.getIncrementType(), inc, start,
-                              new Turn(start.getNumber() + duration));
+                              start + duration);
         return modifier;
     }
 
@@ -343,10 +343,10 @@ public class Modifier extends Feature {
      * @param turn The {@code Turn} to check.
      * @return The turn-dependent modifier value.
      */
-    public final float getValue(Turn turn) {
+    public final float getValue(int turn) {
         if (appliesTo(turn)) {
             if (hasIncrement()) {
-                float f = (turn.getNumber() - getFirstTurn().getNumber())
+                float f = (turn - getFirstTurn())
                     * increment;
                 return apply(value, f, incrementType);
             } else {
@@ -430,8 +430,8 @@ public class Modifier extends Feature {
      */
     public final Modifier setIncrement(final ModifierType incrementType,
                                        final float increment,
-                                       Turn firstTurn, Turn lastTurn) {
-        if (firstTurn == null) {
+                                       int firstTurn, int lastTurn) {
+        if (firstTurn == Turn.UNDEFINED) {
             throw new IllegalArgumentException("Null firstTurn");
         }
         this.incrementType = incrementType;
@@ -514,7 +514,7 @@ public class Modifier extends Feature {
      * @param turn The {@code Turn} to evaluate increments in.
      * @return The modified number.
      */
-    public float applyTo(float number, Turn turn) {
+    public float applyTo(float number, int turn) {
         return (incrementType == null) ? apply(number, value)
             : apply(number, getValue(turn), getType());
     }
diff --git a/src/net/sf/freecol/common/model/Monarch.java 
b/src/net/sf/freecol/common/model/Monarch.java
index d603c0f059e..6bfc6260844 100644
--- a/src/net/sf/freecol/common/model/Monarch.java
+++ b/src/net/sf/freecol/common/model/Monarch.java
@@ -410,7 +410,7 @@ public final class Monarch extends FreeColGameObject 
implements Named {
         final Specification spec = getSpecification();
         List<RandomChoice<MonarchAction>> choices = new ArrayList<>();
         int dx = 1 + spec.getInteger(GameOptions.MONARCH_MEDDLING);
-        int turn = getGame().getTurn().getNumber();
+        int turn = getGame().getTurn();
         int grace = (6 - dx) * 10; // 10-50
 
         // Nothing happens during the first few turns, if there are no
@@ -466,7 +466,7 @@ public final class Monarch extends FreeColGameObject 
implements Named {
     public int raiseTax(Random random) {
         final Specification spec = getSpecification();
         int taxAdjustment = spec.getInteger(GameOptions.TAX_ADJUSTMENT);
-        int turn = getGame().getTurn().getNumber();
+        int turn = getGame().getTurn();
         int oldTax = player.getTax();
         int adjust = Math.max(1, (6 - taxAdjustment) * 10); // 20-60
         adjust = 1 + randomInt(logger, "Tax rise", random, 5 + turn/adjust);
@@ -547,7 +547,7 @@ public final class Monarch extends FreeColGameObject 
implements Named {
         int interventionTurns = 
spec.getInteger(GameOptions.INTERVENTION_TURNS);
         if (interventionTurns > 0) {
             Force ivf = getInterventionForce();
-            int updates = getGame().getTurn().getNumber() / interventionTurns;
+            int updates = getGame().getTurn() / interventionTurns;
             for (AbstractUnit unit : ivf.getLandUnitsList()) {
                 // add units depending on current turn
                 int value = unit.getNumber() + updates;
diff --git a/src/net/sf/freecol/common/model/Operand.java 
b/src/net/sf/freecol/common/model/Operand.java
index c4d661b7acb..5a393b3e8f7 100644
--- a/src/net/sf/freecol/common/model/Operand.java
+++ b/src/net/sf/freecol/common/model/Operand.java
@@ -194,7 +194,7 @@ public class Operand extends Scope {
             result = game.invokeMethod(methodName, Integer.class, 0);
             break;
         case YEAR:
-            result = game.getTurn().getYear();
+            result = Turn.getYear(game.getTurn());
             break;
         case OPTION:
             result = game.getSpecification().getInteger(getType());
diff --git a/src/net/sf/freecol/common/model/Player.java 
b/src/net/sf/freecol/common/model/Player.java
index d2cc3472e93..4d399cd4841 100644
--- a/src/net/sf/freecol/common/model/Player.java
+++ b/src/net/sf/freecol/common/model/Player.java
@@ -1170,7 +1170,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
         if (!isColonial()) return;
 
         final Specification spec = getSpecification();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final int current = immigrationRequired;
         int base = spec.getInteger(GameOptions.CROSSES_INCREMENT);
         // If the religious unrest bonus is present, immigrationRequired
@@ -1429,7 +1429,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
      *
      * @return A map of father id to {@code Turn}s.
      */
-    public java.util.Map<String, Turn> getElectionTurns() {
+    public java.util.Map<String, Integer> getElectionTurns() {
         return transform(getHistory(),
                          
matchKey(HistoryEvent.HistoryEventType.FOUNDING_FATHER,
                                   HistoryEvent::getEventType),
@@ -1614,7 +1614,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
             : StringTemplate.template("model.indianSettlement.lastSale")
                 .addNamed("%goodsType%", what)
                 .addAmount("%price%", data.getPrice())
-                .addStringTemplate("%turn%", data.getWhen().getLabel());
+                .addStringTemplate("%turn%", Turn.getLabel(data.getWhen()));
     }
 
     /**
@@ -3591,7 +3591,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
      * @param what A description of the cheating.
      */
     public void logCheat(String what) {
-        logger.finest("CHEAT: " + getGame().getTurn().getNumber()
+        logger.finest("CHEAT: " + getGame().getTurn()
             + " " + lastPart(getNationId(), ".")
             + " " + what);
     }
@@ -3810,7 +3810,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
                 ability.toXML(xw);
             }
 
-            Turn turn = getGame().getTurn();
+            final int turn = getGame().getTurn();
             for (Modifier modifier : transform(getSortedModifiers(), m ->
                     m.isTemporary() && !m.isOutOfDate(turn))) {
                 modifier.toXML(xw);
diff --git a/src/net/sf/freecol/common/model/ProductionCache.java 
b/src/net/sf/freecol/common/model/ProductionCache.java
index 9d57639701c..e417010b6dc 100644
--- a/src/net/sf/freecol/common/model/ProductionCache.java
+++ b/src/net/sf/freecol/common/model/ProductionCache.java
@@ -137,7 +137,7 @@ public class ProductionCache {
                         + getGoodsCount(g.getType()));
                 } else {
                     surplus.setAmount((int)FeatureContainer
-                        .applyModifiers(surplus.getAmount(), null, modifiers));
+                        .applyModifiers(surplus.getAmount(), Turn.UNDEFINED, 
modifiers));
                 }
                 goods.add(surplus);
             }
diff --git a/src/net/sf/freecol/common/model/Region.java 
b/src/net/sf/freecol/common/model/Region.java
index fda087516b9..8f345f9b751 100644
--- a/src/net/sf/freecol/common/model/Region.java
+++ b/src/net/sf/freecol/common/model/Region.java
@@ -145,7 +145,7 @@ public class Region extends FreeColGameObject implements 
Nameable {
     protected boolean discoverable = false;
 
     /** Which Turn the region was discovered in. */
-    protected Turn discoveredIn;
+    protected int discoveredIn;
 
     /** Which Player the Region was discovered by. */
     protected Player discoveredBy;
@@ -366,7 +366,7 @@ public class Region extends FreeColGameObject implements 
Nameable {
      *
      * @return The discovery turn.
      */
-    public final Turn getDiscoveredIn() {
+    public final int getDiscoveredIn() {
         return this.discoveredIn;
     }
 
@@ -375,7 +375,7 @@ public class Region extends FreeColGameObject implements 
Nameable {
      *
      * @param newDiscoveredIn The new discoveredy turn.
      */
-    public final void setDiscoveredIn(final Turn newDiscoveredIn) {
+    public final void setDiscoveredIn(final int newDiscoveredIn) {
         this.discoveredIn = newDiscoveredIn;
     }
 
@@ -422,7 +422,7 @@ public class Region extends FreeColGameObject implements 
Nameable {
      * @param turn The {@code Turn} of discovery.
      * @return A list of discovered {@code Region}s.
      */
-    public List<Region> discover(Player player, Turn turn) {
+    public List<Region> discover(Player player, int turn) {
         List<Region> result = new ArrayList<>();
         this.discoveredBy = player;
         this.discoveredIn = turn;
@@ -519,8 +519,8 @@ public class Region extends FreeColGameObject implements 
Nameable {
             xw.writeAttribute(PARENT_TAG, parent);
         }
 
-        if (discoveredIn != null) {
-            xw.writeAttribute(DISCOVERED_IN_TAG, discoveredIn.getNumber());
+        if (discoveredIn != Turn.UNDEFINED) {
+            xw.writeAttribute(DISCOVERED_IN_TAG, discoveredIn);
         }
 
         if (discoveredBy != null) {
@@ -574,8 +574,7 @@ public class Region extends FreeColGameObject implements 
Nameable {
 
         scoreValue = xr.getAttribute(SCORE_VALUE_TAG, 0);
 
-        int turn = xr.getAttribute(DISCOVERED_IN_TAG, UNDEFINED);
-        discoveredIn = (turn == UNDEFINED) ? null : new Turn(turn);
+        discoveredIn = xr.getAttribute(DISCOVERED_IN_TAG, Turn.UNDEFINED);
 
         discoveredBy = xr.findFreeColGameObject(getGame(), DISCOVERED_BY_TAG,
             Player.class, (Player)null, false);
diff --git a/src/net/sf/freecol/common/model/Resource.java 
b/src/net/sf/freecol/common/model/Resource.java
index 47f5545269b..8abcc8525ab 100644
--- a/src/net/sf/freecol/common/model/Resource.java
+++ b/src/net/sf/freecol/common/model/Resource.java
@@ -210,7 +210,7 @@ public class Resource extends TileItem {
     @Override
     public int applyBonus(GoodsType goodsType, UnitType unitType,
                           int potential) {
-        int amount = -potential + (int)applyModifiers(potential, null,
+        int amount = -potential + (int)applyModifiers(potential, 
Turn.UNDEFINED,
             type.getModifiers(goodsType.getId(), unitType));
         return potential
             + ((quantity == UNLIMITED || quantity > amount) ? amount
diff --git a/src/net/sf/freecol/common/model/Role.java 
b/src/net/sf/freecol/common/model/Role.java
index 315213874a9..6480acbbbc2 100644
--- a/src/net/sf/freecol/common/model/Role.java
+++ b/src/net/sf/freecol/common/model/Role.java
@@ -277,7 +277,7 @@ public class Role extends BuildableType {
      * @return The offense value.
      */
     public double getOffence() {
-        return applyModifiers(0.0f, null, Modifier.OFFENCE);
+        return applyModifiers(0.0f, Turn.UNDEFINED, Modifier.OFFENCE);
     }
 
     /**
@@ -295,7 +295,7 @@ public class Role extends BuildableType {
      * @return The defence value.
      */
     private double getDefence() {
-        return applyModifiers(0.0f, null, Modifier.DEFENCE);
+        return applyModifiers(0.0f, Turn.UNDEFINED, Modifier.DEFENCE);
     }
 
     /**
diff --git a/src/net/sf/freecol/common/model/Settlement.java 
b/src/net/sf/freecol/common/model/Settlement.java
index 51ce5ff56a9..7fcdbb32665 100644
--- a/src/net/sf/freecol/common/model/Settlement.java
+++ b/src/net/sf/freecol/common/model/Settlement.java
@@ -807,7 +807,7 @@ public abstract class Settlement extends GoodsLocation
                 if (ability.isIndependent()) ability.toXML(xw);
             }
 
-            final Turn turn = getGame().getTurn();
+            final int turn = getGame().getTurn();
             for (Modifier modifier : getSortedModifiers()) {
                 if (modifier.hasIncrement()
                     && modifier.isOutOfDate(turn)) continue;
diff --git a/src/net/sf/freecol/common/model/SimpleCombatModel.java 
b/src/net/sf/freecol/common/model/SimpleCombatModel.java
index 907584a7910..53d7a6b95da 100644
--- a/src/net/sf/freecol/common/model/SimpleCombatModel.java
+++ b/src/net/sf/freecol/common/model/SimpleCombatModel.java
@@ -149,7 +149,7 @@ public class SimpleCombatModel extends CombatModel {
             || combatIsAttack(attacker, defender)
             || combatIsSettlementAttack(attacker, defender)) {
             Set<Modifier> mods = getOffensiveModifiers(attacker, defender);
-            Turn turn = attacker.getGame().getTurn(); 
+            int turn = attacker.getGame().getTurn();
             result = FeatureContainer.applyModifiers(0.0f, turn, mods);
             if (lb != null) {
                 logModifiers(lb, mods);
@@ -202,7 +202,7 @@ public class SimpleCombatModel extends CombatModel {
             || combatIsSettlementAttack(attacker, defender)
             || combatIsBombard(attacker, defender)) {
             Set<Modifier> mods = getDefensiveModifiers(attacker, defender);
-            Turn turn = defender.getGame().getTurn();
+            int turn = defender.getGame().getTurn();
             result = FeatureContainer.applyModifiers(0.0f, turn, mods);
             if (lb != null) {
                 logModifiers(lb, mods);
@@ -232,7 +232,7 @@ public class SimpleCombatModel extends CombatModel {
             || combatIsAttack(attacker, defender)
             || combatIsSettlementAttack(attacker, defender)) {
             final Unit attackerUnit = (Unit)attacker;
-            final Turn turn = attackerUnit.getGame().getTurn();
+            final int turn = attackerUnit.getGame().getTurn();
 
             // Base offense
             result.add(new Modifier(Modifier.OFFENCE,
@@ -423,7 +423,7 @@ public class SimpleCombatModel extends CombatModel {
             || combatIsAttack(attacker, defender)
             || combatIsBombard(attacker, defender)) {
             final Unit defenderUnit = (Unit)defender;
-            final Turn turn = defenderUnit.getGame().getTurn();
+            final int turn = defenderUnit.getGame().getTurn();
 
             // Base defence
             result.add(new Modifier(Modifier.DEFENCE,
diff --git a/src/net/sf/freecol/common/model/Specification.java 
b/src/net/sf/freecol/common/model/Specification.java
index 6b293ae37b1..54e5bc41228 100644
--- a/src/net/sf/freecol/common/model/Specification.java
+++ b/src/net/sf/freecol/common/model/Specification.java
@@ -1891,8 +1891,7 @@ public final class Specification {
      * @param turn The {@code Turn} to check.
      * @return The age of the given turn.
      */
-    public int getAge(Turn turn) {
-        int n = turn.getNumber();
+    public int getAge(final int n) {
         return (n < ages[0]) ? -1
             : (n < ages[1]) ? 0
             : (n < ages[2]) ? 1
diff --git a/src/net/sf/freecol/common/model/Tile.java 
b/src/net/sf/freecol/common/model/Tile.java
index 444ba599470..42e11ca8317 100644
--- a/src/net/sf/freecol/common/model/Tile.java
+++ b/src/net/sf/freecol/common/model/Tile.java
@@ -1367,7 +1367,7 @@ public final class Tile extends UnitLocation implements 
Named, Ownable {
     public double getDefenceValue() {
         final TileType type = getType();
         return (type == null) ? 0.0
-            : applyModifiers(1.0f, null, type.getDefenceModifiers());
+            : applyModifiers(1.0f, Turn.UNDEFINED, type.getDefenceModifiers());
     }
 
     /**
@@ -2344,7 +2344,7 @@ public final class Tile extends UnitLocation implements 
Named, Ownable {
     @Override
     public Stream<Ability> getAbilities(String id,
                                         FreeColSpecObjectType fcgot,
-                                        Turn turn) {
+                                        int turn) {
         // Delegate to type
         return getType().getAbilities(id, fcgot, turn);
     }
diff --git a/src/net/sf/freecol/common/model/TileImprovementType.java 
b/src/net/sf/freecol/common/model/TileImprovementType.java
index 91574a535c4..1d40350ec12 100644
--- a/src/net/sf/freecol/common/model/TileImprovementType.java
+++ b/src/net/sf/freecol/common/model/TileImprovementType.java
@@ -370,7 +370,7 @@ public final class TileImprovementType extends 
FreeColSpecObjectType {
             if (tt == null) { // simple bonus
                 int production = tile.getPotentialProduction(goodsType, 
colonistType);
                 if (production > 0) {
-                    float chg = applyModifiers(production, null,
+                    float chg = applyModifiers(production, Turn.UNDEFINED,
                                                goodsType.getId());
                     value = (int)(chg - production);
                 }
diff --git a/src/net/sf/freecol/common/model/TileType.java 
b/src/net/sf/freecol/common/model/TileType.java
index 21893cf7829..374aa158678 100644
--- a/src/net/sf/freecol/common/model/TileType.java
+++ b/src/net/sf/freecol/common/model/TileType.java
@@ -345,7 +345,7 @@ public final class TileType extends FreeColSpecObjectType
                                       UnitType unitType) {
         if (goodsType == null) return 0;
         int amount = getBaseProduction(null, goodsType, unitType);
-        amount = (int)applyModifiers(amount, null, goodsType.getId(),
+        amount = (int)applyModifiers(amount, Turn.UNDEFINED, goodsType.getId(),
                                      unitType);
         return (amount < 0) ? 0 : amount;
     }
diff --git a/src/net/sf/freecol/common/model/Turn.java 
b/src/net/sf/freecol/common/model/Turn.java
index c185508a575..d1acb941478 100644
--- a/src/net/sf/freecol/common/model/Turn.java
+++ b/src/net/sf/freecol/common/model/Turn.java
@@ -37,20 +37,8 @@ public class Turn {
     /** The number of seasons. */
     private static int seasonNumber = 2;
 
-
-    /** The numerical value of the Turn, never less than one. */
-    private int turn = 1;
-
-
-    /**
-     * Creates a new {@code Turn} instance.
-     *
-     * @param turn The numeric value of the turn.
-     */
-    public Turn(int turn) {
-        this.turn = turn;
-    }
-
+    public static int UNDEFINED = FreeColObject.UNDEFINED;
+    public static int FIRST_TURN = 1;
 
     /**
      * Initialize the fundamental Turn year constants.  Called from
@@ -125,33 +113,6 @@ public class Turn {
     }
 
     /**
-     * Get the next turn, with a turn number one greater.
-     *
-     * @return The new {@code Turn}.
-     */
-    public Turn next() {
-        return new Turn(turn + 1);
-    }
-
-    /**
-     * Gets the turn number.
-     *
-     * @return The number of turns.
-     */
-    public int getNumber() {
-        return turn;
-    }
-
-    /**
-     * Gets the year this turn is in.
-     *
-     * @return The calculated year based on the turn number.
-     */
-    public int getYear() {
-        return getYear(turn);
-    }
-
-    /**
      * Gets the year the given turn is in.
      *
      * @param turn The turn number to get the year for.
@@ -177,25 +138,6 @@ public class Turn {
     }
 
     /**
-     * Gets the season index of this turn.
-     *
-     * @return The season index corresponding to the current turn
-     *     number, or negative if before the season year.
-     */
-    public int getSeason() {
-        return getSeason(turn);
-    }
-
-    /**
-     * Gets a localization template for this turn.
-     *
-     * @return A {@code StringTemplate} describing the turn.
-     */
-    public StringTemplate getLabel() {
-        return getLabel(turn);
-    }
-
-    /**
      * Gets a localization template for a given turn.
      *
      * @param turn The integer value of the turn to describe.
@@ -213,31 +155,22 @@ public class Turn {
     }
 
     /**
-     * Is this turn the first one?
-     *
-     * @return True if this turn is the first turn.
-     */
-    public boolean isFirstTurn() {
-        return turn == 1;
-    }
-
-    /**
      * Is this turn the season year?
      *
      * @return True if this turn is the season year.
      */
-    public boolean isFirstSeasonTurn() {
+    public static boolean isFirstSeasonTurn(final int turn) {
         return turn == yearToTurn(getSeasonYear());
     }
 
     /**
-     * Get the suffix for a save game name for this turn.
+     * Get the suffix for a save game name for given turn.
      *
      * @return The save game suffix.
      */
-    public String getSaveGameSuffix() {
-        final int season = getSeason();
-        String result = String.valueOf(getYear());
+    public static String getSaveGameSuffix(int turn) {
+        final int season = getSeason(turn);
+        String result = String.valueOf(getYear(turn));
         if (season >= 0) {
             final int SeasonNumberDigits = 
String.valueOf(getSeasonNumber()).length(); // for leading zeroes
             result += "_" + 
String.format("%0"+String.valueOf(SeasonNumberDigits)+"d", season+1)
@@ -258,34 +191,4 @@ public class Turn {
             : (turns >= 0) ? Integer.toString(turns)
             : ">" + Integer.toString(-turns - 1);
     }
-
-
-    // Override Object
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof Turn) {
-            return this.turn == ((Turn)o).turn;
-        }
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode() {
-        return turn;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(turn);
-    }
 }
diff --git a/src/net/sf/freecol/common/model/Unit.java 
b/src/net/sf/freecol/common/model/Unit.java
index 436da2aa33c..04bb8f1ed06 100644
--- a/src/net/sf/freecol/common/model/Unit.java
+++ b/src/net/sf/freecol/common/model/Unit.java
@@ -2388,8 +2388,7 @@ public class Unit extends GoodsLocation
      */
     @Override
     public int getInitialMovesLeft() {
-        Turn turn = getGame().getTurn();
-        return (int)applyModifiers(unitType.getMovement(), turn,
+        return (int)applyModifiers(unitType.getMovement(), getGame().getTurn(),
                                    Modifier.MOVEMENT_BONUS, unitType);
     }
 
@@ -3174,7 +3173,7 @@ public class Unit extends GoodsLocation
      * @return The line of sight of this {@code Unit}.
      */
     public int getLineOfSight() {
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         return (int)applyModifiers(unitType.getLineOfSight(), turn,
             Stream.concat(this.getModifiers(Modifier.LINE_OF_SIGHT_BONUS,
                                             unitType, turn),
@@ -3628,7 +3627,7 @@ public class Unit extends GoodsLocation
      * @return The set of {@code Modifier}s found.
      */
     public Set<Modifier> getCombatModifiers(String id,
-        FreeColSpecObjectType fcgot, Turn turn) {
+        FreeColSpecObjectType fcgot, int turn) {
         final Player owner = getOwner();
         final UnitType unitType = getType();
         Set<Modifier> result = new HashSet<>();
@@ -4181,7 +4180,7 @@ public class Unit extends GoodsLocation
      */
     @Override
     public Stream <Ability> getAbilities(String id, FreeColSpecObjectType 
fcgot,
-                                         Turn turn) {
+                                         int turn) {
         final Player owner = getOwner();
         final UnitType unitType = getType();
 
@@ -4214,7 +4213,7 @@ public class Unit extends GoodsLocation
      * @param turn The turn that applies.
      * @return A stream of {@code Ability}s found.
      */
-    private Stream<Ability> getLocationAbilities(String id, Turn turn) {
+    private Stream<Ability> getLocationAbilities(String id, int turn) {
         final UnitType unitType = getType();
         final Settlement settlement = getSettlement();
         if (settlement != null) {
@@ -4242,7 +4241,7 @@ public class Unit extends GoodsLocation
      */
     @Override
     public Stream<Modifier> getModifiers(String id, FreeColSpecObjectType 
fcgot,
-                                         Turn turn) {
+                                         int turn) {
         final Player owner = getOwner();
         final UnitType unitType = getType();
 
diff --git a/src/net/sf/freecol/common/model/UnitType.java 
b/src/net/sf/freecol/common/model/UnitType.java
index dbccfebc7bc..d386854b203 100644
--- a/src/net/sf/freecol/common/model/UnitType.java
+++ b/src/net/sf/freecol/common/model/UnitType.java
@@ -31,6 +31,7 @@ import javax.xml.stream.XMLStreamException;
 import net.sf.freecol.common.io.FreeColXMLReader;
 import net.sf.freecol.common.io.FreeColXMLWriter;
 import net.sf.freecol.common.model.Colony.NoBuildReason;
+import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.common.model.UnitChangeType.UnitChange;
 import static net.sf.freecol.common.util.CollectionUtils.*;
 
@@ -184,7 +185,7 @@ public final class UnitType extends BuildableType 
implements Consumer {
      * @return The offence value.
      */
     public double getOffence() {
-        return applyModifiers(offence, null, Modifier.OFFENCE);
+        return applyModifiers(offence, Turn.UNDEFINED, Modifier.OFFENCE);
     }
 
     /**
@@ -211,7 +212,7 @@ public final class UnitType extends BuildableType 
implements Consumer {
      * @return The defence value.
      */
     public double getDefence() {
-        return applyModifiers(defence, null, Modifier.DEFENCE);
+        return applyModifiers(defence, Turn.UNDEFINED, Modifier.DEFENCE);
     }
 
     /**
diff --git a/src/net/sf/freecol/common/model/WorkLocation.java 
b/src/net/sf/freecol/common/model/WorkLocation.java
index 61f6c6b8e88..d20bb69d026 100644
--- a/src/net/sf/freecol/common/model/WorkLocation.java
+++ b/src/net/sf/freecol/common/model/WorkLocation.java
@@ -568,7 +568,7 @@ public abstract class WorkLocation extends UnitLocation
     public int getUnitProduction(Unit unit, GoodsType goodsType) {
         if (unit == null || unit.getWorkType() != goodsType) return 0;
         final UnitType unitType = unit.getType();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         return Math.max(0,
             (int)applyModifiers(getBaseProduction(getProductionType(),
                                                   goodsType, unitType),
diff --git a/src/net/sf/freecol/common/networking/NewTurnMessage.java 
b/src/net/sf/freecol/common/networking/NewTurnMessage.java
index 7824ef4420b..38c46e1946b 100644
--- a/src/net/sf/freecol/common/networking/NewTurnMessage.java
+++ b/src/net/sf/freecol/common/networking/NewTurnMessage.java
@@ -20,7 +20,6 @@
 package net.sf.freecol.common.networking;
 
 import net.sf.freecol.common.model.Game;
-import net.sf.freecol.common.model.Turn;
 import net.sf.freecol.server.FreeColServer;
 import net.sf.freecol.server.model.ServerPlayer;
 
@@ -42,8 +41,8 @@ public class NewTurnMessage extends AttributeMessage {
      *
      * @param turn The new {@code Turn}.
      */
-    public NewTurnMessage(Turn turn) {
-        super(TAG, TURN_TAG, String.valueOf(turn.getNumber()));
+    public NewTurnMessage(int turn) {
+        super(TAG, TURN_TAG, String.valueOf(turn));
     }
 
     /**
diff --git a/src/net/sf/freecol/server/ai/AIColony.java 
b/src/net/sf/freecol/server/ai/AIColony.java
index 48352cf23c3..f93a1277f27 100644
--- a/src/net/sf/freecol/server/ai/AIColony.java
+++ b/src/net/sf/freecol/server/ai/AIColony.java
@@ -103,7 +103,7 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
         = new ArrayList<>();
 
     /** When should the workers in this Colony be rearranged? */
-    private Turn rearrangeTurn = new Turn(0);
+    private int rearrangeTurn = 0;
 
     /**
      * Goods that should be completely exported and only exported to
@@ -228,13 +228,13 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
         }
 
         // Skip this colony if it does not yet need rearranging.
-        final int turn = getGame().getTurn().getNumber();
-        if (rearrangeTurn.getNumber() > turn) {
+        final int turn = getGame().getTurn();
+        if (rearrangeTurn > turn) {
             if (colony.getCurrentlyBuilding() == null
                 && colonyPlan != null
                 && colonyPlan.getBestBuildableType() != null) {
                 logger.warning(colony.getName() + " could be building but"
-                    + " is asleep until turn: " + rearrangeTurn.getNumber()
+                    + " is asleep until turn: " + rearrangeTurn
                     + "( > " + turn + ")");
             } else {
                 return;
@@ -311,7 +311,7 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
                                                   preferScouts, aw);
         if (scratch == null) {
             lb.add(", failed to assign workers.");
-            rearrangeTurn = new Turn(turn + 1);
+            rearrangeTurn = turn + 1;
             return;
         }
         lb.add(", assigned ", workers.size(), " workers");
@@ -403,7 +403,7 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
         for (UnitWas uw : was) lb.add("\n  ", uw);
 
         // Set the next rearrangement turn.
-        rearrangeTurn = new Turn(turn + nextRearrange);
+        rearrangeTurn = turn + nextRearrange;
     }
 
     /**
@@ -607,7 +607,7 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
             AIMessage.askPutOutsideColony(getAIUnit(u));
         }
         if (colony.getUnitCount() <= 0) avertAutoDestruction();
-        rearrangeTurn = new Turn(getGame().getTurn().getNumber());
+        rearrangeTurn = getGame().getTurn();
     }
 
     /**
@@ -1348,7 +1348,7 @@ public class AIColony extends AIObject implements 
PropertyChangeListener {
      * run fully next time it is invoked.
      */
     public void requestRearrange() {
-        rearrangeTurn = new Turn(0);
+        rearrangeTurn = 0;
     }
 
 
diff --git a/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java 
b/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java
index 43931858669..10594fd8478 100644
--- a/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java
+++ b/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java
@@ -517,7 +517,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
             }
         }
 
-        if (game.getTurn().getNumber() > 300
+        if (game.getTurn() > 300 // FIXME: put it into a const in class Turn
             && player.isAtWar()
             && randoms[cheatIndex++] < offensiveLandUnitCheatPercent) {
             // - collect enemies, prefer not to antagonize the strong or
@@ -1386,7 +1386,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
      */
     @Override
     public int scoutsNeeded() {
-        return 3 - (getGame().getTurn().getNumber() / 100);
+        return 3 - (getGame().getTurn() / 100);
     }
 
     /**
@@ -1492,17 +1492,17 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
      */
     private boolean peaceHolds(Player p) {
         final Player player = getPlayer();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final double peaceProb = getSpecification()
             .getInteger(GameOptions.PEACE_PROBABILITY) / 100.0;
 
         int peaceTurn = -1;
         for (HistoryEvent h : player.getHistory()) {
             if (p.getId().equals(h.getPlayerId())
-                && h.getTurn().getNumber() > peaceTurn) {
+                && h.getTurn() > peaceTurn) {
                 switch (h.getEventType()) {
                 case MAKE_PEACE: case FORM_ALLIANCE:
-                    peaceTurn = h.getTurn().getNumber();
+                    peaceTurn = h.getTurn();
                     break;
                 case DECLARE_WAR:
                     peaceTurn = -1;
@@ -1514,7 +1514,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
         }
         if (peaceTurn < 0) return false;
 
-        int n = turn.getNumber() - peaceTurn;
+        int n = turn - peaceTurn;
         float prob = (float)Math.pow(peaceProb, n);
         // Apply Franklin's modifier
         prob = p.applyModifiers(prob, turn, Modifier.PEACE_TREATY);
@@ -2237,7 +2237,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
     @Override
     public void startWorking() {
         final Player player = getPlayer();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final Specification spec = getSpecification();
         initializeFromSpecification(spec);
 
@@ -2257,13 +2257,13 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
         LogBuilder lb = new LogBuilder(1024);
         int colonyCount = getAIColonies().size();
         lb.add(player.getDebugName(),
-               " in ", turn, "/", turn.getNumber(),
+               " in ", turn,
                " units=", getAIUnits().size(),
                " colonies=", colonyCount,
                " declare=", (player.checkDeclareIndependence() == null),
                " v-land-REF=", player.getRebelStrengthRatio(false),
                " v-naval-REF=", player.getRebelStrengthRatio(true));
-        if (turn.isFirstTurn()) initializeMissions(lb);
+        if (turn == Turn.FIRST_TURN) initializeMissions(lb);
         determineStances(lb);
 
         if (colonyCount > 0) {
@@ -2601,7 +2601,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer {
             || goodsType.isBuildingMaterial()) {
             // By age 3 we should be able to produce enough ourselves.
             // FIXME: check whether we have an armory, at least
-            int turn = getGame().getTurn().getNumber();
+            int turn = getGame().getTurn();
             ret = turn < 300;
             lb.add(((ret) ? "accepted" : "rejected"),
                    ": special-goods-in-turn-", turn, ".");
diff --git a/src/net/sf/freecol/server/ai/NativeAIPlayer.java 
b/src/net/sf/freecol/server/ai/NativeAIPlayer.java
index 32192138cf1..4d2e91deaee 100644
--- a/src/net/sf/freecol/server/ai/NativeAIPlayer.java
+++ b/src/net/sf/freecol/server/ai/NativeAIPlayer.java
@@ -725,18 +725,18 @@ public class NativeAIPlayer extends MissionAIPlayer {
     @Override
     public void startWorking() {
         final Player player = getPlayer();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final int nSettlements = player.getSettlementCount();
         final Random air = getAIRandom();
 
         LogBuilder lb = new LogBuilder(1024);
-        lb.add(player.getDebugName(), " in ", turn, "/", turn.getNumber());
+        lb.add(player.getDebugName(), " in ", turn);
 
         clearAIUnits();
 
         determineStances(lb);
         List<AIUnit> more;
-        if (turn.isFirstTurn()) {
+        if (turn == Turn.FIRST_TURN) {
             initializeMissions(lb);
             more = getAIUnits();
         } else {
@@ -800,7 +800,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
      */
     public void updateTrade(NativeTrade nt, int anger) {
         final Specification spec = getSpecification();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         final IndianSettlement is = nt.getIndianSettlement();
         final Unit unit = nt.getUnit();
         Set<Modifier> modifiers = new HashSet<>();
@@ -862,7 +862,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
         final IndianSettlement is = nt.getIndianSettlement();
         final Unit unit = nt.getUnit();
         final Player other = unit.getOwner();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         NativeTradeItem ours;
         int anger, haggle;
         
diff --git a/src/net/sf/freecol/server/ai/goal/Goal.java 
b/src/net/sf/freecol/server/ai/goal/Goal.java
index 77117f7e230..685df866d5c 100644
--- a/src/net/sf/freecol/server/ai/goal/Goal.java
+++ b/src/net/sf/freecol/server/ai/goal/Goal.java
@@ -79,7 +79,7 @@ public abstract class Goal extends AIObject implements 
GoalConstants {
         player = p;
         parentGoal = g;
         relativeWeight = w;
-        getGame().getTurn().getNumber();
+        getGame().getTurn();
         needsPlanning = true; //a newly created Goal always needs planning
         isFinished = false; //only plan() should set this to true!
         availableUnitsList = new ArrayList<>();
@@ -307,7 +307,7 @@ public abstract class Goal extends AIObject implements 
GoalConstants {
     protected void requestWorker(GoodsType gt, int minProduction) {
 
         //FIXME: Uncomment after AIPlayer.addWorkerWish() has been written.
-        //int turnsWithoutUnit = getGame().getTurn().getNumber() - 
turnLastUnitAdded;
+        //int turnsWithoutUnit = getGame().getTurn() - turnLastUnitAdded;
         //player.addWorkerWish(this, gt, minProduction, getAbsoluteWeight(), 
turnsWithoutUnit);
     }
 
@@ -325,7 +325,6 @@ public abstract class Goal extends AIObject implements 
GoalConstants {
      */
     public final void addUnit(AIUnit u) {
         logger.finest("Entering method addUnit() for "+getDebugDescription()+" 
with unit: "+u.getId());
-        getGame().getTurn().getNumber();
         availableUnitsList.add(u);
         u.setGoal(this);
         needsPlanning = true; //adding a unit to the Goal means it might need 
planning
diff --git a/src/net/sf/freecol/server/control/InGameController.java 
b/src/net/sf/freecol/server/control/InGameController.java
index e59925b7ad3..16f41254801 100644
--- a/src/net/sf/freecol/server/control/InGameController.java
+++ b/src/net/sf/freecol/server/control/InGameController.java
@@ -551,7 +551,7 @@ public final class InGameController extends Controller {
         serverPlayer.csChangeStance(Stance.PEACE, independent, true, cs);
         independent.changePlayerType(PlayerType.INDEPENDENT);
         Game game = getGame();
-        Turn turn = game.getTurn();
+        int turn = game.getTurn();
         independent.setTax(0);
         independent.reinitialiseMarket();
         HistoryEvent h = new HistoryEvent(turn,
@@ -1350,11 +1350,11 @@ public final class InGameController extends Controller {
 
         // Do not add history event to cs as we are going to update the
         // entire player.  Likewise clear model messages.
-        Turn turn = game.getTurn();
+        int turn = game.getTurn();
         HistoryEvent h = new HistoryEvent(turn,
             HistoryEvent.HistoryEventType.DECLARE_INDEPENDENCE, serverPlayer);
         final int independenceTurn = 
spec.getInteger(GameOptions.INDEPENDENCE_TURN);
-        h.setScore(Math.max(0, independenceTurn - turn.getNumber()));
+        h.setScore(Math.max(0, independenceTurn - turn));
         cs.addGlobalHistory(game, h);
         serverPlayer.clearModelMessages();
         cs.addMessage(serverPlayer,
@@ -1659,7 +1659,7 @@ public final class InGameController extends Controller {
 
         Player indianPlayer = is.getOwner();
         int gold = 0;
-        int year = getGame().getTurn().getNumber();
+        int year = getGame().getTurn();
         RandomRange gifts = is.getType().getGifts(unit);
         if (is.getLastTribute() + TURNS_PER_TRIBUTE < year
             && gifts != null) {
@@ -3598,7 +3598,7 @@ public final class InGameController extends Controller {
 
         // Update the name and note the history.
         cs.addPartial(See.only(serverPlayer), serverPlayer, "newLandName");
-        Turn turn = serverPlayer.getGame().getTurn();
+        final int turn = serverPlayer.getGame().getTurn();
         HistoryEvent h = new HistoryEvent(turn,
             HistoryEvent.HistoryEventType.DISCOVER_NEW_WORLD, serverPlayer)
                 .addName("%name%", name);
diff --git a/src/net/sf/freecol/server/model/ServerGame.java 
b/src/net/sf/freecol/server/model/ServerGame.java
index 2995e0cbfd2..d5324c08d7f 100644
--- a/src/net/sf/freecol/server/model/ServerGame.java
+++ b/src/net/sf/freecol/server/model/ServerGame.java
@@ -319,7 +319,7 @@ public class ServerGame extends Game implements 
ServerModelObject {
         lastTime = now;
 
         Session.completeAll(cs);
-        setTurn(getTurn().next());
+        setTurn(getTurn()+1);
         logger.finest("Turn is now " + getTurn() + duration);
         cs.add(See.all(), ChangePriority.CHANGE_NORMAL,
                new NewTurnMessage(getTurn()));
diff --git a/src/net/sf/freecol/server/model/ServerIndianSettlement.java 
b/src/net/sf/freecol/server/model/ServerIndianSettlement.java
index 742f1c7a0a8..4d23dc1b530 100644
--- a/src/net/sf/freecol/server/model/ServerIndianSettlement.java
+++ b/src/net/sf/freecol/server/model/ServerIndianSettlement.java
@@ -153,7 +153,7 @@ public class ServerIndianSettlement extends IndianSettlement
         if (missionary == null) return;
         final ServerPlayer other = (ServerPlayer)missionary.getOwner();
         final Tile tile = getTile();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
 
         // Check for braves converted by missionaries
         float convert = getConvertProgress();
diff --git a/src/net/sf/freecol/server/model/ServerPlayer.java 
b/src/net/sf/freecol/server/model/ServerPlayer.java
index d25a3306787..8c69b8680d2 100644
--- a/src/net/sf/freecol/server/model/ServerPlayer.java
+++ b/src/net/sf/freecol/server/model/ServerPlayer.java
@@ -400,7 +400,7 @@ public class ServerPlayer extends Player implements 
ServerModelObject {
 
         // Set initial immigration target
         int i0 = spec.getInteger(GameOptions.INITIAL_IMMIGRATION);
-        immigrationRequired = (int)applyModifiers((float)i0, null,
+        immigrationRequired = (int)applyModifiers((float)i0, Turn.UNDEFINED,
             Modifier.RELIGIOUS_UNREST_BONUS);
 
         // Add initial gold
@@ -525,7 +525,7 @@ public class ServerPlayer extends Player implements 
ServerModelObject {
         // The player does not have any valid units or settlements on the map.
 
         int mandatory = spec.getInteger(GameOptions.MANDATORY_COLONY_YEAR);
-        if (getGame().getTurn().getYear() >= mandatory) {
+        if (Turn.getYear(getGame().getTurn()) >= mandatory) {
             // After the season cutover year there must be a presence
             // in the New World.
             logger.info(getName() + " dead, no presence >= " + mandatory);
@@ -1699,7 +1699,7 @@ outer:  for (Effect effect : effects) {
                                         gt -> market.hasBeenTraded(gt))) {
             boolean add = market.getAmountInMarket(type)
                 < type.getInitialAmount();
-            int amount = game.getTurn().getNumber() / 10;
+            int amount = game.getTurn() / 10;
             if (type == extraType) amount = 2 * amount + 1;
             if (amount <= 0) continue;
             amount = randomInt(logger, "Market adjust " + type, random, 
amount);
@@ -1890,7 +1890,7 @@ outer:  for (Effect effect : effects) {
         final Game game = getGame();
         final Specification spec = game.getSpecification();
         final ServerEurope europe = (ServerEurope)getEurope();
-        final Turn turn = game.getTurn();
+        final int turn = game.getTurn();
         boolean europeDirty = false, visibilityChange = false;
 
         addFather(father);
@@ -3914,7 +3914,7 @@ outer:  for (Effect effect : effects) {
      */
     public Modifier makeTeaPartyModifier() {
         final Specification spec = getGame().getSpecification();
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         Modifier modifier = 
first(spec.getModifiers(Modifier.COLONY_GOODS_PARTY));
         if (modifier != null) {
             modifier = Modifier.makeTimedModifier("model.goods.bells",
@@ -4114,7 +4114,7 @@ outer:  for (Effect effect : effects) {
 
         // Must be a first contact!
         final Game game = getGame();
-        Turn turn = game.getTurn();
+        int turn = game.getTurn();
         if (isIndian()) {
             if (other.isIndian()) {
                 return false; // Ignore native-to-native contacts.
diff --git a/src/net/sf/freecol/server/model/ServerRegion.java 
b/src/net/sf/freecol/server/model/ServerRegion.java
index a9e23b8a110..8669c4fba62 100644
--- a/src/net/sf/freecol/server/model/ServerRegion.java
+++ b/src/net/sf/freecol/server/model/ServerRegion.java
@@ -132,7 +132,7 @@ public class ServerRegion extends Region {
         if (this.parent != null) this.parent.addChild(this);
         this.claimable = false;
         this.discoverable = false;
-        this.discoveredIn = null;
+        this.discoveredIn = Turn.UNDEFINED;
         this.discoveredBy = null;
         this.scoreValue = 0;
     }
@@ -219,7 +219,7 @@ public class ServerRegion extends Region {
      * @param newName The name of the region.
      * @param cs A {@code ChangeSet} to update.
      */
-    public void csDiscover(Player player, Turn turn, String newName,
+    public void csDiscover(Player player, int turn, String newName,
                            ChangeSet cs) {
         if (!getDiscoverable()) return;
         final int score = 
(getSpecification().getBoolean(GameOptions.EXPLORATION_POINTS)) 
diff --git a/src/net/sf/freecol/server/model/ServerUnit.java 
b/src/net/sf/freecol/server/model/ServerUnit.java
index fbab6d901d4..1c6e4b86be3 100644
--- a/src/net/sf/freecol/server/model/ServerUnit.java
+++ b/src/net/sf/freecol/server/model/ServerUnit.java
@@ -228,7 +228,7 @@ public class ServerUnit extends Unit implements 
ServerModelObject {
         AbstractGoods deliver = getWorkImprovement().getType()
             .getProduction(tile.getType());
         if (deliver != null) { // Deliver goods if any
-            final Turn turn = getGame().getTurn();
+            final int turn = getGame().getTurn();
             int amount = deliver.getAmount();
             amount = (int)this.applyModifiers(amount, turn,
                 Modifier.TILE_TYPE_CHANGE_PRODUCTION, deliver.getType());
diff --git a/test/src/net/sf/freecol/common/model/BuildingTest.java 
b/test/src/net/sf/freecol/common/model/BuildingTest.java
index e76063613d7..0bcad28ac85 100644
--- a/test/src/net/sf/freecol/common/model/BuildingTest.java
+++ b/test/src/net/sf/freecol/common/model/BuildingTest.java
@@ -684,7 +684,7 @@ public class BuildingTest extends FreeColTestCase {
 
     public void testStockade() {
         final Game game = getGame();
-        final Turn turn = game.getTurn();
+        final int turn = game.getTurn();
         game.setMap(getTestMap(true));
         List<Modifier> modifiers;
 
@@ -830,7 +830,7 @@ public class BuildingTest extends FreeColTestCase {
     public void testTownhallProduction() {
         final Game game = getGame();
         game.setMap(getTestMap(true));
-        final Turn turn = game.getTurn();
+        final int turn = game.getTurn();
 
         Colony colony = getStandardColony(6);
         Player owner = colony.getOwner();
diff --git a/test/src/net/sf/freecol/common/model/ColonyTest.java 
b/test/src/net/sf/freecol/common/model/ColonyTest.java
index 7e7af885529..2b727b9bbb4 100644
--- a/test/src/net/sf/freecol/common/model/ColonyTest.java
+++ b/test/src/net/sf/freecol/common/model/ColonyTest.java
@@ -198,7 +198,7 @@ public class ColonyTest extends FreeColTestCase {
         colony.addModifier(serverPlayer.makeTeaPartyModifier());
         assertEquals(1, countParties(colony));
         Modifier m = serverPlayer.makeTeaPartyModifier();
-        m.setFirstTurn(new Turn(game.getTurn().getNumber() + 1));
+        m.setFirstTurn(game.getTurn() + 1);
         colony.addModifier(m);
         assertEquals(2, countParties(colony));
     }
diff --git a/test/src/net/sf/freecol/common/model/GameTest.java 
b/test/src/net/sf/freecol/common/model/GameTest.java
index b2a74a30cc1..e679adb87f2 100644
--- a/test/src/net/sf/freecol/common/model/GameTest.java
+++ b/test/src/net/sf/freecol/common/model/GameTest.java
@@ -77,27 +77,27 @@ public class GameTest extends FreeColTestCase {
         assertEquals(1492, Turn.getYear(1));
         assertEquals(1, Turn.yearToTurn(1492));
         assertEquals(-1, Turn.getSeason(1));
-        assertEquals(0, spec().getAge(new Turn(1)));
+        assertEquals(0, spec().getAge(1));
 
         assertEquals(1599, Turn.getYear(108));
         assertEquals(108, Turn.yearToTurn(1599));
         assertEquals(-1, Turn.getSeason(108));
-        assertEquals(0, spec().getAge(new Turn(108)));
+        assertEquals(0, spec().getAge(108));
 
         assertEquals(1600, Turn.getYear(109));
         assertEquals(109, Turn.yearToTurn(1600, 0));
         assertEquals(0, Turn.getSeason(109));
-        assertEquals(1, spec().getAge(new Turn(109)));
+        assertEquals(1, spec().getAge(109));
 
         assertEquals(1600, Turn.getYear(110));
         assertEquals(110, Turn.yearToTurn(1600, 1));
         assertEquals(1, Turn.getSeason(110));
-        assertEquals(1, spec().getAge(new Turn(308)));
+        assertEquals(1, spec().getAge(308));
 
         assertEquals(1700, Turn.getYear(309));
         assertEquals(309, Turn.yearToTurn(1700, 0));
         assertEquals(0, Turn.getSeason(309));
-        assertEquals(2, spec().getAge(new Turn(309)));
+        assertEquals(2, spec().getAge(309));
 
         assertEquals(1700, Turn.getYear(310));
         assertEquals(310, Turn.yearToTurn(1700, 1));
diff --git a/test/src/net/sf/freecol/common/model/ModifierTest.java 
b/test/src/net/sf/freecol/common/model/ModifierTest.java
index 0911273a633..bfc6583e42c 100644
--- a/test/src/net/sf/freecol/common/model/ModifierTest.java
+++ b/test/src/net/sf/freecol/common/model/ModifierTest.java
@@ -189,31 +189,31 @@ public class ModifierTest extends FreeColTestCase {
         Modifier modifier2 = new Modifier("test", 2,
                                           ModifierType.ADDITIVE);
 
-        modifier1.setFirstTurn(new Turn(10));
-        modifier1.setLastTurn(new Turn(30));
-        modifier2.setFirstTurn(new Turn(20));
-        modifier2.setLastTurn(new Turn(40));
+        modifier1.setFirstTurn(10);
+        modifier1.setLastTurn(30);
+        modifier2.setFirstTurn(20);
+        modifier2.setLastTurn(40);
 
         assertTrue(modifier1.hasTimeLimit());
         assertTrue(modifier2.hasTimeLimit());
 
-        assertFalse(modifier1.appliesTo(frigate, new Turn(5)));
-        assertFalse(modifier1.appliesTo(frigate, new Turn(35)));
-        assertFalse(modifier1.isOutOfDate(new Turn(25)));
-        assertTrue(modifier1.appliesTo(frigate, new Turn(25)));
+        assertFalse(modifier1.appliesTo(frigate, 5));
+        assertFalse(modifier1.appliesTo(frigate, 35));
+        assertFalse(modifier1.isOutOfDate(25));
+        assertTrue(modifier1.appliesTo(frigate, 25));
 
-        assertFalse(modifier2.appliesTo(frigate, new Turn(5)));
-        assertFalse(modifier2.appliesTo(frigate, new Turn(5)));
-        assertFalse(modifier2.isOutOfDate(new Turn(25)));
-        assertTrue(modifier2.appliesTo(frigate, new Turn(25)));
+        assertFalse(modifier2.appliesTo(frigate, 5));
+        assertFalse(modifier2.appliesTo(frigate, 5));
+        assertFalse(modifier2.isOutOfDate(25));
+        assertTrue(modifier2.appliesTo(frigate, 25));
 
         FeatureContainer featureContainer = new FeatureContainer();
         featureContainer.addModifier(modifier1);
         featureContainer.addModifier(modifier2);
-        List<Modifier> modifiers = 
toList(featureContainer.getModifiers("test", frigate, new Turn(15)));
+        List<Modifier> modifiers = 
toList(featureContainer.getModifiers("test", frigate, 15));
         assertEquals(1, modifiers.size());
         assertEquals(modifier1, first(modifiers));
-        modifiers = toList(featureContainer.getModifiers("test", frigate, new 
Turn(35)));
+        modifiers = toList(featureContainer.getModifiers("test", frigate, 35));
         assertEquals(1, modifiers.size());
         assertEquals(modifier2, first(modifiers));
     }
@@ -225,28 +225,27 @@ public class ModifierTest extends FreeColTestCase {
                                           ModifierType.ADDITIVE);
 
         modifier1.setIncrement(ModifierType.ADDITIVE, 1,
-                               new Turn(10), new Turn(15));
-        assertFalse(modifier1.appliesTo(frigate, new Turn(9)));
-        assertTrue(modifier1.appliesTo(frigate, new Turn(10)));
+                               10, 15);
+        assertFalse(modifier1.appliesTo(frigate, 9));
+        assertTrue(modifier1.appliesTo(frigate, 10));
         assertTrue(modifier1.hasIncrement());
 
         FeatureContainer featureContainer = new FeatureContainer();
         featureContainer.addModifier(modifier1);
         featureContainer.addModifier(modifier2);
-        Turn turn;
 
         // only modifier2
-        assertEquals(3f, featureContainer.applyModifiers(1, new Turn(9),
+        assertEquals(3f, featureContainer.applyModifiers(1, 9,
                                                          "test", frigate));
         // both modifiers
-        assertEquals(4f, featureContainer.applyModifiers(1, new Turn(10),
+        assertEquals(4f, featureContainer.applyModifiers(1, 10,
                                                          "test", frigate));
-        assertEquals(5f, featureContainer.applyModifiers(1, new Turn(11),
+        assertEquals(5f, featureContainer.applyModifiers(1, 11,
                                                          "test", frigate));
-        assertEquals(9f, featureContainer.applyModifiers(1, new Turn(15),
+        assertEquals(9f, featureContainer.applyModifiers(1, 15,
                                                          "test", frigate));
         // only modifier2
-        assertEquals(3f, featureContainer.applyModifiers(1, new Turn(16),
+        assertEquals(3f, featureContainer.applyModifiers(1, 16,
                                                          "test", frigate));
     }
 
@@ -342,6 +341,6 @@ public class ModifierTest extends FreeColTestCase {
         featureContainer.addModifier(modifier3);
 
         assertEquals(Modifier.UNKNOWN,
-            featureContainer.applyModifiers(1, new Turn(15), "test", null));
+            featureContainer.applyModifiers(1, 15, "test", null));
     }
 }
diff --git a/test/src/net/sf/freecol/common/model/MonarchTest.java 
b/test/src/net/sf/freecol/common/model/MonarchTest.java
index 510afb38561..521360adc61 100644
--- a/test/src/net/sf/freecol/common/model/MonarchTest.java
+++ b/test/src/net/sf/freecol/common/model/MonarchTest.java
@@ -60,7 +60,7 @@ public class MonarchTest extends FreeColTestCase {
         assertTrue(choices.isEmpty());
 
         Colony colony = getStandardColony();
-        game.setTurn(new Turn(100));
+        game.setTurn(100);
         dutch.setTax(Monarch.MINIMUM_TAX_RATE / 2);
         choices = dutch.getMonarch().getActionChoices();
         assertTrue(choicesContain(choices, MonarchAction.RAISE_TAX_WAR));
diff --git a/test/src/net/sf/freecol/common/model/TileTest.java 
b/test/src/net/sf/freecol/common/model/TileTest.java
index 606e0f72cd7..dfa042c0674 100644
--- a/test/src/net/sf/freecol/common/model/TileTest.java
+++ b/test/src/net/sf/freecol/common/model/TileTest.java
@@ -480,7 +480,7 @@ public class TileTest extends FreeColTestCase {
 
         // Add a sugar resource, there should now be two sugar bonuses
         // on tile1.
-        final Turn turn = getGame().getTurn();
+        final int turn = getGame().getTurn();
         assertTrue(tile1.canProduce(sugar, null));
         int oldBase = tile1.getBaseProduction(null, sugar, null);
         Resource addedSugar = new Resource(game, tile1, sugarResource);
diff --git a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java 
b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
index aea6944b7c8..712a2a33d47 100644
--- a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
+++ b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
@@ -223,7 +223,7 @@ public class MapGeneratorTest extends FreeColTestCase {
         Player player = new Player(game, FreeColObject.ID_ATTRIBUTE_TAG);
         ServerUnit unit = new ServerUnit(game, null, player,
             spec().getUnitType("model.unit.caravel"));
-        pacific.discover(player, new Turn(1));
+        pacific.discover(player, 1);
 
         assertFalse(pacific.getDiscoverable());
         assertNull(pacific.getDiscoverableRegion());
diff --git a/test/src/net/sf/freecol/server/model/ServerPlayerTest.java 
b/test/src/net/sf/freecol/server/model/ServerPlayerTest.java
index 2a058ea9d37..6e259e5f9a5 100644
--- a/test/src/net/sf/freecol/server/model/ServerPlayerTest.java
+++ b/test/src/net/sf/freecol/server/model/ServerPlayerTest.java
@@ -119,7 +119,7 @@ public class ServerPlayerTest extends FreeColTestCase {
 
         // Pretend time is passing.
         // Have to advance time as yearly goods removal is initially low.
-        game.setTurn(new Turn(200));
+        game.setTurn(200);
         List<Integer> setValues = new ArrayList<>();
         setValues.add(20);
         MockPseudoRandom mockRandom = new MockPseudoRandom(setValues, true);
@@ -306,7 +306,7 @@ public class ServerPlayerTest extends FreeColTestCase {
                      ServerPlayer.IS_ALIVE,
                      dutch.checkForDeath());
 
-        game.setTurn(new Turn(1600));
+        game.setTurn(1600);
         assertEquals("Should be game over, no new world presence >= 1600",
                      ServerPlayer.IS_DEAD,
                      dutch.checkForDeath());
@@ -331,7 +331,7 @@ public class ServerPlayerTest extends FreeColTestCase {
         assertEquals("Should not be game over, units between new world and 
europe", 0,
                      dutch.checkForDeath());
 
-        game.setTurn(new Turn(1600));
+        game.setTurn(1600);
         assertEquals("Should be game over, no new world presence >= 1600", -1,
                      dutch.checkForDeath());
     }
@@ -355,7 +355,7 @@ public class ServerPlayerTest extends FreeColTestCase {
         assertEquals("Should not be game over, units between new world and 
europe", 0,
                      dutch.checkForDeath());
 
-        game.setTurn(new Turn(1600));
+        game.setTurn(1600);
         assertEquals("Should be game over, no new world presence >= 1600", -1,
                      dutch.checkForDeath());
     }
-- 
2.11.0.rc0.7.gbe5a750


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Freecol-developers mailing list
Freecol-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freecol-developers

Reply via email to