diff --git a/evdevpp/test/.gitignore b/evdevpp/test/.gitignore
index e69de29..707e6e5 100644
--- a/evdevpp/test/.gitignore
+++ b/evdevpp/test/.gitignore
@@ -0,0 +1 @@
+/evmon
diff --git a/evdevpp/test/Makefile.am b/evdevpp/test/Makefile.am
index 36455d7..321721a 100644
--- a/evdevpp/test/Makefile.am
+++ b/evdevpp/test/Makefile.am
@@ -6,3 +6,21 @@
 noinst_PROGRAMS =
 
 TESTS = $(check_PROGRAMS)
+
+noinst_PROGRAMS += evmon
+evmon_SOURCES = \
+	evmon.cpp
+evmon_CXXFLAGS = \
+	$(LIBEVDEV_CFLAGS) \
+	${PHOSPHOR_DBUS_INTERFACES_CFLAGS} \
+	$(PHOSPHOR_LOGGING_CFLAGS) \
+	$(SDBUSPLUS_CFLAGS) \
+	$(SYSTEMD_CFLAGS)
+evmon_LDFLAGS = \
+	$(OESDK_TESTCASE_FLAGS)
+evmon_LDADD = \
+	$(LIBEVDEV_LIBS) \
+	${PHOSPHOR_DBUS_INTERFACES_LIBS} \
+	$(PHOSPHOR_LOGGING_LIBS) \
+	$(SDBUSPLUS_LIBS) \
+	$(SYSTEMD_LIBS)
diff --git a/evdevpp/test/evmon.cpp b/evdevpp/test/evmon.cpp
new file mode 100644
index 0000000..26163a7
--- /dev/null
+++ b/evdevpp/test/evmon.cpp
@@ -0,0 +1,158 @@
+/**
+ * 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 <algorithm>
+#include <cassert>
+#include <iostream>
+#include <iterator>
+#include <memory>
+#include "argument.hpp"
+#include "evdevpp/evdev.hpp"
+#include "sdevent/event.hpp"
+#include "sdevent/io.hpp"
+#include "utility.hpp"
+
+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 << "    --path               evdev devpath\n";
+    std::cerr << "    --type               evdev type\n";
+    std::cerr << "    --code               evdev code\n";
+    std::cerr << std::flush;
+}
+
+const option ArgumentParser::options[] =
+{
+    { "path",   required_argument,  NULL,   'p' },
+    { "type",   required_argument,  NULL,   't' },
+    { "code",   required_argument,  NULL,   'c' },
+    { 0, 0, 0, 0},
+};
+
+const char* ArgumentParser::optionstr = "p:t:c:";
+
+const std::string ArgumentParser::true_string = "true";
+const std::string ArgumentParser::empty_string = "";
+
+static void exit_with_error(const char* err, char** argv)
+{
+    ArgumentParser::usage(argv);
+    std::cerr << "\n";
+    std::cerr << "ERROR: " << err << "\n";
+    exit(-1);
+}
+
+} // namespace util
+} // namespace fan
+} // namespace phosphor
+
+int main(int argc, char* argv[])
+{
+    using namespace phosphor::fan::util;
+
+    auto options = std::make_unique<ArgumentParser>(argc, argv);
+    auto path = (*options)["path"];
+    auto stype = (*options)["type"];
+    auto scode = (*options)["code"];
+    unsigned int type = EV_KEY;
+
+    if (path == ArgumentParser::empty_string)
+    {
+        exit_with_error("Path not specified or invalid.", argv);
+    }
+    if (stype != ArgumentParser::empty_string)
+    {
+        type = stoul(stype);
+    }
+
+    if (scode == ArgumentParser::empty_string)
+    {
+        exit_with_error("Keycode not specified or invalid.", argv);
+    }
+    options.reset();
+
+    auto loop = sdevent::event::newDefault();
+    phosphor::fan::util::FileDescriptor fd(
+            open(path.c_str(), O_RDONLY | O_NONBLOCK));
+    auto evdev = evdevpp::evdev::newFromFD(fd());
+    sdevent::event::io::IO callback(
+            loop,
+            fd(),
+            [&evdev](auto& s)
+            {
+                unsigned int type, code, value;
+                std::tie(type, code, value) = evdev.next();
+                std::cout <<
+                    "type: " << libevdev_event_type_get_name(type) <<
+                    " code: " << libevdev_event_code_get_name(type, code) <<
+                    " value: " << value << "\n";
+            });
+
+    auto value = evdev.fetch(type, stoul(scode));
+    std::cout <<
+        "type: " << libevdev_event_type_get_name(type) <<
+        " code: " << libevdev_event_code_get_name(type, stoul(scode)) <<
+        " value: " << value << "\n";
+
+    loop.loop();
+
+    return 0;
+}
