Index: trunk/Ohana/src/libdvo/include/dvodb.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvodb.h	(revision 41738)
+++ trunk/Ohana/src/libdvo/include/dvodb.h	(revision 42075)
@@ -240,4 +240,5 @@
       MEAS_OBJ_ID, 
       MEAS_CAT_ID, 
+      MEAS_EXT_ID, 
       MEAS_IMAGE_ID, 
       MEAS_PSF_QF, 
@@ -248,5 +249,5 @@
       MEAS_CR_NSIGMA, 
       MEAS_EXT_NSIGMA, 
-      MEAS_EXTERN_ID,
+      MEAS_IMAGE_EXTERN_ID, // return image.externID
       MEAS_EXPNAME_AS_INT,
       MEAS_MCAL_OFFSET_PSF, // make this a dvoMagOption?
Index: trunk/Ohana/src/libdvo/include/libdvo_astro.h
===================================================================
--- trunk/Ohana/src/libdvo/include/libdvo_astro.h	(revision 41738)
+++ trunk/Ohana/src/libdvo/include/libdvo_astro.h	(revision 42075)
@@ -27,4 +27,5 @@
   PROJ_PAR, // pseudocyl
   PROJ_ZPN, // zenithal
+  PROJ_MOL, // pseudocyl 
 } OhanaProjection;
 
Index: trunk/Ohana/src/libdvo/src/coordops.c
===================================================================
--- trunk/Ohana/src/libdvo/src/coordops.c	(revision 41738)
+++ trunk/Ohana/src/libdvo/src/coordops.c	(revision 42075)
@@ -266,11 +266,10 @@
     switch (proj) {
       case PROJ_AIT:
-      Z2 = (1.0 - SQ(RAD_DEG*0.25*L) - SQ(RAD_DEG*0.5*M));
-      if (Z2 < 0) return (FALSE);
-      Z = sqrt (Z2);
-      alpha = 2.0 * DEG_RAD * atan2 (RAD_DEG*0.5*Z*L, 2.0*Z2 - 1.0);
-      delta = DEG_RAD * asin (RAD_DEG*M*Z);
-      break;
-      
+	Z2 = (1.0 - SQ(RAD_DEG*0.25*L) - SQ(RAD_DEG*0.5*M));
+	if (Z2 < 0) return (FALSE);
+	Z = sqrt (Z2);
+	alpha = 2.0 * DEG_RAD * atan2 (RAD_DEG*0.5*Z*L, 2.0*Z2 - 1.0);
+	delta = DEG_RAD * asin (RAD_DEG*M*Z);
+	break;
       case PROJ_GLS:
 	/* L,M in degrees, alpha,delta in degrees */
@@ -283,4 +282,9 @@
 	delta = 3 * DEG_RAD * asin (M/180.0);
 	break;
+      case PROJ_MOL:
+	Z = sqrt(2.0 - SQ(RAD_DEG*M));
+	alpha = M_PI*L/(2*Z);
+	double T1 = asin(RAD_DEG*M*M_SQRT1_2)/90.0 + M*Z/180.0;
+	delta = DEG_RAD*asin(T1);
       default:
 	return (FALSE);
@@ -448,4 +452,20 @@
 	*M = 180.0 * sin (RAD_DEG*theta/3.0);
 	return (TRUE);
+      case PROJ_MOL: 
+	phi = ra - coords[0].crval1;
+	theta = dec - coords[0].crval2;
+	// given theta, solve for gamma:
+	double So = sin(theta*RAD_DEG);
+	double Go = theta;
+	if (theta > +80) { Go = theta - 10.0;}
+	if (theta < -80) { Go = theta + 10.0;}
+	for (int iter = 0; iter < 5; iter ++) {
+	  double Fo = (Go / 90.0) + sin(Go*M_PI/90.0) / M_PI - So;
+	  double dFdG = (1 / 90.0) + cos(Go*M_PI/90.0) / 90.0;
+	  Go -= Fo / dFdG;
+	}
+	*L = 2*phi * cos(RAD_DEG*Go) * M_SQRT2 / M_PI;
+	*M = 180.0 * sin(RAD_DEG*Go) * M_SQRT2 / M_PI;
+	return (TRUE);
       default:
 	return (FALSE);
@@ -1059,4 +1079,5 @@
   if (!strncmp(&ctype[4], "-GLS", 4)) return PROJ_GLS;
   if (!strncmp(&ctype[4], "-PAR", 4)) return PROJ_PAR;
+  if (!strncmp(&ctype[4], "-MOL", 4)) return PROJ_MOL;
   return PROJ_NONE;
 }
