Index: plugins/grid/Grid.cpp
===================================================================
--- plugins/grid/Grid.cpp	(revision 6271)
+++ plugins/grid/Grid.cpp	(working copy)
@@ -20,6 +20,8 @@
 
 	namespace {
 		const std::string RKEY_DEFAULT_GRID_SIZE = "user/ui/grid/defaultGridPower";
+		const std::string RKEY_GRID_LOOK_MAJOR = "user/ui/grid/majorGridLook";
+		const std::string RKEY_GRID_LOOK_MINOR = "user/ui/grid/minorGridLook";
 	}
 
 class GridManager :
@@ -150,6 +152,17 @@
 		PreferencesPagePtr page = GlobalPreferenceSystem().getPage(_("Settings/Grid"));
 
 		page->appendCombo(_("Default Grid Size"), RKEY_DEFAULT_GRID_SIZE, getGridList());
+
+		ComboBoxValueList looks;
+
+		looks.push_back(_("Lines"));
+		looks.push_back(_("Dots"));
+		looks.push_back(_("Dotted Lines"));
+		looks.push_back(_("More Dotted Lines"));
+		looks.push_back(_("Crosses"));
+
+		page->appendCombo(_("Major Grid Style"), RKEY_GRID_LOOK_MAJOR, looks);
+		page->appendCombo(_("Minor Grid Style"), RKEY_GRID_LOOK_MINOR, looks);
 	}
 
 	std::size_t addGridChangeCallback(const GridChangedFunc& callback)
@@ -219,6 +232,21 @@
 		GlobalMainFrame().updateAllWindows();
 	}
 
+	static GridLook getLookFromNumber(int i) {
+		if (i >= 0 and i < sizeof(int2gridlook) / sizeof(GridLook)) {
+			return int2gridlook[i];
+		}
+		return GRIDLOOK_LINES;
+	}
+
+	GridLook getMajorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MAJOR) );
+	}
+
+	GridLook getMinorLook() const {
+		return getLookFromNumber( GlobalRegistry().getInt(RKEY_GRID_LOOK_MINOR) );
+	}
+
 }; // class GridManager
 typedef boost::shared_ptr<GridManager> GridManagerPtr;
 
Index: radiant/xyview/XYWnd.cpp
===================================================================
--- radiant/xyview/XYWnd.cpp	(revision 6271)
+++ radiant/xyview/XYWnd.cpp	(working copy)
@@ -896,42 +896,93 @@
 		Vector3 colourGridMinor = ColourSchemes().getColour("grid_minor");
 		Vector3 colourGridMajor = ColourSchemes().getColour("grid_major");
 
-		// draw minor blocks
-		if (colourGridMinor != colourGridBack) {
-			glColor3dv(colourGridMinor);
-
-			glBegin (GL_LINES);
-			int i = 0;
-			for (x = xb ; x < xe ; x += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (x, yb);
-					glVertex2d (x, ye);
-				}
+		// run grid rendering twice, first run is minor grid, then major
+		// NOTE: with a bit more work, we can have variable number of grids
+		for (int gf = 0 ; gf < 2 ; ++gf ) {
+			double cur_step, density, sizeFactor;
+			GridLook look;
+
+			if (gf) {
+				// major grid
+				if (colourGridMajor == colourGridBack)
+					continue;
+
+				glColor3dv(colourGridMajor);
+				look = GlobalGrid().getMajorLook();
+				cur_step = step;
+				density = 4;
+				// slightly bigger crosses
+				sizeFactor = 1.95;
+			} else {
+				// minor grid (rendered first)
+				if (colourGridMinor == colourGridBack)
+					continue;
+				glColor3dv(colourGridMinor);
+				look = GlobalGrid().getMinorLook();
+				cur_step = minor_step;
+				density = 4;
+				sizeFactor = 0.95;
 			}
-			i = 0;
-			for (y = yb ; y < ye ; y += minor_step, ++i) {
-				if ((i & mask) != 0) {
-					glVertex2d (xb, y);
-					glVertex2d (xe, y);
-				}
-			}
-			glEnd();
-		}
 
-		// draw major blocks
-		if (colourGridMajor != colourGridBack) {
-			glColor3dv(colourGridMajor);
-
-			glBegin (GL_LINES);
-			for (x=xb ; x<=xe ; x+=step) {
-				glVertex2d (x, yb);
-				glVertex2d (x, ye);
-			}
-			for (y=yb ; y<=ye ; y+=step) {
-				glVertex2d (xb, y);
-				glVertex2d (xe, y);
+			switch (look) {
+				case GRIDLOOK_DOTS:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += cur_step) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_MOREDOTLINES:
+					density = 8;
+				case GRIDLOOK_DOTLINES:
+					glBegin (GL_POINTS);
+					for (x = xb ; x < xe ; x += cur_step) {
+						for (y = yb ; y < ye ; y += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+
+					for (y = yb ; y < ye ; y += cur_step) {
+						for (x = xb ; x < xe ; x += minor_step / density) {
+							glVertex2d (x, y);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_CROSSES:
+					glBegin (GL_LINES);
+					for (x=xb ; x<=xe ; x+=cur_step) {
+						for (y=yb ; y<=ye ; y+=cur_step) {
+							glVertex2d (x - sizeFactor / m_fScale, y);
+							glVertex2d (x + sizeFactor / m_fScale, y);
+							glVertex2d (x, y - sizeFactor / m_fScale);
+							glVertex2d (x, y + sizeFactor / m_fScale);
+						}
+					}
+					glEnd();
+					break;
+				case GRIDLOOK_LINES:
+				default:
+					glBegin (GL_LINES);
+					int i = 0;
+					for (x = xb ; x < xe ; x += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (x, yb);
+							glVertex2d (x, ye);
+						}
+					}
+					i = 0;
+					for (y = yb ; y < ye ; y += cur_step, ++i) {
+						if ((i & mask) != 0) {
+							glVertex2d (xb, y);
+							glVertex2d (xe, y);
+						}
+					}
+					glEnd();
+					break;
 			}
-			glEnd();
 		}
 	}
 
Index: include/igrid.h
===================================================================
--- include/igrid.h	(revision 6271)
+++ include/igrid.h	(working copy)
@@ -24,6 +24,24 @@
 	GRID_256 = 8,
 };
 
+
+// grid renderings
+enum GridLook {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES,
+};
+
+static const GridLook int2gridlook[] = {
+	GRIDLOOK_LINES,
+	GRIDLOOK_DOTS,
+	GRIDLOOK_DOTLINES,
+	GRIDLOOK_MOREDOTLINES,
+	GRIDLOOK_CROSSES
+};
+
 const std::string MODULE_GRID("Grid");
 
 class IGridManager :
@@ -38,6 +56,9 @@
 	virtual void gridDown() = 0;
 	virtual void gridUp() = 0;
 
+	virtual GridLook getMajorLook() const = 0;
+	virtual GridLook getMinorLook() const = 0;
+
 	typedef boost::function<void()> GridChangedFunc;
 	virtual std::size_t addGridChangeCallback(const GridChangedFunc& callback) = 0;
 }; // class IGridManager
