diff --git a/src/vasingletonmethods.hpp b/src/vasingletonmethods.hpp
index 7726a09c742f68a0310d669b700778643901e2aa..ea8a406c908890d63e56bea134b585b065998ee0 100644
--- a/src/vasingletonmethods.hpp
+++ b/src/vasingletonmethods.hpp
@@ -96,7 +96,21 @@ static PyObject* va_reset(PyObject*, PyObject*)
 static PyObject* va_enumerate_modules(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames)
 {
 	VAPY_REQUIRE_CONN_TRY;
-	VA_EXCEPT_NOT_IMPLEMENTED;
+
+	std::vector< CVAModuleInfo > voModuleInfos;
+	g_pVANetClient->GetCoreInstance()->EnumerateModules(voModuleInfos);
+
+	PyObject *pModuleList = PyList_New(voModuleInfos.size());
+
+	for (size_t i = 0; i < voModuleInfos.size(); i++)
+	{
+		CVAModuleInfo& oModule(voModuleInfos[i]);
+		PyObject* pModuleInfo = Py_BuildValue("{s:i,s:s,s:s}", "index", i, "name", oModule.sName, "description", oModule.sDesc);
+		PyList_SetItem(pModuleList, i, pModuleInfo); // steals reference
+	}
+
+	return pModuleList;
+
 	VAPY_CATCH_RETURN;
 };