diff --git a/kdecore/services/kservice.cpp b/kdecore/services/kservice.cpp
index eb35a15..097186f 100644
--- a/kdecore/services/kservice.cpp
+++ b/kdecore/services/kservice.cpp
@@ -741,6 +741,11 @@ QString KService::untranslatedGenericName() const {
     return v.isValid() ? v.toString() : QString();
 }
 
+bool KService::SuSEunimportant() const {
+    QVariant v = property(QString::fromLatin1("X-SuSE-Unimportant"), QVariant::Bool);
+    return v.isValid() && v.toBool();
+}
+
 QString KService::parentApp() const {
     Q_D(const KService);
     QMap<QString,QVariant>::ConstIterator it = d->m_mapProps.find(QLatin1String("X-KDE-ParentApp"));
diff --git a/kdecore/services/kservice.h b/kdecore/services/kservice.h
index 3843bad..022c915 100644
--- a/kdecore/services/kservice.h
+++ b/kdecore/services/kservice.h
@@ -358,6 +358,12 @@ public:
     bool noDisplay() const;
 
     /**
+     * check if the application entry is important
+     * SuSE special, not part of KDE API
+     */
+    bool SuSEunimportant() const;
+
+    /**
      * Whether the service should be shown in KDE at all
      * (including in context menus).
      * @return true if the service should be shown.
diff --git a/kdecore/services/kservicegroup.cpp b/kdecore/services/kservicegroup.cpp
index 08bc587..70f4ab3 100644
--- a/kdecore/services/kservicegroup.cpp
+++ b/kdecore/services/kservicegroup.cpp
@@ -29,7 +29,7 @@
 #include <ksortablelist.h>
 #include <kdesktopfile.h>
 #include <kconfiggroup.h>
-
+#include <QDir>
 
 KServiceGroup::KServiceGroup( const QString & name )
  : KSycocaEntry(*new KServiceGroupPrivate(name))
@@ -61,6 +61,11 @@ void KServiceGroupPrivate::load(const QString &cfg)
   m_strComment = config.readEntry( "Comment" );
   deleted = config.readEntry("Hidden", false );
   m_bNoDisplay = desktopFile.noDisplay();
+  if (directoryEntryPath.startsWith(QDir::homePath()))
+      m_bShortMenu = false;
+  else
+      m_bShortMenu = config.readEntry( QString::fromLatin1("X-SuSE-AutoShortMenu"), true );
+  m_bGeneralDescription = config.readEntry( QString::fromLatin1("X-SuSE-GeneralDescription"), false );
   m_strBaseGroupName = config.readEntry( "X-KDE-BaseGroup" );
   suppressGenericNames = config.readEntry( "X-KDE-SuppressGenericNames", QStringList() );
 //  d->sortOrder = config.readEntry("SortOrder", QStringList());
@@ -124,6 +129,10 @@ int KServiceGroupPrivate::childCount() const
 {
   if (m_childCount == -1)
   {
+     KConfig cfg(QString::fromLatin1("kdeglobals"));
+     KConfigGroup global = cfg.group(QString::fromLatin1("KDE"));
+     bool showUnimportant = global.readEntry(QString::fromLatin1("showUnimportant"), false);
+
      m_childCount = 0;
 
      for( KServiceGroup::List::ConstIterator it = m_serviceList.begin();
@@ -134,7 +143,8 @@ int KServiceGroupPrivate::childCount() const
         {
             KService::Ptr service = KService::Ptr::staticCast( p );
            if (!service->noDisplay())
-              m_childCount++;
+               if ( showUnimportant || !service->SuSEunimportant() )
+                   m_childCount++;
         }
         else if (p->isType(KST_KServiceGroup))
         {
@@ -219,6 +229,18 @@ QStringList KServiceGroup::suppressGenericNames() const
   return d->suppressGenericNames;
 }
 
+bool KServiceGroup::SuSEgeneralDescription() const
+{
+    Q_D(const KServiceGroup);
+  return d->m_bGeneralDescription;
+}
+
+bool KServiceGroup::SuSEshortMenu() const
+{
+    Q_D(const KServiceGroup);
+  return d->m_bShortMenu;
+}
+
 void KServiceGroupPrivate::load( QDataStream& s )
 {
   QStringList groupList;
@@ -227,16 +249,21 @@ void KServiceGroupPrivate::load( QDataStream& s )
   qint8 inlineHeader;
   qint8 _inlineAlias;
   qint8 _allowInline;
+  qint8 _shortMenu;
+  qint8 _generalDescription;
   s >> m_strCaption >> m_strIcon >>
       m_strComment >> groupList >> m_strBaseGroupName >> m_childCount >>
       noDisplay >> suppressGenericNames >> directoryEntryPath >>
-      sortOrder >> _showEmptyMenu >> inlineHeader >> _inlineAlias >> _allowInline;
+      sortOrder >> _showEmptyMenu >> inlineHeader >> _inlineAlias >> _allowInline >>
+      _shortMenu >> _generalDescription;
 
   m_bNoDisplay = (noDisplay != 0);
   m_bShowEmptyMenu = ( _showEmptyMenu != 0 );
   m_bShowInlineHeader = ( inlineHeader != 0 );
   m_bInlineAlias = ( _inlineAlias != 0 );
   m_bAllowInline = ( _allowInline != 0 );
+  m_bShortMenu = (_shortMenu != 0);
+  m_bGeneralDescription = (_generalDescription != 0);
 
   if (m_bDeep)
   {
@@ -296,10 +323,12 @@ void KServiceGroupPrivate::save( QDataStream& s )
   qint8 inlineHeader = m_bShowInlineHeader ? 1 : 0;
   qint8 _inlineAlias = m_bInlineAlias ? 1 : 0;
   qint8 _allowInline = m_bAllowInline ? 1 : 0;
+  qint8 _shortMenu = m_bShortMenu ? 1 : 0;
   s << m_strCaption << m_strIcon <<
       m_strComment << groupList << m_strBaseGroupName << m_childCount <<
       noDisplay << suppressGenericNames << directoryEntryPath <<
-      sortOrder <<_showEmptyMenu <<inlineHeader<<_inlineAlias<<_allowInline;
+      sortOrder <<_showEmptyMenu <<inlineHeader<<_inlineAlias<<_allowInline <<
+      _shortMenu << m_bGeneralDescription;
 }
 
 QList<KServiceGroup::Ptr> KServiceGroup::groupEntries(EntriesOptions options)
@@ -359,6 +388,21 @@ KServiceGroup::entries(bool sort, bool excludeNoDisplay, bool allowSeparators, b
     return d->entries(this, sort, excludeNoDisplay, allowSeparators, sortByGenericName);
 }
 
+void KServiceGroup::addSortOrderEntry( const char *entry )
+{
+    Q_D(KServiceGroup);
+    const QString s = QString::fromLatin1(entry);
+    if (!d->sortOrder.contains(s))
+       d->sortOrder << s;
+}
+
+KServiceGroup::List
+KServiceGroup::SuSEsortEntries( KSortableList<KServiceGroup::SPtr,QByteArray> slist, KSortableList<KServiceGroup::SPtr,QByteArray> glist, bool excludeNoDisplay, bool allowSeparators )
+{
+    Q_D(KServiceGroup);
+    return d->SuSEsortEntries( this, slist, glist, excludeNoDisplay, allowSeparators );
+}
+
 static void addItem(KServiceGroup::List &sorted, const KSycocaEntry::Ptr &p, bool &addSeparator)
 {
    if (addSeparator && !sorted.isEmpty())
@@ -370,6 +414,12 @@ static void addItem(KServiceGroup::List &sorted, const KSycocaEntry::Ptr &p, boo
 KServiceGroup::List
 KServiceGroupPrivate::entries(KServiceGroup *group, bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName)
 {
+    return SuSEentries(group, sort, excludeNoDisplay, allowSeparators, sortByGenericName);
+}
+
+KServiceGroup::List
+KServiceGroupPrivate::SuSEentries(KServiceGroup *group, bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName, bool excludeSuSEunimportant)
+{
     KServiceGroup::Ptr grp;
 
     // If the entries haven't been loaded yet, we have to reload ourselves
@@ -395,11 +445,20 @@ KServiceGroupPrivate::entries(KServiceGroup *group, bool sort, bool excludeNoDis
     KSortableList<KServiceGroup::SPtr,QByteArray> glist;
     Q_FOREACH (KSycocaEntry::Ptr p, group->d_func()->m_serviceList)
     {
+        if ( !p->isType(KST_KServiceGroup) && !p->isType(KST_KService))
+            continue;
+
         bool noDisplay = p->isType(KST_KServiceGroup) ?
                                    static_cast<KServiceGroup *>(p.data())->noDisplay() :
                                    static_cast<KService *>(p.data())->noDisplay();
         if (excludeNoDisplay && noDisplay)
            continue;
+
+        bool SuSEunimportant = p->isType(KST_KService) &&
+            static_cast<KService *>(p.data())->SuSEunimportant();
+        if (excludeSuSEunimportant && SuSEunimportant)
+            continue;
+
         // Choose the right list
         KSortableList<KServiceGroup::SPtr,QByteArray> & list = p->isType(KST_KServiceGroup) ? glist : slist;
         QString name;
@@ -435,6 +494,12 @@ KServiceGroupPrivate::entries(KServiceGroup *group, bool sort, bool excludeNoDis
         }
         list.insert(key,KServiceGroup::SPtr(p));
     }
+    return SuSEsortEntries( group, slist, glist, excludeNoDisplay, allowSeparators );
+}
+
+KServiceGroup::List
+KServiceGroupPrivate::SuSEsortEntries( KServiceGroup *group, KSortableList<KServiceGroup::SPtr,QByteArray> slist, KSortableList<KServiceGroup::SPtr,QByteArray> glist, bool excludeNoDisplay, bool allowSeparators )
+{
     // Now sort
     slist.sort();
     glist.sort();
@@ -475,6 +540,8 @@ KServiceGroupPrivate::entries(KServiceGroup *group, bool sort, bool excludeNoDis
            // TODO: This prevents duplicates
           for(KSortableList<KServiceGroup::SPtr,QByteArray>::Iterator it2 = slist.begin(); it2 != slist.end(); ++it2)
           {
+             if (!(*it2).value()->isType(KST_KService))
+                continue;
              const KService::Ptr service = KService::Ptr::staticCast( (*it2).value() );
              if (service->menuId() == item)
              {
diff --git a/kdecore/services/kservicegroup.h b/kdecore/services/kservicegroup.h
index 9fdf2b0..ee2da88 100644
--- a/kdecore/services/kservicegroup.h
+++ b/kdecore/services/kservicegroup.h
@@ -22,6 +22,7 @@
 #include <kdecore_export.h>
 #include <ksycocaentry.h>
 #include <kservice.h>
+#include <ksortablelist.h>
 
 class KBuildServiceGroupFactory;
 
@@ -174,6 +175,12 @@ public:
   void setLayoutInfo(const QStringList &layout);
 
   /**
+   * SuSE special, not part of KDE API
+   */
+  bool SuSEshortMenu() const;
+  bool SuSEgeneralDescription() const;
+
+  /**
    * @internal
    * Returns information related to the layout of services in this group.
    */
@@ -200,6 +207,13 @@ public:
   List entries(bool sorted = false);
 
   /**
+   * UNOFFICIAL SuSE special
+   */
+  void addSortOrderEntry( const char *entry );
+  KServiceGroup::List SuSEsortEntries( KSortableList<KServiceGroup::SPtr,QByteArray> slist, KSortableList<KServiceGroup::SPtr,QByteArray> glist, bool excludeNoDisplay, bool allowSeparators );
+
+
+  /**
    * options for groupEntries and serviceEntries
    */
     enum EntriesOption
diff --git a/kdecore/services/kservicegroup_p.h b/kdecore/services/kservicegroup_p.h
index 5f21497..c67b984 100644
--- a/kdecore/services/kservicegroup_p.h
+++ b/kdecore/services/kservicegroup_p.h
@@ -31,7 +31,8 @@ public:
 
     KServiceGroupPrivate(const QString &path) 
         : KSycocaEntryPrivate(path),
-          m_bNoDisplay(false), m_bShowEmptyMenu(false), m_bShowInlineHeader(false), m_bInlineAlias(false),
+          m_bNoDisplay(false), m_bShortMenu(false), m_bGeneralDescription(false),
+          m_bShowEmptyMenu(false), m_bShowInlineHeader(false), m_bInlineAlias(false),
           m_bAllowInline(false), m_inlineValue(4), m_bDeep(false), m_childCount(-1)
     {
     }
@@ -58,6 +59,13 @@ public:
 
     KServiceGroup::List
     entries(KServiceGroup *group, bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName);
+
+    /**
+     * UNOFFICIAL SuSE special
+     */
+    KServiceGroup::List SuSEentries(KServiceGroup *group, bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName, bool excludeSuSEunimportant = true);
+    KServiceGroup::List SuSEsortEntries( KServiceGroup *group, KSortableList<KServiceGroup::SPtr,QByteArray> slist, KSortableList<KServiceGroup::SPtr,QByteArray> glist, bool excludeNoDisplay, bool allowSeparators );
+
   /**
    * This function parse attributes into menu
    */
@@ -65,6 +73,8 @@ public:
 
 
     bool m_bNoDisplay : 1;
+    bool m_bShortMenu : 1;
+    bool m_bGeneralDescription : 1;
     bool m_bShowEmptyMenu : 1;
     bool m_bShowInlineHeader : 1;
     bool m_bInlineAlias : 1;
