diff --git a/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx b/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx
index e22755604331e510d27e5571c7557d5995a53e07..7a2d52092baa3ec69e629134da72c8ce3e27bad3 100644
--- a/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx
+++ b/Code/Common/otbUnaryFunctorNeighborhoodWithOffsetImageFilter.txx
@@ -50,7 +50,7 @@ UnaryFunctorNeighborhoodWithOffsetImageFilter<TInputImage,TOutputImage,TFunction
 {
   Superclass::BeforeThreadedGenerateData();
 
-  for (unsigned int i =0; i<static_cast<unsigned int>(this->GetNumberOfThreads()); i++)
+  for (int i =0; i<this->GetNumberOfThreads(); i++)
   {
     m_FunctorList.push_back(m_Functor);
   }
diff --git a/Code/FeatureExtraction/otbEntropyTextureFunctor.h b/Code/FeatureExtraction/otbEntropyTextureFunctor.h
index 8c57376d9da6693a9d31d3e0161b3ab49d038f31..c0f9e4381e97ab3143adbb310890da86484f41a7 100644
--- a/Code/FeatureExtraction/otbEntropyTextureFunctor.h
+++ b/Code/FeatureExtraction/otbEntropyTextureFunctor.h
@@ -25,10 +25,12 @@ namespace otb
 namespace Functor
 {
 /** \class EntropyTextureFunctor
- *  \brief This functor calculates the local energy of an image
+ *  \brief This functor calculates the local entropy of an image
  *
- *   Computes the sqaure gradient which is computed using offset and
- *   angle pixel of the neighborhood.
+ *   Computes joint histogram (neighborhood and offset neighborhood) 
+ *   which bins are computing using Scott formula.
+ *   Computes the probabiltiy p for each pair of pixel.
+ *   Entropy  is the sum p.log(p) over the neighborhood.
  *   TIterInput is an ietrator, TOutput is a PixelType.
  *
  *  \ingroup Functor
@@ -41,7 +43,6 @@ public:
   EntropyTextureFunctor()
   {
     m_Offset.Fill(1);
-    //m_BinLength = IntVectyorType(0, 1);
   };
   ~EntropyTextureFunctor() {};
 
@@ -53,7 +54,7 @@ public:
   typedef typename OutputType::ValueType OutputPixelType;
   typedef std::vector<double>            DoubleVectorType;
   typedef std::vector<int>               IntVectorType;
-  typedef std::vector<IntVectorType>    IntVectorVectorType;
+  typedef std::vector<IntVectorType>     IntVectorVectorType;
 
   void SetOffset(OffsetType off)
   {
@@ -64,6 +65,7 @@ public:
     return m_Offset;
   };
 
+   /** Computes the histogram bins using Scott formula, plus min/max. */
   IntVectorVectorType StatComputation(const TIterInput1 &it, const TIterInput2 &itOff)
   {
     IntVectorVectorType output;
@@ -77,6 +79,7 @@ public:
     m_MaxiOff = DoubleVectorType(nbComp, itk::NumericTraits<double>::NonpositiveMin());
     double area = static_cast<double>(radius[0]*radius[1]);
     double areaInv = 1/area;
+    double scottCoef =  3.5 /(vcl_pow(area, 1/3) );
 
     OffsetType offset;
     offset.Fill(0);
@@ -85,8 +88,8 @@ public:
 
     offsetOffInit[0] = -radius[0]+m_Offset[0]-1;
     offsetOffInit[1] = -radius[1]+m_Offset[1]-1;
-    IntVectorType mean;
-    IntVectorType meanOff;
+    DoubleVectorType mean;
+    DoubleVectorType meanOff;
     for ( unsigned int i=0; i<nbComp; i++ )
     {
       offsetOff = offsetOffInit;
@@ -99,7 +102,6 @@ public:
         offset[0] = l;
         for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++)
         {
-          //std::cout<<it.GetPixel(offset)[i]<<std::endl;
           offsetOff[1]++;
           offset[1] = k;
           meanCh += static_cast<double>(it.GetPixel(offset)[i]);
@@ -120,37 +122,38 @@ public:
       offsetOff = offsetOffInit;
       double stdCh = 0.;
       double stdChOff = 0.;
-      for ( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ )
-      {
-        offsetOff[0]++;
-        offsetOff[1] = offsetOffInit[1];
-        offset[0] = l;
-        for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++)
-        {
-          offsetOff[1]++;
-          offset[1] = k;
-          stdCh += vcl_pow( (mean[i]-static_cast<double>(it.GetPixel(offset)[i])), 2);
-          stdChOff += vcl_pow( (meanOff[i]-static_cast<double>(itOff.GetPixel(offsetOff)[i])), 2);
-        }
-      }
+      
+      for( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ )
+	{
+	  offsetOff[0]++;
+	  offsetOff[1] = offsetOffInit[1];  
+	  offset[0] = l;
+	  for( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++)
+	    {
+	      offsetOff[1]++;
+	      offset[1] = k;
+	      stdCh += vcl_pow( (mean[i]-static_cast<double>(it.GetPixel(offset)[i])), 2);
+	      stdChOff += vcl_pow( (meanOff[i]-static_cast<double>(itOff.GetPixel(offsetOff)[i])), 2);
+	    }
+	}
+      
       stdCh *= areaInv;
       stdCh = vcl_sqrt( stdCh );
       stdChOff *= areaInv;
       stdChOff = vcl_sqrt( stdChOff );
-      binLength.push_back( (3.5*stdCh) /(vcl_pow(area, 1/3) ) );
-      binLengthOff.push_back( (3.5*stdChOff) /(vcl_pow(area, 1/3) ) );
+      binLength.push_back( scottCoef*stdCh );
+      binLengthOff.push_back( scottCoef*stdChOff );		
+      
     }
-
     output.push_back(binLength);
     output.push_back(binLengthOff);
-
+    
     return output;
   }
 
 
   inline TOutput operator()(const TIterInput1 &it, const TIterInput2 &itOff)
   {
-    //std::cout<<"operator"<<std::endl;
     IntVectorVectorType binsLength = this->StatComputation(it, itOff);
 
     RadiusType radius = it.GetRadius();
@@ -175,8 +178,6 @@ public:
 
     for ( unsigned int i=0; i<nbComp; i++ )
     {
-      //std::cout<<"i :"<<i<<" "<<std::endl;
-
       IntVectorType histoTemp;
       IntVectorVectorType histo;
       if (binsLength[0][i] != 0)
@@ -188,62 +189,58 @@ public:
       else
         histo = IntVectorVectorType( 1, histoTemp );
 
-      //std::cout<<"m_Maxi[i]-m_Mini[i]  "<<m_Maxi[i]<<"  "<<m_Mini[i]<<std::endl;
-      //std::cout<<"binsLength[0][i] "<<binsLength[0][i]<<std::endl;
-      //std::cout<<histoTemp.size()<<"   "<<histo.size()<<std::endl;
-
       offsetOff = offsetOffInit;
       for ( int l = -static_cast<int>(radius[0]); l <= static_cast<int>(radius[0]); l++ )
-      { //std::cout<<"i :"<<i<<" "<<l<<std::endl;
-        offsetOff[0]++;
-        offsetOff[1] = offsetOffInit[1];
-        offset[0] = l;
-        for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++)
-        {
-          //std::cout<<i<<" "<<l<<" "<<k<<std::endl;
-          offsetOff[1]++;
-          offset[1] = k;
-          if ( binsLength[1][i] != 0)
-            histoIdX = static_cast<int>(vcl_floor( (itOff.GetPixel(offsetOff)[i]-m_MiniOff[i]) / binsLength[1][i] ));
-          else
-            histoIdX = 0;
-          if ( binsLength[0][i] !=0 )
-            histoIdY = static_cast<int>(vcl_floor( (it.GetPixel(offset)[i]-m_Mini[i]) / binsLength[0][i] ));
-          else
-            histoIdY = 0;
-          histo[histoIdX][histoIdY]++;
-
-        }
-      }
+	{
+	  offsetOff[0]++;
+	  offsetOff[1] = offsetOffInit[1];
+	  offset[0] = l;
+	  for ( int k = -static_cast<int>(radius[1]); k <= static_cast<int>(radius[1]); k++)
+	    {
+	      offsetOff[1]++;
+	      offset[1] = k;
+	      if ( binsLength[1][i] != 0)
+		histoIdX = static_cast<int>(vcl_floor( (itOff.GetPixel(offsetOff)[i]-m_MiniOff[i]) / binsLength[1][i] ));
+	      else
+		histoIdX = 0;
+	      if ( binsLength[0][i] !=0 )
+		histoIdY = static_cast<int>(vcl_floor( (it.GetPixel(offset)[i]-m_Mini[i]) / binsLength[0][i] ));
+	      else
+		histoIdY = 0;
+	      histo[histoIdX][histoIdY]++;
+	      
+	    }
+	}
       for (unsigned r = 0; r<binsLength.size(); r++)
-      {
-        for (unsigned s = 0; s<binsLength[r].size(); s++)
-        {
-          double p = binsLength[r][s] * areaInv;
-          if (p != 0)
-            outPix[i] += static_cast<OutputPixelType>(p * vcl_log(p));
-        }
-      }
-
+	{
+	  for (unsigned s = 0; s<binsLength[r].size(); s++)
+	    {
+	      double p = binsLength[r][s] * areaInv;
+	      if (p != 0)
+		outPix[i] += static_cast<OutputPixelType>(p * vcl_log(p));
+	    }
+	}
+      
     }
 
-    //std::cout<<"operator FIN"<<std::endl;
     return outPix;
 
   }
 
 private:
   OffsetType m_Offset;
