Index: src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java	(revision 11618)
+++ src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java	(working copy)
@@ -2,12 +2,8 @@
 package org.openstreetmap.josm.data.projection.proj;
 
 import static java.lang.Math.PI;
-import static java.lang.Math.abs;
 import static java.lang.Math.asin;
-import static java.lang.Math.atan;
-import static java.lang.Math.atan2;
 import static java.lang.Math.cos;
-import static java.lang.Math.exp;
 import static java.lang.Math.log;
 import static java.lang.Math.pow;
 import static java.lang.Math.sin;
@@ -19,7 +15,11 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
-import org.openstreetmap.josm.tools.JosmRuntimeException;
+
+import com.swisstopo.geodesy.reframe_lib.IReframe.AltimetricFrame;
+import com.swisstopo.geodesy.reframe_lib.IReframe.PlanimetricFrame;
+import com.swisstopo.geodesy.reframe_lib.IReframe.ProjectionChange;
+import com.swisstopo.geodesy.reframe_lib.Reframe;
 
 // CHECKSTYLE.OFF: LineLength
 
@@ -38,6 +38,7 @@
 
     // CHECKSTYLE.ON: LineLength
 
+    private Reframe reframe;
     private Ellipsoid ellps;
     private double kR;
     private double alpha;
@@ -52,6 +53,7 @@
         super.initialize(params);
         if (params.lat0 == null)
             throw new ProjectionConfigurationException(tr("Parameter ''{0}'' required.", "lat_0"));
+        reframe = new Reframe();
         ellps = params.ellps;
         initialize(params.lat0);
     }
@@ -78,7 +80,7 @@
 
     @Override
     public double[] project(double phi, double lambda) {
-        double s = alpha * log(tan(PI / 4 + phi / 2)) - alpha * ellps.e / 2
+        /*double s = alpha * log(tan(PI / 4 + phi / 2)) - alpha * ellps.e / 2
             * log((1 + ellps.e * sin(phi)) / (1 - ellps.e * sin(phi))) + k;
         double b = 2 * (atan(exp(s)) - PI / 4);
         double l = alpha * lambda;
@@ -89,12 +91,18 @@
         double y = kR * lb;
         double x = kR / 2 * log((1 + sin(bb)) / (1 - sin(bb)));
 
-        return new double[] {y, x};
+        return new double[] {y, x};*/
+
+        double[] outputCoordinates = reframe.ComputeGpsref(new double[] {Math.toDegrees(lambda), Math.toDegrees(phi), 600},
+                ProjectionChange.ETRF93GeographicToLV95);
+        double[] result = reframe.ComputeReframe(outputCoordinates,
+                PlanimetricFrame.LV95, PlanimetricFrame.LV03_Civil, AltimetricFrame.Ellipsoid, AltimetricFrame.Ellipsoid);
+        return new double[] {result[0] / ellps.a, result[1] / ellps.a};
     }
 
     @Override
     public double[] invproject(double y, double x) {
-        double lb = y / kR;
+        /*double lb = y / kR;
         double bb = 2 * (atan(exp(x / kR)) - PI / 4);
 
         double b = asin(cos(b0) * sin(bb) + sin(b0) * cos(bb) * cos(lb));
@@ -114,7 +122,11 @@
             * log(tan(PI / 4 + asin(ellps.e * sin(phi)) / 2));
             phi = 2 * atan(exp(s)) - PI / 2;
         }
-        return new double[] {phi, lambda};
+        return new double[] {phi, lambda};*/
+        double[] outputCoordinates = reframe.ComputeReframe(new double[] {y * ellps.a, x * ellps.a, 600},
+                PlanimetricFrame.LV03_Civil, PlanimetricFrame.LV95, AltimetricFrame.Ellipsoid, AltimetricFrame.Ellipsoid);
+        double[] result = reframe.ComputeGpsref(outputCoordinates, ProjectionChange.LV95ToETRF93Geographic);
+        return new double[] {Math.toRadians(result[1]), Math.toRadians(result[0])};
     }
 
     @Override
Index: test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java	(revision 11618)
+++ test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java	(working copy)
@@ -5,7 +5,6 @@
 import static org.junit.Assert.assertTrue;
 
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -13,7 +12,7 @@
 
 public class SwissGridTest {
     private static final String SWISS_EPSG_CODE = "EPSG:21781";
-    private boolean debug = false;
+    private boolean debug = true;
 
     /**
      * Setup test.
@@ -76,9 +75,7 @@
     }
 
     @Test
-    @Ignore("high accuracy of epsilon=" + EPSILON_ACCURATE + " is not met")
     public void testProjReferenceTestAccurate() {
-        // TODO make this test pass
         projReferenceTest(EPSILON_ACCURATE);
     }
 
