Index: src/register/ledger-core/gnc-ledger-display2.c
===================================================================
--- src/register/ledger-core/gnc-ledger-display2.c	(revision 22540)
+++ src/register/ledger-core/gnc-ledger-display2.c	(working copy)
@@ -93,7 +93,9 @@
 
 static void gnc_ledger_display2_refresh_internal (GNCLedgerDisplay2 *ld, GList *splits);
 
+static void gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer user_data);
 
+
 /** Implementations *************************************************/
 
 Account *
@@ -612,7 +614,7 @@
      */
     splits = qof_query_run (ld->query);
 
-    gnc_ledger_display2_set_watches (ld, splits);
+//    gnc_ledger_display2_set_watches (ld, splits);
 
     gnc_ledger_display2_refresh_internal (ld, splits);
     LEAVE(" ");
@@ -820,9 +822,12 @@
 
     gnc_tree_model_split_reg_set_data (ld->model, ld, gnc_ledger_display2_parent);
 
+    g_signal_connect (G_OBJECT (ld->model), "refresh_signal",
+                      G_CALLBACK ( gnc_ledger_display2_refresh_cb ), ld );
+
     splits = qof_query_run (ld->query);
 
-    gnc_ledger_display2_set_watches (ld, splits);
+//    gnc_ledger_display2_set_watches (ld, splits);
 
     gnc_ledger_display2_refresh_internal (ld, splits);
 
@@ -877,7 +882,7 @@
 {
     GtkTreeModel *smodel, *model;
 
-g_print("gnc_ledger_display2_refresh_internal\n");
+g_print("gnc_ledger_display2_refresh_internal ledger %p and splits %p\n", ld, splits);
 
     if (!ld || ld->loading)
         return;
@@ -991,6 +996,18 @@
     ld->refresh_ok = ok;
 }
 
+
+static void
+gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer user_data)
+{
+    GNCLedgerDisplay2 *ld = user_data;
+//g_print("refresh model %p user_data %p\n", model,  user_data);
+
+    /* Refresh the view when idle */
+    g_idle_add ((GSourceFunc)gnc_ledger_display2_refresh, ld);
+}
+
+
 void
 gnc_ledger_display2_close (GNCLedgerDisplay2 *ld)
 {
Index: src/gnome-utils/gnc-tree-view-split-reg.c
===================================================================
--- src/gnome-utils/gnc-tree-view-split-reg.c	(revision 22540)
+++ src/gnome-utils/gnc-tree-view-split-reg.c	(working copy)
@@ -737,8 +737,9 @@
 {
     GncTreeModelSplitReg *model;
     GtkTreeIter iter;
-    GtkTreePath *path;
+    GtkTreePath *path, *path_temp;
     gint *indices;
+    gint top_row;
 
     model = get_split_reg_model_from_view (view);
 
@@ -746,15 +747,23 @@
 
     /* Set the default start position to end of list */
     if (gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, view->priv->current_path))
+    {
         indices = gtk_tree_path_get_indices (view->priv->current_path);
+        top_row = indices[0];
+    }
     else
+    {
         /* both values NULL will return last in list */
-        indices = gtk_tree_path_get_indices (gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, NULL));
+        path_temp = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, NULL);
+        indices = gtk_tree_path_get_indices (path_temp);
+        top_row = indices[0]; // we do this because freeing the path screws the indices
+        gtk_tree_path_free (path_temp);
+    }
 
-    path = gtk_tree_path_new_from_indices (indices[0], -1);
+    path = gtk_tree_path_new_from_indices (top_row, -1);
 
-g_print(" gnc_tree_view_split_reg_default_selection current_path is %s, new path is %s\n", gtk_tree_path_to_string (view->priv->current_path),
-        gtk_tree_path_to_string (path));
+//g_print("gnc_tree_view_split_reg_default_selection current_path is %s, new path is %s\n", gtk_tree_path_to_string (view->priv->current_path),
+//        gtk_tree_path_to_string (path));
 
     gtk_tree_path_free (view->priv->current_path);
     view->priv->current_path = gtk_tree_path_copy (path);
