Index: /trunk/Ohana/src/addstar/Makefile
===================================================================
--- /trunk/Ohana/src/addstar/Makefile	(revision 24976)
+++ /trunk/Ohana/src/addstar/Makefile	(revision 24977)
@@ -200,4 +200,5 @@
 $(SRC)/replace_match.$(ARCH).o \
 $(SRC)/update_coords.$(ARCH).o \
+$(SRC)/SkyRegionUtils.$(ARCH).o \
 $(SRC)/StarOps.$(ARCH).o \
 $(SRC)/ConfigInit.$(ARCH).o \
Index: /trunk/Ohana/src/addstar/include/2mass.h
===================================================================
--- /trunk/Ohana/src/addstar/include/2mass.h	(revision 24976)
+++ /trunk/Ohana/src/addstar/include/2mass.h	(revision 24977)
@@ -33,5 +33,5 @@
 e_time    get2mass_date (char *ptr, int Nbound, int Nmax);
 
-int       load2mass_as_rawdata (SkyTable *skytable, char *filename, AddstarClientOptions options);
+int       load2mass_as_rawdata (SkyList *skytable, char *filename, AddstarClientOptions options);
 SkyTable *load2mass_acc (char *path, char *accel);
 int       get2mass_3star (Stars *star, char *line, int Nmax);
Index: /trunk/Ohana/src/addstar/src/SkyRegionUtils.c
===================================================================
--- /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 24976)
+++ /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 24977)
@@ -11,4 +11,5 @@
   ALLOCATE (subset, SkyList, 1);
   ALLOCATE (subset[0].regions, SkyRegion *, NSUBSET);
+  ALLOCATE (subset[0].filename, char *, NSUBSET);
   subset[0].ownElements = FALSE; // free these elements when freeing the list
 
@@ -20,6 +21,11 @@
 
     subset[0].regions[Nsubset] = input[0].regions[i];
+    subset[0].filename[Nsubset] = input[0].filename[i];
     Nsubset ++;
-    CHECK_REALLOCATE (subset[0].regions, SkyRegion *, NSUBSET, Nsubset, 100);
+    if (Nsubset >= NSUBSET) {
+	NSUBSET += 100;
+	REALLOCATE (subset[0].regions, SkyRegion *, NSUBSET);
+	REALLOCATE (subset[0].filename, char *, NSUBSET);
+    }
     subset[0].Nregions = Nsubset;
   }
Index: /trunk/Ohana/src/addstar/src/args_load2mass.c
===================================================================
--- /trunk/Ohana/src/addstar/src/args_load2mass.c	(revision 24976)
+++ /trunk/Ohana/src/addstar/src/args_load2mass.c	(revision 24977)
@@ -38,4 +38,10 @@
   }
 
+  /* only add to existing regions */
+  options.existing_regions = FALSE;
+  if ((N = get_argument (argc, argv, "-existing-regions"))) {
+    options.existing_regions = TRUE;
+    remove_argument (N, &argc, argv);
+  }
   /* only add to existing objects */
   options.only_match = FALSE;
@@ -62,5 +68,4 @@
   options.timeref = 0; 
   options.mosaic = FALSE;
-  options.existing_regions = FALSE;
   options.skip_missed = FALSE;
   options.closest = FALSE;
Index: /trunk/Ohana/src/addstar/src/load2mass.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load2mass.c	(revision 24976)
+++ /trunk/Ohana/src/addstar/src/load2mass.c	(revision 24977)
@@ -7,4 +7,6 @@
   int i;
   SkyTable *sky, *sky2mass;
+  SkyList *skylist = NULL;
+  SkyList *overlap = NULL;
   AddstarClientOptions options;
 
@@ -13,7 +15,19 @@
   options = args_load2mass (argc, argv, options);
 
+  // load the full sky description table:
   sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
   SkyTableSetFilenames (sky, CATDIR, "cpt");
   
+  // generate the subset matching the user-selected region
+  skylist = SkyListByPatch (sky, -1, &UserPatch);
+
+  // if we only match to existing (already populated) regions, limit the select to those regions:
+  if (options.existing_regions) {
+    SkyList *tmp;
+    tmp = SkyListExistingSubset (skylist, CATDIR);
+    SkyListFree (skylist);
+    skylist = tmp;
+  }
+
   path = TWO_MASS_DIR_AS;
 
@@ -23,6 +37,14 @@
   
   for (i = 0; i < sky2mass[0].Nregions; i++) {
+    // check if any of the skylist entries overlap this 2mass catalog:
+    overlap = SkyListByBounds_List (skylist, -1, sky2mass[0].regions[i].Rmin, sky2mass[0].regions[i].Rmax, sky2mass[0].regions[i].Dmin, sky2mass[0].regions[i].Dmax);
+    if (overlap[0].Nregions == 0) {
+      SkyListFree (overlap);
+      continue;
+    }
+    
     fprintf (stderr, "loading %s\n", sky2mass[0].filename[i]);
-    load2mass_as_rawdata (sky, sky2mass[0].filename[i], options);
+    load2mass_as_rawdata (overlap, sky2mass[0].filename[i], options);
+    SkyListFree (overlap);
   }
   exit (0);
Index: /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 24976)
+++ /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 24977)
@@ -10,5 +10,5 @@
 # define DEBUG 0
 
-int load2mass_as_rawdata (SkyTable *skytable, char *filename, AddstarClientOptions options) {
+int load2mass_as_rawdata (SkyList *skytable, char *filename, AddstarClientOptions options) {
   
   int i, j, verbose;
@@ -109,4 +109,13 @@
       if (tstars[i].D > UserPatch.Dmax) continue;
 
+      // identify the relevant catalog
+      skylist = SkyRegionByPoint_List (skytable, -1, tstars[i].R, tstars[i].D);
+      if (skylist[0].Nregions == 0) {
+	  SkyListFree (skylist);
+	  continue;
+      }
+      region = skylist[0].regions[0];
+      if (DEBUG) fprintf (stderr, "writing to %s\n", skylist[0].filename[0]);
+
       // collect array of (Stars *) stars in a new output catalog
       Nstars = 0;
@@ -114,9 +123,5 @@
       ALLOCATE (stars, Stars *, NSTARS);
 
-      // identify the relevant catalog
-      skylist = SkyRegionByPoint (skytable, -1, tstars[i].R, tstars[i].D);
-      region = skylist[0].regions[0];
-      if (DEBUG) fprintf (stderr, "writing to %s\n", skylist[0].filename[0]);
-
+      // loop over stars in this 2mass region that are also in this output region
       for (j = i; j < Ntstars; j++) {
 	if (tstars[j].flag) continue;
@@ -166,5 +171,5 @@
       }
 
-      if (DEBUG) fprintf (stderr, "selected %d stars (%10.6f - %10.6f, %10.6f - %10.6f\n", Nstars, 
+      if (DEBUG) fprintf (stderr, "selected %d stars (%10.6f - %10.6f, %10.6f - %10.6f)\n", Nstars, 
 			  region[0].Rmin, region[0].Rmax, region[0].Dmin, region[0].Dmax);
 
