diff --git a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
index 6be11377009ec2085cf3f211d76696b4a75c578a..0dbd9d2a55b08e9462f8519ec7c2c12d611a47c1 100644
--- a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
@@ -18,6 +18,7 @@
 
 // Validation
 #include "otbConfusionMatrixCalculator.h"
+#include "otbContingencyTableCalculator.h"
 
 namespace otb
 {
@@ -81,11 +82,27 @@ private:
       }
     else
       {
-      // TODO Compute Contingency Table
+      WriteContingencyTable();
       }
   }
 
 
+  void WriteContingencyTable()
+  {
+    // Compute contingency table
+    typedef ContingencyTableCalculator<ClassLabelType> ContigencyTableCalcutaltorType;
+    ContigencyTableCalcutaltorType::Pointer contingencyTableCalculator = ContigencyTableCalcutaltorType::New();
+    contingencyTableCalculator->Compute(predictedList->Begin(), predictedList->End(),
+                                        classificationListSamples.labeledListSample->Begin(),
+                                        classificationListSamples.labeledListSample->End());
+    ContingencyTable<ClassLabelType> contingencyTable = contingencyTableCalculator->GetContingencyTable();
+
+    // Write contingency table
+    std::ofstream outFile;
+    outFile.open( this->GetParameterString( "io.confmatout" ).c_str() );
+    outFile << contingencyTable.to_csv();
+  }
+
 
   ConfusionMatrixCalculatorType::Pointer
   ComputeConfusionMatrix(const TargetListSampleType::Pointer &predictedListSample,