diff --git a/mainapp.cpp b/mainapp.cpp
index 7a3300f..2496a89 100644
--- a/mainapp.cpp
+++ b/mainapp.cpp
@@ -14,59 +14,51 @@
  * limitations under the License.
  */
 
-#include "argument.hpp"
 #include "monitor.hpp"
 
 #include <systemd/sd-event.h>
 
+#include <CLI/CLI.hpp>
 #include <phosphor-logging/lg2.hpp>
 
 #include <iostream>
 #include <string>
 
-static void exitWithError(const char* err, char** argv)
-{
-    phosphor::gpio::ArgumentParser::usage(argv);
-    std::cerr << "ERROR: " << err << "\n";
-    exit(EXIT_FAILURE);
-}
-
 int main(int argc, char** argv)
 {
+    CLI::App app{"Monitor GPIO line for requested state change"};
+
     // Read arguments.
-    auto options = phosphor::gpio::ArgumentParser(argc, argv);
+    std::string path{};
+    std::string key{};
+    std::string polarity{};
+    std::string target{};
+    bool continueRun = false;
 
-    // Parse out path argument.
-    auto path = (options)["path"];
-    if (path == phosphor::gpio::ArgumentParser::emptyString)
+    /* Add an input option */
+    app.add_option("-p,--path", path,
+                   "Path of input device. Ex: /dev/input/event2")
+        ->required();
+    app.add_option("-k,--key", key, "Input GPIO key number")->required();
+    app.add_option("-r,--polarity", polarity,
+                   "Asertion polarity to look for. This is 0 / 1")
+        ->required();
+    app.add_option("-t,--target", target,
+                   "Systemd unit to be called on GPIO state change")
+        ->required();
+    app.add_option("-c,--continue", continueRun,
+                   "PWhether or not to continue after key pressed");
+
+    /* Parse input parameter */
+    try
     {
-        exitWithError("path not specified.", argv);
+        app.parse(argc, argv);
     }
-
-    // Parse out key number that we are interested in
-    // Its integer mapping to the GPIO key configured by the kernel
-    auto key = (options)["key"];
-    if (key == phosphor::gpio::ArgumentParser::emptyString)
+    catch (const CLI::Error& e)
     {
-        exitWithError("Key not specified.", argv);
+        return app.exit(e);
     }
 
-    // Parse out assertion polarity interested in
-    // Its either 1 or 0 for press / release
-    auto polarity = (options)["polarity"];
-    if (polarity == phosphor::gpio::ArgumentParser::emptyString)
-    {
-        exitWithError("Polarity not specified.", argv);
-    }
-
-    // Parse out target argument. It is fine if the caller does not
-    // pass this if they are not interested in calling into any target
-    // on meeting a condition.
-    auto target = (options)["target"];
-
-    bool continueRun =
-        (options["continue"] == phosphor::gpio::ArgumentParser::trueString);
-
     sd_event* event = nullptr;
     auto r = sd_event_default(&event);
     if (r < 0)
@@ -90,7 +82,7 @@
         if (r < 0)
         {
             lg2::error("Failure in processing request: {RC}", "RC", r);
-            break;
+            return r;
         }
     }
 
