diff --git a/include/controls.cpp b/include/controls.cpp
index 69d2e5b77..f4ea400b9 100755
--- a/include/controls.cpp
+++ b/include/controls.cpp
@@ -1107,7 +1107,13 @@ void TControl::set_rjust(bool on)
 // @doc INTERNAL
 
 // @mfunc Flag di sola lettura
-void TControl::read_only(bool on)
+bool TControl::read_only() const
+{
+  return (xi_get_attrib(_obj) & XI_ATR_READONLY) != 0;
+}
+
+// @mfunc Flag di sola lettura
+void TControl::set_read_only(bool on)
 {
   change_attrib(XI_ATR_READONLY, on);
 }
@@ -1344,7 +1350,7 @@ void TField_control::create(WINDOW win, short cid,
 void TField_control::show_button(bool on)
 {
   XI_FIELD_DATA* f = _obj->v.field;
-  bool has_button = f->button != 0;
+  const bool has_button = f->button != 0;
   if (has_button != on)
   {
     f->button = on;
@@ -1352,16 +1358,6 @@ void TField_control::show_button(bool on)
   }
 }
 
-bool TField_control::read_only() const
-{
-  return bool((xi_get_attrib(_obj) & XI_ATR_READONLY) != 0);
-}
-
-void TField_control::set_read_only(bool on)
-{
-  change_attrib(XI_ATR_READONLY, on);
-}
-
 bool TField_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev)
 {
   if (in_create)
diff --git a/include/controls.h b/include/controls.h
index 2b3b569ea..234dfcc04 100755
--- a/include/controls.h
+++ b/include/controls.h
@@ -101,8 +101,8 @@ public:
 
   virtual void destroy();
  
-  virtual void read_only(bool on = TRUE);
-
+  virtual bool read_only() const;
+  virtual void set_read_only(bool on = TRUE);
 
   virtual void set_rjust(bool on = TRUE);
   void set_ljust() { set_rjust(FALSE); }
@@ -164,10 +164,7 @@ public:
   void show_button(bool on);
   
   // @cmember Forza il focus al controllo
-  virtual void set_focus() const;
-                          
-  bool read_only() const;                     
-  void set_read_only(bool on = TRUE);
+  virtual void set_focus() const;                    
   void set_back_color(COLOR col);
 
   // @cmember Costruttore
diff --git a/include/expr.cpp b/include/expr.cpp
index 17a60a8c7..139af6e18 100755
--- a/include/expr.cpp
+++ b/include/expr.cpp
@@ -443,7 +443,7 @@ void TExpression::eval()
      {
         const TString & s2 = evalstack.pop_string();
         const TString & s1 = evalstack.pop_string(); 
-        evalstack.push(s1.match(s2));
+        evalstack.push(s1.match(s2, true)); // Match ignoring case
       }
       break;
     case _noteq:
diff --git a/include/mask.cpp b/include/mask.cpp
index cc8738a3a..718d6d7aa 100755
--- a/include/mask.cpp
+++ b/include/mask.cpp
@@ -187,29 +187,33 @@ void TMask::read_mask(
 	{
 		_total_time = clock()-start_t;
   
-		TFilename prof; 
-		make_profile_name(prof);
-		TString16 para(user()); para << "_Locks";
-		TConfig ini(prof, para);
-		const int items = fields();
-		TBit_array read_only(items);
-		TAuto_token_string fields(ini.get("Lock"));
-		
-		if (fields == "*")
-			read_only.set();
-		else
-			set_locking(read_only, fields);
-		
-		fields = ini.get("Unlock");
-		set_locking(read_only, fields, false);
+		TFilename prof;
+    if (make_profile_name(prof))
+    {
+		  TString16 para(user()); para << "_Locks";
+		  TConfig ini(prof, para);
+		  TAuto_token_string str = ini.get("Lock");
+      if (!str.empty_items())
+      {
+		    const int items = fields();
+        TBit_array read_only(items);  // Crea un opportuno array di bit
+		    
+		    if (str == "*")
+			    read_only.set();
+		    else
+			    set_locking(read_only, str, true); 
+		    str = ini.get("Unlock");
+        if (!str.empty_items())
+          set_locking(read_only, str, false);
 
-		for (int j = 0; j < items; j++)
-		{
-			TMask_field & f = fld(j);
-
-			if (read_only[j] && f.is_editable())
-				f.set_read_only(true);
-		}
+		    for (int j = 0; j < items; j++) if (read_only[j])
+		    {
+			    TMask_field& f = fld(j);
+			    if (f.is_editable() || f.is_sheet())
+				    f.set_read_only(true);
+		    }
+      }
+    }
 	}
 }  
 
@@ -2110,12 +2114,13 @@ void TMask::copy_values(
   }
 }
 
-void TMask::make_profile_name(TFilename& f) const
+bool TMask::make_profile_name(TFilename& f) const
 {
   f =::firm2dir(-1);    // Directory dati
   f.add("config");      // Directory config
   f.add(source_file().name()); // Nome Maschera
   f.ext("ini");         // Estensione
+  return f.exist();
 }
 
 int TMask::save_profile(int num, const char* desc) const
