Index: src/org/openstreetmap/josm/data/projection/Epsg2180.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg2180.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Epsg2180.java	(wersja 0)
@@ -0,0 +1,63 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 1992 is the official cordinate system in Poland.
+ *
+ * @author steelman
+ */
+public class Epsg2180 extends Puwg implements Projection {
+
+    final private double Epsg2180FalseEasting = 500000.0; /* y */
+    final private double Epsg2180FalseNorthing = -5300000.0; /* x */
+    final private double Epsg2180ScaleFactor = 0.9993;
+    final private double Epsg2180CentralMeridian = 19.0;
+    private static DecimalFormat decFormatter = new DecimalFormat("###0");
+
+    @Override public String toString() {
+        return tr("PUWG 1992 (Poland)");
+    }
+
+    public String toCode() {
+        return "EPSG:2180";
+    }
+
+    public String getCacheDirectoryName() {
+        return "epsg2180";
+    }
+
+    public Bounds getWorldBoundsLatLon()
+    {
+        return new Bounds(
+                new LatLon(49.00, 14.12),
+                new LatLon(54.84, 24.15));
+    }
+
+    public double getPuwgCentralMeridianDeg() { return Epsg2180CentralMeridian; }
+    public double getPuwgCentralMeridian() { return Math.toRadians(Epsg2180CentralMeridian); }
+    public double getPuwgFalseEasting() { return Epsg2180FalseEasting; }
+    public double getPuwgFalseNorthing() { return Epsg2180FalseNorthing; }
+    public double getPuwgScaleFactor() { return Epsg2180ScaleFactor; }
+
+    public double getDefaultZoomInPPD() {
+        // This will set the scale bar to about 100 km
+        return 0.009;
+    }
+
+    public String eastToString(EastNorth p) {
+    	return decFormatter.format(p.east());
+    }
+
+    public String northToString(EastNorth p) {
+    	return decFormatter.format(p.north());
+    }
+}
Index: src/org/openstreetmap/josm/data/projection/Projection.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Projection.java	(wersja 2186)
+++ src/org/openstreetmap/josm/data/projection/Projection.java	(kopia robocza)
@@ -25,6 +25,11 @@
         new Mercator(),
         new LambertEST(), // Still needs proper default zoom
         new Lambert(),    // Still needs proper default zoom
+        new Epsg2176(),
+        new Epsg2177(),
+        new Epsg2178(),
+        new Epsg2179(),
+        new Epsg2180(),
         new SwissGrid(),
         new UTM(),
         new UTM_20N_Guadeloupe_Ste_Anne(),
