diff -urp modules/profile/profile.admin.inc modules/profile_checkboxes_multilist/profile.admin.inc
--- modules/profile/profile.admin.inc	2009-05-26 09:41:06.000000000 +0000
+++ modules/profile_checkboxes_multilist/profile.admin.inc	2009-07-19 13:53:01.000000000 +0000
@@ -241,7 +241,7 @@ Unless you know what you are doing, it i
     '#default_value' => $edit['explanation'],
     '#description' => t('An optional explanation to go with the new field. The explanation will be shown to the user.'),
   );
-  if ($type == 'selection') {
+  if ($type == 'selection' || $type == 'checkboxes' || $type == 'selections') {
     $form['fields']['options'] = array('#type' => 'textarea',
       '#title' => t('Selection options'),
       '#default_value' => isset($edit['options']) ? $edit['options'] : '',
@@ -253,7 +253,7 @@ Unless you know what you are doing, it i
     '#default_value' => isset($edit['visibility']) ? $edit['visibility'] : PROFILE_PUBLIC,
     '#options' => array(PROFILE_HIDDEN => t('Hidden profile field, only accessible by administrators, modules and themes.'), PROFILE_PRIVATE => t('Private field, content only available to privileged users.'), PROFILE_PUBLIC => t('Public field, content shown on profile page but not used on member list pages.'), PROFILE_PUBLIC_LISTINGS => t('Public field, content shown on profile page and on member list pages.')),
   );
-  if ($type == 'selection' || $type == 'list' || $type == 'textfield') {
+  if ($type == 'selection' || $type == 'list' || $type == 'textfield' || $type == 'checkboxes' || $type == 'selections') {
     $form['fields']['page'] = array('#type' => 'textfield',
       '#title' => t('Page title'),
       '#default_value' => $edit['page'],
diff -urp modules/profile/profile.module modules/profile_checkboxes_multilist/profile.module
--- modules/profile/profile.module	2009-06-03 06:28:28.000000000 +0000
+++ modules/profile_checkboxes_multilist/profile.module	2009-07-19 13:04:11.000000000 +0000
@@ -37,7 +37,9 @@ function profile_help($path, $arg) {
       $output .= '<ul><li>' . t('single-line textfield') . '</li>';
       $output .= '<li>' . t('multi-line textfield') . '</li>';
       $output .= '<li>' . t('checkbox') . '</li>';
+      $output .= '<li>' . t('checkbox group') . '</li>';
       $output .= '<li>' . t('list selection') . '</li>';
+      $output .= '<li>' . t('multi list selection') . '</li>';
       $output .= '<li>' . t('freeform list') . '</li>';
       $output .= '<li>' . t('URL') . '</li>';
       $output .= '<li>' . t('date') . '</li></ul>';
@@ -331,6 +333,16 @@ function profile_view_field($user, $fiel
           }
         }
         return implode(', ', $fields);
+      case 'checkboxes':
+      case 'selections':
+        $values = $value;
+        $fields = array();
+        foreach ($values as $value) {
+          if ($value = trim($value)) {
+            $fields[] = $browse ? l($value, 'profile/' . $field->name . '/' . $value) : check_plain($value);
+          }
+        }
+        return implode(', ', $fields);
     }
   }
 }
@@ -456,6 +468,39 @@ function profile_form_profile($edit, $us
           '#required' => $field->required,
         );
         break;
+      case 'checkboxes':
+        $options = array();
+        $lines = preg_split("/[\n\r]/", $field->options);
+        foreach ($lines as $line) {
+          if ($line = trim($line)) {
+            $options[$line] = $line;
+          }
+        }
+        $fields[$category][$field->name] = array('#type' => 'checkboxes',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : array(),
+          '#options' => $options,
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+      case 'selections':
+        $options = array();
+        $lines = preg_split("/[\n\r]/", $field->options);
+        foreach ($lines as $line) {
+          if ($line = trim($line)) {
+            $options[$line] = $line;
+          }
+        }
+        $fields[$category][$field->name] = array('#type' => 'select',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : array(),
+          '#options' => $options,
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+          '#multiple' => TRUE,
+        );
+        break;
     }
   }
   return $fields;
@@ -592,7 +637,9 @@ function _profile_field_types($type = NU
   $types = array('textfield' => t('single-line textfield'),
                  'textarea' => t('multi-line textfield'),
                  'checkbox' => t('checkbox'),
+                 'checkboxes' => t('checkbox group'),
                  'selection' => t('list selection'),
+                 'selections' => t('multi list selection'),
                  'list' => t('freeform list'),
                  'url' => t('URL'),
                  'date' => t('date'));
@@ -600,7 +647,7 @@ function _profile_field_types($type = NU
 }
 
 function _profile_field_serialize($type = NULL) {
-  return $type == 'date';
+  return $type == 'date' || $type == 'checkboxes' || $type == 'selections';
 }
 
 function _profile_get_fields($category, $register = FALSE) {
diff -urp modules/profile/profile.pages.inc modules/profile_checkboxes_multilist/profile.pages.inc
--- modules/profile/profile.pages.inc	2009-05-26 09:41:06.000000000 +0000
+++ modules/profile_checkboxes_multilist/profile.pages.inc	2009-07-20 11:59:51.000000000 +0000
@@ -55,6 +55,10 @@ function profile_browse() {
       case 'list':
         $query->condition('v.value', '%' . $value . '%', 'LIKE');
         break;
+      case 'selections':
+      case 'checkboxes':
+        $query->condition('v.value', '%' . $value . '%' . $value . '%', 'LIKE');
+        break;
       default:
         drupal_not_found();
         return;
@@ -76,7 +80,7 @@ function profile_browse() {
     $output = theme('profile_wrapper', $content);
     $output .= theme('pager', NULL);
 
-    if ($field->type == 'selection' || $field->type == 'list' || $field->type == 'textfield') {
+    if ($field->type == 'selection' || $field->type == 'list' || $field->type == 'textfield' || $field->type == 'checkboxes' || $field->type == 'selections') {
       $title = strtr(check_plain($field->page), array('%value' => theme('placeholder', $value)));
     }
     else {
diff -urp modules/profile/profile.test modules/profile_checkboxes_multilist/profile.test
--- modules/profile/profile.test	2009-07-13 20:51:12.000000000 +0000
+++ modules/profile_checkboxes_multilist/profile.test	2009-07-21 13:47:40.000000000 +0000
@@ -49,6 +49,17 @@ class ProfileTestCase extends DrupalWebT
       $this->assertField($form_name . '[day]', t('Found day selection field'));
       $this->assertField($form_name . '[year]', t('Found day selection field'));
     }
+    else if ($type == 'checkboxes') {
+      $lines = preg_split("/[,\n\r]/", $edit['options']);
+      foreach ($lines as $line) {
+        if ($line = trim($line)) {
+          $this->assertField($form_name . '[' . $line . ']', t('Found %opt checkbox field', array('%opt' => $line)));
+        }
+      }
+    }
+    else if ($type == 'selections') {
+      $this->assertField($form_name . '[]', t('Found form named @name', array('@name' => $form_name)));
+    }
     else {
       $this->assertField($form_name , t('Found form named @name', array('@name' => $form_name)));
     }
@@ -123,8 +134,8 @@ class ProfileTestFields extends ProfileT
   }
 
   /**
-   * Test each of the field types. List selection and date fields are tested
-   * separately because they need some special handling.
+   * Test each of the field types. List selections, checkboxes, and date fields
+   * are tested separately because they need some special handling.
    */
   function testProfileFields() {
     $this->drupalLogin($this->admin_user);
@@ -212,6 +223,62 @@ class ProfileTestDate extends ProfileTes
   }
 }
 
+class ProfileTestMultiFields extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test multiselect fields',
+      'description' => 'Testing profile module with add/edit/delete checkbox group and multiselect list fields',
+      'group' => 'Profile',
+    );
+  }
+
+  /**
+   * Test multiselect (checkboxes, selections) field types.
+   */
+  function testProfileMultiFields() {
+    $this->drupalLogin($this->admin_user);
+
+    // Define field types to test.
+    $field_types = array('selections', 'checkboxes');
+
+    // Create array of possible values.
+    $edit = array(
+      'options' => implode("\n", range(101, 110)),
+    );
+
+    // For each field type, create a field, select a value, verify the field
+    // and finally delete it.
+    foreach ($field_types as $type) {
+    	$field = $this->createProfileField($type , 'simpletest', $edit);
+
+    	switch ($type) {
+    	  case 'selections':
+          $values = array(
+            $field['form_name'] . '[]' => array('102' => 102, '108' => 108),
+          );
+          break;
+        case 'checkboxes':
+    	    $values = array(
+            $field['form_name'] . '[102]' => 102,
+            $field['form_name'] . '[108]' => 108,
+          );
+          break;
+        }
+      $this->drupalPost('user/' . $this->normal_user->uid . '/edit/' . $field['category'], $values, t('Save'));
+
+      // Check profile page.
+      $this->drupalGet('user/' . $this->normal_user->uid);
+      $this->assertText($field['title'], t('Found profile field with title %title', array('%title' => $field['title'])));
+
+      $this->assertText('102', t('Found first selected profile field of type %type.', array('%type' => $field['type'])));
+      $this->assertNoText('105', t('Did not find unselected profile field of type %type.', array('%type' => $field['type'])));
+      $this->assertText('108', t('Found last selected profile field of type %type.', array('%type' => $field['type'])));
+
+      $this->deleteProfileField($field);
+    }
+  }
+}
+
 class ProfileTestWeights extends ProfileTestCase {
   public static function getInfo() {
     return array(
