diff --git a/xbox360_controller.cpp b/xbox360_controller.cpp
index f6fa5bf..a958c73 100644
--- a/xbox360_controller.cpp
+++ b/xbox360_controller.cpp
@@ -60,7 +60,7 @@ Xbox360Controller::set_led(uint8_t status)
   usb_interrupt_write(handle, 2, ledcmd, sizeof(ledcmd), 0);
 }
 
-void
+bool
 Xbox360Controller::read(XboxGenericMsg& msg)
 {
   uint8_t data[32];
@@ -81,6 +81,7 @@ Xbox360Controller::read(XboxGenericMsg& msg)
     {
       msg.type    = GAMEPAD_XBOX360;
       msg.xbox360 = *reinterpret_cast<Xbox360Msg*>(data);
+      return true;
     }
   else
     {
@@ -92,6 +93,8 @@ Xbox360Controller::read(XboxGenericMsg& msg)
 
       std::cout << std::endl;
     }
+
+  return false;
 }
 
 /* EOF */
diff --git a/xbox360_controller.hpp b/xbox360_controller.hpp
index 8962198..2052346 100644
--- a/xbox360_controller.hpp
+++ b/xbox360_controller.hpp
@@ -39,7 +39,7 @@ public:
 
   void set_rumble(uint8_t left, uint8_t right);
   void set_led(uint8_t status);
-  void read(XboxGenericMsg& msg);
+  bool read(XboxGenericMsg& msg);
 
 private:
   Xbox360Controller (const Xbox360Controller&);
diff --git a/xbox360_wireless_controller.cpp b/xbox360_wireless_controller.cpp
index 837e243..b83b22e 100644
--- a/xbox360_wireless_controller.cpp
+++ b/xbox360_wireless_controller.cpp
@@ -74,7 +74,7 @@ Xbox360WirelessController::set_led(uint8_t status)
   usb_interrupt_write(handle, endpoint, ledcmd, sizeof(ledcmd), 0);
 }
 
-void
+bool
 Xbox360WirelessController::read(XboxGenericMsg& msg)
 {
   uint8_t data[32];
@@ -122,6 +122,7 @@ Xbox360WirelessController::read(XboxGenericMsg& msg)
         {
           msg.type    = GAMEPAD_XBOX360_WIRELESS;
           msg.xbox360 = *reinterpret_cast<Xbox360Msg*>(&data[6]);
+          return true;
         }
       else if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0x13)
         { // Battery status
@@ -136,6 +137,8 @@ Xbox360WirelessController::read(XboxGenericMsg& msg)
     {
       // unknown/junk
     }
+
+  return false;
 }
 
 /* EOF */
diff --git a/xbox360_wireless_controller.hpp b/xbox360_wireless_controller.hpp
index 5ca4666..6a6f4f4 100644
--- a/xbox360_wireless_controller.hpp
+++ b/xbox360_wireless_controller.hpp
@@ -43,7 +43,7 @@ public:
 
   void set_rumble(uint8_t left, uint8_t right);
   void set_led(uint8_t status);
-  void read(XboxGenericMsg& msg);
+  bool read(XboxGenericMsg& msg);
   uint8_t get_battery_status() const;
 private:
   Xbox360WirelessController (const Xbox360WirelessController&);
diff --git a/xbox_controller.cpp b/xbox_controller.cpp
index d55674e..609cddb 100644
--- a/xbox_controller.cpp
+++ b/xbox_controller.cpp
@@ -57,7 +57,7 @@ XboxController::set_led(uint8_t status)
   // Controller doesn't have a LED
 }
 
-void
+bool
 XboxController::read(XboxGenericMsg& msg)
 {
   // FIXME: Add tracking for duplicate data packages (send by logitech controller)
@@ -74,7 +74,9 @@ XboxController::read(XboxGenericMsg& msg)
     {
       msg.type = GAMEPAD_XBOX;
       msg.xbox = *reinterpret_cast<XboxMsg*>(data);
+      return true;
     }
+  return false;
 }
 
 /* EOF */
diff --git a/xbox_controller.hpp b/xbox_controller.hpp
index f68da1d..0a008f1 100644
--- a/xbox_controller.hpp
+++ b/xbox_controller.hpp
@@ -39,7 +39,7 @@ public:
 
   void set_rumble(uint8_t left, uint8_t right);
   void set_led(uint8_t status);
-  void read(XboxGenericMsg& msg);
+  bool read(XboxGenericMsg& msg);
 
 private:
   XboxController (const XboxController&);
diff --git a/xbox_generic_controller.hpp b/xbox_generic_controller.hpp
index 6b95e27..75e6510 100644
--- a/xbox_generic_controller.hpp
+++ b/xbox_generic_controller.hpp
@@ -29,7 +29,7 @@ public:
 
   virtual void set_rumble(uint8_t left, uint8_t right) =0;
   virtual void set_led(uint8_t status)   =0;
-  virtual void read(XboxGenericMsg& msg) =0;
+  virtual bool read(XboxGenericMsg& msg) =0;
 
 private:
   XboxGenericController (const XboxGenericController&);
diff --git a/xboxdrv.cpp b/xboxdrv.cpp
index 9721400..50bce38 100644
--- a/xboxdrv.cpp
+++ b/xboxdrv.cpp
@@ -601,21 +601,24 @@ void controller_loop(XboxGenericController* controller, CommandLineOptions& opts
   while(!quit)
     {
       XboxGenericMsg msg;
-      controller->read(msg);
-      if (opts.verbose)
-        std::cout << msg << std::endl;
-      if (uinput) uinput->send(msg);
-                    
-      if (opts.rumble)
+
+      if (controller->read(msg))
         {
-          if (opts.gamepad_type == GAMEPAD_XBOX)
+          if (opts.verbose)
+            std::cout << msg << std::endl;
+          if (uinput) uinput->send(msg);
+                    
+          if (opts.rumble)
             {
-              controller->set_rumble(msg.xbox.lt, msg.xbox.rt);
-            }
-          else if (opts.gamepad_type == GAMEPAD_XBOX360 ||
-                   opts.gamepad_type == GAMEPAD_XBOX360_WIRELESS)
-            {
-              controller->set_rumble(msg.xbox360.lt, msg.xbox360.rt);                      
+              if (opts.gamepad_type == GAMEPAD_XBOX)
+                {
+                  controller->set_rumble(msg.xbox.lt, msg.xbox.rt);
+                }
+              else if (opts.gamepad_type == GAMEPAD_XBOX360 ||
+                       opts.gamepad_type == GAMEPAD_XBOX360_WIRELESS)
+                {
+                  controller->set_rumble(msg.xbox360.lt, msg.xbox360.rt);                      
+                }
             }
         }
     }