diff --git a/qt/inc/TQtClientFilter.h b/qt/inc/TQtClientFilter.h
index 16b18baf36be079517506ce57b5bce14c111144e..ee58f0e7d3d2d0362279d96bc58ddc2b22a1bee7 100644
--- a/qt/inc/TQtClientFilter.h
+++ b/qt/inc/TQtClientFilter.h
@@ -1,4 +1,4 @@
-// @(#)root/qt:$Name:  $:$Id: TQtClientFilter.h,v 1.29 2006/03/15 19:18:48 fine Exp $
+// @(#)root/qt:$Name:  $:$Id: TQtClientFilter.h,v 1.7 2006/03/24 15:31:10 antcheva Exp $
 // Author: Valeri Fine   21/01/2002
 
 /*************************************************************************
@@ -83,6 +83,7 @@ protected:
    static TQtPointerGrabber  *fgGrabber;
 protected:
    bool eventFilter( QObject *o, QEvent *e );
+   void AddKeyEvent( const QKeyEvent &event, TQtClientWidget *widget);
    TQtEventQueue *Queue();
    void SetKeyGrabber(TQtClientWidget *grabber)     { fKeyGrabber = grabber;}
    void UnSetKeyGrabber(TQtClientWidget *grabber)   { if (fKeyGrabber == grabber) fKeyGrabber = 0; }
diff --git a/qt/src/GQtGUI.cxx b/qt/src/GQtGUI.cxx
index f2ac10e3e5ceb1e987ac74233b46cf204cbb6d07..04fba30352096bfca1e7e1a5fa28c0191ba0473e 100644
--- a/qt/src/GQtGUI.cxx
+++ b/qt/src/GQtGUI.cxx
@@ -1,4 +1,4 @@
-// @(#)root/qt:$Name:  $:$Id: GQtGUI.cxx,v 1.25 2006/05/30 07:06:50 antcheva Exp $
+// @(#)root/qt:$Name:  $:$Id: GQtGUI.cxx,v 1.26 2006/06/28 09:30:58 antcheva Exp $
 // Author: Valeri Fine   23/01/2003
 
 /*************************************************************************
@@ -336,7 +336,7 @@ const QtGContext  &QtGContext::Copy(const GCValues_t &gval)
         break;
 #endif /* QT_VERSION */
       }
-      DumpROp(fROp);
+      // DumpROp(fROp);
 //      fprintf(stderr," kGCFunction: fROp = %x\n",fROp );
    } else {
         // Fons said this must be like this. 4/07/2003 Valeri Fine
@@ -1831,15 +1831,11 @@ void         TGQt::SendEvent(Window_t id, Event_t *ev)
    // request for all possible modifier combinations (including the combination of no modifiers).
 
     if (id == kNone) return;
-            // fprintf(stderr,"TQt::GrabKey has no QT-based implementation yet: %p %d %c %x \n",((TQtClientWidget*)wid(id)), keycode,keycode,modifier);
+
     if (grab ) {
-       wid(id)->setActiveWindow();
-       SetInputFocus(id);
       ((TQtClientWidget*)wid(id))->SetKeyMask(keycode,modifier);
-      // wid(id)->grabKeyboard();
     } else {
        ((TQtClientWidget*)wid(id))->UnSetKeyMask(keycode,modifier);
-       // wid(id)->releaseKeyboard();
     }
  }
 //______________________________________________________________________________
