diff --git a/argument.hpp b/argument.hpp
deleted file mode 100644
index 1fad60a..0000000
--- a/argument.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#pragma once
-
-#include <getopt.h>
-
-#include <map>
-#include <string>
-
-namespace phosphor
-{
-namespace power
-{
-
-/** @brief Class - Encapsulates parsing command line options and
- *                 populating arguments
- */
-class ArgumentParser
-{
-  public:
-    ArgumentParser() = delete;
-    ~ArgumentParser() = default;
-    ArgumentParser(const ArgumentParser&) = delete;
-    ArgumentParser& operator=(const ArgumentParser&) = delete;
-    ArgumentParser(ArgumentParser&&) = default;
-    ArgumentParser& operator=(ArgumentParser&&) = default;
-
-    /** @brief Constructs Argument object
-     *
-     *  @param[in] argc - the main function's argc passed as is
-     *  @param[in] argv - the main function's argv passed as is
-     *  @return Object constructed
-     */
-    ArgumentParser(int argc, char** argv);
-
-    /** @brief Given an option, returns its argument(optarg)
-     *
-     *  @param[in] opt - command line option string
-     *
-     *  @return argument which is a standard optarg
-     */
-    const std::string& operator[](const std::string& opt);
-
-    /** @brief Displays usage
-     *
-     *  @param[in] argv - the main function's argv passed as is
-     */
-    static void usage(char** argv);
-
-    /** @brief Set to 'true' when an option is passed */
-    static const std::string trueString;
-
-    /** @brief Set to '' when an option is not passed */
-    static const std::string emptyString;
-
-  private:
-    /** @brief Option to argument mapping */
-    std::map<const std::string, std::string> arguments;
-
-    /** @brief Array of struct options as needed by getopt_long */
-    static const option options[];
-
-    /** @brief optstring as needed by getopt_long */
-    static const char* optionStr;
-};
-
-} // namespace power
-} // namespace phosphor
diff --git a/power-sequencer/argument.cpp b/power-sequencer/argument.cpp
deleted file mode 100644
index 7a60587..0000000
--- a/power-sequencer/argument.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Copyright © 2017 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 <iostream>
-#include <iterator>
-
-namespace phosphor
-{
-namespace power
-{
-
-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 << "    --action=<action>     Action: pgood-monitor "
-                 "or runtime-monitor\n";
-    std::cerr << "    --interval=<interval> Interval in milliseconds:\n";
-    std::cerr << "      PGOOD monitor:   time allowed for PGOOD to come up\n";
-    std::cerr << "      Runtime monitor: polling interval.\n";
-
-    std::cerr << std::flush;
-}
-
-const option ArgumentParser::options[] = {
-    {"action", required_argument, NULL, 'a'},
-    {"interval", required_argument, NULL, 'i'},
-    {"help", no_argument, NULL, 'h'},
-    {0, 0, 0, 0},
-};
-
-const char* ArgumentParser::optionStr = "a:i:h?";
-ArgumentParser::ArgumentParser(int argc, char** argv)
-{
-    int option = 0;
-    while (-1 != (option = getopt_long(argc, argv, optionStr, options, NULL)))
-    {
-        if ((option == '?') || (option == 'h'))
-        {
-            usage(argv);
-            exit(-1);
-        }
-
-        auto i = &options[0];
-        while ((i->val != option) && (i->val != 0))
-        {
-            ++i;
-        }
-
-        if (i->val)
-        {
-            arguments[i->name] = (i->has_arg ? optarg : 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;
-    }
-}
-
-const std::string ArgumentParser::trueString = "true";
-const std::string ArgumentParser::emptyString = "";
-
-} // namespace power
-} // namespace phosphor
diff --git a/power-sequencer/main.cpp b/power-sequencer/main.cpp
index 72f96fb..6f1dca0 100644
--- a/power-sequencer/main.cpp
+++ b/power-sequencer/main.cpp
@@ -15,12 +15,12 @@
  */
 #include "config.h"
 
-#include "argument.hpp"
 #include "mihawk-cpld.hpp"
 #include "pgood_monitor.hpp"
 #include "runtime_monitor.hpp"
 #include "ucd90160.hpp"
 
+#include <CLI/CLI.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdeventplus/event.hpp>
 
@@ -32,17 +32,31 @@
 
 int main(int argc, char** argv)
 {
-    ArgumentParser args{argc, argv};
-    auto action = args["action"];
+    CLI::App app{"Phosphor sequencer monitor"};
+    std::string action{};
+    std::string interVal{};
 
-    if ((action != "pgood-monitor") && (action != "runtime-monitor"))
+    std::vector<std::string> actionTypes = {"pgood-monitor", "runtime-monitor"};
+    app.add_option("-a,--action", action,
+                   "Action: pgood-monitor or runtime-monitor\n")
+        ->required()
+        ->transform(CLI::IsMember(actionTypes));
+    app.add_option("-i,--interval", interVal,
+                   "Interval in milliseconds:\n"
+                   "PGOOD monitor:   time allowed for PGOOD to come up\n"
+                   "Runtime monitor: polling interval.\n")
+        ->required();
+
+    try
     {
-        std::cerr << "Invalid action\n";
-        args.usage(argv);
-        exit(EXIT_FAILURE);
+        app.parse(argc, argv);
+    }
+    catch (CLI::Error& e)
+    {
+        return app.exit(e);
     }
 
-    auto i = strtoul(args["interval"].c_str(), nullptr, 10);
+    auto i = strtoul(interVal.c_str(), nullptr, 10);
     if (i == 0)
     {
         std::cerr << "Invalid interval value\n";
diff --git a/power-sequencer/meson.build b/power-sequencer/meson.build
index ea72127..b38cae5 100644
--- a/power-sequencer/meson.build
+++ b/power-sequencer/meson.build
@@ -23,7 +23,6 @@
 
 executable(
     'pseq-monitor',
-    'argument.cpp',
     error_hpp,
     'main.cpp',
     'pgood_monitor.cpp',
