diff --git a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.h
index 859c1243712540bec19cd7e91bba372d6e820710..5ef212dc848e40ed40fd7e16299355ba8df84f77 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.h
+++ b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.h
@@ -178,9 +178,11 @@ protected:
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
   /** Internal methods */
+  virtual void ForwardGenerateOutputInformation();
+  virtual void ReverseGenerateOutputInformation();
   virtual void ForwardGenerateData();
   virtual void ReverseGenerateData();
-
+  
   void GenerateTransformationMatrix();
 
   /** Internal attributes */
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.txx b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.txx
index cd13f5ca8bd7353db137f8e83017ce95d932eda5..4ec65fd304c39753141f392068e6eab750cc000c 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.txx
+++ b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.txx
@@ -105,32 +105,28 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
                                  "Class should be templeted with FORWARD or INVERSE only...",
                                  ITK_LOCATION );
     }
-}
 
-template < class TInputImage, class TOutputImage,
-            Transform::TransformDirection TDirectionOfTransformation >
-void
-PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
-::GenerateData ()
-{
+  
   switch ( static_cast<int>(DirectionOfTransformation) )
-  {
-  case static_cast<int>(Transform::FORWARD):
-      return ForwardGenerateData();
+    {
+    case static_cast<int>(Transform::FORWARD):
+    {
+    ForwardGenerateOutputInformation();
+    break;
+    }
     case static_cast<int>(Transform::INVERSE):
-      return ReverseGenerateData();
-    default:
-      throw itk::ExceptionObject(__FILE__, __LINE__,
-          "Class should be templated with FORWARD or INVERSE only...",
-          ITK_LOCATION );
-  }
+    {
+    ReverseGenerateOutputInformation();
+    break;
+    }
+    }
 }
 
 template < class TInputImage, class TOutputImage,
             Transform::TransformDirection TDirectionOfTransformation >
 void
 PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
-::ForwardGenerateData ()
+::ForwardGenerateOutputInformation()
 {
   typename InputImageType::Pointer inputImgPtr
     = const_cast<InputImageType*>( this->GetInput() );
@@ -150,7 +146,7 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
         if ( m_GivenStdDevValues )
           m_Normalizer->SetStdDev( m_StdDevValues );
 
-        m_Normalizer->Update();
+        m_Normalizer->GetOutput()->UpdateOutputInformation();
 
         if ( !m_GivenMeanValues )
         {
@@ -167,8 +163,7 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
         else
         {
           m_CovarianceEstimator->SetInput( m_Normalizer->GetOutput() );
-          m_CovarianceEstimator->Update();
-
+          m_CovarianceEstimator->UpdateOutputInformation();
           m_CovarianceMatrix = m_CovarianceEstimator->GetCovariance();
         }
 
@@ -200,23 +195,18 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
   }
 
   if ( m_TransformationMatrix.GetVnlMatrix().empty() )
-  {
+    {
     throw itk::ExceptionObject( __FILE__, __LINE__,
-          "Empty transformation matrix",
-          ITK_LOCATION);
-  }
-
-  m_Transformer->SetMatrix( m_TransformationMatrix.GetVnlMatrix() );
-  m_Transformer->GraftOutput( this->GetOutput() );
-  m_Transformer->Update();
-  this->GraftOutput( m_Transformer->GetOutput() );
+                                "Empty transformation matrix",
+                                ITK_LOCATION);
+    }
 }
 
 template < class TInputImage, class TOutputImage,
             Transform::TransformDirection TDirectionOfTransformation >
 void
 PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
-::ReverseGenerateData ()
+::ReverseGenerateOutputInformation()
 {
   if ( !m_GivenTransformationMatrix )
   {
@@ -248,11 +238,10 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
 
   m_Transformer->SetInput( this->GetInput() );
   m_Transformer->SetMatrix( m_TransformationMatrix.GetVnlMatrix() );
+  m_Normalizer->SetInput( m_Transformer->GetOutput() );
 
-  if ( m_GivenMeanValues || m_GivenStdDevValues )
+  if ( m_GivenStdDevValues || m_GivenMeanValues )
   {
-    m_Normalizer->SetInput( m_Transformer->GetOutput() );
-
     if ( m_GivenStdDevValues )
     {
       VectorType revStdDev ( m_StdDevValues.Size() );
@@ -278,19 +267,57 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
       }
       m_Normalizer->SetMean( revMean );
     }
-
-    m_Normalizer->GraftOutput( this->GetOutput() );
-    m_Normalizer->Update();
-    this->GraftOutput( m_Normalizer->GetOutput() );
   }
   else
+    {
+    m_Normalizer->SetUseMean(false);
+    m_Normalizer->SetUseStdDev(false);
+    }
+}
+
+
+template < class TInputImage, class TOutputImage,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
+::GenerateData ()
+{
+  switch ( static_cast<int>(DirectionOfTransformation) )
   {
-    m_Transformer->GraftOutput( this->GetOutput() );
-    m_Transformer->Update();
-    this->GraftOutput( m_Transformer->GetOutput() );
+  case static_cast<int>(Transform::FORWARD):
+      return ForwardGenerateData();
+    case static_cast<int>(Transform::INVERSE):
+      return ReverseGenerateData();
+    default:
+      throw itk::ExceptionObject(__FILE__, __LINE__,
+          "Class should be templated with FORWARD or INVERSE only...",
+          ITK_LOCATION );
   }
 }
 
+template < class TInputImage, class TOutputImage,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
+::ForwardGenerateData ()
+{
+  m_Transformer->SetMatrix( m_TransformationMatrix.GetVnlMatrix() );
+  m_Transformer->GraftOutput( this->GetOutput() );
+  m_Transformer->Update();
+  this->GraftOutput( m_Transformer->GetOutput() );
+}
+
+template < class TInputImage, class TOutputImage,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation >
+::ReverseGenerateData ()
+{    
+    m_Normalizer->GraftOutput( this->GetOutput() );
+    m_Normalizer->Update();
+    this->GraftOutput( m_Normalizer->GetOutput() );
+}
+
 template < class TInputImage, class TOutputImage,
             Transform::TransformDirection TDirectionOfTransformation >
 void