@@ -2185,37 +2190,38 @@ int TMask::save_profile(int num, const char* desc) const
 int TMask::load_profile(int num, bool reset)
 {
   TFilename prof; 
-  make_profile_name(prof);
-  
-  TConfig ini(prof, "Main");
-  if (num <= 0)
-    num = ini.get_int(user());
-  else
-    ini.set(user(), num);
-  
-  TString16 name; name << num;  
-  TAssoc_array& var = ini.list_variables(name);
-  
-  for (int pos = fields()-1; pos >= 0; pos--)
+  if (make_profile_name(prof))
   {
-    TMask_field& f = fld(pos);
-    if (f.is_loadable() && f.get_default().empty())
+    TConfig ini(prof, "Main");
+    if (num <= 0)
+      num = ini.get_int(user());
+    else
+      ini.set(user(), num);
+  
+    TString16 name; name << num;  
+    TAssoc_array& var = ini.list_variables(name);
+  
+    for (int pos = fields()-1; pos >= 0; pos--)
     {
-      name.format("F_%d", f.dlg());
-      if (reset || var.objptr(name) != NULL)
+      TMask_field& f = fld(pos);
+      if (f.is_loadable() && f.get_default().empty())
       {
-        if (f.is_sheet())
+        name.format("F_%d", f.dlg());
+        if (reset || var.objptr(name) != NULL)
         {
-          TSheet_field& sf = (TSheet_field&)f;
-          sf.destroy(); 
-          for (int r = 0; ini.exist(name,r); r++)
-            sf.row(r) = ini.get(name, NULL, r);
-          sf.force_update();  
-        }
-        else
-        {
-          if (!f.is_firm())
-            f.set(ini.get(name));
+          if (f.is_sheet())
+          {
+            TSheet_field& sf = (TSheet_field&)f;
+            sf.destroy(); 
+            for (int r = 0; ini.exist(name,r); r++)
+              sf.row(r) = ini.get(name, NULL, r);
+            sf.force_update();  
+          }
+          else
+          {
+            if (!f.is_firm())
+              f.set(ini.get(name));
+          }
         }
       }
     }
diff --git a/include/mask.h b/include/mask.h
index cd678e3ad..930b07649 100755
--- a/include/mask.h
+++ b/include/mask.h
@@ -394,7 +394,7 @@ public:
   void copy_values(const TMask &m);
 
   // @cmember Crea il nome del file dei profili in <p f>
-  void make_profile_name(TFilename& f) const;
+  bool make_profile_name(TFilename& f) const;
   // @cmember Salva il profilo <p num>
   int save_profile(int num = 0, const char* desc = NULL) const;
   // @cmember Carica il profilo <p num>
diff --git a/include/maskfld.cpp b/include/maskfld.cpp
index 31f67dfcc..2eef284aa 100755
--- a/include/maskfld.cpp
+++ b/include/maskfld.cpp
@@ -208,7 +208,7 @@ void TMask_field::set_read_only(bool r)
 { 
 	_flags.read_only = r && !in_key(1);
 	if (_ctl)
-		_ctl->read_only(_flags.read_only);
+		_ctl->set_read_only(_flags.read_only);
 }
 
 // @doc INTERNAL
diff --git a/include/msksheet.cpp b/include/msksheet.cpp
index 35276f011..abe80ee9a 100755
--- a/include/msksheet.cpp
+++ b/include/msksheet.cpp
@@ -187,6 +187,7 @@ class TSpreadsheet : public TControl
 protected:
   //@cmember Gestisce gli eventi delle celle (chiamata dal <mf TSpreadsheet::xiev_handler>)
   virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
+  virtual void set_read_only(bool ro);
   
   KEY barcode_newline() const;
                
@@ -1038,7 +1039,6 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
 
   BOOLEAN& refused = xiev->refused;   
 
-
   switch (xiev->type)
   {
   case XIE_GET_FIRST:
@@ -1212,7 +1212,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
       {
         if (xiev->v.xi_obj->type == XIT_LIST)   // Bottone dello sheet
         {
-          if (test_focus_change())
+          if (test_focus_change() && active())
           {     
             int rec = -1;      
             _cell_dirty = FALSE;
@@ -1304,7 +1304,6 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
         }        
       }  
       _check_enabled = TRUE;    
-
     }    
     break;
   case XIE_DBL_CELL:
@@ -2378,7 +2377,6 @@ void TSpreadsheet::str2mask(int riga)
   }
 
   TToken_string& r = row(riga);
-  
   owner().row2mask(riga, r);
 }
 
@@ -2400,7 +2398,6 @@ KEY TSpreadsheet::edit(int n)
 {
   str2mask(n);
   KEY k = owner().run_editmask(n);
-
   if (active()) 
   {
     if (k == K_ENTER)
@@ -2428,10 +2425,17 @@ KEY TSpreadsheet::edit(int n)
         }
     }
   }  
+  else
+    k = K_ESC;
   
   return k;
 }
 
+void TSpreadsheet::set_read_only(bool on)
+{
+  activate(!on);
+}
+
 ///////////////////////////////////////////////////////////
 // TSheet_field
 ///////////////////////////////////////////////////////////
@@ -2734,7 +2738,6 @@ bool TSheet_field::row_enabled(int row)
   return (s->find_enabled_column(row,1,1) != 0);
 }
 
-
 void TSheet_field::enable_cell(int row, int column, bool on)
 {                          
   TSpreadsheet* s = (TSpreadsheet*)_ctl;
@@ -2747,7 +2750,6 @@ void TSheet_field::enable_column(int column, bool on)
   s->enable_column(column, on);
 }
 
-
 bool TSheet_field::column_enabled(int column) const
 {                          
   TSpreadsheet* s = (TSpreadsheet*)_ctl;
@@ -2839,8 +2841,6 @@ static int default_rows_compare(TSheet_field &s, int i, int j)
   return s1.compare(s2);
 }
 
