diff --git a/argument.cpp b/argument.cpp
deleted file mode 100644
index 74bdda2..0000000
--- a/argument.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright © 2016 IBM Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "argument.hpp"
-
-#include <algorithm>
-#include <cassert>
-#include <iostream>
-#include <iterator>
-
-namespace phosphor
-{
-namespace gpio
-{
-
-using namespace std::string_literals;
-
-const std::string ArgumentParser::trueString = "true"s;
-const std::string ArgumentParser::emptyString = ""s;
-
-const char* ArgumentParser::optionStr = "p:k:r:t:?h";
-const option ArgumentParser::options[] = {
-    {"path", required_argument, nullptr, 'p'},
-    {"key", required_argument, nullptr, 'k'},
-    {"polarity", required_argument, nullptr, 'r'},
-    {"target", required_argument, nullptr, 't'},
-    {"continue", no_argument, nullptr, 'c'},
-    {"help", no_argument, nullptr, 'h'},
-    {0, 0, 0, 0},
-};
-
-ArgumentParser::ArgumentParser(int argc, char** argv)
-{
-    int option = 0;
-    while (-1 !=
-           (option = getopt_long(argc, argv, optionStr, options, nullptr)))
-    {
-        if ((option == '?') || (option == 'h'))
-        {
-            usage(argv);
-            exit(-1);
-        }
-
-        auto i = &options[0];
-        while ((i->val != option) && (i->val != 0))
-        {
-            ++i;
-        }
-
-        if (i->val)
-        {
-            // optional argument may get nullptr for optarg
-            // make it empty string in such case
-            auto arg = (optarg == nullptr ? "" : optarg);
-            arguments[i->name] = (i->has_arg ? arg : trueString);
-        }
-    }
-}
-
-const std::string& ArgumentParser::operator[](const std::string& opt)
-{
-    auto i = arguments.find(opt);
-    if (i == arguments.end())
-    {
-        return emptyString;
-    }
-    else
-    {
-        return i->second;
-    }
-}
-
-void ArgumentParser::usage(char** argv)
-{
-    std::cerr << "Usage: " << argv[0] << " [options]\n";
-    std::cerr << "Options:\n";
-    std::cerr << "  --help                  Print this menu\n";
-    std::cerr << "  --path=<path>           Path of input device."
-                 " Ex: /dev/input/event2\n";
-    std::cerr << "  --key=<key>             Input GPIO key number\n";
-    std::cerr << "  --polarity=<polarity>   Asertion polarity to look for."
-                 " This is 0 / 1 \n";
-    std::cerr << "  --target=<systemd unit> Systemd unit to be called on GPIO"
-                 " state change\n";
-    std::cerr << "  [--continue]            Whether or not to continue"
-                 " after key pressed\n";
-}
-} // namespace gpio
-} // namespace phosphor
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;
         }
     }
 
diff --git a/meson.build b/meson.build
index a3f3bad..ffb3442 100644
--- a/meson.build
+++ b/meson.build
@@ -126,7 +126,6 @@
 
 phosphor_gpio_monitor = executable(
     'phosphor-gpio-monitor',
-    'argument.cpp',
     'mainapp.cpp',
     dependencies: [
         libevdev,