@@ -785,8 +794,8 @@
 needs_exchange_rate (GncTreeViewSplitReg *view, Transaction *trans, Split *split)
 {
     gnc_commodity *split_com, *txn_curr, *reg_com;
-g_print("needs_exchange_rate - 'always FALSE at the moment' - trans %p and split %p\n", trans, split);
-    if (view->priv->has_rate) return FALSE;
+g_print("needs_exchange_rate - trans %p and split %p\n", trans, split);
+//    if (view->priv->has_rate) return FALSE;
 
     txn_curr = xaccTransGetCurrency (trans);
     split_com = xaccAccountGetCommodity (xaccSplitGetAccount (split));
@@ -815,9 +824,11 @@
     XferDialog *xfer;
     gboolean rate_split_ok, rate_reg_ok;
     gnc_numeric rate_split, rate_reg, value;
+    Account *reg_acc = view->priv->anchor;
     gnc_commodity *xfer_comm = xaccAccountGetCommodity (xaccSplitGetAccount (split));
     gnc_commodity *reg_comm = view->priv->reg_comm;
     gnc_commodity *trans_curr = xaccTransGetCurrency (trans);
+    gboolean expanded;
 
 g_print("handle_exchange_rate trans %p and split %p\n", trans, split);
 
@@ -825,8 +836,11 @@
     rate_split_ok = xaccTransGetRateForCommodity (trans, xfer_comm, split, &rate_split);
 
     /* Rate from trans-curr to reg-comm */
-    rate_reg_ok = xaccTransGetRateForCommodity(trans, reg_comm, split, &rate_reg);
+    rate_reg_ok = xaccTransGetRateForCommodity (trans, reg_comm, split, &rate_reg);
 
+    /* Are we expnded */
+    expanded = gnc_tree_view_split_reg_current_trans_expanded (view);
+
     if (rate_reg_ok && rate_split_ok)
     {
         value = gnc_numeric_div (amount, rate_reg, gnc_commodity_get_fraction (trans_curr), GNC_HOW_DENOM_REDUCE);
@@ -838,7 +852,7 @@
 
         //g_message("reg amt: %s", gnc_numeric_to_string(amount));
         /* create the exchange-rate dialog */
-        xfer = gnc_xfer_dialog (NULL, NULL); //FIXME: get parent window
+        xfer = gnc_xfer_dialog (NULL, NULL);
         gnc_xfer_dialog_is_exchange_dialog (xfer, &rate_split);
 
         /* fill in the dialog entries */
@@ -848,9 +862,9 @@
         gnc_xfer_dialog_set_date (xfer, timespecToTime_t (xaccTransRetDatePostedTS (trans)));
 
         value = amount;
-/*FIXME        if (gnc_xfer_dialog_run_exchange_dialog(
-                xfer, &rate_split, &value, reg_comm, trans, xfer_comm))
-            return FALSE; */
+        if (gnc_xfer_dialog_run_exchange_dialog (
+                xfer, &rate_split, value, reg_acc, trans, xfer_comm, expanded))
+            return FALSE;
         amount = gnc_numeric_mul (value, rate_split, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND);
     }
     xaccSplitSetAmount (split, amount);
@@ -994,10 +1008,10 @@
     {
         if (!gnc_numeric_zero_p (total) && gnc_numeric_check (total) == GNC_ERROR_OK)
         {
-            /* fixme: if needs conversion? */
+            /* if needs conversion? */
             gnc_commodity *commodity = view->priv->reg_comm;
-/*FIXME  ??          if (commodity && !gnc_commodity_equiv(commodity, currency))
-                total = xaccSplitConvertAmount(split, commodity); */
+            if (commodity && !gnc_commodity_equiv (commodity, currency))
+                total = xaccSplitConvertAmount (split, view->priv->anchor);
         }
     }
     return total;
@@ -1026,12 +1040,12 @@
 {
     gnc_numeric num;
 
-g_print("get_rate_for trans %p and split %p is_blank %d\n", trans, split, is_blank);
+//g_print("get_rate_for trans %p and split %p is_blank %d\n", trans, split, is_blank);
 
     num = get_value_for (view, trans, split, is_blank);
-g_print("get_rate_for get_value_for is %s\n", gnc_numeric_to_string (num));
+//g_print("get_rate_for get_value_for is %s\n", gnc_numeric_to_string (num));
     num = gnc_numeric_div ( xaccSplitGetAmount (split), num, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND);
-g_print("get_rate_for return is %s\n", gnc_numeric_to_string (num));
+//g_print("get_rate_for return is %s\n", gnc_numeric_to_string (num));
     return num;
 }
 
@@ -1044,11 +1058,12 @@
     gnc_numeric old_rate = get_rate_for (view, trans, split, is_blank);
     gnc_numeric factor = gnc_numeric_div (input, old_rate, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND);
     split_comm = xaccAccountGetCommodity (xaccSplitGetAccount (split));
-/*FIXME     xaccTransAdjustRateForCommodity(trans, split_comm, factor); */
+/*FIXME     xaccTransAdjustRateForCommodity (trans, split_comm, factor); */
 
-g_print("set_rate_for trans %p and split %p is_blank %d\n", trans, split, is_blank);
+//g_print("set_rate_for trans %p and split %p is_blank %d\n", trans, split, is_blank);
 
 #if JUNK
+    // This is from original 
     reg_comm = view->priv->reg_comm;
     if (xaccTransGetRateForCommodity (trans, reg_comm, split, &reg_rate))
     {
@@ -1166,7 +1181,6 @@
 }
 
 
-
 /* poor name: really means: If this is the blank split, it may now
    eventually graduate to a real split. The trans must already be
    opened for editing because the split will be added to the
@@ -1229,7 +1243,7 @@
 
 
 static gboolean
-get_model_iter_from_view_string(GncTreeViewSplitReg *view,
+get_model_iter_from_view_string (GncTreeViewSplitReg *view,
                                 const gchar *path_string, GtkTreeIter *iter)
 {
     GtkTreeModelSort *s_model;
@@ -1263,7 +1277,6 @@
 }
 
 
-/* Returns TRUE is we have an Account on row */
 static gboolean
 gtv_have_account (GncTreeViewSplitReg *view, RowDepth depth, gboolean expanded, Transaction *trans, Split *split)
 {
@@ -1298,7 +1311,7 @@
     GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
     GtkTreeIter iter;
-    GtkTreePath *path;
+    GtkTreePath *path, *temp_path;
     ViewCol viewcol;
     Transaction *trans;
     Split *split;
@@ -1323,13 +1336,19 @@
 
     viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "view_column"));
 
