diff --git a/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go b/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go
new file mode 100644
index 0000000000000000000000000000000000000000..ae931195ce47806ef7459b054e6bb2761b8ba14f
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go
@@ -0,0 +1,54 @@
+package custom
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"net/http"
+
+	"github.com/gorilla/mux"
+	"github.com/sirupsen/logrus"
+	"github.com/turt2live/matrix-media-repo/api"
+	"github.com/turt2live/matrix-media-repo/matrix"
+)
+
+func GetFederationInfo(r *http.Request, log *logrus.Entry, user api.UserInfo) interface{} {
+	params := mux.Vars(r)
+
+	serverName := params["serverName"]
+
+	log = log.WithFields(logrus.Fields{
+		"serverName": serverName,
+	})
+
+	url, hostname, err := matrix.GetServerApiUrl(serverName)
+	if err != nil {
+		log.Error(err)
+		return api.InternalServerError(err.Error())
+	}
+
+	versionUrl := url + "/_matrix/federation/v1/version"
+	versionResponse, err := matrix.FederatedGet(versionUrl, hostname)
+	if err != nil {
+		log.Error(err)
+		return api.InternalServerError(err.Error())
+	}
+
+	c, err := ioutil.ReadAll(versionResponse.Body)
+	if err != nil {
+		log.Error(err)
+		return api.InternalServerError(err.Error())
+	}
+
+	out := make(map[string]interface{})
+	err = json.Unmarshal(c, &out)
+	if err != nil {
+		log.Error(err)
+		return api.InternalServerError(err.Error())
+	}
+
+	resp := make(map[string]interface{})
+	resp["base_url"] = url
+	resp["hostname"] = hostname
+	resp["versions_response"] = out
+	return resp
+}
diff --git a/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go b/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go
index ee2e76150e79657c281b3cfd4f07dcc722bbaaef..f9be9648fa9ff4cd09dd4089f4928625aa6371c8 100644
--- a/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go
+++ b/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go
@@ -40,6 +40,7 @@ func Init() {
 	storageEstimateHandler := handler{api.RepoAdminRoute(custom.GetDatastoreStorageEstimate), "get_storage_estimate", counter}
 	datastoreListHandler := handler{api.RepoAdminRoute(custom.GetDatastores), "list_datastores", counter}
 	dsTransferHandler := handler{api.RepoAdminRoute(custom.MigrateBetweenDatastores), "datastore_transfer", counter}
+	fedTestHandler := handler{api.RepoAdminRoute(custom.GetFederationInfo), "federation_test", counter}
 
 	routes := make(map[string]route)
 	versions := []string{"r0", "v1", "unstable"} // r0 is typically clients and v1 is typically servers. v1 is deprecated.
@@ -61,6 +62,7 @@ func Init() {
 		routes["/_matrix/media/"+version+"/admin/datastores/{datastoreId:[^/]+}/size_estimate"] = route{"GET", storageEstimateHandler}
 		routes["/_matrix/media/"+version+"/admin/datastores"] = route{"GET", datastoreListHandler}
 		routes["/_matrix/media/"+version+"/admin/datastores/{sourceDsId:[^/]+}/transfer_to/{targetDsId:[^/]+}"] = route{"POST", dsTransferHandler}
+		routes["/_matrix/media/"+version+"/admin/federation/test/{serverName:[a-zA-Z0-9.:\\-_]+}"] = route{"GET", fedTestHandler}
 
 		// Routes that we should handle but aren't in the media namespace (synapse compat)
 		routes["/_matrix/client/"+version+"/admin/purge_media_cache"] = route{"POST", purgeHandler}