Index: trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java	(revision 10086)
+++ trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java	(revision 10087)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.data.cache.ICachedLoaderListener;
 import org.openstreetmap.josm.data.cache.JCSCachedTileLoaderJob;
+import org.openstreetmap.josm.data.preferences.LongProperty;
 import org.openstreetmap.josm.tools.HttpClient;
 
@@ -40,6 +41,8 @@
 public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, BufferedImageCacheEntry> implements TileJob, ICachedLoaderListener  {
     private static final Logger LOG = FeatureAdapter.getLogger(TMSCachedTileLoaderJob.class.getCanonicalName());
-    private static final long MAXIMUM_EXPIRES = 30 /*days*/ * 24 /*hours*/ * 60 /*minutes*/ * 60 /*seconds*/ *1000L /*milliseconds*/;
-    private static final long MINIMUM_EXPIRES = 1 /*hour*/ * 60 /*minutes*/ * 60 /*seconds*/ *1000L /*milliseconds*/;
+    private static final LongProperty MAXIMUM_EXPIRES = new LongProperty("imagery.generic.maximum_expires",
+            30 /*days*/ * 24 /*hours*/ * 60 /*minutes*/ * 60 /*seconds*/ *1000L /*milliseconds*/);
+    private static final LongProperty MINIMUM_EXPIRES = new LongProperty("imagery.generic.minimum_expires",
+            1 /*hour*/ * 60 /*minutes*/ * 60 /*seconds*/ *1000L /*milliseconds*/);
     private final Tile tile;
     private volatile URL url;
@@ -244,9 +247,9 @@
         // keep the expiration time between MINIMUM_EXPIRES and MAXIMUM_EXPIRES, so we will cache the tiles
         // at least for some short period of time, but not too long
-        if (ret.getExpirationTime() < now + MINIMUM_EXPIRES) {
-            ret.setExpirationTime(now + MINIMUM_EXPIRES);
-        }
-        if (ret.getExpirationTime() > now + MAXIMUM_EXPIRES) {
-            ret.setExpirationTime(now + MAXIMUM_EXPIRES);
+        if (ret.getExpirationTime() < now + MINIMUM_EXPIRES.get()) {
+            ret.setExpirationTime(now + MINIMUM_EXPIRES.get());
+        }
+        if (ret.getExpirationTime() > now + MAXIMUM_EXPIRES.get()) {
+            ret.setExpirationTime(now + MAXIMUM_EXPIRES.get());
         }
         return ret;
Index: trunk/src/org/openstreetmap/josm/data/preferences/LongProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/LongProperty.java	(revision 10087)
+++ trunk/src/org/openstreetmap/josm/data/preferences/LongProperty.java	(revision 10087)
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * A property containing an {@code Long} value.
+ * @since 10087
+ *
+ */
+public class LongProperty extends AbstractProperty<Long> {
+
+    /**
+     * Constructs a new {@code LongProperty}
+     * @param key property key
+     * @param defaultValue default value
+     */
+    public LongProperty(String key, long defaultValue) {
+        super(key, defaultValue);
+        if (Main.pref != null) {
+            get();
+        }
+    }
+
+    @Override
+    public Long get() {
+        return Main.pref.getLong(getKey(), getDefaultValue());
+    }
+
+    @Override
+    public boolean put(Long value) {
+        return Main.pref.putLong(getKey(), value);
+    }
+
+}
