Index: /trunk/psModules/src/concepts/pmConceptsStandard.c
===================================================================
--- /trunk/psModules/src/concepts/pmConceptsStandard.c	(revision 10510)
+++ /trunk/psModules/src/concepts/pmConceptsStandard.c	(revision 10511)
@@ -558,4 +558,26 @@
         TYPE_CASE(offset, concept, S16);
         TYPE_CASE(offset, concept, S32);
+        #if 0
+
+    case PS_DATA_STRING: {
+            // Interpret as a region specifier [x0:x1,y0:y1]
+            psRegion region = psRegionFromString(concept->data.V);
+            if (strstr(pattern->name, ".X0")) {
+                offset = region.x0;
+            } else if (strstr(pattern->name, ".Y0")) {
+                offset = region.y0;
+            } else if (strstr(pattern->name, ".X1")) {
+                offset = region.x1;
+            } else if (strstr(pattern->name, ".Y1")) {
+                offset = region.y1;
+            } else {
+                psError(PS_ERR_UNKNOWN, true,
+                        "Unable to interpret %s because unable to determine if concept is X or Y.\n",
+                        pattern->name);
+                return NULL;
+            }
+            break;
+        }
+        #endif
     default:
         if (concept->type == PS_TYPE_F32 && concept->data.F32 - (int)concept->data.F32 == 0) {
@@ -630,5 +652,5 @@
             strcasecmp(xKeyword, yKeyword) == 0) {
         psMetadataItem *yBinItem = psMetadataLookup(cell->concepts, "CELL.YBIN"); // Binning factor in y
-        psString binString = psStringCopy("");
+        psString binString = NULL;
         psStringAppend(&binString, "%d %d", concept->data.S32, yBinItem->data.S32);
         psMetadataItem *binItem = psMetadataItemAllocStr(concept->name, concept->comment, binString);
@@ -809,4 +831,5 @@
 }
 
+
 psMetadataItem *p_pmConceptFormat_Positions(const psMetadataItem *concept,
         const psMetadata *cameraFormat,
@@ -822,4 +845,56 @@
         return NULL;
     }
+
+    #if 0
+    // If both the X0 and Y0 positions are specified by the same header keyword, write both together, as part
+    // of the call for the X0 position.
+    // This is a bit of a kludge --- we're going to write it out as [x0:0,y0:0].  This means that we will be
+    // able to read it back in, but we've destroyed the x1 and y1 if it was present.
+    // We *could* attempt to read the header, parse the region, and only update the ones that we're trying
+    // to update.  Consider this an upgrade option later.
+    // Alternatively, we could add X1 and Y1 concepts, and write the whole lot out together.
+    // But until we care about X1 and Y1, it doesn't really matter --- if you want X1 and Y1, look at X0 and
+    // Y0 and add NXAIS1 and NAXIS2, respectively....
+    if (strstr(concept->name, ".X0")) {
+        psString companion = psStringCopy(concept->name); // Companion entry: ".Y" where this one has ".X"
+        psStringSubstitute(&companion, ".Y0", ".X0");
+
+        // Look both up in the camera format config
+        psMetadata *translation = psMetadataLookupMetadata(NULL, cameraFormat, "TRANSLATION");
+        bool xFound = true, yFound = true;  // Status of MD lookups
+        psString xKeyword = psMetadataLookupStr(&xFound, translation, concept->name);
+        psString yKeyword = psMetadataLookupStr(&yFound, translation, companion);
+        if (xFound && yFound && strlen(xKeyword) > 0 && strlen(yKeyword) > 0 &&
+                strcasecmp(xKeyword, yKeyword) == 0) {
+            psMetadataItem *yItem = psMetadataLookup(cell->concepts, companion); // Corresponding y value
+
+            int x = concept->data.S32 + fortranCorr(cameraFormat, concept->name); // x value
+            int y = yItem->data.S32 + fortranCorr(cameraFormat, companion); // y value
+
+            psRegion region = psRegionSet(x, x, y, y);
+            psString string = psRegionToString(region);
+            psMetadataItem *binItem = psMetadataItemAllocStr(concept->name, concept->comment, string);
+            psFree(string);
+            psFree(companion);
+            return binItem;
+        }
+        psFree(companion);
+    } else if (strstr(concept->name, ".Y0")) {
+        psString companion = psStringCopy(concept->name); // Companion entry: ".Y" where this one has ".X"
+        psStringSubstitute(&companion, ".X0", ".Y0");
+
+        // Look both up in the camera format config
+        psMetadata *translation = psMetadataLookupMetadata(NULL, cameraFormat, "TRANSLATION");
+        bool xFound = true, yFound = true;  // Status of MD lookups
+        psString xKeyword = psMetadataLookupStr(&xFound, translation, concept->name);
+        psString yKeyword = psMetadataLookupStr(&yFound, translation, companion);
+        psFree(companion);
+        if (xFound && yFound && strlen(xKeyword) > 0 && strlen(yKeyword) > 0 &&
+                strcasecmp(xKeyword, yKeyword) == 0) {
+            return NULL;                // We did it with the X; don't do anything.
+        }
+    }
+    #endif
+
     int offset = concept->data.S32;
     offset += fortranCorr(cameraFormat, concept->name);
