diff -ur plasma-old/containments/panel/panel.cpp plasma/containments/panel/panel.cpp
--- plasma-old/containments/panel/panel.cpp	2009-07-18 17:51:07.246824085 +0200
+++ plasma/containments/panel/panel.cpp	2009-07-18 17:53:39.820738060 +0200
@@ -104,7 +104,8 @@
       m_canResize(true),
       m_spacerIndex(-1),
       m_spacer(0),
-      m_lastSpace(0)
+      m_lastSpace(0),
+      m_blendInterface(false)
 {
     m_background = new Plasma::FrameSvg(this);
     m_background->setImagePath("widgets/panel-background");
@@ -662,6 +663,10 @@
     }
 }
 
+void Panel::setBlendInterface(bool blend) {
+    m_blendInterface = blend;
+}
+
 void Panel::saveState(KConfigGroup &config) const
 {
     config.writeEntry("minimumSize", minimumSize());
@@ -731,8 +736,8 @@
         }
     }
 
-    // blit the background (saves all the per-pixel-products that blending does)
-    painter->setCompositionMode(QPainter::CompositionMode_Source);
+    // blit the background (saves all per-pixel-products that blending does)
+    painter->setCompositionMode(m_blendInterface ? QPainter::CompositionMode_SourceOver : QPainter::CompositionMode_Source);
     painter->setRenderHint(QPainter::Antialiasing);
 
     m_background->paintFrame(painter, option->exposedRect);
diff -ur plasma-old/containments/panel/panel.h plasma/containments/panel/panel.h
--- plasma-old/containments/panel/panel.h	2009-07-18 17:51:07.246824085 +0200
+++ plasma/containments/panel/panel.h	2009-07-18 17:52:50.707650167 +0200
@@ -55,6 +55,9 @@
 protected:
     void saveState(KConfigGroup &config) const;
 
+  public slots:
+    void setBlendInterface(bool);
+
 private slots:
     void themeUpdated();
     void backgroundChanged();
@@ -91,6 +94,7 @@
     Spacer *m_spacer;
     Spacer *m_lastSpace;
     QTimer *m_lastSpaceTimer;
+    bool m_blendInterface;
 
     friend class Spacer;
 };
diff -ur plasma-old/shells/desktop/desktopview.cpp plasma/shells/desktop/desktopview.cpp
--- plasma-old/shells/desktop/desktopview.cpp	2009-07-18 17:51:07.501010719 +0200
+++ plasma/shells/desktop/desktopview.cpp	2009-07-18 17:51:49.570124173 +0200
@@ -44,6 +44,7 @@
 #include "dashboardview.h"
 #include "plasmaapp.h"
 #include "plasma-shell-desktop.h"
+#include "panelview.h"
 
 #ifdef Q_WS_WIN
 #include "windows.h"
@@ -455,6 +456,15 @@
     }
 }
 
