diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index cca0349..cfce619 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -3,6 +3,7 @@ X-editable changelog
 
 Version 1.4.5 wip
 ----------------------------
+[enh #218] sourceCache now disables cache totally (vitalets)
 [bug #156] conflict of bootstrap datepicker and jQuery UI datepicker (vitalets)
 [enh] update bootstrap-datepicker to 1.1.2 (vitalets)
 [enh] allow follow links in disabled state (vitalets)
diff --git a/src/containers/editable-container.js b/src/containers/editable-container.js
index 663641f..0fb1c5c 100644
--- a/src/containers/editable-container.js
+++ b/src/containers/editable-container.js
@@ -181,8 +181,8 @@ Applied as jQuery method.
 
             /*
             Currently, form is re-rendered on every show. 
-            The main reason is that we dont know, what container will do with content when closed:
-            remove(), detach() or just hide() - it depend on container.
+            The main reason is that we dont know, what will container do with content when closed:
+            remove(), detach() or just hide() - it depends on container.
             
             Detaching form itself before hide and re-insert before show is good solution, 
             but visually it looks ugly --> container changes size before hide.  
diff --git a/src/containers/editable-popover.js b/src/containers/editable-popover.js
index d5c7297..e520f6f 100644
--- a/src/containers/editable-popover.js
+++ b/src/containers/editable-popover.js
@@ -59,7 +59,7 @@
         */
         /*jshint laxcomma: true*/
         setPosition: function () { 
-         
+
             (function() {    
                 var $tip = this.tip()
                 , inside
diff --git a/src/inputs/list.js b/src/inputs/list.js
index 8f8afb0..6690978 100644
--- a/src/inputs/list.js
+++ b/src/inputs/list.js
@@ -58,30 +58,32 @@ List - abstract class for inputs that have source option loaded from js array or
         // ------------- additional functions ------------
 
         onSourceReady: function (success, error) {
+            //run source if it function
+            var source;
+            if ($.isFunction(this.options.source)) {
+                source = this.options.source.call(this.options.scope);
+                this.sourceData = null;
+            } else {
+                source = this.options.source;
+            }            
+            
             //if allready loaded just call success
-            if($.isArray(this.sourceData)) {
+            if(this.options.sourceCache && $.isArray(this.sourceData)) {
                 success.call(this);
                 return; 
             }
 
-            // try parse json in single quotes (for double quotes jquery does automatically)
+            //try parse json in single quotes (for double quotes jquery does automatically)
             try {
-                this.options.source = $.fn.editableutils.tryParseJson(this.options.source, false);
+                source = $.fn.editableutils.tryParseJson(source, false);
             } catch (e) {
                 error.call(this);
                 return;
             }
-            
-            var source = this.options.source;
-            
-            //run source if it function
-            if ($.isFunction(source)) {
-                source = source.call(this.options.scope);
-            }
 
             //loading from url
             if (typeof source === 'string') {
-                //try to get from cache
+                //try to get sourceData from cache
                 if(this.options.sourceCache) {
                     var cacheID = source,
                     cache;
diff --git a/test/unit/select.js b/test/unit/select.js
index a5b3da8..1a8f9ae 100644
--- a/test/unit/select.js
+++ b/test/unit/select.js
@@ -41,13 +41,15 @@ $(function () {
             
             //open second time: items should not dublicate
             e.click();
-                        
-            ok(p.find('select').length, 'select exists');
-            equal(p.find('select').find('option').length, size, 'options loaded');
-            equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
-                          
-            e.remove();    
-            start();  
+            p = tip(e);
+            setTimeout(function() {            
+                ok(p.find('select').length, 'select exists');
+                equal(p.find('select').find('option').length, size, 'options loaded');
+                equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+
+                e.remove();    
+                start();  
+            }, timeout);                
         }, timeout);                     
     });      
     
@@ -106,7 +108,8 @@ $(function () {
     }); 
     
      test("load options from function returning array", function () {
-         var e = $('<a href="#" data-type="select" data-value="2" data-url="post.php">customer</a>').appendTo('#qunit-fixture').editable({
+         var counter = 0,
+             e = $('<a href="#" data-type="select" data-value="2" data-url="post.php">customer</a>').appendTo('#qunit-fixture').editable({
              pk: 1,
              prepend: function() {
                 equal(this, e[0], 'prepend scope is element');
@@ -114,22 +117,30 @@ $(function () {
              },
              source: function() {
                 equal(this, e[0], 'source scope is element');
-                return groups; 
+                return counter ? groupsArr.concat([{10: 'test'}]) : groupsArr; 
              }
           });
 
-        e.click()
-        var p = tip(e);
-        ok(p.is(':visible'), 'popover visible');
-        ok(p.find('select').length, 'select exists');
-        equal(p.find('select').find('option').length, size+1, 'options loaded');
-        equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
-        p.find('.editable-cancel').click(); 
-        ok(!p.is(':visible'), 'popover was removed');  
+        function t() {  
+            e.click()
+            var p = tip(e);
+            ok(p.is(':visible'), 'popover visible');
+            ok(p.find('select').length, 'select exists');
+            equal(p.find('select').find('option').length, size+1+counter, 'options loaded');
+            equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+            p.find('.editable-cancel').click(); 
+            ok(!p.is(':visible'), 'popover was removed');
+        }
+        
+        //first run
+        t();
+        //second time
+        counter = 1;
+        t();  
     });    
     
      asyncTest("load options from function returning URL", function () {
-         var e = $('<a href="#" data-type="select" data-value="2" data-url="post.php">customer</a>').appendTo('#qunit-fixture').editable({
+         var e = $('<a href="#" data-type="select" data-value="2" data-url="post.php">customer</a>').appendTo(fx).editable({
              pk: 1,
              //need to disable cache to force request
              sourceCache: false,             
@@ -152,13 +163,15 @@ $(function () {
             
             //open second time: items should not dublicate
             e.click();
-                        
-            ok(p.find('select').length, 'select exists');
-            equal(p.find('select').find('option').length, size, 'options loaded');
-            equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
-                          
-            e.remove();    
-            start();  
+            p = tip(e);
+            setTimeout(function() {
+                ok(p.find('select').length, 'select exists');
+                equal(p.find('select option').length, size, 'options loaded');
+                equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+                              
+                e.remove();
+                start();
+            }, timeout);  
         }, timeout);  
     });      
     
@@ -428,7 +441,7 @@ $(function () {
         
      });     
      
-     
+     //since 1.4.5 sourceCache is more strong: it forces load sourceData on every click     
     asyncTest("sourceCache: false", function () {
         
          $.mockjax({
@@ -448,6 +461,7 @@ $(function () {
            });
         
         setTimeout(function() {
+            //autotext for first only!
             equal(req, 1, 'autotext request performed');
                
             //click first
@@ -459,7 +473,7 @@ $(function () {
                 
                 ok(p.is(':visible'), 'popover visible');
                 equal(p.find('select').find('option').length, size, 'options loaded');
-                equal(req, 1, 'no additional request performed, loaded on autotext');
+                equal(req, 2, 'additional request performed (allthough loaded on autotext)');
                 
                 p.find('.editable-cancel').click(); 
                 ok(!p.is(':visible'), 'popover was removed');  
@@ -471,7 +485,7 @@ $(function () {
                 setTimeout(function() {
                     ok(p.is(':visible'), 'popover2 visible');
                     equal(p.find('select').find('option').length, size, 'options loaded');
-                    equal(req, 2, 'second request performed');
+                    equal(req, 3, 'second request performed');
                     
                     p.find('.editable-cancel').click(); 
                     ok(!p.is(':visible'), 'popover was removed');                  
@@ -690,16 +704,14 @@ $(function () {
      
     
     asyncTest("change source", function () {
-        var e = $('<a href="#" data-type="select" data-name="load-srv" data-value="2" data-source="groups.php"></a>').appendTo(fx).editable({
-            //need to disable cache to force request
-            sourceCache: false
+        var e = $('<a href="#" data-type="select" data-name="load-srv" data-value="2" data-source="groups.php">customer</a>').appendTo(fx).editable({
+            sourceCache: true
         });
-
+                 
+        e.click();
+        var p = tip(e); 
+       
         setTimeout(function() {
-        
-            e.click();
-            var p = tip(e); 
-           
             equal(p.find('select').find('option').length, size, 'options loaded');
             equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;       
             
@@ -707,12 +719,12 @@ $(function () {
             ok(!p.is(':visible'), 'popover was closed');
             
             $.mockjax({
-                url: 'groups1.php',
+                url: 'groups-changed.php',
                 responseText: [{value: 'a', text: 1}, {value: 'b', text: 2}]
             });        
                     
             //set new source
-            e.editable('option', 'source', 'groups1.php');
+            e.editable('option', 'source', 'groups-changed.php');
             e.click();
          
             setTimeout(function() {
@@ -728,8 +740,7 @@ $(function () {
                 e.remove();    
                 start();  
             }, timeout);
-            
-        }, timeout);                                                  
+         }, timeout);                
     });  
     
     asyncTest("optgroup", function () {