diff --git a/test/main.js b/test/main.js
index 30c4bf3..775112b 100644
--- a/test/main.js
+++ b/test/main.js
@@ -1,3 +1,8 @@
+/*
+Loads all required files.
+Calls loader.js to get x-editable files with dependencies.
+*/
+
 //detect version of jquery from url param, e.g. 'jquery=1.7.2' 
 var jqver = decodeURIComponent((new RegExp('[?|&]' + 'jquery' + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
     jqurl = jqver ? "http://code.jquery.com/jquery-"+jqver+".min.js" : "libs/jquery/jquery-1.9.1.min.js";
@@ -33,6 +38,7 @@ require(["loader", jqurl], function(loader) {
             case 'bootstrap':
               custom = ['test/unit/datefield', 
                         'test/unit/date', 
+                        'test/unit/datetime', 
                         'test/unit/wysihtml5',
                         'test/unit/typeahead'
                         ];
diff --git a/test/unit/datetime.js b/test/unit/datetime.js
new file mode 100644
index 0000000..2b86f87
--- /dev/null
+++ b/test/unit/datetime.js
@@ -0,0 +1,213 @@
+$(function () {         
+   
+   var dpg, f = 'dd.mm.yyyy hh:ii', mode;
+   
+   module("datetime", {
+        setup: function(){
+            fx = $('#async-fixture');
+            dpg = $.fn.datetimepicker.DPGlobal;
+            $.support.transition = false;
+            mode = $.fn.editable.defaults.mode;
+            $.fn.editable.defaults.mode = 'popup';
+        },
+        teardown: function() {
+            //restore mode
+            $.fn.editable.defaults.mode = mode;
+        }        
+    });
+    
+    function frmt(date, format) {
+        //convert to utc
+        date = $.fn.editabletypes.datetime.prototype.toUTC(date); 
+        return dpg.formatDate(date, dpg.parseFormat(format, 'standard'), 'en', 'standard');  
+    }
+     
+    asyncTest("container should contain datetimepicker with value and save new entered date", function () {
+        $.fn.editabletypes.datetime.defaults.datetimepicker.weekStart = 1;
+        
+        var d = '15.05.1984 20:30',
+            e = $('<a href="#" data-type="datetime" data-pk="1" data-url="post-datetime">'+d+'</a>').appendTo(fx).editable({
+                format: f,
+                datetimepicker: {
+                    
+                }        
+            }),
+            nextD = '16.05.1984 21:35';
+        
+          $.mockjax({
+              url: 'post-datetime',
+              response: function(settings) {
+                  equal(settings.data.value, nextD, 'submitted value correct');            
+              }
+          });
+
+        //testing func, run twice!
+        var func = function() {
+            var df = $.Deferred();
+            equal(frmt(e.data('editable').value, 'dd.mm.yyyy hh:ii'), d, 'value correct');
+                
+            e.click();
+            var p = tip(e);
+            ok(p.find('.datetimepicker').is(':visible'), 'datetimepicker exists');
+            equal(p.find('.datetimepicker').length, 1, 'datetimepicker single');
+            ok(p.find('.datetimepicker').find('.datetimepicker-days').is(':visible'), 'datetimepicker 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('.day.active').next().click();
+            
+            //hours appeared?
+            ok(p.find('.datetimepicker-hours').is(':visible'), 'datetimepicker hours visible');
+            //set hours 21
+            p.find('.hour.active').next().click();
+
+            //minutes appeared?
+            ok(p.find('.datetimepicker-minutes').is(':visible'), 'datetimepicker minutes visible');
+            //set minutes 21:35
+            p.find('.minute.active').next().click();
+
+            //submit
+            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();  
+           });
+        });
+        
+     });  
+     
+     asyncTest("viewformat, init by text", function () {
+         
+        $.fn.editabletypes.datetime.defaults.datetimepicker.weekStart = 1;
+         
+        var dview = '15/05/1984 11:50',
+            d = '1984-05-15 11:50',
+            e = $('<a href="#" data-type="datetime" data-pk="1" data-url="post-datetime1">'+dview+'</a>').appendTo(fx).editable({
+                format: 'yyyy-mm-dd hh:ii',
+                viewformat: 'dd/mm/yyyy hh:ii',
+                datetimepicker: {
+                    
+                }
+            }),
+            nextD = '1984-05-16 11:50',
+            nextDview = '16/05/1984 11:50';
+        
+          equal(frmt(e.data('editable').value, 'yyyy-mm-dd hh:ii'), d, 'value correct');
+                        
+          $.mockjax({
+              url: 'post-datetime1',
+              response: function(settings) {
+                  equal(settings.data.value, nextD, 'submitted value correct');            
+              }
+          });
+                        
+        e.click();
+        var p = tip(e);
+        ok(p.find('.datetimepicker').is(':visible'), 'datetimepicker exists');
+        
+        equal(frmt(e.data('editable').value, 'yyyy-mm-dd hh:ii'), d, 'day set correct');
+        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, 'yyyy-mm-dd hh:ii'), nextD, 'new date saved to value')
+           equal(e.text(), nextDview, 'new text shown in correct format')            
+           e.remove();    
+           start();  
+        }, timeout); 
+        
+     });       
+  
+     test("viewformat, init by value", function () {
+        var dview = '15/05/1984 15:45',
+            d = '1984-05-15 15:45',
+            e = $('<a href="#" data-type="datetime" data-pk="1" data-format="yyyy-mm-dd hh:ii" data-viewformat="dd/mm/yyyy hh:ii"  data-value="'+d+'"></a>').appendTo('#qunit-fixture').editable();
+        
+        equal(frmt(e.data('editable').value, 'yyyy-mm-dd hh:ii'), d, 'value correct');
+        equal(e.text(), dview, 'text correct');
+     });    
+     
+     
+     test("input should contain today if element is empty", function () {
+        var e = $('<a href="#" data-type="datetime"></a>').appendTo('#qunit-fixture').editable();
+        e.click();
+        var p = tip(e),
+            today = new Date();
+        
+        equal(p.find('td.day.active').text(), today.getDate(), 'day shown correct');
+        
+        p.find('.editable-cancel').click();
+        ok(!p.is(':visible'), 'popover closed');      
+      });
+      
+    asyncTest("clear button", function () {
+        var d = '15.05.1984 16:40',
+            e = $('<a href="#" data-type="datetime" data-pk="1" data-url="post-datetime-clear.php">'+d+'</a>').appendTo(fx).editable({
+                format: f,
+                clear: 'abc'
+            });
+                       
+          $.mockjax({
+              url: 'post-datetime-clear.php',
+              response: function(settings) {
+                  equal(settings.data.value, '', 'submitted value correct');            
+              }
+          });
+       
+        equal(frmt(e.data('editable').value, 'dd.mm.yyyy hh:ii'), d, 'value correct');
+            
+        e.click();
+        var p = tip(e);
+        ok(p.find('.datetimepicker').is(':visible'), 'datetimepicker exists');
+        
+        equal(frmt(e.data('editable').value, f), d, 'day set correct');
+        equal(p.find('td.day.active').text(), 15, 'day shown correct');
+
+        var clear = p.find('.editable-clear a');
+        equal(clear.text(), 'abc', 'clear link shown');
+
+        //click clear
+        clear.click();
+        ok(!p.find('td.day.active').length, 'no active day');
+
+        p.find('form').submit();
+    
+        setTimeout(function() {          
+           ok(!p.is(':visible'), 'popover closed');
+           equal(e.data('editable').value, null, 'null saved to value');
+           equal(e.text(), e.data('editable').options.emptytext, 'empty text shown');
+           
+           //reopen popover
+           e.click();
+           p = tip(e);
+           ok(p.find('.datetimepicker').is(':visible'), 'datetimepicker exists');
+            
+           e.remove();    
+           start();  
+        }, timeout); 
+        
+     });        
+
+});
\ No newline at end of file