auto filter = this->m_Workspace->GetFilter( filter_name );
   if( filter != NULL )
   {
-    auto output = filter->GetOutput< _TDataObject >( output_name );
+    auto output = filter->GetOutputData< _TDataObject >( output_name );
     if( output != NULL )
     {
       std::string data_name = output_name + "@" + filter_name;
 
 deleteFilter( const std::string& name )\r
 {\r
   std::cout << name << std::endl;\r
-#error delete filter\r
   return( false );\r
 }\r
 \r
     << des << " "\r
     << in << " "\r
     << out << std::endl;\r
-#error delete connection\r
   return( false );\r
 }\r
 \r
 
   this->SetViewY( y );
 }
 
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::Object::
+SetITK( itk::LightObject* o )
+{
+  if( this->m_ITKObject.GetPointer( ) != o )
+  {
+    this->m_ITKObject = o;
+    this->Modified( );
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::Object::
+SetVTK( vtkObjectBase* o )
+{
+  if( this->m_VTKObject.GetPointer( ) != o )
+  {
+    this->m_VTKObject = o;
+    this->Modified( );
+
+  } // fi
+}
+
 // -------------------------------------------------------------------------
 cpPlugins::Interface::Object::
 Object( )
 
       virtual void Modified( ) const;
       void SetViewCoords( float x, float y );
 
+      void SetITK( itk::LightObject* o );
+      void SetVTK( vtkObjectBase* o );
+
       template< class T >
         inline T* GetITK( );
 
 
 
 // -------------------------------------------------------------------------
 bool cpPlugins::Interface::ProcessObject::
-SetInput( const std::string& id, cpPlugins::Interface::DataObject* dobj )
+SetInput(
+  const std::string& id, cpPlugins::Interface::DataObject::Pointer* dobj
+  )
 {
   _TDataContainer::iterator i = this->m_Inputs.find( id );
   if( i != this->m_Inputs.end( ) )
   _TDataContainer::iterator i = this->m_Inputs.begin( );
   for( ; i != this->m_Inputs.end( ) && r == ""; ++i )
   {
-    if( i->second.IsNotNull( ) )
+    if( i->second->IsNotNull( ) )
     {
-      Self* src = dynamic_cast< Self* >( i->second->GetSource( ) );
+      Self* src = dynamic_cast< Self* >( ( *( i->second ) )->GetSource( ) );
       if( src != NULL )
         r = src->Update( );
     }
 {
   _TDataContainer::iterator i = this->m_Outputs.begin( );
   for( ; i != this->m_Outputs.end( ); ++i )
-    if( i->second.IsNotNull( ) )
-      i->second->DisconnectPipeline( );
+    if( i->second->IsNotNull( ) )
+      ( *( i->second ) )->DisconnectPipeline( );
 }
 
 // -------------------------------------------------------------------------
   if( this->m_ParametersDialog != NULL )
     delete this->m_ParametersDialog;
 #endif // cpPlugins_Interface_QT4
+
+  /*
+    auto iIt = this->m_Inputs.begin( );
+    for( ; iIt != this->m_Inputs.end( ); ++iIt )
+    delete iIt->second;
+    this->m_Inputs.clear( );
+  */
+
+  auto oIt = this->m_Outputs.begin( );
+  for( ; oIt != this->m_Outputs.end( ); ++oIt )
+    delete oIt->second;
+  this->m_Outputs.clear( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::ProcessObject::
 _AddInput( const std::string& name )
 {
-  this->m_Inputs[ name ] = NULL;
-  this->Modified( );
+  auto i = this->m_Inputs.find( name );
+  if( i == this->m_Inputs.end( ) )
+  {
+    this->m_Inputs[ name ] = NULL;
+    this->Modified( );
+
+  } // fi
 }
 
 // eof - $RCSfile$
 
       unsigned int GetNumberOfInputs( ) const;
       unsigned int GetNumberOfOutputs( ) const;
 
-      virtual bool SetInput( const std::string& id, DataObject* dobj );
+      virtual bool SetInput( const std::string& id, DataObject::Pointer* dobj );
 
       virtual std::string Update( );
       virtual void DisconnectOutputs( );
       virtual bool ExecConfigurationDialog( QWidget* parent );
 
       template< class T >
-        inline T* GetInput( const std::string& id );
+        inline T* GetInputData( const std::string& id );
 
       template< class T >
-        inline const T* GetInput( const std::string& id ) const;
+        inline const T* GetInputData( const std::string& id ) const;
 
       template< class T >
-        inline T* GetOutput( const std::string& id );
+        inline T* GetOutputData( const std::string& id );
 
       template< class T >
-        inline const T* GetOutput( const std::string& id ) const;
+        inline const T* GetOutputData( const std::string& id ) const;
+
+      DataObject::Pointer* GetOutputPort( const std::string& id )
+      {
+        auto i = this->m_Outputs.find( id );
+        if( i != this->m_Outputs.end( ) )
+          return( i->second );
+        else
+          return( NULL );
+      }
+
+      const DataObject::Pointer* GetOutputPort( const std::string& id ) const
+      {
+        auto i = this->m_Outputs.find( id );
+        if( i != this->m_Outputs.end( ) )
+          return( i->second );
+        else
+          return( NULL );
+      }
 
     protected:
       ProcessObject( );
       SimpleMPRWidget*                             m_MPRViewer;
       bool                                         m_Interactive;
 
-      typedef std::map< std::string, DataObject::Pointer > _TDataContainer;
+      typedef std::map< std::string, DataObject::Pointer* > _TDataContainer;
       _TDataContainer m_Inputs;
       _TDataContainer m_Outputs;
     };
 
 // -------------------------------------------------------------------------
 template< class T >
 T* cpPlugins::Interface::ProcessObject::
-GetInput( const std::string& id )
+GetInputData( const std::string& id )
 {
   _TDataContainer::iterator i = this->m_Inputs.find( id );
   if( i != this->m_Inputs.end( ) )
-    return( dynamic_cast< T* >( i->second.GetPointer( ) ) );
+    return( dynamic_cast< T* >( i->second->GetPointer( ) ) );
   else
     return( NULL );
 }
 // -------------------------------------------------------------------------
 template< class T >
 const T* cpPlugins::Interface::ProcessObject::
-GetInput( const std::string& id ) const
+GetInputData( const std::string& id ) const
 {
   _TDataContainer::const_iterator i = this->m_Inputs.find( id );
   if( i != this->m_Inputs.end( ) )
-    return( dynamic_cast< const T* >( i->second.GetPointer( ) ) );
+    return( dynamic_cast< const T* >( i->second->GetPointer( ) ) );
   else
     return( NULL );
 }
 // -------------------------------------------------------------------------
 template< class T >
 T* cpPlugins::Interface::ProcessObject::
-GetOutput( const std::string& id )
+GetOutputData( const std::string& id )
 {
   _TDataContainer::iterator i = this->m_Outputs.find( id );
   if( i != this->m_Outputs.end( ) )
-    return( dynamic_cast< T* >( i->second.GetPointer( ) ) );
+    return( dynamic_cast< T* >( i->second->GetPointer( ) ) );
   else
     return( NULL );
 }
 // -------------------------------------------------------------------------
 template< class T >
 const T* cpPlugins::Interface::ProcessObject::
-GetOutput( const std::string& id ) const
+GetOutputData( const std::string& id ) const
 {
   _TDataContainer::const_iterator i = this->m_Outputs.find( id );
   if( i != this->m_Outputs.end( ) )
-    return( dynamic_cast< const T* >( i->second.GetPointer( ) ) );
+    return( dynamic_cast< const T* >( i->second->GetPointer( ) ) );
   else
     return( NULL );
 }
 void cpPlugins::Interface::ProcessObject::
 _AddOutput( const std::string& id )
 {
-  this->m_Outputs[ id ] = O::New( );
-  this->m_Outputs[ id ]->SetSource( this );
+  auto oIt = this->m_Outputs.find( id );
+  if( oIt == this->m_Outputs.end( ) )
+  {
+    this->m_Outputs[ id ] = new DataObject::Pointer( );
+    oIt = this->m_Outputs.find( id );
+
+  } // fi
+  *( oIt->second ) = O::New( );
+  ( *( oIt->second ) )->SetSource( this );
   this->Modified( );
 }
 
 
 }
 
 // -------------------------------------------------------------------------
-bool cpPlugins::Interface::Workspace::
+cpPlugins::Interface::Workspace::
+TFilter* cpPlugins::Interface::Workspace::
 CreateFilter( const std::string& filter, const std::string& name )
 {
   if( this->m_Plugins == NULL )
-    return( false );
+    return( NULL );
 
   // Get or create new filter from name
   if( !( this->m_Graph->HasVertexIndex( name ) ) )
       
       TObject::Pointer o = f.GetPointer( );
       this->m_Graph->SetVertex( name, o );
-      return( true );
-    }
-    else
-      return( false );
+
+    } // fi
+    return( f.GetPointer( ) );
   }
   else
-    return( true );
+    return( this->GetFilter( name ) );
 }
 
 // -------------------------------------------------------------------------
     return( false );
 
   // Real connection
