diff --git a/functions.c b/functions.c
index 36a4d40..d08c7a0 100644
--- a/functions.c
+++ b/functions.c
@@ -44,7 +44,7 @@ char *line_ptr = NULL;
 const char *sysfs_compile_out_param[] = {
 	SYS_LOG,
 	SYS_LOG_LEVEL,
-	SYS_BRIDGE_LOOP_AVOIDANCE,
+	batctl_settings[BATCTL_SETTINGS_BLA].sysfs_name,
 	NULL,
 };
 
diff --git a/main.c b/main.c
index 1482dbe..ae0b3d2 100644
--- a/main.c
+++ b/main.c
@@ -45,7 +45,7 @@ char module_ver_path[] = "/sys/module/batman_adv/version";
 
 void print_usage(void)
 {
-	int i;
+	int i, opt_indent;
 
 	printf("Usage: batctl [options] command|debug table \n");
 	printf("options:\n");
@@ -56,17 +56,24 @@ void print_usage(void)
 
 	printf("commands:\n");
 	printf(" \tinterface|if               [add|del iface(s)]\tdisplay or modify the interface settings\n");
-	printf(" \tinterval|it                [orig_interval]   \tdisplay or modify the originator interval (in ms)\n");
+	for (i = 0; i < BATCTL_SETTINGS_NUM; i++) {
+		printf(" \t%s|%s", batctl_settings[i].opt_long, batctl_settings[i].opt_short);
+		opt_indent = strlen(batctl_settings[i].opt_long) + strlen(batctl_settings[i].opt_short);
+
+		if (batctl_settings[i].params == sysfs_param_enable)
+			printf("%*s                display or modify %s setting\n",
+			       31 - opt_indent, "[0|1]", batctl_settings[i].opt_long);
+		else if (batctl_settings[i].params == sysfs_param_server)
+			printf("%*s      display or modify %s setting\n",
+			       41 - opt_indent, "[client|server]", batctl_settings[i].opt_long);
+		else
+			printf("                                display or modify %s setting\n",
+			       batctl_settings[i].opt_long);
+	}
 	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(" \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");
-	printf(" \tbonding|b                  [0|1]             \tdisplay or modify the bonding mode setting\n");
-	printf(" \tbridge_loop_avoidance|bl   [0|1]             \tdisplay or modify the bridge loop avoidance setting\n");
-	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");
@@ -153,16 +160,6 @@ int main(int argc, char **argv)
 
 		ret = log_print(mesh_iface, argc - 1, argv + 1);
 
-	} else if ((strcmp(argv[1], "interval") == 0) || (strcmp(argv[1], "it") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_ORIG_INTERVAL, orig_interval_usage, NULL);
-
-	} else if ((strcmp(argv[1], "vis_mode") == 0) || (strcmp(argv[1], "vm") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_VIS_MODE, vis_mode_usage, sysfs_param_server);
-
 	} else if ((strcmp(argv[1], "vis_data") == 0) || (strcmp(argv[1], "vd") == 0)) {
 
 		ret = vis_data(mesh_iface, argc - 1, argv + 1);
@@ -171,31 +168,6 @@ int main(int argc, char **argv)
 
 		ret = handle_gw_setting(mesh_iface, argc - 1, argv + 1);
 
-	} else if ((strcmp(argv[1], "aggregation") == 0) || (strcmp(argv[1], "ag") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_AGGR, aggregation_usage, sysfs_param_enable);
-
-	} else if ((strcmp(argv[1], "bonding") == 0) || (strcmp(argv[1], "b") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_BONDING, bonding_usage, sysfs_param_enable);
-
-	} else if ((strcmp(argv[1], "bridge_loop_avoidance") == 0) || (strcmp(argv[1], "bl") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_BRIDGE_LOOP_AVOIDANCE, bridge_loop_avoidance_usage, sysfs_param_enable);
-
-	} else if ((strcmp(argv[1], "fragmentation") == 0) || (strcmp(argv[1], "f") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_FRAG, fragmentation_usage, sysfs_param_enable);
-
-	} else if ((strcmp(argv[1], "ap_isolation") == 0) || (strcmp(argv[1], "ap") == 0)) {
-
-		ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
-					 SYS_AP_ISOLA, ap_isolation_usage, sysfs_param_enable);
-
 	} else if ((strcmp(argv[1], "statistics") == 0) || (strcmp(argv[1], "s") == 0)) {
 
 		ret = ioctl_statistics_get(mesh_iface);
@@ -206,6 +178,15 @@ int main(int argc, char **argv)
 
 	} else {
 
+		for (i = 0; i < BATCTL_SETTINGS_NUM; i++) {
+			if ((strcmp(argv[1], batctl_settings[i].opt_long) != 0) &&
+			    (strcmp(argv[1], batctl_settings[i].opt_short) != 0))
+				continue;
+
+			ret = handle_sys_setting(mesh_iface, i, argc - 1, argv + 1);
+			goto out;
+		}
+
 		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))
