diff --git a/sites/all/modules/hotkey/README.txt b/sites/all/modules/hotkey/README.txt
index 2dd1c91..f202560 100644
--- a/sites/all/modules/hotkey/README.txt
+++ b/sites/all/modules/hotkey/README.txt
@@ -21,3 +21,58 @@ Go to administer -> site building -> modules to enable the module.
 Set the permissions at administer -> user management
 Upon installation, the module will add a few default hotkeys any other hotkey 
 can be added by going to administer -> site configuration -> Hotkey settings
+
+
+API
+------------------------
+
+Hotkeys can be added interactively through the provided UI, but if you want
+your hotkeys to reside in code, Hotkey provides two hooks for this purpose.
+
+  hook_hotkey_form
+  ----------------
+hook_hotkey_form allows modules to add hotkeys to form buttons.  
+Your implementations should return an array of hotkey specifications.  Each hotkey specification is an array with three elements:  name, id, and hkey.  
+  'name' is the text that appears on the button.  If you use this attribute,
+     you should use the t() function to make sure that your specification
+     doesn't break in other localizations.
+  'id' is the id of the button, in the form object (Not the html ID.  Example:
+     If the html ID of the button is 'edit-submit', then that form ID is
+     'submit').  You can specify a button using the 'name', the 'id', or both.
+  'hkey' is the accesskey you want users to be able to use to click the button.
+
+Example:
+  function MODULE_hotkey_form() {
+    return array( 
+      array( 
+        'name' => t("Save configuration"), 
+        'id' => 'submit', 
+        'hkey' => 's',
+      ),
+    );
+  }
+
+  hook_hotkey_links
+  -----------------
+'hook_hotkey_links' allows modules to add links to nodes, with hotkeys.  It is
+very similar to hook_link_alter, but provides a couple of things that make it a
+little more convenient to add hotkeys.
+
+Your module should return an array of link specifiers, where each link
+specifier is an array with they keys 'title', 'href', 'attributes', 'query',
+and 'fragment'.  For the most part, the semantics are identical to
+hook_link_alter, but hotkey will replace instances of '$nid' in the href with
+the current node id, and will add title text to explain to users how to use the
+hotkey.
+
+Example:
+  function MODULE_hotkey_links() {
+    return array(
+      array(
+        'title' => t("Do something cool"),
+        'href' => "node/$nid/cool",
+        'hkey' => 'z',
+      ),
+    );
+  }
+
diff --git a/sites/all/modules/hotkey/hotkey.module b/sites/all/modules/hotkey/hotkey.module
index eae4de4..bc04425 100644
--- a/sites/all/modules/hotkey/hotkey.module
+++ b/sites/all/modules/hotkey/hotkey.module
@@ -38,12 +38,33 @@ function hotkey_link_alter(&$links, $node) {
   if (user_access('use link hotkeys') && is_null($node->hotkey_links) && $node->nid) {
     $hotkeys = db_query("SELECT * FROM {hotkeys} WHERE type = 'link'");
     $hotkey_link = 1;
-    while ($hotkey = db_fetch_object($hotkeys)) {
-      $data = unserialize($hotkey->data);
+
+    $hotkeys_module = module_invoke_all('hotkey_links');
+
+    while (($hotkey = db_fetch_object($hotkeys)) || $hotkeys_module) {
+      if ($hotkey) {
+        $data = unserialize($hotkey->data);
+        $hkey = $data->hkey;
+      } else {
+        $data = array_pop($hotkeys_module);
+        $hkey = $data['hkey'];
+        unset($data['hkey']);
+
+        // Rename the fields.  In the module hooks, people should be able to
+        // use the array keys they're used to from using hook_link_alter
+        // natively, such as "title" and "href" instead of "name" and "path".
+        // We could just let people use hook_link_alter, but hotkey provides a
+        // couple of extra features.
+        $data['name'] = $data['title'];
+        unset($data['title']);
+        $data['path'] = $data['href'];
+        unset($data['href']);
+      }
+
       $new_link = array(
         'title' => $data['name'],
         'href' => str_replace('$nid', $node->nid, $data['path']),
-        'attributes' => array('accesskey' => $hotkey->hkey),
+        'attributes' => array('accesskey' => $hkey),
       );
       if (!empty($data['query'])) {
         $new_link['query'] = $data['query'];
