diff --git a/plugins/applix/applix-read.c b/plugins/applix/applix-read.c
index aeda6b5..8427a29 100644
--- a/plugins/applix/applix-read.c
+++ b/plugins/applix/applix-read.c
@@ -397,7 +397,7 @@ applix_read_colormap (ApplixReadState *state)
 
 			/* Store the result */
 			g_ptr_array_add	(state->colors,
-					 style_color_new_i8 (r, g, b));
+					 style_color_new_rgb8 (r, g, b));
 #if 0
 			printf ("'%s' %ld %ld %ld %ld\n", buffer, numbers[1],
 				numbers[2], numbers[3], numbers[4]);
diff --git a/plugins/excel/excel-xml-read.c b/plugins/excel/excel-xml-read.c
index 7b5d011..05274b9 100644
--- a/plugins/excel/excel-xml-read.c
+++ b/plugins/excel/excel-xml-read.c
@@ -230,7 +230,7 @@ parse_color (GsfXMLIn *xin, xmlChar const *str, char const *name)
 	g_return_val_if_fail (str != NULL, NULL);
 
 	if (3 == sscanf (str, "#%2x%2x%2x", &r, &g, &b))
-		return style_color_new_i8 (r, g, b);
+		return style_color_new_rgb8 (r, g, b);
 
 	xl_xml_warning (xin, "Invalid attribute '%s', expected color, received '%s'",
 			name, str);
diff --git a/plugins/excel/ms-excel-read.c b/plugins/excel/ms-excel-read.c
index dd55c63..bdc5161 100644
--- a/plugins/excel/ms-excel-read.c
+++ b/plugins/excel/ms-excel-read.c
@@ -1858,12 +1858,12 @@ excel_palette_get (GnmXLImporter *importer, gint idx)
 	case 80 : /* tooltip background */
 		return style_color_new_gdk (&gs_yellow);
 
-	case 2 : return style_color_new_i8 (0xff,    0,    0); /* red */
-	case 3 : return style_color_new_i8 (   0, 0xff,    0); /* green */
-	case 4 : return style_color_new_i8 (   0,    0, 0xff); /* blue */
-	case 5 : return style_color_new_i8 (0xff, 0xff,    0); /* yellow */
-	case 6 : return style_color_new_i8 (0xff,    0, 0xff); /* magenta */
-	case 7 : return style_color_new_i8 (   0, 0xff, 0xff); /* cyan */
+	case 2 : return style_color_new_rgb8 (0xff,    0,    0); /* red */
+	case 3 : return style_color_new_rgb8 (   0, 0xff,    0); /* green */
+	case 4 : return style_color_new_rgb8 (   0,    0, 0xff); /* blue */
+	case 5 : return style_color_new_rgb8 (0xff, 0xff,    0); /* yellow */
+	case 6 : return style_color_new_rgb8 (0xff,    0, 0xff); /* magenta */
+	case 7 : return style_color_new_rgb8 (   0, 0xff, 0xff); /* cyan */
 	default :
 		break;
 	}
@@ -1877,18 +1877,19 @@ excel_palette_get (GnmXLImporter *importer, gint idx)
 
 	if (pal->gnm_colors[idx] == NULL) {
 		pal->gnm_colors[idx] =
-			style_color_new_i8 ((guint8) pal->red[idx],
-					    (guint8) pal->green[idx],
-					    (guint8) pal->blue[idx]);
+			style_color_new_rgb8 (pal->red[idx],
+					      pal->green[idx],
+					      pal->blue[idx]);
 		g_return_val_if_fail (pal->gnm_colors[idx],
 				      style_color_black ());
 		d (5, {
 				const GnmColor *c = pal->gnm_colors[idx];
-				g_printerr ("New color in slot %d: RGB= %x,%x,%x\n",
+				g_printerr ("New color in slot %d: RGBA = %x,%x,%x,%x\n",
 					    idx,
 					    GO_COLOR_UINT_R (c->go_color),
 					    GO_COLOR_UINT_G (c->go_color),
-					    GO_COLOR_UINT_B (c->go_color));
+					    GO_COLOR_UINT_B (c->go_color),
+					    GO_COLOR_UINT_A (c->go_color));
 			});
 	}
 
