diff --git a/Makefile b/Makefile
index 570c774e6d45624e4a5dfcfd886dfff50c62f7d1..65e0a5ffd378ba6be685e9bf79e7e12f8f58e1d7 100644
--- a/Makefile
+++ b/Makefile
@@ -687,6 +687,11 @@ samples: adsi
 		echo ";astctlowner = root" ; \
 		echo ";astctlgroup = apache" ; \
 		echo ";astctl = asterisk.ctl" ; \
+		echo "" ; \
+		echo "[compat]" ; \
+		echo "pbx_realtime=1.6" ; \
+		echo "res_agi=1.6" ; \
+		echo "app_set=1.6" ; \
 		) > $(DESTDIR)$(ASTCONFPATH) ; \
 	else \
 		echo "Skipping asterisk.conf creation"; \
diff --git a/configs/pbx_realtime.conf b/configs/pbx_realtime.conf
deleted file mode 100644
index 022b3e934eecab0422b33a31dec28fa1473d7a8d..0000000000000000000000000000000000000000
--- a/configs/pbx_realtime.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-[general]
-; The native delimiters for application arguments changed in 1.6 to be commas,
-; instead of pipes.  For people who don't want to upgrade their databases
-; immediately, there is this compatibility option, which will allow them to
-; use pipes, via a translation done at runtime.  Set compat to 1.4, if you
-; want to turn this translation ON.  Set compat to 1.6 if you've already made
-; the transition.
-;
-; compat=1.4
-compat=1.6
-
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index 794a75759e9fa280d038699b97dd964db0a185ef..3b639e6b93317075e5676609920cfe59cb0e3261 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -112,6 +112,18 @@ enum ast_option_flags {
 
 extern struct ast_flags ast_options;
 
+enum ast_compat_flags {
+	AST_COMPAT_DELIM_PBX_REALTIME = (1 << 0),
+	AST_COMPAT_DELIM_RES_AGI = (1 << 1),
+	AST_COMPAT_APP_SET = (1 << 2),
+};
+
+#define	ast_compat_pbx_realtime	ast_test_flag(&ast_compat, AST_COMPAT_DELIM_PBX_REALTIME)
+#define ast_compat_res_agi	ast_test_flag(&ast_compat, AST_COMPAT_DELIM_RES_AGI)
+#define	ast_compat_app_set	ast_test_flag(&ast_compat, AST_COMPAT_APP_SET)
+
+extern struct ast_flags ast_compat;
+
 extern int option_verbose;
 extern int option_maxfiles;		/*!< Max number of open file handles (files, sockets) */
 extern int option_debug;		/*!< Debugging */
diff --git a/main/asterisk.c b/main/asterisk.c
index a5683c7451f8bbcac3c6c0d570b6b5a34352a0ba..7d3079938b95e4351052662320439a246b871b27 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -156,6 +156,7 @@ int daemon(int, int);  /* defined in libresolv of all places */
 /*! @{ */
 
 struct ast_flags ast_options = { AST_DEFAULT_OPTIONS };
+struct ast_flags ast_compat = { 7 };
 
 int option_verbose;				/*!< Verbosity level */
 int option_debug;				/*!< Debug level */
@@ -2774,6 +2775,20 @@ static void ast_readconfig(void)
 #endif
 		}
 	}
+	for (v = ast_variable_browse(cfg, "compat"); v; v = v->next) {
+		float version;
+		if (sscanf(v->value, "%f", &version) != 1) {
+			ast_log(LOG_WARNING, "Compatibility version for option '%s' is not a number: '%s'\n", v->name, v->value);
+			continue;
+		}
+		if (!strcasecmp(v->name, "app_set")) {
+			ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_APP_SET);
+		} else if (!strcasecmp(v->name, "res_agi")) {
+			ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_DELIM_RES_AGI);
+		} else if (!strcasecmp(v->name, "pbx_realtime")) {
+			ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_DELIM_PBX_REALTIME);
+		}
+	}
 	ast_config_destroy(cfg);
 }
 
diff --git a/main/pbx.c b/main/pbx.c
index a18d29e9ae78dd368b7e3a7b644a0fd45ca52225..2b0ee7603d3b821e403162ca49d41c07ef917041 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -7856,6 +7856,10 @@ int pbx_builtin_setvar(struct ast_channel *chan, void *data)
 {
 	char *name, *value, *mydata;
 
+	if (ast_compat_app_set) {
+		return pbx_builtin_setvar_multiple(chan, data);
+	}
+
 	if (ast_strlen_zero(data)) {
 		ast_log(LOG_WARNING, "Set requires one variable name/value pair.\n");
 		return 0;
diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 6e5a9f7e150625c588ce6130040f678cf9c7cab8..4fb06c867ec1c411c16260ccec33210e78af3297 100644
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -53,9 +53,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #define EXT_DATA_SIZE 256
 
-/* If set to 0, translate commas to "\," and pipes to "," */
-static int compat16 = 1;
-
 /* Realtime switch looks up extensions in the supplied realtime table.
 
 	[context@][realtimetable][/options]
@@ -179,7 +176,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
 			if (!strcasecmp(v->name, "app"))
 				app = ast_strdupa(v->value);
 			else if (!strcasecmp(v->name, "appdata")) {
-				if (!compat16) {
+				if (ast_compat_pbx_realtime) {
 					char *ptr;
 					int in = 0;
 					tmp = alloca(strlen(v->value) * 2 + 1);
@@ -270,18 +267,6 @@ static int unload_module(void)
 
 static int load_module(void)
 {
-	struct ast_flags flags = { 0 };
-	struct ast_config *cfg = ast_config_load("pbx_realtime.conf", flags);
-	if (cfg) {
-		const char *tmp = ast_variable_retrieve(cfg, "general", "compat");
-		if (tmp && strncmp(tmp, "1.6", 3)) {
-			compat16 = 0;
-		} else {
-			compat16 = 1;
-		}
-		ast_config_destroy(cfg);
-	}
-
 	if (ast_register_switch(&realtime_switch))
 		return AST_MODULE_LOAD_FAILURE;
 	return AST_MODULE_LOAD_SUCCESS;
diff --git a/res/res_agi.c b/res/res_agi.c
index 57cf128da251f44742281b8dc4b3547fb728c2b6..952c28c27f4dacacf54b24654af3b3b8c1b47216 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -1456,7 +1456,23 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, char **argv
 	ast_verb(3, "AGI Script Executing Application: (%s) Options: (%s)\n", argv[1], argv[2]);
 
 	if ((app = pbx_findapp(argv[1]))) {
-		res = pbx_exec(chan, app, argv[2]);
+		if (ast_compat_res_agi && !ast_strlen_zero(argv[2])) {
+			char *compat = alloca(strlen(argv[2]) * 2 + 1), *cptr, *vptr;
+			for (cptr = compat, vptr = argv[2]; *vptr; vptr++) {
+				if (*vptr == ',') {
+					*cptr++ = '\\';
+					*cptr++ = ',';
+				} else if (*vptr == '|') {
+					*cptr++ = ',';
+				} else {
+					*cptr++ = *vptr;
+				}
+			}
+			*cptr = '\0';
+			res = pbx_exec(chan, app, compat);
+		} else {
+			res = pbx_exec(chan, app, argv[2]);
+		}
 	} else {
 		ast_log(LOG_WARNING, "Could not find application (%s)\n", argv[1]);
 		res = -2;