"FN",                   /* FORMATTED NAME */
        "EMAIL",                /* EMAIL */
        "ADR",                  /* ADDRESS */
-       "ADR",                  /* ADDRESS2 - not used */
+       "ADR",                  /* ADDRESS2 */
        "ADR",                  /* CITY */
        "ADR",                  /* STATE */
        "ADR",                  /* ZIP */
        NULL                    /* not implemented: ANNIVERSARY, ITEM_FIELDS */
 };
 
-/*
- * mappings between vCard ADR field and abook's ADDRESS
- * see rfc2426 section 3.2.1
- */
-static int vcard_address_fields[] = {
-       -1,                     /* vCard(post office box) - not used */
-       -1,                     /* vCard(the extended address) - not used */
-       2,                      /* vCard(the street address) - ADDRESS */
-       4,                      /* vCard(the locality) - CITY */
-       5,                      /* vCard(the region) - STATE */
-       6,                      /* vCard(the postal code) - ZIP */
-       7                       /* vCard(the country name) - COUNTRY */
-};
-
 enum {
        VCARD_KEY = 0,
        VCARD_KEY_ATTRIBUTE,
        }
 }
 
+
+/*
+ * mappings between vCard ADR field and abook's ADDRESS
+ * see rfc2426 section 3.2.1
+ */
 static void
 vcard_parse_address(list_item item, char *line)
 {
        if(!value)
                return;
 
-       address_field = value;
-       for(i=k=0; value[i]; i++) {
-               if(value[i] == ';') {
-                       value[i] = '\0';
-                       if(vcard_address_fields[k] >= 0) {
-                               item[vcard_address_fields[k]] = xstrdup(address_field);
-                       }
-                       address_field = &value[i+1];
-                       k++;
-                       if((k+1)==(sizeof(vcard_address_fields)/sizeof(*vcard_address_fields)))
-                               break;
-               }
-       }
-       item[vcard_address_fields[k]] = xstrdup(address_field);
-       xfree(value);
+       // vCard(post office box) - not used
+       strsep(&value, ";");
+       // vCard(the extended address)
+       item_fput(item, ADDRESS2, xstrdup(strsep(&value, ";")));
+       // vCard(the street address)
+       item_fput(item, ADDRESS, xstrdup(strsep(&value, ";")));
+       // vCard(the locality)
+       item_fput(item, CITY, xstrdup(strsep(&value, ";")));
+       // vCard(the region)
+       item_fput(item, STATE, xstrdup(strsep(&value, ";")));
+       // vCard(the postal code)
+       item_fput(item, ZIP, xstrdup(strsep(&value, ";")));
+       // vCard(the country name)
+       item_fput(item, COUNTRY, xstrdup(strsep(&value, ";")));
+
+       if(*value) xfree(value);
 }
 
 static void
 
     // PO Box, Extended Addr, Street, Locality, Region, Postal Code, Country
     if (vf_get_property(&prop, vfobj, VFGP_FIND, NULL, "ADR", NULL)) {
       props = 0;
-      // US address ?
-      propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, ADDRESS, xstrdup(propval));
-      // address
-      propval = vf_get_prop_value_string(prop, props++);
-      // TODO: concat ?
+      // PO Box: abook ignores
+      vf_get_prop_value_string(prop, props++);
 
-      // street: TODO: address1 instead ?
+      // ext-address
       propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, ADDRESS2, xstrdup(propval));
-      // city
+      if(propval) item_fput(item, ADDRESS2, xstrdup(propval));
+      // address (street)
       propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, CITY, xstrdup(propval));
-      // state
+      if(propval) item_fput(item, ADDRESS, xstrdup(propval));
+      // locality (city)
       propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, STATE, xstrdup(propval));
+      if(propval) item_fput(item, CITY, xstrdup(propval));
+      // region (state)
       propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, ZIP, xstrdup(propval));
+      if(propval) item_fput(item, STATE, xstrdup(propval));
+      // postal-code (zip)
       propval = vf_get_prop_value_string(prop, props++);
-      if(propval)
-       item_fput(item, COUNTRY, xstrdup(propval));
+      if(propval) item_fput(item, ZIP, xstrdup(propval));
+      // country
+      propval = vf_get_prop_value_string(prop, props++);
+      if(propval) item_fput(item, COUNTRY, xstrdup(propval));
     }