diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
index f5e8a95..3b99149 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
@@ -702,8 +702,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
         Font defaultFont = g.getFont();
         g.setFont(text.font);
 
-        int x = (int) (p.getInViewX() + text.xOffset);
-        int y = (int) (p.getInViewY() + text.yOffset);
+        int x = (int) (Math.round(p.getInViewX()) + text.xOffset);
+        int y = (int) (Math.round(p.getInViewY()) + text.yOffset);
         /**
          *
          *       left-above __center-above___ right-above
@@ -889,8 +889,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
             temporaryGraphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
         }
 
-        double x = p.getInViewX();
-        double y = p.getInViewY();
+        double x = Math.round(p.getInViewX());
+        double y = Math.round(p.getInViewY());
         temporaryGraphics.translate(x, y);
         temporaryGraphics.rotate(theta);
         int drawX = -w/2 + img.offsetX;
diff --git a/src/org/openstreetmap/josm/gui/MapViewState.java b/src/org/openstreetmap/josm/gui/MapViewState.java
index 49d1ad5..693989f 100644
--- a/src/org/openstreetmap/josm/gui/MapViewState.java
+++ b/src/org/openstreetmap/josm/gui/MapViewState.java
@@ -218,6 +218,14 @@ public final class MapViewState {
     }
 
     /**
+     * Gets the center of the view, rounded to a pixel coordinate
+     * @return The center position.
+     */
+    public MapViewPoint getCenterAtPixel() {
+        return getForView(viewWidth / 2, viewHeight / 2);
+    }
+
+    /**
      * Gets the width of the view on the Screen;
      * @return The width of the view component in screen pixel.
      */
diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
index 1c3af2e..416fe0b 100644
--- a/src/org/openstreetmap/josm/gui/NavigatableComponent.java
+++ b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
@@ -293,14 +293,14 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * Zoom in current view. Use configured zoom step and scaling settings.
      */
     public void zoomIn() {
-        zoomTo(getCenter(), scaleZoomIn());
+        zoomTo(state.getCenterAtPixel().getEastNorth(), scaleZoomIn());
     }
 
     /**
      * Zoom out current view. Use configured zoom step and scaling settings.
      */
     public void zoomOut() {
-        zoomTo(getCenter(), scaleZoomOut());
+        zoomTo(state.getCenterAtPixel().getEastNorth(), scaleZoomOut());
     }
 
     /**
@@ -407,7 +407,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return the current center of the viewport
      */
     public EastNorth getCenter() {
-        return state.getCenter().getEastNorth();
+        return state.getCenterAtPixel().getEastNorth();
     }
 
     /**
@@ -607,7 +607,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     private void zoomNoUndoTo(EastNorth newCenter, double newScale, boolean initial) {
         if (!newCenter.equals(getCenter())) {
             EastNorth oldCenter = getCenter();
-            state = state.usingCenter(newCenter);
+            state = state.movedTo(state.getCenterAtPixel(), newCenter);
             if (!initial) {
                 firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
             }
@@ -616,7 +616,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
             double oldScale = getScale();
             state = state.usingScale(newScale);
             // temporary. Zoom logic needs to be moved.
-            state = state.movedTo(state.getCenter(), newCenter);
+            state = state.movedTo(state.getCenterAtPixel(), newCenter);
             if (!initial) {
                 firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
             }
