diff --git a/grunt.js b/grunt.js
index fb92ecf..5f684a5 100644
--- a/grunt.js
+++ b/grunt.js
@@ -159,6 +159,8 @@ module.exports = function(grunt) {
               'src/inputs/date/*.js',
               'src/inputs/dateui/*.js',
               'src/inputs/wysihtml5/*.js',
+              'src/inputs/combodate/combodate.js',
+              'src/inputs/combodate/lib/combodate.js',
               'src/inputs-ext/**/*.js'
               ]
     },
diff --git a/src/editable-form/editable-form.js b/src/editable-form/editable-form.js
index 13057d6..e67478c 100644
--- a/src/editable-form/editable-form.js
+++ b/src/editable-form/editable-form.js
@@ -65,6 +65,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
             this.showLoading();
             
             //append input to form
+            this.input.prerender();
             this.$form.find('div.editable-input').append(this.input.$tpl);            
 
             //append form to container
diff --git a/src/inputs/abstract.js b/src/inputs/abstract.js
index 972c8ee..e07189f 100644
--- a/src/inputs/abstract.js
+++ b/src/inputs/abstract.js
@@ -21,10 +21,16 @@ To create your own input you can inherit from this class.
        init: function(type, options, defaults) {
            this.type = type;
            this.options = $.extend({}, defaults, options);
+       },
+       
+       /*
+       this method called before render to init $tpl that is inserted in DOM
+       */
+       prerender: function() {
            this.$tpl = $(this.options.tpl); //whole tpl as jquery object    
            this.$input = this.$tpl;         //control itself, can be changed in render method
            this.$clear = null;              //clear button
-           this.error = null;               //error message, if input cannot be rendered
+           this.error = null;               //error message, if input cannot be rendered           
        },
        
        /**
diff --git a/test/unit/date.js b/test/unit/date.js
index 056b867..a7205f8 100644
--- a/test/unit/date.js
+++ b/test/unit/date.js
@@ -38,30 +38,44 @@ $(function () {
                   equal(settings.data.value, nextD, 'submitted value correct');            
               }
           });
-       
-        equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), d, 'value correct');
-            
-        e.click();
-        var p = tip(e);
-        ok(p.find('.datepicker').is(':visible'), 'datepicker exists');
-        ok(p.find('.datepicker').find('.datepicker-days').is(':visible'), 'datepicker days visible');        
-        
-        equal(frmt(e.data('editable').value, f), d, 'day set correct');
-        ok(p.find('td.day.active').is(':visible'), 'active day is visible');
-        equal(p.find('td.day.active').text(), 15, 'day shown correct');
-        equal(p.find('th.dow').eq(0).text(), 'Mo', 'weekStart correct');
 
-        //set new day
-        p.find('td.day.active').next().click();
-        p.find('form').submit();
-    
-        setTimeout(function() {          
-           ok(!p.is(':visible'), 'popover closed')
-           equal(frmt(e.data('editable').value, f), nextD, 'new date saved to value')
-           equal(e.text(), nextD, 'new text shown')            
-           e.remove();    
-           start();  
-        }, timeout); 
+        //testing func, run twice!
+        var func = function() {
+            var df = $.Deferred();
+            equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), d, 'value correct');
+                
+            e.click();
+            var p = tip(e);
+            ok(p.find('.datepicker').is(':visible'), 'datepicker exists');
+            equal(p.find('.datepicker').length, 1, 'datepicker single');
+            ok(p.find('.datepicker').find('.datepicker-days').is(':visible'), 'datepicker days visible');        
+            
+            equal(frmt(e.data('editable').value, f), d, 'day set correct');
+            ok(p.find('td.day.active').is(':visible'), 'active day is visible');
+            equal(p.find('td.day.active').text(), 15, 'day shown correct');
+            equal(p.find('th.dow').eq(0).text(), 'Mo', 'weekStart correct');
+
+            //set new day
+            p.find('td.day.active').next().click();
+            p.find('form').submit();
+        
+            setTimeout(function() {          
+               ok(!p.is(':visible'), 'popover closed');
+               equal(frmt(e.data('editable').value, f), nextD, 'new date saved to value');
+               equal(e.text(), nextD, 'new text shown');
+               df.resolve();            
+            }, timeout);
+            
+            return df.promise();
+        };
+        
+        $.when(func()).then(function() {
+           e.editable('setValue', d, true);
+           $.when(func()).then(function() {
+              e.remove();    
+              start();  
+           });
+        });
         
      });  
      
diff --git a/test/unit/dateui.js b/test/unit/dateui.js
index 99038b3..a0a3061 100644
--- a/test/unit/dateui.js
+++ b/test/unit/dateui.js
@@ -40,26 +40,41 @@ $(function () {
               }
           });
        
-        equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), d, 'value correct');
+        //testing func, run twice!
+        var func = function() {
+            var df = $.Deferred();       
+       
+            equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), d, 'value correct');
+                
+            e.click();
+            var p = tip(e);
+            ok(p.find('.ui-datepicker').is(':visible'), 'datepicker exists');
+            equal(p.find('.ui-datepicker').length, 1, 'datepicker single');
             
-        e.click();
-        var p = tip(e);
-        ok(p.find('.ui-datepicker').is(':visible'), 'datepicker exists');
-        
-        equal(p.find('a.ui-state-active').text(), 15, 'day shown correct');
-        equal(p.find('.ui-datepicker-calendar > thead > tr > th').eq(0).find('span').text(), 'Mo', 'weekStart correct');
+            equal(p.find('a.ui-state-active').text(), 15, 'day shown correct');
+            equal(p.find('.ui-datepicker-calendar > thead > tr > th').eq(0).find('span').text(), 'Mo', 'weekStart correct');
 
-        //set new day
-        p.find('a.ui-state-active').parent().next().click();
-        p.find('form').submit();
-    
-        setTimeout(function() {          
-           ok(!p.is(':visible'), 'popover closed');
-           equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), nextD, 'new date saved to value');
-           equal(e.text(), nextDview, 'new text shown');            
-           e.remove();    
-           start();  
-        }, timeout); 
+            //set new day
+            p.find('a.ui-state-active').parent().next().click();
+            p.find('form').submit();
+        
+            setTimeout(function() {          
+               ok(!p.is(':visible'), 'popover closed');
+               equal(frmt(e.data('editable').value, 'dd.mm.yyyy'), nextD, 'new date saved to value');
+               equal(e.text(), nextDview, 'new text shown');            
+               df.resolve(); 
+            }, timeout); 
+            
+            return df.promise();
+        };
+        
+        $.when(func()).then(function() {
+           e.editable('setValue', d, true);
+           $.when(func()).then(function() {
+              e.remove();    
+              start();  
+           });
+        });        
         
      });   
      
diff --git a/test/unit/wysihtml5.js b/test/unit/wysihtml5.js
index 79817ce..971ded6 100644
--- a/test/unit/wysihtml5.js
+++ b/test/unit/wysihtml5.js
@@ -13,41 +13,58 @@ $(function () {
             e = $('<a href="#" data-pk="1" data-url="post.php">'+v1+'</a>').appendTo(fx).editable({
             type: 'wysihtml5',
             success: function(response, newvalue) {
-                // construction: replace(/\s*\n(?!\r)/g, "") required to clear newlines added in ie8
+                // construction replace(/\s*\n(?!\r)/g, "") required to clear newlines added in ie8
                 equal(newvalue.toLowerCase().replace(/\s*\n(?!\r)/g, ""), v2, 'value in success ok');         
             } 
         });
 
-        e.click();
+        //testing func, run twice!
+        var func = function() {
+            var df = $.Deferred();        
+        
+            e.click();
 
-        setTimeout(function() {
-
-            var p = tip(e);
-            ok(p.is(':visible'), 'container visible');
-            ok(p.find('textarea').is(':hidden'), 'textarea hidden');
-            ok(p.find('iframe').length, 'iframe shown');
-            ok(p.find('.wysihtml5-toolbar').length, 'toolbar shown');
-
-            equal(p.find('textarea').val().toLowerCase(), v1.toLowerCase(), 'textrea val correct');
-            
-            var iframe = document.querySelectorAll('.wysihtml5-sandbox'),
-                $c = $(iframe[0]).contents().find('body');
-            
-            equal($c.html().toLowerCase(), v1.toLowerCase(), 'content correct');         
-
-            //set new value, should wait async while it render to iframe
-            $c.html(v2);
             setTimeout(function() {
-                p.find('form').submit();
+
+                var p = tip(e);
+                ok(p.is(':visible'), 'container visible');
+                ok(p.find('textarea').is(':hidden'), 'textarea hidden');
+                equal(p.find('iframe').length, 1, 'iframe single');
+                ok(p.find('.wysihtml5-toolbar').length, 'toolbar shown');
+
+                equal(p.find('textarea').val().toLowerCase(), v1.toLowerCase(), 'textrea val correct');
+                
+                var iframe = document.querySelectorAll('.wysihtml5-sandbox'),
+                    $c = $(iframe[0]).contents().find('body');
+               
+                ok($(iframe[0]).width() > 0, 'iframe has width');
+                ok($(iframe[0]).height() > 0, 'iframe has height');
+                
+                equal($c.html().toLowerCase(), v1.toLowerCase(), 'content correct');         
+
+                //set new value, should wait async while it render to iframe
+                $c.html(v2);
                 setTimeout(function() {
-                    ok(!p.is(':visible'), 'popover closed');
-                    equal(e.data('editable').value.toLowerCase().replace(/\s*\n(?!\r)/g, ""), v2, 'new text saved to value');
-                    equal(e.html().toLowerCase().replace(/\s*\n(?!\r)/g, ""), v2.toLowerCase(), 'new text shown'); 
-                    e.remove();    
-                    start();  
-                }, timeout);                       
-            }, 700);
-        }, 1000);         
+                    p.find('form').submit();
+                    setTimeout(function() {
+                        ok(!p.is(':visible'), 'popover closed');
+                        equal(e.data('editable').value.toLowerCase().replace(/\s*\n(?!\r)/g, ""), v2, 'new text saved to value');
+                        equal(e.html().toLowerCase().replace(/\s*\n(?!\r)/g, ""), v2.toLowerCase(), 'new text shown'); 
+                        df.resolve();  
+                    }, timeout);                       
+                }, 800);
+            }, 1000);  
+            
+            return df.promise();
+        };
+        
+        $.when(func()).then(function() {
+           e.editable('setValue', v1, true);
+           $.when(func()).then(function() {
+              e.remove();    
+              start();  
+           });
+        });               
 
     });