Index: trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9558)
+++ trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9559)
@@ -5,4 +5,5 @@
 
 import java.util.ArrayList;
+import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.List;
@@ -11,5 +12,4 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
@@ -26,5 +26,4 @@
 import org.openstreetmap.josm.data.projection.datum.WGS84Datum;
 import org.openstreetmap.josm.data.projection.proj.ICentralMeridianProvider;
-import org.openstreetmap.josm.data.projection.proj.IPolar;
 import org.openstreetmap.josm.data.projection.proj.Mercator;
 import org.openstreetmap.josm.data.projection.proj.Proj;
@@ -156,4 +155,14 @@
     }
 
+    private enum Polarity { NORTH, SOUTH }
+
+    private EnumMap<Polarity, EastNorth> polesEN;
+    private EnumMap<Polarity, LatLon> polesLL;
+    {
+        polesLL = new EnumMap<>(Polarity.class);
+        polesLL.put(Polarity.NORTH, LatLon.NORTH_POLE);
+        polesLL.put(Polarity.SOUTH, LatLon.SOUTH_POLE);
+    }
+
     /**
      * Constructs a new empty {@code CustomProjection}.
@@ -761,4 +770,25 @@
     }
 
+    private EastNorth getPole(Polarity whichPole) {
+        if (polesEN == null) {
+            polesEN = new EnumMap<>(Polarity.class);
+            for (Polarity p : Polarity.values()) {
+                polesEN.put(p, null);
+                LatLon ll = polesLL.get(p);
+                try {
+                    EastNorth enPole = latlon2eastNorth(ll);
+                    if (enPole.isValid()) {
+                        // project back and check if the result is somewhat reasonable
+                        LatLon llBack = eastNorth2latlon(enPole);
+                        if (llBack.isValid() && ll.greatCircleDistance(llBack) < 1000) {
+                            polesEN.put(p, enPole);
+                        }
+                    }
+                } catch (Exception e) {}
+            }
+        }
+        return polesEN.get(whichPole);
+    }
+
     @Override
     public Bounds getLatLonBoundsBox(ProjectionBounds r) {
@@ -788,17 +818,8 @@
         // if the box contains one of the poles, the above method did not get
         // correct min/max latitude value
-        if (proj instanceof IPolar) {
-            IPolar polarProj = (IPolar) proj;
-            if (polarProj.hasPole(false)) {
-                EastNorth enNorthPole = latlon2eastNorth(LatLon.NORTH_POLE);
-                if (r.contains(enNorthPole)) {
-                    result.extend(LatLon.NORTH_POLE);
-                }
-            }
-            if (polarProj.hasPole(true)) {
-                EastNorth enSouthPole = latlon2eastNorth(LatLon.SOUTH_POLE);
-                if (r.contains(enSouthPole)) {
-                    result.extend(LatLon.SOUTH_POLE);
-                }
+        for (Polarity p : Polarity.values()) {
+            EastNorth pole = getPole(p);
+            if (pole != null && r.contains(pole)) {
+                result.extend(polesLL.get(p));
             }
         }
Index: trunk/src/org/openstreetmap/josm/data/projection/proj/IPolar.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/proj/IPolar.java	(revision 9558)
+++ 	(revision )
@@ -1,15 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.projection.proj;
-
-/**
- * If a Proj class implements this interface, it indicates that the projection
- * can be used to view one or both of the poles.
- */
-public interface IPolar {
-    /**
-     * Return true if north / south pole can be mapped by this projection.
-     * @param south if true, asks for the south pole, otherwise for the north pole
-     * @return true if north / south pole can be mapped by this projection
-     */
-    boolean hasPole(boolean south);
-}
Index: trunk/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java	(revision 9558)
+++ trunk/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java	(revision 9559)
@@ -57,5 +57,5 @@
  * @since 9419
  */
-public class PolarStereographic extends AbstractProj implements IPolar {
+public class PolarStereographic extends AbstractProj {
     /**
      * Maximum number of iterations for iterative computations.
@@ -181,8 +181,3 @@
         }
     }
-
-    @Override
-    public boolean hasPole(boolean south) {
-        return south == southPole;
-    }
 }
