diff --git a/prepopulate.module b/prepopulate.module
index af9c21a..ace50de 100644
--- a/prepopulate.module
+++ b/prepopulate.module
@@ -10,13 +10,81 @@
  */
 
 /**
- * Implementation of hook_help().
+ * Implements hook_help().
  */
 function prepopulate_help($path, $arg) {
   switch ($path) {
-    case 'admin/modules#description':
-      return t('Pre-populates forms with HTTP GET or POST data');
-      break;
+    case 'admin/help#prepopulate':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Prepopulate module sets default values to form elements with data fetched from the URL. Form fields can be populated with HTTP GET or POST data.') . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<h4>' . t('Simple usage') . '</h4>';
+      $output .= '<p>' . t('Set the defaul value for the title field on a node creation form:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[title]=This is the title</code><br/>';
+      $output .= t('With "non-clean" urls:') . '<br/>';
+      $output .= '<code>http://www.example.com?q=node/add/content&edit[title]=This is the title</code></p>';
+      $output .= '<h4>' . t('POST requests') . '</h4>';
+
+      $output .= t("Since Prepopulate uses the \$_REQUEST variable, you have access to values from either GET request in the URL, or the form POST requests. In the below example, we set the default value of a node form's title based on a POST Request:");
+      $output .= '<code><pre>' . check_plain('
+<html><body>
+  <form method="post" action="http://example.com/node/add/story">
+    Title: <input type="text" size="12" maxlength="12" name="edit[title]">
+    <input type="submit">
+  </form>
+</body></html>') . '</pre></code>';
+      $output .= '<h4>' . t('How to find what variable to set') . '</h4>';
+      $output .= t('This can be tricky, but there are a few things to keep in mind that should help.') . '<br/>';
+      $output .= t('form_default_values.module is quite simple. It looks through the form, looking for a variable that matches the name given on the URL, and puts the default value in when it finds a match. Drupal keeps HTML form entities in an edit[] array structure. All your variables will be contained within the edit[] array.') . '<br/>';
+      $output .= check_plain(t('A good starting point is to look at the HTML code of a rendered Drupal form. Once you find the appropriate <input /> (or <textarea>...</textarea> tag, use the value of the name attribute in your URL, contained in the edit array. For example, if the <input /> tag looks like this:')) . '<br/>';
+      $output .= '<code>' . check_plain('<input id="edit-title" class="form-text required" type="text" value="" size="60" name="title" maxlength="128"/>') . '</code><br/>';
+      $output .= t('then try this URL:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[title]=Automatic filled in title</code><br/>';
+      $output .= t('Fields are a bit more complicated:') . '<br/>';
+      $output .= '<code>' . check_plain('<input id="edit-field-office-0-node-name" class="form-text form-autocomplete" type="text" value="" size="60" name="field_office[0][node_name]" maxlength="128" autocomplete="OFF"/>') . '</code><br/>';
+      $output .= t('The key is to put this in the edit[] array nested, like this:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[field_office][0][node_name]=AL-235</code><br/>';
+      $output .= t('Another example:') . '<br/>';
+      $output .= '<code>' . check_plain('<textarea id="edit-field-content-0-value" class="form-textarea resizable processed" name="field_content[0][value]" rows="10" cols="60"/>') . '</code><br/>';
+      $output .= t('would be:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[field_content][0][value]=A long text string</code><br/>';
+      $output .= t("and, again, for non-clean URLs, it's:") . '<br/>';
+      $output .= '<code>http://www.example.com?q=node/add/content&edit[field_content][0][value]=A long text string</code><br/>';
+      $output .= t('Fields will vary a bit depending on how the input widgets are configured. Here are some examples.') . '<br/>';
+      $output .= t('Date fields with a separate time entry would look like:') . '<br/>';
+      $output .= '<code>edit[field_date][0][value][date]=11%20Aug%202010&edit[field_date][0][value][time]=12:00PM</code><br/>';
+      $output .= t('Select Lists:') . '<br/>';
+      $output .= '<code>edit[field_selectList][value]=1</code><br/>';
+      $output .= t('Note that in this example "1" is the key value for the select field.') . '<br/>';
+      $output .= t('Node Reference:');
+      $output .= '<code>edit[field_nodereference][0][nid][nid]=[nid: #]</code><br/>';
+      $output .= t('Some Non-field API examples:') . '<br/>';
+      $output .= t('Taxomony Tags:') . '<br/>';
+      $output .= '<code>edit[taxonomy][tags][1]=myTag</code><br/>';
+      $output .= '<h4>' . t('Body fields') . '</h4>';
+      $output .= t('Body fields are different. Though their HTML entity looks like this:') . '<br/>';
+      $output .= '<code>' . check_plain('<textarea id="edit-body" class="form-textarea resizable processed" name="body" rows="20" cols="60"/>') . '</code><br/>';
+      $output .= t('You can not just take the name "body" throw it into a edit[body] and expect it to work. Drupal wraps the body field into a "body_field"
+array when it gets processed. So, for body fields, a URL like:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[body_field][body]=This is the body ought to do the trick.</code><br/>';
+      $output .= '<h4>' . t('Multiple fields') . '</h4>';
+      $output .= t('Prepopulate can handle pre-filling multiple fields from one URL. Just separate the edit variables with an ampersand:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[title]=The title&edit[body_field][body]=The body</code><br/>';
+      $output .= t("You're already using the ampersand with non-clean URLs:") . '<br/>';
+      $output .= '<code>http://www.example.com?q=node/add/content&edit[title]=The title&edit[body_field][body]=The body</code><br/>';
+      $output .= '<h4>' . t('Escaping special characters') . '</h4>';
+      $output .= t("Some characters can't be put into URLs. Spaces, for example, work mostly, but occasionally they'll have to be replaced with the string %20. This is known as percent encoding. Wikipedia has a partial list of percent codes at") . ' ' . l(t('http://en.wikipedia.org/wiki/Percent-encoding'), 'http://en.wikipedia.org/wiki/Percent-encoding') . '.<br/>';
+      $output .= t("If you're having trouble getting content into field names, or are getting 'page not found' errors from Drupal, you should check to ensure that illegal characters are properly encoded.") . '<br/>';
+      $output .= '<h4>' . t('Bookmarklets') . '</h4>';
+      $output .= t('form_default_values.module was created for bookmarklets. Here is a bookmarklet for posting web links to a site:') . '<br/>';
+      $output .= "<code>javascript:u=document.location.href;t=document.title;s=window.getSelection();void(window.open(%22http://example.com/node/add/content-web-link?edit[title]=%22+escape(t)+'&edit[body_field][body]='+escape(s)+'&edit[field_url][0][value]='+escape(u),'_blank','width=1024,height=500,status=yes,resizable=yes,scrollbars=yes'));</code><br/>";
+      $output .= t('This turns into a URL like this:') . '<br/>';
+      $output .= '<code>http://example.com/node/add/content-web-link?edit[title]=drupal.org%20%7C%20Community%20plumbing&edit[body_field][body]=&edit[field_url][0][value]=http%3A//drupal.org/</code><br/>';
+      $output .= t('Selecting some text on the page first would put that text into the body of the node.wraps the body field into a "body_field" array when it gets processed. So, for body fields, a URL like:') . '<br/>';
+      $output .= '<code>http://www.example.com/node/add/content?edit[body_field][body]=This is the body</code><br/>';
+      $output .= t('ought to do the trick.') . '<br/>';
+
+      return $output;
   }
 }
 
