diff --git a/Data/Input/apTvUtBandMathOutput.tif b/Data/Input/apTvUtBandMathOutput.tif
deleted file mode 100644
index eb058ec7324caf4fb4c6ea44d9098fd02c777831..0000000000000000000000000000000000000000
--- a/Data/Input/apTvUtBandMathOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:922a17572bde10796c6f704d2d315cd47cc04542c0829f829c93b2c177bbea80
-size 70612
diff --git a/Data/Input/apTvUtExportBandMathX.txt b/Data/Input/apTvUtExportBandMathX.txt
index baa6a64fc44bd2084a44a5b4ff0044f7b0e3fa21..774aca47ddf40b5931ef58ec124c5394bbb4a511 100644
--- a/Data/Input/apTvUtExportBandMathX.txt
+++ b/Data/Input/apTvUtExportBandMathX.txt
@@ -1,2 +1,3 @@
-#E cos(im1b1)+im2b1*im3b1-im3b2+ndvi(im3b3,im3b4)
+#F val 1
+#E im1b1 + 2*val + im2b1
 
diff --git a/Modules/Applications/AppMathParserX/otb-module.cmake b/Modules/Applications/AppMathParserX/otb-module.cmake
index 54b1fc571ac6aedc6cdfa26f7c1c4949ce4c3baa..eda0082072a811e8947f5962ccacd390f71e8af5 100644
--- a/Modules/Applications/AppMathParserX/otb-module.cmake
+++ b/Modules/Applications/AppMathParserX/otb-module.cmake
@@ -26,6 +26,9 @@ otb_module(OTBAppMathParserX
     OTBMathParserX
     OTBObjectList
 
+  TEST_DEPENDS
+    OTBTestKernel
+    
   DESCRIPTION
     "${DOCUMENTATION}"
 )
diff --git a/Modules/Applications/AppMathParserX/test/CMakeLists.txt b/Modules/Applications/AppMathParserX/test/CMakeLists.txt
index b5d584699738fa153a1a7a5c93a80138bd52c904..d47965119441f779323e725e553dc87aa54b2ded 100644
--- a/Modules/Applications/AppMathParserX/test/CMakeLists.txt
+++ b/Modules/Applications/AppMathParserX/test/CMakeLists.txt
@@ -20,15 +20,14 @@
 
 otb_module_test()
 
-#----------- BandMathX TESTS ----------------
-otb_test_application(NAME apTvUtBandMathX
-                     APP  BandMathX
-                     OPTIONS -il ${INPUTDATA}/poupees_sub_c1.png
-                                  ${INPUTDATA}/poupees_sub_c2.png
-                                  ${INPUTDATA}/poupees_sub.png
-                             -out ${TEMP}/apTvUtBandMathXOutput.tif
-                             -incontext ${INPUTDATA}/apTvUtExportBandMathX.txt
-                     VALID   --compare-image ${NOTOL}
-                             ${INPUTDATA}/apTvUtBandMathOutput.tif
-                             ${TEMP}/apTvUtBandMathXOutput.tif)
+set(OTBBandMathXAppTest
+otbBandMathXAppTests.cxx
+)
 