-
-
 void TSheet_field::sort(ROWS_COMPARE_FUNCTION compare)
 {
   if (compare == NULL) compare = default_rows_compare;
@@ -2915,7 +2915,6 @@ bool TSheet_field::on_hit()
   return ok;  
 }  
 
-
 void TSheet_field::select(int r, bool scrollto)
 { 
   TSpreadsheet* s = (TSpreadsheet*)_ctl;
@@ -3078,6 +3077,12 @@ void TSheet_field::row2mask(int n, TToken_string& r, int mode)
   m.set_caption(val);
 }
 
+KEY TSheet_field::run_editmask(int ) 
+{ 
+  TMask& m = sheet_mask();
+  return m.run();
+}
+
 void TSheet_field::set_back_and_fore_color(COLOR back, COLOR fore, int row, int col)
 {
   TSpreadsheet& s = (TSpreadsheet&)*_ctl;
diff --git a/include/msksheet.h b/include/msksheet.h
index c93151115..0c90c2f06 100755
--- a/include/msksheet.h
+++ b/include/msksheet.h
@@ -182,7 +182,7 @@ public:
   // @cmember Ritorna la maschera corrispondente ad una riga dello spreadsheet
   virtual TMask& sheet_mask() const;
   // @cmember esegue la maschera di edit dello speadsheet;
-  virtual KEY run_editmask(int ) { return sheet_mask().run();}
+  virtual KEY run_editmask(int n);
   // @cmember Setta il membro <p _notify> della classe <c TSpreadsheet>
   void set_notify(SPREADSHEET_NOTIFY n);
   
diff --git a/include/regexp.cpp b/include/regexp.cpp
deleted file mode 100755
index dec300f4d..000000000
--- a/include/regexp.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-#include <regexp.h>
-
-/*
-#include <stdtypes.h>
-
-#include <stdlib.h>
-// codici di ritorno della matche()
-#define regexp_MATCH_PATTERN (6) // pattern non valido
-#define regexp_MATCH_LITERAL (5) // il pattern non coincide su un carattere comune
-#define regexp_MATCH_RANGE   (4) // il pattern non coincide in un costrutto [..]
-#define regexp_MATCH_ABORT   (3) // il stringa da confrontare � terminata anticipatamente
-#define regexp_MATCH_END     (2) // il pattern � terminato anticipatamente
-#define regexp_MATCH_VALID   (1) // pattern e stringa coincidono
-
-// codici di ritorno della is_valid_pattern()
-#define regexp_PATTERN_VALID  (0) // il pattern � valido
-#define regexp_PATTERN_ESC   (-1) // � presente un escape aperto a fine pattern
-#define regexp_PATTERN_RANGE (-2) // c'� un range non chiuso all'interno di un costrutto [..]
-#define regexp_PATTERN_CLOSE (-3) // manca la parentesi di chiusura in un costrutto [..]
-#define regexp_PATTERN_EMPTY (-4) // c'� un costrutto vuoto
-
-// prototipi delle funzioni interne
-HIDDEN int matche(const char *pat, const char *str); // ritorna un codice della classe regexp_MATCH che indica se e in che modo pattern e stringa coincidono
-HIDDEN int matche_after_star(const char *pat, const char *str); // chiama ricorsivamente la matche() con i segmenti puri del pattern e della stringa
-HIDDEN bool is_pattern(const char *pat); // ritorna TRUE se la stringa � un pattern
-HIDDEN bool is_valid_pattern(const char *pat, int *err= NULL); // ritorna TRUE se la stringa � un pattern valido, indica un codice di ritorno della classe regexp_PATTERN nel secondo parametro
-
-HIDDEN bool is_pattern(const char *p) {
-  while (*p) {
-    switch (*p++) {
-      case '?':
-      case '*':
-      case '[':
-      case '\\':
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-HIDDEN bool is_valid_pattern(const char *p, int *error_type) {
-  if (error_type != NULL) *error_type= regexp_PATTERN_VALID; // inizializzazione del tipo d'errore
-  while (*p) { // ciclo all'interno del pattern fino a fine stringa
-    switch(*p) { // determinazione del tipo di wild card nel pattern
-      case '\\': // controllo dell'escape, non pu� essere a fine pattern
-        if (!*++p) {
-          if (error_type != NULL) *error_type= regexp_PATTERN_ESC;
-          return FALSE;
-        }
-        p++;
-        break;
-      case '[': // controllo della costruzione del costrutto [..]
-        p++;
-        if (*p == ']') { // se il prossimo carattere � ']' il costrutto � vuoto
-          if (error_type != NULL) *error_type= regexp_PATTERN_EMPTY;
-          return FALSE;
-        }
-        if (!*p) { // se si � a fine stringa il costrutto non � chiuso
-          if (error_type != NULL) *error_type= regexp_PATTERN_CLOSE;
-          return FALSE;
-        }
-        while (*p != ']') { // ciclo fino a fine costrutto [..]
-          if (*p == '\\') { // controllo per gli escape
-            p++;
-            if (!*p++) { // controllo che l'escape non sia a fine pattern
-              if (error_type != NULL) *error_type= regexp_PATTERN_ESC;
-              return FALSE;
-            }
-          } else p++;
-          if (!*p) { // se si � a fine stringa il costrutto non � chiuso
-            if (error_type != NULL) *error_type= regexp_PATTERN_CLOSE;
-            return FALSE;
-          }
-          if (*p == '-') { // controllo di un eventuale range
-            if (!*++p || *p == ']') { // deve esistere una fine del range
-              if (error_type != NULL) *error_type= regexp_PATTERN_RANGE;
-              return FALSE;
-            } else {
-              if (*p == '\\') p++; // controllo degli escape
-              if (!*p++) { // controllo che l'escape non sia a fine pattern
-                if (error_type != NULL) *error_type= regexp_PATTERN_ESC;
-                return FALSE;
-              }
-            }
-          }
-        }
-        break;
-      case '*': // tutti gli altri caratteri sono elementi validi del pattern
-      case '?':
-      default:
-        p++; // caratteri normali
-        break;
-    }
-  }
-  return TRUE;
-}
-
-HIDDEN int matche_after_star(const char *p, const char *t) {
-  int match= 0;
-  while (*p == '?' || *p == '*') { // salto degli eventuali '*' e '?'
-    if (*p == '?') // salto di un carattere per ciascun '?'
-      if (!*t++) return regexp_MATCH_ABORT; // se la stringa termina qui non c'� coincidenza
-    p++; // posizionamento sul prossimo carattere del pattern
-  }
-  if (!*p) return regexp_MATCH_VALID; //se il pattern � concluso c'� coincidenza
-  int nextp= *p; // prelevamento del prossimo carattere, normale o '['
-  if (nextp == '\\') {
-    nextp= p[1];
-    if (!nextp) return regexp_MATCH_PATTERN; // se il pattern termina qui non � valido
-  }
-  do { // ciclo fino a conclusione di stringa o pattern
-    if (nextp == *t || nextp == '[') match= matche(p, t); // � necessario che il carattere corrente del testo coincida con il carattere corrente del pattern, oppure che il pattern abbia un inizio di costrutto [..]
-    if (!*t++) match= regexp_MATCH_ABORT; // se la stringa termina qui non c'� coincidenza
-  } while (match != regexp_MATCH_VALID && match != regexp_MATCH_ABORT && match != regexp_MATCH_PATTERN);
-  return match; // ritorno del risultato
-}
-
-HIDDEN int matche(const char *p, const char *t) {
-  for (; *p; p++, t++) {
-    if (!*t) // se si � alla fine della stringa, il confronto � concluso
-      return (*p == '*' && *++p == '\0') ? regexp_MATCH_VALID : regexp_MATCH_ABORT;
-    switch (*p) { // determina il tipo di wild card del pattern
-      case '?': // carattere singolo, qualunque carattere coincide
-        break;
-      case '*': // sottostringa, coincide qualunque sequenza di caratteri
-        return matche_after_star (p, t);
-      case '[': { // costrutto [..], controllo di coincidenza per inclusione o esclusione su un solo carattere
-        p++; // posizionamento all'inizio del range
-        bool invert= FALSE; // controllo di inclusione o esclusione del costrutto
-        if (*p == '!' || *p == '^') {
-          invert= TRUE;
-          p++;
-        }
-        if (*p == ']') // se si � su una chiusura di costrutto il pattern non � valido
-          return regexp_MATCH_PATTERN;
-        bool member_match= FALSE;
-        bool loop= TRUE;
-        while (loop) {
-          char range_start, range_end; // inizio e fine del range corrente
-          if (*p == ']') { // se si � alla fine del costrutto il ciclo si conclude
-            loop= FALSE;
-            continue;
-          }
-          if (*p == '\\') // controllo di coincidenza su un metacarattere, dopo un escape
-            range_start= range_end= *++p;
-          else
-            range_start= range_end= *p;
-          if (!*p) return regexp_MATCH_PATTERN; // se il pattern termina non � valido
-          if (*++p == '-') { // controllo del segno di sottoinsieme
-            range_end= *++p; // impostazione della fine del range
-            if (range_end == '\0' || range_end == ']') return regexp_MATCH_PATTERN; // se il costrutto [..] o il pattern terminano qui allora il pattern non � valido
-            if (range_end == '\\') { // la fine del range � un metacarattere
-              range_end= *++p;
-              if (!range_end) return regexp_MATCH_PATTERN; // se il pattern termina non � valido
-            }
-            p++; // posizionamento oltre il range
-          }
-          if (range_start < range_end) { // confronto del carattere corrente con il costrutto, controllo della sequenzialit� degli estremi del range
-            if (*t >= range_start && *t <= range_end) {
-              member_match= TRUE;
-              loop= FALSE;
-            }
-          } else {
-            if (*t >= range_end && *t <= range_start) {
-              member_match= TRUE;
-              loop= FALSE;
-            }
-          }
-        }
-        if ((invert && member_match) || !(invert || member_match)) // controllo del risultato dell'ultimo confronto nel costrutto [..]
-          return regexp_MATCH_RANGE;
-        if (member_match) { // salto del resto del costrutto se non � esclusivo
-          while (*p != ']') {
-            if (!*p) return regexp_MATCH_PATTERN; // se si � a fine pattern il costrutto non � valido
-            if (*p == '\\') { // salto di un confronto con un metacarattere
-              p++;
-              if (!*p) return regexp_MATCH_PATTERN; // se il pattern termina qui non � valido
-            }
-            p++; // posizionamento sul prossimo carattere del pattern
-          }
-        }
-        break;
-      }
-      case '\\': // confronto con un metacarattere
-        p++; // posizionamento sul carattere da confrontare
-        if (!*p) return regexp_MATCH_PATTERN; // se il pattern termina qui non � valido
-      default: // confronto con un carattere normale
-        if (*p != *t) return regexp_MATCH_LITERAL;
-    }
-  }
-  if (*t) return regexp_MATCH_END; // se la stringa non � conclusa non c'� coincidenza
-  else return regexp_MATCH_VALID;
-}
-
-bool match(const char *pat, const char *str) 
-{
-  int err= matche(pat, str);
-  return (err == regexp_MATCH_VALID); // ritorna TRUE se il pattern e la stringa coincidono
-}
-
-*/
-
-#include <xvt.h>
-
-bool match(const char *pat, const char *str) 
-{
-  return xvt_str_match(str, pat, TRUE) != 0;
-}
diff --git a/include/regexp.h b/include/regexp.h
deleted file mode 100755
index 4b73dea7d..000000000
--- a/include/regexp.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __REGEXP_H
-#define __REGEXP_H
-
-// Composizione delle regular expression:
-// -------------------------------------
-// - '*'     sostituisce una qualunque sottostringa (0 o pi� caratteri)
-// - '?'     sostituisce un carattere qualunque (necessariamente presente)
-// - [RANGE] sostituisce un carattere presente nel RANGE specificato
-// I range si compongono di singoli caratteri o di sottoinsiemi di caratteri,
-// indicati con un carattere iniziale, un segno meno ('-') e un carattere
-// finale. Esempio [0-9a-fL] comprende i caratteri dallo '0' al '9', dalla 'a'
-// alla 'z' e la lettera 'L'. I range possono essere prefissati da '!' o
-// '^' per indicare che l'insieme dei caratteri specificati sono esclusi
-// e non inclusi. Esempio [!jkwxy] indica la sostituzione di qualunque
-// carattere tranne 'j', 'k', 'w', 'x', 'y' e 'z'.
-// Per specificare nei pattern gli stessi metacaratteri con cui si formano i
-// pattern basta prefissarli con l'escape '\'. Esempio [\[\]] sostituisce un
-// carattere di parentesi quadra aperta o chiusa.
-
-bool match(const char *pat, const char *str); // ritorna TRUE se il pattern (primo parametro) e la stringa (secondo) coincidono
-
-#endif
diff --git a/include/scanner.cpp b/include/scanner.cpp
index 9d716df5b..d8043b12a 100755
--- a/include/scanner.cpp
+++ b/include/scanner.cpp
@@ -154,7 +154,7 @@ void TScanner::push(const char* s)
 // @rdesc Ritorna TRUE se il paragrafo esiste
 bool TScanner::paragraph(const char* name)
 {
-  TString p = name;
+  TString256 p = name;
   if (p[0] != '[')
   {
     p.insert("[", 0);
@@ -164,7 +164,10 @@ bool TScanner::paragraph(const char* name)
   clear();// resetta eof
   seekg(0L);
   while (line().not_empty())
-    if (token() == p) return TRUE;
+  {
+    if (token() == p) 
+      return TRUE;
+  }
 
   return FALSE;
 }
diff --git a/include/sheet.cpp b/include/sheet.cpp
index 0a84cbb1c..7b843ce2a 100755
--- a/include/sheet.cpp
+++ b/include/sheet.cpp
@@ -1445,7 +1445,7 @@ HIDDEN TBrowse_sheet* _cur_browse = NULL;
 
 void TBrowse_sheet::add_custom_filter(const char* regexp)
 {
-  TString filter = _original_filter;
+  TString filter = _original_filter; // Costruisco il nuovo filtro per estensione del vecchio
   if (regexp && *regexp)
   {
     if (_original_filter.not_empty())
@@ -1457,12 +1457,12 @@ void TBrowse_sheet::add_custom_filter(const char* regexp)
     if (_original_filter.not_empty())
       filter << ')';
   }
-  if (filter != cursor()->filter())
+  if (filter != cursor()->filter()) // Cambio il filtro se necessarion :-)
   {
     TCursor& c = *cursor();
     c.freeze(false);
     c.setfilter(filter, true);
-    c.items();
+    c.items();            // Forzo la ricostruzione del cursore
     c.freeze(true);
     
     // Forzo un aggiornamento a basso livello
@@ -1560,7 +1560,7 @@ bool TBrowse_sheet::filter_handler(TMask_field& f, KEY k)
         const int pos = ids.get_pos(id);
         if (pos >= 0)
         {
-          TToken_string fns = b.get_output_field_names();
+          TToken_string fns = b.get_input_field_names();
           expr << fns.get(pos) << "?=\"" << e << '"';
         }
       }
diff --git a/include/strings.cpp b/include/strings.cpp
index 81359add5..088a89444 100755
--- a/include/strings.cpp
+++ b/include/strings.cpp
@@ -15,7 +15,6 @@
 #include <dongle.h>
 #include <prefix.h>
 #include <real.h>
-#include <regexp.h>
 #include <utility.h>
 
 // @doc EXTERNAL
@@ -48,7 +47,7 @@ inline bool is_space(char c)
 // @mfunc Cambia la dimensione della stringa eventualmente preservandone il contenuto iniziale
 void TString::resize(
   int size,  // @parm Nuova dimensione della stringa
-  bool cpy)  // @parm Se TRUE mantiene il contenuto della stringa e alloca
+  bool cpy)  // @parm Se true mantiene il contenuto della stringa e alloca
   //       nuovo spazio
 
   // @comm Non funziona con le stringhe static e per valori negativi di <p size>
@@ -78,13 +77,13 @@ TString& TString::set(
   if (s && *s)
   { 
     const int sz = strlen(s);
-    if (sz > size()) resize(sz, FALSE);
+    if (sz > size()) resize(sz, false);
     strcpy(_str, s);
   }
   else
   {
     if (size() == 0)
-      resize(DEFAULT_SIZE, FALSE);
+      resize(DEFAULT_SIZE, false);
     *_str = '\0';
   }
 
@@ -111,7 +110,7 @@ int TString::make_room(
       new_size = MAX_SIZE;
     if (new_size < min_size)
       fatal_box("Stringa di lunghezza eccessiva (%ld)", min_size);
-    resize(int(new_size), TRUE);
+    resize(int(new_size), true);
   }
   return lun;
 }
@@ -127,11 +126,11 @@ TString::TString(int size, char c) : _str(NULL), _size(0)
   if (size > 0)
     fill(c, size);   // Guy: Much simpler and faster (uses memset)
   else
-    resize(DEFAULT_SIZE, FALSE);
+    resize(DEFAULT_SIZE, false);
 }
 
 TString::TString() : _str(NULL), _size(0)
-{ resize(DEFAULT_SIZE, FALSE); }
+{ resize(DEFAULT_SIZE, false); }
 
 TString::~TString()
 {
@@ -224,7 +223,6 @@ TString& TString::operator <<(const TString& str)
 // @mfunc Elimina tutti i caratteri contenuti in <p k>
 TString& TString::strip(
   const char* k) // @parm Stringa dei caratteri da eliminare
-
 {
   int j = 0;
   for (const char* s = _str; *s; s++)
@@ -402,14 +400,13 @@ int TString::find(const char* s, int from) const
   return pos;
 }
 
-bool TString::match(const char* pat) const
+bool TString::match(const char* pat, bool ignore_case) const
 { 
   if (pat == NULL || *pat =='\0')
     return empty();
-  return ::match(pat, _str); 
+  return xvt_str_match(_str, pat, !ignore_case) != 0; 
 }
 
-
 int TString::replace(char find_char, char replace_char)
 {
   int n = 0;
@@ -432,13 +429,7 @@ const TString& TString::left(
 
   // @rdesc Ritorna l'indirizzo della stringa contenente i <p count> caratteri da sinistra
 {
-  if (count <= 0)
-    return EMPTY_STRING;
-
-	TString& spark = get_tmp_string();
-  spark = _str;
-	spark.cut(count);
-  return spark;
+  return mid(0, count);
 }
 
 // Certified 99%
@@ -450,14 +441,12 @@ const TString& TString::right(
 
   // @rdesc Ritorna l'indirizzo della stringa contenente i <p count> caratteri da destra
 {
-	TString& spark = get_tmp_string();
   int from = len()-count;
-  if (from < 0) from = 0;
-  spark = _str + from;
-  return spark;
+  if (from <= 0) 
+    from = 0;
+  return mid(from);
 }
 
-
 // Certified 100%
 // @doc EXTERNAL
 
@@ -469,19 +458,16 @@ const TString& TString::mid(
 
   // @rdesc Ritorna l'indirizzo della stringa contenente i <p count> cartteri da <p from>
 {
-	TString& spark = get_tmp_string();
-  const int l = len();
+  CHECKD(from >= 0, "Invalid MID parameter: from ", from);
 
-#ifdef DBG
-  if (from < 0)
-  {
-    NFCHECK("Invalid MID parameter: from = %d", from);
-    from = 0;
-  }
-#endif
-  if (from > l) from = l;
+  const int l = len();
   if (count < 0 || from+count>l) 
     count = l-from;
+
+  if (from >= l || count == 0) 
+    return EMPTY_STRING;
+
+	TString& spark = get_tmp_string(count);
   spark.strncpy(&_str[from], count);
   return spark;
 }
@@ -555,7 +541,7 @@ TString& TString::rpad(const int n,const char c)
   const int l = len();
   if (n > l)
   {
-    if (n > size()) resize(n, TRUE);
+    if (n > size()) resize(n, true);
     memset(_str+l, c, n-l);
     _str[n] = '\0';
   } 
@@ -570,7 +556,7 @@ TString& TString::lpad(const int n,const char c)
   const int nsp=n-l;
   if (n>l)
   {
-    if (n > size()) resize(n, TRUE);
+    if (n > size()) resize(n, true);
       for (l--; l>=0; l--)
         *(_str+l+nsp)=*(_str+l);
     memset(_str, c, nsp);
@@ -597,12 +583,16 @@ TString& TString::ltrim(
 
   if (count > 0)
   {
-    if (count >= len()) return cut(0);
+    if (count >= len()) 
+      return cut(0);
     s = &_str[count];
   }
-  else for (s = _str; *s && is_space(*s); s++);
+  else 
+    for (s = _str; *s && is_space(*s); s++);
 
-  if (s != _str) strcpy(_str, s);
+  if (s != _str) 
+    strcpy(_str, s);
+  
   return *this;
 }
 
@@ -671,7 +661,7 @@ TString& TString::trim()
 int TString::compare(
   const char* s,          // @parm Stringa da comparare
   int max,                // @parm Numero di caratteri da conforntare (default tutta la stringa)
-  bool ignorecase) const  // @parm Ignorare la differenza maiuscolo/minuscolo (default FALSE)
+  bool ignorecase) const  // @parm Ignorare la differenza maiuscolo/minuscolo (default false)
 { 
   int res = 0; 
 
@@ -720,9 +710,9 @@ bool TString::ends_with(const char* s, bool ignorecase) const
     else
     {
       if (ignorecase)
-        yes = toupper(_str[mylen-1]) == toupper(s[slen-1]);
+        yes = toupper(_str[mylen-1]) == toupper(s[0]);
       else
-        yes = _str[mylen-1] == s[slen-1];
+        yes = _str[mylen-1] == s[0];
     }
   }
 	return yes;
@@ -750,7 +740,7 @@ TString& TString::fill(
     n = size(); 
   else
     if (n > size()) 
-      resize(n, FALSE);
+      resize(n, false);
   memset(_str, c, n);
   _str[n] = '\0';
   return *this;
@@ -865,11 +855,11 @@ TString& TString::picture(
 // Certified 99% (s != NULL)
 int TString::strncpy(const char* s, int n)
 {
-  if (n > size()) 
-    resize(n, FALSE);
   int i = 0;
   if (s && *s)
   {
+    if (n > size()) 
+      resize(n, false);
     for (; *s && i < n; i++) 
       _str[i] = *s++;
   }
@@ -907,7 +897,7 @@ TString& TString::format(
 char* TString::get_buffer(int min_size)
 {
   if (min_size > size())
-    resize(min_size, TRUE);
+    resize(min_size, true);
   return _str;  
 }
 
@@ -983,7 +973,7 @@ TString& TString::overwrite(
     const int l = len();
     if (pos < 0) pos = l;
     const int max = pos+lung;
-    if (max > size()) resize(max, TRUE);          // resize needed?
+    if (max > size()) resize(max, true);          // resize needed?
 
     const bool over = max > l;                    // beyond end of string?
     for (int i = l; i < pos; i++) _str[i] = ' ';  // space padding per inserimenti dopo la fine della stringa
@@ -1110,12 +1100,12 @@ void TFilename::ext(const char* e)
   if (start < 0)
     start = len()-1;
   
-  bool can_cut = TRUE;
+  bool can_cut = true;
   int i;
   for (i = start; i > 0 && _str[i] != '.'; i--)
     if (is_slash(_str[i]) || _str[i] == ':')
     {
-      can_cut = FALSE;
+      can_cut = false;
       i = start;
       break;
     }
@@ -1180,8 +1170,8 @@ TFilename& TFilename::add(const char* n)
 //
 // @rdesc Ritorna i seguenti valori
 //
-// @flag TRUE | Se il nome del file e' sintatticamente corretto
-// @flag FALSE | Se il nome del file non e' sintatticamente corretto
+// @flag true | Se il nome del file e' sintatticamente corretto
+// @flag false | Se il nome del file non e' sintatticamente corretto
 bool TFilename::ok() const
 
 // @comm Controlla tutti i casi per cui un nome di file puo' non essere valido.
@@ -1191,7 +1181,7 @@ bool TFilename::ok() const
   const int l = len();
 
   int len = 0;            // lunghezza ultima sottostringa
-  bool ext = FALSE;       // trovata estensione
+  bool ext = false;       // trovata estensione
   
   for (int c = 0; c < l; c++)
   { 
@@ -1199,31 +1189,31 @@ bool TFilename::ok() const
     {
 #if XVT_OS == XVT_OS_WIN32
    case ':':
-      if (c != 1 || !isalpha(_str[0])) return FALSE;  // Nome disco errato
+      if (c != 1 || !isalpha(_str[0])) return false;  // Nome disco errato
       len = 0;
       break;
     case '\\':
 #endif      
     case '/':
-      if (ext) return FALSE;                          // Slash dopo estensione
-      if (len > _MAX_FNAME) return FALSE;             // Nome troppo lungo
-      if (!isalnum(_str[++c])) return FALSE;
+      if (ext) return false;                          // Slash dopo estensione
+      if (len > _MAX_FNAME) return false;             // Nome troppo lungo
+      if (!isalnum(_str[++c])) return false;
       len = 1;
       break;
     case '.':
-      if (len == 0 || ext) return FALSE;              // Nome nullo o Doppia estensione
-      ext = TRUE;
+      if (len == 0 || ext) return false;              // Nome nullo o Doppia estensione
+      ext = true;
       len = 0;
       c++;
     default:
       if (isalnum(_str[c])) len++;
-      else return FALSE;
+      else return false;
       break; 
     }   
   }
 
   if (ext && len > _MAX_EXT) 
-    return FALSE;
+    return false;
   
   return len > 0 && len <= _MAX_FNAME;
 }
@@ -1232,7 +1222,7 @@ bool TFilename::ok() const
 const TFilename& TFilename::tempdir()
 {                                         
   static TFilename _tempdir;
-  const bool create = _tempdir.empty() || user().compare(_tempdir.right(user().len()), -1, TRUE);
+  const bool create = _tempdir.empty() || user().compare(_tempdir.right(user().len()), -1, true);
   
   if (create) 
   {
@@ -1248,7 +1238,7 @@ const TFilename& TFilename::tempdir()
     if (!is_not_slash(_str[last])) 
       _tempdir.cut(last);
 
-    bool ok = TRUE;
+    bool ok = true;
     
     _tempdir.lower();
     if (!_tempdir.exist())
@@ -1607,7 +1597,7 @@ long TToken_string::get_long(int n)
 
 // const TToken_string new age!
 
-// @rdesc Ritorna TRUE se e' stata trovata una stringa alla posizione <p n>
+// @rdesc Ritorna true se e' stata trovata una stringa alla posizione <p n>
 bool TToken_string::get(
   int n,               // @parm Posizione del token da ritornare (0 = primo, -1 = prossimo, -2 = ultimo, n = n-simo)
   TString& tok) const  // @parm Stringa da ritornare
@@ -1709,7 +1699,7 @@ bool TToken_string::set_item(const char* v, int n)
     for (;sep < n; sep++) 
       *this << _separator;
     *this << v;
-    return FALSE;
+    return false;
   }
 
   int e = find(_separator, i);
@@ -1718,7 +1708,7 @@ bool TToken_string::set_item(const char* v, int n)
   spark = _str+e;            // Salva items seguenti
   cut(i);                    // Considera solo items precedenti
   *this << v << spark;       // Aggiunge item desiderato e seguenti
-  return TRUE;
+  return true;
 }
 
 
@@ -1746,8 +1736,8 @@ bool TToken_string::empty_items() const
 {
   for (const char* c = _str; *c; c++)
     if (!is_space(*c) && *c != _separator) 
-      return FALSE;
-  return TRUE;
+      return false;
+  return true;
 }
 
 // Certified 80%
@@ -2035,7 +2025,7 @@ int TString_array::find(
 {   
   int found = -1;
   for (int i = from; i < items(); i++)
-    if (row(i).compare(s, -1, TRUE) == 0)
+    if (row(i).compare(s, -1, true) == 0)
     {
       found = i;
       break;
diff --git a/include/strings.h b/include/strings.h
index 71a962cd3..784a560ed 100755
--- a/include/strings.h
+++ b/include/strings.h
@@ -90,13 +90,13 @@ public:
   // @cmember Ritorna la lunghezza della stringa (numero di caratteri)
   int len() const 
   { return _str ? strlen(_str) : 0; }
-  // @cmember Controlla se la stringa e' vuota (TRUE se non contiene caratteri)
+  // @cmember Controlla se la stringa e' vuota (true se non contiene caratteri)
   bool empty() const
   { return *_str == '\0'; }
-  // @cmember Controlla se la stringa non e' vuota (TRUE se contiene caratteri)
+  // @cmember Controlla se la stringa non e' vuota (true se contiene caratteri)
   bool not_empty() const
   { return *_str != '\0'; }
-  // @cmember Controlla se la stringa e' vuota o contiene solo whitespace (TRUE se vuota)
+  // @cmember Controlla se la stringa e' vuota o contiene solo whitespace (true se vuota)
   bool blank() const;
 
   // @cmember Ritorna la posizione della prima occorrenza carattere char nell'oggetto TString
@@ -241,13 +241,13 @@ public:
   { return strcmp(_str, s._str) != 0; }
   // @cmember Controlla se una stringa e' minore di un'altra
   bool operator  <(const char* s) const
-  { return s ? strcmp(_str, s)  < 0 : FALSE;}
+  { return s ? strcmp(_str, s)  < 0 : false;}
   // @cmember Controlla se una stringa e' maggiore di un'altra
   bool operator  >(const char* s) const
   { return s ? strcmp(_str, s)  > 0  : not_empty();}
   // @cmember Controlla se una stringa e' maggiore o uguale ad un'altra
   bool operator >=(const char* s) const
-  { return s ? strcmp(_str, s) >= 0 : TRUE;}
+  { return s ? strcmp(_str, s) >= 0 : true;}
   // @cmember Controlla se una stringa e' minore o uguale ad un'altra
   bool operator <=(const char* s) const
   { return s ? strcmp(_str, s) <= 0 : empty();}
@@ -264,13 +264,13 @@ public:
   bool operator <=(const TString & s) const
   { return strcmp(_str, s._str) <= 0; }
   // @cmember Confronta usando le regular expression
-  bool match(const char* pat) const;
+  bool match(const char* pat, bool ignorecase = false) const;
   // @cmember Compara due stringhe (o i primi max caratteri)
-  int compare(const char* s, int max = -1, bool ignorecase = FALSE) const;
+  int compare(const char* s, int max = -1, bool ignorecase = false) const;
   // @cmember Controlla se la strinvga comincia per s
-	bool starts_with(const char* s, bool ignorecase = FALSE) const;
+	bool starts_with(const char* s, bool ignorecase = false) const;
   // @cmember Controlla se la strinvga finisce per s
-	bool ends_with(const char* s, bool ignorecase = FALSE) const;
+	bool ends_with(const char* s, bool ignorecase = false) const;
 };
 
 // @doc EXTERNAL
@@ -719,7 +719,7 @@ public:
   // @cmember Cerca una stringa nell'array
   int find(const char* s, int from = 0) const;
   // @cmember Ordina alfabeticamente l'array
-  void sort(bool ascendig = TRUE);
+  void sort(bool ascendig = true);
 
   // @cmember Costruttore
   TString_array(int size = 8) : TArray(size)
diff --git a/include/text.cpp b/include/text.cpp
index a2f3ebbde..8549adc59 100755
--- a/include/text.cpp
+++ b/include/text.cpp
@@ -1,7 +1,6 @@
 #include <ctype.h>
 
 #include <printer.h>
-#include <regexp.h>
 #include <relation.h>
 #include <text.h>
 #include <window.h>
@@ -465,13 +464,13 @@ long TTextfile::search(
 
   // @comm Cerca in una riga per volta rispettando i formati
 {                        
-  TString lin(512); 
   TString text(txt);
   if (!casesens) 
     text.lower();
-  if (regexp && text.right(1) != "*")  
+  if (regexp && !text.ends_with("*"))  
     text << '*';
   
+  TString lin(512); 
   for (long i = from; down ? (i < lines()) : (i >= 0); down ? i++ : i--)
   {              
     lin = line(i);  
@@ -481,7 +480,7 @@ long TTextfile::search(
     { 
       for (ret = 0; lin[ret]; ret++)
       {
-        if (match(text, lin.mid(ret)))
+        if (lin.mid(ret).match(text))
           return i;
       }    
     }