diff --git a/cdr/cdr_odbc.c b/cdr/cdr_odbc.c
index c28a329c9f82ea82e75f5f981c25fc95fab09d30..e48fa07bf4847dca92cbe089d385866a6403efb3 100755
--- a/cdr/cdr_odbc.c
+++ b/cdr/cdr_odbc.c
@@ -37,8 +37,8 @@
 static char *desc = "ODBC CDR Backend";
 static char *name = "ODBC";
 static char *config = "cdr_odbc.conf";
-static char *dsn = NULL, *username = NULL, *password = NULL, *loguniqueid = NULL;
-static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, loguniqueid_alloc = 0;
+static char *dsn = NULL, *username = NULL, *password = NULL, *loguniqueid = NULL, *table = NULL;
+static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, loguniqueid_alloc = 0, table_alloc = 0;
 static int connected = 0;
 
 AST_MUTEX_DEFINE_STATIC(odbc_lock);
@@ -66,15 +66,15 @@ static int odbc_log(struct ast_cdr *cdr)
 	strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
 	memset(sqlcmd,0,2048);
 	if ((loguniqueid != NULL) && (ast_true(loguniqueid))) {
-		snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO cdr "
+		snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s "
 		"(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,"
 		"lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield) "
-		"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+		"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table);
 	} else {
-		snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO cdr "
+		snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s "
 		"(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,"
 		"duration,billsec,disposition,amaflags,accountcode) "
-		"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+		"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table);
 	}
 
 	if (!connected) {
@@ -211,6 +211,13 @@ static int odbc_unload_module(void)
 		loguniqueid = NULL;
 		loguniqueid_alloc = 0;
 	}
+	if (table && table_alloc) {
+		if (option_verbose > 10)
+			ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free table\n");
+		free(table);
+		table = NULL;
+		table_alloc = 0;
+	}
 	ast_cdr_unregister(name);
 	ast_mutex_unlock(&odbc_lock);
 	return 0;
@@ -302,11 +309,28 @@ static int odbc_load_module(void)
 		loguniqueid = NULL;
 	}
 
+	tmp = ast_variable_retrieve(cfg,"global","table");
+	if (tmp) {
+		table = malloc(strlen(tmp) + 1);
+		if (table != NULL) {
+			memset(table, 0, strlen(tmp) + 1);
+			table_alloc = 1;
+			strncpy(table, tmp, strlen(tmp));
+		} else {
+			ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
+			return -1;
+		}
+	} else {
+		ast_log(LOG_WARNING,"cdr_odbc: table not specified.  Assuming cdr\n");
+		table = "cdr";
+	}
+
 	ast_destroy(cfg);
 	if (option_verbose > 3) {
 		ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: dsn is %s\n",dsn);
 		ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: username is %s\n",username);
 		ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: password is [secret]\n");
+		ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: table is %s\n",table);
 	}
 	
 	res = odbc_init();
@@ -420,7 +444,13 @@ int reload(void)
 
 int usecount(void)
 {
-	return connected;
+	/* Simplistic use count */
+	if (ast_mutex_trylock(&odbc_lock)) {
+		return 1;
+	} else {
+		ast_mutex_unlock(&odbc_lock);
+		return 0;
+	}
 }
 
 char *key()
diff --git a/configs/cdr_odbc.conf.sample b/configs/cdr_odbc.conf.sample
index 3427748f9878fb420b261a5ddb2f968400cecf6a..b488006cd1095134aa8df2fa1aae5b78c8038b2f 100755
--- a/configs/cdr_odbc.conf.sample
+++ b/configs/cdr_odbc.conf.sample
@@ -1,5 +1,5 @@
 ;
-; cdr_unixodbc.conf
+; cdr_odbc.conf
 ;
 
 ;[global]
@@ -7,3 +7,4 @@
 ;username=username
 ;password=password
 ;loguniqueid=yes
+;table=cdr		;"cdr" is default table name