diff --git a/apps/Makefile b/apps/Makefile
index e5a50c050df25823d597438133a73962039fe159..e1f22a18d184fadf766ceedb57a0ea0c3e6003d4 100755
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -24,7 +24,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\
      app_authenticate.so app_softhangup.so app_lookupblacklist.so \
      app_waitforring.so app_privacy.so app_db.so app_chanisavail.so \
      app_enumlookup.so app_transfer.so app_setcidnum.so app_cdr.so \
-     app_hasnewvoicemail.so app_sayunixtime.so app_cut.so app_read.so
+     app_hasnewvoicemail.so app_sayunixtime.so app_cut.so app_read.so app_setcdruserfield.so
 
 ifneq (${OSARCH},Darwin)
 APPS+=app_intercom.so
diff --git a/apps/app_setcdruserfield.c b/apps/app_setcdruserfield.c
new file mode 100755
index 0000000000000000000000000000000000000000..19eb1d4e3bd8c75e743d382075f073490d2ad4bb
--- /dev/null
+++ b/apps/app_setcdruserfield.c
@@ -0,0 +1,108 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Applictions connected with CDR engine
+ * 
+ * Copyright (C) 2003, Digium
+ *
+ * Justin Huff <jjhuff@mspin.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <sys/types.h>
+#include <asterisk/channel.h>
+#include <asterisk/cdr.h>
+#include <asterisk/module.h>
+#include <asterisk/pbx.h>
+#include <asterisk/logger.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+static char *tdesc = "CDR user field apps";
+
+static char *setcdruserfield_descrip = 
+		"SetCDRUserField(value): Set the CDR user field to value\n";
+		
+static char *setcdruserfield_app = "SetCDRUserField";
+static char *setcdruserfield_synopsis = "Set the CDR user field";
+
+static char *appendcdruserfield_descrip = 
+		"AppendCDRUserField(value): Append value to the CDR user field\n";
+		
+static char *appendcdruserfield_app = "AppendCDRUserField";
+static char *appendcdruserfield_synopsis = "Append to the CDR user field";
+
+STANDARD_LOCAL_USER;
+
+LOCAL_USER_DECL;
+
+static int setcdruserfield_exec(struct ast_channel *chan, void *data)
+{
+	struct localuser *u;
+	int res = 0;
+	
+	LOCAL_USER_ADD(u)
+	if (chan->cdr && data) 
+	{
+		ast_cdr_setuserfield(chan, (char*)data);
+	}
+
+	LOCAL_USER_REMOVE(u);
+	
+	return res;
+}
+
+static int appendcdruserfield_exec(struct ast_channel *chan, void *data)
+{
+	struct localuser *u;
+	int res = 0;
+	
+	LOCAL_USER_ADD(u)
+	if (chan->cdr && data) 
+	{
+		ast_cdr_appenduserfield(chan, (char*)data);
+	}
+
+	LOCAL_USER_REMOVE(u);
+	
+	return res;
+}
+
+int unload_module(void)
+{
+	int res;
+	STANDARD_HANGUP_LOCALUSERS;
+	res = ast_unregister_application(setcdruserfield_app);
+	res |= ast_unregister_application(appendcdruserfield_app);
+	return res;
+}
+
+int load_module(void)
+{
+	int res;
+	res = ast_register_application(setcdruserfield_app, setcdruserfield_exec, setcdruserfield_synopsis, setcdruserfield_descrip);
+	res |= ast_register_application(appendcdruserfield_app, appendcdruserfield_exec, appendcdruserfield_synopsis, appendcdruserfield_descrip);
+
+	return res;
+}
+
+char *description(void)
+{
+	return tdesc;
+}
+
+int usecount(void)
+{
+	int res;
+	STANDARD_USECOUNT(res);
+	return res;
+}
+
+char *key()
+{
+	return ASTERISK_GPL_KEY;
+}
diff --git a/cdr.c b/cdr.c
index ba7c5faa714143e8d590b04d85f10babdbd46a0b..38ff053fd00bb47396250676edeeec5e86cf7c08 100755
--- a/cdr.c
+++ b/cdr.c
@@ -345,6 +345,27 @@ int ast_cdr_setaccount(struct ast_channel *chan, char *account)
 	return 0;
 }
 
+int ast_cdr_setuserfield(struct ast_channel *chan, char *userfield)
+{
+	struct ast_cdr *cdr = chan->cdr;
+
+	if (cdr)
+		strncpy(cdr->userfield, userfield, sizeof(cdr->userfield) - 1);
+	return 0;
+}
+
+int ast_cdr_appenduserfield(struct ast_channel *chan, char *userfield)
+{
+	struct ast_cdr *cdr = chan->cdr;
+
+	if (cdr)
+	{
+		int len = strlen(cdr->userfield);
+		strncpy(cdr->userfield+len, userfield, sizeof(cdr->userfield) - len - 1);
+	}
+	return 0;
+}
+
 int ast_cdr_update(struct ast_channel *c)
 {
 	struct ast_cdr *cdr = c->cdr;
diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h
index 3988832df494bef45a059559c876656e0d0e21f5..85670017f5155f3fbaec56af2156b24aa7316530 100755
--- a/include/asterisk/cdr.h
+++ b/include/asterisk/cdr.h
@@ -28,7 +28,9 @@
 //! AMA Flags
 #define AST_CDR_OMIT				(1)
 #define AST_CDR_BILLING				(2)
-#define AST_CDR_DOCUMENTATION		(3)
+#define AST_CDR_DOCUMENTATION			(3)
+
+#define AST_MAX_USER_FIELD			256
 
 struct ast_channel;
 
@@ -70,6 +72,8 @@ struct ast_cdr {
 	int posted;				
         /* Unique Channel Identifier */
         char uniqueid[32];
+	/* User field */
+	char userfield[AST_MAX_USER_FIELD];
 };
 
 typedef int (*ast_cdrbe)(struct ast_cdr *cdr);
@@ -224,6 +228,12 @@ extern void ast_cdr_reset(struct ast_cdr *cdr, int post);
 extern char *ast_cdr_flags2str(int flags);
 
 extern int ast_cdr_setaccount(struct ast_channel *chan, char *account);
+
+
+extern int ast_cdr_setuserfield(struct ast_channel *chan, char *userfield);
+extern int ast_cdr_appenduserfield(struct ast_channel *chan, char *userfield);
+
+
 /* Update CDR on a channel */
 extern int ast_cdr_update(struct ast_channel *chan);