diff --git a/kdeui/jobs/kabstractwidgetjobtracker.cpp b/kdeui/jobs/kabstractwidgetjobtracker.cpp
index 274cbf5..e408ab3 100644
--- a/kdeui/jobs/kabstractwidgetjobtracker.cpp
+++ b/kdeui/jobs/kabstractwidgetjobtracker.cpp
@@ -20,6 +20,7 @@
 */
 
 #include "kabstractwidgetjobtracker.h"
+#include "kabstractwidgetjobtracker_p.h"
 
 #include <QWidget>
 #include <QTimer>
@@ -28,24 +29,9 @@
 
 #include <kdebug.h>
 
-class KAbstractWidgetJobTracker::Private
-{
-public:
-    Private(KAbstractWidgetJobTracker *parent)
-        : q(parent) { }
-
-    KAbstractWidgetJobTracker *const q;
-
-    struct MoreOptions {
-        bool stopOnClose : 1;
-        bool autoDelete : 1;
-    };
-
-    QMap<KJob*, MoreOptions> moreOptions;
-};
-
 KAbstractWidgetJobTracker::KAbstractWidgetJobTracker(QWidget *parent)
-    : KJobTrackerInterface(parent), d(new Private(this))
+    : KJobTrackerInterface(parent)
+    , d(new Private(this))
 {
 }
 
@@ -56,60 +42,32 @@ KAbstractWidgetJobTracker::~KAbstractWidgetJobTracker()
 
 void KAbstractWidgetJobTracker::registerJob(KJob *job)
 {
-    KJobTrackerInterface::registerJob(job);
-
-    if (d->moreOptions.contains(job)) {
-        return;
-    }
-
-    Private::MoreOptions mo;
-    mo.stopOnClose = true;
-    mo.autoDelete = true;
-
-    d->moreOptions.insert(job, mo);
+    Q_UNUSED(job);
 }
 
 void KAbstractWidgetJobTracker::unregisterJob(KJob *job)
 {
-    KJobTrackerInterface::unregisterJob(job);
-
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
-    d->moreOptions.remove(job);
+    Q_UNUSED(job);
 }
 
 void KAbstractWidgetJobTracker::setStopOnClose(KJob *job, bool stopOnClose)
 {
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
-    d->moreOptions[job].stopOnClose = stopOnClose;
+    d->setStopOnClose(job, stopOnClose);
 }
 
 bool KAbstractWidgetJobTracker::stopOnClose(KJob *job) const
 {
-    if (!d->moreOptions.contains(job)) {
-        return false;
-    }
-
-    return d->moreOptions[job].stopOnClose;
+    return d->stopOnClose(job);
 }
 
 void KAbstractWidgetJobTracker::setAutoDelete(KJob *job, bool autoDelete)
 {
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
-    d->moreOptions[job].autoDelete = autoDelete;
+    d->setAutoDelete(job, autoDelete);
 }
 
 bool KAbstractWidgetJobTracker::autoDelete(KJob *job) const
 {
-    return d->moreOptions[job].autoDelete;
+    return d->autoDelete(job);
 }
 
 void KAbstractWidgetJobTracker::finished(KJob *job)
@@ -119,34 +77,19 @@ void KAbstractWidgetJobTracker::finished(KJob *job)
 
 void KAbstractWidgetJobTracker::slotStop(KJob *job)
 {
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
-    job->kill( KJob::EmitResult ); // notify that the job has been killed
-
+    job->kill(KJob::EmitResult); // notify that the job has been killed
     emit stopped(job);
 }
 
 void KAbstractWidgetJobTracker::slotSuspend(KJob *job)
 {
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
     job->suspend();
-
     emit suspend(job);
 }
 
 void KAbstractWidgetJobTracker::slotResume(KJob *job)
 {
-    if (!d->moreOptions.contains(job)) {
-        return;
-    }
-
     job->resume();
-
     emit resume(job);
 }
 
diff --git a/kdeui/jobs/kabstractwidgetjobtracker.h b/kdeui/jobs/kabstractwidgetjobtracker.h
index a51e103..892e787 100644
--- a/kdeui/jobs/kabstractwidgetjobtracker.h
+++ b/kdeui/jobs/kabstractwidgetjobtracker.h
@@ -1,6 +1,7 @@
 /*  This file is part of the KDE project
     Copyright (C) 2000 Matej Koss <koss@miesto.sk>
     Copyright (C) 2007 Kevin Ottens <ervin@kde.org>
+    Copyright (C) 2008 Rafael Fernández López <ereslibre@kde.org>
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -180,7 +181,7 @@ Q_SIGNALS:
      */
     void resume(KJob *job);
 
-private:
+protected:
     class Private;
     Private *const d;
 };