@@ -1079,4 +1100,5 @@
     case PROJ_GLS: strcpy(&ctype[4], "-GLS"); return TRUE;
     case PROJ_PAR: strcpy(&ctype[4], "-PAR"); return TRUE;
+    case PROJ_MOL: strcpy(&ctype[4], "-MOL"); return TRUE;
     case PROJ_NONE: return FALSE;
   }
@@ -1103,4 +1125,5 @@
     case PROJ_GLS:
     case PROJ_PAR:
+    case PROJ_MOL:
       return PROJ_MODE_PSEUDOCYL;
     default: 
Index: trunk/Ohana/src/libdvo/src/dbExtractMeasures.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbExtractMeasures.c	(revision 41738)
+++ trunk/Ohana/src/libdvo/src/dbExtractMeasures.c	(revision 42075)
@@ -696,4 +696,7 @@
       value.Int = measure[0].imageID;
       break;
+    case MEAS_EXT_ID: /* OK */
+      value.Int = measure[0].extID;
+      break;
     case MEAS_PSF_QF: /* OK */
       value.Flt = measure[0].psfQF;
@@ -714,5 +717,5 @@
       value.Flt = measure[0].extNsigma;
       break;
-    case MEAS_EXTERN_ID: /* OK */
+    case MEAS_IMAGE_EXTERN_ID: /* OK */
       if (REMOTE_CLIENT) {
 	ImageMetadata *image = MatchImageMetadataDVO (measure[0].imageID);
Index: trunk/Ohana/src/libdvo/src/dbFields.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbFields.c	(revision 41738)
+++ trunk/Ohana/src/libdvo/src/dbFields.c	(revision 42075)
@@ -603,5 +603,9 @@
   if (!strcasecmp (fieldName, "CATID"))      	 ESCAPE (MEAS_CAT_ID,         OPIHI_INT);
   if (!strcasecmp (fieldName, "IMAGEID"))    	 ESCAPE (MEAS_IMAGE_ID,       OPIHI_INT);
-  if (!strcasecmp (fieldName, "EXTERNID"))    	 ESCAPE (MEAS_EXTERN_ID,      OPIHI_INT);
+  if (!strcasecmp (fieldName, "IMAGE_EXTERN_ID")) ESCAPE (MEAS_IMAGE_EXTERN_ID, OPIHI_INT);
+  if (!strcasecmp (fieldName, "IMAGE_EXT_ID"))    ESCAPE (MEAS_IMAGE_EXTERN_ID, OPIHI_INT);
+  if (!strcasecmp (fieldName, "EXTERNID"))    	 ESCAPE (MEAS_EXT_ID,         OPIHI_INT);
+  if (!strcasecmp (fieldName, "EXT_ID"))    	 ESCAPE (MEAS_EXT_ID,         OPIHI_INT);
+  if (!strcasecmp (fieldName, "EXTID"))    	 ESCAPE (MEAS_EXT_ID,         OPIHI_INT);
   if (!strcasecmp (fieldName, "EXPNAME"))    	 ESCAPE (MEAS_EXPNAME_AS_INT, OPIHI_INT);
   if (!strcasecmp (fieldName, "PSF_QF"))     	 ESCAPE (MEAS_PSF_QF,         OPIHI_FLT);