-    g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans(
-                         GNC_TREE_MODEL_SPLIT_REG(model), &iter,
+    g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
+                         GNC_TREE_MODEL_SPLIT_REG (model), &iter,
                           &is_trow1, &is_trow2, &is_split, &is_blank,
                           &split, &trans));
 
-    depth = gtk_tree_path_get_depth (gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter));
+    temp_path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
 
+    depth = gtk_tree_path_get_depth (temp_path);
+
+    indices = gtk_tree_path_get_indices (temp_path);
+
+    gtk_tree_path_free (temp_path);
+
 // g_print("cdf split %p, trans %p, is_trow1 = %d, is_trow2 = %d, is_split = %d, is_blank = %d\n",
 //                                        split, trans, is_trow1, is_trow2, is_split, is_blank);
 
@@ -1338,7 +1357,9 @@
     /* Get the read only model setting */
     gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, GNC_TREE_MODEL_SPLIT_REG_COL_RO, &read_only, -1);
 
-    indices = gtk_tree_path_get_indices (gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter));
+    /* Voided Transaction. */
+    if (xaccTransHasSplitsInState (trans, VREC))
+        read_only = TRUE;
 
 //g_print(" cdf path is %s\n", gtk_tree_path_to_string (gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter)));
 
@@ -1357,7 +1378,7 @@
     case COL_DATE:
         /* Column is DATE */
         if (is_split)
