diff --git a/mythtv/libs/libmythtv/videoout_quartz.cpp b/mythtv/libs/libmythtv/videoout_quartz.cpp
index 458f15a..d43d5eb 100644
--- a/mythtv/libs/libmythtv/videoout_quartz.cpp
+++ b/mythtv/libs/libmythtv/videoout_quartz.cpp
@@ -86,16 +86,16 @@ class VideoOutputQuartzView
     virtual void Show(void);
 
     virtual void InputChanged(int width, int height, float aspect,
                               MythCodecID av_codec_id);
-    virtual void MoveResize(QRect newRect);
+    virtual void MoveResize();
 
     virtual void EmbedChanged(bool embedded);
 
   protected:
     virtual bool Begin(void);
     virtual void End(void);
-    virtual void Transform(QRect newRect);
+    virtual void Transform();
     virtual void BlankScreen(bool deferred);
 
     // Subclasses implement the following methods:
     virtual bool BeginPort(void) = 0;   // Set up a valid thePort object
@@ -105,9 +105,8 @@ class VideoOutputQuartzView
 
     QuartzData *       parentData;    // information about video source is here
 
     CGrafPtr           thePort;       // QuickDraw graphics port
-    QRect              m_desired;     // Desired output size characteristics
     ImageSequence      theCodec;      // QuickTime sequence ID
     RgnHandle          theMask;       // clipping region
 
     int                frameSkip;     // do we skip frames?
@@ -178,8 +177,9 @@ class QuartzData
     WindowRef          window;            // MythTV window
     Rect               windowBounds;      // dimensions, to restore size later
     CGDirectDisplayID  screen;            // screen containing main window
     float              refreshRate;       // for screen above
+    QRect              display_rect;
 
     // Global preferences:
     bool               drawInWindow;      // Fullscreen or in GUI view?
     bool               windowedMode;      // GUI runs in window?
@@ -221,16 +221,8 @@ bool VideoOutputQuartzView::Begin(void)
         viewLock.unlock();
         return false;
     }
 
-    // Set initial output size
-    Rect portBounds;
-    GetPortBounds(thePort, &portBounds);
-    VERBOSE(VB_PLAYBACK, QString("%0Viewport currently %1,%2 -> %3,%4")
-                         .arg(name).arg(portBounds.left).arg(portBounds.top)
-                         .arg(portBounds.right).arg(portBounds.bottom));
-    m_desired.setWidth(portBounds.right);
-    m_desired.setHeight(portBounds.bottom);
 #if 0
     // The clipping mask
     theMask = NewRgn();
     SetRectRgn(theMask, m_desired.left(),  m_desired.top(),
@@ -269,9 +261,9 @@ bool VideoOutputQuartzView::Begin(void)
                       codecDSequenceFlushInsteadOfDirtying);
     viewLock.unlock();
 
     // set transformation matrix
-    Transform(m_desired);
+    Transform();
 
     return true;
 }
 
@@ -293,84 +285,37 @@ void VideoOutputQuartzView::End(void)
     viewLock.unlock();
 }
 
 /// Build the transformation matrix to scale the video appropriately.
