diff --git a/component/gnumeric.c b/component/gnumeric.c
index 16a750d..65f9871 100644
--- a/component/gnumeric.c
+++ b/component/gnumeric.c
@@ -219,7 +219,7 @@ go_gnm_component_edit (GOComponent *component)
 		wv = workbook_view_new (workbook_new_with_sheets (1));
 	} else {
 		GOCmdContext *cc = go_component_get_command_context ();
-		GOIOContext *io_context = go_io_context_new (cc);
+		GOIOContext *io_context = GO_IS_IO_CONTEXT (cc)? GO_IO_CONTEXT (g_object_ref (cc)): go_io_context_new (cc);
 		GsfInput *input = gsf_input_memory_new (component->data, component->length, FALSE);
 
 		g_object_set (G_OBJECT (io_context), "exec-main-loop", FALSE, NULL);
diff --git a/src/commands.c b/src/commands.c
index bb2b2ef..f63adf4 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -62,6 +62,7 @@
 #include "sheet-object-cell-comment.h"
 #include "sheet-object-widget.h"
 #include "sheet-object.h"
+#include "sheet-object-component.h"
 #include "sheet-object-graph.h"
 #include "sheet-control.h"
 #include "sheet-control-gui.h"
@@ -6829,6 +6830,78 @@ cmd_so_graph_config (WorkbookControl *wbc, SheetObject *so,
 
 /******************************************************************/
 
+#define CMD_SO_COMPONENT_CONFIG_TYPE (cmd_so_component_config_get_type ())
+#define CMD_SO_COMPONENT_CONFIG(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), CMD_SO_COMPONENT_CONFIG_TYPE, CmdSOComponentConfig))
+
+typedef struct {
+	GnmCommand cmd;
+	SheetObject *so;
+	GOComponent *new_obj;
+	GOComponent *old_obj;
+} CmdSOComponentConfig;
+
+MAKE_GNM_COMMAND (CmdSOComponentConfig, cmd_so_component_config, NULL)
+
+static gboolean
+cmd_so_component_config_redo (GnmCommand *cmd,
+			  G_GNUC_UNUSED WorkbookControl *wbc)
+{
+	CmdSOComponentConfig *me = CMD_SO_COMPONENT_CONFIG (cmd);
+	sheet_object_component_set_component (me->so, me->new_obj);
+	return FALSE;
+}
+
+static gboolean
+cmd_so_component_config_undo (GnmCommand *cmd,
+			  G_GNUC_UNUSED WorkbookControl *wbc)
+{
+	CmdSOComponentConfig *me = CMD_SO_COMPONENT_CONFIG (cmd);
+	sheet_object_component_set_component (me->so, me->old_obj);
+	return FALSE;
+}
+
+static void
+cmd_so_component_config_finalize (GObject *cmd)
+{
+	CmdSOComponentConfig *me = CMD_SO_COMPONENT_CONFIG (cmd);
+
+	g_object_unref (me->so);
+	g_object_unref (me->new_obj);
+	g_object_unref (me->old_obj);
+
+	gnm_command_finalize (cmd);
+}
+
+gboolean
+cmd_so_component_config (WorkbookControl *wbc, SheetObject *so,
+		     GObject *n_obj, GObject *o_obj)
+{
+	CmdSOComponentConfig *me;
+
+	g_return_val_if_fail (IS_WORKBOOK_CONTROL (wbc), TRUE);
+	g_return_val_if_fail (IS_SHEET_OBJECT_COMPONENT (so), TRUE);
+	g_return_val_if_fail (GO_IS_COMPONENT (n_obj), TRUE);
+	g_return_val_if_fail (GO_IS_COMPONENT (o_obj), TRUE);
+
+	me = g_object_new (CMD_SO_COMPONENT_CONFIG_TYPE, NULL);
+
+	me->so = so;
+	g_object_ref (G_OBJECT (so));
+
+	me->new_obj = GO_COMPONENT (n_obj);
+	g_object_ref (G_OBJECT (me->new_obj));
+	me->old_obj = GO_COMPONENT (o_obj);
+	g_object_ref (G_OBJECT (me->old_obj));
+
+	me->cmd.sheet = sheet_object_get_sheet (so);;
+	me->cmd.size = 10;
+	me->cmd.cmd_descriptor = g_strdup (_("Reconfigure Object"));
+
+	return gnm_command_push_undo (wbc, G_OBJECT (me));
+}
+
+/******************************************************************/
+
 #define CMD_TOGGLE_RTL_TYPE (cmd_toggle_rtl_get_type ())
 #define CMD_TOGGLE_RTL(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), CMD_TOGGLE_RTL_TYPE, CmdToggleRTL))
 
diff --git a/src/gnm-pane.c b/src/gnm-pane.c
index 6c385ff..489de49 100644
--- a/src/gnm-pane.c
+++ b/src/gnm-pane.c
@@ -2566,7 +2566,8 @@ gnm_pane_object_start_resize (GnmPane *pane, int button, guint64 x, gint64 y,
 	g_return_if_fail (NULL != ctrl_pts);
 
 	if (is_creation && !sheet_object_can_resize (so)) {
-		scg_objects_drag_commit (pane->simple.scg, 9, TRUE);
+		scg_objects_drag_commit (pane->simple.scg, 9, TRUE,
+					 NULL, NULL, NULL);
 		return;
 	}
 	gnm_simple_canvas_grab (ctrl_pts [drag_type],
diff --git a/src/sheet-object-component.c b/src/sheet-object-component.c
index 8b35de7..c1306ff 100644
--- a/src/sheet-object-component.c
+++ b/src/sheet-object-component.c
@@ -25,8 +25,10 @@
 #include "application.h"
 #include "gnm-pane-impl.h"
 #include "gui-util.h"
+#include "sheet-control-gui.h"
 #include "sheet-object-component.h"
 #include "sheet-object-impl.h"
+#include "wbc-gtk.h"
 #include <goffice/goffice.h>
 #include <goffice/component/go-component.h>
 #include <gsf/gsf-impl-utils.h>
@@ -85,6 +87,7 @@ static GSF_CLASS (SOComponentGocView, so_component_goc_view,
 typedef struct {
 	SheetObject  base;
 	GOComponent	*component;
+	guint changed_signal;
 } SheetObjectComponent;
 typedef SheetObjectClass SheetObjectComponentClass;
 
@@ -115,11 +118,6 @@ gnm_soc_new_view (SheetObject *so, SheetObjectViewContainer *container)
 	return gnm_pane_object_register (so, view, TRUE);
 }
 
-static void
-gnm_soc_bounds_changed (SheetObject *so)
-{
-}
-
 static GtkTargetList *
 gnm_soc_get_target_list (SheetObject const *so)
 {
@@ -211,6 +209,13 @@ gnm_soc_default_size (SheetObject const *so, double *w, double *h)
 static void
 gnm_soc_user_config (SheetObject *so, SheetControl *sc)
 {
+	SheetObjectComponent *soc = SHEET_OBJECT_COMPONENT (so);
+	GtkWidget *w;
+	g_return_if_fail (soc && soc->component);
+
+	w = (GtkWidget *) go_component_edit (soc->component);
+	if (w)
+		wbc_gtk_attach_guru (scg_wbcg (SHEET_CONTROL_GUI (sc)), w);
 }
 
 static void
@@ -235,7 +240,6 @@ gnm_soc_class_init (GObjectClass *klass)
 
 	/* SheetObject class method overrides */
 	so_class->new_view		= gnm_soc_new_view;
-	so_class->bounds_changed	= gnm_soc_bounds_changed;
 	so_class->populate_menu		= gnm_soc_populate_menu;
 	so_class->write_xml_sax		= gnm_soc_write_xml_sax;
 	so_class->prep_sax_parser	= gnm_soc_prep_sax_parser;
@@ -298,6 +302,22 @@ sheet_object_component_get_component (SheetObject *soc)
 	return ((SheetObjectComponent *) soc)->component;
 }
 
+static void
+component_changed_cb (SheetObject *so)
+{
+	if (!(so->flags & SHEET_OBJECT_CAN_RESIZE)) {
+		GList *l = so->realized_list;
+		double coords[4];
+		g_object_get (l->data, "x", coords, "y", coords + 1, NULL);
+		coords[2] = coords[3] = G_MAXDOUBLE;	
+		for (l = so->realized_list; l; l = l->next) {
+			if (l->data)
+				sheet_object_view_set_bounds (l->data, coords, so->flags & SHEET_OBJECT_IS_VISIBLE);
+		}
+		sheet_object_update_bounds (so, NULL); 
+	}
+}
+
 void
 sheet_object_component_set_component (SheetObject *so, GOComponent *component)
 {
@@ -305,14 +325,17 @@ sheet_object_component_set_component (SheetObject *so, GOComponent *component)
 
 	g_return_if_fail (IS_SHEET_OBJECT_COMPONENT (so));
 	soc = SHEET_OBJECT_COMPONENT (so);
-	if (soc->component != NULL)
+	if (soc->component != NULL) {
+		g_signal_handler_disconnect (soc->component, soc->changed_signal);
 		g_object_unref (soc->component);
+	}
 
 	soc->component = component;
 	if (component) {
 		if (go_component_is_resizable (component))
 			so->flags |= SHEET_OBJECT_CAN_RESIZE;
 		else
-		so->flags &= ~SHEET_OBJECT_CAN_RESIZE;
+			so->flags &= ~SHEET_OBJECT_CAN_RESIZE;
+		g_signal_connect_swapped (soc->component, "changed", G_CALLBACK (component_changed_cb), soc);
 	}
 }
diff --git a/src/widgets/gnumeric-expr-entry.c b/src/widgets/gnumeric-expr-entry.c
index 711bdc9..cd9b588 100644
--- a/src/widgets/gnumeric-expr-entry.c
+++ b/src/widgets/gnumeric-expr-entry.c
@@ -1019,10 +1019,12 @@ cb_gee_notify_cursor_position (GnmExprEntry *gee)
 static void
 cb_entry_changed (GnmExprEntry *gee)
 {
-	gee_update_env (gee);
-	gee_update_calendar (gee);
-	gee_check_tooltip (gee);
-	g_signal_emit (G_OBJECT (gee), signals[CHANGED], 0);
+	if (gee_is_editing (gee)) {
+		gee_update_env (gee);
+		gee_update_calendar (gee);
+		gee_check_tooltip (gee);
+		g_signal_emit (G_OBJECT (gee), signals[CHANGED], 0);
+	}
 }
 
 static gboolean