diff --git a/qt/src/TQtClientFilter.cxx b/qt/src/TQtClientFilter.cxx
index d59315e9f35262dc3c902b77b9c3071105dc9c28..a4df37238fad8f4b3cc757a6c4e7bf2722c7e56e 100644
--- a/qt/src/TQtClientFilter.cxx
+++ b/qt/src/TQtClientFilter.cxx
@@ -1,4 +1,4 @@
-// @(#)root/qt:$Name:  $:$Id: TQtClientFilter.cxx,v 1.16 2005/12/15 06:10:37 brun Exp $
+// @(#)root/qt:$Name:  $:$Id: TQtClientFilter.cxx,v 1.17 2006/03/24 15:31:10 antcheva Exp $
 // Author: Valeri Fine   21/01/2002
 
 /*************************************************************************
@@ -242,6 +242,7 @@ static inline UInt_t MapKeySym(const QKeyEvent &qev)
 //______________________________________________________________________________________
 static inline void MapEvent(const QKeyEvent  &qev, Event_t &ev)
 {
+   ev.fType  = qev.type() == QEvent::KeyPress ?  kGKeyPress : kKeyRelease;
    ev.fCode  = MapKeySym(qev);
    ev.fState = MapModifierState(qev.state());
    ev.fCount = qev.count();
@@ -345,6 +346,33 @@ static inline QWidget *widgetAt(int x, int y)
    w = w ? w->childAt(w->mapFromGlobal(QPoint(x, y ) ), TRUE ) : 0;
    return w;
 }
+//______________________________________________________________________________
+void TQtClientFilter::AddKeyEvent( const QKeyEvent &keyEvent, TQtClientWidget *frame)
+{
+   // Map and and to the ROOT event queue Qt KeyBoard event mapped to the ROOT Event_t
+   // For "dest" widget 
+   if (frame) {
+     Event_t &event = *new Event_t;
+     memset( &event,0,sizeof(Event_t));
+     QPaintDevice *paintDev = (QPaintDevice *)frame;
+     event.fWindow    = TGQt::rootwid(paintDev);
+
+     event.fSendEvent = keyEvent.spontaneous();
+     event.fTime      = QTime::currentTime().msec ();
+     event.fX         = frame->x();
+     event.fY         = frame->y();
+     event.fWidth     = frame->width();	// width and
+     event.fHeight    = frame->height();	// height excluding the frame
+
+     QPoint pointRoot = frame->mapToGlobal(QPoint(0,0));
+     event.fXRoot     = pointRoot.x();
+     event.fYRoot     = pointRoot.y();
+     MapEvent(keyEvent,event);
+
+     fRootEventQueue->enqueue(&event);
+  }
+}
+
 //______________________________________________________________________________
 bool TQtClientFilter::SelectGrab(Event_t &event, UInt_t selectEventMask,QMouseEvent &mouse) 
 {
@@ -487,42 +515,21 @@ bool TQtClientFilter::eventFilter( QObject *qWidget, QEvent *e ){
          // grabSelectEvent = IsGrabSelected(selectEventMask);
          break;
       case QEvent::KeyPress:             // key pressed
-         event.fType   = kGKeyPress;
          keyEvent = (QKeyEvent *)e;
          MapEvent(*keyEvent,event);
          selectEventMask |=  kKeyPressMask;
-         {
-           TQtClientWidget *grabber = 0;
-           if (fKeyGrabber) grabber = fKeyGrabber->IsKeyGrabbed(event);
-           if (!grabber)    grabber = frame->      IsKeyGrabbed(event);
-           if (grabber) {
-              grabber->GrabEvent(event,false);
-              grabSelectEvent  = kTRUE; // to be revised later, It was: grabEvent = kTRUE;
-              ((QKeyEvent *)e)->accept();
-           } else {
-              ((QKeyEvent *)e)->ignore();
-           }
+         ((QKeyEvent *)e)->accept();
+            
          //  fprintf(stderr, " accepted: case QEvent::KeyPress: <%c><%d>: frame = %x; grabber = %x grabbed = %d\n",event.fCode,event.fCode,TGQt::wid(frame), TGQt::wid(grabber),grabEvent);
-         //  fprintf(stderr, "  QEvent::KeyPress: <%s>: key = %d, key_f=%d\n",(const char *)keyEvent->text(),keyEvent->key(),Qt::Key_F);
+         //  fprintf(stderr, "  QEvent::KeyPress: <%s>: key = %d, key_f=%d, frame = %p\n",(const char *)keyEvent->text(),keyEvent->key(),Qt::Key_F,frame);
          //  fprintf(stderr, "  QEvent::KeyPress: Current focus %p\n",(QPaintDevice *) qApp->focusWidget () );
          //  fprintf(stderr, "---------------\n\n");
-         }
          break;
       case QEvent::KeyRelease:           // key released
-         event.fType   = kKeyRelease;
          keyEvent = (QKeyEvent *)e;
          MapEvent(*keyEvent,event);
          selectEventMask |=  kKeyReleaseMask;
-         {
-           TQtClientWidget *grabber = frame->IsKeyGrabbed(event);
-           if (grabber) {
-              grabber->GrabEvent(event,false);
-              grabSelectEvent  = kTRUE; // to be revised later, It was: grabEvent = kTRUE;
-              ((QKeyEvent *)e)->accept();
-           } else {
-              ((QKeyEvent *)e)->ignore();
-           }
-         }
+         ((QKeyEvent *)e)->accept();
          break;
       case QEvent::FocusIn:              // keyboard focus received
          focusEvent   = (QFocusEvent *)e;
diff --git a/qt/src/TQtClientWidget.cxx b/qt/src/TQtClientWidget.cxx
index f509af334e607545472b2731ec4d286d023df863..803429382656e8f1f4ac64e7fff770eb89056fde 100644
--- a/qt/src/TQtClientWidget.cxx
+++ b/qt/src/TQtClientWidget.cxx
@@ -1,4 +1,4 @@
-// @(#)root/qt:$Name:  $:$Id: TQtClientWidget.cxx,v 1.11 2006/03/24 15:31:10 antcheva Exp $
+// @(#)root/qt:$Name:  $:$Id: TQtClientWidget.cxx,v 1.12 2006/05/08 13:16:56 antcheva Exp $
 // Author: Valeri Fine   21/01/2002
 
 /*************************************************************************
@@ -236,24 +236,20 @@ Bool_t TQtClientWidget::SetKeyMask(Int_t keycode, UInt_t modifier, int insert)
    //            +1 - insert
    Bool_t found = kTRUE;
    int key[5]= {0,0,0,0,0};
+   int ikeys = 0;
    int index = 0;
    if (keycode) {
       if (modifier & kAnyModifier)  assert(!(modifier & kAnyModifier));
       else {
-#if QT_VERSION < 0x40000
-         if (modifier & kKeyShiftMask)   key[index++] = SHIFT;
-         if (modifier & kKeyLockMask)    key[index++] = META;
-         if (modifier & kKeyControlMask) key[index++] = CTRL;
-         if (modifier & kKeyMod1Mask)    key[index++] = ALT;
-#else /* QT_VERSION */
-         if (modifier & kKeyShiftMask)   key[index++] = Qt::SHIFT;
-         if (modifier & kKeyLockMask)    key[index++] = Qt::META;
-         if (modifier & kKeyControlMask) key[index++] = Qt::CTRL;
-         if (modifier & kKeyMod1Mask)    key[index++] = Qt::ALT;
-#endif /* QT_VERSION */
+         if (modifier & kKeyShiftMask)   { key[index++] = Qt::SHIFT; ikeys += Qt::SHIFT;}
+         if (modifier & kKeyLockMask)    { key[index++] = Qt::META;  ikeys += Qt::META; }
+         if (modifier & kKeyControlMask) { key[index++] = Qt::CTRL;  ikeys += Qt::CTRL; }
+         if (modifier & kKeyMod1Mask)    { key[index++] = Qt::ALT;   ikeys += Qt::ALT;  }
      }
