diff -rupN location_old/location.admin.inc location/location.admin.inc
--- location_old/location.admin.inc	2009-04-18 05:12:54.000000000 +1000
+++ location.admin.inc	2009-06-01 19:30:41.000000000 +1000
@@ -57,6 +57,13 @@ function location_admin_settings() {
     '#description' => t('If you would like to change the macro used to generate the location chooser map, you can do so here. Note: Behaviors <em>locpick</em> and <em>collapsehack</em> are forced to be enabled and cannot be changed.'),
   );
 
+  $form['location_copy_on_write'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Updating a location creates a new location'),
+    '#default_value' => variable_get('location_copy_on_write', TRUE),
+    '#description' => t('If checked, when you modify a location it will be created as a new location.  If unckecked, modifications to a location will be made to the existing location.  Uncheck this if the order of your locations is important otherwise when you update a location it will then become the last location on your node.  This is very important if your locations will be used as points on a polygon.  It also makes things a bit easier when dealing with a large number of locations on a single node or user.'),
+  );
+
   $form['location_jit_geocoding'] = array(
     '#type' => 'checkbox',
     '#title' => t('Enable JIT geocoding'),
diff -rupN location_old/location.module location/location.module
--- location_old/location.module	2009-04-18 05:12:54.000000000 +1000
+++ location.module	2009-06-01 19:30:39.000000000 +1000
@@ -763,10 +763,10 @@ function location_load_locations($id, $k
     return array();
   }
   if ($key == 'genid') {
-    $result = db_query('SELECT lid FROM {location_instance} WHERE '. db_escape_table($key) ." = '%s'", $id);
+    $result = db_query('SELECT lid FROM {location_instance} WHERE '. db_escape_table($key) ." = '%s' ORDER BY lid", $id);
   }
   else {
-    $result = db_query('SELECT lid FROM {location_instance} WHERE '. db_escape_table($key) .' = %d', $id);
+    $result = db_query('SELECT lid FROM {location_instance} WHERE '. db_escape_table($key) .' = %d ORDER BY lid', $id);
   }
   $locations = array();
   while ($lid = db_fetch_object($result)) {
@@ -788,8 +788,10 @@ function location_load_locations($id, $k
  */
 function location_save_locations(&$locations, $criteria) {
   if (isset($locations) && is_array($locations) && !empty($criteria) && is_array($criteria)) {
+    $cow = variable_get('location_copy_on_write', 1);
+
     foreach (array_keys($locations) as $key) {
-      location_save($locations[$key], TRUE, $criteria);
+      location_save($locations[$key], $cow, $criteria);
     }
     $columns = array();
     $placeholders = array();
