diff --git src/wp-includes/rest-api/class-wp-rest-server.php src/wp-includes/rest-api/class-wp-rest-server.php
index 12e4086..b2e4740 100644
--- src/wp-includes/rest-api/class-wp-rest-server.php
+++ src/wp-includes/rest-api/class-wp-rest-server.php
@@ -961,6 +961,8 @@ class WP_REST_Server {
 	 * @return array Index entity
 	 */
 	public function get_index( $request ) {
+		$routes = $this->get_data_for_routes( $this->get_routes(), $request['context'] );
+
 		// General site data.
 		$available = array(
 			'name'           => get_option( 'blogname' ),
@@ -969,13 +971,15 @@ class WP_REST_Server {
 			'home'           => home_url(),
 			'namespaces'     => array_keys( $this->namespaces ),
 			'authentication' => array(),
-			'routes'         => $this->get_data_for_routes( $this->get_routes(), $request['context'] ),
+			'routes'         => $routes,
 		);
 
 		$response = new WP_REST_Response( $available );
 
 		$response->add_link( 'help', 'http://v2.wp-api.org/' );
 
+		$this->add_index_links($response, $routes);
+
 		/**
 		 * Filters the API root index data.
 		 *
@@ -990,6 +994,50 @@ class WP_REST_Server {
 		return apply_filters( 'rest_index', $response );
 	}
 
+	protected function add_index_links(WP_REST_Response $response, array $routes)
+	{
+		foreach($routes as $route_name => $route) {
+			if($route['link_name'] === null) {
+				continue;
+			}
+
+			$link = $this->get_rest_api_endpoint_link($route);
+
+			$response->add_link( $route['link_name'], $link['href'], $link);
+		}
+	}
+
+	public function get_rest_api_endpoint_link(array $route, $method = 'GET')
+	{
+		$endpoints = $route['endpoints'];
+		$method_endpoint = null;
+		$link = array(
+			'href' => $route['_links']['self']
+		);
+		foreach($endpoints as $endpoint) {
+			if(in_array($method, $endpoint['methods'], true)) {
+				$method_endpoint = $endpoint;
+				break;
+			}
+		}
+		if($method_endpoint === null) {
+			return $link;
+		}
+		$query_params = array();
+		foreach(array_keys($method_endpoint['args']) as $arg_name) {
+			$query_params[] = $arg_name;
+		}
+
+		if(count($query_params) === 0) {
+			return $link;
+		}
+		$link['templated'] = true;
+		$link['href'] .= sprintf('{?%s}',
+			implode(',', $query_params)
+		);
+		return $link;
+	}
+
 	/**
 	 * Retrieves the index for a namespace.
 	 *
@@ -1019,6 +1067,8 @@ class WP_REST_Server {
 		// Link to the root index.
 		$response->add_link( 'up', rest_url( '/' ) );
 
+		$this->add_index_links($response, $data['routes']);
+
 		/**
 		 * Filters the namespace index data.
 		 *
@@ -1094,6 +1144,7 @@ class WP_REST_Server {
 			'namespace' => '',
 			'methods' => array(),
 			'endpoints' => array(),
+			'link_name' => null,
 		);
 
 		if ( isset( $this->route_options[ $route ] ) ) {
@@ -1103,6 +1154,10 @@ class WP_REST_Server {
 				$data['namespace'] = $options['namespace'];
 			}
 
+			if ( isset( $options['link_name'] ) ) {
+				$data['link_name'] = $options['link_name'];
+			}
+
 			if ( isset( $options['schema'] ) && 'help' === $context ) {
 				$data['schema'] = call_user_func( $options['schema'] );
 			}
