diff --git a/alib2cli/src/command/NamesIntrospectionCommand.h b/alib2cli/src/command/NamesIntrospectionCommand.h
new file mode 100644
index 0000000000000000000000000000000000000000..4812a6d6a09a3bfbf0bcd2919435e843703c51f0
--- /dev/null
+++ b/alib2cli/src/command/NamesIntrospectionCommand.h
@@ -0,0 +1,35 @@
+#ifndef _CLI_NAME_INTROSPECTION_COMMAND_H_
+#define _CLI_NAME_INTROSPECTION_COMMAND_H_
+
+#include <command/Command.h>
+#include <environment/Environment.h>
+
+namespace cli {
+
+class NamesIntrospectionCommand : public Command {
+public:
+	void printNames ( const std::set < std::pair < std::string, std::set < std::string > > > & names ) const {
+		for ( const std::pair < std::string, std::set < std::string > > & entry : names ) {
+			std::cout << entry.first << " : ";
+			bool first = true;
+			for ( const std::string & name : entry.second ) {
+				if ( first )
+					first = false;
+				else
+					std::cout << ", ";
+
+				std::cout << name;
+			}
+			std::cout << std::endl;
+		}
+	}
+
+	virtual Command::Result run ( Environment & ) const override {
+		printNames ( abstraction::Registry::listNames ( ) );
+		return Command::Result::OK;
+	}
+};
+
+} /* namespace cli */
+
+#endif /* _CLI_NAME_INTROSPECTION_COMMAND_H_ */
diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index bec2d8c6d7624ab8f74bcbce3b717c8874310965..b5544c541d5782d248d50f6e15847762b5436c6a 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -26,6 +26,7 @@
 #include <command/AlgorithmsIntrospectionCommand.h>
 #include <command/OverloadsIntrospectionCommand.h>
 #include <command/DataTypesIntrospectionCommand.h>
+#include <command/NamesIntrospectionCommand.h>
 #include <command/CastsIntrospectionCommand.h>
 #include <command/SetCommand.h>
 
@@ -268,6 +269,10 @@ std::unique_ptr < Command > Parser::introspect_command ( ) {
 		std::unique_ptr < cli::Arg > param = optional_arg ( );
 		match ( cli::Lexer::TokenType::END );
 		return std::make_unique < DataTypesIntrospectionCommand > ( std::move ( param ) );
+	} else if ( check_nonreserved_kw ( "names" ) ) {
+		match_nonreserved_kw ( "names" );
+		match ( cli::Lexer::TokenType::END );
+		return std::make_unique < NamesIntrospectionCommand > ( );
 	} else if ( check_nonreserved_kw ( "casts" ) ) {
 		match_nonreserved_kw ( "casts" );
 		std::pair < bool, bool > from_to = introspect_cast_from_to ( );
diff --git a/alib2common/src/abstraction/AlgorithmRegistry.hpp b/alib2common/src/abstraction/AlgorithmRegistry.hpp
index f77a6bf690f21c3e9405a0252cc75bfd7fdf8c66..6b319e9ad113a3856f48ee095f00889e83f4d689 100644
--- a/alib2common/src/abstraction/AlgorithmRegistry.hpp
+++ b/alib2common/src/abstraction/AlgorithmRegistry.hpp
@@ -65,6 +65,9 @@ class AlgorithmRegistry {
 public:
 	template < class Algo, class ReturnType, class ... ParamTypes >
 	static void registerAlgorithm ( ReturnType ( * callback ) ( ParamTypes ... ), bool downcast, bool normalize, std::array < std::string, sizeof ... ( ParamTypes ) > paramNames ) {
+		/* make unused parameter warning go away in case of sizeof ... ( ParamTypes ) == 0 */
+		( void ) paramNames;
+
 		std::string algorithm = ext::to_string < Algo > ( );
 
 		ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > params;
diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp
index cc49d21f4feb0fe9b838832cab9e39453102b516..aaf0cd8e7afcada78d13697bcd8060561c98e8e6 100644
--- a/alib2common/src/abstraction/Registry.cpp
+++ b/alib2common/src/abstraction/Registry.cpp
@@ -16,6 +16,8 @@
 #include <abstraction/NormalizeRegistry.hpp>
 #include <abstraction/DowncastRegistry.hpp>
 
+#include <core/namingApi.hpp>
+
 namespace abstraction {
 
 std::set < std::string > Registry::listAlgorithmGroup ( const std::string & group ) {
@@ -46,6 +48,10 @@ std::set < std::pair < std::string, std::string > > Registry::listCasts ( ) {
 	return CastRegistry::list ( );
 }
 
+std::set < std::pair < std::string, std::set < std::string > > > Registry::listNames ( ) {
+	return alib::namingApi::list ( );
+}
+
 std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > Registry::listOverloads ( const std::string & algorithm ) {
 	return AlgorithmRegistry::listOverloads ( algorithm );
 }
diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h
index 9cd1e71cb399053f26f8ea74532ce80110eaecf3..acd0ec78fc5fc537d496e637dde34693e6ad78e9 100644
--- a/alib2common/src/abstraction/Registry.h
+++ b/alib2common/src/abstraction/Registry.h
@@ -27,6 +27,8 @@ public:
 
 	static std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm );
 
+	static std::set < std::pair < std::string, std::set < std::string > > > listNames ( );
+
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes );
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes, bool & unwrap, bool & normalize );
 	static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( const std::string & target, const std::string & param, bool & normalize );
diff --git a/alib2common/src/core/namingApi.hpp b/alib2common/src/core/namingApi.hpp
index 19658b45ad036cdf751e563dcb7cbd45fcbbc7ad..a9c7d1a3afa8be5a48e041fbe3f5f89242661c2a 100644
--- a/alib2common/src/core/namingApi.hpp
+++ b/alib2common/src/core/namingApi.hpp
@@ -45,6 +45,20 @@ public:
 		return name != getNames ( ).end ( );
 	}
 
+	static std::set < std::pair < std::string, std::set < std::string > > > list ( ) {
+		std::set < std::pair < std::string, std::set < std::string > > > res;
+
+		for ( const std::pair < const std::string, ext::set < ext::type_index > > & entry : getNames ( ) ) {
+			std::set < std::string > names;
+			for ( const ext::type_index & name : entry.second )
+				names.insert ( ext::to_string ( name ) );
+
+			res.insert ( std::make_pair ( entry.first, names ) );
+		}
+
+		return res;
+	}
+
 };
 
 } /* namespace alib */