-            g_object_set(cell, "cell-background", "white", (gchar*)NULL);
+            g_object_set (cell, "cell-background", "white", (gchar*)NULL);
 
         if (is_trow1) {
             Timespec ts = {0,0};
@@ -1629,6 +1650,7 @@
                 s = xaccPrintAmount (num, gnc_split_amount_print_info (split, FALSE));
                 editable = !gnc_numeric_zero_p (num) &&
                     gnc_commodity_equiv (split_com, view->priv->reg_comm);
+g_print("zero %d and equiv %d\n", gnc_numeric_zero_p (num), gnc_commodity_equiv (split_com, view->priv->reg_comm));
             }
             else
             {
@@ -1924,6 +1946,14 @@
 
 g_print("begin_edit - xaccTransBeginEdit trans %p\n", trans);
 
+        if (!xaccTransGetCurrency (trans))
+        {
+            if (view->priv->anchor)
+                xaccTransSetCurrency (trans, view->priv->reg_comm);
+            else
+                xaccTransSetCurrency (trans, xaccAccountGetCommodity (xaccSplitGetAccount (split)));
+        }
+
         if (ts.tv_sec == 0)
         {
             //If the time returned by xaccTransGetDatePostedTS is 0 then assume it
@@ -2320,6 +2350,10 @@
                     break;
 
                 case ASSET_REGISTER2:
+                if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
+                        gtk_tree_view_column_set_title (tvc, _("Decrease"));
+                    break;
+
                 case LIABILITY_REGISTER2:
                 case EQUITY_REGISTER2:
                 case TRADING_REGISTER2:
@@ -2344,6 +2378,7 @@
                     break;
 
                 case STOCK_REGISTER2:
+                case CURRENCY_REGISTER2:
                 case PORTFOLIO_LEDGER2:
                 if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
                         gtk_tree_view_column_set_title (tvc, _("Sell"));
@@ -2386,10 +2421,14 @@
 
                 case CASH_REGISTER2:
                 if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
-                        gtk_tree_view_column_set_title (tvc, _("Recieve"));
+                        gtk_tree_view_column_set_title (tvc, _("Receive"));
                     break;
 
                 case ASSET_REGISTER2:
+                if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
+                        gtk_tree_view_column_set_title (tvc, _("Increase"));
+                    break;
+
                 case LIABILITY_REGISTER2:
                 case EQUITY_REGISTER2:
                 case TRADING_REGISTER2:
@@ -2397,11 +2436,6 @@
                         gtk_tree_view_column_set_title (tvc, _("Decrease"));
                     break;
 
-                case CREDIT_REGISTER2:
-                if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
-                        gtk_tree_view_column_set_title (tvc, _("Payment"));
-                    break;
-
                 case INCOME_REGISTER2:
                 case INCOME_LEDGER2:
                 if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
@@ -2414,6 +2448,7 @@
                     break;
 
                 case STOCK_REGISTER2:
+                case CURRENCY_REGISTER2:
                 case PORTFOLIO_LEDGER2:
                 if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
                         gtk_tree_view_column_set_title (tvc, _("Buy"));
@@ -2424,6 +2459,7 @@
                         gtk_tree_view_column_set_title (tvc, _("Invoice"));
                     break;
 
+                case CREDIT_REGISTER2:
                 case PAYABLE_REGISTER2:
                 if(depth == TRANS1 || depth == TRANS2 || depth == SPLIT3)
                         gtk_tree_view_column_set_title (tvc, _("Payment"));
@@ -2779,8 +2815,8 @@
 
         g_object_get (G_OBJECT (cell), "editable", &editable, NULL);
 
-g_print("key nav - Path is '%s' edit path is '%s' and viewcol is %d and editable is %d and cell pointer is %p\n", gtk_tree_path_to_string (path),
-                  (view->priv->acct_edit_path == NULL) ? "NULL" : gtk_tree_path_to_string (view->priv->acct_edit_path), viewcol, editable, cell);
+//g_print("key nav - Path is '%s' edit path is '%s' and viewcol is %d and editable is %d and cell pointer is %p\n", gtk_tree_path_to_string (path),
+//                  (view->priv->acct_edit_path == NULL) ? "NULL" : gtk_tree_path_to_string (view->priv->acct_edit_path), viewcol, editable, cell);
 
 
 
@@ -2935,9 +2971,9 @@
 
         path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
 
-g_print("Motion - Current Path is '%s' and edit path is '%s'\n", gtk_tree_path_to_string (view->priv->current_path),
-                                                                 (view->priv->acct_edit_path == NULL) ? "NULL" :
-                                                                  gtk_tree_path_to_string (view->priv->acct_edit_path));
+//g_print("Motion - Current Path is '%s' and edit path is '%s'\n", gtk_tree_path_to_string (view->priv->current_path),
+//                                                                 (view->priv->acct_edit_path == NULL) ? "NULL" :
+//                                                                  gtk_tree_path_to_string (view->priv->acct_edit_path));
 
         indices_old = gtk_tree_path_get_indices (view->priv->current_path);
         indices_now = gtk_tree_path_get_indices (path);
@@ -2962,9 +2998,9 @@
 
         gtk_tree_path_free (path);
 
-g_print("Motion - New Current Path is '%s' and edit path is '%s'\n", gtk_tree_path_to_string (view->priv->current_path),
-                                                                 (view->priv->acct_edit_path == NULL) ? "NULL" :
-                                                                  gtk_tree_path_to_string (view->priv->acct_edit_path));
+//g_print("Motion - New Current Path is '%s' and edit path is '%s'\n", gtk_tree_path_to_string (view->priv->current_path),
+//                                                                 (view->priv->acct_edit_path == NULL) ? "NULL" :
+//                                                                  gtk_tree_path_to_string (view->priv->acct_edit_path));
 
 
         /*FIXME Not sure if will need this here, leave till end */
@@ -3110,6 +3146,7 @@
             Account       *root; // do we have this
             Account       *new_acct;
             gint           num_of_splits;
+            gnc_numeric    num;
 
             begin_edit (view, split, trans);
 
@@ -3129,6 +3166,8 @@
 
             num_of_splits = xaccTransCountSplits (trans);
 
+g_print("num_of_splits is %d\n", num_of_splits);
+
             if (view->priv->acct_short_names)
                 new_acct = gnc_account_lookup_by_name (root, new_text);
             else
@@ -3141,6 +3180,13 @@
 
             mark_split_dirty (view, trans, split);
 
+            num = get_value_for (view, trans, split, is_blank);
+
+g_print("number is %s\n", gnc_numeric_to_string (num));
+
+            if (!gnc_numeric_zero_p (num))
+                set_value_for (view, trans, split, num);
+
         }
         break;
 
@@ -3171,6 +3217,7 @@
         break;
 
     case COL_TYPE:
+
         break;
 
     case COL_VALUE:
@@ -3224,7 +3271,6 @@
                 input = gnc_numeric_neg (input);
 
 //FIXME 
-#ifdef skip
             if (viewcol == COL_AMOUNT)
             {
                 set_amount_for (view, trans, split, input);
@@ -3238,6 +3284,7 @@
             }
 //FIXME
 
+
             if ((viewcol == COL_AMTVAL) && is_split)
             {
                 set_amount_for (view, trans, split, input);
@@ -3250,7 +3297,7 @@
                 break;
             }
 //End FIXME
-#endif
+
             set_value_for (view, trans, split, input);
 
             if (osplit)
@@ -3605,8 +3652,71 @@
           ^^^^   gtv function call backs    ^^^^
 #####################################################################*/
 
+void
+gnc_tree_view_split_reg_void_current_trans (GncTreeViewSplitReg *view, const char *reason)
+{
+    Transaction *trans;
+    Split *blank_split;
+    Split *split;
 
+    if (!view) return;
 
+    blank_split = gnc_tree_view_split_reg_get_blank_split (view);
+
+    /* get the current split based on cursor position */
+    split = gnc_tree_view_split_reg_get_current_split (view);
+    if (split == NULL)
+        return;
+
+    /* Bail if trying to void the blank split. */
+    if (split == blank_split)
+        return;
+
+    /* already voided. */
+    if (xaccSplitGetReconcile (split) == VREC)
+        return;
+
+    trans = xaccSplitGetParent (split);
+    xaccTransVoid (trans, reason);
+
+    if (xaccTransIsOpen (trans))
+    {
+        PERR("We should not be voiding an open transaction.");
+        xaccTransCommitEdit (trans);
+    }
+}
+
+
+void
+gnc_tree_view_split_reg_unvoid_current_trans (GncTreeViewSplitReg *view)
+{
+    Transaction *trans;
+    Split *blank_split;
+    Split *split;
+
+    if (!view) return;
+
+    blank_split = gnc_tree_view_split_reg_get_blank_split (view);
+
+    /* get the current split based on cursor position */
+    split = gnc_tree_view_split_reg_get_current_split (view);
+    if (split == NULL)
+        return;
+
+    /* Bail if trying to unvoid the blank split. */
+    if (split == blank_split)
+        return;
+
+    /* not voided. */
+    if (xaccSplitGetReconcile (split) != VREC)
+        return;
+
+    trans = xaccSplitGetParent (split);
+
+    xaccTransUnvoid (trans);
+}
+
+
 /* Reinit transaction / delete the splits */
 void
 gnc_tree_view_split_reg_reinit_trans (GncTreeViewSplitReg *view)
Index: src/gnome-utils/gnc-tree-view-split-reg.h
===================================================================
--- src/gnome-utils/gnc-tree-view-split-reg.h	(revision 22540)
+++ src/gnome-utils/gnc-tree-view-split-reg.h	(working copy)
@@ -123,6 +123,10 @@
 
 void gnc_tree_view_split_reg_moved_cb (GncTreeViewSplitReg *view, GFunc cb, gpointer cb_data);
 
+void gnc_tree_view_split_reg_void_current_trans (GncTreeViewSplitReg *view, const char *reason);
+
+void gnc_tree_view_split_reg_unvoid_current_trans (GncTreeViewSplitReg *view);
+
 G_END_DECLS
 
 #endif /* __GNC_TREE_VIEW_SPLIT_REG_H */
Index: src/gnome-utils/gnc-tree-model-split-reg.c
===================================================================
--- src/gnome-utils/gnc-tree-model-split-reg.c	(revision 22540)
+++ src/gnome-utils/gnc-tree-model-split-reg.c	(working copy)
@@ -45,6 +45,13 @@
 
 #define TREE_MODEL_SPLIT_REG_CM_CLASS "tree-model-split-reg"
 
+/* Signal codes */
+enum
+{
+    REFRESH_SIGNAL,
+    LAST_SIGNAL
+};
+
 /** Static Globals *******************************************************/
 static QofLogModule log_module = GNC_MOD_GUI;
 
@@ -54,6 +61,8 @@
 static void gnc_tree_model_split_reg_finalize (GObject *object);
 static void gnc_tree_model_split_reg_dispose (GObject *object);
 
+static guint gnc_tree_model_split_reg_signals[LAST_SIGNAL] = {0};
+
 static const gchar *iter_to_string (GtkTreeIter *iter);
 
 /** Implementation of GtkTreeModel  **************************************/
@@ -261,6 +270,18 @@
     /* GObject signals */
     o_class->finalize = gnc_tree_model_split_reg_finalize;
     o_class->dispose = gnc_tree_model_split_reg_dispose;
+
+    gnc_tree_model_split_reg_signals[REFRESH_SIGNAL] =
+        g_signal_new("refresh_signal",
+                     G_TYPE_FROM_CLASS (o_class),
+                     G_SIGNAL_RUN_LAST,
+                     G_STRUCT_OFFSET (GncTreeModelSplitRegClass, refresh_signal),
+                     NULL, NULL,
+                     g_cclosure_marshal_VOID__VOID,
+                     G_TYPE_NONE, 0);
+
+    klass->refresh_signal = NULL;
+
 }
 
 