+   /** Stores min/max neighborhood area values */
   DoubleVectorType m_Mini;
-  DoubleVectorType m_MiniOff;
-  DoubleVectorType m_Maxi;
+   DoubleVectorType m_Maxi;
+   /** Stores min/max neighborhood+offset values */
+   DoubleVectorType m_MiniOff;
   DoubleVectorType m_MaxiOff;
 };
 
 
 
 
-} // namespace Functor
+  } // namespace Functor
 } // namespace otb
 
 #endif
diff --git a/Code/Radiometry/otbVegetationIndex.h b/Code/Radiometry/otbVegetationIndex.h
index 2dc621a2800f5e74e4fc286a8363fc7058fb5559..9304da4f3a9db43063f2c0484fbed068bd609175 100644
--- a/Code/Radiometry/otbVegetationIndex.h
+++ b/Code/Radiometry/otbVegetationIndex.h
@@ -256,7 +256,7 @@ public:
  *
  *  This vegetation index use three inputs channels
  *
- *  [Yoram J. Kaufman and Didier Tanré, 1992]
+ *  [Yoram J. Kaufman and Didier Tanr�, 1992]
  *
  *  \ingroup Functor
  */
@@ -295,6 +295,85 @@ private:
   double  m_Gamma;
 };
 
+/** \class EVI
+ *  \brief This functor calculate the Enhanced Vegetation Index (EVI)
+ *
+ *  This vegetation index use three inputs channels
+ *
+ *  [Huete, Justice, & Liu, 1994; Huete, Liu, Batchily, & van Leeuwen, 1997]
+ *
+ *  \ingroup Functor
+ */
+template <class TInput1, class TInput2, class TInput3, class TOutput>
+class EVI
+{
+public:
+  EVI() : m_G(2.5), m_C1(6.0), m_C2(7.5), m_L(1.0) {};
+  ~EVI() {};
+  inline TOutput operator()(const TInput1 &r, const TInput2 &b, const TInput3 &nir)
+  {
+    double dr = static_cast<double>(r);
+    double db = static_cast<double>(b);
+    double dnir = static_cast<double>(nir);
+    double denominator = dnir + m_C1*dr - m_C2*db + m_L;
+    if ( denominator == 0. )
+    {
+      return static_cast<TOutput>(0.);
+    }
+    return ( static_cast<TOutput>( m_G * (dnir - dr)/denominator ) );
+  }
+  /** Set/Get G parameter */
+  void SetG(const double g)
+  {
+    m_G = g;
+  }
+  double GetG(void)const
+  {
+    return (m_G);
+  }
+  /** Set/Get C1 parameter */
+  void SetC1(const double c1)
+  {
+    m_C1 = c1;
+  }
+  double GetC1(void)const
+  {
+    return (m_C1);
+  }
+  /** Set/Get C2 parameter */
+  void SetC2(const double c2)
+  {
+    m_C2 = c2;
+  }
+  double GetC2(void)const
+  {
+    return (m_C2);
+  }
+  /** Set/Get L parameter */
+  void SetL(const double l)
+  {
+    m_L = l;
+  }
+  double GetL(void)const
+  {
+    return (m_L);
+  }
+
+private:
+
+  /** Gain factor */
+  double  m_G;
+
+  /** Coefficient of the aerosol resistance term */
+  double  m_C1;
+
+  /** Coefficient of the aerosol resistance term */
+  double  m_C2;
+
+  /** Canopy background adjustment */
+  double  m_L;
+};
+
 } // namespace Functor
 } // namespace otb
 
