Index: src/register/ledger-core/split-register-model.c
===================================================================
--- src/register/ledger-core/split-register-model.c	(revision 18169)
+++ src/register/ledger-core/split-register-model.c	(working copy)
@@ -402,7 +402,63 @@
 
   if (gnc_cell_name_equal (cell_name, BALN_CELL))
     balance = xaccSplitGetBalance (split);
-  else
+  else if (gnc_cell_name_equal (cell_name, RBALN_CELL)) {
+    SRInfo *info = gnc_split_register_get_info (reg);
+    gnc_numeric value = gnc_numeric_zero();
+    Account *account;
+    Transaction *trans;
+    GList *node, *children, *child;
+    int i, row;
+
+      /* This cell calculates the register balance for a particular split at runtime.
+       * This function should work regardless of the sort order. */
+    balance = gnc_numeric_zero();
+
+      /* Return NULL if this is a blank transaction. */
+      split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
+      if (split == xaccSplitLookup (&info->blank_split_guid,
+                                    gnc_get_current_book ()))
+        return black;
+
+      trans = xaccSplitGetParent (split);
+      if (!trans)
+        return black;
+
+      /* Get a list of all subaccounts for matching */
+      children = gnc_account_get_descendants(gnc_split_register_get_default_account(reg));
+      children = g_list_append(children, gnc_split_register_get_default_account(reg));
+
+      /* Get the row number we're on, then start with the first row. */
+      row = virt_loc.vcell_loc.virt_row;
+      virt_loc.vcell_loc.virt_row=0;
+
+      while (virt_loc.vcell_loc.virt_row <= row ) {
+        /* Get new temporary split and its parent transaction */
+        split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
+        trans = xaccSplitGetParent (split);
+
+        i = 1;
+        for (node = xaccTransGetSplitList (trans); node; node = node->next) {
+          Split *secondary = node->data;
+          i++;
+
+          /* Add up the splits that belong to the transaction if they are
+           * from the lead account or one of the subaccounts. */
+          account = xaccSplitGetAccount (secondary);
+
+          for (child = children; child; child = child->next) {
+            if (account == child->data) {
+              balance = gnc_numeric_add_fixed(balance, xaccSplitGetAmount(secondary));
+              break;
+            }
+          }
+        }
+        virt_loc.vcell_loc.virt_row+=i;
+      }
+
+    if (gnc_numeric_negative_p (balance))
+      return red;
+  } else
     balance = get_trans_total_balance (reg, xaccSplitGetParent (split));
 
   {
@@ -1505,6 +1561,68 @@
   }
 }
 
+/* Calculates the register balance for each split at runtime.
+ * This works regardless of the sort order. */
+static const char *
+gnc_split_register_get_rbaln_entry (VirtualLocation virt_loc,
+                                      gboolean translate,
+                                      gboolean *conditionally_changed,
+                                      gpointer user_data)
+{
+  SplitRegister *reg = user_data;
+  SRInfo *info = gnc_split_register_get_info (reg);
+  gnc_numeric value = gnc_numeric_zero(), balance = gnc_numeric_zero();
+  Split *split;
+  Account *account;
+  Transaction *trans;
+  GList *node, *children, *child;
+  int i, row;
+
+  /* Return NULL if this is a blank transaction. */
+  split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
+  if (split == xaccSplitLookup (&info->blank_split_guid,
+                                gnc_get_current_book ()))
+    return NULL;
+
+  trans = xaccSplitGetParent (split);
+  if (!trans)
+    return NULL;
+
+  /* Get a list of all subaccounts for matching */
+  children = gnc_account_get_descendants(gnc_split_register_get_default_account(reg));
+  children = g_list_append(children, gnc_split_register_get_default_account(reg));
+
+  /* Get the row number we're on, then start with the first row. */
+  row = virt_loc.vcell_loc.virt_row;
+  virt_loc.vcell_loc.virt_row=0;
+
+  while (virt_loc.vcell_loc.virt_row <= row ) {
+    /* Get new temporary split and its parent transaction */
+    split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
+    trans = xaccSplitGetParent (split);
+
+    i = 1;
+    for (node = xaccTransGetSplitList (trans); node; node = node->next) {
+      Split *secondary = node->data;
+      i++;
+
+      /* Add up the splits that belong to the transaction if they are
+       * from the lead account or one of the subaccounts. */
+      account = xaccSplitGetAccount (secondary);
+
+      for (child = children; child; child = child->next) {
+        if (account == child->data) {
+          balance = gnc_numeric_add_fixed(balance, xaccSplitGetAmount(secondary));
+          break;
+        }
+      }
+    }
+    virt_loc.vcell_loc.virt_row+=i;
+  }
+
+  return xaccPrintAmount (balance, gnc_split_register_print_info (reg));
+}
+
 static gboolean
 gnc_split_register_cursor_is_readonly (VirtualLocation virt_loc,
 				       gpointer user_data)
