diff --git a/Modules/Core/ComponentInterface/ComponentBase.h b/Modules/Core/ComponentInterface/ComponentBase.h
index 78da4c6aa435408dd277e716dac4cf1c8bd335d1..06857cfde89a01399fc88c6ac14e08aabec1a71c 100644
--- a/Modules/Core/ComponentInterface/ComponentBase.h
+++ b/Modules/Core/ComponentInterface/ComponentBase.h
@@ -9,6 +9,5 @@ namespace elx
   protected:
     virtual ~ComponentBase(){};
   };
-
 } // end namespace elx
 #endif // #define ComponentBase_h
\ No newline at end of file
diff --git a/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.cxx b/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.cxx
index 0b8fac5cff5f5bcd7997bb52a99417f575236702..87146c75094bb083b60eb4dd26ed57fc06c49fc4 100644
--- a/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.cxx
+++ b/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.cxx
@@ -20,26 +20,28 @@ int GDOptimizer3rdPartyComponent::ConnectFrom(const char * interfacename, Compon
   if (std::strcmp(InterfaceName<InterfaceAcceptor<MetricValueInterface>>::Get(), interfacename) == 0)
   {
     InterfaceAcceptor<MetricValueInterface>* acceptIF = static_cast<InterfaceAcceptor<MetricValueInterface>*> (this);
-    if (!acceptIF)
+    // static_cast always succeeds since we know via the template arguments of the component what InterfaceAcceptors are base classes.
+    // connect value interfaces
+    if (1 == acceptIF->Connect(other))
     {
-      std::cout << InterfaceName<InterfaceAcceptor<MetricValueInterface>>::Get() << " optimizer has no OptimizerValueInterface" << std::endl;
+      return 1; //success, assume only one interface listens interfacename
     }
-    // connect value interfaces
-    acceptIF->Connect(other);
-    return 1; //success, assume only one interface listens interfacename
-  }
-  if (std::strcmp(InterfaceName<InterfaceAcceptor<MetricDerivativeInterface>>::Get(), interfacename) == 0)
-  {
-    InterfaceAcceptor<MetricDerivativeInterface>* acceptIF = static_cast<InterfaceAcceptor<MetricDerivativeInterface>*> (this);
-    if (!acceptIF)
+    else
     {
-      std::cout << InterfaceName<InterfaceAcceptor<MetricDerivativeInterface>>::Get() << " optimizer has no OptimizerValueInterface" << std::endl;
+      if (std::strcmp(InterfaceName<InterfaceAcceptor<MetricDerivativeInterface>>::Get(), interfacename) == 0)
+      {
+        InterfaceAcceptor<MetricDerivativeInterface>* acceptIF = static_cast<InterfaceAcceptor<MetricDerivativeInterface>*> (this);
+        if (!acceptIF)
+        {
+          std::cout << InterfaceName<InterfaceAcceptor<MetricDerivativeInterface>>::Get() << " optimizer has no OptimizerValueInterface" << std::endl;
+        }
+        // connect value interfaces
+        acceptIF->Connect(other);
+        return 1; //success, assume only one interface listens interfacename
+      }
+      return 0;
     }
-    // connect value interfaces
-    acceptIF->Connect(other);
-    return 1; //success, assume only one interface listens interfacename
   }
-  return 0;
 }
 
 int GDOptimizer3rdPartyComponent::Set(MetricValueInterface* component)
