diff --git a/src/AndroidDesktop.cpp b/src/AndroidDesktop.cpp
index 90f1699b5adc48cff2c79aeefb8d84c50eb7db37..253eefe1f2cd6295d4850bb7f28bf4ceb4b8aac5 100644
--- a/src/AndroidDesktop.cpp
+++ b/src/AndroidDesktop.cpp
@@ -168,9 +168,21 @@ status_t AndroidDesktop::updateDisplayInfo() {
         ALOGE("Failed to get display characteristics\n");
         return err;
     }
-    //ALOGV("updateDisplayInfo: [%d:%d]", mDisplayInfo.w, mDisplayInfo.h);
+    
+    err = SurfaceComposerClient::getActiveDisplayConfig(displayToken, &mDisplayConfig);
+    if (err != NO_ERROR) {
+        ALOGE("Failed to get display configuration\n");
+        return err;
+    }
+    ALOGV("updateDisplayInfo: [%d:%d]", mDisplayConfig.resolution.width, mDisplayConfig.resolution.height);
+
+    err = SurfaceComposerClient::getDisplayState(displayToken, &mDisplayState);
+    if (err != NO_ERROR) {
+        ALOGE("Failed to get current display status");
+        return err;
+    }
 
-    mPixels->setDisplayInfo(&mDisplayInfo);
+    mPixels->setDisplayInfo(&mDisplayConfig, &mDisplayState);
 
     return NO_ERROR;
 }
@@ -187,7 +199,8 @@ void AndroidDesktop::onBufferDimensionsChanged(uint32_t width, uint32_t height)
           mDisplayRect.getHeight(), width, height);
 
     mVirtualDisplay.clear();
-    mVirtualDisplay = new VirtualDisplay(&mDisplayInfo, mPixels->width(), mPixels->height(), this);
+    mVirtualDisplay = new VirtualDisplay(&mDisplayConfig,  &mDisplayState,
+                                         mPixels->width(), mPixels->height(), this);
 
     mDisplayRect = mVirtualDisplay->getDisplayRect();
 
diff --git a/src/AndroidDesktop.h b/src/AndroidDesktop.h
index 1ceecc2901c4a05270a73690977dd0573ef76493..993f466d1cc38cee454cdd186f2659a1a6064987 100644
--- a/src/AndroidDesktop.h
+++ b/src/AndroidDesktop.h
@@ -11,6 +11,8 @@
 #include <gui/CpuConsumer.h>
 
 #include <ui/DisplayInfo.h>
+#include <ui/DisplayConfig.h>
+#include <ui/DisplayState.h>
 
 #include <rfb/PixelBuffer.h>
 #include <rfb/SDesktop.h>
@@ -79,6 +81,8 @@ class AndroidDesktop : public rfb::SDesktop,
 
     // Primary display
     DisplayInfo mDisplayInfo;
+    DisplayConfig mDisplayConfig = {};
+    ui::DisplayState mDisplayState = {};
 
     // Virtual input device
     sp<InputDevice> mInputDevice;
diff --git a/src/AndroidPixelBuffer.cpp b/src/AndroidPixelBuffer.cpp
index 8af6c39e1c97dd0a44b8e089b66834fa81f99cfa..b6ab0cb3916f12f1878fbdd8e4744c13c3745d68 100644
--- a/src/AndroidPixelBuffer.cpp
+++ b/src/AndroidPixelBuffer.cpp
@@ -37,8 +37,8 @@ AndroidPixelBuffer::~AndroidPixelBuffer() {
     mListener = nullptr;
 }
 