-void VideoOutputQuartzView::Transform(QRect newRect)
+void VideoOutputQuartzView::Transform()
 {
     MatrixRecord matrix;
     SetIdentityMatrix(&matrix);
 
-    int x, y, w, h, sw, sh;
-    x = newRect.left();
-    y = newRect.top();
-    w = newRect.width();
-    h = newRect.height();
-    sw = parentData->srcWidth;
-    sh = parentData->srcHeight;
-
-    // constants for transformation operations
-    Fixed one, zero;
-    one  = Long2Fix(1);
-    zero = Long2Fix(0);
-
-    VERBOSE(VB_PLAYBACK, QString("%0Viewport is %1 x %2")
-                                .arg(name).arg(w).arg(h));
-    VERBOSE(VB_PLAYBACK, QString("%0Image is %1 x %2")
-                                .arg(name).arg(sw).arg(sh));
-
-    double hscale = (double) w / sw;
-    double vscale = (double) h / sh;
-
-    // cap zooming if we requested it
-    if (!parentData->scaleUpVideo)
-    {
-        double maxScale = fmax(hscale, vscale);
-        hscale /= maxScale;
-        vscale /= maxScale;
-    }
+    Rect Rsrc, Rdst;
+    QRect display_rect;
 
-    if ((hscale < 0.99) || (hscale > 1.01) ||
-        (vscale < 0.99) || (vscale > 1.01))
-    {
-        VERBOSE(VB_PLAYBACK, QString("%0Scaling to %1 x %2 of original")
-                                    .arg(name).arg(hscale).arg(vscale));
-        ScaleMatrix(&matrix,
-                    X2Fix(hscale),
-                    X2Fix(vscale),
-                    zero, zero);
+    Rsrc.left   = 0;
+    Rsrc.top    = 0;
+    Rsrc.right  = parentData->srcWidth;
+    Rsrc.bottom = parentData->srcHeight;
 
-        // reset sw, sh for new apparent width/height
-        sw = (int)(sw * hscale);
-        sh = (int)(sh * vscale);
-    }
+    display_rect= parentData->display_rect;
+    Rdst.left   = display_rect.left();
+    Rdst.top    = display_rect.top();
+    Rdst.right  = display_rect.right();
+    Rdst.bottom = display_rect.bottom();
 
-    // center image in viewport
-    if ((h != sh) || (w != sw))
-    {
-        VERBOSE(VB_PLAYBACK, QString("%0Centering with %1, %2")
-                             .arg(name).arg((w - sw)/2.0).arg((h - sh)/2.0));
-        TranslateMatrix(&matrix, X2Fix((w - sw) / 2.0), X2Fix((h - sh) / 2.0));
-    }
-
-// apply the basic sizing to DVDV
-#ifdef USING_DVDV
-    if (parentData->dvdv)
-    {
-        parentData->dvdv->MoveResize(
-            0, 0, parentData->srcWidth, parentData->srcHeight,
-            (int)((w - sw) / 2.0), (int)((h - sh) / 2.0), sw, sh);
-    }
-#endif // USING_DVDV
-
-    // apply graphics port or embedding offset
-    if (x || y)
-    {
-        VERBOSE(VB_PLAYBACK, QString("%0Translating to %1, %2")
-                                    .arg(name).arg(x).arg(y));
-        TranslateMatrix(&matrix, Long2Fix(x), Long2Fix(y));
-    }
-
-    // Apply the transformation
+    MapMatrix(&matrix, &Rsrc, &Rdst);
+#if 0
+    VERBOSE(VB_PLAYBACK, QString("%0Viewport is now %1 / %2 / %3 / %4")
+                                .arg(name)
+                                .arg(Rdst.left)
+                                .arg(Rdst.top)
+                                .arg(Rdst.right)
+                                .arg(Rdst.bottom)
+    );
+#endif
     viewLock.lock();
     SetDSequenceMatrix(theCodec, &matrix);
     viewLock.unlock();
     BlankScreen(true);   // clean up screen of artifacts at next Show
@@ -387,9 +332,9 @@ void VideoOutputQuartzView::BlankScreen(bool deferred)
     viewLock.lock();
     if (thePort)
     {
         SetPort(thePort);
-
+#if 0
         // set clipping rectangle
         Rect clipRect;
         if (m_desired.width() && m_desired.height())
         {
@@ -401,8 +346,12 @@ void VideoOutputQuartzView::BlankScreen(bool deferred)
         else
         {
             GetPortBounds(thePort, &clipRect);
         }
+#endif
+        Rect clipRect;
+        GetPortBounds(thePort, &clipRect);
+
         RgnHandle clipRgn = NewRgn();
         RectRgn(clipRgn, &clipRect);
 
         // erase our rectangle to black
@@ -471,12 +420,12 @@ void VideoOutputQuartzView::InputChanged(int width, int height, float aspect,
     End();
     Begin();
 }
 
-void VideoOutputQuartzView::MoveResize(QRect newRect)
+void VideoOutputQuartzView::MoveResize()
 {
     if (applyMoveResize)
-        Transform(newRect);
+        Transform();
 }
 
 /// Subclasses that block the main window should suspend
 /// playback, hide windows, etc by overriding this method.
@@ -575,9 +524,9 @@ class VoqvEmbedded : public VideoOutputQuartzView
   public:
     VoqvEmbedded(QuartzData *pData, int x, int y, int w, int h)
     : VideoOutputQuartzView(pData)
     {
-        m_desired = QRect(x, y, w, h);
+        // m_desired = QRect(x, y, w, h);
         name = "Embedded window: ";
     };
 
    ~VoqvEmbedded()
@@ -740,8 +689,9 @@ class VoqvDock : public VideoOutputQuartzView
             VERBOSE(VB_IMPORTANT, "VoqvDock::BeginPort() - "
                     "BeginQDContextForApplicationDockTile failed");
             return false;
         }
+
         return true;
     };
 
     void EndPort(void)
@@ -789,13 +739,16 @@ class VoqvFloater : public VideoOutputQuartzView
         {
             // Resize complete, reset the window drawing transformation
             Rect curBounds;
             GetPortBounds(thePort, &curBounds);
-            m_desired.setWidth(curBounds.right - curBounds.left);
-            m_desired.setHeight(curBounds.bottom - curBounds.top);
-            SetRectRgn(theMask, m_desired.left(),  m_desired.top(),
-                                m_desired.width(), m_desired.height());
-            Transform(m_desired);
+
+            VERBOSE(VB_IMPORTANT, "Fixme: resizing window");
+
+//          m_desired.setWidth(curBounds.right - curBounds.left);
+//          m_desired.setHeight(curBounds.bottom - curBounds.top);
+//          SetRectRgn(theMask, m_desired.left(),  m_desired.top(),
+//                              m_desired.width(), m_desired.height());
+            Transform();
         }
         resizing = startResizing;
     }
 
