Index: modules/profile/profile.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.admin.inc,v
retrieving revision 1.10
diff -u -r1.10 profile.admin.inc
--- modules/profile/profile.admin.inc	14 Apr 2008 17:48:41 -0000	1.10
+++ modules/profile/profile.admin.inc	1 Jun 2008 15:51:46 -0000
@@ -235,7 +235,7 @@
     '#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') {
     $form['fields']['options'] = array('#type' => 'textarea',
       '#title' => t('Selection options'),
       '#default_value' => isset($edit['options']) ? $edit['options'] : '',
Index: modules/profile/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v
retrieving revision 1.241
diff -u -r1.241 profile.module
--- modules/profile/profile.module	6 May 2008 12:18:49 -0000	1.241
+++ modules/profile/profile.module	1 Jun 2008 15:51:46 -0000
@@ -36,6 +36,7 @@
       $output .= '<p>' . t('The following types of fields can be added to a user profile:') . '</p>';
       $output .= '<ul><li>' . t('single-line textfield') . '</li>';
       $output .= '<li>' . t('multi-line textfield') . '</li>';
+      $output .= '<li>' . t('checkbox group') . '</li>';
       $output .= '<li>' . t('checkbox') . '</li>';
       $output .= '<li>' . t('list selection') . '</li>';
       $output .= '<li>' . t('freeform list') . '</li>';
@@ -275,6 +276,15 @@
           'g:ia' => NULL,
         );
         return strtr($format, $replace);
+      case 'checkboxes':
+      	$browse = true;
+        $fields = array();
+        foreach ($value as $val) {
+          if ($val = trim($val)) {
+            $fields[] = $browse ? l($val, 'profile/' . urlencode($field->name) . '/' . urlencode($val)) : check_plain($val);
+          }
+        }
+        return implode(', ', $fields);
       case 'list':
         $values = split("[,\n\r]", $value);
         $fields = array();
@@ -380,7 +390,23 @@
       case 'checkbox':
         $fields[$category][$field->name] = array('#type' => 'checkbox',
           '#title' => check_plain($field->title),
-          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '',
+          '#default_value' => $edit[$field->name],
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+      case 'checkboxes':
+        $options = array();
+        $lines = 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,
         );
@@ -491,6 +517,7 @@
     }
   }
 
+  return $output;
 }
 
 /**
@@ -539,6 +566,7 @@
   $types = array('textfield' => t('single-line textfield'),
                  'textarea' => t('multi-line textfield'),
                  'checkbox' => t('checkbox'),
+                 'checkboxes' => t('checkbox group'),
                  'selection' => t('list selection'),
                  'list' => t('freeform list'),
                  'url' => t('URL'),
@@ -547,7 +575,7 @@
 }
 
 function _profile_field_serialize($type = NULL) {
-  return $type == 'date';
+  return ($type == 'date' || $type == 'checkboxes');
 }
 
 function _profile_get_fields($category, $register = FALSE) {
