Consistently remove internally handled extra fields.
diff --git a/lib/zip_extra_field.c b/lib/zip_extra_field.c
index d4bc77f..9b9e399 100644
--- a/lib/zip_extra_field.c
+++ b/lib/zip_extra_field.c
@@ -255,6 +255,35 @@
 
 
 
+struct zip_extra_field *
+_zip_ef_remove_internal(struct zip_extra_field *ef)
+{
+    struct zip_extra_field *ef_head;
+    struct zip_extra_field *prev, *next;
+    
+    ef_head = prev = ef;
+    
+    while (ef) {
+        if (ZIP_EF_IS_INTERNAL(ef->id)) {
+            next = ef->next;
+            if (ef_head == ef)
+                ef_head = next;
+            ef->next = NULL;
+            _zip_ef_free(ef);
+            if (prev)
+                prev->next = next;
+            ef = next;
+        }
+        else {
+            prev = ef;
+            ef = ef->next;
+        }
+    }
+    
+    return ef_head;
+}
+
+
 zip_uint16_t
 _zip_ef_size(struct zip_extra_field *ef, zip_flags_t flags)
 {
@@ -339,7 +368,7 @@
 	}
 	free(ef_raw);
 	
-        /* XXX: remove fields handled internally (Zip64, UTF-8) */
+        ef = _zip_ef_remove_internal(ef);
 	e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef);
     }