diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp
index 6ba15e3e2b69af944420b2fd422adf8919273cae..e61d613bccbbb3bd6592cc4b089e81ae07f789ae 100644
--- a/src/board/UBBoardController.cpp
+++ b/src/board/UBBoardController.cpp
@@ -152,6 +152,8 @@ void UBBoardController::init()
 
     setActiveDocumentScene(doc);
 
+    initBackgroundGridSize();
+
     undoRedoStateChange(true);
 
 }
@@ -162,6 +164,35 @@ UBBoardController::~UBBoardController()
     delete mDisplayView;
 }
 
+/**
+ * @brief Set the default background grid size to appear as roughly 1cm on screen
+ */
+void UBBoardController::initBackgroundGridSize()
+{
+    // Besides adjusting for DPI, we also need to scale the grid size by the ratio of the control view size
+    // to document size. However the control view isn't available as soon as the boardController is created,
+    // so we approximate this ratio as (document resolution) / (screen resolution).
+    // Later on, this is calculated by `updateSystemScaleFactor` and stored in `mSystemScaleFactor`.
+
+    QDesktopWidget* desktop = UBApplication::desktop();
+    qreal dpi = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2.;
+
+    //qDebug() << "dpi: " << dpi;
+
+    // The display manager isn't initialized yet so we have to just assume the control view is on the main display
+    qreal screenY = desktop->screenGeometry(mControlView).height();
+    qreal documentY = mActiveScene->nominalSize().height();
+    qreal resolutionRatio = documentY / screenY;
+
+    //qDebug() << "resolution ratio: " << resolutionRatio;
+
+    int gridSize = (resolutionRatio * 10. * dpi) / UBGeometryUtils::inchSize;
+
+    UBSettings::settings()->crossSize = gridSize;
+    mActiveScene->setBackgroundGridSize(gridSize);
+
+    //qDebug() << "grid size: " << gridSize;
+}
 
 int UBBoardController::currentPage()
 {
diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h
index 5631299ab286667c54f43e19a10add5d7b113595..1b66c1e8ed0d1f6d4395ba80c94623c333863c77 100644
--- a/src/board/UBBoardController.h
+++ b/src/board/UBBoardController.h
@@ -284,6 +284,7 @@ class UBBoardController : public UBDocumentContainer
         void appMainModeChanged(UBApplicationController::MainMode);
 
     private:
+        void initBackgroundGridSize();
         void updatePageSizeState();
         void saveViewState();
         void adjustDisplayViews();
diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp
index 096a489802f8f3c3ddba307400eb6831235016fb..0926ec91185a32e0abfb1f26ea7353343c238094 100644
--- a/src/board/UBBoardView.cpp
+++ b/src/board/UBBoardView.cpp
@@ -1607,20 +1607,22 @@ void UBBoardView::drawBackground (QPainter *painter, const QRectF &rect)
             bgCrossColor.setAlpha (alpha); // fade the crossing on small zooms
         }
 
+        qreal gridSize = scene()->backgroundGridSize();
+
         painter->setPen (bgCrossColor);
 
         if (scene () && scene ()->pageBackground() == UBPageBackground::crossed)
         {
-            qreal firstY = ((int) (rect.y () / scene()->backgroundGridSize())) * scene()->backgroundGridSize();
+            qreal firstY = ((int) (rect.y () / gridSize)) * gridSize;
 
-            for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += scene()->backgroundGridSize())
+            for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += gridSize)
             {
                 painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos);
             }
 
-            qreal firstX = ((int) (rect.x () / scene()->backgroundGridSize())) * scene()->backgroundGridSize();
+            qreal firstX = ((int) (rect.x () / gridSize)) * gridSize;
 
-            for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += scene()->backgroundGridSize())
+            for (qreal xPos = firstX; xPos < rect.x () + rect.width (); xPos += gridSize)
             {
                 painter->drawLine (xPos, rect.y (), xPos, rect.y () + rect.height ());
             }