diff --git a/Testing/Code/FeatureExtraction/CMakeLists.txt b/Testing/Code/FeatureExtraction/CMakeLists.txt
index a4dd84ccb574ecd933190e658314c4213008ba89..3262c5858e5a09e9df19bfc8651a4f383d2a33a5 100644
--- a/Testing/Code/FeatureExtraction/CMakeLists.txt
+++ b/Testing/Code/FeatureExtraction/CMakeLists.txt
@@ -434,7 +434,7 @@ ADD_TEST(feTvExtractSegments ${FEATUREEXTRACTION_TESTS6}
 	${INPUTDATA}/ImageLine_hd.bsq.hdr
 	${INPUTDATA}/ImageLineDir.bsq.hdr
 	${TEMP}/feFiltreExtractSegments_ImageLine.hdr
-	2 0.3 20 20 2 10 0.5)
+	10  0.3 10 10 3 10 0.5)
 
 # -------            otb::ForwardFourierMellinTransformImageFilter   -------------
 
diff --git a/Testing/Code/FeatureExtraction/otbExtractSegments.cxx b/Testing/Code/FeatureExtraction/otbExtractSegments.cxx
index 15a4dba6254d75fecc3c14a73999a5c63e6167be..08871de80b3839b7b9bf0531089c7e5eda275a24 100644
--- a/Testing/Code/FeatureExtraction/otbExtractSegments.cxx
+++ b/Testing/Code/FeatureExtraction/otbExtractSegments.cxx
@@ -90,7 +90,7 @@ int otbExtractSegments( int argc, char * argv[] )
   RescalerType::Pointer rescaler = RescalerType::New();
 
   rescaler->SetOutputMinimum(0);
