diff --git a/control/argument.cpp b/control/argument.cpp
deleted file mode 100644
index cd6e6da..0000000
--- a/control/argument.cpp
+++ /dev/null
@@ -1,92 +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 fan
-{
-namespace util
-{
-
-ArgumentParser::ArgumentParser(int argc, char** argv)
-{
-    auto 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 : true_string);
-        }
-    }
-}
-
-const std::string& ArgumentParser::operator[](const std::string& opt)
-{
-    auto i = arguments.find(opt);
-    if (i == arguments.end())
-    {
-        return empty_string;
-    }
-    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
-        << "    --init               Sets fans to full speed, delays, exits\n";
-    std::cerr << "    --control            Start fan control algorithm\n";
-    std::cerr << std::flush;
-}
-
-const option ArgumentParser::options[] = {
-    {"init", no_argument, NULL, 'i'},
-    {"control", no_argument, NULL, 'c'},
-    {"help", no_argument, NULL, 'h'},
-    {0, 0, 0, 0},
-};
-
-const char* ArgumentParser::optionstr = "ich?";
-
-const std::string ArgumentParser::true_string = "true";
-const std::string ArgumentParser::empty_string = "";
-
-} // namespace util
-} // namespace fan
-} // namespace phosphor
-// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/control/main.cpp b/control/main.cpp
index 3596b14..e28e947 100644
--- a/control/main.cpp
+++ b/control/main.cpp
@@ -16,8 +16,9 @@
 #include "config.h"
 
 #ifndef CONTROL_USE_JSON
-#include "argument.hpp"
 #include "manager.hpp"
+
+#include <CLI/CLI.hpp>
 #else
 #include "../utils/flight_recorder.hpp"
 #include "json/manager.hpp"
@@ -53,28 +54,32 @@
     auto event = phosphor::fan::util::SDEventPlus::getEvent();
 
 #ifndef CONTROL_USE_JSON
-    phosphor::fan::util::ArgumentParser args(argc, argv);
-    if (argc != 2)
+    CLI::App app{"Phosphor Fan Control"};
+
+    bool init = false;
+    bool control = false;
+    app.add_flag("-i,--init", init, "Sets fans to full speed, delays, exits");
+    app.add_flag("-c,--control", control, "Start fan control algorithm");
+    app.require_option();
+
+    try
     {
-        args.usage(argv);
-        return 1;
+        app.parse(argc, argv);
+    }
+    catch (const CLI::Error& e)
+    {
+        return app.exit(e);
     }
 
     Mode mode;
-
-    if (args["init"] == "true")
+    if (init)
     {
         mode = Mode::init;
     }
-    else if (args["control"] == "true")
+    else if (control)
     {
         mode = Mode::control;
     }
-    else
-    {
-        args.usage(argv);
-        return 1;
-    }
 #endif
 
     // Attach the event object to the bus object so we can
diff --git a/control/meson.build b/control/meson.build
index 9dce7d2..aa77784 100644
--- a/control/meson.build
+++ b/control/meson.build
@@ -74,7 +74,6 @@
 
     sources += [
         'actions.cpp',
-        'argument.cpp',
         'fan.cpp',
         fan_zone_defs_cpp_dep,
         'manager.cpp',
