Index: /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 4708)
+++ /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 4709)
@@ -54,5 +54,5 @@
      * Grabs current MOTD from cache or webpage and parses it.
      */
-    private static class MotdContent extends CacheCustomContent {
+    private static class MotdContent extends CacheCustomContent<RuntimeException> {
         public MotdContent() {
             super("motd.html", CacheCustomContent.INTERVAL_DAILY);
Index: /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 4708)
+++ /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 4709)
@@ -17,8 +17,10 @@
  * Unless you flush() it will be kept in memory. If you want to cache a lot of data and/or files,
  * use CacheFiles
+ * @param <T> a {@link Throwable} that may be thrown during {@link #updateData()},
+ * use {@link RuntimeException} if no exception must be handled.
  * @author xeen
  *
  */
-public abstract class CacheCustomContent {
+public abstract class CacheCustomContent<T extends Throwable> {
     /**
      * Common intervals
@@ -57,5 +59,5 @@
      * @return the data to cache
      */
-    protected abstract byte[] updateData();
+    protected abstract byte[] updateData() throws T;
 
     /**
@@ -83,5 +85,5 @@
      * @return Returns the data
      */
-    public byte[] updateIfRequired() {
+    public byte[] updateIfRequired() throws T {
         if(Main.pref.getInteger("cache." + ident, 0) + updateInterval < new Date().getTime()/1000
                 || !isCacheValid())
@@ -94,5 +96,5 @@
      * @return Returns the data as string
      */
-    public String updateIfRequiredString() {
+    public String updateIfRequiredString() throws T {
         if(Main.pref.getInteger("cache." + ident, 0) + updateInterval < new Date().getTime()/1000
                 || !isCacheValid())
@@ -105,5 +107,5 @@
      * @return Returns the data
      */
-    public byte[] updateForce() {
+    public byte[] updateForce() throws T {
         this.data = updateData();
         saveToDisk();
@@ -116,5 +118,5 @@
      * @return Returns the data as String
      */
-    public String updateForceString() {
+    public String updateForceString() throws T {
         updateForce();
         try {
@@ -130,5 +132,5 @@
      * @return the data
      */
-    public byte[] getData() {
+    public byte[] getData() throws T {
         if(data == null) {
             loadFromDisk();
@@ -141,5 +143,5 @@
      * @return the data as String
      */
-    public String getDataString() {
+    public String getDataString() throws T {
         try {
             return new String(getData(), "utf-8");
@@ -153,5 +155,5 @@
      * Tries to load the data using the given ident from disk. If this fails, data will be updated
      */
-    private void loadFromDisk() {
+    private void loadFromDisk() throws T {
         if(Main.applet)
             this.data = updateForce();
Index: /trunk/src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 4708)
+++ /trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 4709)
@@ -153,4 +153,21 @@
     }
 
+    private class CapabilitiesCache extends CacheCustomContent<OsmTransferException> {
+
+        ProgressMonitor monitor;
+        boolean fastFail;
+
+        public CapabilitiesCache(ProgressMonitor monitor, boolean fastFail) {
+            super("capabilities" + getBaseUrl().hashCode(), CacheCustomContent.INTERVAL_WEEKLY);
+            this.monitor = monitor;
+            this.fastFail = fastFail;
+        }
+        @Override
+        protected byte[] updateData() throws OsmTransferException {
+            String s = sendRequest("GET", "capabilities", null, monitor, false, fastFail);
+            return s.getBytes();
+        }
+    }
+
     public void initialize(ProgressMonitor monitor) throws OsmApiInitializationException, OsmTransferCanceledException {
         initialize(monitor, false);
@@ -168,5 +185,5 @@
         cancel = false;
         try {
-            String s = sendRequest("GET", "capabilities", null, monitor, false, fastFail);
+            String s = new CapabilitiesCache(monitor, fastFail).updateIfRequiredString();
             InputSource inputSource = new InputSource(new StringReader(s));
             SAXParserFactory.newInstance().newSAXParser().parse(inputSource, new CapabilitiesParser());
