diff --git profile_csv.info profile_csv.info
index 3e3e59d..5611d8d 100755
--- profile_csv.info
+++ profile_csv.info
@@ -1,5 +1,6 @@
 name = Profile CSV
 description    = Allows exporting profile data in Comma Separated Values (CSV) format.
 dependencies[] = profile
-core           = 6.x
+core           = 7.x
+files[] = profile_csv.module
 
diff --git profile_csv.module profile_csv.module
index 88cf7e8..e998f5f 100755
--- profile_csv.module
+++ profile_csv.module
@@ -23,14 +23,21 @@ function profile_csv_help($path, $arg) {
   return $output;
 }
 
-function profile_csv_perm() {
-  return array(PROFILE_CSV_PERM_DOWNLOAD);
+/**
+ * Implements hook_permission().
+ */
+function profile_csv_permission() {
+  return array(
+    PROFILE_CSV_PERM_DOWNLOAD => array(
+      'title' => t('Download profiles'),
+    ),
+  );
 }
 
 function profile_csv_menu() {
   $items = array();
 
-  $items['admin/settings/profile_csv'] = array(
+  $items['admin/config/people/profile_csv'] = array(
     'title'            => 'Profile CSV',
     'type'             => MENU_NORMAL_ITEM,
     'description'      => 'Profile CSV user data selection',
@@ -103,10 +110,12 @@ function profile_csv_admin_settings() {
     '#collapsible'   => TRUE,
     '#collapsed'     => TRUE,
   );
-  $schema = drupal_get_schema('users');
+  // We use drupal_get_schema_unprocessed instead of drupal_get_schema because
+  // it removes the description for performance reasons.
+  $schema = drupal_get_schema_unprocessed('user', 'users');
   $options = array();
   foreach ($schema['fields'] as $field_name => $field) {
-    $options[$field_name] = _profile_csv_users_map_column_name($field_name) .'<div class="description clear-block">'. filter_xss_admin(t($field['description'])) .'</div>';
+    $options[$field_name] = _profile_csv_users_map_column_name($field_name) .'<div class="description clearfix">'. filter_xss_admin(t($field['description'])) .'</div>';
   }
   $form[$set][PROFILE_CSV_PARAM .'fields'] = array(
     '#type'          => 'checkboxes',
@@ -125,9 +134,9 @@ function profile_csv_admin_settings() {
   );
 
   $result = db_query("SELECT pf.fid, pf.name, pf.title, pf.category
-    FROM {profile_fields} pf
+    FROM {profile_field} pf
     ORDER BY pf.category, pf.weight, pf.title");
-  while ($row = db_fetch_object($result)) {
+  foreach ($result as $row) {
     $fld = PROFILE_CSV_PARAM .'profile_'. $row->fid;
     if (!isset($form[$set][$row->category])) {
       $form[$set][$row->category] = array(
@@ -156,7 +165,7 @@ function profile_csv_page() {
   @set_time_limit(240);
 
   header('Content-type: text/csv; charset=UTF-8');
-  header('Content-Disposition: attachment; filename=userlist_' . time() . '.csv');
+  header('Content-Disposition: attachment; filename=userlist_' . REQUEST_TIME . '.csv');
   header('Pragma: no-cache');
   header('Expires: 0');
 
@@ -164,8 +173,8 @@ function profile_csv_page() {
 
   $user_status = variable_get(PROFILE_CSV_STATUS, 2);
   if (variable_get(PROFILE_CSV_ROLE . '2', 0)) {
-    $result = db_query("SELECT u.uid, u.status FROM {users} u  WHERE u.uid > 1");
-    while ($row = db_fetch_object($result)) {
+    $result = db_query("SELECT u.uid, u.status FROM {users} u  WHERE u.uid > :uid", array(':uid' => 1));
+    foreach ($result as $row) {
       if ($user_status == 2) {
         print _profile_csv_format_user($row->uid);
       }
@@ -177,12 +186,14 @@ function profile_csv_page() {
     }
   }
   else {
-    $result = db_query("SELECT u.uid, u.status, ur.rid
-      FROM {users} u
-      INNER JOIN {users_roles} ur ON u.uid = ur.uid
-      WHERE u.uid > 1");
+    $query = db_select('users', 'u');
+    $result = $query
+      ->fields('u', array('uid', 'status'))
+      ->addField('ur', 'rid')
+      ->condition('u.uid', 1, '>')
+      ->execute();
     $prev_uid = 0;
-    while ($row = db_fetch_object($result)) {
+    foreach ($result as $row) {
       if ((variable_get(PROFILE_CSV_ROLE . $row->rid, 0)) && ($row->uid != $prev_uid)) {
         if ($user_status == 2) {
           print _profile_csv_format_user($row->uid);
@@ -205,9 +216,9 @@ function _profile_csv_get_profile_fields() {
   if (!isset($fields)) {
     $fields = array();
     $result = db_query('SELECT pf.fid, pf.name, pf.title, pf.type, pf.visibility
-      FROM {profile_fields} pf
+      FROM {profile_field} pf
       ORDER BY pf.category, pf.weight, pf.title');
-    while ($row = db_fetch_object($result)) {
+    foreach ($result as $row) {
       if (variable_get(PROFILE_CSV_PARAM .'profile_'. $row->fid, 0)) {
         $fields[] = array('name' => $row->name, 'title' => $row->title, 'type' => $row->type, 'visibility' => $row->visibility);
       }
@@ -244,9 +255,11 @@ function _profile_csv_get_user($uid) {
       unset($fields[$field_name]);
     }
   }
-  $cols = implode(', ', $fields);
-  $result = db_query("SELECT $cols FROM {users} u WHERE u.uid = %d", $uid);
-  while ($row = db_fetch_object($result)) {
+  $result = db_select('users', 'u')
+    ->condition('uid', $uid)
+    ->fields('u', $fields)
+    ->execute();
+  foreach ($result as $row) {
     foreach ($fields as $col) {
       $user[$col] = ($col == 'data') ? unserialize($row->$col) : $row->$col;
     }
@@ -263,11 +276,11 @@ function _profile_csv_get_profile($uid=0, $user_data=NULL) {
       $value = $user_data[$profile_field['name']];
     }
     else {
-      $value = db_result(db_query("SELECT pv.value
-        FROM {profile_fields} pf, {profile_values} pv
+      $value = db_query("SELECT pv.value
+        FROM {profile_field} pf, {profile_value} pv
         WHERE pv.fid = pf.fid
-        AND pf.name = '%s'
-        AND pv.uid = %d", $profile_field['name'], $uid));
+        AND pf.name = :name
+        AND pv.uid = :uid", array(':name' => $profile_field['name'], ':uid' => $uid))->fetchField();
     }
 
     if ($profile_field['type'] == 'date') {
