diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js
index b2e2952..2c8d9e3 100644
--- a/lib/OpenLayers/Map.js
+++ b/lib/OpenLayers/Map.js
@@ -1674,8 +1674,6 @@ OpenLayers.Map = OpenLayers.Class({
      * dy - {Number}
      */
     moveByPx: function(dx, dy) {
-        dx = Math.round(dx);
-        dy = Math.round(dy);
         var hw = this.size.w / 2;
         var hh = this.size.h / 2;
         var x = hw + dx;
@@ -1689,15 +1687,13 @@ OpenLayers.Map = OpenLayers.Class({
             // wrapping the date line makes no sense for restricted extents
             wrapDateLine = false;
         }
-        var valid = y <= this.maxPx.y - yRestriction &&
-                    y >= this.minPx.y + yRestriction;
+        dx = (wrapDateLine ||
+                    (x <= this.maxPx.x - xRestriction &&
+                    x >= this.minPx.x + xRestriction)) ? Math.round(dx) : 0;
+        dy = (y <= this.maxPx.y - yRestriction &&
+                    y >= this.minPx.y + yRestriction) ? Math.round(dy) : 0;
         var minX = this.minPx.x, maxX = this.maxPx.x;
-        if (!wrapDateLine) {
-            valid = valid &&
-                    x <= this.maxPx.x - xRestriction &&
-                    x >= this.minPx.x + xRestriction;
-        }
-        if (valid) {
+        if (dx || dy) {
             if (!this.dragging) {
                 this.dragging = true;
                 this.events.triggerEvent("movestart");
diff --git a/tests/Map.html b/tests/Map.html
index bb447eb..3563312 100644
--- a/tests/Map.html
+++ b/tests/Map.html
@@ -1824,6 +1824,26 @@
         map.destroy();
     }
 
+    // test for http://trac.osgeo.org/openlayers/ticket/3388
+    function test_moveByPx_restrictedExtent(t) {
+        t.plan(2);
+
+        var map = new OpenLayers.Map({
+            div: 'map',
+            restrictedExtent: new OpenLayers.Bounds(-22.5,-11.25,22.5,11.25),
+            layers: [
+                new OpenLayers.Layer('name', {isBaseLayer: true})
+            ]
+        });
+
+        map.zoomToExtent(new OpenLayers.Bounds(-11.25, 0, 11.25, 11.25));
+
+        map.moveByPx(-10, -10);
+        t.eq(map.layerContainerDiv.style.left, '10px', 'layer container left correct');
+        t.eq(map.layerContainerDiv.style.top, '0px', 'layer container top correct');
+    }
+
+
   </script>
 </head>
 <body>
