diff -r da012f5acb6f -r 8f6e6f45f06c intern/ghost/GHOST_Types.h
--- a/intern/ghost/GHOST_Types.h	Wed Nov 04 20:50:09 2009 +0000
+++ b/intern/ghost/GHOST_Types.h	Thu Oct 29 23:46:31 2009 +0000
@@ -364,7 +364,9 @@
 
 typedef struct {
 	/** Displacement of a mouse wheel. */
-	GHOST_TInt32 z;	
+	GHOST_TInt32 z;
+	/** Horizontal scroll wheel. */
+	GHOST_TInt32 w;	
 } GHOST_TEventWheelData;
 
 
diff -r da012f5acb6f -r 8f6e6f45f06c intern/ghost/intern/GHOST_EventWheel.h
--- a/intern/ghost/intern/GHOST_EventWheel.h	Wed Nov 04 20:50:09 2009 +0000
+++ b/intern/ghost/intern/GHOST_EventWheel.h	Thu Oct 29 23:46:31 2009 +0000
@@ -57,6 +57,19 @@
 		m_wheelEventData.z = z;
 		m_data = &m_wheelEventData;
 	}
+	
+	GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TInt32 value, bool horizontal)
+		: GHOST_Event(msec, GHOST_kEventWheel, window)
+	{
+		if (horizontal) {
+			m_wheelEventData.z = 0;
+			m_wheelEventData.w = value;
+		} else {
+			m_wheelEventData.z = value;
+			m_wheelEventData.w = 0;
+		}
+		m_data = &m_wheelEventData;
+	}
 
 protected:
 	/** The z-displacement of the mouse wheel. */
diff -r da012f5acb6f -r 8f6e6f45f06c intern/ghost/intern/GHOST_SystemCocoa.mm
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm	Wed Nov 04 20:50:09 2009 +0000
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm	Thu Oct 29 23:46:31 2009 +0000
@@ -1106,10 +1106,15 @@
 				GHOST_TInt32 delta;
 				
 				double deltaF = [event deltaY];
-				if (deltaF == 0.0) break; //discard trackpad delta=0 events
-				
-				delta = deltaF > 0.0 ? 1 : -1;
-				pushEvent(new GHOST_EventWheel([event timestamp], window, delta));
+				double deltaG = [event deltaX];
+				if (deltaF != 0.0) {				
+					delta = deltaF > 0.0 ? 1 : -1;
+					pushEvent(new GHOST_EventWheel([event timestamp], window, delta, false));
+				}
+				if (deltaG != 0.0) {
+					delta = deltaG > 0.0 ? 1: -1;
+					pushEvent(new GHOST_EventWheel([event timestamp], window, delta, true));
+				}				
 			}
 			break;
 			
diff -r da012f5acb6f -r 8f6e6f45f06c source/blender/editors/interface/view2d_ops.c
--- a/source/blender/editors/interface/view2d_ops.c	Wed Nov 04 20:50:09 2009 +0000
+++ b/source/blender/editors/interface/view2d_ops.c	Thu Oct 29 23:46:31 2009 +0000
@@ -1418,12 +1418,15 @@
 	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0);
 	
+	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", WHEELRIGHTMOUSE, KM_PRESS, 0, 0);
+	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", WHEELLEFTMOUSE, KM_PRESS, 0, 0);
+	
 	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0);
 	WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0);
 	
 	/* zoom - single step */
-	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
-	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
+	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", WHEELOUTMOUSE, KM_PRESS, KM_OSKEY, 0);
+	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", WHEELINMOUSE, KM_PRESS, KM_OSKEY, 0);
 	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
 	WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
 	
diff -r da012f5acb6f -r 8f6e6f45f06c source/blender/editors/space_view3d/view3d_ops.c
--- a/source/blender/editors/space_view3d/view3d_ops.c	Wed Nov 04 20:50:09 2009 +0000
+++ b/source/blender/editors/space_view3d/view3d_ops.c	Thu Oct 29 23:46:31 2009 +0000
@@ -130,9 +130,19 @@
 	
 	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
 	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADMINUS, KM_PRESS, 0, 0)->ptr, "delta", -1);
-	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1);
-	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, 0, 0)->ptr, "delta", -1);
-
+	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
+	RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);	
+	
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_PANUP);
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_PANDOWN);	
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELLEFTMOUSE, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_PANLEFT);
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELRIGHTMOUSE, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_PANRIGHT);
+	
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELUPMOUSE, KM_PRESS, KM_OSKEY, 0)->ptr, "type", V3D_VIEW_STEPUP);
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_OSKEY, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELLEFTMOUSE, KM_PRESS, KM_OSKEY, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
+	RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELRIGHTMOUSE, KM_PRESS, KM_OSKEY, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
+	
 	RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0);
 	RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1);
 
diff -r da012f5acb6f -r 8f6e6f45f06c source/blender/windowmanager/intern/wm_event_system.c
--- a/source/blender/windowmanager/intern/wm_event_system.c	Wed Nov 04 20:50:09 2009 +0000
+++ b/source/blender/windowmanager/intern/wm_event_system.c	Thu Oct 29 23:46:31 2009 +0000
@@ -1705,8 +1705,14 @@
 			
 			if (wheelData->z > 0)
 				event.type= WHEELUPMOUSE;
+			else if (wheelData->z < 0)
+				event.type= WHEELDOWNMOUSE;
+			else if (wheelData->w > 0)
+				event.type= WHEELLEFTMOUSE;
+			else if (wheelData->w < 0)
+				event.type= WHEELRIGHTMOUSE;
 			else
-				event.type= WHEELDOWNMOUSE;
+				break;				
 			
 			event.val= KM_PRESS;
 			wm_event_add(win, &event);
diff -r da012f5acb6f -r 8f6e6f45f06c source/blender/windowmanager/wm_event_types.h
--- a/source/blender/windowmanager/wm_event_types.h	Wed Nov 04 20:50:09 2009 +0000
+++ b/source/blender/windowmanager/wm_event_types.h	Thu Oct 29 23:46:31 2009 +0000
@@ -62,6 +62,8 @@
 		/* defaults from ghost */
 #define WHEELUPMOUSE	0x00a	
 #define WHEELDOWNMOUSE	0x00b
+#define WHEELLEFTMOUSE	0x00e
+#define WHEELRIGHTMOUSE	0x00f
 		/* mapped with userdef */
 #define WHEELINMOUSE	0x00c
 #define WHEELOUTMOUSE	0x00d
