diff --git a/maca_common/include/ProgramParameters.hpp b/maca_common/include/ProgramParameters.hpp
index 2299fd2942e15bf2397860f773bd6c922e7b102d..2cd815ae7360bebaff2ec6a5938fac2ab22179de 100644
--- a/maca_common/include/ProgramParameters.hpp
+++ b/maca_common/include/ProgramParameters.hpp
@@ -46,6 +46,7 @@ struct ProgramParameters
   static int nbTrain;
   static bool randomEmbeddings;
   static bool printEntropy;
+  static bool printTime;
   static std::string sequenceDelimiterTape;
   static std::string sequenceDelimiter;
 
diff --git a/maca_common/include/util.hpp b/maca_common/include/util.hpp
index fc012e7f77bbc0fe3dfe25e51f0dc2497c318182..0ad31ce09049bc49a6cafa8ca1ba31bbbbee0ac8 100644
--- a/maca_common/include/util.hpp
+++ b/maca_common/include/util.hpp
@@ -163,6 +163,11 @@ std::string float2str(float f, const char * format);
 /// @return s without suffix at the end.
 std::string removeSuffix(const std::string & s, const std::string & suffix);
 
+/// @brief Return a string with the current system time.
+///
+/// @return Current system time.
+std::string getTime();
+
 /// @brief Macro giving informations about an error.
 #define ERRINFO (getFilenameFromPath(std::string(__FILE__))+ ":l." + std::to_string(__LINE__)).c_str()
 
diff --git a/maca_common/src/ProgramParameters.cpp b/maca_common/src/ProgramParameters.cpp
index 6ac3fe53de6461ee5b5b41bdd7336a9cf39df42c..43604b5bbc7763887f83a4143872a9c9ff9845d5 100644
--- a/maca_common/src/ProgramParameters.cpp
+++ b/maca_common/src/ProgramParameters.cpp
@@ -39,6 +39,7 @@ float ProgramParameters::dynamicProbability;
 bool ProgramParameters::showFeatureRepresentation;
 bool ProgramParameters::randomEmbeddings;
 bool ProgramParameters::printEntropy;
+bool ProgramParameters::printTime;
 int ProgramParameters::iterationSize;
 int ProgramParameters::nbTrain;
 std::string ProgramParameters::sequenceDelimiterTape;
diff --git a/maca_common/src/util.cpp b/maca_common/src/util.cpp
index 6d8fc121e8a0f7742aa8a34768f660c6df20780b..5bfa71d72ba3897bfee72f3396340279961d69ad 100644
--- a/maca_common/src/util.cpp
+++ b/maca_common/src/util.cpp
@@ -1,6 +1,7 @@
 #include "util.hpp"
 #include <algorithm>
 #include <cstring>
+#include <ctime>
 
 bool isAlpha(char c)
 {
@@ -360,3 +361,14 @@ std::string removeSuffix(const std::string & s, const std::string & suffix)
   return result;
 }
 
+std::string getTime()
+{
+  time_t rawtime;
+  char buffer[80];
+
+  time (&rawtime);
+
+  strftime(buffer, sizeof(buffer), "%H:%M:%S", localtime(&rawtime));
+  return std::string(buffer);
+}
+
diff --git a/trainer/src/Trainer.cpp b/trainer/src/Trainer.cpp
index fda7506355bac76748a46aa8cef7d9cab11f7073..3f43c060a84b6664f541365e4b6b58546783ec5d 100644
--- a/trainer/src/Trainer.cpp
+++ b/trainer/src/Trainer.cpp
@@ -96,7 +96,9 @@ void Trainer::train()
 {
   Dict::createFiles(ProgramParameters::expPath, "");
 
-  fprintf(stderr, "Training of \'%s\' :\n", tm.name.c_str());
+  fprintf(stderr, "%sTraining of \'%s\' :\n", 
+    ProgramParameters::printTime ? ("["+getTime()+"] ").c_str() : "",
+    tm.name.c_str());
 
   auto resetAndShuffle = [this]()
   {
@@ -318,6 +320,8 @@ void Trainer::printScoresAndSave(FILE * output)
 
   if (ProgramParameters::interactive)
     fprintf(stderr, "                            \r");
+  if (ProgramParameters::printTime)
+    fprintf(output, "[%s] ", getTime().c_str());
   fprintf(output, "Iteration %d/%d :\n", curIter+1, ProgramParameters::nbIter);
 
   printColumns(output, {names, acc, train, dev, savedStr});
diff --git a/trainer/src/macaon_train.cpp b/trainer/src/macaon_train.cpp
index 41f9b4285ca30470783edb9b64982b5a08efcc7e..980b2d08b5f9105c46a228b1269ac5a124b6d95b 100644
--- a/trainer/src/macaon_train.cpp
+++ b/trainer/src/macaon_train.cpp
@@ -68,6 +68,7 @@ po::options_description getOptionsDescription()
       "The name of the buffer's tape that contains the delimiter token for a sequence")
     ("sequenceDelimiter", po::value<std::string>()->default_value("1"),
       "The value of the token that act as a delimiter for sequences")
+    ("printTime", "Print time on stderr")
     ("shuffle", po::value<bool>()->default_value(true),
       "Shuffle examples after each iteration");
 
@@ -236,6 +237,7 @@ int main(int argc, char * argv[])
   ProgramParameters::bdName = vm["bd"].as<std::string>();
   ProgramParameters::mcdName = vm["mcd"].as<std::string>();
   ProgramParameters::debug = vm.count("debug") == 0 ? false : true;
+  ProgramParameters::printTime = vm.count("printTime") == 0 ? false : true;
   ProgramParameters::trainName = vm["train"].as<std::string>();
   ProgramParameters::devName = vm["dev"].as<std::string>();
   ProgramParameters::lang = vm["lang"].as<std::string>();