diff --git a/mollom.module b/mollom.module
index a63a93b..8d65d01 100644
--- a/mollom.module
+++ b/mollom.module
@@ -1018,21 +1018,23 @@ function mollom_form_get_values($form_state, $fields, $mapping) {
     }
     // Only add form element values that are not empty.
     if (isset($value)) {
-      if (is_string($value) && drupal_strlen($value)) {
+      // UTF-8 validation happens later.
+      if (is_string($value) && strlen($value)) {
         $post_body[$field] = $value;
       }
       // Recurse into nested values (e.g. multiple value fields).
-      elseif (!empty($value)) {
-        // Ensure we have a flat array to implode(); form values of
+      elseif (is_array($value) && !empty($value)) {
+        // Ensure we have a flat, indexed array to implode(); form values of
         // field_attach_form() use several subkeys.
-        _mollom_flatten_form_values($value);
-        if (($value = implode("\n", $value))) {
-          $post_body[$field] = $value;
-        }
+        $value = _mollom_flatten_form_values($value);
+        $post_body = array_merge($post_body, $value);
       }
     }
   }
-  $post_body = implode("\n", $post_body);
+  // XML-RPC parser of Mollom backend removes linefeeds, so use a combination of
+  // space and linefeed to ensure proper separation of concatenated fields on
+  // the backend but also have linefeeds in our logs.
+  $post_body = implode(" \n", $post_body);
 
   // Try to assign any further form values by processing the remaining mappings,
   // which have been turned into $exclude_fields above. All fields that were
@@ -1156,16 +1158,21 @@ function mollom_form_get_values($form_state, $fields, $mapping) {
 /**
  * Recursive helper function to flatten nested form values.
  *
- * Takes a potentially nested array and moves all nested keys to the top-level.
- */
-function _mollom_flatten_form_values(&$values) {
-  foreach ($values as $key => $value) {
-    if (is_array($value)) {
-      $values += _mollom_flatten_form_values($value);
-      unset($values[$key]);
+ * Takes a potentially nested array and returns all non-empty string values in
+ * nested keys as new indexed array.
+ */
+function _mollom_flatten_form_values($values) {
+  $flat_values = array();
+  foreach ($values as $value) {
+    if (is_array($value) && !empty($value)) {
+      $flat_values = array_merge($flat_values, _mollom_flatten_form_values($value));
+    }
+    // UTF-8 validation happens elsewhere later.
+    elseif (is_string($value) && strlen($value)) {
+      $flat_values[] = $value;
     }
   }
-  return $values;
+  return $flat_values;
 }
 
 /**
diff --git a/tests/mollom.test b/tests/mollom.test
index e5c6ff0..b1d6b77 100644
--- a/tests/mollom.test
+++ b/tests/mollom.test
@@ -2646,14 +2646,14 @@ class MollomDataTestCase extends MollomWebTestCase {
    * Test mollom_form_get_values().
    */
   function testFormGetValues() {
-    global $user;
-
     // Form registry information.
     $form_info = array(
       'elements' => array(
         'subject' => 'Subject',
         'message' => 'Message',
         'parent][child' => 'Some nested element',
+        'field_checked' => 'Field to check',
+        'field_unchecked' => 'Field to ignore',
       ),
       'mapping' => array(
         'post_title' => 'subject',
@@ -2666,6 +2666,7 @@ class MollomDataTestCase extends MollomWebTestCase {
       'subject',
       'message',
       'parent][child',
+      'field_checked',
     );
 
     // Verify submitted form values for an anonymous/arbitrary user.
@@ -2675,6 +2676,14 @@ class MollomDataTestCase extends MollomWebTestCase {
       'parent' => array(
         'child' => 'Beer',
       ),
+      'field_checked' => array(
+        0 => array('value' => 'Check first'),
+        1 => array('value' => 'Check second'),
+      ),
+      'field_unchecked' => array(
+        0 => array('value' => 'Ignore first'),
+        1 => array('value' => 'Ignore second'),
+      ),
       'name' => 'Drupaler',
       'mail' => 'drupaler@example.com',
     );
@@ -2682,7 +2691,13 @@ class MollomDataTestCase extends MollomWebTestCase {
     $data = mollom_form_get_values($form_state, $fields, $form_info['mapping']);
 
     $this->assertSame('post_title', $data['post_title'], $values['subject']);
-    $this->assertSame('post_body', $data['post_body'], $values['message'] . "\n" . $values['parent']['child']);
+    $body = array(
+      $values['message'],
+      $values['parent']['child'],
+      $values['field_checked'][0]['value'],
+      $values['field_checked'][1]['value'],
+    );
+    $this->assertSame('post_body', $data['post_body'], implode(" \n", $body));
     $this->assertSame('author_name', $data['author_name'], $values['name']);
     $this->assertSame('author_mail', $data['author_mail'], $values['mail']);
     $this->assertFalse(isset($data['author_url']), t('author_url: Undefined.'));
@@ -2691,6 +2706,7 @@ class MollomDataTestCase extends MollomWebTestCase {
     $this->assertSame('author_ip', $data['author_ip'], ip_address());
 
     // Verify submitted form values for an registered user.
+    $this->drupalLogin($this->admin_user);
     $values = array(
       'subject' => 'Foo',
       'message' => 'Bar',