-  rescaler->SetOutputMaximum(1);
+  rescaler->SetOutputMaximum(255);
 
   reader1->SetFileName( inputFilename1  );
   reader2->SetFileName( inputFilename2  );
diff --git a/Testing/Code/Radiometry/CMakeLists.txt b/Testing/Code/Radiometry/CMakeLists.txt
index ecfe15907588ff63b0c33722f439ffba310c14b9..b49d17bd43ca3ba338b71f3ec09ace193297a47c 100644
--- a/Testing/Code/Radiometry/CMakeLists.txt
+++ b/Testing/Code/Radiometry/CMakeLists.txt
@@ -487,6 +487,40 @@ ADD_TEST(raTvAtmosphericCorrectionSequencementTest ${RADIOMETRY_TESTS4}
         )
 
 
+# -------            otb::RAndBAndNIRVegetationIndexImageFilter   ------------------------------
+ADD_TEST(raTvEVIRAndBAndNIRVegetationIndexImageFilter ${RADIOMETRY_TESTS4}  
+ #--compare-image ${EPSILON}   ${BASELINE}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif
+ #                  ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif
+        otbEVIRAndBAndNIRVegetationIndexImageFilter
+        EVI
+        ${INPUTDATA}/poupees_sub_c1.png
+        ${INPUTDATA}/poupees_sub_c2.png
+        ${INPUTDATA}/poupees_sub_c3.png
+        ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif
+        2.5
+        6.0
+        7.5
+        1.0
+)
+
+# -------            otb::MultiChannelRAndBAndNIRVegetationIndexImageFilter   ------------------------------
+ADD_TEST(raTvEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter ${RADIOMETRY_TESTS4}  
+ #--compare-image ${EPSILON}   ${BASELINE}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif
+ #                  ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_poupees_subc1c2c3.tif
+        otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter
+        EVI
+        ${INPUTDATA}/qb_RoadExtract.img.hdr
+        ${TEMP}/raRAndBAndNIRVegetationIndex_EVI_qb_RoadExtract.tif
+        3   # red
+        1   # blue
+        4   # nir
+        2.5   # gain factor
+        6.0   # coefficient of the aerosol resistance term
+        7.5   # coefficient of the aerosol resistance term
+        1.0   # canopy  background adjustment
+)
+
+
 
 # A enrichir
 SET(Radiometry_SRCS1
@@ -526,6 +560,8 @@ SET(Radiometry_SRCS4
 otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew.cxx
 otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms.cxx
 otbAtmosphericCorrectionSequencement.cxx
+otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx
+otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
 )
 
 INCLUDE_DIRECTORIES("${OTBTesting_BINARY_DIR}")
diff --git a/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx b/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..bd3d6503c45b9fa0d68c939a7d0857ce6c5593f9
--- /dev/null
+++ b/Testing/Code/Radiometry/otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
@@ -0,0 +1,89 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "itkExceptionObject.h"
+
+#include "otbMultiChannelRAndBAndNIRVegetationIndexImageFilter.h"
+#include "otbImage.h"
+#include "otbVectorImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbVegetationIndex.h"
+
+
+template<class TInputImage, class TOutputImage, class TFunction>
+int generic_EVIMultiChannelRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[])
+{
+  typedef otb::ImageFileReader<TInputImage> ReaderType;
+  typedef otb::ImageFileWriter<TOutputImage> WriterType;
+
+  typedef otb::MultiChannelRAndBAndNIRVegetationIndexImageFilter<TInputImage,TOutputImage,TFunction>
+  MultiChannelRAndBAndNIRVegetationIndexImageFilterType;
+
+  // Instantiating object
+  typename MultiChannelRAndBAndNIRVegetationIndexImageFilterType::Pointer filter = MultiChannelRAndBAndNIRVegetationIndexImageFilterType::New();
+  typename ReaderType::Pointer reader = ReaderType::New();
+  typename WriterType::Pointer writer = WriterType::New();
+
+  const char * inputFilename  = argv[1];
+  const char * outputFilename = argv[2];
+
+  unsigned int redChannel(::atoi(argv[3]));
+  unsigned int blueChannel(::atoi(argv[4]));
+  unsigned int nirChannel(::atoi(argv[5]));
+
+  double g(::atof(argv[6]));
+  double c1(::atof(argv[7]));
+  double c2(::atof(argv[8]));
+  double l(::atof(argv[9]));
+
+  reader->SetFileName( inputFilename );
+  writer->SetFileName( outputFilename  );
+  filter->SetRedIndex(redChannel);
+  filter->SetBlueIndex(blueChannel);
+  filter->SetNIRIndex(nirChannel);
+  filter->SetInput( reader->GetOutput() );
+  filter->GetFunctor().SetG(g);
+  filter->GetFunctor().SetC1(c1);
+  filter->GetFunctor().SetC2(c2);
+  filter->GetFunctor().SetL(l);
+
+  writer->SetInput( filter->GetOutput() );
+  writer->Update();
+
+  return EXIT_SUCCESS;
+}
+
+int otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[])
+{
+  const unsigned int Dimension = 2;
+  typedef otb::VectorImage<double ,Dimension> InputImageType;
+  typedef otb::Image<double,Dimension> OutputImageType;
+
+  std::string strArgv(argv[1]);
+  argc--;
+  argv++;
+  if ( strArgv == "EVI" ) return( generic_EVIMultiChannelRAndBAndNIRVegetationIndexImageFilter<InputImageType, OutputImageType,
+                                     otb::Functor::EVI<     InputImageType::InternalPixelType,
+                                     InputImageType::InternalPixelType,
+                                     InputImageType::InternalPixelType,
+                                     OutputImageType::PixelType> >
+                                     (argc,argv) );
+  else
+    return EXIT_FAILURE;
+  return EXIT_SUCCESS;
+}
diff --git a/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx b/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..3ba53fa6da3ab02166a6821be4917023638fb6a4
--- /dev/null
+++ b/Testing/Code/Radiometry/otbEVIRAndBAndNIRVegetationIndexImageFilter.cxx
@@ -0,0 +1,94 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "itkExceptionObject.h"
+
+#include "otbRAndBAndNIRVegetationIndexImageFilter.h"
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbVegetationIndex.h"
+
+
+template<class TInputRImage, class TInputBImage, class TInputNIRImage, class TOutputImage, class TFunction>
+int generic_EVIRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[])
+{
+  typedef otb::ImageFileReader<TInputRImage> RReaderType;
+  typedef otb::ImageFileReader<TInputBImage> BReaderType;
+  typedef otb::ImageFileReader<TInputNIRImage> NIRReaderType;
+  typedef otb::ImageFileWriter<TOutputImage> WriterType;
+
+  typedef otb::RAndBAndNIRVegetationIndexImageFilter<TInputRImage,TInputBImage,TInputNIRImage,TOutputImage,TFunction>
+  RAndBAndNIRVegetationIndexImageFilterType;
+
+  // Instantiating object
+  typename RAndBAndNIRVegetationIndexImageFilterType::Pointer filter = RAndBAndNIRVegetationIndexImageFilterType::New();
+  typename RReaderType::Pointer readerR = RReaderType::New();
+  typename BReaderType::Pointer readerB = BReaderType::New();
+  typename NIRReaderType::Pointer readerNIR = NIRReaderType::New();
+  typename WriterType::Pointer writer = WriterType::New();
+
+  const char * inputFilenameR  = argv[1];
+  const char * inputFilenameB  = argv[2];
+  const char * inputFilenameNIR  = argv[3];
+  const char * outputFilename = argv[4];
+  double g(::atof(argv[5]));
+  double c1(::atof(argv[6]));
+  double c2(::atof(argv[7]));
+  double l(::atof(argv[8]));
+
+  readerR->SetFileName( inputFilenameR );
+  readerB->SetFileName( inputFilenameB );
+  readerNIR->SetFileName( inputFilenameNIR );
+  writer->SetFileName( outputFilename  );
+  filter->SetInputR( readerR->GetOutput() );
+  filter->SetInputB( readerB->GetOutput() );
+  filter->SetInputNIR( readerNIR->GetOutput() );
+
+  filter->GetFunctor().SetG(g);
+  filter->GetFunctor().SetC1(c1);
+  filter->GetFunctor().SetC2(c2);
+  filter->GetFunctor().SetL(l);
+
+  writer->SetInput( filter->GetOutput() );
+  writer->Update();
+
+  return EXIT_SUCCESS;
+}
+
+int otbEVIRAndBAndNIRVegetationIndexImageFilter(int argc, char * argv[])
+{
+  const unsigned int Dimension = 2;
+  typedef double PixelType;
+  typedef otb::Image<PixelType,Dimension> InputRImageType;
+  typedef otb::Image<PixelType,Dimension> InputBImageType;
+  typedef otb::Image<PixelType,Dimension> InputNIRImageType;
+  typedef otb::Image<double,Dimension> OutputImageType;
+
+  std::string strArgv(argv[1]);
+  argc--;
+  argv++;
+  if ( strArgv == "EVI" ) return( generic_EVIRAndBAndNIRVegetationIndexImageFilter<InputRImageType, InputBImageType, InputNIRImageType, OutputImageType,
+                                     otb::Functor::EVI<     InputRImageType::PixelType,
+                                     InputBImageType::PixelType,
+                                     InputNIRImageType::PixelType,
+                                     OutputImageType::PixelType> >
+                                     (argc,argv) );
+  else
+    return EXIT_FAILURE;
+  return EXIT_SUCCESS;
+}
diff --git a/Testing/Code/Radiometry/otbRadiometryTests4.cxx b/Testing/Code/Radiometry/otbRadiometryTests4.cxx
index 82be2c33f926e90d6a9771eae694b85875f0d6ea..c51fb1b5a29a17e11848460b77f322886111d710 100644
--- a/Testing/Code/Radiometry/otbRadiometryTests4.cxx
+++ b/Testing/Code/Radiometry/otbRadiometryTests4.cxx
@@ -30,5 +30,7 @@ void RegisterTests()
   REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTermsNew);
   REGISTER_TEST(otbAtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms);
   REGISTER_TEST(otbAtmosphericCorrectionSequencementTest);
+  REGISTER_TEST(otbEVIRAndBAndNIRVegetationIndexImageFilter);
+  REGISTER_TEST(otbEVIMultiChannelRAndBAndNIRVegetationIndexImageFilter);
 }