diff --git a/include/relation.cpp b/include/relation.cpp
index d1da29b61..11490b0b8 100755
--- a/include/relation.cpp
+++ b/include/relation.cpp
@@ -895,14 +895,15 @@ bool TRelation::exist(int logicnum) const
 ///////////////////////////////////////////////////////////
 
 
-HIDDEN bool __evalcondition(const TRelation& r,TExpression* cond)
+HIDDEN bool __evalcondition(const TRelation& r,TExpression* cond, const TArray & frefs)
 {
-  TFieldref f;
+//  TFieldref f;
   for (int i = cond->numvar() - 1; i >= 0;  i--)
   {
-    const TFixed_string s(cond->varname(i));
-    f = s;
-    cond->setvar(i, f.read(r));
+//    const TFixed_string s(cond->varname(i));
+//    f = s;
+//    f = cond->varname(i);
+    cond->setvar(i, (const char *) (TRecfield &)frefs[i]);
   }
   return (bool) *cond;
 }
@@ -1014,7 +1015,7 @@ int TCursor::filtercursor(int pagecnt, TRecnotype* page)
     file().readat(rec,page[i]);
     if (update_relation()) _if->update();
     if ((_filterfunction ? _filterfunction(_if) : TRUE ) &&
-        (_fexpr ? __evalcondition(*_if, _fexpr) : TRUE))
+        (_fexpr ? __evalcondition(*_if, _fexpr, _frefs) : TRUE))
     {
       if (np < i) page[np] = page[i];
       np++;
@@ -1050,7 +1051,7 @@ bool TCursor::ok() const
     _if->update();
   
   if ((_filterfunction ? _filterfunction(_if) : TRUE ) &&
-      (_fexpr ? __evalcondition(*_if, _fexpr) : TRUE))
+      (_fexpr ? __evalcondition(*_if, _fexpr, _frefs) : TRUE))
     return TRUE;
   
   return FALSE;
@@ -1146,6 +1147,7 @@ void TCursor::filter(
     {
       _filter = fil;
       if (_fexpr) delete _fexpr;
+      _frefs.destroy();
       TTypeexp type = (_filter.find('"') != -1) ? _strexpr : _numexpr;
       if (_filter.not_empty())
       {
@@ -1159,6 +1161,20 @@ void TCursor::filter(
             }
       }
       else _fexpr = NULL;
+      if (_fexpr)
+      {
+        const int items = _fexpr->numvar();
+        for (int i = 0 ; i < items; i++) 
+        {              
+          const TString & vn = _fexpr->varname(i);
+          if (vn[0] != '#')
+          {
+            TFieldref f(vn, 0);
+            
+            _frefs.add(new TRecfield(_if->curr(f.file()), f.name(), f.from(), f.to()));
+          }
+        }
+      }
     }
     _keyfrom = kf;
     _keyto = kto;
@@ -1596,7 +1612,7 @@ int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page)
     file().readat(rec,page[i]);
     if (update_relation()) relation()->update();
     if ((filterfunction() ? filterfunction()(relation()) : TRUE ) &&
-        (expression() ? __evalcondition(*relation(), expression()) : TRUE))
+        (expression() ? __evalcondition(*relation(), expression(), field_refs()) : TRUE))
     {
       if (np < i) page[np] = page[i];
       np++;       
diff --git a/include/relation.h b/include/relation.h
index 3ff08894f..95106fcae 100755
--- a/include/relation.h
+++ b/include/relation.h
@@ -243,6 +243,8 @@ class TCursor : public TContainer
   TString _keyto;
   // @cmember:(INTERNAL) Espressione del filtro relativo
   TExpression* _fexpr;
+  // @cmember:(INTERNAL) Array di fieldref contente i campi interessati al filtro
+  TArray  _frefs;
   // @cmember:(INTERNAL) Indica se e' stata messa in attesa (non puo' essere modificato)
   bool _frozen;
   // @cmember:(INTERNAL) Flag che permette l'update della relazione per l'espressione-filtro
@@ -368,6 +370,9 @@ public:
   // @cmember Ritorna l'espressione-filtro
   TExpression* expression() const 
   { return _fexpr; }
+  // @cmember Ritorna l'array di fieldref contenete i nomi dei campi del filtro
+  const TArray & field_refs() const 
+  { return _frefs; }
   // @cmember Ritorna la funzione-filtro
   FILTERFUNCTION filterfunction() const 
   { return _filterfunction; }