=== modified file 'playground/demo-shell/demo_compositor.cpp'
--- playground/demo-shell/demo_compositor.cpp	2017-01-18 02:29:37 +0000
+++ playground/demo-shell/demo_compositor.cpp	2017-01-27 09:43:04 +0000
@@ -126,6 +126,7 @@
     else
     {
         renderer.set_output_transform(display_buffer.orientation(), display_buffer.mirror_mode());
+        update_viewport();
         renderer.set_viewport(viewport);
         renderer.begin(std::move(decorated));
         renderer.render(renderable_list);

=== modified file 'playground/demo-shell/window_manager.cpp'
--- playground/demo-shell/window_manager.cpp	2017-01-18 02:29:37 +0000
+++ playground/demo-shell/window_manager.cpp	2017-01-27 09:43:04 +0000
@@ -298,7 +298,6 @@
         
         if (rotating || mode_change || preferred_mode)
         {
-            compositor->stop();
             auto conf = display->configuration();
             conf->for_each_output(
                 [&](mg::UserDisplayConfigurationOutput& output) -> void
@@ -324,7 +323,6 @@
                 });
                                   
             display->configure(*conf);
-            compositor->start();
             return true;
         }
     }

=== modified file 'src/server/compositor/default_display_buffer_compositor.cpp'
--- src/server/compositor/default_display_buffer_compositor.cpp	2017-01-20 12:32:45 +0000
+++ src/server/compositor/default_display_buffer_compositor.cpp	2017-01-27 09:43:04 +0000
@@ -80,6 +80,7 @@
     else
     {
         renderer->set_output_transform(display_buffer.orientation(), display_buffer.mirror_mode());
+        renderer->set_viewport(view_area);
         renderer->render(renderable_list);
 
         report->renderables_in_frame(this, renderable_list);

=== modified file 'tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp'
--- tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp	2017-01-18 02:29:37 +0000
+++ tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp	2017-01-27 09:43:04 +0000
@@ -202,6 +202,44 @@
         .WillOnce(Return(mir_mirror_mode_none));
     EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
         .InSequence(render_seq);
+    EXPECT_CALL(mock_renderer, set_viewport(screen))
+        .InSequence(render_seq);
+    EXPECT_CALL(mock_renderer, render(ContainerEq(mg::RenderableList{big, small})))
+        .InSequence(render_seq);
+
+    mc::DefaultDisplayBufferCompositor compositor(
+        display_buffer,
+        mt::fake_shared(mock_renderer),
+        mr::null_compositor_report());
+
+    compositor.composite(make_scene_elements({
+        big,
+        small
+    }));
+}
+
+TEST_F(DefaultDisplayBufferCompositor, rotates_viewport)
+{   // Regression test for LP: #1643488
+    using namespace testing;
+
+    geom::Rectangle const rotated_screen{
+        screen.top_left,
+        {screen.size.height.as_int(), screen.size.width.as_int()}};
+
+    ON_CALL(display_buffer, view_area())
+        .WillByDefault(Return(rotated_screen));
+
+    Sequence render_seq;
+    EXPECT_CALL(mock_renderer, suspend())
+        .Times(0);
+    EXPECT_CALL(display_buffer, orientation())
+        .WillOnce(Return(mir_orientation_left));
+    EXPECT_CALL(display_buffer, mirror_mode())
+        .WillOnce(Return(mir_mirror_mode_none));
+    EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_left, mir_mirror_mode_none))
+        .InSequence(render_seq);
+    EXPECT_CALL(mock_renderer, set_viewport(rotated_screen))
+        .InSequence(render_seq);
     EXPECT_CALL(mock_renderer, render(ContainerEq(mg::RenderableList{big, small})))
         .InSequence(render_seq);
 
@@ -235,6 +273,8 @@
         .InSequence(seq);
     EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
         .InSequence(seq);
+    EXPECT_CALL(mock_renderer, set_viewport(screen))
+        .InSequence(seq);
     EXPECT_CALL(mock_renderer, render(IsEmpty()))
         .InSequence(seq);
 
@@ -250,6 +290,8 @@
         .InSequence(seq);
     EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
         .InSequence(seq);
+    EXPECT_CALL(mock_renderer, set_viewport(screen))
+        .InSequence(seq);
     EXPECT_CALL(mock_renderer, render(IsEmpty()))
         .InSequence(seq);
 

