diff --git a/CHANGES b/CHANGES
index 26bcb499004495a2bac19b620d0ac895f62e1501..58291cf75cefa038cf417f4a6127b24cdd9cbf42 100644
--- a/CHANGES
+++ b/CHANGES
@@ -163,6 +163,17 @@ cel_pgsql
    configurable for cel_pgsql via the 'schema' in configuration file
    cel_pgsql.conf.
 
+CDR Backends
+------------------
+
+cdr_adaptive_odbc
+------------------
+ * Added the ability to set the character to quote identifiers. This
+   allows adding the character at the start and end of table and column
+   names. This setting is configurable for cdr_adaptive_odbc via the
+   quoted_identifiers in configuration file cdr_adaptive_odbc.conf.
+
+
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.3.0 to Asterisk 13.4.0 ------------
 ------------------------------------------------------------------------------
diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c
index 83877cbf1d9442785208c4f64b7a49415644e913..e6b60dc10ee1de91cb25a9810bdd11e459689f21 100644
--- a/cdr/cdr_adaptive_odbc.c
+++ b/cdr/cdr_adaptive_odbc.c
@@ -82,6 +82,7 @@ struct tables {
 	char *connection;
 	char *table;
 	char *schema;
+	char quoted_identifiers;
 	unsigned int usegmtime:1;
 	AST_LIST_HEAD_NOLOCK(odbc_columns, columns) columns;
 	AST_RWLIST_ENTRY(tables) list;
@@ -101,6 +102,7 @@ static int load_config(void)
 	char connection[40];
 	char table[40];
 	char schema[40];
+	char quoted_identifiers;
 	int lenconnection, lentable, lenschema, usegmtime = 0;
 	SQLLEN sqlptr;
 	int res = 0;
@@ -149,6 +151,16 @@ static int load_config(void)
 		ast_copy_string(schema, tmp, sizeof(schema));
 		lenschema = strlen(schema);
 
+		if (ast_strlen_zero(tmp = ast_variable_retrieve(cfg, catg, "quoted_identifiers"))) {
+			tmp = "";
+		}
+		quoted_identifiers = tmp[0];
+		if (strlen(tmp) > 1) {
+			ast_log(LOG_ERROR, "The quoted_identifiers setting only accepts a single character,"
+				" while a value of '%s' was provided. This option has been disabled as a result.\n", tmp);
+			quoted_identifiers = '\0';
+		}
+
 		res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt);
 		if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
 			ast_log(LOG_WARNING, "SQL Alloc Handle failed on connection '%s'!\n", connection);
@@ -164,7 +176,7 @@ static int load_config(void)
 			continue;
 		}
 
-		tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1 + lenschema + 1);
+		tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1 + lenschema + 1 + 1);
 		if (!tableptr) {
 			ast_log(LOG_ERROR, "Out of memory creating entry for table '%s' on connection '%s'%s%s%s\n", table, connection,
 				lenschema ? " (schema '" : "", lenschema ? schema : "", lenschema ? "')" : "");
@@ -181,6 +193,7 @@ static int load_config(void)
 		ast_copy_string(tableptr->connection, connection, lenconnection + 1);
 		ast_copy_string(tableptr->table, table, lentable + 1);
 		ast_copy_string(tableptr->schema, schema, lenschema + 1);
+		tableptr->quoted_identifiers = quoted_identifiers;
 
 		ast_verb(3, "Found adaptive CDR table %s@%s.\n", tableptr->table, tableptr->connection);
 
@@ -400,10 +413,27 @@ static int odbc_log(struct ast_cdr *cdr)
 
 	AST_LIST_TRAVERSE(&odbc_tables, tableptr, list) {
 		int first = 1;
+		int quoted = 0;
+
+		if (tableptr->quoted_identifiers != '\0'){
+			quoted = 1;
+		}
+
 		if (ast_strlen_zero(tableptr->schema)) {
-			ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+			if (quoted) {
+				ast_str_set(&sql, 0, "INSERT INTO %c%s%c (",
+					tableptr->quoted_identifiers, tableptr->table, tableptr->quoted_identifiers );
+			}else{
+				ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+			}
 		} else {
-			ast_str_set(&sql, 0, "INSERT INTO %s.%s (", tableptr->schema, tableptr->table);
+			if (quoted) {
+				ast_str_set(&sql, 0, "INSERT INTO %c%s%c.%c%s%c (",
+						tableptr->quoted_identifiers, tableptr->schema, tableptr->quoted_identifiers,
+						tableptr->quoted_identifiers, tableptr->table,  tableptr->quoted_identifiers);
+			}else{
+				ast_str_set(&sql, 0, "INSERT INTO %s.%s (", tableptr->schema, tableptr->table);
+			}
 		}
 		ast_str_set(&sql2, 0, " VALUES (");
 
@@ -708,7 +738,11 @@ static int odbc_log(struct ast_cdr *cdr)
 					ast_log(LOG_WARNING, "Column type %d (field '%s:%s:%s') is unsupported at this time.\n", entry->type, tableptr->connection, tableptr->table, entry->name);
 					continue;
 				}
-				ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name);
+				if (quoted) {
+					ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name);
+				} else {
+					ast_str_append(&sql, 0, "%s%c%s%c", first ? "" : ",", tableptr->quoted_identifiers, entry->name, tableptr->quoted_identifiers);
+				}
 				first = 0;
 			} else if (entry->filtervalue
 				&& ((!entry->negatefiltervalue && entry->filtervalue[0] != '\0')
diff --git a/configs/samples/cdr_adaptive_odbc.conf.sample b/configs/samples/cdr_adaptive_odbc.conf.sample
index f3c806e75c35285d96dc0f6f898679d7f531c847..58a596649c6dfcfa41e706aa3411299b83d886dd 100644
--- a/configs/samples/cdr_adaptive_odbc.conf.sample
+++ b/configs/samples/cdr_adaptive_odbc.conf.sample
@@ -57,4 +57,7 @@
 ; for this is to allow different sections to specify different values for
 ; a certain named column, presumably separated by filters.
 ;static "Some Special Value" => identifier_code
+;
+; Add quoted indentifiers for table and columns names.
+;quoted_identifiers=" ; Default to null