diff --git a/imageinfo_cache.admin.inc b/imageinfo_cache.admin.inc
index 3f94d54..a3474cc 100644
--- a/imageinfo_cache.admin.inc
+++ b/imageinfo_cache.admin.inc
@@ -36,6 +36,12 @@ function imageinfo_cache_admin_settings_form($form, $form_state) {
     '#description' => t('If <a href="@link">HTTPRL</a> is installed, image styles will be generated in a background parallel process, thus not slowing down entity saves and image file uploads.', array('@link' => 'http://drupal.org/project/httprl')),
     '#disabled' => module_exists('httprl') ? FALSE : TRUE,
   );
+  $form['imageinfo_cache_pseudo_image_toolkit'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Cache calls to getimagesize()'),
+    '#default_value' => variable_get('imageinfo_cache_pseudo_image_toolkit', IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT),
+    '#description' => t('Useful if your filesystem is not local. Uses a wrapper around calls to the real image toolkit; putting caching in optimal places.'),
+  );
 
   $form['pre_generation'] = array(
     '#type' => 'fieldset',
@@ -165,6 +171,9 @@ function imageinfo_cache_admin_settings_form_submit($form, &$form_state) {
       if (is_array($value)) {
         variable_del($key);
       }
+      elseif (strpos($key, 'imageinfo_cache_') === 0) {
+        variable_del($key);
+      }
     }
     drupal_set_message(t('The configuration options have been reset to their default values.'));
     return;
@@ -205,6 +214,9 @@ function imageinfo_cache_admin_settings_form_submit($form, &$form_state) {
       ksort($selection);
       $values[$field_name] = $selection;
     }
+    elseif (strpos($field_name, 'imageinfo_cache_') === 0) {
+      variable_set($field_name, $selection);
+    }
   }
 
   // Compute the array difference.
