diff --git a/src/engine/Transaction.c b/src/engine/Transaction.c
index 567a275..8c7402d 100644
--- a/src/engine/Transaction.c
+++ b/src/engine/Transaction.c
@@ -177,6 +177,7 @@ const char *void_reason_str = "void-reason";
 const char *void_time_str = "void-time";
 const char *void_former_notes_str = "void-former-notes";
 const char *trans_is_closing_str = "book_closing";
+const char *assoc_uri_str = "assoc_uri";
 
 /* KVP entry for date-due value */
 #define TRANS_DATE_DUE_KVP       "trans-date-due"
@@ -2007,6 +2008,25 @@ xaccTransSetDescription (Transaction *trans, const char *desc)
 }
 
 static void
+qofTransSetAssociation (Transaction *trans, const char *assoc)
+{
+    if (!qof_begin_edit(&trans->inst)) return;
+    xaccTransSetAssociation(trans, assoc);
+    qof_commit_edit(&trans->inst);
+}
+
+void
+xaccTransSetAssociation (Transaction *trans, const char *assoc)
+{
+    if (!trans || !assoc) return;
+    xaccTransBeginEdit(trans);
+
+    kvp_frame_set_str (trans->inst.kvp_data, assoc_uri_str, assoc);
+    qof_instance_set_dirty(QOF_INSTANCE(trans));
+    xaccTransCommitEdit(trans);
+}
+
+static void
 qofTransSetNotes (Transaction *trans, const char *notes)
 {
     if (!qof_begin_edit(&trans->inst)) return;
@@ -2090,6 +2110,13 @@ xaccTransGetDescription (const Transaction *trans)
 }
 
 const char *
+xaccTransGetAssociation (const Transaction *trans)
+{
+    return trans ?
+           kvp_frame_get_string (trans->inst.kvp_data, assoc_uri_str) : NULL;
+}
+
+const char *
 xaccTransGetNotes (const Transaction *trans)
 {
     return trans ?
@@ -2688,6 +2715,11 @@ gboolean xaccTransRegister (void)
             (QofSetterFunc)qofTransSetNotes
         },
         {
+            TRANS_ASSOCIATION, QOF_TYPE_STRING,
+            (QofAccessFunc)xaccTransGetAssociation,
+            (QofSetterFunc)qofTransSetAssociation
+        },
+        {
             TRANS_IS_CLOSING, QOF_TYPE_BOOLEAN,
             (QofAccessFunc)xaccTransGetIsClosingTxn, NULL
         },
diff --git a/src/engine/Transaction.h b/src/engine/Transaction.h
index 51ba5e0..8091dba 100644
--- a/src/engine/Transaction.h
+++ b/src/engine/Transaction.h
@@ -310,6 +310,9 @@ void          xaccTransSetNum (Transaction *trans, const char *num);
 /** Sets the transaction Description */
 void          xaccTransSetDescription (Transaction *trans, const char *desc);
 
+/** Sets the transaction Association */
+void          xaccTransSetAssociation (Transaction *trans, const char *assoc);
+
 /** Sets the transaction Notes
  *
  The Notes field is only visible in the register in double-line mode */
@@ -323,6 +326,8 @@ void          xaccTransSetNotes (Transaction *trans, const char *notes);
 const char *  xaccTransGetNum (const Transaction *trans);
 /** Gets the transaction Description */
 const char *  xaccTransGetDescription (const Transaction *trans);
+/** Gets the transaction association */
+const char *  xaccTransGetAssociation(const Transaction *trans);
 /** Gets the transaction Notes
  *
  The Notes field is only visible in the register in double-line mode */
@@ -724,6 +729,7 @@ Timespec xaccTransGetVoidTime(const Transaction *tr);
 #define TRANS_IS_BALANCED	"trans-balanced?"
 #define TRANS_IS_CLOSING        "trans-is-closing?"
 #define TRANS_NOTES		"notes"