@@ -5096,7 +5097,7 @@ excel_read_WINDOW2 (BiffQuery *q, ExcelReadSheet *esheet, WorkbookView *wb_view)
 			r = (guint8) biff_pat_col;
 			g = (guint8) (biff_pat_col >> 8);
 			b = (guint8) (biff_pat_col >> 16);
-			pattern_color = style_color_new_i8 (r, g, b);
+			pattern_color = style_color_new_rgb8 (r, g, b);
 		}
 		d (2, g_printerr ("auto pattern color "
 				  "0x%08x\n",
diff --git a/plugins/lotus-123/lotus.c b/plugins/lotus-123/lotus.c
index 53e4435..2c46787 100644
--- a/plugins/lotus-123/lotus.c
+++ b/plugins/lotus-123/lotus.c
@@ -526,9 +526,9 @@ static GnmColor *
 lotus_color (guint i)
 {
 	if (i < G_N_ELEMENTS (lotus_color_table))
-		return style_color_new_i8 (lotus_color_table[i][0],
-					   lotus_color_table[i][1],
-					   lotus_color_table[i][2]);
+		return style_color_new_rgb8 (lotus_color_table[i][0],
+					     lotus_color_table[i][1],
+					     lotus_color_table[i][2]);
 	switch (i) {
 	case 240:
 		g_warning ("Unhandled \"3D face\" color.");
@@ -2496,9 +2496,9 @@ works_color (guint i)
 {
 	if (i == 0) return style_color_auto_font();
 	if (i < G_N_ELEMENTS (works_color_table))
-		return style_color_new_i8 (works_color_table[i][0],
-					   works_color_table[i][1],
-					   works_color_table[i][2]);
+		return style_color_new_rgb8 (works_color_table[i][0],
+					     works_color_table[i][1],
+					     works_color_table[i][2]);
 	return NULL;
 }
 
diff --git a/plugins/openoffice/openoffice-read.c b/plugins/openoffice/openoffice-read.c
index 14291fb..6c90f30 100644
--- a/plugins/openoffice/openoffice-read.c
+++ b/plugins/openoffice/openoffice-read.c
@@ -695,7 +695,7 @@ oo_parse_color (GsfXMLIn *xin, xmlChar const *str, char const *name)
 	g_return_val_if_fail (str != NULL, NULL);
 
 	if (3 == sscanf (CXML2C (str), "#%2x%2x%2x", &r, &g, &b))
-		return style_color_new_i8 (r, g, b);
+		return style_color_new_rgb8 (r, g, b);
 
 	if (0 == strcmp (CXML2C (str), "transparent"))
 		return style_color_ref (magic_transparent);
diff --git a/plugins/psiconv/psiconv-read.c b/plugins/psiconv/psiconv-read.c
index 39f559d..b1fd792 100644
--- a/plugins/psiconv/psiconv-read.c
+++ b/plugins/psiconv/psiconv-read.c
@@ -179,7 +179,7 @@ set_format(GnmStyle *style, const psiconv_sheet_numberformat psi_numberformat)
 static GnmColor *
 get_color(const psiconv_color color)
 {
-	return style_color_new_i8 (color->red, color->green, color->blue);
+	return style_color_new_rgb8 (color->red, color->green, color->blue);
 }
 
 static void
diff --git a/plugins/qpro/qpro-read.c b/plugins/qpro/qpro-read.c
index a7886ea..84db919 100644
--- a/plugins/qpro/qpro-read.c
+++ b/plugins/qpro/qpro-read.c
@@ -849,7 +849,7 @@ qpro_read_sheet (QProReadState *state)
 
 		case QPRO_PAGE_TAB_COLOR :
 			if (validate (QPRO_PAGE_TAB_COLOR, 4)) {
-				GnmColor *bc = style_color_new_i8 (
+				GnmColor *bc = style_color_new_rgb8 (
 					data[0], data[1], data[2]);
 				g_object_set (sheet,
 					      "tab-background", bc,
diff --git a/src/dialogs/dialog-cell-format.c b/src/dialogs/dialog-cell-format.c
index 6dd3d58..1b7a17c 100644
--- a/src/dialogs/dialog-cell-format.c
+++ b/src/dialogs/dialog-cell-format.c
@@ -358,7 +358,8 @@ setup_color_pickers (FormatState *state,
 		     char const *default_caption,
 		     char const *caption,
 		     GCallback preview_update,
-		     GnmStyleElement e)
+		     GnmStyleElement e,
+                     gboolean allow_alpha)
 {
 	GtkWidget *combo, *w, *frame;
 	GOColorGroup *cg;
@@ -406,6 +407,8 @@ setup_color_pickers (FormatState *state,
 	else
 		go_combo_color_set_color_to_default (GO_COMBO_COLOR (combo));
 
+	if (allow_alpha)
+		go_combo_color_set_allow_alpha (GO_COMBO_COLOR (combo), TRUE);
 	frame = gtk_frame_new (NULL);
 	gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
 	gtk_container_add (GTK_CONTAINER (frame), combo);
@@ -1090,7 +1093,8 @@ border_get_mstyle (FormatState const *state, GnmStyleBorderLocation const loc)
 		guint8 const r = (guint8) (edge->rgba >> 24);
 		guint8 const g = (guint8) (edge->rgba >> 16);
 		guint8 const b = (guint8) (edge->rgba >>  8);
-		color = style_color_new_i8 (r, g, b);
+		guint8 const a = (guint8) (edge->rgba >>  0);
+		color = style_color_new_rgba8 (r, g, b, a);
 	}
 	return gnm_style_border_fetch
 		(state->border.edge[loc].pattern_index, color,
@@ -2278,19 +2282,19 @@ fmt_dialog_impl (FormatState *state, FormatDialogPosition_t pageno)
 	setup_color_pickers (state, &state->border.color,	"border_color_group",
 			     "border-grid", 2, 3,		"border_color_label",
 			     _("Automatic"),			_("Border"),
-			     G_CALLBACK (cb_border_color),	MSTYLE_BORDER_TOP);
+			     G_CALLBACK (cb_border_color),	MSTYLE_BORDER_TOP, FALSE);
 	setup_color_pickers (state, NULL,			"fore_color_group",
 			     "font-grid", 1, 2,		"font_color_label",
 			     _("Automatic"),			_("Foreground"),
-			     G_CALLBACK (cb_font_preview_color), MSTYLE_FONT_COLOR);
+			     G_CALLBACK (cb_font_preview_color), MSTYLE_FONT_COLOR, TRUE);
 	setup_color_pickers (state, &state->back.back_color,	"back_color_group",
 			     "background-grid",	1, 1,		"back_color_label",
 			     _("Clear Background"),		_("Background"),
-			     G_CALLBACK (cb_back_preview_color), MSTYLE_COLOR_BACK);
+			     G_CALLBACK (cb_back_preview_color), MSTYLE_COLOR_BACK, FALSE);
 	setup_color_pickers (state, &state->back.pattern_color, "pattern_color_group",
 			     "background-grid", 1, 3,		"pattern_color_label",
 			     _("Automatic"),			_("Pattern"),
-			     G_CALLBACK (cb_pattern_preview_color), MSTYLE_COLOR_PATTERN);
+			     G_CALLBACK (cb_pattern_preview_color), MSTYLE_COLOR_PATTERN, FALSE);
 
 	/* Setup the border images */
 	for (i = 0; (name = border_buttons[i]) != NULL; ++i) {
diff --git a/src/sheet-style.c b/src/sheet-style.c
index 952c94e..a97c820 100644
--- a/src/sheet-style.c
+++ b/src/sheet-style.c
@@ -656,7 +656,7 @@ sheet_style_init_size (Sheet *sheet, int cols, int rows)
 	 * 'none' by default.  Then displays that as white. */
 	if (sheet->sheet_type == GNM_SHEET_OBJECT) {
 		gnm_style_set_back_color (default_style,
-			style_color_new_i8 (0x50, 0x50, 0x50));
+			style_color_new_rgb8 (0x50, 0x50, 0x50));
 		gnm_style_set_pattern (default_style, 1);
 	}
 #endif
diff --git a/src/style-border.c b/src/style-border.c
index 84a25c3..77fedb5 100644
--- a/src/style-border.c
+++ b/src/style-border.c
@@ -113,7 +113,7 @@ style_border_equal (gconstpointer v1, gconstpointer v2)
 
 	/*
 	 * ->color is a pointer, but the comparison is safe because
-	 * all colours are cached, see style_color_new_i16.
+	 * all colours are cached, see style_color_new_go.
 	 */
 	return	(k1->color == k2->color) &&
 		(k1->line_type == k2->line_type);
@@ -128,7 +128,7 @@ style_border_hash (gconstpointer v)
 	 * HACK ALERT!
 	 *
 	 * ->color is a pointer, but the comparison is safe because
-	 * all colours are cached, see style_color_new_i16.
+	 * all colours are cached, see style_color_new_go.
 	 *
 	 */
 	return (GPOINTER_TO_UINT(b->color) ^ b->line_type);
diff --git a/src/style-color.c b/src/style-color.c
index 4e5af9a..ceec79a 100644
--- a/src/style-color.c
+++ b/src/style-color.c
@@ -46,15 +46,15 @@ style_color_new_uninterned (GOColor c, gboolean is_auto)
 }
 
 GnmColor *
-style_color_new_i16 (gushort red, gushort green, gushort blue)
+style_color_new_rgba16 (gushort red, gushort green, gushort blue, gushort alpha)
 {
-	return style_color_new_i8 (red >> 8, green >> 8, blue >> 8);
+	return style_color_new_rgba8 (red >> 8, green >> 8, blue >> 8, alpha >> 8);
 }
 
 GnmColor *
 style_color_new_pango (PangoColor const *c)
 {
-	return style_color_new_i16 (c->red, c->green, c->blue);
+	return style_color_new_rgba16 (c->red, c->green, c->blue, 0xffff);
 }
 
 GnmColor *
@@ -72,13 +72,19 @@ style_color_new_gdk (GdkRGBA const *c)
 	guint8 b8 = CLAMP (c->blue * 256, 0, 255);
 	guint8 a8 = CLAMP (c->alpha * 256, 0, 255);
 
-	return style_color_new_go (GO_COLOR_FROM_RGBA (r8, g8, b8, a8));
+	return style_color_new_rgba8 (r8, g8, b8, a8);
 }
 
 GnmColor *
-style_color_new_i8 (guint8 red, guint8 green, guint8 blue)
+style_color_new_rgba8 (guint8 red, guint8 green, guint8 blue, guint8 alpha)
 {
-	return style_color_new_go (GO_COLOR_FROM_RGBA (red, green, blue, 0xff));
+	return style_color_new_go (GO_COLOR_FROM_RGBA (red, green, blue, alpha));
+}
+
+GnmColor *
+style_color_new_rgb8 (guint8 red, guint8 green, guint8 blue)
+{
+	return style_color_new_rgba8 (red, green, blue, 0xff);
 }
 
 GnmColor *
@@ -104,7 +110,7 @@ GnmColor *
 style_color_black (void)
 {
 	if (!sc_black)
-		sc_black = style_color_new_i8 (0, 0, 0);
+		sc_black = style_color_new_rgb8 (0, 0, 0);
 	return style_color_ref (sc_black);
 }
 
@@ -112,7 +118,7 @@ GnmColor *
 style_color_white (void)
 {
 	if (!sc_white)
-		sc_white = style_color_new_i8 (0xff, 0xff, 0xff);
+		sc_white = style_color_new_rgb8 (0xff, 0xff, 0xff);
 	return style_color_ref (sc_white);
 }
 
@@ -120,7 +126,7 @@ GnmColor *
 style_color_grid (void)
 {
 	if (!sc_grid)
-		sc_grid = style_color_new_i8 (0xc7, 0xc7, 0xc7);
+		sc_grid = style_color_new_rgb8 (0xc7, 0xc7, 0xc7);
 	return style_color_ref (sc_grid);
 }
 
diff --git a/src/style-color.h b/src/style-color.h
index 71e2788..1ff47cf 100644
--- a/src/style-color.h
+++ b/src/style-color.h
@@ -28,8 +28,9 @@ GNM_VAR_DECL GdkRGBA gs_yellow;
 
 GnmColor *style_color_new_go    (GOColor c);
 GnmColor *style_color_new_name  (char const *name);
-GnmColor *style_color_new_i16   (gushort red, gushort green, gushort blue);
-GnmColor *style_color_new_i8    (guint8 red, guint8 green, guint8 blue);
+GnmColor *style_color_new_rgba16(gushort red, gushort green, gushort blue, gushort alpha);
+GnmColor *style_color_new_rgb8  (guint8 red, guint8 green, guint8 blue);
+GnmColor *style_color_new_rgba8 (guint8 red, guint8 green, guint8 blue, guint8 alpha);
 GnmColor *style_color_new_pango (PangoColor const *c);
 GnmColor *style_color_new_gdk   (GdkRGBA const *c);
 GnmColor *style_color_auto_font (void);
diff --git a/src/tools/gnm-solver.c b/src/tools/gnm-solver.c
index b4277b1..b2afc96 100644
--- a/src/tools/gnm-solver.c
+++ b/src/tools/gnm-solver.c
@@ -1402,7 +1402,7 @@ gnm_solver_get_limits (GnmSolver *solver, gnm_float **pmin, gnm_float **pmax)
   do {								\
 	  int c = (col_);					\
 	  dao_set_colors (dao, c, R, c, R,			\
-			  style_color_new_i8 (255, 0, 0),	\
+			  style_color_new_rgb8 (255, 0, 0),	\
 			  NULL);				\
   } while (0)
 
diff --git a/src/xml-sax-read.c b/src/xml-sax-read.c
index cd03fe0..fe4ea9b 100644
--- a/src/xml-sax-read.c
+++ b/src/xml-sax-read.c
@@ -253,7 +253,7 @@ xml_sax_attr_cellpos (xmlChar const * const *attrs, char const *name, GnmCellPos
 static gboolean
 xml_sax_attr_color (xmlChar const * const *attrs, char const *name, GnmColor **res)
 {
-	unsigned int red, green, blue;
+	unsigned int red, green, blue, alpha = 0xffff;
 
 	g_return_val_if_fail (attrs != NULL, FALSE);
 	g_return_val_if_fail (attrs[0] != NULL, FALSE);
@@ -262,12 +262,12 @@ xml_sax_attr_color (xmlChar const * const *attrs, char const *name, GnmColor **r
 	if (strcmp (CXML2C (attrs[0]), name))
 		return FALSE;
 
-	if (sscanf (CXML2C (attrs[1]), "%X:%X:%X", &red, &green, &blue) != 3){
+	if (sscanf (CXML2C (attrs[1]), "%X:%X:%X:%X", &red, &green, &blue, &alpha) < 3){
 		g_warning ("Invalid attribute '%s', expected colour, received '%s'",
 			   name, attrs[1]);
 		return FALSE;
 	}
-	*res = style_color_new_i16 (red, green, blue);
+	*res = style_color_new_rgba16 (red, green, blue, alpha);
 	return TRUE;
 }
 
