--- main/db.c.orig	2017-02-01 13:38:44.185110829 +0100
+++ main/db.c	2017-02-01 20:20:07.602165316 +0100
@@ -65,10 +65,21 @@
 			<parameter name="Key" required="true" />
 		</syntax>
 		<description>
 		</description>
 	</manager>
+	<manager name="DBShow" language="en_US">
+		<synopsis>
+			Get DB Entry List.
+		</synopsis>
+		<syntax>
+			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
+			<parameter name="Family" required="false" />
+		</syntax>
+		<description>
+		</description>
+	</manager>
 	<manager name="DBPut" language="en_US">
 		<synopsis>
 			Put DB entry.
 		</synopsis>
 		<syntax>
@@ -877,10 +888,76 @@
 				idText);
 	}
 	return 0;
 }
 
+static int manager_dbshow(struct mansession *s, const struct message *m)
+{
+	const char *id = astman_get_header(m, "ActionID");
+	const char *family = astman_get_header(m, "Family");
+	char prefix[MAX_DB_FIELD];
+	char idText[256] = "";
+	sqlite3_stmt *stmt = gettree_stmt;
+
+	if (!ast_strlen_zero(family)) {
+		/* Family specified */
+		snprintf(prefix, sizeof(prefix), "/%s", family);
+	} else {
+		/* Nothing specified */
+		prefix[0] = '\0';
+		stmt = gettree_all_stmt;
+	}
+
+	if (!ast_strlen_zero(id))
+		snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id);
+
+	ast_mutex_lock(&dblock);
+	if (!ast_strlen_zero(prefix) && (sqlite3_bind_text(stmt, 1, prefix, -1, SQLITE_STATIC) != SQLITE_OK)) {
+		astman_send_error(s, m, "DB ERROR\n");
+		ast_log(LOG_WARNING, "Could bind %s to stmt: %s\n", prefix, sqlite3_errmsg(astdb));
+		sqlite3_reset(stmt);
+		ast_mutex_unlock(&dblock);
+		return 0;
+	}
+
+	while (sqlite3_step(stmt) == SQLITE_ROW) {
+		const char *value_s, *family_s;
+		char *saveptr, *split, *key_s;
+		int i;
+		if (!(key_s = (char *) sqlite3_column_text(stmt, 0))) {
+			ast_log(LOG_WARNING, "Skipping invalid key!\n");
+			continue;
+		}
+		if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) {
+			ast_log(LOG_WARNING, "Skipping invalid value!\n");
+			continue;
+		}
+		for (i = 0; ; i++, key_s = NULL)
+		{
+			split = strtok_r(key_s, "/", &saveptr);
+			if(!i){ family_s = split; }
+			else{ break; }
+		}
+		astman_send_ack(s, m, "Result will follow");
+		astman_append(s, "Event: DBShowResponse\r\n"
+				"Family: %s\r\n"
+				"Key: %s\r\n"
+				"Val: %s\r\n"
+				"%s"
+				"\r\n",
+				family_s, split, value_s, idText);
+	}
+	astman_append(s, "Event: DBShowComplete\r\n"
+				"%s"
+				"\r\n",
+				idText);
+	sqlite3_reset(stmt);
+	ast_mutex_unlock(&dblock);
+
+	return 0;
+}
+
 static int manager_dbdel(struct mansession *s, const struct message *m)
 {
 	const char *family = astman_get_header(m, "Family");
 	const char *key = astman_get_header(m, "Key");
 	int res;
@@ -1020,10 +1097,11 @@
 	}
 
 	ast_register_atexit(astdb_atexit);
 	ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database));
 	ast_manager_register_xml_core("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget);
+	ast_manager_register_xml_core("DBShow", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbshow);
 	ast_manager_register_xml_core("DBPut", EVENT_FLAG_SYSTEM, manager_dbput);
 	ast_manager_register_xml_core("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel);
 	ast_manager_register_xml_core("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree);
 	return 0;
 }