-bool AndroidPixelBuffer::isDisplayRotated(uint8_t orientation) {
-    return orientation != DISPLAY_ORIENTATION_0 && orientation != DISPLAY_ORIENTATION_180;
+bool AndroidPixelBuffer::isDisplayRotated(ui::Rotation orientation) {
+    return orientation != ui::ROTATION_0 && orientation != ui::ROTATION_180;
 }
 
 void AndroidPixelBuffer::setBufferRotation(bool rotated) {
@@ -98,12 +98,12 @@ void AndroidPixelBuffer::setWindowSize(uint32_t width, uint32_t height) {
     }
 }
 
-void AndroidPixelBuffer::setDisplayInfo(DisplayInfo* info) {
-    bool rotated = isDisplayRotated(info->orientation);
+void AndroidPixelBuffer::setDisplayInfo(DisplayConfig* config, ui::DisplayState* state) {
+    bool rotated = isDisplayRotated(state->orientation);
     setBufferRotation(rotated);
 
-    uint32_t w = rotated ? info->h : info->w;
-    uint32_t h = rotated ? info->w : info->h;
+    uint32_t w = rotated ? config->resolution.height : config->resolution.width;
+    uint32_t h = rotated ? config->resolution.width : config->resolution.height;
 
     if (w != mSourceWidth || h != mSourceHeight) {
         ALOGV("Display dimensions changed: old=(%dx%d) new=(%dx%d)", mSourceWidth, mSourceHeight, w,
diff --git a/src/AndroidPixelBuffer.h b/src/AndroidPixelBuffer.h
index 44e7dbdda4a3897d2de0f018ac5038a649ef3031..174665fe66b95caa1551d17eb322599907a563f1 100644
--- a/src/AndroidPixelBuffer.h
+++ b/src/AndroidPixelBuffer.h
@@ -21,7 +21,9 @@
 #include <utils/Mutex.h>
 #include <utils/RefBase.h>
 
+#include <ui/DisplayConfig.h>
 #include <ui/DisplayInfo.h>
+#include <ui/DisplayState.h>
 #include <ui/Rect.h>
 
 #include <rfb/PixelBuffer.h>
@@ -35,7 +37,7 @@ class AndroidPixelBuffer : public RefBase, public rfb::ManagedPixelBuffer {
   public:
     AndroidPixelBuffer();
 
-    virtual void setDisplayInfo(DisplayInfo* info);
+    virtual void setDisplayInfo(DisplayConfig* config, ui::DisplayState* state);
 
     virtual void setWindowSize(uint32_t width, uint32_t height);
 
@@ -61,7 +63,7 @@ class AndroidPixelBuffer : public RefBase, public rfb::ManagedPixelBuffer {
     void reset();
 
   private:
-    static bool isDisplayRotated(uint8_t orientation);
+    static bool isDisplayRotated(ui::Rotation orientation);
 
     virtual void setBufferRotation(bool rotated);
 
diff --git a/src/VirtualDisplay.cpp b/src/VirtualDisplay.cpp
index 1854a55655237205457de80454e3264ff5548454..1f616d1550b9de5912211573d9cc1f58451b8231 100644
--- a/src/VirtualDisplay.cpp
+++ b/src/VirtualDisplay.cpp
@@ -22,20 +22,21 @@
 #include <gui/CpuConsumer.h>
 #include <gui/IGraphicBufferConsumer.h>
 #include <gui/SurfaceComposerClient.h>
-
+#include <input/DisplayViewport.h>
 #include "VirtualDisplay.h"
 
 using namespace vncflinger;
 
-VirtualDisplay::VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t height,
+VirtualDisplay::VirtualDisplay(DisplayConfig* config, ui::DisplayState* state,
+                               uint32_t width, uint32_t height,
                                sp<CpuConsumer::FrameAvailableListener> listener) {
     mWidth = width;
     mHeight = height;
 
-    if (info->orientation == DISPLAY_ORIENTATION_0 || info->orientation == DISPLAY_ORIENTATION_180) {
-        mSourceRect = Rect(info->w, info->h);
+    if (state->orientation == ui::ROTATION_0 || state->orientation == ui::ROTATION_180) {
+        mSourceRect = Rect(config->resolution.width, config->resolution.height);
     } else {
-        mSourceRect = Rect(info->h, info->w);
+        mSourceRect = Rect(config->resolution.height, config->resolution.width);
     }
 
     Rect displayRect = getDisplayRect();
@@ -54,7 +55,7 @@ VirtualDisplay::VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t heigh
 
     SurfaceComposerClient::Transaction t;
     t.setDisplaySurface(mDisplayToken, mProducer);
-    t.setDisplayProjection(mDisplayToken, 0, mSourceRect, displayRect);
+    t.setDisplayProjection(mDisplayToken, state->orientation, mSourceRect, displayRect);
     t.setDisplayLayerStack(mDisplayToken, 0);  // default stack
     t.apply();
 
diff --git a/src/VirtualDisplay.h b/src/VirtualDisplay.h
index 02a85c7025f0fa0a211f8a57ee2f2deda7688ceb..cd2356ede3dfdd906fdc7daa13929884c40c0699 100644
--- a/src/VirtualDisplay.h
+++ b/src/VirtualDisplay.h
@@ -23,7 +23,9 @@
 #include <gui/CpuConsumer.h>
 #include <gui/IGraphicBufferProducer.h>
 
+#include <ui/DisplayConfig.h>
 #include <ui/DisplayInfo.h>
+#include <ui/DisplayState.h>
 #include <ui/Rect.h>
 
 using namespace android;
@@ -32,7 +34,8 @@ namespace vncflinger {
 
 class VirtualDisplay : public RefBase {
   public:
-    VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t height,
+    VirtualDisplay(DisplayConfig *config, ui::DisplayState* state,
+                   uint32_t width, uint32_t height,
                    sp<CpuConsumer::FrameAvailableListener> listener);
 
     virtual ~VirtualDisplay();