diff --git a/debug.c b/debug.c
index 5dca633..8aa36c2 100644
--- a/debug.c
+++ b/debug.c
@@ -33,64 +33,53 @@
 #include "debugfs.h"
 #include "functions.h"
 
-void originators_usage(void)
+const struct debug_table_data batctl_debug_tables[BATCTL_TABLE_NUM] = {
+	{
+		.opt_long = "originators",
+		.opt_short = "o",
+		.debugfs_name = "originators",
+	},
+	{
+		.opt_long = "gateways",
+		.opt_short = "gwl",
+		.debugfs_name = "gateways",
+	},
+	{
+		.opt_long = "translocal",
+		.opt_short = "tl",
+		.debugfs_name = "transtable_local",
+	},
+	{
+		.opt_long = "transglobal",
+		.opt_short = "tg",
+		.debugfs_name = "transtable_global",
+	},
+	{
+		.opt_long = "claimtable",
+		.opt_short = "cl",
+		.debugfs_name = "bla_claim_table",
+	},
+	{
+		.opt_long = "backbonetable",
+		.opt_short = "bbt",
+		.debugfs_name = "bla_backbone_table",
+	},
+};
+
+void debug_table_usage(int debug_table)
 {
-	printf("Usage: batctl [options] originators \n");
+	printf("Usage: batctl [options] %s|%s\n",
+	       batctl_debug_tables[debug_table].opt_long, batctl_debug_tables[debug_table].opt_short);
 	printf("options:\n");
 	printf(" \t -h print this help\n");
 	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the originator table continuously\n");
-	printf(" \t -t timeout interval - don't print originators not seen for x.y seconds \n");
-}
-
-void trans_local_usage(void)
-{
-	printf("Usage: batctl [options] translocal \n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the local translation table continuously\n");
-}
-
-void trans_global_usage(void)
-{
-	printf("Usage: batctl [options] transglobal \n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the global translation table continuously\n");
-}
-
-void bla_claim_table_usage(void)
-{
-	printf("Usage: batctl [options] claimtable \n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the bridge loop avoidance claim table continuously\n");
-}
+	printf(" \t -w [interval] watch mode - refresh the table continuously\n");
 