diff --git a/main.h b/main.h
index 782ffde..4c8b60b 100644
--- a/main.h
+++ b/main.h
@@ -31,6 +31,7 @@
 #define OPT_SHORT_MAX_LEN 5
 
 #define DEBUG_TABLE_PATH_MAX_LEN 20
+#define SETTINGS_PATH_MAX_LEN 25
 
 #define __packed __attribute((packed))   /* linux kernel compat */
 
diff --git a/sys.c b/sys.c
index 5702c6c..63315fe 100644
--- a/sys.c
+++ b/sys.c
@@ -49,6 +49,52 @@ const char *sysfs_param_server[] = {
 	NULL,
 };
 
+const struct settings_data batctl_settings[BATCTL_SETTINGS_NUM] = {
+	{
+		.opt_long = "orig_interval",
+		.opt_short = "it",
+		.sysfs_name = "orig_interval",
+		.params = NULL,
+	},
+	{
+		.opt_long = "ap_isolation",
+		.opt_short = "ap",
+		.sysfs_name = "ap_isolation",
+		.params = sysfs_param_enable,
+	},
+	{
+		.opt_long = "bridge_loop_avoidance",
+		.opt_short = "bl",
+		.sysfs_name = "bridge_loop_avoidance",
+		.params = sysfs_param_enable,
+	},
+	{
+		.opt_long = "vis_mode",
+		.opt_short = "vm",
+		.sysfs_name = "vis_mode",
+		.params = sysfs_param_server,
+	},
+	{
+		.opt_long = "aggregation",
+		.opt_short = "ag",
+		.sysfs_name = "aggregated_ogms",
+		.params = sysfs_param_enable,
+	},
+	{
+		.opt_long = "bonding",
+		.opt_short = "b",
+		.sysfs_name = "bonding",
+		.params = sysfs_param_enable,
+	},
+	{
+		.opt_long = "fragmentation",
+		.opt_short = "f",
+		.sysfs_name = "fragmentation",
+		.params = sysfs_param_enable,
+	},
+
+};
+
 static void interface_usage(void)
 {
 	printf("Usage: batctl interface [options] [add|del iface(s)] \n");
@@ -276,65 +322,23 @@ out:
 	return res;
 }
 
