Index: e-contact.c
===================================================================
--- e-contact.c	(revision 9652)
+++ e-contact.c	(working copy)
@@ -808,7 +808,8 @@
 								e_vcard_attribute_param_new (EVC_TYPE),
 								"OTHER");
 					}
-					e_vcard_add_attribute (E_VCARD (contact), attr);
+					/* append, so that first attr is still first attr */
+					e_vcard_append_attribute (E_VCARD (contact), attr);
 				}
 
 				e_vcard_attribute_add_value (attr, sval);
@@ -829,7 +830,7 @@
 			gboolean found = FALSE;
 			int num_left = info->list_elem;
 			GList *attrs = e_vcard_get_attributes (E_VCARD (contact));
-			GList *l;
+			GList *l, *last_attr;
 
 			for (l = attrs; l && !found; l = l->next) {
 				const char *name;
@@ -880,10 +881,12 @@
 						}
 
 						if (found_needed1 && found_needed2) {
+							last_attr = l; /* remember last occurrence, even if it's not the one we want */
 							if (num_left-- == 0) {
 								found = TRUE;
-								break;
 							}
+							break; /* break here, otherwise we'd match again if there
+								  are any more params in this attribute */
 						}
 					}
 				}
@@ -896,7 +899,8 @@
 			else {
 				/* we didn't find it - add a new attribute */
 				attr = e_vcard_attribute_new (NULL, info->vcard_field_name);
-				e_vcard_add_attribute (E_VCARD (contact), attr);
+				/* append attribute, to ensure we don't change HOME into HOME_1, for example */
+				e_vcard_append_attribute (E_VCARD (contact), attr);
 				if (info->attr_type1)
 					e_vcard_attribute_add_param_with_value (attr, e_vcard_attribute_param_new (EVC_TYPE),
 										info->attr_type1);
@@ -1640,11 +1644,12 @@
 		name = e_vcard_attribute_get_name (attr);
 
 		if (!g_ascii_strcasecmp (name, info->vcard_field_name)) {
-			l = g_list_prepend (l, e_vcard_attribute_copy (attr));
+			l = g_list_append (l, e_vcard_attribute_copy (attr));
 		}
 	}
 
-	return g_list_reverse(l);
+	return l;
+
 }
 
 /**
@@ -1669,7 +1674,11 @@
 	e_vcard_remove_attributes (E_VCARD (contact), NULL, info->vcard_field_name);
 
 	for (l = attributes; l; l = l->next)
-		e_vcard_add_attribute (E_VCARD (contact),
+		/* append the attributes, to ensure synthetic
+		 * attributes such as EMAIL_1, EMAIL_2 are in the same
+		 * order as the vcard entries appear.
+		 */
+		e_vcard_append_attribute (E_VCARD (contact),
 				       e_vcard_attribute_copy ((EVCardAttribute*)l->data));
 }
 
Index: e-vcard.c
===================================================================
--- e-vcard.c	(revision 9652)
+++ e-vcard.c	(working copy)
@@ -1149,6 +1149,22 @@
 }
 
 /**
+ * e_vcard_append_attribute:
+ * @evc: an #EVCard
+ * @attr: an #EVCardAttribute to add to end of list of attributes
+ *
+ * Adds @attr to @evc.
+ **/
+void
+e_vcard_append_attribute (EVCard *evc, EVCardAttribute *attr)
+{
+	g_return_if_fail (E_IS_VCARD (evc));
+	g_return_if_fail (attr != NULL);
+
+	evc->priv->attributes = g_list_append (evc->priv->attributes, attr);
+}
+
+/**
  * e_vcard_add_attribute_with_value:
  * @evcard: an #EVCard
  * @attr: an #EVCardAttribute to add
Index: e-vcard.h
===================================================================
--- e-vcard.h	(revision 9652)
+++ e-vcard.h	(working copy)
@@ -146,6 +146,7 @@
 void             e_vcard_remove_attributes           (EVCard *evc, const char *attr_group, const char *attr_name);
 void             e_vcard_remove_attribute            (EVCard *evc, EVCardAttribute *attr);
 void             e_vcard_add_attribute               (EVCard *evc, EVCardAttribute *attr);
+void             e_vcard_append_attribute            (EVCard *evc, EVCardAttribute *attr);
 void             e_vcard_add_attribute_with_value    (EVCard *evcard, EVCardAttribute *attr, const char *value);
 void             e_vcard_add_attribute_with_values   (EVCard *evcard, EVCardAttribute *attr, ...);
 void             e_vcard_attribute_add_value         (EVCardAttribute *attr, const char *value);
