diff --git a/services_docs.module b/services_docs.module
index cf247c7..c6ccc4c 100644
--- a/services_docs.module
+++ b/services_docs.module
@@ -14,23 +14,59 @@ function services_docs_menu() {
     'title' => 'Services Documentation Settings',
     'page callback' => 'services_docs_page',
     'access arguments' => array('administer services'),
+    'type' => MENU_LOCAL_TASK,
   );
   $items['docs'] = array(
     'title' => 'Services Documentation',
     'page callback' => 'services_docs_page',
-    'access arguments' => array('administer services'),
+    'access arguments' => array('view services documentation'),
+    'type' => MENU_CALLBACK,
   );
 
+  // Generate per-service documentation pages.
+  if ($services = services_endpoint_load_all()) {
+    foreach ($services as $service) {
+      $items[$service->path . '/docs'] = array(
+        'title' => 'Services Documentation',
+        'page callback' => 'services_docs_page',
+        'page arguments' => array($service->name),
+        'access arguments' => array('view services documentation'),
+        'type' => MENU_CALLBACK,
+      );
+    }
+  }
+
   return $items;
 }
 
 /**
+ * Implements hook_permission().
+ */
+function services_docs_permission() {
+  return array(
+    'view services documentation' => array(
+      'title' => t('View services documentation page'),
+      'description' => t('Allows a user to view any Services documentation.'),
+    ),
+  );
+}
+
+/**
  * Render services documentation page.
+ *
+ * @param string $service_name
+ *   Optionally print out services documentation for only the given service.
  */
-function services_docs_page() {
+function services_docs_page($service_name = FALSE) {
   $output = '';
 
-  $services = services_endpoint_load_all();
+  if ($service_name) {
+    $services = array($service_name => services_endpoint_load($service_name));
+  }
+  else {
+    $services = services_endpoint_load_all();
+  }
+
   $resources = services_get_resources();
   $entity_types = entity_get_info();
 
