diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index 9ee61f1..a47a17b 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -126,6 +126,11 @@ GtkCellRenderer  *_gtk_tree_view_column_get_cell_at_pos  (GtkTreeViewColumn  *co
                                                           GdkRectangle       *background_area,
                                                           gint                x,
                                                           gint                y);
+gboolean          _gtk_tree_view_column_is_blank_at_pos  (GtkTreeViewColumn  *column,
+                                                          GdkRectangle       *cell_area,
+                                                          GdkRectangle       *background_area,
+                                                          gint                x,
+                                                          gint                y);
 
 void		  _gtk_tree_view_column_cell_render      (GtkTreeViewColumn  *tree_column,
 							  cairo_t            *cr,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 41769b1..c40f2cc 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -13995,7 +13995,6 @@ gtk_tree_view_get_visible_range (GtkTreeView  *tree_view,
         y = tree_view->priv->height - 1;
       else
         y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, tree_view->priv->vadjustment->page_size) - 1;
-
       _gtk_rbtree_find_offset (tree_view->priv->tree, y, &tree, &node);
       if (node)
         *end_path = _gtk_tree_view_find_path (tree_view, tree, node);
@@ -14006,6 +14005,68 @@ gtk_tree_view_get_visible_range (GtkTreeView  *tree_view,
   return retval;
 }
 
+/**
+ * gtk_tree_view_is_blank_at_pos:
+ * FIXME
+ *
+ * Coordinates are in bin_window coords, just like
+ * gtk_tree_view_get_path_at_pos().
+ *
+ * Since: 3.0
+ */
+gboolean
+gtk_tree_view_is_blank_at_pos (GtkTreeView *tree_view,
+                               gint         x,
+                               gint         y)
+{
+  GtkRBTree *tree;
+  GtkRBNode *node;
+  GtkTreeIter iter;
+  GtkTreePath *path;
+  GtkTreeViewColumn *column;
+  GdkRectangle cell_area, background_area;
+
+  g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
+
+  if (!gtk_tree_view_get_path_at_pos (tree_view, x, y,
+                                      &path, &column, NULL, NULL))
+    /* If there's no path here, it is blank */
+    return TRUE;
+
+  gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
+  _gtk_tree_view_find_node (tree_view, path, &tree, &node);
+
+  if (column == tree_view->priv->expander_column
+      && gtk_tree_view_draw_expanders (tree_view))
+    {
+      gboolean over_arrow;
+
+      over_arrow = coords_are_over_arrow (tree_view, tree, node, x, y);
+
+      if (over_arrow)
+        {
+          gtk_tree_path_free (path);
+          return FALSE;
+        }
+    }
+
+  gtk_tree_view_column_cell_set_cell_data (column,
+                                           tree_view->priv->model,
+                                           &iter,
+                                           GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
+                                           node->children ? TRUE : FALSE);
+
+  gtk_tree_view_get_background_area (tree_view, path, column, &background_area);
+  gtk_tree_view_get_cell_area (tree_view, path, column, &cell_area);
+
+  gtk_tree_path_free (path);
+
+  return _gtk_tree_view_column_is_blank_at_pos (column,
+                                                &cell_area,
+                                                &background_area,
+                                                x, y);
+}
+
 static void
 unset_reorderable (GtkTreeView *tree_view)
 {
diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h
index a828a40..dbb40f9 100644
--- a/gtk/gtktreeview.h
+++ b/gtk/gtktreeview.h
@@ -336,6 +336,9 @@ void                   gtk_tree_view_get_visible_rect              (GtkTreeView
 gboolean               gtk_tree_view_get_visible_range             (GtkTreeView               *tree_view,
 								    GtkTreePath              **start_path,
 								    GtkTreePath              **end_path);
+gboolean               gtk_tree_view_is_blank_at_pos               (GtkTreeView               *tree_view,
+                                                                    gint                       x,
+                                                                    gint                       y);
 
 /* Drag-and-Drop support */
 void                   gtk_tree_view_enable_model_drag_source      (GtkTreeView               *tree_view,
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index 905a7bb..91c6c5b 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -1515,6 +1515,45 @@ _gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column,
   return match;
 }
 
+gboolean
+_gtk_tree_view_column_is_blank_at_pos (GtkTreeViewColumn *column,
+                                       GdkRectangle      *cell_area,
+                                       GdkRectangle      *background_area,
+                                       gint               x,
+                                       gint               y)
+{
+  GtkCellRenderer *match;
+  GdkRectangle cell_alloc, aligned_area, inner_area;
+  GtkTreeViewColumnPrivate *priv = column->priv;
+
+  match = _gtk_tree_view_column_get_cell_at_pos (column,
+                                                 cell_area,
+                                                 background_area,
+                                                 x, y);
+  if (!match)
+    return FALSE;
+
+  gtk_cell_area_get_cell_allocation (priv->cell_area,
+                                     priv->cell_area_context,
+                                     priv->tree_view,
+                                     match,
+                                     cell_area,
+                                     &cell_alloc);
+
+  gtk_cell_area_inner_cell_area (priv->cell_area, priv->tree_view,
+                                 &cell_alloc, &inner_area);
+  gtk_cell_renderer_get_aligned_area (match, priv->tree_view, 0,
+                                      &inner_area, &aligned_area);
+
+  if (x < aligned_area.x ||
+      x > aligned_area.x + aligned_area.width ||
+      y < aligned_area.y ||
+      y > aligned_area.y + aligned_area.height)
+    return TRUE;
+
+  return FALSE;
+}
+
 /* Public Functions */
 
 
