Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/DefaultMapController.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/DefaultMapController.java	(revision 16850)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/DefaultMapController.java	(revision 16939)
@@ -10,4 +10,7 @@
 import java.awt.event.MouseWheelListener;
 
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.PlatformHookOsx;
+
 /**
  * Default map controller which implements map moving by pressing the right
@@ -18,9 +21,10 @@
  */
 public class DefaultMapController extends JMapController implements MouseListener, MouseMotionListener,
-        MouseWheelListener {
+MouseWheelListener {
 
     private static final int MOUSE_BUTTONS_MASK = MouseEvent.BUTTON3_DOWN_MASK | MouseEvent.BUTTON1_DOWN_MASK
-            | MouseEvent.BUTTON2_DOWN_MASK;
+    | MouseEvent.BUTTON2_DOWN_MASK;
 
+    private static final int MAC_MOUSE_BUTTON3_MASK = MouseEvent.CTRL_DOWN_MASK | MouseEvent.BUTTON1_DOWN_MASK;
     public DefaultMapController(JMapViewer map) {
         super(map);
@@ -55,10 +59,11 @@
 
     public void mouseClicked(MouseEvent e) {
-        if (doubleClickZoomEnabled && e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1)
+        if (doubleClickZoomEnabled && e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
             map.zoomIn(e.getPoint());
+        }
     }
 
     public void mousePressed(MouseEvent e) {
-        if (e.getButton() == movementMouseButton) {
+        if (e.getButton() == movementMouseButton || isPlatformOsx() && e.getModifiersEx() == MAC_MOUSE_BUTTON3_MASK) {
             lastDragPoint = null;
             isMoving = true;
@@ -67,5 +72,5 @@
 
     public void mouseReleased(MouseEvent e) {
-        if (e.getButton() == movementMouseButton) {
+        if (e.getButton() == movementMouseButton || isPlatformOsx() && e.getButton() == MouseEvent.BUTTON1) {
             lastDragPoint = null;
             isMoving = false;
@@ -74,6 +79,7 @@
 
     public void mouseWheelMoved(MouseWheelEvent e) {
-        if (wheelZoomEnabled)
+        if (wheelZoomEnabled) {
             map.setZoom(map.getZoom() - e.getWheelRotation(), e.getPoint());
+        }
     }
 
@@ -146,4 +152,31 @@
 
     public void mouseMoved(MouseEvent e) {
+        // Mac OSX simulates with  ctrl + mouse 1  the second mouse button hence no dragging events get fired.
+        //
+        if (isPlatformOsx()) {
+            if (!movementEnabled || !isMoving)
+                return;
+            // Is only the selected mouse button pressed?
+            if (e.getModifiersEx() == MouseEvent.CTRL_DOWN_MASK) {
+                Point p = e.getPoint();
+                if (lastDragPoint != null) {
+                    int diffx = lastDragPoint.x - p.x;
+                    int diffy = lastDragPoint.y - p.y;
+                    map.moveMap(diffx, diffy);
+                }
+                lastDragPoint = p;
+            }
+
+        }
+
+    }
+
+    /**
+     * Replies true if we are currently running on OSX
+     *
+     * @return true if we are currently running on OSX
+     */
+    public static boolean isPlatformOsx() {
+        return Main.platform != null && Main.platform instanceof PlatformHookOsx;
     }
 
