diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index a5e4a0a..912fed7 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -14,4 +14,4 @@ Changes since DRUPAL-6--1:
 #760484 by pagaille: Disabled textarea doesn't scroll in IE 7
 #711908 by pagaille: Allow HTML in agreement text
 #783382 by pagaille: Code cleanup
-#781368 by pagaille: Custom success and failure messages are not used
\ No newline at end of file
+#781368 by pagaille: Custom success and failure messages are not used
diff --git a/agreement.info b/agreement.info
index 5cc9606..c4b142e 100644
--- a/agreement.info
+++ b/agreement.info
@@ -1,3 +1,7 @@
 name = "Agreement"
 description = "Module allows administrators to display an agreement to users of a particular role."
-core = 6.x
\ No newline at end of file
+core = 7.x
+
+configure = admin/config/people/agreement
+
+files[] = agreement.test
diff --git a/agreement.install b/agreement.install
index f7968f0..735a9d6 100644
--- a/agreement.install
+++ b/agreement.install
@@ -6,14 +6,6 @@
  */
 
 /**
- * Implementation of hook_install().
- */
-function agreement_install() {
-  drupal_install_schema('agreement');
-  db_query("UPDATE {system} SET weight = 9999 WHERE name = 'agreement'");
-}
-
-/**
  * Implementation of hook_schema().
  */
 function agreement_schema() {
@@ -57,8 +49,6 @@ function agreement_schema() {
  * Implementation of hook_uninstall().
  */
 function agreement_uninstall() {
-  drupal_uninstall_schema('agreement');
-
   variable_del('agreement_role');
   variable_del('agreement_frequency');
   variable_del('agreement_text');
diff --git a/agreement.module b/agreement.module
index 937eee2..66cd3ab 100644
--- a/agreement.module
+++ b/agreement.module
@@ -24,10 +24,19 @@ define('AGREEMENT_SUBMIT_TEXT',     t('Submit'));
  *********************************************************************/
 
 /**
- * Implementation of hook_perm().
+ * Implementation of hook_permission().
  */
-function agreement_perm() {
-  return array('configure agreement settings', 'skip agreement');
+function agreement_permission() {
+  return array(
+    'configure agreement settings' => array(
+      'title' => t('Configure agreement'),
+      'description' => t('Grants the user access to configure agreement settings.'),
+    ),
+    'skip agreement' => array(
+      'title' => t('Skip agreement'),
+      'description' => t('Grants the user access to bypass agreements.'),
+    ),
+  );
 }
 
 /**
@@ -45,11 +54,11 @@ function agreement_init() {
 
     // We will not redirect to the agreement page from these URLs.
     $exceptions = array(
-      check_plain(variable_get('agreement_page_url', AGREEMENT_PAGE_URL)),
-      'logout',
-      'admin/settings/agreement',
+      variable_get('agreement_page_url', AGREEMENT_PAGE_URL),
+      'user/logout',
+      'admin/config/people/agreement',
     );
-    
+  
     if ((!isset($agreement_status) || !$agreement_status) && !in_array($_GET['q'], $exceptions) && $user->uid != 1) {
       // Match path if necessary.
       if ($visibility_pages = check_plain(variable_get('agreement_page_visibility_pages', FALSE))) {
@@ -59,7 +68,7 @@ function agreement_init() {
 
         //check_plain() converts <front> to &lt;front&gt; so need to convert
         // it back before matching
-        $pages = str_replace('&lt;front&gt;', '<front>', $pages);
+        $pages = html_entity_decode($pages);
 
         // Convert the Drupal path to lowercase
         $path = drupal_strtolower(drupal_get_path_alias($_GET['q']));
@@ -102,7 +111,7 @@ function agreement_init() {
 function agreement_menu() {
   $items = array();
 
-  $items['admin/settings/agreement'] = array(
+  $items['admin/config/people/agreement'] = array(
     'access arguments'  => array('configure agreement settings'),
     'description'       => 'Configure settings for the Agreement module.',
     'page callback'     => 'drupal_get_form',
@@ -123,18 +132,18 @@ function agreement_menu() {
 }
 
 /**
- * Implementation of hook_user().
+ * Implementation of hook_user_update().
  */
-function agreement_user($op, &$edit, &$account, $category = NULL) {
-  if ($op == 'after_update' && variable_get('agreement_frequency', 0) == 1) {
+function agreement_user_update(&$edit, &$account, $category = NULL) {
+  if (variable_get('agreement_frequency', 0) == 1) {
     // Don't require user to re-accept agreement if they've just changed their pwd
     if (!empty($edit['pass'])) {
       $uid = $account->uid;
       if ($uid == $GLOBALS['user']->uid) {
         // To help distinguish password-generated agreements from form-based agreements
         $agree = 2;
-        db_query("INSERT INTO {agreement} (uid, agreed, sid, agreed_date)
-          VALUES (%d, %d, '%s', %d)", $uid, $agree, session_id(), time());
+        $edit = (object) array('uid' => $uid, 'agreed' => $agree, 'sid' => session_id(), 'agreed_date' => time());
+        drupal_write_record('agreement', $edit);
       }
     }
   }
@@ -146,9 +155,7 @@ function agreement_user($op, &$edit, &$account, $category = NULL) {
 function agreement_theme($existing, $type, $theme, $path) {
   return array(
     'agreement_page' => array(
-      'arguments' => array(
-        'form' => NULL,
-      ),
+      'render element' => 'form',
     ),
   );
 }
@@ -162,7 +169,7 @@ function agreement_theme($existing, $type, $theme, $path) {
  */
 function agreement_views_api() {
   return array(
-    'api' => 2,
+    'api' => 3,
     'path' => drupal_get_path('module', 'agreement'),
   );
 }
@@ -347,9 +354,10 @@ function agreement_page() {
     drupal_goto('<front>');
   }
 
-  $text = check_markup(variable_get('agreement_text', ''), FILTER_FORMAT_DEFAULT, FALSE);
+  $text = check_markup(variable_get('agreement_text', ''), filter_default_format(), FALSE);
 
-  $output = theme('agreement_page', drupal_get_form('agreement_form', $text, _agreement_status(), $user->uid));
+  $form = drupal_get_form('agreement_form', $text, _agreement_status(), $user->uid);
+  $output = theme('agreement_page', array('form' => $form));
   
   return $output;
 }
@@ -363,9 +371,9 @@ function agreement_page() {
  *
  * @ingroup themeable
  */
-function theme_agreement_page($form) {
-  $output = $form;
-  return $output;
+function theme_agreement_page(&$variables) {
+  drupal_set_title(check_plain(variable_get('agreement_page_title', AGREEMENT_PAGE_TITLE)));
+  return $variables['form'];
 }
 
 /*********************************************************************
@@ -379,20 +387,17 @@ function theme_agreement_page($form) {
  * @see agreement_form_validate()
  * @see agreement_form_submit()
  */
-function agreement_form($form, $text, $status = 0, $uid = -1) {
+function agreement_form($form, &$form_state, $text, $status = 0, $uid = -1) {
   $form = array();
 
   $form['agreement_terms'] = array(
-    '#value'  => $text,
+    '#markup'  => $text,
     '#type'   => 'item',
     '#prefix' => '<div class="agreement-text">',
     '#suffix' => '</div>',
   );
 
-  $form['uid'] = array(
-    '#value'  => $uid,
-    '#type'   => 'hidden',
-  );
+  $form_state['uid'] = $uid;
 
   if (!$status) {
     $form['agree'] = array(
@@ -431,12 +436,14 @@ function agreement_form_validate($form, &$form_state) {
  * @see agreement_form_validate()
  */
 function agreement_form_submit($form, &$form_state) {
-  $uid = $form_state['values']['uid'];
+  $uid = $form_state['uid'];
   $agree = $form_state['values']['agree'];
-
-  db_query("DELETE FROM {agreement} WHERE uid='%d'", $uid);
-  db_query("INSERT INTO {agreement} (uid, agreed, sid, agreed_date) VALUES (%d, %d, '%s', %d)",
-            $uid, $agree, session_id(), time());
+  
+  $delete = db_delete('agreement');
+  $delete->condition('uid', $uid, '=')->execute();
+  
+  $edit = (object) array('uid' => $uid, 'agreed' => $agree, 'sid' => session_id(), 'agreed_date' => time());
+  drupal_write_record('agreement', $edit);
 
   drupal_set_message(check_plain(variable_get('agreement_message_success', AGREEMENT_MESSAGE_SUCCESS)));
 
@@ -461,8 +468,6 @@ function agreement_form_submit($form, &$form_state) {
 
   unset($_SESSION['agreement_destination']);
   $form_state['redirect'] = $redirect;
-  
-  return;
 }
 
 /*********************************************************************
@@ -485,16 +490,16 @@ function _agreement_status($uid = NULL) {
   // Make sure we weren't passed some garbage as $uid
   $uid = (int) $uid;
 
+  $query = db_select('agreement', 'a');
+  $query
+    ->fields('a', array('agreed'))
+    ->condition('a.uid', $uid, '=')
+    ->range(0, 1);
+
   // Must agree on every login
   if (variable_get('agreement_frequency', 0) == 1) {
-    $query = "SELECT agreed FROM {agreement} WHERE uid = %d and sid = '%s'";
-    $result = db_query_range($query, array($uid, session_id()), 0, 1);
-  }
-  // Must only agree once
-  else {
-    $query = "SELECT agreed FROM {agreement} WHERE uid = %d";
-    $result = db_query_range($query, $uid, 0, 1);
+    $query->condition('a.sid', session_id(), '=');
   }
 
-  return (bool) db_result($result);
-}
\ No newline at end of file
+  return $query->execute()->fetchField();
+}
diff --git a/agreement.test b/agreement.test
index 995193f..ff44cff 100644
--- a/agreement.test
+++ b/agreement.test
@@ -47,10 +47,10 @@ class AgreementTestCase extends DrupalWebTestCase {
   }
 
   protected function configureAgreementSettings($settings) {
-    $this->drupalGet('admin/settings/agreement');
+    $this->drupalGet('admin/config/people/agreement');
     $this->assertResponse(200, t('User is allowed to access agreement settings page.'));
 
-    $this->drupalPost('admin/settings/agreement', $settings, t('Save configuration'));
+    $this->drupalPost('admin/config/people/agreement', $settings, t('Save configuration'));
     $this->assertText(t('The configuration options have been saved'), t('Agreement settings saved'));
   }
 
@@ -125,7 +125,7 @@ class AgreementDefaultsPrivilegedUserTestCase extends AgreementTestCase {
   public function testAgreement() {
 
     // After save, re-open agreement settings
-    $this->assertEqual($this->getUrl(), $this->base_url . '/admin/settings/agreement', t('URL of settings page is correct') . ': ' . $this->getUrl());
+    $this->assertEqual($this->getUrl(), $this->base_url . '/admin/config/people/agreement', t('URL of settings page is correct') . ': ' . $this->getUrl());
     $this->assertTitle(t('Agreement settings') . $this->site_name, t('Page title of settings page is correct'));
 
     // Go to front page, no agreement
@@ -179,7 +179,7 @@ class AgreementDefaultsUnprivilegedUserTestCase extends AgreementTestCase {
     $this->submitAgreementFormWithoutAgreeing($this->unprivileged_user->uid);
     $this->submitAgreementFormWithAgreeing($this->unprivileged_user->uid);
 
-    $this->drupalGet('admin/settings/agreement');
+    $this->drupalGet('admin/config/people/agreement');
     $this->assertResponse(403, t('User is not allowed to access agreement settings page.'));
   }
 }
@@ -250,6 +250,7 @@ class AgreementCustomUnprivilegedUserTestCase extends AgreementTestCase {
     $this->submitAgreementFormWithAgreeing($this->unprivileged_user->uid);
     variable_set('agreement_page_visibility_pages', '');
     $edit = array(
+      'current_pass' => $this->unprivileged_user->pass_raw,
       'pass[pass1]' => $pass = $this->randomString(),
       'pass[pass2]' => $pass,
     );
@@ -283,12 +284,12 @@ class AgreementCustomUnprivilegedUserTestCase extends AgreementTestCase {
     $this->isFrontPage();
 
     // Log in, go somewhere other than front page, open agreement, go to user's original destination
-    $this->unprivilegedUserLogin('/node/' . $this->node->uid);
+    $this->unprivilegedUserLogin('/node/' . $this->node->nid);
     $this->isAgreementPage();
     $this->drupalGet('/node');
     $this->isAgreementPage();
     $this->submitAgreementFormWithAgreeing($this->unprivileged_user->uid);
-    $this->assertEqual($this->base_url . '/node/'. $this->node->uid, $this->getURL(), t('User is redirected to original destination') . ' : ' . $this->getUrl());
+    $this->assertEqual($this->base_url . '/node/'. $this->node->nid, $this->getURL(), t('User is redirected to original destination') . ' : ' . $this->getUrl());
 
     // TODO: Log in following password reset link, go somewhere other than front page, open agreement, go to user profile
 