-                                         key[index++] = Qt::UNICODE_ACCEL + keycode;
+                                           key[index++] = Qt::UNICODE_ACCEL + keycode;  ikeys += Qt::UNICODE_ACCEL + keycode; 
    }
+   QKeySequence keys(ikeys);
+
    assert(index<=4);
    switch (insert) {
       case kInsert:
@@ -264,41 +260,35 @@ Bool_t TQtClientWidget::SetKeyMask(Int_t keycode, UInt_t modifier, int insert)
 #else /* QT_VERSION */
               fGrabbedKey = new Q3Accel(this);
 #endif /* QT_VERSION */
-     //         connect(fGrabbedKey,SIGNAL(activated ( int )),this,SLOT(Accelerate(int)));
+               connect(fGrabbedKey,SIGNAL(activated ( int )),this,SLOT(Accelerate(int)));
             }
-            QKeySequence keys(key[0],key[1],key[2],key[3]);
             if (fGrabbedKey->findKey(keys) == -1)  {
-             /* int itemId = &*/ fGrabbedKey->insertItem(keys,fGrabbedKey->count()+1);
-           //      fprintf(stderr,"+%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' %d, evail=%d \n", TGQt::wid(this), modifier, keycode ,fGrabbedKey->count()
-           //   , fGrabbedKey->isEnabled() );
+//               int itemId = 
+                fGrabbedKey->insertItem(keys);
+//                fprintf(stderr,"+%p: TQtClientWidget::SetKeyMask  modifier =%d  keycode = \'%c\' item=%d enable=%d\n", TGQt::wid(this), modifier, keycode ,itemId
+//              , fGrabbedKey->isEnabled() );
             }
