Index: trunk/nv/core/io_event.hh
===================================================================
--- trunk/nv/core/io_event.hh	(revision 337)
+++ trunk/nv/core/io_event.hh	(revision 338)
@@ -102,4 +102,24 @@
 	};
 
+	struct pad_button_event
+	{
+		/// Pad ID
+		sint32 id;
+		/// Button that is affected
+		uint8 button;
+		/// True if pressed
+		bool pressed;
+	};
+
+	struct pad_axis_event
+	{
+		/// Pad ID
+		sint32 id;
+		/// Axis ID
+		uint8 axis;
+		/// Value
+		sint16 value;
+	};
+
 	struct joy_button_event
 	{
@@ -174,4 +194,6 @@
 			mouse_move_event   mmove;
 			mouse_wheel_event  mwheel;
+			pad_button_event   pbutton;
+			pad_axis_event     paxis;
 			joy_button_event   jbutton;
 			joy_axis_event     jaxis;
@@ -214,4 +236,6 @@
 	 */
 	//void register_io_types( type_database* db );
+
+	void log_event( const io_event& e );
 }
 
Index: trunk/nv/detail/io_event_list.inc
===================================================================
--- trunk/nv/detail/io_event_list.inc	(revision 337)
+++ trunk/nv/detail/io_event_list.inc	(revision 338)
@@ -3,4 +3,6 @@
 NV_IO_EVENT( EV_MOUSE_MOVE )
 NV_IO_EVENT( EV_MOUSE_WHEEL )
+NV_IO_EVENT( EV_PAD_BUTTON )
+NV_IO_EVENT( EV_PAD_AXIS )
 NV_IO_EVENT( EV_JOY_BUTTON )
 NV_IO_EVENT( EV_JOY_AXIS )
Index: trunk/src/core/io_event.cc
===================================================================
--- trunk/src/core/io_event.cc	(revision 337)
+++ trunk/src/core/io_event.cc	(revision 338)
@@ -6,4 +6,6 @@
 
 #include "nv/core/io_event.hh"
+
+#include "nv/core/logging.hh"
 
 using namespace nv;
@@ -40,4 +42,9 @@
 	NV_RETURN_COVERED_DEFAULT( "EV_UNKNOWN" );
 	};
+}
+
+void nv::log_event( const io_event& e )
+{
+	NV_LOG( LOG_INFO, "Event: " << get_io_event_name( e.type ) );
 }
 
Index: trunk/src/sdl/sdl_input.cc
===================================================================
--- trunk/src/sdl/sdl_input.cc	(revision 337)
+++ trunk/src/sdl/sdl_input.cc	(revision 338)
@@ -15,4 +15,5 @@
 {
 	if ( ! SDL_WasInit( SDL_INIT_JOYSTICK ) ) SDL_InitSubSystem( SDL_INIT_JOYSTICK );
+	if ( ! SDL_WasInit( SDL_INIT_GAMECONTROLLER ) ) SDL_InitSubSystem( SDL_INIT_GAMECONTROLLER );
 }
 
@@ -140,4 +141,23 @@
 }
 
+static bool sdl_pad_button_event_to_io_event( const SDL_ControllerButtonEvent& cb, io_event& cevent )
+{
+	cevent.type            = EV_PAD_BUTTON;
+	cevent.pbutton.id      = cb.which;
+	cevent.pbutton.button  = cb.button;
+	cevent.pbutton.pressed = (cb.type == SDL_PRESSED);
+	return true;
+}
+
+static bool sdl_pad_axis_event_to_io_event( const SDL_ControllerAxisEvent& ca, io_event& cevent )
+{
+	cevent.type          = EV_PAD_AXIS;
+	cevent.paxis.id      = ca.which;
+	cevent.paxis.axis    = ca.axis;
+	cevent.paxis.value   = ca.value;
+	return true;
+}
+
+
 static bool sdl_joy_button_event_to_io_event( const SDL_JoyButtonEvent& jb, io_event& jevent )
 {
@@ -202,4 +222,7 @@
 	case SDL_SYSWMEVENT      : ioevent.type = EV_SYSTEM; return true;
 	case SDL_QUIT            : ioevent.type = EV_QUIT;   return true;
+	case SDL_CONTROLLERAXISMOTION : return sdl_pad_axis_event_to_io_event( e.caxis, ioevent ); 
+	case SDL_CONTROLLERBUTTONDOWN : return sdl_pad_button_event_to_io_event( e.cbutton, ioevent ); 
+	case SDL_CONTROLLERBUTTONUP   :
 	case SDL_JOYAXISMOTION   : return sdl_joy_axis_event_to_io_event( e.jaxis, ioevent ); 
 	case SDL_JOYBALLMOTION   : return sdl_joy_ball_event_to_io_event( e.jball, ioevent ); 
