diff --git a/src/command_line_options.cpp b/src/command_line_options.cpp
index 5806897..17596ce 100644
--- a/src/command_line_options.cpp
+++ b/src/command_line_options.cpp
@@ -27,7 +27,8 @@ CommandLineOptions* command_line_options = 0;
 
 CommandLineOptions::CommandLineOptions()
 {
-  daemon   = false;
+  mode     = RUN_DEFAULT;
+
   verbose  = false;
   silent   = false;
   quiet    = false;
@@ -99,7 +100,7 @@ void set_ui_axis_map(AxisEvent* ui_axis_map, const std::string& str)
 }
 
 void
-CommandLineOptions::parse_args(Xboxdrv& xboxdrv, int argc, char** argv)
+CommandLineOptions::parse_args(int argc, char** argv)
 {  
   CommandLineOptions& opts = *this;
 
@@ -135,7 +136,7 @@ CommandLineOptions::parse_args(Xboxdrv& xboxdrv, int argc, char** argv)
                strcmp(argv[i], "-D") == 0)
         {
           opts.silent = true;
-          opts.daemon = true;
+          opts.mode = RUN_DAEMON;
         }
       else if (strcmp(argv[i], "--test-rumble") == 0 ||
                strcmp(argv[i], "-R") == 0)
@@ -538,8 +539,7 @@ CommandLineOptions::parse_args(Xboxdrv& xboxdrv, int argc, char** argv)
       else if (strcmp(argv[i], "--list-controller") == 0 ||
                strcmp(argv[i], "-L") == 0)
         {
-          xboxdrv.list_controller();
-          exit(EXIT_SUCCESS);
+          opts.mode = RUN_LIST_CONTROLLER;
         }
       else if (strcmp(argv[i], "--help-devices") == 0)
         {
diff --git a/src/command_line_options.hpp b/src/command_line_options.hpp
index 5aa688a..bb92013 100644
--- a/src/command_line_options.hpp
+++ b/src/command_line_options.hpp
@@ -36,7 +36,11 @@ class Xboxdrv;
 class CommandLineOptions 
 {
 public:
-  bool daemon;
+  enum { RUN_DEFAULT,
+         RUN_DAEMON, 
+         RUN_LIST_CONTROLLER
+  } mode;
+
   bool verbose;
   bool silent;
   bool quiet;
@@ -70,7 +74,7 @@ public:
 
 public:
   CommandLineOptions();
-  void parse_args(Xboxdrv& xboxdrv, int argc, char** argv);
+  void parse_args(int argc, char** argv);
 
   void print_command_line_help(int argc, char** argv) const;
   void print_led_help() const;
diff --git a/src/xboxdrv.cpp b/src/xboxdrv.cpp
index 1769f09..3658942 100644
--- a/src/xboxdrv.cpp
+++ b/src/xboxdrv.cpp
@@ -630,28 +630,40 @@ Xboxdrv::main(int argc, char** argv)
       signal(SIGINT, on_sigint);
 
       CommandLineOptions opts;
-      opts.parse_args(*this, argc, argv);
+      opts.parse_args(argc, argv);
       command_line_options = &opts;
 
-      if (opts.daemon)
+      switch(opts.mode)
         {
-          pid_t pid = fork();
-
-          if (pid < 0) exit(EXIT_FAILURE); /* fork error */
-          if (pid > 0) exit(EXIT_SUCCESS); /* parent exits */
-
-          pid_t sid = setsid();
-          std::cout << "Sid: " << sid << std::endl;
-          if (chdir("/") != 0)
+          case CommandLineOptions::RUN_DEFAULT:
             {
-              throw std::runtime_error(strerror(errno));
+              run_main(opts);
             }
+            break;
 
-          run_main(opts);
-        }
-      else
-        {
-          run_main(opts);
+          case CommandLineOptions::RUN_DAEMON:
+            {
+              pid_t pid = fork();
+
+              if (pid < 0) exit(EXIT_FAILURE); /* fork error */
+              if (pid > 0) exit(EXIT_SUCCESS); /* parent exits */
+
+              pid_t sid = setsid();
+              std::cout << "Sid: " << sid << std::endl;
+              if (chdir("/") != 0)
+                {
+                  throw std::runtime_error(strerror(errno));
+                }
+
+              run_main(opts);
+            }
+            break;
+
+          case CommandLineOptions::RUN_LIST_CONTROLLER:
+            {
+              list_controller();
+            }
+            break;
         }
     }
   catch(std::exception& err)
diff --git a/src/xboxdrv.hpp b/src/xboxdrv.hpp
index 9ceb4e2..217ef9e 100644
--- a/src/xboxdrv.hpp
+++ b/src/xboxdrv.hpp
@@ -35,6 +35,7 @@ private:
   void controller_loop(GamepadType type, uInput* uinput,
                        XboxGenericController* controller, 
                        const CommandLineOptions& opts);
+  void list_controller();
 
   bool find_controller_by_path(const char* busid, const char* devid,struct usb_device** xbox_device) const;
   void find_controller(struct usb_device*& dev,
@@ -46,8 +47,6 @@ private:
   bool find_xbox360_controller(int id, struct usb_device** xbox_device, XPadDevice* type) const;
 
 public:
-  void list_controller();
-
   int main(int argc, char** argv);
 };