@@ -539,7 +560,7 @@
                                   SRGetParentCallback2 get_parent)
 {
     GncTreeModelSplitRegPrivate *priv;
-g_print("gnc_tree_model_split_reg_set_data\n");
+g_print("gnc_tree_model_split_reg_set_data user_data %p\n", user_data);
 /*FIXME Not sure if this is needed or what it is for */
     priv = model->priv;
 
@@ -579,7 +600,6 @@
 }
 
 
-
 /************************************************************/
 /*        Gnc Tree Model Debugging Utility Function         */
 /************************************************************/
@@ -976,10 +996,10 @@
     /* Initializes and sets value to that at column. When done with value,
        g_value_unset() needs to be called to free any allocated memory. */
     GncTreeModelSplitReg *model = GNC_TREE_MODEL_SPLIT_REG (tree_model);
+    GtkTreePath *path;
     Transaction *trans;
-    Split *split;
     const GncGUID *guid;
-    GList *tnode, *snode;
+    GList *tnode;
     gint depth, *indices;
 
     g_return_if_fail (GNC_IS_TREE_MODEL_SPLIT_REG (model));
@@ -989,12 +1009,11 @@
     tnode = (GList *) iter->user_data2;
     trans = (Transaction *) tnode->data;
 
-    snode = (GList *) iter->user_data3;
-    split = (Split *) snode->data;
+    g_value_init (value, gnc_tree_model_split_reg_get_column_type (tree_model, column));
 
