diff --git a/goffice/graph/gog-renderer.c b/goffice/graph/gog-renderer.c
index ec70363..1677151 100644
--- a/goffice/graph/gog-renderer.c
+++ b/goffice/graph/gog-renderer.c
@@ -94,6 +94,7 @@ struct _GogRenderer {
 	gboolean	 marker_as_surface;
 	cairo_surface_t *marker_surface;
 	double		 marker_offset;
+	GOMarker	*marker;
 };
 
 typedef struct {
@@ -777,7 +778,7 @@ gog_renderer_draw_selection_rectangle (GogRenderer *renderer, GogViewAllocation
 static cairo_surface_t *
 _get_marker_surface (GogRenderer *rend)
 {
-	GOMarker *marker = rend->cur_style->marker.mark;
+	GOMarker *marker = rend->marker;
 	double width;
 
 	if (rend->marker_surface != NULL)
@@ -803,8 +804,17 @@ gog_renderer_draw_marker (GogRenderer *rend, double x, double y)
 	g_return_if_fail (GOG_IS_RENDERER (rend));
 	g_return_if_fail (rend->cur_style != NULL);
 
+	if (rend->marker == NULL) {
+		if (rend->cur_style->marker.auto_fill_color &&
+		    !go_marker_is_closed_shape (rend->cur_style->marker.mark)) {
+			rend->marker = go_marker_dup (rend->cur_style->marker.mark);
+			go_marker_set_fill_color (rend->marker, 0);
+		} else
+			rend->marker = g_object_ref (rend->cur_style->marker.mark);
+	}
+
 	if (rend->is_vector && !rend->marker_as_surface) {
-		go_marker_render (rend->cur_style->marker.mark, rend->cairo,
+		go_marker_render (rend->marker, rend->cairo,
 				  x, y, rend->scale);
 		return;
 	}
@@ -1262,6 +1272,10 @@ _free_marker_data (GogRenderer *rend)
 		cairo_surface_destroy (rend->marker_surface);
 		rend->marker_surface = NULL;
 	}
+	if (rend->marker) {
+		g_object_unref (rend->marker);
+		rend->marker = NULL;
+	}
 }
 
 void
diff --git a/goffice/graph/gog-theme.c b/goffice/graph/gog-theme.c
index 23582f1..d9d7d4d 100644
--- a/goffice/graph/gog-theme.c
+++ b/goffice/graph/gog-theme.c
@@ -1024,13 +1024,6 @@ map_marker (GOStyleMark *mark, unsigned shape, unsigned palette_index,
 		GO_MARKER_CROSS,	GO_MARKER_HALF_BAR,
 		GO_MARKER_BAR
 	};
-	static gboolean const shape_is_fill_transparent [] = {
-		TRUE,	TRUE,
-		TRUE,	FALSE,
-		FALSE,	TRUE,
-		FALSE,	TRUE,
-		TRUE
-	};
 
 	if (shape >= G_N_ELEMENTS (shape_palette))
 		shape %= G_N_ELEMENTS (shape_palette);
@@ -1041,9 +1034,7 @@ map_marker (GOStyleMark *mark, unsigned shape, unsigned palette_index,
 		go_marker_set_outline_color (mark->mark,
 			palette [palette_index]);
 	if (mark->auto_fill_color)
-		go_marker_set_fill_color (mark->mark,
-			shape_is_fill_transparent [shape]
-			? palette [palette_index] : 0);
+		go_marker_set_fill_color (mark->mark, palette [palette_index]);
 }
 
 static GOColor const default_palette [] = {
diff --git a/goffice/gtk/go-marker-selector.c b/goffice/gtk/go-marker-selector.c
index 0e464d6..2ba5a78 100644
--- a/goffice/gtk/go-marker-selector.c
+++ b/goffice/gtk/go-marker-selector.c
@@ -26,6 +26,7 @@
 typedef struct {
 	GOColor outline_color;
 	GOColor fill_color;
+	gboolean auto_fill;
 } GOMarkerSelectorState;
 
 static void
@@ -42,10 +43,10 @@ go_marker_palette_render_func (cairo_t *cr,
 		return;
 
 	marker = go_marker_new ();
-	go_marker_set_fill_color (marker, state->fill_color);
 	go_marker_set_outline_color (marker, state->outline_color);
 	go_marker_set_size (marker, size);
 	go_marker_set_shape (marker, index);
+	go_marker_set_fill_color (marker, (state->auto_fill && !go_marker_is_closed_shape (marker))? 0: state->fill_color);
 
 	cairo_set_line_width (cr, 1);
 	cairo_set_source_rgb (cr, 1., 1., 1.);
@@ -129,3 +130,21 @@ go_marker_selector_set_shape (GOSelector *selector, GOMarkerShape shape)
 				CLAMP (shape, 0, GO_MARKER_MAX - 1));
 	go_selector_update_swatch (selector);
 }
+
+
+/**
+ * go_marker_selector_set_auto_fill:
+ * @selector: a #GOSelector
+ * @auto_fill: whether to use a transparent color for opened markers such as
+ * cross, x, or asterisk.
+ *
+ **/
+void
+go_marker_selector_set_auto_fill (GOSelector *selector, gboolean auto_fill)
+{
+	GOMarkerSelectorState *state;
+	g_return_if_fail (GO_IS_SELECTOR (selector));
+	state = go_selector_get_user_data (selector);
+	g_return_if_fail (state != NULL);
+	state->auto_fill = auto_fill;
+}
diff --git a/goffice/gtk/go-marker-selector.h b/goffice/gtk/go-marker-selector.h
index e5bf59c..1628ce3 100644
--- a/goffice/gtk/go-marker-selector.h
+++ b/goffice/gtk/go-marker-selector.h
@@ -33,6 +33,8 @@ void 		 go_marker_selector_set_colors  (GOSelector *selector,
 						 GOColor fill);
 void		 go_marker_selector_set_shape   (GOSelector *selector,
 						 GOMarkerShape shape);
+void		 go_marker_selector_set_auto_fill (GOSelector *selector,
+		                 gboolean auto_fill);
 
 G_END_DECLS
 
diff --git a/goffice/utils/go-marker.c b/goffice/utils/go-marker.c
index 38ff3e0..71e2f5c 100644
--- a/goffice/utils/go-marker.c
+++ b/goffice/utils/go-marker.c
@@ -171,6 +171,20 @@ go_marker_set_shape (GOMarker *marker, GOMarkerShape shape)
 	marker->shape = shape;
 }
 
+gboolean
+go_marker_is_closed_shape (GOMarker const *m)
+{
+	g_return_val_if_fail (GO_IS_MARKER (m), FALSE);
+	switch (m->shape) {
+	case GO_MARKER_X:
+	case GO_MARKER_CROSS:
+	case GO_MARKER_ASTERISK:
+		return FALSE;
+	default:
+		return TRUE;
+	}
+}
+
 GOColor
 go_marker_get_outline_color (GOMarker const *marker)
 {
diff --git a/goffice/utils/go-marker.h b/goffice/utils/go-marker.h
index a13a447..f995bd2 100644
--- a/goffice/utils/go-marker.h
+++ b/goffice/utils/go-marker.h
@@ -56,6 +56,7 @@ GOMarkerShape    go_marker_shape_from_str       (char const *name);
 char const      *go_marker_shape_as_str         (GOMarkerShape shape);
 GOMarkerShape 	 go_marker_get_shape		(GOMarker const *m);
 void 		 go_marker_set_shape 		(GOMarker *m, GOMarkerShape shape);
+gboolean	 go_marker_is_closed_shape		(GOMarker const *m);
 GOColor 	 go_marker_get_outline_color	(GOMarker const *m);
 void		 go_marker_set_outline_color	(GOMarker *m, GOColor color);
 GOColor		 go_marker_get_fill_color	(GOMarker const *m);
diff --git a/goffice/utils/go-style.c b/goffice/utils/go-style.c
index f0f7372..ab6310d 100644
--- a/goffice/utils/go-style.c
+++ b/goffice/utils/go-style.c
@@ -787,6 +787,7 @@ cb_marker_fill_color_changed (GOSelector *selector,
 	color = go_color_selector_get_color (selector, &is_auto);
 	go_marker_set_fill_color (style->marker.mark, color);
 	style->marker.auto_fill_color = is_auto;
+	go_marker_selector_set_auto_fill (GO_SELECTOR (state->marker.selector), is_auto);
 	set_style (state);
 
 	go_marker_selector_set_colors (GO_SELECTOR (state->marker.selector),
@@ -831,6 +832,7 @@ marker_init (StylePrefState *state, gboolean enable, GOEditor *editor, GOCmdCont
 	else
 		go_marker_selector_set_colors (GO_SELECTOR (selector),
 					       GO_COLOR_BLUE, GO_COLOR_BLUE);
+	go_marker_selector_set_auto_fill (GO_SELECTOR (selector), style->marker.auto_fill_color);
 	w = go_gtk_builder_get_widget (gui, "marker_shape_label");
 	gtk_label_set_mnemonic_widget (GTK_LABEL (w), selector);
 	gtk_grid_attach (GTK_GRID (grid), selector, 1, 1, 1, 1);