-void bla_backbone_table_usage(void)
-{
-	printf("Usage: batctl [options] backbone table\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the bridge loop avoidance backbone table continuously\n");
-}
-
-
-void gateways_usage(void)
-{
-	printf("Usage: batctl [options] gateways \n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-	printf(" \t -n don't replace mac addresses with bat-host names\n");
-	printf(" \t -w [interval] watch mode - refresh the gateway server list continuously\n");
+	if (debug_table == BATCTL_TABLE_ORIGINATORS)
+		printf(" \t -t timeout interval - don't print originators not seen for x.y seconds \n");
 }
 
-int handle_debug_table(char *mesh_iface, int argc, char **argv,
-		       char *file_path, void table_usage(void))
+int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
 {
 	int optchar, read_opt = USE_BAT_HOSTS;
 	char full_path[MAX_PATH+1];
@@ -102,7 +91,7 @@ int handle_debug_table(char *mesh_iface, int argc, char **argv,
 	while ((optchar = getopt(argc, argv, "hnw:t:")) != -1) {
 		switch (optchar) {
 		case 'h':
-			table_usage();
+			debug_table_usage(debug_table);
 			return EXIT_SUCCESS;
 		case 'n':
 			read_opt &= ~USE_BAT_HOSTS;
@@ -115,36 +104,37 @@ int handle_debug_table(char *mesh_iface, int argc, char **argv,
 			}
 
 			if (!sscanf(optarg, "%f", &watch_interval)) {
-				printf("Error - provided argument of -w is not a number\n");
+				printf("Error - provided argument of '-%c' is not a number\n", optchar);
 				return EXIT_FAILURE;
 			}
 			break;
 		case 't':
-			if (table_usage != originators_usage) {
-				table_usage();
+			if (debug_table != BATCTL_TABLE_ORIGINATORS) {
+				printf("Error - unrecognised option '-%c'\n", optchar);
+				debug_table_usage(debug_table);
 				return EXIT_FAILURE;
 			}
 
 			read_opt |= NO_OLD_ORIGS;
 			if (!sscanf(optarg, "%f", &orig_timeout)) {
-				printf("Error - provided argument of -t is not a number\n");
+				printf("Error - provided argument of '-%c' is not a number\n", optchar);
 				return EXIT_FAILURE;
 			}
 			break;
 		case '?':
 			if (optopt == 't')
-				printf("Error - argument -t needs a number\n");
+				printf("Error - option '-t' needs a number as argument\n");
 
 			else if (optopt == 'w') {
 				read_opt |= CLR_CONT_READ;
 				break;
 			}
 			else
-				printf("Error - unrecognised option -%c\n", optopt);
+				printf("Error - unrecognised option: '-%c'\n", optopt);
 
 			return EXIT_FAILURE;
 		default:
-			table_usage();
+			debug_table_usage(debug_table);
 			return EXIT_FAILURE;
 		}
 	}
@@ -156,7 +146,8 @@ int handle_debug_table(char *mesh_iface, int argc, char **argv,
 	}
 
 	debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", mesh_iface, full_path, sizeof(full_path));
-	return read_file(full_path, file_path, read_opt, orig_timeout, watch_interval);
+	return read_file(full_path, (char *)batctl_debug_tables[debug_table].debugfs_name,
+			 read_opt, orig_timeout, watch_interval);
 }
 
 static void log_usage(void)
diff --git a/debug.h b/debug.h
index 2c6d24c..36badf7 100644
--- a/debug.h
+++ b/debug.h
@@ -21,21 +21,32 @@
 
 
 #define DEBUG_BATIF_PATH_FMT "%s/batman_adv/%s"
-#define DEBUG_ORIGINATORS "originators"
-#define DEBUG_TRANSTABLE_LOCAL "transtable_local"
-#define DEBUG_TRANSTABLE_GLOBAL "transtable_global"
-#define DEBUG_BLA_CLAIM_TABLE "bla_claim_table"
-#define DEBUG_BLA_BACKBONE_TABLE "bla_backbone_table"
-#define DEBUG_GATEWAYS "gateways"
 #define DEBUG_VIS_DATA "vis_data"
 #define DEBUG_LOG "log"
 
+enum batctl_debug_tables {
+	BATCTL_TABLE_ORIGINATORS,
+	BATCTL_TABLE_GATEWAYS,
+	BATCTL_TABLE_TRANSLOCAL,
+	BATCTL_TABLE_TRANSGLOBAL,
+	BATCTL_TABLE_BLA_CLAIMS,
+	BATCTL_TABLE_BLA_BACKBONES,
+	BATCTL_TABLE_NUM,
+};
+
+struct debug_table_data {
+       const char opt_long[OPT_LONG_MAX_LEN];
+       const char opt_short[OPT_SHORT_MAX_LEN];
+       const char debugfs_name[DEBUG_TABLE_PATH_MAX_LEN];
+};
+
+extern const struct debug_table_data batctl_debug_tables[BATCTL_TABLE_NUM];
+
 void originators_usage(void);
 void trans_local_usage(void);
 void trans_global_usage(void);
 void bla_claim_table_usage(void);
 void bla_backbone_table_usage(void);
 void gateways_usage(void);
-int handle_debug_table(char *mesh_iface, int argc, char **argv,
-		       char *file_path, void table_usage(void));
+int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv);
 int log_print(char *mesh_iface, int argc, char **argv);
diff --git a/main.c b/main.c
index 929b762..1482dbe 100644
--- a/main.c
+++ b/main.c
@@ -43,20 +43,23 @@
 char mesh_dfl_iface[] = "bat0";
 char module_ver_path[] = "/sys/module/batman_adv/version";
 
-void print_usage(void) {
-	printf("Usage: batctl [options] commands \n");
+void print_usage(void)
+{
+	int i;
+
+	printf("Usage: batctl [options] command|debug table \n");
+	printf("options:\n");
+	printf(" \t-m mesh interface (default 'bat0')\n");
+	printf(" \t-h print this help (or 'batctl <command|debug table> -h' for the specific help)\n");
+	printf(" \t-v print version\n");
+	printf("\n");
+
 	printf("commands:\n");
 	printf(" \tinterface|if               [add|del iface(s)]\tdisplay or modify the interface settings\n");
-	printf(" \toriginators|o                                \tdisplay the originator table\n");
 	printf(" \tinterval|it                [orig_interval]   \tdisplay or modify the originator interval (in ms)\n");
 	printf(" \tloglevel|ll                [level]           \tdisplay or modify the log level\n");
 	printf(" \tlog|l                                        \tread the log produced by the kernel module\n");
 	printf(" \tgw_mode|gw                 [mode]            \tdisplay or modify the gateway mode\n");
-	printf(" \tgateways|gwl                                 \tdisplay the gateway server list\n");
-	printf(" \ttranslocal|tl                                \tdisplay the local translation table\n");
-	printf(" \ttransglobal|tg                               \tdisplay the global translation table\n");
-	printf(" \tclaimtable|cl                                \tdisplay the bridge loop avoidance claim table\n");
-	printf(" \tbackbonetable|bbl                            \tdisplay the bridge loop avoidance backbone table\n");
 	printf(" \tvis_mode|vm                [mode]            \tdisplay or modify the status of the VIS server\n");
 	printf(" \tvis_data|vd                [dot|JSON]        \tdisplay the VIS data in dot or JSON format\n");
 	printf(" \taggregation|ag             [0|1]             \tdisplay or modify the packet aggregation setting\n");
@@ -65,20 +68,22 @@ void print_usage(void) {
 	printf(" \tfragmentation|f            [0|1]             \tdisplay or modify the fragmentation mode setting\n");
 	printf(" \tap_isolation|ap            [0|1]             \tdisplay or modify the ap isolation mode setting\n");
 	printf("\n");
+
+	printf("debug tables:                                   \tdisplay the corresponding debug table\n");
+	for (i = 0; i < BATCTL_TABLE_NUM; i++)
+		printf(" \t%s|%s\n", batctl_debug_tables[i].opt_long, batctl_debug_tables[i].opt_short);
+
+	printf("\n");
 	printf(" \tstatistics|s                                 \tprint mesh statistics\n");
 	printf(" \tping|p                     <destination>     \tping another batman adv host via layer 2\n");
 	printf(" \ttraceroute|tr              <destination>     \ttraceroute another batman adv host via layer 2\n");
 	printf(" \ttcpdump|td                 <interface>       \ttcpdump layer 2 traffic on the given interface\n");
 	printf(" \tbisect                     <file1> .. <fileN>\tanalyze given log files for routing stability\n");
-	printf("options:\n");
-	printf(" \t-m mesh interface (default 'bat0')\n");
-	printf(" \t-h print this help (or 'batctl <command> -h' for the command specific help)\n");
-	printf(" \t-v print version\n");
 }
 
 int main(int argc, char **argv)
 {
-	int ret = EXIT_FAILURE;
+	int i, ret = EXIT_FAILURE;
 	char *mesh_iface = mesh_dfl_iface;
 
 	if ((argc > 1) && (strcmp(argv[1], "-m") == 0)) {
@@ -140,31 +145,6 @@ int main(int argc, char **argv)
 
 		ret = interface(mesh_iface, argc - 1, argv + 1);
 
-	} else if ((strcmp(argv[1], "originators") == 0) || (strcmp(argv[1], "o") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_ORIGINATORS, originators_usage);
-
-	} else if ((strcmp(argv[1], "translocal") == 0) || (strcmp(argv[1], "tl") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_TRANSTABLE_LOCAL, trans_local_usage);
-
-	} else if ((strcmp(argv[1], "transglobal") == 0) || (strcmp(argv[1], "tg") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_TRANSTABLE_GLOBAL, trans_global_usage);
-
-	} else if ((strcmp(argv[1], "claimtable") == 0) || (strcmp(argv[1], "cl") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_BLA_CLAIM_TABLE, bla_claim_table_usage);
-	} else if ((strcmp(argv[1], "backbonetable") == 0) || (strcmp(argv[1], "bbl") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_BLA_BACKBONE_TABLE,
-					 bla_backbone_table_usage);
-
 	} else if ((strcmp(argv[1], "loglevel") == 0) || (strcmp(argv[1], "ll") == 0)) {
 
 		ret = handle_loglevel(mesh_iface, argc - 1, argv + 1);
@@ -191,11 +171,6 @@ int main(int argc, char **argv)
 
 		ret = handle_gw_setting(mesh_iface, argc - 1, argv + 1);
 
-	} else if ((strcmp(argv[1], "gateways") == 0) || (strcmp(argv[1], "gwl") == 0)) {
-
-		ret = handle_debug_table(mesh_iface, argc - 1, argv + 1,
-					 DEBUG_GATEWAYS, gateways_usage);
-
 	} else if ((strcmp(argv[1], "aggregation") == 0) || (strcmp(argv[1], "ag") == 0)) {
 
 		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
@@ -230,10 +205,21 @@ int main(int argc, char **argv)
 		ret = bisect(argc - 1, argv + 1);
 
 	} else {
-		printf("Error - no command specified\n");
+
+		for (i = 0; i < BATCTL_TABLE_NUM; i++) {
+			if ((strcmp(argv[1], batctl_debug_tables[i].opt_long) != 0) &&
+			    (strcmp(argv[1], batctl_debug_tables[i].opt_short) != 0))
+				continue;
+
+			ret = handle_debug_table(mesh_iface, i, argc - 1, argv + 1);
+			goto out;
+		}
+
+		printf("Error - no valid command or debug table specified: %s\n", argv[1]);
 		print_usage();
 	}
 
+out:
 	return ret;
 
 err:
diff --git a/main.h b/main.h
index 4819cf4..782ffde 100644
--- a/main.h
+++ b/main.h
@@ -27,6 +27,11 @@
 
 #define EXIT_NOSUCCESS 2
 
+#define OPT_LONG_MAX_LEN 25
+#define OPT_SHORT_MAX_LEN 5
+
+#define DEBUG_TABLE_PATH_MAX_LEN 20
+
 #define __packed __attribute((packed))   /* linux kernel compat */
 
 extern char module_ver_path[];
