diff --git a/Code/Wrappers/SWIG/CMakeLists.txt b/Code/Wrappers/SWIG/CMakeLists.txt
index e8f39712929e5d49678f56d5c4a830ebb523a9fe..ad0f4339beeb7a6fa2b2c4ecc417e85f136a77ee 100644
--- a/Code/Wrappers/SWIG/CMakeLists.txt
+++ b/Code/Wrappers/SWIG/CMakeLists.txt
@@ -148,14 +148,14 @@ endif()
 if ( WRAP_LUA )
   option ( USE_SYSTEM_LUA "Use a system provided lua" OFF )
 
-  if ( USE_SYSTEM_LUA )
+#  if ( USE_SYSTEM_LUA )
     find_package ( Lua51 REQUIRED )
     include_directories ( ${LUA_INCLUDE_DIR} )
     set ( LUA_LIB ${LUA_LIBRARIES} )
-  else()
-    set ( LUA_LIB lua5 )
-    include_directories ( ${otbApplication_SOURCE_DIR}/Utilities/lua-5.1.4/src )
-  endif()
+#  else()
+#    set ( LUA_LIB lua5 )
+#    include_directories ( ${otbApplication_SOURCE_DIR}/Utilities/lua-5.1.4/src )
+#  endif()
 
 
   # Run swig
@@ -183,7 +183,7 @@ if ( WRAP_RUBY )
   include_directories ( ${RUBY_INCLUDE_DIRS} )
 
   # Run swig
-  set(CMAKE_SWIG_FLAGS -autorename -module otbApplication ${CMAKE_SWIG_GLOBAL_FLAGS})
+  set(CMAKE_SWIG_FLAGS -autorename -module otbapplication ${CMAKE_SWIG_GLOBAL_FLAGS})
   set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
   set(SWIG_MODULE_otbApplication_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS})
   SWIG_MODULE_INITIALIZE ( otbApplication ruby )
