diff --git a/Modules/Core/Blueprints/include/elxBlueprint.h b/Modules/Core/Blueprints/include/elxBlueprint.h
index 8b42694b8227d2e0881a67b086f7af79147c2090..f0a9d19df23ee68bb071f4b27439226cc546eff0 100644
--- a/Modules/Core/Blueprints/include/elxBlueprint.h
+++ b/Modules/Core/Blueprints/include/elxBlueprint.h
@@ -1,57 +1,101 @@
 #ifndef __Blueprint_h
 #define __Blueprint_h
 
+#include "boost/graph/graph_traits.hpp"
+#include "boost/graph/directed_graph.hpp"
+
 #include "itkObjectFactory.h"
 #include "itkDataObject.h"
 
 #include "elxMacro.h"
-#include "elxComponentDescriptor.h"
-
-#include "boost/graph/graph_traits.hpp"
-#include "boost/graph/directed_graph.hpp"
 
 namespace elx {
 
-template< class TComponentDescriptor >
 class Blueprint : public itk::DataObject
 {
 public:
 
   elxNewMacro( Blueprint, itk::DataObject );
 
-  typedef TComponentDescriptor                                                ComponentDescriptorType;
-  typedef typename TComponentDescriptor::ComponentNameType                    ComponentNameType;
+  typedef std::string                                                ParameterKeyType;
+  typedef std::vector< std::string >                                 ParameterValueType;
+  typedef std::map< ParameterKeyType, ParameterValueType >           ParameterMapType;
+
+  // Component parameter map that sits on a node in the graph 
+  // and holds component configuration settings
+  struct ComponentPropertyType { 
+    ParameterMapType parameterMap;
+  };
+
+  // Component parameter map that sits on an edge in the graph 
+  // and holds component configuration settings
+  struct ConnectionPropertyType { 
+    ParameterMapType parameterMap;
+  };
   
   typedef boost::adjacency_list< boost::vecS,      
                                  boost::vecS,      
                                  boost::directedS,
-                                 ComponentDescriptorType >                    GraphType;
-
-  typedef typename boost::graph_traits< GraphType >::vertex_descriptor        ComponentType;
-  typedef typename boost::graph_traits< GraphType >::vertex_iterator          ComponentIterator, ComponentIteratorEnd;
-
-  typedef boost::vertex_index_t                                               ComponentIndexType;
-  typedef typename boost::property_map< GraphType, ComponentIndexType >::type ComponentIndexMapType;
-
-  typedef typename boost::graph_traits< GraphType >::edge_descriptor          ConnectionDescriptorType;
-  typedef typename boost::graph_traits< GraphType >::edge_iterator            ConnectionIterator, ConnectionIteratorEnd;
-
-  typedef typename boost::graph_traits< GraphType >::in_edge_iterator         InputIterator, InputIteratorEnd;
-  typedef typename boost::graph_traits< GraphType >::out_edge_iterator        OutputIterator, OutputIteratorEnd;
-
-  int TestFunction( void );
-  bool AddComponent( ComponentDescriptorType component );
-  bool SetComponent( ComponentIndexType componentIndex, ComponentDescriptorType component );
-  ComponentDescriptorType GetComponent( ComponentIndexType componentIndex );
-  bool RemoveComponent( ComponentDescriptorType component );
-
-  bool SetConnection( ComponentIndexType upstream, ComponentIndexType downstream );
-  ConnectionDescriptorType GetConnection( ConnectionDescriptorType Connection );
-  bool RemoveConnection( ConnectionDescriptorType connection );
-
-  void PrintGraph( void );
+                                 ComponentPropertyType,
+                                 ConnectionPropertyType >             GraphType;
+
+  typedef boost::graph_traits< GraphType >::vertex_descriptor         ComponentIndexType;
+  typedef boost::graph_traits< GraphType >::vertex_iterator           ComponentIteratorType;
+  typedef std::pair< ComponentIteratorType, ComponentIteratorType >   ComponentIteratorPairType;
+
+  typedef boost::graph_traits< GraphType >::edge_descriptor           ConnectionIndexType;
+  typedef boost::graph_traits< GraphType >::edge_iterator             ConnectionIteratorType;
+  typedef std::pair< ConnectionIteratorType, ConnectionIteratorType > ConnectionIteratorPairType;
+
+  typedef boost::graph_traits< GraphType >::in_edge_iterator          InputIteratorType;
+  typedef std::pair< InputIteratorType, InputIteratorType >           InputIteratorPairType;
+
+  typedef boost::graph_traits< GraphType >::out_edge_iterator         OutputIteratorType;
+  typedef std::pair< OutputIteratorType, OutputIteratorType >         OutputIteratorPairType;
+
+  // Interface for managing components
+  ComponentIndexType AddComponent( void );
+  ComponentIndexType AddComponent( ParameterMapType parameterMap );
+  ParameterMapType GetComponent( ComponentIndexType index );
+  void SetComponent( ComponentIndexType, ParameterMapType parameterMap );
+
+  // TODO: Let user delete component. Before we do this, we need a proper way of 
+  // checking that a vertex exist. Otherwise a call to GetComponent() on 
+  // a deleted vertex will result in segfault. It is not really a in issue
+  // _before_ release since typically we (the developers) will use blueprint 
+  // interface procedurally.
+  // void DeleteComponent( ComponentIndexType );
+
+  ComponentIteratorPairType GetComponentIterator( void ) {
+    return boost::vertices( this->m_Graph );
+  }
+
+  // Interface for managing connections between components in which we 
+  // deliberately avoid using connection indexes, but instead force
+  // the user to think in terms of components (which is conceptually simpler)
+  bool AddConnection( ComponentIndexType upstream, ComponentIndexType downstream );
+  bool AddConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap );
+  ParameterMapType GetConnection( ComponentIndexType upstream, ComponentIndexType downstream );
+  bool SetConnection(  ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap );
+  bool DeleteConnection( ComponentIndexType upstream, ComponentIndexType downstream );
+  bool ConnectionExists( ComponentIndexType upstream, ComponentIndexType downstream );
+
+  // Returns iterator for all connections in the graph
+  ConnectionIteratorPairType GetConnectionIterator( void ) {
+    return boost::edges(this->m_Graph);
+  }
+
+  // Returns the outgoing connections from a component in the graph,
+  // i.e. all components that reads data from given component
+  OutputIteratorPairType GetOutputIterator( const ComponentIndexType index ) {
+    return boost::out_edges( index, this->m_Graph );
+  }
+
+  void WriteBlueprint( const std::string filename );
 
 private:
+  
+  ConnectionIndexType GetConnectionIndex( ComponentIndexType upsteam, ComponentIndexType downstream );
 
   GraphType m_Graph;
 
diff --git a/Modules/Core/Blueprints/include/elxComponentDescriptor.h b/Modules/Core/Blueprints/include/elxComponentDescriptor.h
deleted file mode 100644
index 8f5402e4526532088cc8089d4af95d775a848b33..0000000000000000000000000000000000000000
--- a/Modules/Core/Blueprints/include/elxComponentDescriptor.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef __ComponentDescriptor_h
-#define __ComponentDescriptor_h
-
-#include "elxMacro.h"
-#include "itkObjectFactory.h"
-#include "itkDataObject.h"
-
-namespace elx {
-
-class ComponentDescriptor : public itk::DataObject
-{
-public:
-
-  elxNewMacro( ComponentDescriptor, itk::DataObject );
-
-  // Identifier to find component in the component database
-  typedef std::string ComponentNameType;
-
-  ComponentDescriptor( void ) { this->SetComponentName( ComponentNameType() ); }
-  ComponentDescriptor( const ComponentNameType componentName );
-
-  // TODO: Setter should validate ComponentName exists in ComponentDatabase
-  itkSetMacro( ComponentName, ComponentNameType ); 
-  itkGetMacro( ComponentName, ComponentNameType );
-
-private:
-
-  ComponentNameType m_ComponentName;
-
-};
-
-}
-
-#endif // __ComponentDescriptor_h
diff --git a/Modules/Core/Blueprints/src/elxBlueprint.cxx b/Modules/Core/Blueprints/src/elxBlueprint.cxx
index b3319d01551325a82b0926f0f1a33fd4fd3f7abf..d78d2ce6882287d6a42176310b6afea3c2cb0ff4 100644
--- a/Modules/Core/Blueprints/src/elxBlueprint.cxx
+++ b/Modules/Core/Blueprints/src/elxBlueprint.cxx
@@ -1,77 +1,160 @@
-#ifndef __Blueprint_hxx
-#define __Blueprint_hxx
+#ifndef __Blueprint_cxx
+#define __Blueprint_cxx
 
-#include <boost/graph/graphviz.hpp>
+#include "boost/graph/graphviz.hpp"
 
 #include "elxBlueprint.h"
 
 namespace elx {
 
-/*
-Blueprint< ComponentDescriptor >::ComponentDescriptorType
-Blueprint< ComponentDescriptor >
-::AddComponent( ComponentDescriptorType component )
+Blueprint::ComponentIndexType
+Blueprint
+::AddComponent( void )
 {
-  // TODO: Check that the component is in the ComponentDatabase
   this->Modified();
-  return this->m_Graph->add_vertex( component );
+
+  ComponentIndexType index = boost::add_vertex( this->m_Graph );
+
+  // Return component index so component can retrieved at a later time
+  return index;
 }
 
-bool
-Blueprint< ComponentDescriptor >
-::SetComponent( ComponentDescriptorType component )
+Blueprint::ComponentIndexType
+Blueprint
+::AddComponent( ParameterMapType parameterMap )
+{
+  this->Modified();
+
+  ComponentIndexType index = boost::add_vertex( this->m_Graph );
+  this->m_Graph[index].parameterMap = parameterMap;
+
+  // Return component index so component can retrieved at a later time
+  return index;
+}
+
+Blueprint::ParameterMapType
+Blueprint
+::GetComponent( ComponentIndexType index )
 {
   this->Modified();
-  return this->m_Graph->remove_vertex( connection );
+
+  return this->m_Graph[ index ].parameterMap;
+}
+
+void
+Blueprint
+::SetComponent( ComponentIndexType index, ParameterMapType parameterMap )
+{
+  this->Modified();
+  this->m_Graph[ index ].parameterMap = parameterMap;
 }
 
+// TODO: See explanation in elxBlueprint.h
+// void
+// Blueprint
+// ::DeleteComponent( const ComponentIndexType index )
+// {
+//   this->Modified();
+//
+//   clear_vertex( index, this->m_Graph );
+//   remove_vertex( index, this->m_Graph );
+// }
+
 bool
-Blueprint< ComponentDescriptor >
-::RemoveComponent( ComponentDescriptorType component )
+Blueprint
+::AddConnection( ComponentIndexType upstream, ComponentIndexType downstream )
 {
   this->Modified();
-  return this->m_Graph->remove_vertex( connection );
+
+  if( this->ConnectionExists( upstream, downstream) ) {
+    return false;
+  }
+  
+  // Adds directed connection from upstream component to downstream component
+  return boost::add_edge( upstream, downstream, this->m_Graph ).second;
 }
 
 bool
-Blueprint< ComponentDescriptor >
-::AddConnection( ComponentDescriptorType upsteam, ComponentDescriptorType downstream )
+Blueprint
+::AddConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap )
+{
+  this->Modified();
+
+  if( !this->ConnectionExists( upstream, downstream ) ) {
+    ConnectionIndexType index = boost::add_edge( upstream, downstream, this->m_Graph ).first;
+    this->m_Graph[ index ].parameterMap = parameterMap;
+    return true;
+  }
+
+  // If the connection does not exist don't do anything because previous settings 
+  // will be overwritten.  If the user do want to overwrite current settings, 
+  // she should use SetConnection() instead where the intent is explicit.  
+  return false;
+}
+
+Blueprint::ParameterMapType
+Blueprint
+::GetConnection( ComponentIndexType upstream, ComponentIndexType downstream )
 {
   this->Modified();
-  return this->m_Graph->add_edge( upstream, downstream );
+
+  return this->m_Graph[ this->GetConnectionIndex( upstream, downstream ) ].parameterMap;
 }
 
-ConnectionDescriptorType
-Blueprint< ComponentDescriptor >
-::GetConnection( ConnectionDescriptorType Connection )
+bool
+Blueprint
+::SetConnection( ComponentIndexType upstream, ComponentIndexType downstream, ParameterMapType parameterMap )
 {
   this->Modified();
+
+  if( !this->ConnectionExists( upstream, downstream ) ) {
+    return this->AddConnection( upstream, downstream, parameterMap );
+  } else {
+    this->m_Graph[ this->GetConnectionIndex( upstream, downstream ) ].parameterMap = parameterMap;
+    return true;
+  }
 }
 
-void 
-Blueprint< ComponentDescriptor >
-::RemoveConnection( ConnectionType connection )
+bool
+Blueprint
+::DeleteConnection( ComponentIndexType upstream, ComponentIndexType downstream )
 {
   this->Modified();
-  this->m_Graph->remove_edge( connection );
+
+  if( this->ConnectionExists( upstream, downstream ) ) {
+    this->m_Graph.remove_edge( this->GetConnectionIndex( upstream, downstream ) );
+  }
+  
+  return !this->ConnectionExists( upstream, downstream );
 }
 
-void 
-Blueprint< ComponentDescriptor >
-::PrintGraph( void )
+bool
+Blueprint
+::ConnectionExists( ComponentIndexType upstream, ComponentIndexType downstream )
 {
-  // TODO: Link to graphviz library
-  // boost::write_graphviz(std::cout, this->m_Graph);
-  std::cout << "Printed graph" << std::endl;
+  return boost::edge( upstream, downstream, this->m_Graph).second;
 }
-*/
 
-template<>
-int
-Blueprint< ComponentDescriptor >
-::TestFunction( void )
-{ return 0; }
+Blueprint::ConnectionIndexType
+Blueprint
+::GetConnectionIndex( ComponentIndexType upstream, ComponentIndexType downstream )
+{
+  // This function is part of the internal API and should fail hard if we use it incorrectly
+  if( !this->ConnectionExists( upstream, downstream ) ) {
+    itkExceptionMacro( "Blueprint does not contain connection from component " << upstream << " to " << downstream );
+  }
+  
+  return boost::edge( upstream, downstream, this->m_Graph).first;
+}
+
+void 
+Blueprint
+::WriteBlueprint( const std::string filename ) 
+{
+  std::ofstream dotfile( filename.c_str() );
+  boost::write_graphviz( dotfile, this->m_Graph );
+}
 
 } // namespace elx 
 
-#endif // __Blueprint_hxx
\ No newline at end of file
+#endif // __Blueprint_cxx
diff --git a/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx b/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx
deleted file mode 100644
index 9589451733f5f3b2c14b45e990f70711bab241e5..0000000000000000000000000000000000000000
--- a/Modules/Core/Blueprints/src/elxComponentDescriptor.cxx
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef __ComponentDescriptor_cxx
-#define __ComponentDescriptor_cxx
-
-#include "elxComponentDescriptor.h"
-
-// TODO: Need enum for component name?
-
-namespace elx {
-
-ComponentDescriptor
-::ComponentDescriptor( const ComponentNameType componentName )
-{
-  this->SetComponentName( componentName );
-}
-
-} // namespace elx
-
-#endif // __ComponentDescriptor_cxx
\ No newline at end of file
diff --git a/Modules/Core/elxModuleCore.cmake b/Modules/Core/elxModuleCore.cmake
index eaebd893405d56be9b9edeb671461538b04cca09..585fd509611ea8161fb2f1bc7eaf9b42afdce41f 100644
--- a/Modules/Core/elxModuleCore.cmake
+++ b/Modules/Core/elxModuleCore.cmake
@@ -4,10 +4,9 @@ set( ${MODULE}_INCLUDE_DIRS
 )
 
 set( ${MODULE}_SOURCE_FILES
-  ${CMAKE_SOURCE_DIR}/${MODULE_PATH}/Blueprints/src/elxComponentDescriptor.cxx
   ${CMAKE_SOURCE_DIR}/${MODULE_PATH}/Blueprints/src/elxBlueprint.cxx
 )
 
 set( ${MODULE}_LIBRARIES 
-  elxModuleCore
-)
\ No newline at end of file
+  ${MODULE}
+)
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 9598ac8c17113e6a582022ec82d0d1b53eef530e..925c9375c67da019bf48303e058074f4a111f2b6 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -68,12 +68,6 @@ set( TEST_LIBRARIES
 # Unit tests
 add_subdirectory( Unit )
 
-# Benchmarks
-option( ELASTIX_BUILD_BENCHMARKING "Enable building benchmarks." OFF )
-if( ${ELASTIX_BUILD_BENCHMARKING} )
-	add_subdirectory( Benchmark )
-endif()
-
 # ---------------------------------------------------------------------
 # Configure dashboard
 mark_as_advanced( ELASTIX_BUILD_DASHBOARD )
diff --git a/Testing/Dashboard/CMakeLists.txt b/Testing/Dashboard/CMakeLists.txt
index 202478325aeea62261d1c8dd11773e54eb1ba132..45902125adcd5c2d4ec3d116479335a5034ac430 100644
--- a/Testing/Dashboard/CMakeLists.txt
+++ b/Testing/Dashboard/CMakeLists.txt
@@ -15,10 +15,6 @@ set( ELASTIX_DASHBOARD_LOGSTASH_RSA_PRIVATE_KEY "elxLogstash.key" )
 
 mark_as_advanced( ELASTIX_DASHBOARD_VOLUME )
 if( NOT EXISTS "${ELASTIX_DASHBOARD_VOLUME}" )
-  message( STATUS
-    "ELASTIX_DASHBOARD_VOLUME points to the folder ${CMAKE_BINARY_DIR}/Testing/Dashboard/Data in your build directory. In production you should point this variable to a safe directory outside the build tree."
-  )
-  
   set( ELASTIX_DASHBOARD_VOLUME "${ELASTIX_DASHBOARD_BINARY_DIR}/Data" )
   file( MAKE_DIRECTORY "${ELASTIX_DASHBOARD_VOLUME}" )
 endif()
@@ -46,4 +42,9 @@ configure_file(
 configure_file(
   ${ELASTIX_DASHBOARD_SOURCE_DIR}/elxLogstashForwarder.json.in
   ${ELASTIX_DASHBOARD_BINARY_DIR}/elxLogstashForwarder.json
-)
\ No newline at end of file
+)
+
+# ---------------------------------------------------------------------
+# SSL certificates
+# Use the following OpenSSL command to generate a test certificate and key if needed
+# openssl req -subj '/CN=*/' -x509 -batch -nodes -days 9999 -newkey rsa:2048 -keyout elxLogstash.key -out elxLogstash.crt
diff --git a/Testing/Dashboard/elxLogstash.crt b/Testing/Dashboard/elxLogstash.crt
index 56ef6e0dcf697be1be407db7ca75cf31112821d0..f677ecb5798ea52056694f954a80fa9a524ada80 100644
--- a/Testing/Dashboard/elxLogstash.crt
+++ b/Testing/Dashboard/elxLogstash.crt
@@ -1,19 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIDGjCCAgKgAwIBAgIJAMF8GSVtnyB6MA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
-BAMTB2VsYXN0aXgwHhcNMTUwODEyMTQxNjE1WhcNMTUwOTExMTQxNjE1WjASMRAw
-DgYDVQQDEwdlbGFzdGl4MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-01P404f+W/aBLxlQTFyHy1o7m07edUmFIjJuN9JjGTzZtlhAEc7dXJ8fUwr/hnLq
-HUeaGRbNcpFDj+/Xq2W9jH7/VyxivA8Ib7ycLNxywgmheZVxXetPIeYmK+Rqovyd
-GhMcU0WMv/3OslFjf92PLegFgRYbmJa7rEH+I0MD1hE1rn1AIJeU4nVCUrtQON6g
-icDEZSNwVSuLfdiuHCMcAVWx+pQIyHji6EoyIBjNsF8LoBZoMY5N+qRph8tt9k1N
-GemQoaZWd926jWgrsSSrAfgtMxw43TXwCFe8RiL8L+pZlN4xxYjQj1/PtTowqjzL
-dYqWAT0o5zwlqkrNgjTuYwIDAQABo3MwcTAdBgNVHQ4EFgQU8onFqrecR/J81ZFi
-gonexjVf8yAwQgYDVR0jBDswOYAU8onFqrecR/J81ZFigonexjVf8yChFqQUMBIx
-EDAOBgNVBAMTB2VsYXN0aXiCCQDBfBklbZ8gejAMBgNVHRMEBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCYalhVZpN/F/Cux/KRBuOyyVxD+tOM7PDlXuuGMcxZ8PTH
-sYK3MLBUvGnn90R6YIF+pmZC40hkau12xGRnlyNLa0EpnAd77SGlaB/y9Ix6RCDd
-PRvdEZodknXzS5sDw+A9pA0JtZANrAXHrELPXjfp5vdf4EUH/o7TTh3XzTEIokwp
-VY6557E17BYsTHHebWPSiDzCeS9y6PtdiZczuHrd7+K+vWgVcgmQ0fdudWwcMOEC
-8s6O8uQGrc1v9nSyT93C9MPCWnuZ2McFX4JPSwaqAaKCTcnc8GAcqk4O5ruQ/8u/
-xSNQsoYpFi2BawOdPDqyMKn4khkREWTq0+T+7Kq2
+MIIDCDCCAfCgAwIBAgIJANZVoY3O+DQaMA0GCSqGSIb3DQEBBQUAMAwxCjAIBgNV
+BAMUASowHhcNMTUxMDEzMjEyNzEwWhcNNDMwMjI3MjEyNzEwWjAMMQowCAYDVQQD
+FAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtF4l3oqDRL/4m7C
+kCnzE6colB1Ii7KHoRuFyyL7PrZiyrKelRVDr6yDB0lIJevOxuuSJlA+BNccyI0h
+08/c3SRDkKb83MwQnABpDPS4/EhLGOJdTKutSo0FzCrn+uT470EYfCFvLLKMSnIO
+ECf5st3EN+VJoSu80B9sZ4TEfdO4Gedy0vlL3iNGGDn1TqconTDjB5HKHteEjZ1Z
+XzqBJUXITjzfD1VpYbSsj/wcFvurmaOMliqvsl1uFN7wXPjd1L8fAqcsAU5yBwLJ
+88NFqJrlgqTXnuHeMCqhiVwOOFUeBbvEk/Faw3P3BKgppl7P01WXzUky0CVyegG7
+qagK7QIDAQABo20wazAdBgNVHQ4EFgQUtsodBU4f6bCvbrYc+ix21auh7mowPAYD
+VR0jBDUwM4AUtsodBU4f6bCvbrYc+ix21auh7mqhEKQOMAwxCjAIBgNVBAMUASqC
+CQDWVaGNzvg0GjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAOPEH1
+Otzm6Eu8FNQoppXKBuVW0kqRi6/CM7JxJ0f21YajEu1+vb0BdlNAoCpmcmxCY9Hf
+cbmzeKyu/6wIXOOdqmTu/CGvEThtLNmrgjkj9sTe4i0C0H5fkOlkD6aSCHSVUwCv
+9nOmPMsu9snEhU+UMXIDqFJzCpN3TSXu/J+V4xV5TYGj0SfbIZXLsw4QcB+iwind
+oC1OorwxPsXVYnlMQeZAi7qaScOlq/82A3erXLKW7dRHIyXbgScs4VZ6kjg+YTH2
+YZW7y3xgUowj7xeWaoH9YciDfqV2SbxK4RoP2NeesuW0On0YebVQ5Z3qLeYb5fkV
+CiA5NpyBDPdElzWW
 -----END CERTIFICATE-----
diff --git a/Testing/Dashboard/elxLogstash.key b/Testing/Dashboard/elxLogstash.key
index 9537cddd201e50e6d661444da8e85c5294b617c3..cebc457b0cc2589ab6d8ef08bd1980f88948a173 100644
--- a/Testing/Dashboard/elxLogstash.key
+++ b/Testing/Dashboard/elxLogstash.key
@@ -1,27 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-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
+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
 -----END RSA PRIVATE KEY-----
diff --git a/Testing/Unit/elxBluePrintTest.cxx b/Testing/Unit/elxBluePrintTest.cxx
index 8aa289fc4201a92af8d6c185905855bd58c5ab4e..15ffde06c38d85233944c28cf7bb837597e2f651 100644
--- a/Testing/Unit/elxBluePrintTest.cxx
+++ b/Testing/Unit/elxBluePrintTest.cxx
@@ -1,27 +1,174 @@
 #include "elxBlueprint.h"
-#include "elxComponentDescriptor.h"
+
 #include "gtest/gtest.h"
 
 namespace elx {
 
-TEST( Blueprint, Instantiation )
+class BlueprintTest : public ::testing::Test {
+public:
+
+  typedef Blueprint::Pointer                BlueprintPointerType;
+  typedef Blueprint::ComponentIndexType     ComponentIndexType;
+  typedef Blueprint::ParameterMapType       ParameterMapType;
+  typedef Blueprint::ParameterValueType     ParameterValueType;
+
+  virtual void SetUp() {
+    parameterMap["ComponentName"] = ParameterValueType(1, "TestName");
+  }
+
+  ParameterMapType parameterMap;
+};
+
+TEST_F( BlueprintTest, AddComponent )
+{
+  BlueprintPointerType blueprint;
+  EXPECT_NO_THROW( blueprint = Blueprint::New() );
+
+  ComponentIndexType index0;
+  EXPECT_NO_THROW( index0 = blueprint->AddComponent() );
+
+  ComponentIndexType index1;
+  EXPECT_NO_THROW( index1 = blueprint->AddComponent( parameterMap ) );
+}
+
+TEST_F( BlueprintTest, GetComponent ) 
+{
+  BlueprintPointerType blueprint = Blueprint::New();
+  ComponentIndexType index = blueprint->AddComponent( parameterMap );
+
+  ParameterMapType parameterMapTest;
+  EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) );
+  EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] );
+}
+
+TEST_F( BlueprintTest, SetComponent ) 
+{
+  BlueprintPointerType blueprint = Blueprint::New();
+  ComponentIndexType index = blueprint->AddComponent( parameterMap );
+
+  ParameterMapType parameterMapTest;
+  EXPECT_NO_THROW( blueprint->SetComponent( index, parameterMap ) );
+  EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) );
+  EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] );
+}
+
+// TODO: The final line segfaults because GetComponent does not check that the index actually
+// actually exist. How can we do that? See also explanation in elxBlueprint.h
+// TEST_F( BlueprintTest, DeleteComponent ) 
+// {
+//   BlueprintPointerType blueprint = Blueprint::New();
+//   ComponentIndexType index = blueprint->AddComponent( parameterMap );
+//
+//   ParameterMapType parameterMapTest;
+//   EXPECT_NO_THROW( parameterMapTest = blueprint->GetComponent( index ) );
+//   EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest["ComponentName"] );
+//
+//   EXPECT_NO_THROW( blueprint->DeleteComponent( index ) );
+//   EXPECT_ANY_THROW( parameterMapTest = blueprint->GetComponent( index ) );
+// }
+
+TEST_F( BlueprintTest, AddConnection )
+{
+  BlueprintPointerType blueprint = Blueprint::New();
+
+  ComponentIndexType index0 = blueprint->AddComponent();
+  ComponentIndexType index1 = blueprint->AddComponent();
+  ComponentIndexType index2 = blueprint->AddComponent();
+
+  // Connection should not exist
+  EXPECT_FALSE( blueprint->ConnectionExists( index0, index1 ) );
+
+  // Connection should be added
+  EXPECT_TRUE( blueprint->AddConnection( index0, index1 ) );
+
+  // Connection should exist
+  EXPECT_TRUE( blueprint->ConnectionExists( index0, index1 ) );
+
+  // Another connection between same components should not be added
+  // (user should use SetComponent() instead)
+  EXPECT_FALSE( blueprint->AddConnection( index0, index1 ) );
+
+  // Connection should be empty
+  ParameterMapType parameterMapTest0;
+  EXPECT_NO_THROW( parameterMapTest0 = blueprint->GetConnection( index0, index1 ) );
+  EXPECT_EQ( 0u, parameterMapTest0.size() );
+
+  // Connection with properties should be added. Testing if properties was 
+  // properly set requires a call to GetConnection() which is the responsibility
+  // of the next test.
+  ParameterMapType parameterMapTest1;
+  EXPECT_TRUE( blueprint->AddConnection( index1, index2, parameterMap ) );
+
+  // It is  not be possible to add connection between components that do not exist
+  // because you do not have necessary indexes
+}
+
+TEST_F( BlueprintTest, GetConnection )
+{
+  BlueprintPointerType blueprint = Blueprint::New();
+
+  ComponentIndexType index0 = blueprint->AddComponent();
+  ComponentIndexType index1 = blueprint->AddComponent();
+
+  ParameterMapType parameterMapTest0;
+  EXPECT_TRUE( blueprint->AddConnection( index0, index1, parameterMap ) );
+  EXPECT_NO_THROW( parameterMapTest0 = blueprint->GetConnection( index0, index1 ) );
+  EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest0["ComponentName"] );
+}
+
+TEST_F( BlueprintTest, SetConnection )
+{
+  BlueprintPointerType blueprint = Blueprint::New();
+
+  ComponentIndexType index0 = blueprint->AddComponent();
+  ComponentIndexType index1 = blueprint->AddComponent();
+  blueprint->AddConnection( index0, index1, parameterMap );
+
+  ParameterMapType parameterMapTest0;
+  parameterMapTest0 = blueprint->GetConnection( index0, index1 );
+  EXPECT_EQ( parameterMap["ComponentName"], parameterMapTest0["ComponentName"] );
+
+  ParameterMapType parameterMapTest1;
+  parameterMapTest1["ComponentName"] = ParameterValueType(1, "OtherName");
+  EXPECT_TRUE( blueprint->SetConnection( index0, index1, parameterMapTest1 ) );
+
+  ParameterMapType parameterMapTest2;
+  EXPECT_NO_THROW( parameterMapTest2 = blueprint->GetConnection( index0, index1 ) );
+  EXPECT_EQ( parameterMapTest1["ComponentName"], parameterMapTest2["ComponentName"] );
+}
+
+TEST_F( BlueprintTest, DeleteConnection )
 {
-  typedef Blueprint< ComponentDescriptor > BlueprintType;
-  BlueprintType::Pointer blueprint;
-  EXPECT_NO_THROW( blueprint = BlueprintType::New() );
+  BlueprintPointerType blueprint = Blueprint::New();
 
-  typedef BlueprintType::ComponentDescriptorType ComponentDescriptorType;
-  ComponentDescriptorType::Pointer componentDescriptor;
-  EXPECT_NO_THROW( componentDescriptor = ComponentDescriptorType::New() );
+  ComponentIndexType index0 = blueprint->AddComponent();
+  ComponentIndexType index1 = blueprint->AddComponent();
+  blueprint->AddConnection( index0, index1 );
+
+  // Connection should exist
+  EXPECT_TRUE( blueprint->ConnectionExists( index0, index1 ) );
+
+  // Connection be deleted
+  EXPECT_TRUE( blueprint->DeleteConnection( index0, index1 ) );
+
+  // Connection should not exist 
+  EXPECT_FALSE( blueprint->ConnectionExists( index0, index1 ) );
+}
+
+TEST_F( BlueprintTest, WriteBlueprint ) 
+{
+  BlueprintPointerType blueprint = Blueprint::New();
 
-  typedef ComponentDescriptorType::ComponentNameType ComponentNameType;
-  ComponentNameType componentName;
-  EXPECT_NO_THROW( componentName = ComponentNameType("Metric") );
-  EXPECT_NO_THROW( componentDescriptor->SetComponentName( componentName ) );
+  ComponentIndexType index0 = blueprint->AddComponent();
+  ComponentIndexType index1 = blueprint->AddComponent();
+  ComponentIndexType index2 = blueprint->AddComponent();
+  ComponentIndexType index3 = blueprint->AddComponent();
 
-  EXPECT_NO_THROW( blueprint->TestFunction() );
+  blueprint->AddConnection( index0, index1 );
+  blueprint->AddConnection( index0, index2 );
+  blueprint->AddConnection( index2, index3 );
 
-  ASSERT_TRUE( true );
+  EXPECT_NO_THROW( blueprint->WriteBlueprint( "blueprint.dot" ) );
 }
 
 } // namespace elx