@@ -1628,9 +1630,9 @@ void UBBoardView::drawBackground (QPainter *painter, const QRectF &rect)
 
         if (scene() && scene()->pageBackground() == UBPageBackground::ruled)
         {
-            qreal firstY = ((int) (rect.y () / scene()->backgroundGridSize())) * scene()->backgroundGridSize();
+            qreal firstY = ((int) (rect.y () / gridSize)) * gridSize;
 
-            for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += scene()->backgroundGridSize())
+            for (qreal yPos = firstY; yPos < rect.y () + rect.height (); yPos += gridSize)
             {
                 painter->drawLine (rect.x (), yPos, rect.x () + rect.width (), yPos);
             }
diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp
index 373a9062e6e3ff97be8bf5dcc69636b8905624cb..fc9e2b5531f13e62c6812017f710b80d601f3577 100644
--- a/src/core/UBSettings.cpp
+++ b/src/core/UBSettings.cpp
@@ -48,7 +48,7 @@ QPointer<UBSettings> UBSettings::sSingleton = 0;
 int UBSettings::pointerDiameter = 40;
 int UBSettings::crossSize = 24;
 int UBSettings::minCrossSize = 12;
-int UBSettings::maxCrossSize = 64;
+int UBSettings::maxCrossSize = 96; //TODO: user-settable?
 int UBSettings::colorPaletteSize = 5;
 int UBSettings::objectFrameWidth = 20;
 int UBSettings::boardMargin = 10;
diff --git a/src/tools/UBAbstractDrawRuler.h b/src/tools/UBAbstractDrawRuler.h
index 73c10d05c3da0be47fce119c6a563b5af2a9e8ce..caf84821e3270b7b5f37027b422d01ea26677d42 100644
--- a/src/tools/UBAbstractDrawRuler.h
+++ b/src/tools/UBAbstractDrawRuler.h
@@ -92,7 +92,7 @@ protected:
     static const int sFillTransparency;
     static const int sDrawTransparency;
     static const int sRoundingRadius;
-    int sPixelsPerCentimeter;
+    qreal sPixelsPerCentimeter;
 };
 
 #endif
diff --git a/src/tools/UBGraphicsRuler.cpp b/src/tools/UBGraphicsRuler.cpp
index 65965fcf7879876e2295426fad2a7388b2612738..66f287b79259ebce7254d4acadf23c1015a5298b 100644
--- a/src/tools/UBGraphicsRuler.cpp
+++ b/src/tools/UBGraphicsRuler.cpp
@@ -180,7 +180,7 @@ void UBGraphicsRuler::paintGraduations(QPainter *painter)
     // Update the width of one "centimeter" to correspond to the width of the background grid (whether it is displayed or not)
     sPixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize();
 
-    double pixelsPerMillimeter = double(sPixelsPerCentimeter)/10.0;
+    qreal pixelsPerMillimeter = sPixelsPerCentimeter/10.0;
     int rulerLengthInMillimeters = (rect().width() - sLeftEdgeMargin - sRoundingRadius)/pixelsPerMillimeter;
 
     // When a "centimeter" is too narrow, we only display every 5th number, and every 5th millimeter mark
diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp
index 7ee4f553981f8a93af832d18d811850efb9bef7e..6d58bb3f5ed09c68a062c918dd90fad4b0421992 100644
--- a/src/tools/UBGraphicsTriangle.cpp
+++ b/src/tools/UBGraphicsTriangle.cpp
@@ -351,7 +351,7 @@ void UBGraphicsTriangle::paintGraduations(QPainter *painter)
 
     // Update the width of one "centimeter" to correspond to the width of the background grid (whether it is displayed or not)
     sPixelsPerCentimeter = UBApplication::boardController->activeScene()->backgroundGridSize();
-    double pixelsPerMillimeter = double(sPixelsPerCentimeter)/10.0;
+    double pixelsPerMillimeter = sPixelsPerCentimeter/10.0;
 
     // When a "centimeter" is too narrow, we only display every 5th number, and every 5th millimeter mark
     double numbersWidth = fontMetrics.width("00");