-  dest->SetInput( input_name, orig->GetOutput< TData >( output_name ) );
+  dest->SetInput( input_name, orig->GetOutputPort( output_name ) );
   this->m_Graph->AddEdge(
     orig_filter, dest_filter,
     TConnection( output_name, input_name )
 
 // -------------------------------------------------------------------------
 bool cpPlugins::Interface::Workspace::
-Connect( TData* input_object, const std::string& input_name )
+Connect( TData::Pointer* input_object, const std::string& input_name )
 {
   auto port = this->m_ExposedInputPorts.find( input_name );
   if( port != this->m_ExposedInputPorts.end( ) )
 
       TFilter* GetFilter( const std::string& name );
       const TFilter* GetFilter( const std::string& name ) const;
       bool HasFilter( const std::string& name ) const;
-      bool CreateFilter( const std::string& filter, const std::string& name );
+      TFilter* CreateFilter(
+        const std::string& filter, const std::string& name
+        );
       bool RenameFilter(
         const std::string& old_name, const std::string& new_name
         );
         const std::string& orig_filter, const std::string& dest_filter,
         const std::string& output_name, const std::string& input_name
         );
-      bool Connect( TData* input_object, const std::string& exposed_port );
+      bool Connect(
+        TData::Pointer* input_object, const std::string& exposed_port
+        );
       void RemoveConnection(
         const std::string& dest_filter, const std::string& input_name
         );
 
 std::string cpPlugins::BasicFilters::BinaryErodeImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "BinaryErodeImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
 std::string cpPlugins::BasicFilters::BinaryThresholdImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "BinaryThresholdImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
 _GenerateData( )
 {
   // Get inputs
-  cpPlugins::Interface::Mesh* mesh =
-    this->GetInput< cpPlugins::Interface::Mesh >( "InputMesh" );
-  cpPlugins::Interface::ImplicitFunction* function =
-    this->GetInput< cpPlugins::Interface::ImplicitFunction >(
+  auto mesh = this->GetInputData< cpPlugins::Interface::Mesh >( "InputMesh" );
+  auto function =
+    this->GetInputData< cpPlugins::Interface::ImplicitFunction >(
       "InputFunction"
       );
   if( function == NULL )
   cutter->Update( );
 
   // Execute filter
-  cpPlugins::Interface::Mesh* out =
-    this->GetOutput< cpPlugins::Interface::Mesh >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Mesh >( "Output" );
   out->SetVTK( cutter->GetOutput( ) );
 
   return( "" );
 
 std::string cpPlugins::BasicFilters::ExtractSliceImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "ExtractSliceImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
--- /dev/null
+#include "InputDataReproducer.h"
+
+// -------------------------------------------------------------------------
+cpPlugins::BasicFilters::InputDataReproducer::
+InputDataReproducer( )
+  : Superclass( )
+{
+  this->_AddInput( "Input" );
+  this->_AddOutput< cpPlugins::Interface::DataObject >( "Output" );
+  this->m_Parameters->Clear( );
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::BasicFilters::InputDataReproducer::
+~InputDataReproducer( )
+{
+}
+
+// -------------------------------------------------------------------------
+std::string cpPlugins::BasicFilters::InputDataReproducer::
+_GenerateData( )
+{
+  auto i = this->m_Inputs.find( "Input" );
+  auto o = this->m_Outputs.find( "Output" );
+  if( i == this->m_Inputs.end( ) || o == this->m_Outputs.end( ) )
+    return( "InputDataReproducer: No input/output ports." );
+
+  // Connect output
+  *( o->second ) = *( i->second );
+  return( "" );
+}
+
+// eof - $RCSfile$
 
--- /dev/null
+#ifndef __CPPLUGINS__PLUGINS__INPUTDATAREPRODUCER__H__
+#define __CPPLUGINS__PLUGINS__INPUTDATAREPRODUCER__H__
+
+#include <cpPlugins/BasicFilters/cpPluginsBasicFilters_Export.h>
+#include <cpPlugins/Interface/BaseProcessObjects.h>
+
+namespace cpPlugins
+{
+  namespace BasicFilters
+  {
+    /**
+     */
+    class cpPluginsBasicFilters_EXPORT InputDataReproducer
+      : public cpPlugins::Interface::ProcessObject
+    {
+    public:
+      typedef InputDataReproducer                 Self;
+      typedef cpPlugins::Interface::ProcessObject Superclass;
+      typedef itk::SmartPointer< Self >           Pointer;
+      typedef itk::SmartPointer< const Self >     ConstPointer;
+
+    public:
+      itkNewMacro( Self );
+      itkTypeMacro(
+        InputDataReproducer,
+        cpPluginsInterfaceProcessObject
+        );
+      cpPlugins_Id_Macro(
+        cpPlugins::BasicFilters::InputDataReproducer,
+        PortObjects
+        );
+
+    protected:
+      InputDataReproducer( );
+      virtual ~InputDataReproducer( );
+
+      virtual std::string _GenerateData( );
+
+    private:
+      // Purposely not implemented
+      InputDataReproducer( const Self& );
+      Self& operator=( const Self& );
+    };
+
+  } // ecapseman
+
+} // ecapseman
+
+#endif // __CPPLUGINS__PLUGINS__INPUTDATAREPRODUCER__H__
+
+// eof - $RCSfile$
 
   
   // Get bounding box
   double bbox[ 6 ];
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   bool input_found = false;
   if( image != NULL )
   {
     input_found = true;
 
   } // fi
-  cpPlugins::Interface::Mesh* mesh =
-    this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
+  auto mesh = this->GetInputData< cpPlugins::Interface::Mesh >( "Input" );
   if( mesh != NULL )
   {
     mesh->GetVTK< vtkPolyData >( )->GetBounds( bbox );
 std::string cpPlugins::BasicFilters::MacheteFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image != NULL )
     return( this->_FromImage( image ) );
-  cpPlugins::Interface::Mesh* mesh =
-    this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
+  auto mesh = this->GetInputData< cpPlugins::Interface::Mesh >( "Input" );
   if( mesh == NULL )
     return( this->_FromMesh( mesh ) );
   return( "MacheteFilter: No valid input." );
   filter->Update( );
 
   // Get output names
-  auto pos_name = this->GetOutput< _TObj >( "PositiveOutput" )->GetName( );
-  auto neg_name = this->GetOutput< _TObj >( "NegativeOutput" )->GetName( );
+  auto pos_name = this->GetOutputData< _TObj >( "PositiveOutput" )->GetName( );
+  auto neg_name = this->GetOutputData< _TObj >( "NegativeOutput" )->GetName( );
 
   // Connect outputs (and correct their types and names)
-  _TImage* pos_out = this->GetOutput< _TImage >( "PositiveOutput" );
+  _TImage* pos_out = this->GetOutputData< _TImage >( "PositiveOutput" );
   if( pos_out == NULL )
   {
     this->_AddOutput< _TImage >( "PositiveOutput" );
-    pos_out = this->GetOutput< _TImage >( "PositiveOutput" );
+    pos_out = this->GetOutputData< _TImage >( "PositiveOutput" );
     pos_out->SetName( pos_name );
 
   } // fi
-  _TImage* neg_out = this->GetOutput< _TImage >( "NegativeOutput" );
+  _TImage* neg_out = this->GetOutputData< _TImage >( "NegativeOutput" );
   if( neg_out == NULL )
   {
     this->_AddOutput< _TImage >( "NegativeOutput" );
-    neg_out = this->GetOutput< _TImage >( "NegativeOutput" );
+    neg_out = this->GetOutputData< _TImage >( "NegativeOutput" );
     neg_out->SetName( neg_name );
 
   } // fi
 
 std::string cpPlugins::BasicFilters::MacheteImageFilter::
 _GenerateData()
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >("Input");
+  auto image = this->GetInputData< cpPlugins::Interface::Image >("Input");
   if (image == NULL)
     return("MacheteImageFilter: No input image.");
 
   filter->Update();
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >("Output");
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >("Output");
   if (out != NULL)
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
 _GenerateData( )
 {
   // Get input
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "MarchingCubes: Input data is not a valid image." );
   vtkImageData* vtk_image = image->GetVTK< vtkImageData >( );
     return( "MarchingCubes: Input data does not have a valid dimension." );
 
   // Execute filter
-  cpPlugins::Interface::Mesh* out =
-    this->GetOutput< cpPlugins::Interface::Mesh >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Mesh >( "Output" );
   out->SetVTK( pd );
   return( "" );
 }
 
 std::string cpPlugins::BasicFilters::MedianImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "MedianImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
 std::string cpPlugins::BasicFilters::OtsuThresholdImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "OtsuThresholdImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
 std::string cpPlugins::BasicFilters::RGBImageToOtherChannelsFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "RGBImageToOtherChannelsFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< _O >( filter->GetOutput( ) );
 
 std::string cpPlugins::BasicFilters::SignedMaurerDistanceMapImageFilter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "SignedMaurerDistanceMapImageFilter: No input image." );
 
   filter->Update( );
 
   // Connect output
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out != NULL )
   {
     out->SetITK< O >( filter->GetOutput( ) );
 
   src->Update( );
 
   // Execute filter
-  cpPlugins::Interface::Mesh* out =
-    this->GetOutput< cpPlugins::Interface::Mesh >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Mesh >( "Output" );
   out->SetVTK( src->GetOutput( ) );
   return( "" );
 }
 
 std::string cpPlugins::IO::ImageReader::
 _RealGD( const TStringList& names )
 {
-  cpPlugins::Interface::Image* out =
-    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
   if( out == NULL )
     return( "ImageReader: No output object properly created." );
 
 
 std::string cpPlugins::IO::ImageWriter::
 _GD0_Image( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "ImageWriter: No input image." );
 
 std::string cpPlugins::IO::ImageWriter::
 _GD0_VectorImage( )
 {
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "Input" );
+  auto image = this->GetInputData< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "ImageWriter: No input image." );
 
 
   pdr->SetFileName( fname.c_str( ) );
   pdr->Update( );
 
-  cpPlugins::Interface::Mesh* out =
-    this->GetOutput< cpPlugins::Interface::Mesh >( "Output" );
+  auto out = this->GetOutputData< cpPlugins::Interface::Mesh >( "Output" );
   if( out != NULL )
     out->SetVTK( pdr->GetOutput( ) );
   else
 
 std::string cpPlugins::IO::MeshWriter::
 _GenerateData( )
 {
-  cpPlugins::Interface::Mesh* mesh =
-    this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
+  auto mesh = this->GetInputData< cpPlugins::Interface::Mesh >( "Input" );
   if( mesh == NULL )
     return( "MeshWriter: No input mesh." );
   vtkPolyData* i = mesh->GetVTK< vtkPolyData >( );
 
   typedef itk::ImageBase< 2 > _2DImage;
   typedef itk::ImageBase< 3 > _3DImage;
 
-  cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( "ReferenceImage" );
+  auto image =
+    this->GetInputData< cpPlugins::Interface::Image >( "ReferenceImage" );
   if( image == NULL )
     return( "SeedWidget: No input image." );
 
   typedef cpExtensions::Interaction::ImageInteractorStyle _S;
 
   I* base_image = dynamic_cast< I* >( image );
-  cpPlugins::Interface::PointList* out =
-    this->GetOutput< cpPlugins::Interface::PointList >( "Output" );
+  auto out =
+    this->GetOutputData< cpPlugins::Interface::PointList >( "Output" );
   double aux_pnt[ 3 ];
   unsigned int dim = ( I::ImageDimension < 3 )? I::ImageDimension: 3;