diff --git a/i18n_string/i18n_string.inc b/i18n_string/i18n_string.inc
index 3136aad..1805f4b 100644
--- a/i18n_string/i18n_string.inc
+++ b/i18n_string/i18n_string.inc
@@ -293,7 +293,30 @@ class i18n_string_textgroup_default {
   public function __construct($textgroup) {
     $this->textgroup = $textgroup;
     $this->debug = variable_get('i18n_string_debug', FALSE) || variable_get('i18n_string_debug_' . $textgroup, FALSE);
+
+    // Fetch persistent caches.
+    foreach (array('translations', 'strings', 'cache_multiple') as $caches_type) {
+      if (($cache = cache_get('i18n_string_cache:' . $caches_type . ':' . $this->textgroup)) && !empty($cache->data)) {
+        $this->{$caches_type} = $cache->data;
+      }
+    }
   }
+
+  /**
+   * Class destructor.
+   *
+   * Updates the persistent caches for the next usage.
+   */
+  public function __destruct() {
+    // Reduce size to cache by removing NULL values.
+    $this->strings = array_filter($this->strings);
+
+    // Store the persistent caches.
+    foreach (array('translations', 'strings', 'cache_multiple') as $caches_type) {
+      cache_set('i18n_string_cache:' . $caches_type . ':' . $this->textgroup, $this->{$caches_type}, 'cache', CACHE_TEMPORARY);
+    }
+  }
+
   /**
    * Build string object
    *
@@ -455,6 +478,9 @@ class i18n_string_textgroup_default {
    *   SAVED_DELETED | FALSE (If the operation failed because no source)
    */
   public function string_remove($i18nstring, $options = array()) {
+    // Flush cache right away.
+    cache_clear_all(self::getStringObjectCid($i18nstring) . ':', 'cache', TRUE);
+
     $options += array('watchdog' => TRUE, 'messages' => $this->debug);
     if ($source = $i18nstring->get_source()) {
       db_delete('locales_target')->condition('lid', $source->lid)->execute();
@@ -510,6 +536,10 @@ class i18n_string_textgroup_default {
    *   SAVED_UPDATED | SAVED_NEW | SAVED_DELETED | FALSE (If the string is to be removed but has no source)
    */
   public function string_update($i18nstring, $options = array()) {
+
+    // Flush cache right away.
+    cache_clear_all(self::getStringObjectCid($i18nstring) . ':', 'cache', TRUE);
+
     $options += array('watchdog' => TRUE, 'messages' => $this->debug, 'check' => TRUE);
     if ((!$options['check'] || $this->string_check($i18nstring, $options)) && $i18nstring->get_string()) {
       // String is ok, has a value so we store it into the database.
@@ -567,6 +597,26 @@ class i18n_string_textgroup_default {
     $this->strings = array();
     $this->string_format = array();
     $this->translations = array();
+
+    // Reset the persistent caches.
+    foreach (array('translations', 'strings', 'cache_multiple') as $caches_type) {
+      cache_clear_all('i18n_string_cache:' . $caches_type . ':' . $this->textgroup, 'cache', TRUE);
+    }
+  }
+
+  /**
+   * Returns the caching id for a string object.
+   *
+   * @param i18n_string_object $i18nstring
+   *   The string object to fetch the cid for.
+   * @param string $langcode
+   *   The langcode to use.
+   *
+   * @return string
+   *   The caching id.
+   */
+  protected static function getStringObjectCid($i18nstring, $langcode = NULL) {
+    'i18n_string_cache:i18nstring:' . $i18nstring->get_name() . ($langcode) ? ':' . $langcode : NULL;
   }
 
   /**
@@ -611,9 +661,14 @@ class i18n_string_textgroup_default {
    * @todo Optimize when we've already got the source string
    */
   public static function load_translation($i18nstring, $langcode) {
+    $cid = self::getStringObjectCid($i18nstring, $langcode) ;
+    if (($cache = cache_get($cid)) && !empty($cache->data)) {
+      return $cache->data;
+    }
+
     // Search the database using lid if we've got it or textgroup, context otherwise
     if (!empty($i18nstring->lid)) {
-      // We've alreay got lid, we just need translation data
+      // We've already got lid, we just need translation data
       $query = db_select('locales_target', 't');
       $query->condition('t.lid', $i18nstring->lid);
     }
@@ -629,7 +684,9 @@ class i18n_string_textgroup_default {
     $query->condition('t.language', $langcode);
     // Speed up the query, we just need one row
     $query->range(0, 1);
-    return $query->execute()->fetchObject();
+    $translation = $query->execute()->fetchObject();
+    cache_set($cid, $translation, 'cache', CACHE_TEMPORARY);
+    return $translation;
   }
 
   /**
@@ -675,6 +732,10 @@ class i18n_string_textgroup_default {
    *   Full string object with translation data (language, translation)
    */
   protected function save_translation($string, $langcode) {
+    // Update cache.
+    $cid = self::getStringObjectCid($string, $langcode);
+    cache_set($cid, $string->get_translation($langcode), 'cache', CACHE_TEMPORARY);
+
     db_merge('locales_target')
       ->key(array('lid' => $string->lid, 'language' => $langcode))
       ->fields(array('translation' => $string->get_translation($langcode)))