diff --git a/Code/Wrappers/SWIG/Lua.i b/Code/Wrappers/SWIG/Lua.i
new file mode 100644
index 0000000000000000000000000000000000000000..cd51fd1b154bdfd3739e676d49c1104231dcbae9
--- /dev/null
+++ b/Code/Wrappers/SWIG/Lua.i
@@ -0,0 +1,104 @@
+// Lua specific swig components
+#if SWIGLUA
+
+
+%ignore CreateAnother;
+%ignore Delete;
+%ignore Register;
+%ignore UnRegister;
+%ignore GetReferenceCount;
+%ignore SetReferenceCount;
+%ignore DebugOn;
+%ignore DebugOff;
+%ignore GetDebug;
+%ignore SetDebug;
+%ignore GetMTime;
+%ignore Modified;
+%ignore SetGlobalWarningDisplay;
+%ignore GetGlobalWarningDisplay;
+%ignore GlobalWarningDisplayOn;
+%ignore GlobalWarningDisplayOff;
+
+%ignore New;
+
+
+//######################################################################
+// Simulating smart pointers in SWIG
+// This gets rid of wrapping ITK smart pointers.
+
+// TODO: always tell swig we're the owner
+// TODO: itk classes with no New() must be marked as abstract
+%define DECLARE_REF_COUNT_CLASS(itkClass)
+
+  class itkClass##_Pointer
+  {
+     public:
+       itkClass##_Pointer();
+       itkClass##_Pointer(itkClass##_Pointer const & p);
+       itkClass##_Pointer(itkClass * p);
+       ~itkClass##_Pointer();
+       itkClass * operator->() const;
+       bool IsNotNull() const;
+       bool IsNull() const;
+       itkClass * GetPointer() const;
+       bool operator<(itkClass##_Pointer const & r) const;
+       bool operator>(itkClass##_Pointer const & r) const;
+       bool operator<=(itkClass##_Pointer const & r) const;
+       bool operator>=(itkClass##_Pointer const & r) const;
+       itkClass##_Pointer & operator=(itkClass##_Pointer const & r);
+       itkClass##_Pointer & operator=(itkClass## * r);
+//       itkClass * Print(std::ostream & os) const;
+     private:
+       void Register();
+       void UnRegister();
+     protected:
+  };
+
+
+  // Extend the itk classtype defined for wrapping to simulate a smart pointer in SWIG.
+  // Also, make the ctor public to make the 'new' operator available in java
+  %extend itkClass {
+    public:
+    itkClass() {
+      typedef ::itk::SmartPointer<itkLightObject> Pointer;
+      Pointer smtPtr = itkClass::New().GetPointer();
+      itkClass *rawPtr = dynamic_cast<itkClass *>(smtPtr.GetPointer());
+      rawPtr->Register();
+      return rawPtr;
+    };
+    ~itkClass() {
+      self->UnRegister();
+    };
+  }
+/*
+  %typemap(out) itkClass * {
+    itkClass* ptrRaw = $1;
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+*/  
+  %typemap(out) itkClass##_Pointer {
+    itkClass* ptrRaw = $1.GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+  
+  %typemap(out) itkClass##_Pointer & {
+    itkClass* ptrRaw = (*$1).GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+
+  // Do not wrap the corresponding itkSmartPointer
+  %ignore itkClass##_Pointer;
+  
+%enddef
+
+#endif
+
diff --git a/Code/Wrappers/SWIG/Python.i b/Code/Wrappers/SWIG/Python.i
index ae718b0b46a72a6e29c62e729b5f6802e55895ed..2896dc68d30b8351e79708a5486b3e124f052dc7 100644
--- a/Code/Wrappers/SWIG/Python.i
+++ b/Code/Wrappers/SWIG/Python.i
@@ -107,7 +107,7 @@
     }
 
   %ignore class_name::~class_name;
-  
+
   %ignore class_name##_Pointer;
 
 %enddef
@@ -144,7 +144,7 @@
   }
 
   %extend itkLightObject {
-        %pythoncode %{  
+        %pythoncode %{
           def __str__( self ):
             return self.ToString()
         %}
diff --git a/Code/Wrappers/SWIG/otbApplication.i b/Code/Wrappers/SWIG/otbApplication.i
index e53e91a6efa7ad2905db067fab82fa965183ff82..51e0d27587b091b0a0369e0154cd1dceaf610436 100644
--- a/Code/Wrappers/SWIG/otbApplication.i
+++ b/Code/Wrappers/SWIG/otbApplication.i
@@ -28,6 +28,7 @@
 %include "Python.i"
 %include "Java.i"
 %include "Ruby.i"
+%include "Lua.i"
 
 %include "itkMacro.i"
 %include "itkBase.i"
diff --git a/Code/Wrappers/SWIG/otbApplicationLuaMain.cxx b/Code/Wrappers/SWIG/otbApplicationLuaMain.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ba56b815b2f6a18f06a90546795298fe12c75216
--- /dev/null
+++ b/Code/Wrappers/SWIG/otbApplicationLuaMain.cxx
@@ -0,0 +1,427 @@
+/*
+** $Id: lua.c,v 1.157 2005/12/29 16:23:32 roberto Exp $
+** Lua stand-alone interpreter
+** See Copyright Notice in lua.h
+*/
+
+#include <itkVersion.h>
+#include <itksys/SystemTools.hxx>
+#include <itkMultiThreader.h>
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+
+#define lua_c
+
+#if !defined(_WIN32)
+#define LUA_USE_POSIX
+#endif
+
+
+extern "C" {
+#include "lua.h"
+#include "lualib.h"
+#include "lauxlib.h"
+}
+
+static lua_State *globalL = NULL;
+
+static const char *progname = LUA_PROGNAME;
+
+static void lstop (lua_State *L, lua_Debug *ar) {
+  (void)ar;  /* unused arg. */
+  lua_sethook(L, NULL, 0, 0);
+  luaL_error(L, "interrupted!");
+}
+
+
+static void laction (int i) {
+  signal(i, SIG_DFL); /* if another SIGINT happens before lstop,
+                              terminate process (default action) */
+  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
+}
+
+
+static void print_usage (void) {
+  fprintf(stderr,
+  "usage: %s [options] [script [args]].\n"
+  "Available options are:\n"
+  "  -e stat  execute string " LUA_QL("stat") "\n"
+  "  -l name  require library " LUA_QL("name") "\n"
+  "  -c conf  configure logger from file " LUA_QL("config") "\n"
+  "  -i       enter interactive mode after executing " LUA_QL("script") "\n"
+  "  -v       show version information\n"
+  "  --       stop handling options\n"
+  "  -        execute stdin and stop handling options\n"
+  ,
+  progname);
+  fflush(stderr);
+}
+
+
+static void l_message (const char *pname, const char *msg) {
+  if (pname) fprintf(stderr, "%s: ", pname);
+  fprintf(stderr, "%s\n", msg);
+  fflush(stderr);
+}
+
+
+static int report (lua_State *L, int status) {
+  if (status && !lua_isnil(L, -1)) {
+    const char *msg = lua_tostring(L, -1);
+    if (msg == NULL) msg = "(error object is not a string)";
+    l_message(progname, msg);
+    lua_pop(L, 1);
+  }
+  return status;
+}
+
+
+static int traceback (lua_State *L) {
+  lua_getfield(L, LUA_GLOBALSINDEX, "debug");
+  if (!lua_istable(L, -1)) {
+    lua_pop(L, 1);
+    return 1;
+  }
+  lua_getfield(L, -1, "traceback");
+  if (!lua_isfunction(L, -1)) {
+    lua_pop(L, 2);
+    return 1;
+  }
+  lua_pushvalue(L, 1);  /* pass error message */
+  lua_pushinteger(L, 2);  /* skip this function and traceback */
+  lua_call(L, 2, 1);  /* call debug.traceback */
+  return 1;
+}
+
+
+static int docall (lua_State *L, int narg, int clear) {
+  int status;
+  int base = lua_gettop(L) - narg;  /* function index */
+  lua_pushcfunction(L, traceback);  /* push traceback function */
+  lua_insert(L, base);  /* put it under chunk and args */
+  signal(SIGINT, laction);
+  status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);
+  signal(SIGINT, SIG_DFL);
+  lua_remove(L, base);  /* remove traceback function */
+  /* force a complete garbage collection in case of errors */
+  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);
+  return status;
+}
+
+static void print_version (void) {
+  fprintf ( stdout, LUA_VERSION "  " LUA_COPYRIGHT "\n" );
+  fprintf ( stdout, "otbApplication\nInsight Toolkit %s\n", itk::Version::GetITKVersion() );
+}
+
+
+static int getargs (lua_State *L, char **argv, int n) {
+  int narg;
+  int i;
+  int argc = 0;
+  while (argv[argc]) argc++;  /* count total number of arguments */
+  narg = argc - (n + 1);  /* number of arguments to the script */
+  luaL_checkstack(L, narg + 3, "too many arguments to script");
+  for (i=n+1; i < argc; i++)
+    lua_pushstring(L, argv[i]);
+  lua_createtable(L, narg, n + 1);
+  for (i=0; i < argc; i++) {
+    lua_pushstring(L, argv[i]);
+    lua_rawseti(L, -2, i - n);
+  }
+  return narg;
+}
+
+
+static int dofile (lua_State *L, const char *name) {
+  int status = luaL_loadfile(L, name) || docall(L, 0, 1);
+  return report(L, status);
+}
+
+
+static int dostring (lua_State *L, const char *s, const char *name) {
+  int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1);
+  return report(L, status);
+}
+
+
+static int dolibrary (lua_State *L, const char *name) {
+  lua_getglobal(L, "require");
+  lua_pushstring(L, name);
+  return report(L, lua_pcall(L, 1, 0, 0));
+}
+
+
+static const char *get_prompt (lua_State *L, int firstline) {
+  const char *p;
+  lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2");
+  p = lua_tostring(L, -1);
+  if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
+  lua_pop(L, 1);  /* remove global */
+  return p;
+}
+
+
+static int incomplete (lua_State *L, int status) {
+  if (status == LUA_ERRSYNTAX) {
+    size_t lmsg;
+    const char *msg = lua_tolstring(L, -1, &lmsg);
+    const char *tp = msg + lmsg - (sizeof(LUA_QL("<eof>")) - 1);
+    if (strstr(msg, LUA_QL("<eof>")) == tp) {
+      lua_pop(L, 1);
+      return 1;
+    }
+  }
+  return 0;  /* else... */
+}
+
+
+static int pushline (lua_State *L, int firstline) {
+  char buffer[LUA_MAXINPUT];
+  char *b = buffer;
+  size_t l;
+  const char *prmt = get_prompt(L, firstline);
+  if (lua_readline(L, b, prmt) == 0)
+    return 0;  /* no input */
+  l = strlen(b);
+  if (l > 0 && b[l-1] == '\n')  /* line ends with newline? */
+    b[l-1] = '\0';  /* remove it */
+  if (firstline && b[0] == '=')  /* first line starts with `=' ? */
+    lua_pushfstring(L, "return %s", b+1);  /* change it to `return' */
+  else
+    lua_pushstring(L, b);
+  lua_freeline(L, b);
+  return 1;
+}
+
+
+static int loadline (lua_State *L) {
+  int status;
+  lua_settop(L, 0);
+  if (!pushline(L, 1))
+    return -1;  /* no input */
+  for (;;) {  /* repeat until gets a complete line */
+    status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin");
+    if (!incomplete(L, status)) break;  /* cannot try to add lines? */
+    if (!pushline(L, 0))  /* no more input? */
+      return -1;
+    lua_pushliteral(L, "\n");  /* add a new line... */
+    lua_insert(L, -2);  /* ...between the two lines */
+    lua_concat(L, 3);  /* join them */
+  }
+  lua_saveline(L, 1);
+  lua_remove(L, 1);  /* remove line */
+  return status;
+}
+
+
+static void dotty (lua_State *L) {
+  int status;
+  const char *oldprogname = progname;
+  progname = NULL;
+  while ((status = loadline(L)) != -1) {
+    if (status == 0) status = docall(L, 0, 0);
+    report(L, status);
+    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */
+      lua_getglobal(L, "print");
+      lua_insert(L, 1);
+      if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)
+        l_message(progname, lua_pushfstring(L,
+                               "error calling " LUA_QL("print") " (%s)",
+                               lua_tostring(L, -1)));
+    }
+  }
+  lua_settop(L, 0);  /* clear stack */
+  fputs("\n", stdout);
+  fflush(stdout);
+  progname = oldprogname;
+}
+
+
+static int handle_script (lua_State *L, char **argv, int n) {
+  int status;
+  const char *fname;
+  int narg = getargs(L, argv, n);  /* collect arguments */
+  lua_setglobal(L, "arg");
+  fname = argv[n];
+  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) 
+    fname = NULL;  /* stdin */
+  status = luaL_loadfile(L, fname);
+  lua_insert(L, -(narg+1));
+  if (status == 0)
+    status = docall(L, narg, 0);
+  else
+    lua_pop(L, narg);      
+  return report(L, status);
+}
+
+
+static int collectargs (char **argv, int *pi, int *pv, int *pe) {
+  int i;
+  for (i = 1; argv[i] != NULL; i++) {
+    if (argv[i][0] != '-')  /* not an option? */
+        return i;
+    switch (argv[i][1]) {  /* option */
+      case '-': return (argv[i+1] != NULL ? i+1 : 0);
+      case '\0': return i;
+      case 'i': *pi = 1;  /* go through */
+      case 'v': *pv = 1; break;
+      case 'e': *pe = 1;  /* go through */
+      case 'c':
+      case 'l':
+        if (argv[i][2] == '\0') {
+          i++;
+          if (argv[i] == NULL) return -1;
+        }
+        break;
+      default: return -1;  /* invalid option */
+    }
+  }
+  return 0;
+}
+
+
+std::string LogConfigFilename ("");
+
+static int runargs (lua_State *L, char **argv, int n) {
+  int i;
+  for (i = 1; i < n; i++) {
+    if (argv[i] == NULL) continue;
+    lua_assert(argv[i][0] == '-');
+    switch (argv[i][1]) {  /* option */
+      case 'e': {
+        const char *chunk = argv[i] + 2;
+        if (*chunk == '\0') chunk = argv[++i];
+        lua_assert(chunk != NULL);
+        if (dostring(L, chunk, "=(command line)") != 0)
+          return 1;
+        break;
+      }
+      case 'l': {
+        const char *filename = argv[i] + 2;
+        if (*filename == '\0') filename = argv[++i];
+        lua_assert(filename != NULL);
+        if (dolibrary(L, filename))
+          return 1;  /* stop if file fails */
+        break;
+      }
+      case 'c': {
+        const char *filename = argv[i] + 2;
+        if (*filename == '\0') filename = argv[++i];
+        lua_assert(filename != NULL);
+        LogConfigFilename = filename;
+        break;
+      }
+      default: break;
+    }
+  }
+  return 0;
+}
+
+
+static int handle_luainit (lua_State *L) {
+  const char *init = getenv("LUA_INIT");
+  if (init == NULL) return 0;  /* status OK */
+  else if (init[0] == '@')
+    return dofile(L, init+1);
+  else
+    return dostring(L, init, "=LUA_INIT");
+}
+
+
+struct Smain {
+  int argc;
+  char **argv;
+  int status;
+};
+
+
+#include <itkMultiThreader.h>
+
+extern "C" int luaopen_otbApplication ( lua_State* L );
+
+static int pmain (lua_State *L) {
+  struct Smain *s = (struct Smain *)lua_touserdata(L, 1);
+  char **argv = s->argv;
+  int script;
+  int has_i = 0, has_v = 0, has_e = 0;
+  globalL = L;
+  if (argv[0] && argv[0][0]) progname = argv[0];
+  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */
+  luaL_openlibs(L);  /* open libraries */
+
+  // Insert our custom code
+  luaopen_otbApplication(L);
+
+  lua_gc(L, LUA_GCRESTART, 0);
+  s->status = handle_luainit(L);
+  if (s->status != 0) return 0;
+  script = collectargs(argv, &has_i, &has_v, &has_e);
+  if (script < 0) {  /* invalid args? */
+    print_usage();
+    s->status = 1;
+    return 0;
+  }
+  if (has_v) print_version();
+  s->status = runargs(L, argv, (script > 0) ? script : s->argc);
+  if (s->status != 0) return 0;
+
+  // See if we have OMP_NUM_THREADS set, and if so, make ITK obey
+  std::string NumThreads;
+  if ( itksys::SystemTools::GetEnv ( "OMP_NUM_THREADS", NumThreads ) ) {
+    itk::MultiThreader::SetGlobalDefaultNumberOfThreads ( atoi ( NumThreads.c_str() ) );
+  }
+
+  if (script)
+    s->status = handle_script(L, argv, script);
+  if (s->status != 0) return 0;
+  if (has_i)
+    dotty(L);
+  else if (script == 0 && !has_e && !has_v) {
+    if (lua_stdin_is_tty()) {
+      print_version();
+      dotty(L);
+    }
+    else dofile(L, NULL);  /* executes stdin as a file */
+  }
+  return 0;
+}
+
+
+
+int main (int argc, char **argv) {
+  int status = 0;
+
+  struct Smain s;
+  lua_State *L = lua_open();  /* create state */
+  if (L == NULL) {
+    l_message(argv[0], "cannot create state: not enough memory");
+    return EXIT_FAILURE;
+  }
+#ifdef USE_TECLA
+  // Initialize Tecla
+  gl = new_GetLine(16*1024,2048);
+  gl_configure_getline ( gl, "", "", "~/.otbApplicationLua" );
+  gl_load_history ( gl, "~/.otbApplication.history", "--" );
+#endif
+
+
+  s.argc = argc;
+  s.argv = argv;
+  try {
+    status = lua_cpcall(L, &pmain, &s);
+    report(L, status);
+    lua_close(L);
+  } catch (...) {}
+
+#ifdef USE_TECLA
+  gl_save_history ( gl, "~/.otbApplication.history", "--", 1000 );
+  del_GetLine ( gl );
+#endif
+  return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 5664f7ef8b485167b632469839d09f3f7962a4b2..a9c6f36f4ecc18069543c02c91f4f46892660fad 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -2,6 +2,10 @@ SET(TEMP ${CMAKE_BINARY_DIR}/Testing/Temporary)
 FILE(MAKE_DIRECTORY ${TEMP})
 
 add_subdirectory(Core)
+
 add_subdirectory(Python)
 add_subdirectory(Java)
+add_subdirectory(Ruby)
+add_subdirectory(Lua)
+
 add_subdirectory(QtWidget)
\ No newline at end of file
diff --git a/Testing/Java/CMakeLists.txt b/Testing/Java/CMakeLists.txt
index e1f424e9fb59cd6eedff1605124e50da61d05dcf..6756ef720264ee587493ea40bf6173bbfcc20042 100644
--- a/Testing/Java/CMakeLists.txt
+++ b/Testing/Java/CMakeLists.txt
@@ -1,7 +1,7 @@
 include( UseJava )
 
 SET(TEST_DRIVER "${OTB_TEST_DRIVER}"
-    --add-before-env LD_LIBRARY_PATH        "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
+    --add-before-env LD_LIBRARY_PATH   "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
     --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example"
 )
 
@@ -13,8 +13,8 @@ add_jar( JavaSmoothingTest JavaSmoothingTest.java )
 SET(JAVA_COMMAND "${JAVACOMMAND}" -Djava.library.path=${OTB-Wrapper_BINARY_DIR}/Code/Wrappers/SWIG)
 
 
-add_test( NAME jaTvJavaSmoothingTest
+add_test( NAME jaTvSmoothing
           COMMAND ${TEST_DRIVER} Execute
           ${JAVA_COMMAND} -cp ${CMAKE_JAVA_INCLUDE_PATH}:JavaSmoothingTest.jar SmoothingTest
           ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
-          ${TEMP}/ToulouseExtract_WithGeom_ )
+          ${TEMP}/jaTvSmoothing_ )
diff --git a/Testing/Java/JavaSmoothingTest.java b/Testing/Java/JavaSmoothingTest.java
index 5d21ce9089e9d97563090a00b788dfdf4775f57e..6c3c474b4b170aff4433a340555b7d145584008b 100644
--- a/Testing/Java/JavaSmoothingTest.java
+++ b/Testing/Java/JavaSmoothingTest.java
@@ -11,6 +11,10 @@ class SmoothingTest {
 
     System.out.println( "Available applications : " + Registry.GetAvailableApplications() );
 
+    Application_Pointer app = Registry.CreateApplication("Smoothing");
+    
+    System.out.println( Registry.CreateApplication("Smoothing").GetDescription() );
+    
   }
 
 }
