diff --git a/Modules/Core/ComponentInterface/CmakeLists.txt b/Modules/Core/ComponentInterface/CmakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4d16216845cb4b2dde463b797c74bb5cf01d740
--- /dev/null
+++ b/Modules/Core/ComponentInterface/CmakeLists.txt
@@ -0,0 +1,5 @@
+PROJECT(componenthandshake)
+cmake_minimum_required(VERSION 2.6)
+cmake_policy(VERSION 2.6)
+
+ADD_EXECUTABLE(componenthandshake componenthandshake.cxx)
diff --git a/Modules/Core/ComponentInterface/componenthandshake.cxx b/Modules/Core/ComponentInterface/componenthandshake.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..bd57a088f49e93fff5b353284e11e66d119f898d
--- /dev/null
+++ b/Modules/Core/ComponentInterface/componenthandshake.cxx
@@ -0,0 +1,286 @@
+// multiple inheritance
+#include <iostream>
+
+class Metric3rdPartyBase{
+public:
+  virtual int GetValue() = 0;
+  virtual int GetDerivative() = 0;
+};
+
+class Optimizer3rdPartyBase{
+public:
+  virtual int SetMetric(Metric3rdPartyBase*) = 0;
+  virtual int Optimize() = 0;
+};
+
+class Metric4rdPartyBase{
+public:
+  virtual int GetCost() = 0; // with different naming convention than 3rd party
+};
+
+class Optimizer4rdPartyBase{
+public:
+  virtual int SetMetric(Metric4rdPartyBase*) = 0;
+  virtual int DoOptimization() = 0; // with different naming convention than 3rd party
+protected:
+  Metric4rdPartyBase* theMetric;
+};
+
+class SSDMetric3rdParty : public Metric3rdPartyBase {
+public:
+  virtual int GetValue() { return 1; };
+  virtual int GetDerivative() { return 2; };
+};
+
+class GDOptimizer3rdParty : public Optimizer3rdPartyBase {
+public:
+  virtual int SetMetric(Metric3rdPartyBase*);
+  virtual int Optimize();
+  Metric3rdPartyBase* metric;
+};
+
+class SSDMetric4rdParty : public Metric4rdPartyBase {
+public:
+  virtual int GetCost() { return 3; };
+};
+
+class GDOptimizer4rdParty : public Optimizer4rdPartyBase {
+public:
+  GDOptimizer4rdParty();
+  ~GDOptimizer4rdParty();
+  virtual int SetMetric(Metric4rdPartyBase*);
+  virtual int DoOptimization();
+};
+
+GDOptimizer4rdParty::GDOptimizer4rdParty()
+{
+  this->theMetric = nullptr;
+}
+GDOptimizer4rdParty::~GDOptimizer4rdParty()
+{
+}
+int GDOptimizer4rdParty::SetMetric(Metric4rdPartyBase* metric)
+{
+  this->theMetric = metric;
+  return 0;
+}
+int GDOptimizer4rdParty::DoOptimization()
+{
+  if (this->theMetric != nullptr)
+  {
+    std::cout << "GDOptimizer4rdParty->DoOptimization():" << std::endl;
+    std::cout << "  theMetric->GetCost():" << theMetric->GetCost() << std::endl;
+  }
+  return 0;
+}
+
+class ComponentBase {
+public:
+  virtual ~ComponentBase(){};
+};
+
+class MetricDerivativeInterface {
+  public:
+    virtual int GetDerivative() = 0;
+};
+
+class MetricValueInterface {
+  public:
+    virtual int GetValue() = 0;
+};
+
+class OptimizerValueInterface {
+public:
+  virtual int SetMetricValueComponentInterface(MetricValueInterface*) = 0;
+};
+
+class OptimizerDerivativeInterface {
+public:
+  virtual int SetMeticDerivativeComponentInterface(MetricDerivativeInterface*) = 0;
+};
+
+class OptimizerUpdateInterface {
+public:
+  virtual int Update() = 0;
+};
+
+class SSDMetric3rdPartyComponent: public ComponentBase, public MetricDerivativeInterface, public MetricValueInterface {
+public:
+  SSDMetric3rdPartyComponent();
+  ~SSDMetric3rdPartyComponent();
+  SSDMetric3rdParty* theImplementation;
+  int GetValue();
+  int GetDerivative();
+};
+
+SSDMetric3rdPartyComponent::SSDMetric3rdPartyComponent()
+{
+  this->theImplementation = new SSDMetric3rdParty();
+}
+SSDMetric3rdPartyComponent::~SSDMetric3rdPartyComponent()
+{
+  delete this->theImplementation; 
+}
+
+int SSDMetric3rdPartyComponent::GetDerivative()
+{
+  return this->theImplementation->GetDerivative();
+};
+
+int SSDMetric3rdPartyComponent::GetValue()
+{
+  return this->theImplementation->GetValue();
+};
+
+
+
+class SSDMetric4rdPartyComponent : public ComponentBase, public MetricValueInterface {
+public:
+  SSDMetric4rdPartyComponent();
+  ~SSDMetric4rdPartyComponent();
+  SSDMetric4rdParty* theImplementation;
+  int GetValue();
+};
+
+SSDMetric4rdPartyComponent::SSDMetric4rdPartyComponent()
+{
+  this->theImplementation = new SSDMetric4rdParty();
+}
+SSDMetric4rdPartyComponent::~SSDMetric4rdPartyComponent()
+{
+  delete this->theImplementation;
+}
+
+int SSDMetric4rdPartyComponent::GetValue()
+{
+  return this->theImplementation->GetCost(); // translate method name
+};
+
+class Metric4rdPartyWrapper : public Metric4rdPartyBase  {
+public:
+  void SetMetricValueComponent(MetricValueInterface*);
+  virtual int GetCost();
+private:
+  MetricValueInterface* metricval;
+};
+
+void Metric4rdPartyWrapper::SetMetricValueComponent(MetricValueInterface* metricValueComponent)
+{
+  this->metricval = metricValueComponent;
+}
+
+int Metric4rdPartyWrapper::GetCost()
+{
+  return this->metricval->GetValue();
+}
+
+class GDOptimizer4rdPartyComponent : public ComponentBase, public OptimizerValueInterface, public OptimizerUpdateInterface
+{
+public:
+  GDOptimizer4rdPartyComponent();
+  ~GDOptimizer4rdPartyComponent();
+  GDOptimizer4rdParty* theImplementation;
+  Metric4rdPartyWrapper* MetricObject;
+  MetricDerivativeInterface* metricDerivativeInterface;
+  int SetMetricValueComponentInterface(MetricValueInterface*);
+  int Update();
+};
+
+GDOptimizer4rdPartyComponent::GDOptimizer4rdPartyComponent()
+{
+  this->theImplementation = new GDOptimizer4rdParty();
+  this->MetricObject = new Metric4rdPartyWrapper();
+}
+GDOptimizer4rdPartyComponent::~GDOptimizer4rdPartyComponent()
+{
+  delete this->theImplementation;
+  delete this->MetricObject;
+}
+
+int GDOptimizer4rdPartyComponent::SetMetricValueComponentInterface(MetricValueInterface* component)
+{
+  this->MetricObject->SetMetricValueComponent(component);
+  return 0;
+}
+int GDOptimizer4rdPartyComponent::Update()
+{
+  this->theImplementation->SetMetric(this->MetricObject);
+  return this->theImplementation->DoOptimization();
+}
+
+int main () {
+  {
+    SSDMetric3rdPartyComponent* tempmetric3p = new SSDMetric3rdPartyComponent();
+    ComponentBase* metric3p = tempmetric3p;
+
+    MetricValueInterface* valIF = dynamic_cast<MetricValueInterface*> (metric3p);
+    std::cout << valIF->GetValue() << std::endl;
+
+    MetricDerivativeInterface* derIF = dynamic_cast<MetricDerivativeInterface*> (metric3p);
+    std::cout << derIF->GetDerivative() << std::endl;
+  }
+  /************************/
+  {
+    SSDMetric4rdPartyComponent* tempmetric4p = new SSDMetric4rdPartyComponent();
+    ComponentBase* metric4p = tempmetric4p;
+
+    GDOptimizer4rdPartyComponent* tempOptimizer4p = new GDOptimizer4rdPartyComponent();
+    ComponentBase* optimizer4p = tempOptimizer4p;
+
+    MetricValueInterface* metvalIF = dynamic_cast<MetricValueInterface*> (metric4p);
+    if (!metvalIF)
+    {
+      std::cout << "metric4p has no MetricValueInterface" << std::endl;
+    }
+
+    OptimizerValueInterface* opValIF = dynamic_cast<OptimizerValueInterface*> (optimizer4p);
+    if (!opValIF)
+    {
+      std::cout << "optimizer4p has no OptimizerValueInterface" << std::endl;
+    }
+
+    // connect value interfaces
+    opValIF->SetMetricValueComponentInterface(metvalIF); 
+    OptimizerUpdateInterface* opUpdIF = dynamic_cast<OptimizerUpdateInterface*> (optimizer4p);
+    if (!opValIF)
+    {
+      std::cout << "optimizer4p has no OptimizerUpdateInterface" << std::endl;
+    }
+    
+    // Update the optimizer component 
+    opUpdIF->Update();
+  }
+
+  {
+    SSDMetric3rdPartyComponent* tempmetric3p = new SSDMetric3rdPartyComponent();
+    ComponentBase* metric3p = tempmetric3p;
+
+    GDOptimizer4rdPartyComponent* tempOptimizer4p = new GDOptimizer4rdPartyComponent();
+    ComponentBase* optimizer4p = tempOptimizer4p;
+
+    MetricValueInterface* metvalIF = dynamic_cast<MetricValueInterface*> (metric3p);
+    if (!metvalIF)
+    {
+      std::cout << "metric3p has no MetricValueInterface" << std::endl;
+    }
+
+    OptimizerValueInterface* opValIF = dynamic_cast<OptimizerValueInterface*> (optimizer4p);
+    if (!opValIF)
+    {
+      std::cout << "optimizer4p has no OptimizerValueInterface" << std::endl;
+    }
+
+    // connect value interfaces
+    opValIF->SetMetricValueComponentInterface(metvalIF);
+    OptimizerUpdateInterface* opUpdIF = dynamic_cast<OptimizerUpdateInterface*> (optimizer4p);
+    if (!opValIF)
+    {
+      std::cout << "optimizer4p has no OptimizerUpdateInterface" << std::endl;
+    }
+
+    // Update the optimizer component 
+    opUpdIF->Update();
+  }
+
+  return 0;
+}
\ No newline at end of file