diff --git a/imageinfo_cache.install b/imageinfo_cache.install
new file mode 100644
index 0000000..572c9a0
--- /dev/null
+++ b/imageinfo_cache.install
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Handles Imageinfo Cache installation and upgrade tasks.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function imageinfo_cache_uninstall() {
+  // Remove imageinfo_cache* variables.
+  db_delete('variable')
+    ->condition('name', 'imageinfo_cache%', 'LIKE')
+    ->execute();
+}
+
+/**
+ * Implements hook_schema().
+ */
+function imageinfo_cache_schema() {
+  // Define cache table.
+  $schema['cache_imageinfo'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_imageinfo']['description'] = 'Cache table for Imageinfo Cache. Used to cache information contained in image_get_info().';
+
+  return $schema;
+}
+
+/**
+ * Implements hook_update_N().
+ *
+ * Create the cache_imageinfo cache bin.
+ */
+function imageinfo_cache_update_7101(&$sandbox) {
+  // Define cache table.
+  $schema = array();
+  $schema['cache_imageinfo'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_imageinfo']['description'] = 'Cache table for Imageinfo Cache. Used to cache information contained in image_get_info().';
+
+  // Create cache table.
+  db_create_table('cache_imageinfo', $schema['cache_imageinfo']);
+}
diff --git a/imageinfo_cache.module b/imageinfo_cache.module
index 8aa0f82..6ff6e62 100644
--- a/imageinfo_cache.module
+++ b/imageinfo_cache.module
@@ -10,6 +10,12 @@
  */
 define('IMAGEINFO_CACHE_USE_HTTPRL', TRUE);
 
+/**
+ * Default value is to not cache getimagesize().
+ */
+define('IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT', FALSE);
+
+
 // Core Hooks.
 /**
  * Implements hook_menu().
@@ -34,6 +40,58 @@ function imageinfo_cache_menu() {
 }
 
 /**
+ * Implements hook_init().
+ */
+function imageinfo_cache_init() {
+  // Do nothing if the cached toolkit is disabled.
+  if (!variable_get('imageinfo_cache_pseudo_image_toolkit', IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT)) {
+    return;
+  }
+
+  $arg = arg();
+  // Do not capture the toolkit if on the admin/config/media/* path.
+  if (   $arg[0] == 'admin'
+      && !empty($arg[1]) && $arg[1] == 'config'
+      && !empty($arg[2]) && $arg[2] == 'media'
+      ) {
+//     return;
+  }
+
+  $toolkit = variable_get('image_toolkit', 'gd');
+  $GLOBALS['conf']['image_toolkit'] = 'imageinfo_cache';
+  $GLOBALS['conf']['image_toolkit_orginal'] = $toolkit;
+}
+
+/**
+ * Implements hook_image_toolkits().
+ */
+function imageinfo_cache_image_toolkits() {
+  // Do nothing if the cached toolkit is disabled.
+  if (!variable_get('imageinfo_cache_pseudo_image_toolkit', IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT)) {
+    return;
+  }
+
+  module_load_include('inc', 'imageinfo_cache', 'imageinfo_cache.toolkit');
+  return array(
+    'imageinfo_cache' => array(
+      'title' => t('Imageinfo Cache'),
+      'available' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Hide the imageinfo_cache pseudo toolkit.
+ */
+function imageinfo_cache_form_system_image_toolkit_settings_alter(&$form, &$form_state, $form_id) {
+  if (isset($form['image_toolkit']['#options']['imageinfo_cache'])) {
+    unset($form['image_toolkit']['#options']['imageinfo_cache']);
+  }
+}
+
+/**
  * Implements hook_field_widget_form_alter().
  *
  * Capture image on upload.
@@ -356,9 +414,18 @@ function imageinfo_cache_create_image_styles_call($uri, $instance_field = array(
         if ($lock_acquired && image_style_create_derivative($style_info, $uri, $destination)) {
           lock_release($lock_name);
           $return[$destination] = $style_name;
+
+          if (variable_get('imageinfo_cache_pseudo_image_toolkit', IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT)) {
+            // Prime get_info cache.
+            image_get_info($destination);
+          }
         }
       }
     }
+    if (variable_get('imageinfo_cache_pseudo_image_toolkit', IMAGEINFO_CACHE_PSEUDO_IMAGE_TOOLKIT)) {
+      // Prime get_info cache.
+      image_get_info($uri);
+    }
   }
   return $return;
 }
diff --git a/imageinfo_cache.toolkit.inc b/imageinfo_cache.toolkit.inc
new file mode 100644
index 0000000..d600745
--- /dev/null
+++ b/imageinfo_cache.toolkit.inc
@@ -0,0 +1,224 @@
+<?php
+
+/**
+ * @file
+ * Imageinfo Cache module. Pseudo image toolkit functions.
+ */
+
+
+/**
+ * Get details about an image.
+ *
+ * @param $image
+ *   An image object.
+ * @return
+ *   FALSE, if the file could not be found or is not an image. Otherwise, a
+ *   keyed array containing information about the image:
+ *   - width: Width in pixels.
+ *   - height: Height in pixels.
+ *   - extension: Commonly used file extension for the image.
+ *   - mime_type: MIME type ('image/jpeg', 'image/gif', 'image/png').
+ *
+ * @see image_get_info()
+ */
+function image_imageinfo_cache_get_info(stdClass $image) {
+  $details = array();
+  $cid = drupal_hash_base64($image->source);
+
+  // Try the static cache first.
+  $static_cache = &drupal_static(__FUNCTION__);
+  if (isset($static_cache[$cid])) {
+    return $static_cache[$cid];
+  }
+
+  // Try the cache backend.
+  $cache = cache_get($cid, 'cache_imageinfo');
+  if (!empty($cache) && !empty($cache->data)) {
+    return $cache->data;
+  }
+
+  // Try the database next.
+  $results = db_query("
+    SELECT
+      file_metadata_width.value AS width,
+      file_metadata_height.value AS height,
+      SUBSTRING_INDEX(file_managed.uri, '.', -1) AS extension,
+      file_managed.filemime AS mime_type,
+      file_managed.filesize AS file_size
+    FROM file_managed AS file_managed
+    INNER JOIN file_metadata AS file_metadata_width
+      ON file_metadata_width.fid = file_managed.fid
+      AND file_metadata_width.name = 'width'
+    INNER JOIN file_metadata AS file_metadata_height
+      ON file_metadata_height.fid = file_managed.fid
+      AND file_metadata_height.name = 'height'
+    WHERE file_managed.uri = :uri
+  ", array(':uri' => $image->source))->fetchAll();
+  if (!empty($results) && !empty($results[0])) {
+    $details['width'] = unserialize($results[0]->width);
+    $details['height'] = unserialize($results[0]->height);
+    $details += (array) $results[0];
+  }
+
+  // Change toolkit back to the original value and get the info from the file
+  // system.
+  if (empty($details)) {
+    $image->toolkit = variable_get('image_toolkit_original', 'gd');
+    $details = image_toolkit_invoke('get_info', $image);
+    if (isset($details) && is_array($details)) {
+      $details['file_size'] = filesize($image->source);
+    }
+  }
+
+  // Write to the cache.
+  if (!empty($details) && empty($cache->data)) {
+    // Write to the static cache first.
+    $static_cache[$cid] = $details;
+
+    // CACHE_PERMANENT isn't good here. Use 2 weeks from now + 0-45 days.
+    // The random 0 to 45 day addition is to prevent a cache stampede.
+    cache_set($cid, $details, 'cache_imageinfo', round(REQUEST_TIME + 1209600 + mt_rand(0, 3888000), -3));
+  }
+
+  return $details;
+}
+
+/**
+ * Crops an image to the given coordinates.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $x
+ *   The starting x offset at which to start the crop, in pixels.
+ * @param $y
+ *   The starting y offset at which to start the crop, in pixels.
+ * @param $width
+ *   The width of the cropped area, in pixels.
+ * @param $height
+ *   The height of the cropped area, in pixels.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_crop()
+ */
+function image_imageinfo_cache_crop(stdClass $image, $x, $y, $width, $height) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('crop', $image, array($x, $y, $width, $height));
+}
+
+/**
+ * Converts an image into grayscale.
+ *
+ * @param $image
+ *   An image object. The $image->resource value will be modified by this call.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_desaturate()
+ */
+function image_imageinfo_cache_desaturate(stdClass $image) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('desaturate', $image);
+}
+
+/**
+ * Creates an image resource from a file.
+ *
+ * @param $image
+ *   An image object. The $image->resource value will populated by this call.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_load()
+ */
+function image_imageinfo_cache_load(stdClass $image) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('load', $image);
+}
+
+/**
+ * Scales an image to the specified size.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $width
+ *   The new width of the resized image, in pixels.
+ * @param $height
+ *   The new height of the resized image, in pixels.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_resize()
+ */
+function image_imageinfo_cache_resize(stdClass $image, $width, $height) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('resize', $image, array($width, $height));
+}
+
+/**
+ * Rotates an image the given number of degrees.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $degrees
+ *   The number of (clockwise) degrees to rotate the image.
+ * @param $background
+ *   An hexadecimal integer specifying the background color to use for the
+ *   uncovered area of the image after the rotation. E.g. 0x000000 for black,
+ *   0xff00ff for magenta, and 0xffffff for white. For images that support
+ *   transparency, this will default to transparent. Otherwise it will
+ *   be white.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_rotate()
+ */
+function image_imageinfo_cache_rotate(stdClass $image, $degrees, $background = NULL) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('rotate', $image, array($degrees, $background));
+}
+
+/**
+ * Writes an image resource to a destination file.
+ *
+ * @param $image
+ *   An image object.
+ * @param $destination
+ *   A string file URI or path where the image should be saved.
+ *
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_save()
+ */
+function image_imageinfo_cache_save(stdClass $image, $destination) {
+  // Change toolkit back to the original value.
+  $image->toolkit = variable_get('image_toolkit_original', 'gd');
+  return image_toolkit_invoke('save', $image, array($destination));
+}
+
+/**
+ * Retrieve settings for the original toolkit.
+ */
+function image_imageinfo_cache_settings() {
+  $toolkit = variable_get('image_toolkit_original', 'gd');
+  $function = 'image_' . variable_get('image_toolkit_original', 'gd') . '_settings';
+  if (function_exists($function)) {
+    return $function();
+  }
+  watchdog('image', 'The selected image handling toolkit %toolkit can not correctly process %function.', array('%toolkit' => $toolkit, '%function' => $function), WATCHDOG_ERROR);
+  return FALSE;
+}
