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,7 +87,17 @@
     m = mode;
     }
 
+/*! 
+  Sets the appsOnly variable, TRUE means createClientList will only return windows matching the current WM_CLASS
 
+*/
+void TabBox::setAppsOnly( bool a ) {
+   appsOnly = a;
+}
+
+bool TabBox::getAppsOnly( ) {
+   return appsOnly;
+}
 /*!
   Create list of clients on specified desktop, starting with client c
 */
@@ -95,16 +106,18 @@
     ClientList::size_type idx = 0;
 
     list.clear();
+    
 
     Client* start = c;
 
+    TQString startclass = start->readClass();
     if ( chain )
         c = workspace()->nextFocusChainClient(c);
     else
         c = workspace()->stackingOrder().first();
 
     Client* stop = c;
-
+    
     while ( c )
         {
         Client* add = NULL;
@@ -121,7 +134,10 @@
                 // nothing
                 }
             }
-
+        if(appsOnly && (!TQString::compare( startclass, c->readClass()) == 0))
+            {
+            add = NULL;
+            }
         if( options->separateScreenFocus && options->xineramaEnabled )
             {
             if( c->screen() != workspace()->activeScreen())
@@ -645,9 +661,9 @@
     XEvent otherEvent;
     while (XCheckTypedEvent (qt_xdisplay(), EnterNotify, &otherEvent ) )
         ;
+    setAppsOnly( false );
     }
 
-
 void TabBox::reconfigure()
     {
     KConfig * c(KGlobal::config());
@@ -856,7 +872,7 @@
         }
     else
         {
-        if ( areModKeysDepressed( cutWalkThroughWindows ) )
+        if ( areModKeysDepressed( cutWalkThroughWindows  ) )
             {
             if ( startKDEWalkThroughWindows() )
                 KDEWalkThroughWindows( true );
@@ -888,11 +904,21 @@
             }
         else
             {
-            KDEOneStepThroughWindows( false );
+            KDEOneStepThroughWindows( true );
             }
         }
     }
 
+void Workspace::slotWalkThroughApps() {
+  kdDebug(0) << "slot walk" << endl;
+  tab_box->setAppsOnly(true);  
+  slotWalkThroughWindows();
+}
+
+void Workspace::slotWalkBackThroughApps() {
+    tab_box->setAppsOnly(true);   
+    slotWalkBackThroughWindows();
+}
 void Workspace::slotWalkThroughDesktops()
     {
     if ( root != qt_xrootwin() )
@@ -1112,25 +1138,39 @@
     {
     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->getAppsOnly()) )
             {
             kdDebug(125) << "== " << cutWalkThroughWindows.toStringInternal()
                 << " or " << cutWalkThroughWindowsReverse.toStringInternal() << endl;
-            KDEWalkThroughWindows( forward );
+             KDEWalkThroughWindows( forward );
             }
-        }
+        
+       if ( forwardapps || backwardapps && (tab_box->getAppsOnly()) )
+            {
+            kdDebug(125) << "== " << cutWalkThroughApps.toStringInternal()
+                << " or " << cutWalkThroughAppsReverse.toStringInternal() << endl;
+            KDEWalkThroughWindows( forwardapps );
+            }
+       }
+    
     else if (control_grab)
         {
         forward = cutWalkThroughDesktops.contains( keyX ) ||
                   cutWalkThroughDesktopList.contains( keyX );
         backward = cutWalkThroughDesktopsReverse.contains( keyX ) ||
                    cutWalkThroughDesktopListReverse.contains( keyX );
-        if (forward || backward)
+        if (forward || backward )
             walkThroughDesktops(forward);
         }
 
@@ -1138,7 +1178,7 @@
         {
         uint keyQt = keyX.keyCodeQt();
         if ( ((keyQt & 0xffff) == Qt::Key_Escape)
-            && !(forward || backward) )
+            && !(forward || backward ) )
             { // if Escape is part of the shortcut, don't cancel
             closeTabBox();
             }
@@ -1342,4 +1382,4 @@
 
 } // namespace
 
-#include "tabbox.moc"
+#include "tabbox.moc"
\ No newline at end of file
Index: client.cpp
===================================================================
--- client.cpp	(revision 1287351)
+++ client.cpp	(working copy)
@@ -2029,7 +2029,13 @@
     else 
         return KWin::readNameProperty( window(), XA_WM_NAME );
     }
+
+TQString Client::readClass() const
+    {
+    return KWin::readNamePropertyByInt( window(), XA_WM_CLASS, 1 );
     
+    }
+
 KWIN_COMPARE_PREDICATE( FetchNameInternalPredicate, const Client*, (!cl->isSpecialWindow() || cl->isToolbar()) && cl != value && cl->caption() == value->caption());
 
 void Client::setCaption( const TQString& s, bool force )
Index: client.h
===================================================================
--- client.h	(revision 1287351)
+++ client.h	(working copy)
@@ -55,6 +55,7 @@
 
         Workspace* workspace() const;
         const Client* transientFor() const;
+        TQString readClass() const;
         Client* transientFor();
         bool isTransient() const;
         bool isModalSystemNotification() const;
Index: tabbox.h
===================================================================
--- tabbox.h	(revision 1287351)
+++ tabbox.h	(working copy)
@@ -41,6 +41,8 @@
     // DesktopListMode lists them in the order created.
         enum Mode { DesktopMode, DesktopListMode, WindowsMode };
         void setMode( Mode mode );
+        void setAppsOnly(bool appsOnly);
+        bool getAppsOnly();
         Mode mode() const;
 
         void reset();
@@ -48,7 +50,7 @@
 
         void delayedShow();
         void hide();
-
+        
         void handleMouseEvent( XEvent* );
 
         Workspace* workspace() const;
@@ -72,6 +74,7 @@
         int desk;
         int lineHeight;
         bool showMiniIcon;
+        bool appsOnly;
         TQTimer delayedShowTimer;
         TQString no_tasks;
         bool options_traverse_all;
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() );