+#define TRANS_ASSOCIATION	"assoc"
 #define TRANS_TYPE		"type"
 #define TRANS_VOID_STATUS	"void-p"
 #define TRANS_VOID_REASON	"void-reason"
diff --git a/src/gnome-utils/gnc-gnome-utils.c b/src/gnome-utils/gnc-gnome-utils.c
index d023e48..d697ab9 100644
--- a/src/gnome-utils/gnc-gnome-utils.c
+++ b/src/gnome-utils/gnc-gnome-utils.c
@@ -398,6 +398,74 @@ gnc_gnome_help (const char *file_name, const char *anchor)
 
 #endif
 
+#ifdef MAC_INTEGRATION
+
+/* Don't be alarmed if this function looks strange to you: It's
+ * written in Objective-C, the native language of the OSX Cocoa
+ * toolkit.
+ */
+void
+gnc_launch_assoc (const char *uri)
+{
+    NSURL *url = [[NSURL alloc] initWithString:uri];
+
+    if (url)
+    {
+		[[NSWorkspace sharedWorkspace] openURL: url];
+		[pool release];
+		return;
+    }
+
+	const gchar *message =
+		_("GnuCash could not find the associated file.");
+	gnc_error_dialog(NULL, "%s", message);
+
+	[pool release];
+    return;
+}
+#elif defined G_OS_WIN32 /* G_OS_WIN32 */
+void
+gnc_launch_assoc (const char *uri)
+{
+    wchar_t *winuri = (wchar_t *)g_utf8_to_utf16(uri, -1, NULL, NULL, NULL);
+
+    if (winuri) {
+        if ((INT_PTR)ShellExecuteW(NULL, "open", winuri, NULL, NULL, SW_SHOWNORMAL) <= 32)
+        {
+			const gchar *message =
+				_("GnuCash could not find the associated file.");
+			gnc_error_dialog(NULL, "%s", message);
+        } 
+		free(winuri);
+    }
+}
+#else
+void
+gnc_launch_assoc (const char *uri)
+{
+    GError *error = NULL;
+    gboolean success;
+
+    if (!uri)
+        return;
+
+    DEBUG ("Attempting to open uri %s", uri);
+    success = gtk_show_uri (NULL, uri, gtk_get_current_event_time (), &error);
+    if (success)
+        return;
+
+    g_assert(error != NULL);
+    {
+        const gchar *message =
+            _("GnuCash could not open the associated URI:");
+        gnc_error_dialog(NULL, "%s\n%s", message, uri);
+    }
+    PERR ("%s", error->message);
+    g_error_free(error);
+}
+
+#endif
+
 /********************************************************************\
  * gnc_gnome_get_pixmap                                             *
  *   returns a GtkWidget given a pixmap filename                    *
diff --git a/src/gnome-utils/gnc-gnome-utils.h b/src/gnome-utils/gnc-gnome-utils.h
index ce4b83f..52a279c 100644
--- a/src/gnome-utils/gnc-gnome-utils.h
+++ b/src/gnome-utils/gnc-gnome-utils.h
@@ -56,6 +56,9 @@ void gnc_gtk_add_rc_file (void);
  */
 void gnc_gnome_help (const char *file_name,
                      const char *anchor);
+/** Launch the default gnome browser and open the provided URI.
+ */
+void gnc_launch_assoc (const char *uri);
 
 /** Set the help callback to 'gnc_book_options_help_cb' to open a help browser
  *  and point it to the Book Options link in the Help file.
diff --git a/src/gnome-utils/gnc-tree-view.c b/src/gnome-utils/gnc-tree-view.c
index ce79914..1849d51 100644
--- a/src/gnome-utils/gnc-tree-view.c
+++ b/src/gnome-utils/gnc-tree-view.c
@@ -848,7 +848,7 @@ gnc_tree_view_get_column_order (GncTreeView *view,
         }
         num_cols++;
     }
-    DEBUG ("got %lu columns: %s", num_cols, col_names);
+    //DEBUG ("got %lu columns: %s", num_cols, col_names);
     col_str_list = g_strsplit (col_names, ";", 0);
 
     /* Clean up */