-    g_value_init(value, gnc_tree_model_split_reg_get_column_type (tree_model, column));
+    path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), iter);
 
-    indices = gtk_tree_path_get_indices (gtk_tree_model_get_path (GTK_TREE_MODEL (model), iter));
+    indices = gtk_tree_path_get_indices (path);
 
     switch (column)
     {
@@ -1033,6 +1052,7 @@
         g_assert_not_reached ();
     }
 
+    gtk_tree_path_free (path);
     LEAVE(" ");
 }
 
@@ -1636,10 +1656,11 @@
         /* If this is the blank transaction, the only split will be deleteted, hence toggle has child */ 
         if (IS_BLANK_TRANS (&iter) && (tnode->data == model->priv->btrans) && (xaccTransCountSplits (model->priv->btrans) == 0))
         {
+            gchar *path_string = gtk_tree_path_to_string (path);
+            PINFO("toggling has_child at row %s\n", path_string);
+            g_free (path_string);
+
             increment_stamp (model);
-            
-            PINFO("toggling has_child at row %s\n", gtk_tree_path_to_string (path));
-
             gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, &iter);
         }
     }
@@ -1751,17 +1772,18 @@
 //g_print("insert_trans %p\n", trans);
     model->priv->tlist = g_list_prepend (model->priv->tlist, trans);
     tnode = g_list_find (model->priv->tlist, trans);