@@ -1055,8 +1008,9 @@ class VoqvDesktop : public VideoOutputQuartzView
                     "VoqvDesktop::BeginPort() - GetWindowPort failed");
             viewLock.unlock();
             return false;
         }
+
         viewLock.unlock();
         ShowWindow(window);
         // don't lose focus from main window
         SelectWindow(parentData->window);
@@ -1131,8 +1085,9 @@ VideoOutputQuartz::~VideoOutputQuartz()
 void VideoOutputQuartz::VideoAspectRatioChanged(float aspect)
 {
     VERBOSE(VB_PLAYBACK, (LOC + "VideoAspectRatioChanged(aspect=%1) [was %2]")
                          .arg(aspect).arg(data->srcAspect));
+    VERBOSE(VB_PLAYBACK, "QU: VideoAspectRatioChanged");
 
     VideoOutput::VideoAspectRatioChanged(aspect);
 
     data->srcAspect = aspect;
@@ -1154,26 +1109,36 @@ void VideoOutputQuartz::ToggleAdjustFill(AdjustFillMode adjustFill)
     VideoOutput::ToggleAdjustFill(adjustFill);
 
     // We could change all the views, but the user probably only
     // wants the main one (window or fullscreen) to change.
-    data->views[0]->MoveResize(windows[0].GetDisplayVideoRect());
+    data->views[0]->MoveResize();
 }
 
 void VideoOutputQuartz::MoveResize(void)
 {
     // This recalculates the desired output rectangle, based on
     // the user's current aspect/fill/letterbox/zoom settings.
     VideoOutput::MoveResize();
 
-    QRect newRect = windows[0].GetDisplayVideoRect();
+    const QSize video_dim = windows[0].GetVideoDim();
+    data->srcWidth  = video_dim.width();
+    data->srcHeight = video_dim.height();
+    data->srcAspect = windows[0].GetVideoAspect();
+    data->srcMode   = db_aspectoverride;
+    data->display_rect = windows[0].GetDisplayVideoRect();
 
     vector<VideoOutputQuartzView*>::iterator it;
     for (it = data->views.begin(); it != data->views.end(); ++it)
     {
-        (*it)->MoveResize(newRect);
+        (*it)->MoveResize();
     }
 }
 