\ No newline at end of file
diff --git a/Testing/Lua/CMakeLists.txt b/Testing/Lua/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f0591915ade84279b2db0eedbc8093c409d8827d
--- /dev/null
+++ b/Testing/Lua/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+SET(TEST_DRIVER "${OTB_TEST_DRIVER}"
+    --add-before-env LD_LIBRARY_PATH   "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
+    --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example"
+)
+
+ADD_TEST( NAME luTvSmoothing
+          COMMAND ${TEST_DRIVER} Execute
+                  ${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG/otbApplicationLua
+                  ${CMAKE_CURRENT_SOURCE_DIR}/LuaSmoothingTest.lua
+                  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
+                  ${TEMP}/rbTvSmoothing_ )
diff --git a/Testing/Lua/LuaSmoothingTest.lua b/Testing/Lua/LuaSmoothingTest.lua
new file mode 100644
index 0000000000000000000000000000000000000000..fdca6b65711bdfea12ad2decd5432ab8129e273e
--- /dev/null
+++ b/Testing/Lua/LuaSmoothingTest.lua
@@ -0,0 +1,9 @@
+print ( "Lua test begin" )
+
+r = otbApplication.Registry
+apps = r:GetAvailableApplications()
+
+print ( "otbApplication.Registry:GetAvailableApplications OK" )
+print ( "apps" )
+print ( apps )
+os.exit ( 0 )
\ No newline at end of file
diff --git a/Testing/Python/CMakeLists.txt b/Testing/Python/CMakeLists.txt
index 69dae0bfef5cd8df4cb77137637ccd8497fac3b4..8228e4e3e7bfa8274bf3e79606d3309dec0818b6 100644
--- a/Testing/Python/CMakeLists.txt
+++ b/Testing/Python/CMakeLists.txt
@@ -1,16 +1,11 @@
-# configure the test driver
-FIND_PROGRAM(OTB_TEST_DRIVER otbTestDriver PATHS ${OTB_DIR}/bin ${OTB_DIR}/../../bin DOC "Path to the otbTestDriver executable from OTB")
-
 
 SET(TEST_DRIVER "${OTB_TEST_DRIVER}"
     --add-before-env PYTHONPATH        "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
     --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example"
 )
-SET(TEMP ${CMAKE_BINARY_DIR}/Testing/Temporary)
-FILE(MAKE_DIRECTORY ${TEMP})
 
-ADD_TEST( NAME PythonTest1
+ADD_TEST( NAME pyTvSmoothing
           COMMAND ${TEST_DRIVER} Execute
                   ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonSmoothingTest.py 
                   ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
-                  ${TEMP}/ToulouseExtract_WithGeom_ )
\ No newline at end of file
+                  ${TEMP}/pyTvSmoothing_ )
diff --git a/Testing/Ruby/CMakeLists.txt b/Testing/Ruby/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b0138171581dd58997da5e622a7c1b7c85d7f80c
--- /dev/null
+++ b/Testing/Ruby/CMakeLists.txt
@@ -0,0 +1,11 @@
+
+SET(TEST_DRIVER "${OTB_TEST_DRIVER}"
+    --add-before-env LD_LIBRARY_PATH   "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
+    --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example"
+)
+
+ADD_TEST( NAME rbTvSmoothing
+          COMMAND ${TEST_DRIVER} Execute
+                  ${RUBY_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/RubySmoothingTest.rb
+                  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
+                  ${TEMP}/rbTvSmoothing_ )
diff --git a/Testing/Ruby/RubySmoothingTest.rb b/Testing/Ruby/RubySmoothingTest.rb
new file mode 100644
index 0000000000000000000000000000000000000000..854653cceab125b889b1e4a8a0818f509a157e60
--- /dev/null
+++ b/Testing/Ruby/RubySmoothingTest.rb
@@ -0,0 +1,15 @@
+#
+#  Example on the use of the Smoothing 
+#
+require 'otbapplication'
+
+if ARGV.length < 2 then
+    puts( "Usage: RubySmoothingTest input outputbasename" )
+    exit( 1 )
+end
+
+tag = ARGV[0];
+
+r = Otbapplication::Registry
+applist = r.get_available_applications()
+puts( applist )
\ No newline at end of file