diff --git a/include/Utils.hpp b/include/Utils.hpp
index 90392fb..6e663e6 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -149,3 +149,9 @@
     }
     return true;
 }
+
+/// \brief Match a Dbus property against a probe statement.
+/// \param probe the probe statement to match against.
+/// \param dbusValue the property value being matched to a probe.
+/// \return true if the dbusValue matched the probe otherwise false.
+bool matchProbe(const nlohmann::json& probe, const BasicVariantType& dbusValue);
diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index 62c5749..8b3dc4d 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -278,64 +278,7 @@
             auto deviceValue = device.find(match.first);
             if (deviceValue != device.end())
             {
-                switch (match.second.type())
-                {
-                    case nlohmann::json::value_t::string:
-                    {
-                        std::regex search(match.second.get<std::string>());
-                        std::smatch regMatch;
-
-                        // convert value to string respresentation
-                        std::string probeValue = std::visit(
-                            VariantToStringVisitor(), deviceValue->second);
-                        if (!std::regex_search(probeValue, regMatch, search))
-                        {
-                            deviceMatches = false;
-                            break;
-                        }
-                        break;
-                    }
-                    case nlohmann::json::value_t::boolean:
-                    case nlohmann::json::value_t::number_unsigned:
-                    {
-                        unsigned int probeValue = std::visit(
-                            VariantToUnsignedIntVisitor(), deviceValue->second);
-
-                        if (probeValue != match.second.get<unsigned int>())
-                        {
-                            deviceMatches = false;
-                        }
-                        break;
-                    }
-                    case nlohmann::json::value_t::number_integer:
-                    {
-                        int probeValue = std::visit(VariantToIntVisitor(),
-                                                    deviceValue->second);
-
-                        if (probeValue != match.second.get<int>())
-                        {
-                            deviceMatches = false;
-                        }
-                        break;
-                    }
-                    case nlohmann::json::value_t::number_float:
-                    {
-                        float probeValue = std::visit(VariantToFloatVisitor(),
-                                                      deviceValue->second);
-
-                        if (probeValue != match.second.get<float>())
-                        {
-                            deviceMatches = false;
-                        }
-                        break;
-                    }
-                    default:
-                    {
-                        std::cerr << "unexpected dbus probe type "
-                                  << match.second.type_name() << "\n";
-                        deviceMatches = false;
-                    }
-                }
+                deviceMatches = matchProbe(match.second, deviceValue->second);
             }
             else
             {
diff --git a/src/Utils.cpp b/src/Utils.cpp
index b872ee7..27f1c15 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -391,3 +391,66 @@
     }
     return ret;
 }
+
+bool matchProbe(const nlohmann::json& probe, const BasicVariantType& dbusValue)
+{
+    bool deviceMatches = true;
+
+    switch (probe.type())
+    {
+        case nlohmann::json::value_t::string:
+        {
+            std::regex search(probe.get<std::string>());
+            std::smatch regMatch;
+
+            // convert value to string respresentation
+            std::string probeValue =
+                std::visit(VariantToStringVisitor(), dbusValue);
+            if (!std::regex_search(probeValue, regMatch, search))
+            {
+                deviceMatches = false;
+                break;
+            }
+            break;
+        }
+        case nlohmann::json::value_t::boolean:
+        case nlohmann::json::value_t::number_unsigned:
+        {
+            unsigned int probeValue =
+                std::visit(VariantToUnsignedIntVisitor(), dbusValue);
+
+            if (probeValue != probe.get<unsigned int>())
+            {
+                deviceMatches = false;
+            }
+            break;
+        }
+        case nlohmann::json::value_t::number_integer:
+        {
+            int probeValue = std::visit(VariantToIntVisitor(), dbusValue);
+
+            if (probeValue != probe.get<int>())
+            {
+                deviceMatches = false;
+            }
+            break;
+        }
+        case nlohmann::json::value_t::number_float:
+        {
+            float probeValue = std::visit(VariantToFloatVisitor(), dbusValue);
+
+            if (probeValue != probe.get<float>())
+            {
+                deviceMatches = false;
+            }
+            break;
+        }
+        default:
+        {
+            std::cerr << "unexpected dbus probe type " << probe.type_name()
+                      << "\n";
+            deviceMatches = false;
+        }
+    }
+    return deviceMatches;
+}