diff --git a/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.h b/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.h
index 7addba7b1581a17eedbdc53b20d410bf987dd4ad..8a8cd8195321acfb8b381c4fca59804a78d88c3d 100644
--- a/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.h
+++ b/Modules/Core/ComponentInterface/GDOptimizer3rdPartyComponent.h
@@ -9,7 +9,13 @@
 
 namespace elx
 {
-  class GDOptimizer3rdPartyComponent : public ComponentBase, public InterfaceAcceptor<MetricValueInterface>, public InterfaceAcceptor<MetricDerivativeInterface>, public OptimizerUpdateInterface
+
+  class GDOptimizer3rdPartyComponent : 
+    public Implements<
+      Accepting< MetricValueInterface, MetricDerivativeInterface >,
+      //Accepting< InterfaceAcceptor<MetricValueInterface>, InterfaceAcceptor<MetricDerivativeInterface> >,
+      Providing< OptimizerUpdateInterface>
+    >
   {
   public:
     GDOptimizer3rdPartyComponent();
diff --git a/Modules/Core/ComponentInterface/Interfaces.hxx b/Modules/Core/ComponentInterface/Interfaces.hxx
index c74468bb241d66d4780e6c5bd3bad6ed6fa74c49..f5071a0b5ea7eb2842c95fb7f765a8fc31b7a640 100644
--- a/Modules/Core/ComponentInterface/Interfaces.hxx
+++ b/Modules/Core/ComponentInterface/Interfaces.hxx
@@ -38,7 +38,7 @@ int InterfaceAcceptor<InterfaceT>::Connect(ComponentBase* providerComponent){
     InterfaceT* providerInterface = dynamic_cast<InterfaceT*> (providerComponent);
     if (!providerInterface)
     {
-      std::cout << "providerComponent does not have required interface" << std::endl;
+      std::cout << "providerComponent does not have required " << InterfaceName < InterfaceT >::Get() << std::endl;
       return 0;
     }
     // connect value interfaces
@@ -47,6 +47,71 @@ int InterfaceAcceptor<InterfaceT>::Connect(ComponentBase* providerComponent){
   }
 
 
+//template<typename... Interfaces>
+//class Accepting : public Interfaces...
+//{
+//};
+
+//template<>
+//class Accepting<>
+//{
+//};
+
+
+//template<typename FirstInterface>
+//class Accepting : public InterfaceAcceptor < FirstInterface >
+//{
+//};
+
+template<typename ... RestInterfaces>
+class Accepting
+{
+};
+
+
+//template<typename FirstInterface, typename ... RestInterfaces>
+//class Accepting<FirstInterface, RestInterfaces... > : public InterfaceAcceptor<FirstInterface>, public Accepting< RestInterfaces ... >
+//{
+//};
+
+template<typename FirstInterface, typename ... RestInterfaces>
+class Accepting<FirstInterface, RestInterfaces... > : public Accepting< RestInterfaces ... >, public InterfaceAcceptor<FirstInterface>
+{
+  //FirstInterface firstIF;
+};
+
+
+
+template<typename... Interfaces>
+class Providing : public Interfaces...
+{
+};
+
+template<typename AcceptingInterfaces, typename ProvidingInterfaces>
+class Implements : public ComponentBase, public AcceptingInterfaces, public ProvidingInterfaces
+{
+  typedef typename AcceptingInterfaces AcceptingInterfacesType;
+  typedef typename ProvidingInterfaces ProvidingInterfacesType;
+};
+
+/*
+// 
+
+template <typename First, typename ... Rest>
+int ConnectFromBaseQueryInterface(GUID const & id) noexcept
+{
+  if (id == __uuidof(First) || id == __uuidof(::IUnknown))
+  {
+    return static_cast<First *>(this);
+  }
+  if (IsInspectable<Interfaces ...>() &&
+    id == __uuidof(::IInspectable))
+  {
+    return FindInspectable<Interfaces ...>();
+  }
+  return FindInterface<Rest ...>(id);
+}
+*/
 // TEST
 template<class InterfaceT>
 class InterfaceProvider {
diff --git a/Modules/Core/ComponentInterface/componenthandshake.cxx b/Modules/Core/ComponentInterface/componenthandshake.cxx
index 930b202813e5c9a7e39b94404d051e2a469c94df..78149b0c73f0173f779567a1f636c88ffa93a040 100644
--- a/Modules/Core/ComponentInterface/componenthandshake.cxx
+++ b/Modules/Core/ComponentInterface/componenthandshake.cxx
@@ -13,6 +13,8 @@
 using namespace elx;
   int main() {
     {
+      tuple<double, long long, const char*> t1(12.2, 42, "big");
+
       std::cout << InterfaceName<MetricValueInterface>::Get() << std::endl;
 
       std::cout << AcceptorInterfaceName<InterfaceAcceptor<MetricValueInterface>>::Get() << std::endl;