+void DesktopView::paintEvent(QPaintEvent* event) {
+    foreach(PanelView* view, PlasmaApp::self()->panelViews()) {
+        QRect intersection = view->geometry() & QRect(mapToGlobal(event->rect().topLeft()), mapToGlobal(event->rect().bottomRight()));
+        if(!intersection.isEmpty())
+            view->undergroundChanged(QRect(view->mapFromGlobal(intersection.topLeft()), view->mapFromGlobal(intersection.bottomRight())));
+    }
+    QGraphicsView::paintEvent(event);
+}
+
 void DesktopView::wheelEvent(QWheelEvent* event)
 {
     QGraphicsItem * item = scene() ? scene()->itemAt(sceneRect().topLeft() + event->pos()) : 0;
diff -ur plasma-old/shells/desktop/desktopview.h plasma/shells/desktop/desktopview.h
--- plasma-old/shells/desktop/desktopview.h	2009-07-18 17:51:07.400998563 +0200
+++ plasma/shells/desktop/desktopview.h	2009-07-18 17:51:49.546852567 +0200
@@ -116,6 +116,7 @@
     void updateShortcuts();
 
 protected:
+    void paintEvent(QPaintEvent* event);
     void wheelEvent(QWheelEvent *event);
     void drawBackground(QPainter *painter, const QRectF &rect);
 
diff -ur plasma-old/shells/desktop/panelview.cpp plasma/shells/desktop/panelview.cpp
--- plasma-old/shells/desktop/panelview.cpp	2009-07-18 17:51:07.501010719 +0200
+++ plasma/shells/desktop/panelview.cpp	2009-07-18 17:51:49.613490932 +0200
@@ -44,6 +44,7 @@
 #include "plasmaapp.h"
 
 #include <kephal/screens.h>
+#include "desktopview.h"
 
 class GlowBar : public QWidget
 {
@@ -1275,13 +1276,43 @@
     Plasma::View::leaveEvent(event);
 }
 
-void PanelView::drawBackground(QPainter *painter, const QRectF &rect)
-{
-    if (PlasmaApp::hasComposite()) {
-        painter->setCompositionMode(QPainter::CompositionMode_Source);
-        painter->fillRect(rect.toAlignedRect(), Qt::transparent);
-    } else {
-        Plasma::View::drawBackground(painter, rect);
+bool useDesktopTransparency = true;
+
+void PanelView::undergroundChanged(QRect area) {
+    if(!PlasmaApp::hasComposite() && useDesktopTransparency)
+        update(area);
+}
+
+void PanelView::drawBackground(QPainter *painter, const QRectF &_rect)
+{
+      QRectF rect(_rect);
+      DesktopView* desktopView = PlasmaApp::self()->viewForPanel(this);
+      if(containment())
+          QMetaObject::invokeMethod(containment(), "setBlendInterface", Q_ARG(bool, false));
+
+      if (PlasmaApp::hasComposite()) {
+          painter->setCompositionMode(QPainter::CompositionMode_Source);
+          painter->fillRect(rect.toAlignedRect(), Qt::transparent);
+      } else if(desktopView && useDesktopTransparency) {
+          painter->setCompositionMode(QPainter::CompositionMode_Source);
+
+          //Map 'rect' from the panel into the desktop view
+          QRectF desktopRect = mapFromScene(rect).boundingRect();
+          desktopRect.translate(pos().x(), pos().y());
+          desktopRect.translate(-desktopView->pos().x(), -desktopView->pos().y());
+          QRect grab = desktopRect.toRect();
+          grab &= QRect(QPoint(0, 0), desktopView->size()); //Sometimes the scene-mapping maps one pixel too far outside, so restrict the area
+
+          useDesktopTransparency = false; //Disable desktop transparency temporarily to prevent endless updating from within undergoundChanged
+          QPixmap grabbed = QPixmap::grabWidget(desktopView, grab);
+          useDesktopTransparency = true;
+
+          painter->drawPixmap(rect, grabbed, QRectF(0, 0, grab.width(), grab.height()));
+
+      if(containment()) //Tell the panel to blend the interface over the background, so it isn't discarded
+          QMetaObject::invokeMethod(containment(), "setBlendInterface", Q_ARG(bool, true));
+      }else{
+          Plasma::View::drawBackground(painter, rect);
     }
 }
 
diff -ur plasma-old/shells/desktop/panelview.h plasma/shells/desktop/panelview.h
--- plasma-old/shells/desktop/panelview.h	2009-07-18 17:51:07.440127630 +0200
+++ plasma/shells/desktop/panelview.h	2009-07-18 17:51:49.590183428 +0200
@@ -183,6 +183,11 @@
      */
     void appletAdded(Plasma::Applet *applet);
 
+    /**
+     * Notification that the undergound of this panel-view has changed
+     */
+    void undergroundChanged(QRect area);
+
 protected Q_SLOTS:
     void updateStruts();
 
diff -ur plasma-old/shells/desktop/plasmaapp.cpp plasma/shells/desktop/plasmaapp.cpp
--- plasma-old/shells/desktop/plasmaapp.cpp	2009-07-18 17:51:07.440127630 +0200
+++ plasma/shells/desktop/plasmaapp.cpp	2009-07-18 17:51:49.683492847 +0200
@@ -519,6 +519,21 @@
     }
 }
 
+DesktopView* PlasmaApp::viewForPanel(PanelView* panel) const {
+
+    int currentDesktop = -1;
+    if (AppSettings::perVirtualDesktopViews())
+        currentDesktop = KWindowSystem::currentDesktop()-1;
+    
+  
+    foreach (DesktopView *view, m_desktops)
+        if((view->desktop() == currentDesktop || currentDesktop == -1) && !(view->geometry() & panel->geometry()).isEmpty())
+            if(!view->isHidden())
+                return view;
+
+    return 0;
+}
+
 DesktopView* PlasmaApp::viewForScreen(int screen, int desktop) const
 {
     foreach (DesktopView *view, m_desktops) {
diff -ur plasma-old/shells/desktop/plasmaapp.h plasma/shells/desktop/plasmaapp.h
--- plasma-old/shells/desktop/plasmaapp.h	2009-07-18 17:51:07.484323332 +0200
+++ plasma/shells/desktop/plasmaapp.h	2009-07-18 17:51:49.660154825 +0200
@@ -79,6 +79,11 @@
      */
     QList<PanelView*> panelViews() const;
 
+    /**
+     * Returns the currently active desktop that this panel is visible on, or zero
+     */
+    DesktopView* viewForPanel(PanelView* panel) const;
+
     static bool isPanelContainment(Plasma::Containment *containment);
 
 #ifdef Q_WS_X11