diff --git a/kdeui/jobs/kabstractwidgetjobtracker_p.h b/kdeui/jobs/kabstractwidgetjobtracker_p.h
new file mode 100644
index 0000000..db6cc1c
--- /dev/null
+++ b/kdeui/jobs/kabstractwidgetjobtracker_p.h
@@ -0,0 +1,61 @@
+/*  This file is part of the KDE project
+    Copyright (C) 2000 Matej Koss <koss@miesto.sk>
+    Copyright (C) 2007 Kevin Ottens <ervin@kde.org>
+    Copyright (C) 2007 Rafael Fernández López <ereslibre@kde.org>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License version 2 as published by the Free Software Foundation.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+
+*/
+
+class KAbstractWidgetJobTracker::Private
+{
+public:
+    Private(KAbstractWidgetJobTracker *parent)
+        : q(parent)
+    {
+    }
+    
+    virtual ~Private()
+    {
+    }
+
+    KAbstractWidgetJobTracker *const q;
+
+    //### KDE 5: make this methods virtual on KAbstractWidgetJobTracker and get rid out of this
+    //           workaround. (ereslibre)
+    virtual void setStopOnClose(KJob *job, bool stopOnClose)
+    {
+        Q_UNUSED(job);
+        Q_UNUSED(stopOnClose);
+    }
+
+    virtual bool stopOnClose(KJob *job) const
+    {
+        Q_UNUSED(job);
+        return true;
+    }
+
+    virtual void setAutoDelete(KJob *job, bool autoDelete)
+    {
+        Q_UNUSED(job);
+        Q_UNUSED(autoDelete);
+    }
+
+    virtual bool autoDelete(KJob *job) const
+    {
+        Q_UNUSED(job);
+        return true;
+    }
+};
diff --git a/kdeui/jobs/kwidgetjobtracker.cpp b/kdeui/jobs/kwidgetjobtracker.cpp
index 7650460..bcc4176 100644
--- a/kdeui/jobs/kwidgetjobtracker.cpp
+++ b/kdeui/jobs/kwidgetjobtracker.cpp
@@ -77,11 +77,6 @@ QWidget *KWidgetJobTracker::widget(KJob *job)
 
 void KWidgetJobTracker::registerJob(KJob *job)
 {
-    if (d->progressWidget.contains(job) ||
-        d->progressWidgetsToBeShown.contains(job)) {
-        return;
-    }
-
     KAbstractWidgetJobTracker::registerJob(job);
 
     Private::ProgressWidget *vi = new Private::ProgressWidget(job, this, d->parent);
@@ -97,14 +92,10 @@ void KWidgetJobTracker::unregisterJob(KJob *job)
 
     KWidgetJobTracker::Private::ProgressWidget *pWidget = d->progressWidget.value(job, 0);
     if (!pWidget) {
-        d->progressWidgetsToBeShown.removeAll(job);
         return;
     }
 
     pWidget->deref();
-
-    d->progressWidget.remove(job);
-    d->progressWidgetsToBeShown.removeAll(job);
 }
 
 bool KWidgetJobTracker::keepOpen(KJob *job) const
@@ -231,6 +222,8 @@ void KWidgetJobTracker::Private::ProgressWidget::deref()
             if (tracker->autoDelete(job)) {
                 deleteLater();
             }
+            tracker->d->progressWidget.remove(job);
+            tracker->d->progressWidgetsToBeShown.removeAll(job);
         } else {
             slotClean();
         }
@@ -432,10 +425,6 @@ void KWidgetJobTracker::Private::ProgressWidget::closeEvent(QCloseEvent *event)
     }
 
     QWidget::closeEvent(event);
-
-    if (keepOpenChecked) {
-        KGlobal::deref();
-    }
 }
 
 void KWidgetJobTracker::Private::ProgressWidget::init()
