diff --git a/modules/rdfui/rdfui.module b/modules/rdfui/rdfui.module
index 79a8b89..b718946 100644
--- a/modules/rdfui/rdfui.module
+++ b/modules/rdfui/rdfui.module
@@ -519,23 +519,24 @@ function _rdfui_validate_datatype($form_state, $field_name) {
  */
 
 function _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name) {
-
-  // @ todo Why would we need this mapping_load? I think we don't
   $mapping = rdf_mapping_load($entity_type, $bundle);
   // Set the RDF type if it is in this form.
-  if (isset($form_state['values']['rdf_rdftype'])) {
+  if (!empty($form_state['values']['rdf_rdftype'])) {
     $mapping['rdftype'] = rdfui_extract_curies($form_state['values']['rdf_rdftype']);
   }
-  // Set the predicates for the field.
-  $predicates = rdfui_extract_curies($form_state['values']['rdf_'. $field_name .'_predicates']);
-  // Make sure we remove any mapping which does not have any valid predicate.
-  if (empty($predicates)) {
-    unset($mapping[$field_name]);
-  }
-  else {
-    $mapping[$field_name]['predicates'] = $predicates;
-    $mapping[$field_name]['datatype'] = $form_state['values']['rdf_'. $field_name .'_datatype'];
-    $mapping[$field_name]['type'] = $form_state['values']['rdf_'. $field_name .'_type'];
+  // Turn the predicates string into an array.
+  $form_state['values']['rdf_'. $field_name .'_predicates'] = rdfui_extract_curies($form_state['values']['rdf_'. $field_name .'_predicates']);
+
+  foreach (array('predicates', 'datatype', 'type') as $key) {
+    // If there is form input for this key, set it in the mapping.
+    if (!empty($form_state['values']['rdf_'. $field_name .'_' . $key])) {
+      $mapping[$field_name][$key] = $form_state['values']['rdf_'. $field_name .'_' . $key];
+    }
+    // If there is no form input for this key but there is a value set in the
+    // mapping, we need to remove it.
+    else if (isset($mapping[$field_name][$key])) {
+      unset($mapping[$field_name][$key]);
+    }
   }
 
   $mapping_info = array(