+
     iter = make_iter (model, TROW1, tnode, NULL);
     insert_row_at (model, &iter);
-
     path = gnc_tree_model_split_reg_get_path (GTK_TREE_MODEL (model), &iter);
     gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, &iter);
+    gtk_tree_path_free (path);
 
     iter = make_iter (model, TROW2, tnode, NULL);
     insert_row_at (model, &iter);
-
     path = gnc_tree_model_split_reg_get_path (GTK_TREE_MODEL (model), &iter);
     gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, &iter);
+    gtk_tree_path_free (path);
 
 //g_print("insert count splits %p %d\n", trans, xaccTransCountSplits (trans));
 
@@ -1781,7 +1803,6 @@
     GtkTreeIter iter;
     GList *tnode = NULL, *snode = NULL;
 //g_print("delete_trans %p\n", trans);
-
     tnode = g_list_find (model->priv->tlist, trans);
 //g_print("tlist length is %d\n", g_list_length (model->priv->tlist));
 
@@ -2335,7 +2356,8 @@
     GtkTreeIter iter;
     GList *accts, *ptr;
     gboolean valid;
-    const gchar *name, *fname;
+    const gchar *name;
+    gchar *fname;
     gint i;
 
     priv = model->priv;
@@ -2357,6 +2379,7 @@
             name = xaccAccountGetName (acc);
             gtk_list_store_append (store, &iter);
             gtk_list_store_set (store, &iter, 0, name, 1, fname, 2, acc, -1);
+            g_free (fname);
         }
     }
 
@@ -2437,6 +2460,17 @@
 //g_print("--Change model %p split %p\n", model, split); //works
                 DEBUG ("change split %p (%s)", split, name);
                 changed_row_at (model, &iter1);
+
+                /* If we change split to different account, remove from view */
+                if (priv->anchor != NULL)
+                {
+                    Split *find_split;
+                    Transaction *trans;
+                    trans = xaccSplitGetParent (split);
+                    find_split = xaccTransFindSplitByAccount (trans, priv->anchor);
+                    if (find_split == NULL)
+                        delete_trans (model, trans);
+                }
             }
             break;
         default:
@@ -2511,6 +2545,7 @@
                 DEBUG ("change trans %p (%s)", trans, name);
                 changed_row_at (model, &iter1);
                 changed_row_at (model, &iter2);
+                g_signal_emit_by_name (model, "refresh_signal", NULL);
             }
 
             break;
@@ -2530,8 +2565,9 @@
             else if (get_iter (model, trans, NULL, &iter1, &iter2))
             {
 //g_print("--Delete model %p trans %p\n", model, trans); //works
+                DEBUG("destroy trans %p (%s)", trans, name);
                 delete_trans (model, trans);
-                DEBUG("destroy trans %p (%s)", trans, name);
+                g_signal_emit_by_name (model, "refresh_signal", NULL);
             }
             break;
         default:
@@ -2553,7 +2589,9 @@
                   priv->include_subacc) || acc == priv->anchor))
             {
 //g_print("--Insert model %p trans %p\n", model, trans); //works
+                DEBUG("Insert trans %p (%s)", trans, name);
                 insert_trans (model, trans);
+                g_signal_emit_by_name (model, "refresh_signal", NULL);
             }
             break;
         default:
Index: src/gnome-utils/gnc-tree-model-split-reg.h
===================================================================
--- src/gnome-utils/gnc-tree-model-split-reg.h	(revision 22540)
+++ src/gnome-utils/gnc-tree-model-split-reg.h	(working copy)
@@ -137,6 +137,10 @@
 typedef struct
 {
     GncTreeModelClass gnc_tree_model;   /**< The parent object data. */
+
+    /* This signal is emitted to refresh the view */
+    void (*refresh_signal) (GncTreeModelSplitReg *model, gpointer user_data);
+
 } GncTreeModelSplitRegClass;
 
 /** Callback function type */