+add_executable(OTBBandMathXAppTest ${OTBBandMathXAppTest})
+target_link_libraries(OTBBandMathXAppTest ${OTBAppMathParserX-Test_LIBRARIES})
+otb_module_target_label(OTBBandMathXAppTest)
+
+otb_add_test(NAME apTvUtBandMathX COMMAND OTBBandMathXAppTest
+  ${INPUTDATA}/apTvUtExportBandMathX.txt
+  )
\ No newline at end of file
diff --git a/Modules/Applications/AppMathParserX/test/otbBandMathXAppTests.cxx b/Modules/Applications/AppMathParserX/test/otbBandMathXAppTests.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7267d676a460ccaafa583cdb885b8253357d92d7
--- /dev/null
+++ b/Modules/Applications/AppMathParserX/test/otbBandMathXAppTests.cxx
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES)
+ *
+ * This file is part of Orfeo Toolbox
+ *
+ *     https://www.orfeo-toolbox.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "otbVectorImage.h"
+#include "otbWrapperApplicationRegistry.h"
+#include "otbWrapperTypes.h"
+#include <string>
+
+typedef otb::VectorImage<unsigned char> VectorImageType;
+typedef VectorImageType::PixelType PixelType;
+
+/* This function is creating and filling a vector image */
+VectorImageType::Pointer create_vector_image( int pxl_s , int nb_comp , unsigned char value )
+{
+  VectorImageType::SizeType size;
+  size.Fill(pxl_s);
+  VectorImageType::IndexType index;
+  index.Fill(0);
+  VectorImageType::RegionType region;
+  region.SetSize(size);
+  region.SetIndex(index);
+
+  VectorImageType::Pointer image = VectorImageType::New();
+
+  image->SetLargestPossibleRegion( region );
+  image->SetBufferedRegion( region );
+  image->SetRequestedRegion( region );
+  image->SetNumberOfComponentsPerPixel(nb_comp);
+  image->Allocate();
+  PixelType val(nb_comp);
+  val.Fill(value);
+  image->FillBuffer(val);
+  return image;
+}
+
+int main(int , char * argv[] )
+{
+  int return_val = 0;
+  auto img1 = create_vector_image(5,2,1);
+  auto img2 = create_vector_image(5,1,2);
+  VectorImageType::IndexType index;
+  index.Fill(3); // Center of the images
+  auto app = otb::Wrapper::ApplicationRegistry::CreateApplication("BandMathX");
+  app->AddImageToParameterInputImageList("il", img1);
+  app->UpdateParameters();
+  app->AddImageToParameterInputImageList("il", img2);
+  app->UpdateParameters();
+
+  // Case one: only expression
+  app->SetParameterString("exp", "im1b1+im2b1");
+  app->UpdateParameters();
+  app->SetParameterOutputImagePixelType("out", otb::Wrapper::ImagePixelType::ImagePixelType_uint8);
+  app->Execute();
+  auto output = app->GetParameterImageBase("out");
+  output->Update();
+  float im_val = 0;
+  // We need to be carefull as we are taking the direct output of the underlying 
+  // filter in the application
+  auto output_int = dynamic_cast<otb::VectorImage<float> *>(output);
+  if( output_int ) // this need to crash if not the case
+  {
+    im_val = output_int->GetPixel(index).GetElement(0);
+    if ( im_val != 3 )
+    {
+      std::cout<<"Wrong value in test, was expecting 3, got "<<im_val<<std::endl;
+      return_val++;
+    }
+  }
+  else
+  {
+    std::cout<<"Not the right conversion, cannot retrieve the output"<<std::endl;
+    return EXIT_FAILURE;
+  }
+
+  // Case two: expression and context
+  app->SetParameterString("exp", "im1b1+val-im2b1");
+  app->UpdateParameters();
+  auto desc = app->GetParameterDescription("exp");
+  if (desc.find("Following variables not allowed : val") == std::string::npos)
+  {
+    std::cout<<"Cannot find usual value in the parameter description."<<std::endl;
+    std::cout<<"The test was looking for \"Following variables not allowed : val\""
+    <<" in the parameter description and got \""<<desc<<"\" instead."<<std::endl;
+    return_val++;
+  }
+
+  std::string context_path(argv[1]);
+  app->SetParameterString("incontext",argv[1]);
+  // val is set in the context to 1
+  app->UpdateParameters();
+  desc = app->GetParameterDescription("exp");
+  if (desc.find("Valid expression") == std::string::npos )
+  {
+    std::cout<<"Cannot find usual value in the parameter description."<<std::endl;
+    std::cout<<"The test was looking for \"Valid expression\""
+    <<" in the parameter description and got \""<<desc<<"\" instead."<<std::endl;
+    return_val++;
+  }
+  
+  app->Execute();
+  output = app->GetParameterImageBase("out");
+  output->Update();
+  // We need to be carefull as we are taking the direct output of the underlying 
+  // filter in the application
+  output_int = dynamic_cast<otb::VectorImage<float> *>(output);
+  if( output_int ) // this need to crash if not the case
+  {
+    im_val = output_int->GetPixel(index).GetElement(0);
+    if ( im_val != 0 )
+    {
+      std::cout<<"Wrong value in test, was expecting 0, got "<<im_val<<std::endl;
+      return_val++;
+    }
+  }
+  else
+  {
+    std::cout<<"Not the right conversion, cannot retrieve the output"<<std::endl;
+    return EXIT_FAILURE;
+  }
+
+  // Case three: no expression and context
+  app->SetParameterString("exp", "");
+  app->UpdateParameters();
+  auto exp = app->GetParameterString("exp");
+  if (exp.find("im1b1 + 2*val + im2b1") == std::string::npos )
+  {
+    std::cout<<"The expression value is not set correctly."<<std::endl;
+    std::cout<<"The test was looking for \"im1b1 + 2*val + im2b1\""
+    <<" in the parameter value and got \""<<exp<<"\" instead."<<std::endl;
+    return_val++;
+  }
+  app->Execute();
+  output = app->GetParameterImageBase("out");
+  output->Update();
+  // We need to be carefull as we are taking the direct output of the underlying 
+  // filter in the application
+  output_int = dynamic_cast<otb::VectorImage<float> *>(output);
+  if( output_int ) // this need to crash if not the case
+  {
+    im_val = output_int->GetPixel(index).GetElement(0);
+    if (im_val != 5 )
+    {
+      std::cout<<"Wrong value in test, was expecting 5, got "<<im_val<<std::endl;
+      return_val++;
+    }
+  }
+  else
+  {
+    std::cout<<"Not the right conversion, cannot retrieve the output"<<std::endl;
+    return EXIT_FAILURE;
+  }
+  return return_val;
+}
\ No newline at end of file