@@ -625,7 +614,7 @@ void KWidgetJobTracker::Private::ProgressWidget::_k_openLocation()
 
 void KWidgetJobTracker::Private::ProgressWidget::_k_pauseResumeClicked()
 {
-    if ( !suspendedProperty ) {
+    if (!suspendedProperty) {
         tracker->slotSuspend(job);
     } else {
         tracker->slotResume(job);
@@ -636,10 +625,6 @@ void KWidgetJobTracker::Private::ProgressWidget::_k_stop()
 {
     tracker->slotStop(job);
     deref();
-
-    if (keepOpenChecked) {
-        KGlobal::deref();
-    }
 }
 
 #include "kwidgetjobtracker.moc"
diff --git a/kdeui/jobs/kwidgetjobtracker.h b/kdeui/jobs/kwidgetjobtracker.h
index 59c0b4f..2084dae 100644
--- a/kdeui/jobs/kwidgetjobtracker.h
+++ b/kdeui/jobs/kwidgetjobtracker.h
@@ -89,7 +89,7 @@ protected Q_SLOTS:
 
     //TODO: Misses canResume()
 
- private:
+private:
     class Private;
     Private *const d;
 
diff --git a/kdeui/jobs/kwidgetjobtracker_p.h b/kdeui/jobs/kwidgetjobtracker_p.h
index cb49444..2006a85 100644
--- a/kdeui/jobs/kwidgetjobtracker_p.h
+++ b/kdeui/jobs/kwidgetjobtracker_p.h
@@ -21,6 +21,8 @@
 #ifndef KWIDGETJOBTRACKER_P_H
 #define KWIDGETJOBTRACKER_P_H
 
+#include "kabstractwidgetjobtracker_p.h"
+
 #include <QWidget>
 #include <QMap>
 #include <QTime>
@@ -28,6 +30,7 @@
 
 #include <kdebug.h>
 #include <kurl.h>
+#include <kglobal.h>
 
 class KPushButton;
 class QCheckBox;
@@ -35,26 +38,30 @@ class KSqueezedTextLabel;
 class QLabel;
 class QProgressBar;
 
-
 class KWidgetJobTracker::Private
+    : public KAbstractWidgetJobTracker::Private
 {
 public:
     Private(QWidget *parent, KWidgetJobTracker *tracker)
-        : parent(parent)
-        , q(tracker)
+        : KAbstractWidgetJobTracker::Private(tracker)
+        , parent(parent)
     {
     }
 
-    ~Private()
+    virtual ~Private()
     {
     }
 
+    virtual void setStopOnClose(KJob *job, bool stopOnClose);
+    virtual bool stopOnClose(KJob *job) const;
+    virtual void setAutoDelete(KJob *job, bool autoDelete);
+    virtual bool autoDelete(KJob *job) const;
+
     void _k_slotShowProgressWidget();
 
     class ProgressWidget;
 
     QWidget *parent;
-    KWidgetJobTracker *q;
     QMap<KJob*, ProgressWidget*> progressWidget;
     QQueue<KJob*> progressWidgetsToBeShown;
 };
@@ -69,7 +76,7 @@ public:
     ProgressWidget(KJob *job, KWidgetJobTracker *object, QWidget *parent)
         : QWidget(parent), tracker(object), job(job), totalSize(0), totalFiles(0), totalDirs(0),
           processedSize(0), processedDirs(0), processedFiles(0),
-          totalSizeKnown(false), keepOpenChecked(false),
+          totalSizeKnown(false), stopOnClose(true), autoDelete(true), keepOpenChecked(false),
           cancelClose(0), openFile(0), openLocation(0),
           keepOpenCheck(0), pauseButton(0), sourceEdit(0), destEdit(0),
           progressLabel(0), destInvite(0), speedLabel(0), sizeLabel(0),
@@ -80,6 +87,9 @@ public:
 
     ~ProgressWidget()
     {
+        if (keepOpenChecked) {
+            KGlobal::deref();
+        }
     }
 
     KWidgetJobTracker *const tracker;
@@ -93,6 +103,8 @@ public:
     qulonglong processedFiles;
 
     bool totalSizeKnown;
+    bool stopOnClose;
+    bool autoDelete;
     bool keepOpenChecked;
     QString caption;
 
@@ -153,5 +165,40 @@ private Q_SLOTS:
     void _k_stop();
 };
 
+void KWidgetJobTracker::Private::setStopOnClose(KJob *job, bool stopOnClose)
+{
+    if (!progressWidget.contains(job)) {
+        return;
+    }
+    progressWidget[job]->stopOnClose = stopOnClose;
+}
+
+bool KWidgetJobTracker::Private::stopOnClose(KJob *job) const
+{
+    if (!progressWidget.contains(job)) {
+        kWarning() << "not found widget for job " << job << ". This method will return a "
+                        "hardcoded value";
+        return true;
+    }
+    return progressWidget[job]->stopOnClose;
+}
+
+void KWidgetJobTracker::Private::setAutoDelete(KJob *job, bool autoDelete)
+{
+    if (!progressWidget.contains(job)) {
+        return;
+    }
+    progressWidget[job]->autoDelete = autoDelete;
+}
+
+bool KWidgetJobTracker::Private::autoDelete(KJob *job) const
+{
+    if (!progressWidget.contains(job)) {
+        kWarning() << "not found widget for job " << job << ". This method will return a "
+                        "hardcoded value";
+        return true;
+    }
+    return progressWidget[job]->autoDelete;
+}
 
 #endif // KWIDGETJOBTRACKER_P_H
