--- /dev/null
+diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
+index 6fbf613..88c8a56 100644
+--- a/hw/xfree86/common/xf86Config.c
++++ b/hw/xfree86/common/xf86Config.c
+@@ -703,7 +703,8 @@ typedef enum {
+ FLAG_AUTO_ENABLE_DEVICES,
+ FLAG_GLX_VISUALS,
+ FLAG_DRI2,
+- FLAG_USE_SIGIO
++ FLAG_USE_SIGIO,
++ FLAG_DONTLIE
+ } FlagValues;
+
+ /**
+@@ -767,6 +768,8 @@ static OptionInfoRec FlagOptions[] = {
+ {0}, FALSE },
+ { FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN,
+ {0}, FALSE },
++ { FLAG_DONTLIE, "DontLie", OPTV_BOOLEAN,
++ {0}, FALSE },
+ { -1, NULL, OPTV_NONE,
+ {0}, FALSE },
+ };
+@@ -824,6 +827,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
+ xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch);
+ xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap);
+ xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom);
++ xf86GetOptValBool(FlagOptions, FLAG_DONTLIE, &xf86Info.dontLie);
+
+ xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
+ if (xf86Info.ignoreABI) {
+diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
+index 98f8284..c7d03a4 100644
+--- a/hw/xfree86/common/xf86Globals.c
++++ b/hw/xfree86/common/xf86Globals.c
+@@ -110,6 +110,7 @@ xf86InfoRec xf86Info = {
+ .dontVTSwitch = FALSE,
+ .dontZap = FALSE,
+ .dontZoom = FALSE,
++ .dontLie = FALSE,
+ .notrapSignals = FALSE,
+ .caughtSignal = FALSE,
+ .currentScreen = NULL,
+diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
+index b2095aa..05166f9 100644
+--- a/hw/xfree86/common/xf86Privstr.h
++++ b/hw/xfree86/common/xf86Privstr.h
+@@ -68,6 +68,8 @@ typedef struct {
+ Bool dontVTSwitch;
+ Bool dontZap;
+ Bool dontZoom;
++ Bool dontLie;
++
+ Bool notrapSignals; /* don't exit cleanly - die at fault */
+ Bool caughtSignal;
+
+diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre
+index 942c397..dd1269c 100644
+--- a/hw/xfree86/doc/man/xorg.conf.man.pre
++++ b/hw/xfree86/doc/man/xorg.conf.man.pre
+@@ -490,6 +490,12 @@ When this option is enabled, those key sequences have no special meaning
+ and are passed to clients.
+ Default: off.
+ .TP 7
++.BI "Option \*qDontLie\*q \*q" boolean \*q
++This option suggests that the server should avoid lying whenever possible.
++Currently this means that RandR 1.2 drivers will try to compute the proper DPI
++instead of making it up.
++Default: off.
++.TP 7
+ .BI "Option \*qDisableVidModeExtension\*q \*q" boolean \*q
+ This disables the parts of the VidMode extension used by the xvidtune client
+ that can be used to change the video modes.
+diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
+index 1fc63c4..5d8bc29 100644
+--- a/hw/xfree86/modes/xf86RandR12.c
++++ b/hw/xfree86/modes/xf86RandR12.c
+@@ -806,6 +806,7 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
+ else
+ {
+ xf86OutputPtr output = config->output[config->compat_output];
++ xf86CrtcPtr crtc = output->crtc;
+
+ if (output->conf_monitor &&
+ (output->conf_monitor->mon_width > 0 &&
+@@ -817,6 +818,17 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
+ mmWidth = output->conf_monitor->mon_width;
+ mmHeight = output->conf_monitor->mon_height;
+ }
++ else if (xf86Info.dontLie && crtc && crtc->mode.HDisplay &&
++ output->mm_width && output->mm_height)
++ {
++ /*
++ * If the output has a mode and a declared size, use that
++ * to scale the screen size
++ */
++ DisplayModePtr mode = &crtc->mode;
++ mmWidth = output->mm_width * width / mode->HDisplay;
++ mmHeight = output->mm_height * height / mode->VDisplay;
++ }
+ else
+ {
+ /*