Index: /trunk/Ohana/src/opihi/dvo/ImageSelection.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/ImageSelection.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/ImageSelection.c	(revision 28958)
@@ -38,5 +38,5 @@
 /* free loaded images */
 void FreeImageSelection () {
-  if (image != NULL) free (image);
+  if (image != NULL) FreeImages(image);
   if (subset != NULL) free (subset);
   image = NULL;
Index: /trunk/Ohana/src/opihi/dvo/LoadImages.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/LoadImages.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/LoadImages.c	(revision 28958)
@@ -1,3 +1,13 @@
 # include "dvoshell.h"
+
+// XXX: Maybe make this a command line option
+int dvoUseImageCache = 1;
+
+static char *lastFilename = NULL;
+static time_t lastModified = 0;
+static Image *imageCache = NULL;
+static off_t cacheNimage = 0;
+
+static time_t getLastModified(char *filename);
 
 Image *LoadImages (off_t *Nimage) {
@@ -12,4 +22,21 @@
   catdir = GetCATDIR ();
   sprintf (filename, "%s/Images.dat", catdir);
+
+  if (lastFilename) {
+    if (dvoUseImageCache && !strcmp(lastFilename, filename)) {
+      // Make sure the file hasn't changed since we loaded it
+      if (getLastModified(filename) == lastModified) {
+        *Nimage = cacheNimage;
+        return  imageCache;
+      }
+    }
+    free(lastFilename);
+    lastFilename = NULL;
+    free(imageCache);
+    imageCache = NULL;
+    cacheNimage = 0;
+    lastModified = 0;
+  }
+
 
   gfits_db_init (&db);
@@ -38,4 +65,29 @@
 
   image = gfits_table_get_Image (&db.ftable, Nimage, &db.swapped);
+  if (dvoUseImageCache && image) {
+    cacheNimage = *Nimage;
+    imageCache = image;
+    lastFilename = strdup(filename);
+    lastModified = getLastModified(filename);
+  }
+
   return (image);
 }
+
+static time_t getLastModified(char *filename) {
+  struct stat statbuf;
+  if (!stat(filename, &statbuf)) {
+    return statbuf.st_mtime;
+  } else {
+    return 0;
+  }
+}
+
+void FreeImages(Image *images) {
+  if (!dvoUseImageCache && (images != NULL)) {
+    free(images);
+  } else {
+    // defer free until next LoadImages with a different or modified Images.dat
+  }
+}
+
Index: /trunk/Ohana/src/opihi/dvo/gimages.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gimages.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/gimages.c	(revision 28958)
@@ -247,5 +247,5 @@
   set_int_variable ("IMAGEphotcode:n", Nfound);
 
-  free (image);
+  FreeImages (image);
   free (subset);
 
Index: /trunk/Ohana/src/opihi/dvo/images.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/images.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/images.c	(revision 28958)
@@ -319,5 +319,5 @@
   free (Xvec.elements.Flt);
   free (Yvec.elements.Flt);
-  free (image);
+  FreeImages (image);
   return (TRUE);
 
Index: /trunk/Ohana/src/opihi/dvo/imdense.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imdense.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/imdense.c	(revision 28958)
@@ -70,5 +70,5 @@
   free (Xvec.elements.Flt);
   free (Yvec.elements.Flt);
-  free (image);
+  FreeImages (image);
   return (TRUE);
 
Index: /trunk/Ohana/src/opihi/dvo/imextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 28957)
+++ /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 28958)
@@ -137,5 +137,5 @@
 
   // free (subset);
-  free (image);
+  FreeImages (image);
 
   if (vec) free (vec);
Index: /trunk/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 28957)
+++ /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 28958)
@@ -302,4 +302,5 @@
 int           InitPhotcodes         PROTO((void));
 Image        *LoadImages            PROTO((off_t *Nimage));
+void          FreeImages            PROTO((Image *images));
 Image        *MatchImage            PROTO((unsigned int time, short int source, unsigned int imageID));
 Coords       *MatchMosaic           PROTO((unsigned int time, short int source));