-void aggregation_usage(void)
-{
-	printf("Usage: batctl [options] aggregation [0|1]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
-
-void bonding_usage(void)
-{
-	printf("Usage: batctl [options] bonding [0|1]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
-
-void bridge_loop_avoidance_usage(void)
-{
-	printf("Usage: batctl [options] bridge_loop_avoidance [0|1]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
-
-void gw_mode_usage(void)
-{
-	printf("Usage: batctl [options] gw_mode [mode] [sel_class|bandwidth]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
-
-void vis_mode_usage(void)
-{
-	printf("Usage: batctl [options] vis_mode [mode]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
-
-void orig_interval_usage(void)
+void settings_usage(int setting)
 {
-	printf("Usage: batctl [options] interval \n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
+	printf("Usage: batctl [options] %s|%s",
+	       (char *)batctl_settings[setting].opt_long, (char *)batctl_settings[setting].opt_short);
 
-void fragmentation_usage(void)
-{
-	printf("Usage: batctl [options] fragmentation [0|1]\n");
-	printf("options:\n");
-	printf(" \t -h print this help\n");
-}
+	if (batctl_settings[setting].params == sysfs_param_enable)
+		printf(" [0|1]\n");
+	else if (batctl_settings[setting].params == sysfs_param_server)
+		printf(" [client|server]\n");
+	else
+		printf("\n");
 
-void ap_isolation_usage(void)
-{
-	printf("Usage: batctl [options] ap_isolation [0|1]\n");
 	printf("options:\n");
 	printf(" \t -h print this help\n");
 }
 
-int handle_sys_setting(char *mesh_iface, int argc, char **argv,
-		       char *file_path, void setting_usage(void),
-		       const char *sysfs_param[])
+int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv)
 {
 	int optchar, res = EXIT_FAILURE;
 	char *path_buff;
@@ -343,10 +347,10 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
 	while ((optchar = getopt(argc, argv, "h")) != -1) {
 		switch (optchar) {
 		case 'h':
-			setting_usage();
+			settings_usage(setting);
 			return EXIT_SUCCESS;
 		default:
-			setting_usage();
+			settings_usage(setting);
 			return EXIT_FAILURE;
 		}
 	}
@@ -355,14 +359,15 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
 	snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
 
 	if (argc == 1) {
-		res = read_file(path_buff, file_path, NO_FLAGS, 0, 0);
+		res = read_file(path_buff, (char *)batctl_settings[setting].sysfs_name,
+				NO_FLAGS, 0, 0);
 		goto out;
 	}
 
-	if (!sysfs_param)
+	if (!batctl_settings[setting].params)
 		goto write_file;
 
-	ptr = sysfs_param;
+	ptr = batctl_settings[setting].params;
 	while (*ptr) {
 		if (strcmp(*ptr, argv[1]) == 0)
 			goto write_file;
@@ -373,7 +378,7 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
 	printf("Error - the supplied argument is invalid: %s\n", argv[1]);
 	printf("The following values are allowed:\n");
 
-	ptr = sysfs_param;
+	ptr = batctl_settings[setting].params;
 	while (*ptr) {
 		printf(" * %s\n", *ptr);
 		ptr++;
@@ -382,13 +387,21 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
 	goto out;
 
 write_file:
-	res = write_file(path_buff, file_path, argv[1], argc > 2 ? argv[2] : NULL);
+	res = write_file(path_buff, (char *)batctl_settings[setting].sysfs_name,
+			 argv[1], argc > 2 ? argv[2] : NULL);
 
 out:
 	free(path_buff);
 	return res;
 }
 
+void gw_mode_usage(void)
+{
+	printf("Usage: batctl [options] gw_mode [mode] [sel_class|bandwidth]\n");
+	printf("options:\n");
+	printf(" \t -h print this help\n");
+}
+
 int handle_gw_setting(char *mesh_iface, int argc, char **argv)
 {
 	int optchar, res = EXIT_FAILURE;
diff --git a/sys.h b/sys.h
index f48902e..df9795e 100644
--- a/sys.h
+++ b/sys.h
@@ -23,20 +23,24 @@
 #define SYS_BATIF_PATH_FMT "/sys/class/net/%s/mesh/"
 #define SYS_LOG_LEVEL "log_level"
 #define SYS_LOG "log"
-#define SYS_AGGR "aggregated_ogms"
-#define SYS_BONDING "bonding"
-#define SYS_BRIDGE_LOOP_AVOIDANCE "bridge_loop_avoidance"
 #define SYS_GW_MODE "gw_mode"
 #define SYS_GW_SEL "gw_sel_class"
 #define SYS_GW_BW "gw_bandwidth"
-#define SYS_VIS_MODE "vis_mode"
-#define SYS_ORIG_INTERVAL "orig_interval"
 #define SYS_IFACE_PATH "/sys/class/net"
 #define SYS_IFACE_DIR SYS_IFACE_PATH"/%s/"
 #define SYS_MESH_IFACE_FMT SYS_IFACE_PATH"/%s/batman_adv/mesh_iface"
 #define SYS_IFACE_STATUS_FMT SYS_IFACE_PATH"/%s/batman_adv/iface_status"
-#define SYS_FRAG "fragmentation"
-#define SYS_AP_ISOLA "ap_isolation"
+
+enum batctl_settings_list {
+	BATCTL_SETTINGS_ORIG_INTERVAL,
+	BATCTL_SETTINGS_AP_ISOLATION,
+	BATCTL_SETTINGS_BLA,
+	BATCTL_SETTINGS_VIS_MODE,
+	BATCTL_SETTINGS_AGGREGATION,
+	BATCTL_SETTINGS_BONDING,
+	BATCTL_SETTINGS_FRAGMENTATION,
+	BATCTL_SETTINGS_NUM,
+};
 
 enum gw_modes {
 	GW_MODE_OFF,
@@ -44,8 +48,16 @@ enum gw_modes {
 	GW_MODE_SERVER,
 };
 
+struct settings_data {
+	const char opt_long[OPT_LONG_MAX_LEN];
+	const char opt_short[OPT_SHORT_MAX_LEN];
+	const char sysfs_name[SETTINGS_PATH_MAX_LEN];
+	const char **params;
+};
+
 extern const char *sysfs_param_enable[];
 extern const char *sysfs_param_server[];
+extern const struct settings_data batctl_settings[BATCTL_SETTINGS_NUM];
 
 void aggregation_usage(void);
 void bonding_usage(void);
@@ -57,7 +69,5 @@ void vis_mode_usage(void);
 void orig_interval_usage(void);
 int interface(char *mesh_iface, int argc, char **argv);
 int handle_loglevel(char *mesh_iface, int argc, char **argv);
-int handle_sys_setting(char *mesh_iface, int argc, char **argv,
-		       char *file_path, void setting_usage(void),
-		       const char *sysfs_param[]);
+int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv);
 int handle_gw_setting(char *mesh_iface, int argc, char **argv);