+void VideoOutputQuartz::ToggleAspectOverride(AspectOverrideMode aspectMode) {
+    VideoOutput::ToggleAspectOverride(aspectMode);
+    MoveResize();
+}
+
 bool VideoOutputQuartz::InputChanged(const QSize &input_size,
                                      float        aspect,
                                      MythCodecID  av_codec_id,
                                      void        *codec_private,
@@ -1223,10 +1188,11 @@ bool VideoOutputQuartz::InputChanged(const QSize &input_size,
     DeleteQuartzBuffers();
 
     data->srcWidth  = video_dim.width();
     data->srcHeight = video_dim.height();
-    data->srcAspect = aspect;
+    data->srcAspect = windows[0].GetVideoAspect();
     data->srcMode   = db_aspectoverride;
+    data->display_rect = windows[0].GetDisplayVideoRect();
 
     CreateQuartzBuffers();
 
     vector<VideoOutputQuartzView*>::iterator it = data->views.begin();
@@ -1279,8 +1245,9 @@ bool VideoOutputQuartz::Init(int width, int height, float aspect,
     data->srcWidth  = video_dim.width();
     data->srcHeight = video_dim.height();
     data->srcAspect = aspect;
     data->srcMode   = db_aspectoverride;
+    data->display_rect = windows[0].GetDisplayVideoRect();
 
     // Initialize QuickTime
     if (EnterMovies())
     {
@@ -1597,20 +1564,21 @@ void VideoOutputQuartz::DeleteQuartzBuffers()
 
     vbuffers.DeleteBuffers();
 }
 
-void VideoOutputQuartz::EmbedInWidget(WId wid, int x, int y, int w, int h)
+void VideoOutputQuartz::EmbedInWidget(int x, int y, int w, int h)
 {
     VERBOSE(VB_PLAYBACK,
-            (LOC + "EmbedInWidget(wid=%1, x=%2, y=%3, w=%4, h=%5)")
-            .arg(wid).arg(x).arg(y).arg(w).arg(h));
+            (LOC + "EmbedInWidget(x=%1, y=%2, w=%3, h=%4)")
+            .arg(x).arg(y).arg(w).arg(h));
 
     if (windows[0].IsEmbedding())
         return;
 
     VideoOutput::EmbedInWidget(x, y, w, h);
 
     data->pixelLock.lock();
+    data->display_rect = windows[0].GetDisplayVideoRect();
 
     // warn other views that embedding is starting
     vector<VideoOutputQuartzView*>::iterator it = data->views.begin();
     for (; it != data->views.end(); ++it)
@@ -1638,8 +1606,9 @@ void VideoOutputQuartz::StopEmbedding(void)
 
     VideoOutput::StopEmbedding();
 
     data->pixelLock.lock();
+    data->display_rect = windows[0].GetDisplayVideoRect();
 
     // delete embedded widget
     if (data->embeddedView)
     {
diff --git a/mythtv/libs/libmythtv/videoout_quartz.h b/mythtv/libs/libmythtv/videoout_quartz.h
index 0a249d9..6ed8da6 100644
--- a/mythtv/libs/libmythtv/videoout_quartz.h
+++ b/mythtv/libs/libmythtv/videoout_quartz.h
@@ -30,12 +30,13 @@ class VideoOutputQuartz : public VideoOutput
                       void        *codec_private,
                       bool        &aspect_only);
     void VideoAspectRatioChanged(float aspect);
     void MoveResize(void);
+    void ToggleAspectOverride(AspectOverrideMode aspectMode);
     void Zoom(ZoomDirection direction);
     void ToggleAdjustFill(AdjustFillMode adjustFill);
 
-    void EmbedInWidget(WId wid, int x, int y, int w, int h);
+    void EmbedInWidget(int x, int y, int w, int h);
     void StopEmbedding(void);
 
     DisplayInfo GetDisplayInfo(void);
     void MoveResizeWindow(QRect new_rect) {;}
diff --git a/mythtv/libs/libmythtv/videooutbase.h b/mythtv/libs/libmythtv/videooutbase.h
index 8455f27..43c8d24 100644
--- a/mythtv/libs/libmythtv/videooutbase.h
+++ b/mythtv/libs/libmythtv/videooutbase.h
@@ -109,9 +109,9 @@ class VideoOutput
 
     /// \brief Returns current aspect override mode
     /// \sa ToggleAspectOverride(AspectOverrideMode)
     AspectOverrideMode GetAspectOverride(void) const;
-    void ToggleAspectOverride(
+    virtual void ToggleAspectOverride(
         AspectOverrideMode aspectOverrideMode = kAspect_Toggle);
 
     /// \brief Returns current adjust fill mode
     /// \sa ToggleAdjustFill(AdjustFillMode)
diff --git a/mythtv/programs/programs.pro b/mythtv/programs/programs.pro
index 7604c45..9cf268b 100644
--- a/mythtv/programs/programs.pro
+++ b/mythtv/programs/programs.pro
@@ -17,4 +17,6 @@ using_frontend:using_backend {
     SUBDIRS += mythtranscode
 }
 
 mingw: SUBDIRS -= mythtranscode mythtranscode/replex
+# Nigel's speedup hack:
+SUBDIRS = mythfrontend mythavtest