diff --git a/src/gnome/gnc-plugin-page-register.c b/src/gnome/gnc-plugin-page-register.c
index 33e1b26..76bbbc4 100644
--- a/src/gnome/gnc-plugin-page-register.c
+++ b/src/gnome/gnc-plugin-page-register.c
@@ -170,6 +170,10 @@ static void gnc_plugin_page_register_cmd_scrub_current (GtkAction *action, GncPl
 static void gnc_plugin_page_register_cmd_account_report (GtkAction *action, GncPluginPageRegister *plugin_page);
 static void gnc_plugin_page_register_cmd_transaction_report (GtkAction *action, GncPluginPageRegister *plugin_page);
 
+static void gnc_plugin_page_register_cmd_associate_file_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
+static void gnc_plugin_page_register_cmd_associate_location_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
+static void gnc_plugin_page_register_cmd_execassociated_transaction (GtkAction *action, GncPluginPageRegister *plugin_page);
+
 static void gnc_plugin_page_help_changed_cb( GNCSplitReg *gsr, GncPluginPageRegister *register_page );
 static void gnc_plugin_page_register_refresh_cb (GHashTable *changes, gpointer user_data);
 static void gnc_plugin_page_register_close_cb (gpointer user_data);
@@ -185,26 +189,32 @@ static void gnc_plugin_page_register_event_handler (QofInstance *entity,
 /*                          Actions                         */
 /************************************************************/
 
-#define CUT_TRANSACTION_LABEL         N_("Cu_t Transaction")
-#define COPY_TRANSACTION_LABEL        N_("_Copy Transaction")
-#define PASTE_TRANSACTION_LABEL       N_("_Paste Transaction")
-#define DUPLICATE_TRANSACTION_LABEL   N_("Dup_licate Transaction")
-#define DELETE_TRANSACTION_LABEL      N_("_Delete Transaction")
-#define CUT_SPLIT_LABEL               N_("Cu_t Split")
-#define COPY_SPLIT_LABEL              N_("_Copy Split")
-#define PASTE_SPLIT_LABEL             N_("_Paste Split")
-#define DUPLICATE_SPLIT_LABEL         N_("Dup_licate Split")
-#define DELETE_SPLIT_LABEL            N_("_Delete Split")
-#define CUT_TRANSACTION_TIP           N_("Cut the selected transaction into clipboard")
-#define COPY_TRANSACTION_TIP          N_("Copy the selected transaction into clipboard")
-#define PASTE_TRANSACTION_TIP         N_("Paste the transaction from the clipboard")
-#define DUPLICATE_TRANSACTION_TIP     N_("Make a copy of the current transaction")
-#define DELETE_TRANSACTION_TIP        N_("Delete the current transaction")
-#define CUT_SPLIT_TIP                 N_("Cut the selected split into clipboard")
-#define COPY_SPLIT_TIP                N_("Copy the selected split into clipboard")
-#define PASTE_SPLIT_TIP               N_("Paste the split from the clipboard")
-#define DUPLICATE_SPLIT_TIP           N_("Make a copy of the current split")
-#define DELETE_SPLIT_TIP              N_("Delete the current split")
+#define CUT_TRANSACTION_LABEL            N_("Cu_t Transaction")
+#define COPY_TRANSACTION_LABEL           N_("_Copy Transaction")
+#define PASTE_TRANSACTION_LABEL          N_("_Paste Transaction")
+#define DUPLICATE_TRANSACTION_LABEL      N_("Dup_licate Transaction")
+#define DELETE_TRANSACTION_LABEL         N_("_Delete Transaction")
+#define ASSOCIATE_TRANSACTION_FILE_LABEL      N_("_Associate File with Transaction")
+#define ASSOCIATE_TRANSACTION_LOCATION_LABEL  N_("_Associate Location with Transaction")
+#define EXECASSOCIATED_TRANSACTION_LABEL N_("_Open Associated File/Location")
+#define CUT_SPLIT_LABEL                  N_("Cu_t Split")
+#define COPY_SPLIT_LABEL                 N_("_Copy Split")
+#define PASTE_SPLIT_LABEL                N_("_Paste Split")
+#define DUPLICATE_SPLIT_LABEL            N_("Dup_licate Split")
+#define DELETE_SPLIT_LABEL               N_("_Delete Split")
+#define CUT_TRANSACTION_TIP              N_("Cut the selected transaction into clipboard")
+#define COPY_TRANSACTION_TIP             N_("Copy the selected transaction into clipboard")
+#define PASTE_TRANSACTION_TIP            N_("Paste the transaction from the clipboard")
+#define DUPLICATE_TRANSACTION_TIP        N_("Make a copy of the current transaction")
+#define DELETE_TRANSACTION_TIP           N_("Delete the current transaction")
+#define ASSOCIATE_TRANSACTION_FILE_TIP        N_("Associate a file with the current transaction")
+#define ASSOCIATE_TRANSACTION_LOCATION_TIP    N_("Associate a location with the current transaction")
+#define EXECASSOCIATED_TRANSACTION_TIP   N_("Open the associated file or location with the current transaction")
+#define CUT_SPLIT_TIP                    N_("Cut the selected split into clipboard")
+#define COPY_SPLIT_TIP                   N_("Copy the selected split into clipboard")
+#define PASTE_SPLIT_TIP                  N_("Paste the split from the clipboard")
+#define DUPLICATE_SPLIT_TIP              N_("Make a copy of the current split")
+#define DELETE_SPLIT_TIP                 N_("Delete the current split")
 
 static GtkActionEntry gnc_plugin_page_register_actions [] =
 {
@@ -297,6 +307,21 @@ static GtkActionEntry gnc_plugin_page_register_actions [] =
         "ReverseTransactionAction", NULL, N_("Add _Reversing Transaction"), NULL, NULL,
         G_CALLBACK (gnc_plugin_page_register_cmd_reverse_transaction)
     },
+    {
+        "AssociateTransactionFileAction", NULL, ASSOCIATE_TRANSACTION_FILE_LABEL, NULL,
+        ASSOCIATE_TRANSACTION_FILE_TIP,
+        G_CALLBACK (gnc_plugin_page_register_cmd_associate_file_transaction)
+    },
+    {
+        "AssociateTransactionLocationAction", NULL, ASSOCIATE_TRANSACTION_LOCATION_LABEL, NULL,
+        ASSOCIATE_TRANSACTION_LOCATION_TIP,
+        G_CALLBACK (gnc_plugin_page_register_cmd_associate_location_transaction)
+    },
+    {
+        "ExecAssociatedTransactionAction", NULL, EXECASSOCIATED_TRANSACTION_LABEL, NULL,
+        EXECASSOCIATED_TRANSACTION_TIP,
+        G_CALLBACK (gnc_plugin_page_register_cmd_execassociated_transaction)
+    },
 
     /* View menu */
 
@@ -461,6 +486,9 @@ static action_toolbar_labels toolbar_labels[] =
     { "BlankTransactionAction",     N_("Blank") },
     { "ActionsReconcileAction",     N_("Reconcile") },
     { "ActionsAutoClearAction",     N_("Auto-clear") },
+    { "AssociateTransactionFileAction",     N_("Associate File") },
+    { "AssociateTransactionLocationAction", N_("Associate Location") },
+    { "ExecAssociatedTransactionAction",     N_("Open File/Location") },
     { NULL, NULL },
 };
 
@@ -804,6 +832,8 @@ static const char* readonly_inactive_actions[] =
     "ScheduleTransactionAction",
     "ScrubAllAction",
     "ScrubCurrentAction",
+    "AssociateTransactionFileAction",
+    "AssociateTransactionLocationAction",
     NULL
 };
 