-            TQtClientFilter *f = gQt->QClientFilter();
-            f->SetKeyGrabber(this);
         }
          break;
       case kRemove:
          if (!fGrabbedKey)  break;
          if (keycode) {
-              int id = fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3]));
-            // fprintf(stderr,"-%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' %d\n", this, modifier, keycode ,id);
-            if (id != -1) fGrabbedKey->removeItem(id);
+              int id = fGrabbedKey->findKey(keys);
+            if (id != -1) { fGrabbedKey->removeItem(id); }
             if (fGrabbedKey->count() ==  0) { 
                 delete fGrabbedKey; fGrabbedKey = 0; 
-                TQtClientFilter *f = gQt->QClientFilter();
-                f->UnSetKeyGrabber(this);
             }
          } else {
            // keycode ==0 - means delete all accelerators
            // fprintf(stderr,"-%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' \n", this, modifier, keycode);
              delete fGrabbedKey; fGrabbedKey = 0;
-             TQtClientFilter *f = gQt->QClientFilter();
-             f->UnSetKeyGrabber(this);
          }
          break;
       case kTestKey:
          if (fGrabbedKey) {
-            found = (fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3])) != -1);
-           // fprintf(stderr,"\n+%p:testing  TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' found=%d \n", TGQt::wid(this), modifier, keycode ,found);
+//            found = (fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3])) != -1);
+            found = (fGrabbedKey->findKey(keys) != -1);
+            // fprintf(stderr,"\n+%p:testing  TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' found=%d \n", TGQt::wid(this), modifier, keycode ,found);
          }
 
          break;
@@ -339,24 +329,26 @@ void TQtClientWidget::Accelerate(int id)
   int l = key.count();
   int keycode = key[l-1];
   uint state =0;
-  for (int i=0; i < l;i++) {
-     switch (key[i]) {
+  
 #if QT_VERSION < 0x40000
-        case SHIFT:  state |= Qt::ShiftButton;   break;
-        case META:   state |= Qt::MetaButton;    break;
-        case CTRL:   state |= Qt::ControlButton; break;
-        case ALT:    state |= Qt::AltButton;     break;
+  if (keycode & Qt::SHIFT) state |=  Qt::ShiftButton;
+  if (keycode & Qt::META)  state |=  Qt::MetaButton;
+  if (keycode & Qt::CTRL)  state |=  Qt::ControlButton;
+  if (keycode & Qt::ALT)   state |=  Qt::AltButton;
 #else /* QT_VERSION */
-        case Qt::SHIFT:  state |= Qt::ShiftModifier;   break;
-        case Qt::META:   state |= Qt::MetaModifier;    break;
-        case Qt::CTRL:   state |= Qt::ControlModifier; break;
-        case Qt::ALT:    state |= Qt::AltModifier;     break;
+  if (keycode & Qt::SHIFT) state |=  Qt::ShiftModifier;
+  if (keycode & Qt::META)  state |=  Qt::MetaModifier;
+  if (keycode & Qt::CTRL)  state |=  Qt::ControlModifier;
+  if (keycode & Qt::ALT)   state |=  Qt::AltModifier;
 #endif /* QT_VERSION */
-     };
-  }
+        
+  // Create ROOT event
   QKeyEvent ac(QEvent::KeyPress,keycode,keycode,state);
-  fprintf(stderr,"TQtClientWidget::Accelerate %c\n", keycode);
-  QApplication::sendEvent( this, &ac );
+  // call Event filter directly 
+  TQtClientFilter *f = gQt->QClientFilter();
+  if (f) f->AddKeyEvent(ac,this); 
+  QKeyEvent acRelease(QEvent::KeyRelease,keycode,keycode,state);
+  if (f) f->AddKeyEvent(acRelease,this); 
 }
 //______________________________________________________________________________
 void TQtClientWidget::Disconnect()