Index: kcmodule.h
===================================================================
--- kcmodule.h	(revision 420216)
+++ kcmodule.h	(working copy)
@@ -320,7 +320,7 @@
   void setRootOnlyMsg(const QString& msg);
 
   /**
-   * Change wether or not the RootOnly message should be shown.
+   * Change whether or not the RootOnly message should be shown.
    *
    * Following the value of @p on, the RootOnly message will be
    * shown or not.
@@ -329,6 +329,19 @@
    */
   void setUseRootOnlyMsg(bool on);
 
+  /**
+   * Returns the changed state of automatically managed widgets in this dialog
+   * @since 3.5
+   */
+  bool managedWidgetChangeState();
+
+  /**
+   * Call this method when your manually managed widgets change state between
+   * changed and not changed
+   * @since 3.5
+   */
+  void unmanagedWidgetChangeState(bool);
+
 private:
 
   int _btn;
Index: kcmodule.cpp
===================================================================
--- kcmodule.cpp	(revision 420216)
+++ kcmodule.cpp	(working copy)
@@ -40,7 +40,8 @@
     KCModulePrivate():
         _about( 0 ),
         _useRootOnlyMsg( false ),
-        _hasOwnInstance( true )
+        _hasOwnInstance( true ).
+        _unmanagedWidgetChangeState( false )
         { }
 
     KInstance *_instance;
@@ -51,6 +52,11 @@
     QPtrList<KConfigDialogManager> managers;
     QString _quickHelp;
 
+    // this member is used to record the state on non-automatically
+    // managed widgets, allowing for mixed KConfigXT-drive and manual
+    // widgets to coexist peacefully and do the correct thing with
+    // the changed(bool) signal
+    bool _unmanagedWidgetChangeState;
 };
 
 KCModule::KCModule(QWidget *parent, const char *name, const QStringList &)
@@ -124,13 +130,28 @@
 
 void KCModule::widgetChanged()
 {
+    emit changed(d->_unmanagedWidgetChangeState || managedWidgetChanged());
+}
+
+bool KCModule::managedWidgetChangeState()
+{
     bool bChanged = false;
     KConfigDialogManager* manager;
     for( manager = d->managers.first(); manager; manager = d->managers.next() )
-        bChanged |= manager->hasChanged();
-    emit( changed( bChanged ));
+    {
+        if ( manager->hasChanged() )
+            return true;
+    }
+
+    return false;
 }
 
+void KCModule::unmanagedWidgetChangeState(bool changed)
+{
+    d->_unmanagedWidgetChangeState = changed;
+    widgetChanged();
+}
+
 const KAboutData *KCModule::aboutData() const
 {
     return d->_about;