@@ -827,6 +857,9 @@ static const char* tran_action_labels[] =
     PASTE_TRANSACTION_LABEL,
     DUPLICATE_TRANSACTION_LABEL,
     DELETE_TRANSACTION_LABEL,
+    ASSOCIATE_TRANSACTION_FILE_LABEL,
+    ASSOCIATE_TRANSACTION_LOCATION_LABEL,
+    EXECASSOCIATED_TRANSACTION_LABEL,
     NULL
 };
 
@@ -838,6 +871,9 @@ static const char* tran_action_tips[] =
     PASTE_TRANSACTION_TIP,
     DUPLICATE_TRANSACTION_TIP,
     DELETE_TRANSACTION_TIP,
+    ASSOCIATE_TRANSACTION_FILE_TIP,
+    ASSOCIATE_TRANSACTION_LOCATION_TIP,
+    EXECASSOCIATED_TRANSACTION_TIP,
     NULL
 };
 
@@ -3393,6 +3429,54 @@ gnc_plugin_page_register_cmd_delete_transaction (GtkAction *action,
 }
 
 static void
+gnc_plugin_page_register_cmd_associate_file_transaction (GtkAction *action,
+        GncPluginPageRegister *plugin_page)
+{
+    GncPluginPageRegisterPrivate *priv;
+
+    ENTER("(action %p, plugin_page %p)", action, plugin_page);
+
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    gsr_default_associate_handler_file(priv->gsr, NULL);
+    LEAVE(" ");
+
+}
+
+static void
+gnc_plugin_page_register_cmd_associate_location_transaction (GtkAction *action,
+        GncPluginPageRegister *plugin_page)
+{
+    GncPluginPageRegisterPrivate *priv;
+
+    ENTER("(action %p, plugin_page %p)", action, plugin_page);
+
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    gsr_default_associate_handler_location(priv->gsr, NULL);
+    LEAVE(" ");
+
+}
+
+static void
+gnc_plugin_page_register_cmd_execassociated_transaction (GtkAction *action,
+        GncPluginPageRegister *plugin_page)
+{
+    GncPluginPageRegisterPrivate *priv;
+
+    ENTER("(action %p, plugin_page %p)", action, plugin_page);
+
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    gsr_default_execassociated_handler(priv->gsr, NULL);
+    LEAVE(" ");
+
+}
+
+static void
 gnc_plugin_page_register_cmd_blank_transaction (GtkAction *action,
         GncPluginPageRegister *plugin_page)
 {
diff --git a/src/gnome/gnc-split-reg.c b/src/gnome/gnc-split-reg.c
index 0c66364..adf5968 100644
--- a/src/gnome/gnc-split-reg.c
+++ b/src/gnome/gnc-split-reg.c
@@ -45,6 +45,7 @@
 #include "gnc-euro.h"
 #include "gnc-prefs.h"
 #include "gnc-gui-query.h"
+#include "gnc-gnome-utils.h"
 #include "gnc-ledger-display.h"
 #include "gnc-pricedb.h"
 #include "gnc-ui-util.h"
@@ -106,6 +107,9 @@ void gsr_default_paste_txn_handler( GNCSplitReg *w, gpointer ud );
 void gsr_default_void_txn_handler ( GNCSplitReg *w, gpointer ud );
 void gsr_default_unvoid_txn_handler  ( GNCSplitReg *w, gpointer ud );
 void gsr_default_reverse_txn_handler ( GNCSplitReg *w, gpointer ud );
+void gsr_default_associate_handler_file   ( GNCSplitReg *w, gpointer ud );
+void gsr_default_associate_handler_location   ( GNCSplitReg *w, gpointer ud );
+void gsr_default_execassociated_handler   ( GNCSplitReg *w, gpointer ud );
 
 static void gsr_emit_simple_signal( GNCSplitReg *gsr, const char *sigName );
 static void gsr_emit_help_changed( GnucashRegister *reg, gpointer user_data );
@@ -1006,6 +1010,185 @@ gnc_split_reg_reinitialize_trans_cb(GtkWidget *widget, gpointer data)
     gsr_emit_simple_signal( gsr, "reinit_ent" );
 }
 
