diff --git a/src/api/topo_info.c b/src/api/topo_info.c
new file mode 100644
index 0000000000000000000000000000000000000000..4cfa670a7e421d896283571f84bdd5960bf314f5
--- /dev/null
+++ b/src/api/topo_info.c
@@ -0,0 +1,164 @@
+/*****************************************************************************\
+ *  topo_info.c - get/print the switch topology state information of slurm
+ *****************************************************************************
+ *  Copyright (C) 2009 Lawrence Livermore National Security.
+ *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
+ *  Written by Morris Jette <jette1@llnl.gov>
+ *  CODE-OCEC-09-009. All rights reserved.
+ *  
+ *  This file is part of SLURM, a resource management program.
+ *  For details, see <https://computing.llnl.gov/linux/slurm/>.
+ *  Please also read the included file: DISCLAIMER.
+ *  
+ *  SLURM is free software; you can redistribute it and/or modify it under
+ *  the terms of the GNU General Public License as published by the Free
+ *  Software Foundation; either version 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  In addition, as a special exception, the copyright holders give permission 
+ *  to link the code of portions of this program with the OpenSSL library under
+ *  certain conditions as described in each individual source file, and 
+ *  distribute linked combinations including the two. You must obey the GNU 
+ *  General Public License in all respects for all of the code used other than 
+ *  OpenSSL. If you modify file(s) with this exception, you may extend this 
+ *  exception to your version of the file(s), but you are not obligated to do 
+ *  so. If you do not wish to do so, delete this exception statement from your
+ *  version.  If you delete this exception statement from all source files in 
+ *  the program, then also delete it here.
+ *  
+ *  SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
+ *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ *  details.
+ *  
+ *  You should have received a copy of the GNU General Public License along
+ *  with SLURM; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+\*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#ifdef HAVE_SYS_SYSLOG_H
+#  include <sys/syslog.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include <slurm/slurm.h>
+
+#include "src/common/parse_time.h"
+#include "src/common/slurm_protocol_api.h"
+#include "src/common/xmalloc.h"
+#include "src/common/xstring.h"
+
+/*
+ * slurm_load_topo - issue RPC to get slurm all switch topology configuration 
+ *	information 
+ * IN node_info_msg_pptr - place to store a node configuration pointer
+ * RET 0 or a slurm error code
+ * NOTE: free the response using slurm_free_topo_info_msg
+ */
+extern int slurm_load_topo(topo_info_response_msg_t **resp)
+{
+	int rc;
+	slurm_msg_t req_msg;
+	slurm_msg_t resp_msg;
+	
+	slurm_msg_t_init(&req_msg);
+	slurm_msg_t_init(&resp_msg);
+	req_msg.msg_type = REQUEST_TOPO_INFO;
+	req_msg.data     = NULL;
+	
+	if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0)
+		return SLURM_ERROR;
+		
+	switch (resp_msg.msg_type) {
+	case RESPONSE_TOPO_INFO:
+		*resp = (topo_info_response_msg_t *) resp_msg.data;
+		break;
+	case RESPONSE_SLURM_RC:
+		rc = ((return_code_msg_t *) resp_msg.data)->return_code;
+		slurm_free_return_code_msg(resp_msg.data);	
+		if (rc) 
+			slurm_seterrno_ret(rc);
+		*resp = NULL;
+		break;
+	default:
+		slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR);
+		break;
+	}
+
+	return SLURM_PROTOCOL_SUCCESS;
+}
+
+/*
+ * slurm_print_topo_info_msg - output information about all switch topology 
+ *	configuration information based upon message as loaded using 
+ *	slurm_load_topo
+ * IN out - file to write to
+ * IN topo_info_msg_ptr - switch topology information message pointer
+ * IN one_liner - print as a single line if not zero
+ */
+extern void slurm_print_topo_info_msg(FILE * out, 
+				      topo_info_response_msg_t *topo_info_msg_ptr, 
+				      int one_liner)
+{
+	int i;
+	topo_info_t *topo_ptr = topo_info_msg_ptr->topo_array;
+
+	if (topo_info_msg_ptr->record_count == 0) {
+		error("No topology information available");
+		return;
+	}
+
+	for (i = 0; i < topo_info_msg_ptr->record_count; i++)
+		slurm_print_topo_record(out, &topo_ptr[i], one_liner);
+}
+
+
+
+/*
+ * slurm_print_topo_record - output information about a specific Slurm topology
+ *	record based upon message as loaded using slurm_load_topo
+ * IN out - file to write to
+ * IN topo_ptr - an individual switch information record pointer
+ * IN one_liner - print as a single line if not zero
+ * RET out - char * containing formatted output (must be freed after call)
+ *	   NULL is returned on failure.
+ */
+extern void slurm_print_topo_record(FILE * out, topo_info_t *topo_ptr, 
+				    int one_liner)
+{
+	char tmp_line[512];
+	char *out_buf = NULL;
+
+	/****** Line 1 ******/
+	snprintf(tmp_line, sizeof(tmp_line),
+		"SwitchName=%s Level=%u LinkSpeed=%u ",
+		topo_ptr->name, topo_ptr->level, topo_ptr->link_speed);
+	xstrcat(out_buf, tmp_line);
+
+	if (topo_ptr->nodes && topo_ptr->nodes[0]) {
+		snprintf(tmp_line, sizeof(tmp_line), 
+			 "Nodes=%s ", topo_ptr->nodes);
+		xstrcat(out_buf, tmp_line);
+	}
+	if (topo_ptr->switches && topo_ptr->switches[0]) {
+		snprintf(tmp_line, sizeof(tmp_line), 
+			 "Switches=%s ", topo_ptr->switches);
+		xstrcat(out_buf, tmp_line);
+	}
+
+	xstrcat(out_buf, "\n");
+	fprintf(out, "%s", out_buf);
+	xfree(out_buf);
+}