Index: src/org/openstreetmap/josm/data/projection/Epsg2176.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg2176.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Epsg2176.java	(wersja 0)
@@ -0,0 +1,22 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 2000 Zone 5
+ *
+ * @author steelman
+ */
+public class Epsg2176 extends Puwg2000 implements Projection {
+    final private int PuwgZone = 5;
+
+    public int getZone() { return PuwgZone; }
+}
Index: src/org/openstreetmap/josm/data/projection/Epsg2177.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg2177.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Epsg2177.java	(wersja 0)
@@ -0,0 +1,22 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 2000 Zone 6
+ *
+ * @author steelman
+ */
+public class Epsg2177 extends Puwg2000 implements Projection {
+    final private int PuwgZone = 6;
+
+    public int getZone() { return PuwgZone; }
+}
Index: src/org/openstreetmap/josm/data/projection/Epsg2178.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg2178.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Epsg2178.java	(wersja 0)
@@ -0,0 +1,22 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 2000 Zone 7
+ *
+ * @author steelman
+ */
+public class Epsg2178 extends Puwg2000 implements Projection {
+    final private int PuwgZone = 7;
+
+    public int getZone() { return PuwgZone; }
+}
Index: src/org/openstreetmap/josm/data/projection/Epsg2179.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg2179.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Epsg2179.java	(wersja 0)
@@ -0,0 +1,22 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 2000 Zone 8
+ *
+ * @author steelman
+ */
+public class Epsg2179 extends Puwg2000 implements Projection {
+    final private int PuwgZone = 8;
+
+    public int getZone() { return PuwgZone; }
+}
Index: src/org/openstreetmap/josm/data/projection/Puwg.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Puwg.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Puwg.java	(wersja 0)
@@ -0,0 +1,63 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 1992 and 2000 are the official cordinate systems in Poland.
+ * They use the same math as UTM only with different constants.
+ *
+ * @author steelman
+ */
+public abstract class Puwg extends UTM implements Projection {
+
+    private static DecimalFormat decFormatter = new DecimalFormat("###0");
+
+    public EastNorth latlon2eastNorth(LatLon p) {
+    	double easting = getPuwgFalseEasting();
+    	double northing = getPuwgFalseNorthing();
+	double scale = getPuwgScaleFactor();
+	double center = getPuwgCentralMeridian(); /* in radians */
+        EastNorth a = MapLatLonToXY(Math.toRadians(p.lat()), Math.toRadians(p.lon()), center);
+        return new EastNorth(a.east() * scale + easting, a.north() * scale + northing);
+    }
+
+    public LatLon eastNorth2latlon(EastNorth p) {
+    	double easting = getPuwgFalseEasting();
+    	double northing = getPuwgFalseNorthing();
+	double scale = getPuwgScaleFactor();
+	double center = getPuwgCentralMeridian(); /* in radians */
+        return MapXYToLatLon((p.east() - easting)/scale, (p.north() - northing)/scale, center);
+    }
+
+    @Override public abstract String toString();
+    public abstract String toCode();
+    public abstract String getCacheDirectoryName();
+    public abstract Bounds getWorldBoundsLatLon();
+
+    public abstract double getPuwgCentralMeridianDeg();
+    public abstract double getPuwgCentralMeridian();
+    public abstract double getPuwgFalseNorthing();
+    public abstract double getPuwgFalseEasting();
+    public abstract double getPuwgScaleFactor();
+
+    public double getDefaultZoomInPPD() {
+        // This will set the scale bar to about 100 km
+        return 0.009;
+    }
+
+    public String eastToString(EastNorth p) {
+    	return decFormatter.format(p.east());
+    }
+
+    public String northToString(EastNorth p) {
+    	return decFormatter.format(p.north());
+    }
+}
Index: src/org/openstreetmap/josm/data/projection/Puwg2000.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Puwg2000.java	(wersja 0)
+++ src/org/openstreetmap/josm/data/projection/Puwg2000.java	(wersja 0)
@@ -0,0 +1,69 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//                         2009 by Łukasz Stelmach
+package org.openstreetmap.josm.data.projection;
+
+import java.text.DecimalFormat;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * PUWG 2000 is the official cordinate system in Poland.
+ *
+ * @author steelman
+ */
+public abstract class Puwg2000 extends Puwg implements Projection {
+
+    final private double PuwgFalseEasting = 500000.0;
+    final private double PuwgFalseNorthing = 0;
+    final private double PuwgScaleFactor = 0.999923;
+    final private double[] Puwg2000CentralMeridian = {15.0, 18.0, 21.0, 24.0};
+    final private String[] Puwg2000Code = { "EPSG:2176",  "EPSG:2177", "EPSG:2178", "EPSG:2179"};
+    final private String[] Puwg2000CDName = { "epsg2176",  "epsg2177", "epsg2178", "epsg2179"};
+    private static DecimalFormat decFormatter = new DecimalFormat("###0.00");
+
+    @Override public String toString() {
+        return tr("PUWG 2000 Zone {0} (Poland)", Integer.toString(getZone()));
+    }
+
+    public String toCode() {
+        return Puwg2000Code[getZoneIndex()];
+    }
+
+    public String getCacheDirectoryName() {
+        return Puwg2000CDName[getZoneIndex()];
+    }
+
+    public Bounds getWorldBoundsLatLon()
+    {
+        return new Bounds(
+                new LatLon(49.00, (3 * getZone()) - 1.5), 
+                new LatLon(54.84, (3 * getZone()) + 1.5));
+    }
+
+    public double getPuwgCentralMeridianDeg() { return getZone() * 3.0; }
+    public double getPuwgCentralMeridian() { return Math.toRadians(getZone() * 3.0); }
+    public double getPuwgFalseNorthing() { return PuwgFalseNorthing;}
+    public double getPuwgFalseEasting() { return 1e6 * getZone() + PuwgFalseEasting; }
+    public double getPuwgScaleFactor() { return PuwgScaleFactor; }
+    public abstract int getZone();
+
+    public int getZoneIndex() { return getZone() - 5; }
+
+    public double getDefaultZoomInPPD() {
+        // This will set the scale bar to about 100 km
+        return 0.009;
+    }
+
+    public String eastToString(EastNorth p) {
+    	return Integer.toString(getZone()) + decFormatter.format(p.east());
+    }
+
+    public String northToString(EastNorth p) {
+    	return decFormatter.format(p.north());
+    }
+
+}