Index: src/gnome/gnc-plugin-page-register2.c
===================================================================
--- src/gnome/gnc-plugin-page-register2.c	(revision 22540)
+++ src/gnome/gnc-plugin-page-register2.c	(working copy)
@@ -2701,11 +2701,11 @@
 
 static void
 gnc_plugin_page_register2_cmd_void_transaction (GtkAction *action,
-        GncPluginPageRegister2 *page)
+        GncPluginPageRegister2 *page) //this works
 {
     GncPluginPageRegister2Private *priv;
     GtkWidget *dialog, *entry;
-    SplitRegister *reg;
+    GncTreeViewSplitReg *view;
     Transaction *trans;
     GtkBuilder *builder;
     const char *reason;
@@ -2713,62 +2713,62 @@
 
     ENTER("(action %p, page %p)", action, page);
 
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    reg = gnc_ledger_display2_get_split_register(priv->ledger);
-    trans = gnc_split_register_get_current_trans(reg);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    view = gnc_ledger_display2_get_split_view_register (priv->ledger);
+    trans = gnc_tree_view_split_reg_get_current_trans (view);
     if (trans == NULL)
         return;
-    if (xaccTransHasSplitsInState(trans, VREC))
+    if (xaccTransHasSplitsInState (trans, VREC))
         return;
-    if (xaccTransHasReconciledSplits(trans) || xaccTransHasSplitsInState(trans, CREC))
+    if (xaccTransHasReconciledSplits (trans) || xaccTransHasSplitsInState (trans, CREC))
     {
-        gnc_error_dialog(NULL, "%s", _("You cannot void a transaction with reconciled or cleared splits."));
+        gnc_error_dialog (NULL, "%s", _("You cannot void a transaction with reconciled or cleared splits."));
         return;
     }
 
-    if (!gnc_plugin_page_register2_finish_pending(GNC_PLUGIN_PAGE(page)))
+    if (!gnc_plugin_page_register2_finish_pending (GNC_PLUGIN_PAGE (page)))
         return;
 
     builder = gtk_builder_new();
     gnc_builder_add_from_file  (builder , "gnc-plugin-page-register2.glade", "Void Transaction");
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Void Transaction"));
-    entry = GTK_WIDGET(gtk_builder_get_object (builder, "reason"));
+    dialog = GTK_WIDGET (gtk_builder_get_object (builder, "Void Transaction"));
+    entry = GTK_WIDGET (gtk_builder_get_object (builder, "reason"));
 
-    result = gtk_dialog_run(GTK_DIALOG(dialog));
+    result = gtk_dialog_run (GTK_DIALOG (dialog));
     if (result == GTK_RESPONSE_OK)
     {
-        reason = gtk_entry_get_text(GTK_ENTRY(entry));
+        reason = gtk_entry_get_text (GTK_ENTRY (entry));
         if (reason == NULL)
             reason = "";
-        gnc_split_register_void_current_trans(reg, reason);
+        gnc_tree_view_split_reg_void_current_trans (view, reason);
     }
 
     /* All done. Get rid of it. */
-    gtk_widget_destroy(dialog);
-    g_object_unref(G_OBJECT(builder));
+    gtk_widget_destroy (dialog);
+    g_object_unref (G_OBJECT(builder));
 }
 
 
 static void
 gnc_plugin_page_register2_cmd_unvoid_transaction (GtkAction *action,
-        GncPluginPageRegister2 *page)
+        GncPluginPageRegister2 *page) //this works
 {
     GncPluginPageRegister2Private *priv;
-    SplitRegister *reg;
+    GncTreeViewSplitReg *view;
     Transaction *trans;
 
     ENTER("(action %p, page %p)", action, page);
 
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    reg = gnc_ledger_display2_get_split_register(priv->ledger);
-    trans = gnc_split_register_get_current_trans(reg);
-    if (!xaccTransHasSplitsInState(trans, VREC))
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    view = gnc_ledger_display2_get_split_view_register (priv->ledger);
+    trans = gnc_tree_view_split_reg_get_current_trans (view);
+    if (!xaccTransHasSplitsInState (trans, VREC))
         return;
-    gnc_split_register_unvoid_current_trans(reg);
+    gnc_tree_view_split_reg_unvoid_current_trans (view);
     LEAVE(" ");
 }
 