@@ -2012,7 +2130,11 @@
                                      gnc_split_register_get_debcred_entry,
                                      CRED_CELL);
 
+  gnc_table_model_set_entry_handler (model,
+                                     gnc_split_register_get_rbaln_entry,
+                                     RBALN_CELL);
 
+
   gnc_table_model_set_label_handler (model,
                                      gnc_split_register_get_date_label,
                                      DATE_CELL);
@@ -2101,7 +2223,11 @@
                                      gnc_split_register_get_fcredit_label,
                                      FCRED_CELL);
 
+  gnc_table_model_set_label_handler (model,
+                                     gnc_split_register_get_tbalance_label,
+                                     RBALN_CELL);
 
+
   gnc_table_model_set_default_help_handler(
       model, gnc_split_register_get_default_help);
 
@@ -2231,7 +2357,10 @@
   gnc_table_model_set_fg_color_handler(
       model, gnc_split_register_get_balance_fg_color, TBALN_CELL);
 
+  gnc_table_model_set_fg_color_handler(
+      model, gnc_split_register_get_balance_fg_color, RBALN_CELL);
 
+
   gnc_table_model_set_default_bg_color_handler(
       model, gnc_split_register_get_bg_color);
 
Index: src/register/ledger-core/split-register.h
===================================================================
--- src/register/ledger-core/split-register.h	(revision 18169)
+++ src/register/ledger-core/split-register.h	(working copy)
@@ -209,6 +209,7 @@
 #define TYPE_CELL  "split-type"
 #define XFRM_CELL  "account"
 #define VNOTES_CELL "void-notes"
+#define RBALN_CELL "reg-run-balance"
 /** @} */
 
 /** @name Cursor Names
Index: src/register/ledger-core/split-register-layout.c
===================================================================
--- src/register/ledger-core/split-register-layout.c	(revision 18169)
+++ src/register/ledger-core/split-register-layout.c	(working copy)
@@ -248,7 +248,7 @@
           gnc_table_layout_set_cell (layout, curs, DEBT_CELL,  0, 5);
           gnc_table_layout_set_cell (layout, curs, CRED_CELL,  0, 6);
         }
-        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
+        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
 
         curs_last = curs;
         curs = gnc_table_layout_get_cursor (layout,
@@ -268,7 +268,8 @@
         gnc_table_layout_set_cell (layout, curs, DESC_CELL,  0, 2);
         gnc_table_layout_set_cell (layout, curs, TDEBT_CELL, 0, 5);
         gnc_table_layout_set_cell (layout, curs, TCRED_CELL, 0, 6);
-        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
+        gnc_table_layout_set_cell (layout, curs, RBALN_CELL, 0, 7);
+        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
 
         curs_last = curs;
         curs = gnc_table_layout_get_cursor (layout,
@@ -296,7 +297,7 @@
           gnc_table_layout_set_cell (layout, curs, DEBT_CELL,  0, 5);
           gnc_table_layout_set_cell (layout, curs, CRED_CELL,  0, 6);
         }
-        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 7);
+        gnc_table_layout_set_cell (layout, curs, RATE_CELL, 0, 8);
 
         break;
       }
@@ -459,7 +460,7 @@
     case INCOME_LEDGER:
     case GENERAL_LEDGER:
     case SEARCH_LEDGER:
-      num_cols = 8;
+      num_cols = 9;
       break;
 
     case STOCK_REGISTER:
@@ -702,6 +703,15 @@
                          CELL_ALIGN_LEFT,
                          FALSE,
                          FALSE);
+
+  gnc_register_add_cell (layout,
+                         RBALN_CELL,
+                         PRICE_CELL_TYPE_NAME,
+                         N_("sample:999,999.000") + 7,
+                         CELL_ALIGN_RIGHT,
+                         FALSE,
+                         FALSE);
+
 }
 
 TableLayout *
