diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 6f5d13738f503ab7f21df12a35ff8e9ddc03f5d2..10a147b14b11ea2369ebd1d486b4228a4e0802fb 100644
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -141,6 +141,13 @@ static void *cleanup(void *unused)
 	return NULL;
 }
 
+static int extension_length_comparator(struct ast_category *p, struct ast_category *q)
+{
+	const char *extenp = S_OR(ast_variable_find(p, "exten"), "");
+	const char *extenq = S_OR(ast_variable_find(q, "exten"), "");
+
+	return strlen(extenp) - strlen(extenq);
+}
 
 /* Realtime switch looks up extensions in the supplied realtime table.
 
@@ -191,6 +198,9 @@ static struct ast_variable *realtime_switch_common(const char *table, const char
 		if (cfg) {
 			char *cat = NULL;
 
+			/* Sort so that longer patterns are checked first */
+			ast_config_sort_categories(cfg, 1, extension_length_comparator);
+
 			while ((cat = ast_category_browse(cfg, cat))) {
 				const char *realtime_exten = ast_variable_retrieve(cfg, cat, "exten");