diff --git a/user_permissions.info b/user_permissions.info
index 97c3f66..eb3db0c 100644
--- a/user_permissions.info
+++ b/user_permissions.info
@@ -2,5 +2,6 @@ name = User Permissions
 description = Provides the ability to manage permissions for individual users without the need to manually create a role for an individual user.
 package = Access control
 core = 7.x
+version = 7.x-1.x-dev
 files[] = user_permissions.module
-files[] = user_permissions.install
\ No newline at end of file
+files[] = user_permissions.install
diff --git a/user_permissions.module b/user_permissions.module
index bf06756..89b4e46 100644
--- a/user_permissions.module
+++ b/user_permissions.module
@@ -1,6 +1,19 @@
 <?php
 
 /**
+ * Implementation of hook_permission().
+ */
+function user_permissions_permission() {
+  return array(
+    'administer user permissions' => array(
+      'title' => 'Administer User Permissions',
+      'description' => 'Grant other users permissions that this one already has, or revoke permissions not granted by roles.',
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function user_permissions_theme() {
@@ -25,7 +38,7 @@ function user_permissions_menu() {
     'page callback' => 'drupal_get_form',
     'page arguments' => array('user_permissions_profile_permissions_form', 1),
     'access callback' => 'user_access',
-    'access arguments' => array('administer permissions'),
+    'access arguments' => array('administer user permissions'),
     'type' => MENU_LOCAL_TASK,
   );
 
@@ -35,28 +48,64 @@ function user_permissions_menu() {
 /**
  * Create form on user's profile for assigning permissions
  */
-function user_permissions_profile_permissions_form($form_state, $user) {
+function user_permissions_profile_permissions_form($form, $form_state, $editing_user) {
+  global $user;
   module_load_include('inc', 'user', 'user.admin');
-  
-  $role_name = '_user_role_' . $user->uid;
-  $result = db_query('SELECT rid FROM {role} WHERE name = :name',
-    array(
-      ':name' => $role_name,
-    )
-  );
-  
-  $role_object = $result->fetchObject();
-    
+  $role_name = '_user_role_' . $editing_user->uid;
+  $role_object = user_role_load_by_name($role_name);
+
   if ($role_object) {
     $rid = $role_object->rid;
-    $form = user_admin_perm($form_state, $rid);
+    $form = drupal_get_form('user_admin_permissions', $rid);
+    $blocked_permissions = array();
+    foreach (user_role_permissions($editing_user->roles) as $role => $permissions) {
+      if ($role == $rid) {
+        continue;
+      }
+      foreach ($permissions as $perm => $value) {
+        if ($value) {
+          $blocked_permissions[$perm] = $perm;
+        }
+      }
+    }
   }
   else {
-    $rid = DRUPAL_ANONYMOUS_RID;
-    $form = user_admin_perm($form_state, $rid);
-    $form['checkboxes'][$rid]['#default_value'] = array();
-    $form['role_names']['#value'][$rid] = $role_name;
+    $rid = DRUPAL_AUTHENTICATED_RID;
+    $role_object = user_role_load($rid);
+    $form = drupal_get_form('user_admin_permissions', $rid);
+    $blocked_permissions = array();
+    foreach (user_role_permissions($editing_user->roles) as $role => $permissions) {
+      foreach ($permissions as $perm => $value) {
+        if ($value) {
+          $blocked_permissions[$perm] = $perm;
+        }
+      }
+    }
+  }
+  foreach (element_children($form['checkboxes'][$rid]) as $permission) {
+    if (!user_access($permission, $user)) {
+      unset($form['permission'][$permission]);
+      unset($form['checkboxes'][$rid][$permission]);
+      unset($form['checkboxes'][$rid]['#options'][$permission]);
+      continue;
+    }
+    // If they have this permission but it doesn't come through this role,
+    // then unsetting the checkbox wouldn't revoke their access.
+    // Better to not confuse people by just disabling it.
+    if (isset($blocked_permissions[$permission])) {
+      $form['checkboxes'][$rid][$permission]['#checked'] = TRUE;
+      $form['checkboxes'][$rid][$permission]['#value'] = $permission;
+      $form['checkboxes'][$rid][$permission]['#disabled'] = TRUE;
+    }
   }
+  // Remove any empty module names.
+  $children = element_children($form['permission']);
+  foreach ($children as $delta => $key) {
+    if (is_numeric($key) && (!isset($children[$delta + 1]) || is_numeric($children[$delta + 1]))) {
+      unset($form['permission'][$key]);
+    }
+  }
+  $form['role_names']['#value'][$rid] = $role_name;
 
   $form['role_names'][$rid]['#markup'] = 'Enable?';
   $form['role_name'] = array(
@@ -67,7 +116,7 @@ function user_permissions_profile_permissions_form($form_state, $user) {
     '#type' => 'hidden',
     '#value' => $rid,
   );
-
+  unset($form['#submit']);
   return $form;
 }
 
@@ -75,83 +124,39 @@ function user_permissions_profile_permissions_form($form_state, $user) {
  * Handle submission of user_permissions_profile_permissions_form
  */
 function user_permissions_profile_permissions_form_submit($form, &$form_state) {
-  // if the user has a role created by this module, then update the permissions for this role
+  // If the user has a role created by this module, then update the permissions for this role
   // otherwise create the new role with the new permissions if any permissions were given
-  
-  $rid = $form_state["values"]["rid"];
-  $uid = (int)substr_replace($form_state["values"]["role_name"], "", 0, 11);
-  $perms = array_filter($form_state["values"][$rid]);
- 
-  if ($rid == DRUPAL_ANONYMOUS_RID) {
-    if (!empty($perms)) {
-      // create new role with the name $role_name
-      $role_name = $form_state["values"]["role_name"];
-      
-      $rid = db_insert('role')
-        ->fields(array('name'))
-        ->values(array(
-          'name' => $role_name,
-        ))
-        ->execute();  
-      
-      db_insert('users_roles')
-        ->fields(array('uid', 'rid'))
-        ->values(array(
-          'uid' => $uid,
-          'rid' => $rid,
-        ))
-        ->execute();
-        
-      foreach (array_keys($perms) as $perm) {
-        db_insert('role_permission')
-          ->fields(array('rid', 'permission'))
-          ->values(array(
-            'rid' => $rid,
-            'permission' => $perm,
-          ))
-          ->execute();
-      }
+  $rid = $form_state['values']['rid'];
+  $uid = (int)substr_replace($form_state['values']['role_name'], '', 0, 11);
+  $perms = $form_state['input'][$rid];
+  foreach($form_state['values'][$rid] as $key => $value) {
+    if (!array_key_exists($key, $perms)) {
+      $perms[$key] = FALSE;
     }
   }
-  else {
-    db_delete('role_permission')
-      ->condition('rid', $rid)
-      ->execute();
-      
-    if(!empty($perms)) {
-      foreach (array_keys($perms) as $perm) {
-        db_insert('role_permission')
-          ->fields(array('rid', 'permission'))
-          ->values(array(
-            'rid' => $rid,
-            'permission' => $perm,
-          ))
-          ->execute();
-      }
-    }
-    else {
-      // if $perms is empty, delete all permission/role information
-      // related to this role to reduce database clutter
-      db_delete('users_roles')
-        ->condition('uid', $uid)
-        ->condition('rid', $rid)
-        ->execute();
-        
-      db_delete('role')
-        ->condition('rid', $rid)
-        ->execute();
-    }
+ 
+  if ($rid == DRUPAL_AUTHENTICATED_RID) {
+    // Create new role.
+    $role_object = (object) array(
+      'name' => $form_state['values']['role_name'],
+    );
+    user_role_save($role_object);
+    $rid = $role_object->rid;
   }
+  user_role_change_permissions($rid, $perms);
+  drupal_set_message('Permissions Updated.');
 }
 
 /**
- * Alter user_filter_form
+ * Alter user_filter_form.
+ *
+ * Remove and _user_role_UID roles from the admin/people menu
  */
 function user_permissions_form_user_filter_form_alter(&$form, &$form_state) {
-  if (is_array($form['filters']['status']['role']['#options'])) {
-    foreach ($form['filters']['status']['role']['#options'] as $key => $value) {
+  if (is_array($form['filters']['status']['filters']['role']['#options'])) {
+    foreach ($form['filters']['status']['filters']['role']['#options'] as $key => $value) {
       if (strpos($value, "_user_role_") !== FALSE) {
-        unset($form['filters']['status']['role']['#options'][$key]);
+        unset($form['filters']['status']['filters']['role']['#options'][$key]);
       }
     }
   }
@@ -167,20 +172,25 @@ function user_permissions_form_user_admin_account_alter(&$form, &$form_state) {
         unset($form['options']['operation']['#options']['Add a role to the selected users'][$key]);
       }
     }
-    
     foreach ($form['options']['operation']['#options']['Remove a role from the selected users'] as $key => $value) {
       if (strpos($value, "_user_role_") !== FALSE) {
         unset($form['options']['operation']['#options']['Remove a role from the selected users'][$key]);
       }
     }
   }
+  foreach ($form['accounts']['#options'] as $uid => $row) {
+    $form['accounts']['#options'][$uid]['roles'] = str_replace("_user_role_$uid", "Custom Permissions", $row['roles']);
+  }
 }
 
 /**
- * Alter user_admin_perm
+ * Alter user_admin_permissions
  */
-function user_permissions_form_user_admin_perm_alter(&$form, &$form_state) {
+function user_permissions_form_user_admin_permissions_alter(&$form, &$form_state) {
   $role_id_filter = array();
+  if (!array_key_exists(DRUPAL_AUTHENTICATED_RID, $form['role_names'])) {
+    return;
+  }
   
   foreach (user_roles() as $key => $value) {
     if (strpos($value, "_user_role_") !== FALSE) {
@@ -197,6 +207,7 @@ function user_permissions_form_user_admin_perm_alter(&$form, &$form_state) {
   foreach ($form['role_names'] as $key => $value) {
     if (in_array($key, $role_id_filter)) {
       unset($form['role_names'][$key]);
+      unset($form['role_names']['#value'][$key]);
     }
   }
 }