+/**
+ * Associates a file URI with the current transaction.
+ **/
+void
+gsr_default_associate_handler_file( GNCSplitReg *gsr, gpointer data )
+{
+    CursorClass cursor_class;
+    SplitRegister *reg;
+    Transaction *trans;
+    Split *split;
+    GtkWidget *dialog;
+
+    reg = gnc_ledger_display_get_split_register( gsr->ledger );
+
+    /* get the current split based on cursor position */
+    split = gnc_split_register_get_current_split(reg);
+    if (split == NULL)
+    {
+        gnc_split_register_cancel_cursor_split_changes (reg);
+        return;
+    }
+
+    trans = xaccSplitGetParent(split);
+    cursor_class = gnc_split_register_get_current_cursor_class (reg);
+
+    if (cursor_class == CURSOR_CLASS_NONE)
+        return;
+
+    if (is_trans_readonly_and_warn(trans))
+        return;
+
+	dialog = gtk_file_chooser_dialog_new ("Associate File with Transaction",
+                                     GTK_WINDOW(gsr->window),
+                                     GTK_FILE_CHOOSER_ACTION_OPEN,
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                     NULL);
+
+	gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(dialog), 0);
+	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+ 	{
+		char *uri;
+
+	    uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
+        DEBUG("File URI: %s\n", uri);
+	    xaccTransSetAssociation(trans, uri);
+    }
+
+	gtk_widget_destroy (dialog);
+
+}
+
+/**
+ * Associates a location URI with the current transaction.
+ **/
+void
+gsr_default_associate_handler_location( GNCSplitReg *gsr, gpointer data )
+{
+    CursorClass cursor_class;
+    SplitRegister *reg;
+    Transaction *trans;
+    Split *split;
+    GtkWidget *dialog, *entry, *label, *content_area;
+
+    reg = gnc_ledger_display_get_split_register( gsr->ledger );
+
+    /* get the current split based on cursor position */
+    split = gnc_split_register_get_current_split(reg);
+    if (split == NULL)
+    {
+        gnc_split_register_cancel_cursor_split_changes (reg);
+        return;
+    }
+
+    trans = xaccSplitGetParent(split);
+    cursor_class = gnc_split_register_get_current_cursor_class (reg);
+
+    if (cursor_class == CURSOR_CLASS_NONE)
+        return;
+
+    if (is_trans_readonly_and_warn(trans))
+        return;
+
+    dialog = gtk_dialog_new_with_buttons ("Associate Location with Transaction",
+                                     GTK_WINDOW(gsr->window),
+                                     GTK_FILE_CHOOSER_ACTION_OPEN,
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                     NULL);
+
+#ifdef HAVE_GTK_2_14
+    content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+#else
+    content_area = GTK_DIALOG (dialog)->vbox;
+#endif
+
+    // add a label
+    label = gtk_label_new ("Please enter URL:");
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+    gtk_container_add (GTK_CONTAINER (content_area), label);
+
+    // add the entry text
+    entry = gtk_entry_new ();
+    gtk_entry_set_width_chars(GTK_ENTRY (entry), 80);
+    gtk_entry_set_activates_default(GTK_ENTRY (entry), TRUE);
+    gtk_container_add (GTK_CONTAINER (content_area), entry);
+
+    // set spacings
+    gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
+    gtk_container_set_border_width (GTK_CONTAINER (label), 5);
+    gtk_container_set_border_width (GTK_CONTAINER (content_area), 5);
+
+    // set the default response
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+
+    // run the dialog
+    gtk_widget_show_all (dialog);
+
+    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+		const char *uri;
+
+        uri = gtk_entry_get_text (GTK_ENTRY (entry));
+        DEBUG("Location URI: %s\n", uri);
+        xaccTransSetAssociation(trans, uri);
+    }
+
+     gtk_widget_destroy (dialog);
+
+}
+/**
+ * Executes the associated link with the current transaction.
+ **/
+void
+gsr_default_execassociated_handler( GNCSplitReg *gsr, gpointer data )
+{
+    CursorClass cursor_class;
+    SplitRegister *reg;
+    Transaction *trans;
+    Split *split;
+    GtkWidget *dialog;
+    const char *uri;
+
+    reg = gnc_ledger_display_get_split_register( gsr->ledger );
+
+    /* get the current split based on cursor position */
+    split = gnc_split_register_get_current_split(reg);
+    if (split == NULL)
+    {
+        gnc_split_register_cancel_cursor_split_changes (reg);
+        return;
+    }
+
+    trans = xaccSplitGetParent(split);
+    cursor_class = gnc_split_register_get_current_cursor_class (reg);
+
+    if (cursor_class == CURSOR_CLASS_NONE)
+        return;
+
+#ifdef DUMP_FUNCTIONS
+   xaccTransDump (trans, "ExecAssociated")
+#endif
+
+    uri = xaccTransGetAssociation(trans);
+    if (!uri)
+    {
+        const gchar *message =
+            _("This transaction is not associated with a URI.");
+        gnc_error_dialog(NULL, "%s", message);
+        return;
+    }
+    else
+    {
+        gnc_launch_assoc(uri);
+    }
+
+    return;
+}
+
 void
 gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data )
 {
diff --git a/src/gnome/gnc-split-reg.h b/src/gnome/gnc-split-reg.h
index e9e8bce..9cbb4ea 100644
--- a/src/gnome/gnc-split-reg.h
+++ b/src/gnome/gnc-split-reg.h
@@ -242,6 +242,9 @@ void gnc_split_reg_balancing_entry (GNCSplitReg *gsr, Account *account,
                                     time64 statement_date, gnc_numeric balancing_amount);
 
 void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );
