diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll
index 83d767120523ec4856cdd21899d5d6f485d27fad..d4e896238fd76a1bcc651cd1232a371427ff8ac3 100644
--- a/preprocessor/DynareFlex.ll
+++ b/preprocessor/DynareFlex.ll
@@ -44,6 +44,7 @@ int comment_caller, line_caller;
  this flag is set to 1, when command finished it is set to 0
  */
 int sigma_e = 0;
+string eofbuff;
 %}
 
 %option c++
@@ -52,11 +53,12 @@ int sigma_e = 0;
 
 %option case-insensitive noyywrap nounput batch debug never-interactive
 
- /* NB: if new start conditions are defined, add them in the line for [\n]+ */
+ /* NB: if new start conditions are defined, add them in the line for [\n]+ and <<EOF>>*/
 %x COMMENT
 %x DYNARE_STATEMENT
 %x DYNARE_BLOCK
 %x NATIVE
+%x NATIVE_COMMENT
 %x LINE1
 %x LINE2
 %x LINE3
@@ -569,29 +571,39 @@ int sigma_e = 0;
 
  /* Add the native statement */
 <NATIVE>{
-  [^/%*\n]*   |
-  "*"         |
-  "/"         { yymore(); }
-  \n          {
-                driver.add_native_remove_charset(yytext, "\n");
-                BEGIN INITIAL;
-              }
-  "%".*       {
-                driver.add_native_remove_charset(yytext, "%");
-                BEGIN INITIAL;
-              }
-  "//".*      {
-                driver.add_native_remove_charset(yytext, "//");
-                BEGIN INITIAL;
-              }
-  "/*"        {
-                driver.add_native_remove_charset(yytext, "/*");
-                comment_caller = INITIAL;
-                BEGIN COMMENT;
-              }
+  [^/%*\n\.]*                 |
+  \.{1,2}                     |
+  "*"                         |
+  "/"                         { yymore(); eofbuff = string(yytext); }
+  \.{3,}[[:space:]]*\n        { driver.add_native_remove_charset(yytext, "\n"); }
+  \n                          {
+                                if (strlen(yytext) > 1)
+                                  driver.add_native_remove_charset(yytext, "\n");
+                                BEGIN INITIAL;
+                              }
+  <<EOF>>                     {
+                                driver.add_native(eofbuff);
+                                yyterminate();
+                              }
+  \.{3,}[[:space:]]*"%".*\n   |
+ "%"[^\n]*                    { driver.add_native_remove_charset(yytext, "%"); }
+  \.{3,}[[:space:]]*"//".*\n  |
+ "//"[^\n]*                   { driver.add_native_remove_charset(yytext, "//"); }
+  \.{3,}[[:space:]]*"/*"      {
+                                driver.add_native_remove_charset(yytext, "/*");
+                                BEGIN NATIVE_COMMENT;
+                              }
+  "/*"                        {
+                                driver.add_native_remove_charset(yytext, "/*");
+                                comment_caller = NATIVE;
+                                BEGIN COMMENT;
+                              }
 }
 
-<*><<EOF>> { yyterminate(); }
+<NATIVE_COMMENT>"*/"[[:space:]]*\n   { BEGIN NATIVE; }
+<NATIVE_COMMENT>.
+
+<INITIAL,DYNARE_STATEMENT,DYNARE_BLOCK,COMMENT,LINE1,LINE2,LINE3,NATIVE_COMMENT><<EOF>> { yyterminate(); }
 
 <*>.      { driver.error(*yylloc, "character unrecognized by lexer"); }
 %%
diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc
index 846a0989f8d8396271ab5ea79795747995c87a7b..13fdc3318439cbdfa11760a04b620a2b9e61180c 100644
--- a/preprocessor/ParsingDriver.cc
+++ b/preprocessor/ParsingDriver.cc
@@ -1840,14 +1840,20 @@ ParsingDriver::add_model_var_or_external_function(string *function_name, bool in
 }
 
 void
-ParsingDriver::add_native_remove_charset(const char *s, const char *token)
+ParsingDriver::add_native(const string &s)
+{
+  mod_file->addStatement(new NativeStatement(s));
+}
+
+void
+ParsingDriver::add_native_remove_charset(const char *s, const string &token)
 {
   string str = string(s);
-  string tok = string(token);
   size_t found = str.find(token);
 
   assert(found != string::npos);
-  mod_file->addStatement(new NativeStatement(str.substr(0, found)));
+  str.resize(found);
+  add_native(str);
 }
 
 void
diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh
index 987feb1f87f480eb76d90b17ddec57880a0aef83..3acb8460c7c275ee0dab37df26c3b258a7437b69 100644
--- a/preprocessor/ParsingDriver.hh
+++ b/preprocessor/ParsingDriver.hh
@@ -489,8 +489,10 @@ public:
   void add_external_function_arg(NodeID arg);
   //! Adds an external function call node
   NodeID add_model_var_or_external_function(string *function_name, bool in_model_block);
+  //! Adds a native statement
+  void add_native(const string &s);
   //! Adds a native statement, first removing the set of characters passed in token (and everything after)
-  void add_native_remove_charset(const char *s, const char *token);
+  void add_native_remove_charset(const char *s, const string &token);
   //! Resets data_tree and model_tree pointers to default (i.e. mod_file->expressions_tree)
   void reset_data_tree();
   //! Begin a steady_state_model block