Index: useractions.cpp
===================================================================
--- useractions.cpp	(revision 1287351)
+++ useractions.cpp	(working copy)
@@ -273,6 +273,8 @@
     cutWalkThroughDesktopListReverse = keys->shortcut("Walk Through Desktop List (Reverse)");
     cutWalkThroughWindows = keys->shortcut("Walk Through Windows");
     cutWalkThroughWindowsReverse = keys->shortcut("Walk Through Windows (Reverse)");
+    cutWalkThroughApps = keys->shortcut("Walk Through Windows of Same Application");
+    cutWalkThroughAppsReverse = keys->shortcut("Walk Through Windows of Same Application (Reverse)");
 
     keys->updateConnections();
     disable_shortcuts_keys->updateConnections();
Index: workspace.h
===================================================================
--- workspace.h	(revision 1287351)
+++ workspace.h	(working copy)
@@ -339,6 +339,9 @@
 
         void slotWalkThroughDesktops();
         void slotWalkBackThroughDesktops();
+        void slotWalkThroughApps();
+        void slotWalkBackThroughApps();
+
         void slotWalkThroughDesktopList();
         void slotWalkBackThroughDesktopList();
         void slotWalkThroughWindows();
@@ -559,6 +562,7 @@
         KShortcut cutWalkThroughDesktops, cutWalkThroughDesktopsReverse;
         KShortcut cutWalkThroughDesktopList, cutWalkThroughDesktopListReverse;
         KShortcut cutWalkThroughWindows, cutWalkThroughWindowsReverse;
+        KShortcut cutWalkThroughApps, cutWalkThroughAppsReverse;
         bool mouse_emulation;
         unsigned int mouse_emulation_state;
         WId mouse_emulation_window;
Index: tabbox.cpp
===================================================================
--- tabbox.cpp	(revision 1287351)
+++ tabbox.cpp	(working copy)
@@ -47,6 +47,7 @@
     setLineWidth(2);
     setMargin(2);
 
+    appsOnly = false;
     showMiniIcon = false;
 
     no_tasks = i18n("*** No Windows ***");
@@ -86,18 +87,20 @@
     m = mode;
     }
 
-
 /*!
   Create list of clients on specified desktop, starting with client c
 */
 void TabBox::createClientList(ClientList &list, int desktop /*-1 = all*/, Client *c, bool chain)
     {
     ClientList::size_type idx = 0;
-
+    TQString startclass = NULL;
     list.clear();
 
     Client* start = c;
 
+    if( start != NULL ) 
+        startclass = start->resourceClass();
+
     if ( chain )
         c = workspace()->nextFocusChainClient(c);
     else
@@ -121,6 +124,10 @@
                 // nothing
                 }
             }
+        if(appsOnly && (!TQString::compare( startclass, c->resourceClass()) == 0))
+            {
+            add = NULL;
+            }
 
         if( options->separateScreenFocus && options->xineramaEnabled )
             {
@@ -645,6 +652,7 @@
     XEvent otherEvent;
     while (XCheckTypedEvent (qt_xdisplay(), EnterNotify, &otherEvent ) )
         ;
+    appsOnly = FALSE;
     }
 
 
@@ -856,7 +864,7 @@
         }
     else
         {
-        if ( areModKeysDepressed( cutWalkThroughWindows ) )
+        if ( areModKeysDepressed( cutWalkThroughWindows  ) )
             {
             if ( startKDEWalkThroughWindows() )
                 KDEWalkThroughWindows( true );
@@ -893,6 +901,16 @@
         }
     }
 
+void Workspace::slotWalkThroughApps() {
+  kdDebug(0) << "slot walk" << endl;
+  tab_box->appsOnly = TRUE;
+  slotWalkThroughWindows();
+}
+
+void Workspace::slotWalkBackThroughApps() {
+    tab_box->appsOnly = TRUE;  
+    slotWalkBackThroughWindows();
+}
 void Workspace::slotWalkThroughDesktops()
     {
     if ( root != qt_xrootwin() )
@@ -1112,18 +1130,32 @@
     {
     bool forward = false;
     bool backward = false;
+    bool forwardapps = false;
+    bool backwardapps = false;
 
     if (tab_grab)
         {
         forward = cutWalkThroughWindows.contains( keyX );
         backward = cutWalkThroughWindowsReverse.contains( keyX );
-        if (forward || backward)
+
+        forwardapps = cutWalkThroughApps.contains( keyX );      
+        backwardapps = cutWalkThroughAppsReverse.contains( keyX );
+
+        if ( (forward || backward) && (!tab_box->appsOnly) )
             {
             kdDebug(125) << "== " << cutWalkThroughWindows.toStringInternal()
-                << " or " << cutWalkThroughWindowsReverse.toStringInternal() << endl;
-            KDEWalkThroughWindows( forward );
+                << " or " << cutWalkThroughWindowsReverse.keyCodeQt() << endl;
+             KDEWalkThroughWindows( forward );
             }
-        }
+        
+       if ( (forwardapps || backwardapps) && (tab_box->appsOnly) )
+            {
+            kdDebug(125) << "== " << cutWalkThroughApps.toStringInternal()
+                << " or " << cutWalkThroughAppsReverse.toStringInternal() << endl;
+            KDEWalkThroughWindows( forwardapps );
+            }
+       }
+    
     else if (control_grab)
         {
         forward = cutWalkThroughDesktops.contains( keyX ) ||
Index: tabbox.h
===================================================================
--- tabbox.h	(revision 1287351)
+++ tabbox.h	(working copy)
@@ -35,6 +35,7 @@
         Client* currentClient();
         void setCurrentClient( Client* c );
         int currentDesktop();
+        bool appsOnly;
 
     // DesktopMode and WindowsMode are based on the order in which the desktop
     //  or window were viewed.
Index: kwinbindings.cpp
===================================================================
--- kwinbindings.cpp	(revision 1287351)
+++ kwinbindings.cpp	(working copy)
@@ -20,6 +20,8 @@
 	keys->insert( "Group:Navigation", i18n("Navigation") );
 	DEF( I18N_NOOP("Walk Through Windows"),                ALT+Qt::Key_Tab, ALT+Qt::Key_Tab, slotWalkThroughWindows() );
 	DEF( I18N_NOOP("Walk Through Windows (Reverse)"),      ALT+SHIFT+Qt::Key_Tab, ALT+SHIFT+Qt::Key_Tab, slotWalkBackThroughWindows() );
+  DEF( I18N_NOOP("Walk Through Windows of Same Application"),                ALT+Qt::Key_QuoteLeft, ALT+Qt::Key_QuoteLeft, slotWalkThroughApps() );
+  DEF( I18N_NOOP("Walk Through Windows of Same Application (Reverse)"),      ALT+SHIFT+Qt::Key_AsciiTilde, ALT+SHIFT+Qt::Key_AsciiTilde, slotWalkBackThroughApps() );
 	DEF( I18N_NOOP("Walk Through Desktops"),               0, WIN+Qt::Key_Tab, slotWalkThroughDesktops() );
 	DEF( I18N_NOOP("Walk Through Desktops (Reverse)"),     0, WIN+SHIFT+Qt::Key_Tab, slotWalkBackThroughDesktops() );
 	DEF( I18N_NOOP("Walk Through Desktop List"),           0, 0, slotWalkThroughDesktopList() );
