diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h
index 6635174a10a1f6682c418baba25c334d56f3ab67..4cc8e2fb6c726ee8011304146471204f4c806453 100644
--- a/include/asterisk/_private.h
+++ b/include/asterisk/_private.h
@@ -20,6 +20,7 @@ int load_pbx(void);			/*!< Provided by pbx.c */
 int load_pbx_builtins(void);	/*!< Provided by pbx_builtins.c */
 int load_pbx_functions_cli(void);	/*!< Provided by pbx_functions.c */
 int load_pbx_variables(void);	/*!< Provided by pbx_variables.c */
+int load_pbx_switch(void);		/*!< Provided by pbx_switch.c */
 int init_logger(void);			/*!< Provided by logger.c */
 void close_logger(void);		/*!< Provided by logger.c */
 void logger_queue_start(void);		/*!< Provided by logger.c */
diff --git a/main/asterisk.c b/main/asterisk.c
index 7057b944e3170f8bde10d532ed500945e9d60cd0..86e224080b5171e54db28b79813b8b962aeda13c 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4610,6 +4610,11 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
 		exit(1);
 	}
 
+	if (load_pbx_switch()) {
+		printf("Failed: load_pbx_switch\n%s", term_quit());
+		exit(1);
+	}
+
 	if (ast_local_init()) {
 		printf("Failed: ast_local_init\n%s", term_quit());
 		exit(1);
diff --git a/main/pbx.c b/main/pbx.c
index a7342b582c2d3d039c75a409909affdff647b9a7..8a7528315a4379332a13a8de005619a12f611945 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -767,8 +767,6 @@ AST_MUTEX_DEFINE_STATIC(context_merge_lock);
  */
 static AST_RWLIST_HEAD_STATIC(apps, ast_app);
 
-static AST_RWLIST_HEAD_STATIC(switches, ast_switch);
-
 static int stateid = 1;
 /*!
  * \note When holding this container's lock, do _not_ do
@@ -1024,20 +1022,6 @@ struct ast_app *pbx_findapp(const char *app)
 	return ret;
 }
 
-static struct ast_switch *pbx_findswitch(const char *sw)
-{
-	struct ast_switch *asw;
-
-	AST_RWLIST_RDLOCK(&switches);
-	AST_RWLIST_TRAVERSE(&switches, asw, list) {
-		if (!strcasecmp(asw->name, sw))
-			break;
-	}
-	AST_RWLIST_UNLOCK(&switches);
-
-	return asw;
-}
-
 static inline int include_valid(struct ast_include *i)
 {
 	if (!i->hastime)
@@ -5404,35 +5388,6 @@ int ast_register_application2(const char *app, int (*execute)(struct ast_channel
 	return 0;
 }
 
-/*
- * Append to the list. We don't have a tail pointer because we need
- * to scan the list anyways to check for duplicates during insertion.
- */
-int ast_register_switch(struct ast_switch *sw)
-{
-	struct ast_switch *tmp;
-
-	AST_RWLIST_WRLOCK(&switches);
-	AST_RWLIST_TRAVERSE(&switches, tmp, list) {
-		if (!strcasecmp(tmp->name, sw->name)) {
-			AST_RWLIST_UNLOCK(&switches);
-			ast_log(LOG_WARNING, "Switch '%s' already found\n", sw->name);
-			return -1;
-		}
-	}
-	AST_RWLIST_INSERT_TAIL(&switches, sw, list);
-	AST_RWLIST_UNLOCK(&switches);
-
-	return 0;
-}
-
-void ast_unregister_switch(struct ast_switch *sw)
-{
-	AST_RWLIST_WRLOCK(&switches);
-	AST_RWLIST_REMOVE(&switches, sw, list);
-	AST_RWLIST_UNLOCK(&switches);
-}
-
 /*
  * Help for CLI commands ...
  */
@@ -5720,40 +5675,6 @@ static char *handle_show_hint(struct ast_cli_entry *e, int cmd, struct ast_cli_a
 	return CLI_SUCCESS;
 }
 
-
-/*! \brief  handle_show_switches: CLI support for listing registered dial plan switches */
-static char *handle_show_switches(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
-{
-	struct ast_switch *sw;
-
-	switch (cmd) {
-	case CLI_INIT:
-		e->command = "core show switches";
-		e->usage =
-			"Usage: core show switches\n"
-			"       List registered switches\n";
-		return NULL;
-	case CLI_GENERATE:
-		return NULL;
-	}
-
-	AST_RWLIST_RDLOCK(&switches);
-
-	if (AST_RWLIST_EMPTY(&switches)) {
-		AST_RWLIST_UNLOCK(&switches);
-		ast_cli(a->fd, "There are no registered alternative switches\n");
-		return CLI_SUCCESS;
-	}
-
-	ast_cli(a->fd, "\n    -= Registered Asterisk Alternative Switches =-\n");
-	AST_RWLIST_TRAVERSE(&switches, sw, list)
-		ast_cli(a->fd, "%s: %s\n", sw->name, sw->description);
-
-	AST_RWLIST_UNLOCK(&switches);
-
-	return CLI_SUCCESS;
-}
-
 #if 0
 /* This code can be used to test if the system survives running out of memory.
  * It might be an idea to put this in only if ENABLE_AUTODESTRUCT_TESTS is enabled.
@@ -6596,7 +6517,6 @@ static struct ast_cli_entry pbx_cli[] = {
 	AST_CLI_DEFINE(handle_eat_memory, "Eats all available memory"),
 #endif
 	AST_CLI_DEFINE(handle_show_applications, "Shows registered dialplan applications"),
-	AST_CLI_DEFINE(handle_show_switches, "Show alternative switches"),
 	AST_CLI_DEFINE(handle_show_hints, "Show dialplan hints"),
 	AST_CLI_DEFINE(handle_show_hint, "Show dialplan hint"),
 #ifdef AST_DEVMODE
diff --git a/main/pbx_private.h b/main/pbx_private.h
index e1711796c38f7468c3569f51a517badc9de98b13..87abefafadabc036a2447f9ea37f2040ed71365e 100644
--- a/main/pbx_private.h
+++ b/main/pbx_private.h
@@ -32,6 +32,10 @@ void set_ext_pri(struct ast_channel *c, const char *exten, int pri);
 int indicate_congestion(struct ast_channel *, const char *);
 int indicate_busy(struct ast_channel *, const char *);
 
+/*! pbx_switch.c functions needed by pbx.c */
+struct ast_switch *pbx_findswitch(const char *sw);
+
+
 #define VAR_BUF_SIZE 4096
 
 #endif /* _PBX_PRIVATE_H */
diff --git a/main/pbx_switch.c b/main/pbx_switch.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf733aed5e5c82a4a33f4e80d8ce29701f33c5ed
--- /dev/null
+++ b/main/pbx_switch.c
@@ -0,0 +1,133 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2016, CFWare, LLC
+ *
+ * Corey Farrell <git@cfware.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief PBX switch routines.
+ *
+ * \author Corey Farrell <git@cfware.com>
+ */
+
+/*** MODULEINFO
+	<support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_REGISTER_FILE()
+
+#include "asterisk/_private.h"
+#include "asterisk/cli.h"
+#include "asterisk/linkedlists.h"
+#include "asterisk/pbx.h"
+#include "pbx_private.h"
+
+static AST_RWLIST_HEAD_STATIC(switches, ast_switch);
+
+struct ast_switch *pbx_findswitch(const char *sw)
+{
+	struct ast_switch *asw;
+
+	AST_RWLIST_RDLOCK(&switches);
+	AST_RWLIST_TRAVERSE(&switches, asw, list) {
+		if (!strcasecmp(asw->name, sw))
+			break;
+	}
+	AST_RWLIST_UNLOCK(&switches);
+
+	return asw;
+}
+
+/*
+ * Append to the list. We don't have a tail pointer because we need
+ * to scan the list anyways to check for duplicates during insertion.
+ */
+int ast_register_switch(struct ast_switch *sw)
+{
+	struct ast_switch *tmp;
+
+	AST_RWLIST_WRLOCK(&switches);
+	AST_RWLIST_TRAVERSE(&switches, tmp, list) {
+		if (!strcasecmp(tmp->name, sw->name)) {
+			AST_RWLIST_UNLOCK(&switches);
+			ast_log(LOG_WARNING, "Switch '%s' already found\n", sw->name);
+			return -1;
+		}
+	}
+	AST_RWLIST_INSERT_TAIL(&switches, sw, list);
+	AST_RWLIST_UNLOCK(&switches);
+
+	return 0;
+}
+
+void ast_unregister_switch(struct ast_switch *sw)
+{
+	AST_RWLIST_WRLOCK(&switches);
+	AST_RWLIST_REMOVE(&switches, sw, list);
+	AST_RWLIST_UNLOCK(&switches);
+}
+
+/*! \brief  handle_show_switches: CLI support for listing registered dial plan switches */
+static char *handle_show_switches(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+	struct ast_switch *sw;
+
+	switch (cmd) {
+	case CLI_INIT:
+		e->command = "core show switches";
+		e->usage =
+			"Usage: core show switches\n"
+			"       List registered switches\n";
+		return NULL;
+	case CLI_GENERATE:
+		return NULL;
+	}
+
+	AST_RWLIST_RDLOCK(&switches);
+
+	if (AST_RWLIST_EMPTY(&switches)) {
+		AST_RWLIST_UNLOCK(&switches);
+		ast_cli(a->fd, "There are no registered alternative switches\n");
+		return CLI_SUCCESS;
+	}
+
+	ast_cli(a->fd, "\n    -= Registered Asterisk Alternative Switches =-\n");
+	AST_RWLIST_TRAVERSE(&switches, sw, list)
+		ast_cli(a->fd, "%s: %s\n", sw->name, sw->description);
+
+	AST_RWLIST_UNLOCK(&switches);
+
+	return CLI_SUCCESS;
+}
+
+static struct ast_cli_entry sw_cli[] = {
+	AST_CLI_DEFINE(handle_show_switches, "Show alternative switches"),
+};
+
+static void unload_pbx_switch(void)
+{
+	ast_cli_unregister_multiple(sw_cli, ARRAY_LEN(sw_cli));
+}
+
+int load_pbx_switch(void)
+{
+	ast_cli_register_multiple(sw_cli, ARRAY_LEN(sw_cli));
+	ast_register_cleanup(unload_pbx_switch);
+
+	return 0;
+}