+void gsr_default_associate_handler_file( GNCSplitReg *gsr, gpointer data );
+void gsr_default_associate_handler_location( GNCSplitReg *gsr, gpointer data );
+void gsr_default_execassociated_handler( GNCSplitReg *gsr, gpointer data );
 void gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction );
 void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data );
diff --git a/src/gnome/ui/gnc-plugin-page-register-ui.xml b/src/gnome/ui/gnc-plugin-page-register-ui.xml
index ddcc51c..55c80e9 100644
--- a/src/gnome/ui/gnc-plugin-page-register-ui.xml
+++ b/src/gnome/ui/gnc-plugin-page-register-ui.xml
@@ -20,6 +20,10 @@
       <menuitem name="VoidTransaction"    	action="VoidTransactionAction"/>
       <menuitem name="UnvoidTransaction"  	action="UnvoidTransactionAction"/>
       <menuitem name="ReverseTransaction" 	action="ReverseTransactionAction"/>
+      <separator name="TransactionSep3"/>
+      <menuitem name="AssociateTransactionFile" action="AssociateTransactionFileAction"/>
+      <menuitem name="AssociateTransactionLocation"    	action="AssociateTransactionLocationAction"/>
+      <menuitem name="ExecAssociateTransaction" action="ExecAssociatedTransactionAction"/>
     </menu>
 
     <menu name="View" action="ViewAction">
@@ -92,6 +96,10 @@
       <menuitem name="RecordTransaction"       action="RecordTransactionAction"/>
       <menuitem name="CancelTransaction"       action="CancelTransactionAction"/>
       <separator name="PopupSep3"/>
+      <menuitem name="AssociateTransactionFile" action="AssociateTransactionFileAction"/>
+      <menuitem name="AssociateTransactionLocation"    	action="AssociateTransactionLocationAction"/>
+      <menuitem name="ExecAssociateTransaction" action="ExecAssociatedTransactionAction"/>
+      <separator name="PopupSep4"/>
       <menuitem name="BlankTransaction"        action="BlankTransactionAction"/>
       <menuitem name="SplitTransaction"        action="SplitTransactionAction"/>
       <menuitem name="EditExchangeRate"        action="EditExchangeRateAction"/>
