diff --git a/src/inputs/datetime/bootstrap-datetimepicker/css/datetimepicker.css b/src/inputs/datetime/bootstrap-datetimepicker/css/datetimepicker.css
index 73eeb25..18bd8be 100644
--- a/src/inputs/datetime/bootstrap-datetimepicker/css/datetimepicker.css
+++ b/src/inputs/datetime/bootstrap-datetimepicker/css/datetimepicker.css
@@ -32,7 +32,7 @@
   top: 0;
   left: 0;
 }
-.datetimepicker-dropdown:before {
+[class*=" datetimepicker-dropdown"]:before {
   content: '';
   display: inline-block;
   border-left: 7px solid transparent;
@@ -40,40 +40,64 @@
   border-bottom: 7px solid #ccc;
   border-bottom-color: rgba(0, 0, 0, 0.2);
   position: absolute;
-  top: -7px;
-  left: 6px;
 }
-.datetimepicker-dropdown:after {
+[class*=" datetimepicker-dropdown"]:after {
   content: '';
   display: inline-block;
   border-left: 6px solid transparent;
   border-right: 6px solid transparent;
   border-bottom: 6px solid #ffffff;
   position: absolute;
-  top: -6px;
-  left: 7px;
 }
-.datetimepicker-dropdown-left:before {
+[class*=" datetimepicker-dropdown-top"]:before {
   content: '';
   display: inline-block;
   border-left: 7px solid transparent;
   border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  position: absolute;
+  border-top: 7px solid #ccc;
+  border-top-color: rgba(0, 0, 0, 0.2);
+  border-bottom: 0;
+}
+[class*=" datetimepicker-dropdown-top"]:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+.datetimepicker-dropdown-bottom-right:before {
   top: -7px;
   right: 6px;
 }
-.datetimepicker-dropdown-left:after {
-  content: '';
-  display: inline-block;
-  border-left: 6px solid transparent;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  position: absolute;
+.datetimepicker-dropdown-bottom-right:after {
   top: -6px;
   right: 7px;
 }
+.datetimepicker-dropdown-bottom-left:before {
+  top: -7px;
+  left: 6px;
+}
+.datetimepicker-dropdown-bottom-left:after {
+  top: -6px;
+  left: 7px;
+}
+.datetimepicker-dropdown-top-right:before {
+  bottom: -7px;
+  right: 6px;
+}
+.datetimepicker-dropdown-top-right:after {
+  bottom: -6px;
+  right: 7px;
+}
+.datetimepicker-dropdown-top-left:before {
+  bottom: -7px;
+  left: 6px;
+}
+.datetimepicker-dropdown-top-left:after {
+  bottom: -6px;
+  left: 7px;
+}
 .datetimepicker > div {
   display: none;
 }
diff --git a/src/inputs/datetime/bootstrap-datetimepicker/js/bootstrap-datetimepicker.js b/src/inputs/datetime/bootstrap-datetimepicker/js/bootstrap-datetimepicker.js
index 8e8b83d..bad0260 100644
--- a/src/inputs/datetime/bootstrap-datetimepicker/js/bootstrap-datetimepicker.js
+++ b/src/inputs/datetime/bootstrap-datetimepicker/js/bootstrap-datetimepicker.js
@@ -53,10 +53,17 @@
 		this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType);
 		this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5;
 		this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right';
-        this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false;
-        this.initialDate = options.initialDate || new Date();
+				this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false;
+				this.initialDate = options.initialDate || new Date();
 
 		this._attachEvents();
+		
+			this.formatViewType = "datetime";
+			if ('formatViewType' in options) {
+					this.formatViewType = options.formatViewType;
+			} else if ('formatViewType' in this.element.data()) {
+					this.formatViewType = this.element.data('formatViewType');
+			}
 
 		this.minView = 0;
 		if ('minView' in options) {
@@ -83,13 +90,13 @@
 		this.startViewMode = DPGlobal.convertViewMode(this.startViewMode);
 		this.viewMode = this.startViewMode;
 
-        this.viewSelect = this.minView;
-        if ('viewSelect' in options) {
-            this.viewSelect = options.viewSelect;
-        } else if ('viewSelect' in this.element.data()) {
-            this.viewSelect = this.element.data('view-select');
-        }
-        this.viewSelect = DPGlobal.convertViewMode(this.viewSelect);
+				this.viewSelect = this.minView;
+				if ('viewSelect' in options) {
+						this.viewSelect = options.viewSelect;
+				} else if ('viewSelect' in this.element.data()) {
+						this.viewSelect = this.element.data('view-select');
+				}
+				this.viewSelect = DPGlobal.convertViewMode(this.viewSelect);
 
 		this.forceParse = true;
 		if ('forceParse' in options) {
@@ -108,11 +115,7 @@
 		if (this.isInline) {
 			this.picker.addClass('datetimepicker-inline');
 		} else {
-			if (this.component && this.pickerPosition == 'bottom-left') {
-				this.picker.addClass('datetimepicker-dropdown-left dropdown-menu');
-			} else {
-				this.picker.addClass('datetimepicker-dropdown dropdown-menu');
-			}
+			this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu');
 		}
 		if (this.isRTL){
 			this.picker.addClass('datetimepicker-rtl');
@@ -301,15 +304,28 @@
 			}
 		},
 
+        setFormat: function(format) {
+            this.format = DPGlobal.parseFormat(format, this.formatType);
+            var element;
+            if (this.isInput) {
+                element = this.element;
+            } else if (this.component){
+                element = this.element.find('input');
+            }
+            if (element && element.val()) {
+                this.setValue();
+            }
+        },
+
 		setValue: function() {
 			var formatted = this.getFormattedDate();
 			if (!this.isInput) {
 				if (this.component){
-					this.element.find('input').prop('value', formatted);
+					this.element.find('input').val(formatted);
 				}
 				this.element.data('date', formatted);
 			} else {
-				this.element.prop('value', formatted);
+				this.element.val(formatted);
 			}
 			if (this.linkField) {
 				$('#' + this.linkField).val(this.getFormattedDate(this.linkFormat));
@@ -354,21 +370,26 @@
 		place: function(){
 			if(this.isInline) return;
 			var zIndex = parseInt(this.element.parents().filter(function() {
-							return $(this).css('z-index') != 'auto';
-						}).first().css('z-index'))+10;
-			var offset, left;
+				return $(this).css('z-index') != 'auto';
+			}).first().css('z-index'))+10;
+			var offset, top, left;
 			if (this.component) {
 				offset = this.component.offset();
 				left = offset.left;
-				if (this.pickerPosition == 'bottom-left') {
+				if (this.pickerPosition == 'bottom-left' || this.pickerPosition == 'top-left') {
 					left += this.component.outerWidth() - this.picker.outerWidth();
 				}
 			} else {
 				offset = this.element.offset();
 				left = offset.left;
 			}
+			if (this.pickerPosition == 'top-left' || this.pickerPosition == 'top-right') {
+				top = offset.top - this.picker.outerHeight();
+			} else {
+				top = offset.top + this.height;
+			}
 			this.picker.css({
-				top: offset.top + this.height,
+				top: top,
 				left: left,
 				zIndex: zIndex
 			});
@@ -380,7 +401,7 @@
 				date = arguments[0];
 				fromArgs = true;
 			} else {
-				date = this.isInput ? this.element.prop('value') : this.element.data('date') || this.element.find('input').prop('value') || this.initialDate;
+                date = this.element.data('date') || (this.isInput ? this.element.val() : this.element.find('input').val()) || this.initialDate;
 			}
 
 			if (!date) {
@@ -439,11 +460,22 @@
 				today = new Date();
 			this.picker.find('.datetimepicker-days thead th:eq(1)')
 						.text(dates[this.language].months[month]+' '+year);
-			this.picker.find('.datetimepicker-hours thead th:eq(1)')
-						.text(dayMonth+' '+dates[this.language].months[month]+' '+year);
-			this.picker.find('.datetimepicker-minutes thead th:eq(1)')
-						.text(dayMonth+' '+dates[this.language].months[month]+' '+year);
-			this.picker.find('tfoot th.today')
+				if (this.formatViewType == "time") {
+						var hourConverted = hours % 12 ? hours % 12 : 12;
+						var hoursDisplay = (hourConverted < 10 ? '0' : '') + hourConverted;
+						var minutesDisplay = (minutes < 10 ? '0' : '') + minutes;
+						var meridianDisplay = dates[this.language].meridiem[hours < 12 ? 0 : 1];
+						this.picker.find('.datetimepicker-hours thead th:eq(1)')
+								.text(hoursDisplay + ':' + minutesDisplay + ' ' + meridianDisplay.toUpperCase());
+						this.picker.find('.datetimepicker-minutes thead th:eq(1)')
+								.text(hoursDisplay + ':' + minutesDisplay + ' ' + meridianDisplay.toUpperCase());
+				} else {
+						this.picker.find('.datetimepicker-hours thead th:eq(1)')
+								.text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year);
+						this.picker.find('.datetimepicker-minutes thead th:eq(1)')
+								.text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year);		        
+				}
+				this.picker.find('tfoot th.today')
 						.text(dates[this.language].today)
 						.toggle(this.todayBtn !== false);
 			this.updateNavArrows();
@@ -451,9 +483,9 @@
 			/*var prevMonth = UTCDate(year, month, 0,0,0,0,0);
 			prevMonth.setUTCDate(prevMonth.getDate() - (prevMonth.getUTCDay() - this.weekStart + 7)%7);*/
 			var prevMonth = UTCDate(year, month-1, 28,0,0,0,0),
-                day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
-		    prevMonth.setUTCDate(day);
-      		prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
+								day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
+				prevMonth.setUTCDate(day);
+					prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
 			var nextMonth = new Date(prevMonth);
 			nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
 			nextMonth = nextMonth.valueOf();
@@ -492,7 +524,7 @@
 			this.picker.find('.datetimepicker-days tbody').empty().append(html.join(''));
 
 			html = [];
-            var txt = '', meridian = '', meridianOld = '';
+						var txt = '', meridian = '', meridianOld = '';
 			for (var i=0;i<24;i++) {
 				var actual = UTCDate(year, month, dayMonth, i);
 				clsName = '';
@@ -502,29 +534,29 @@
 				} else if (hours == i) {
 					clsName += ' active';
 				}
-                if (this.showMeridian && dates[this.language].meridiem.length == 2) {
-                    meridian = (i<12?dates[this.language].meridiem[0]:dates[this.language].meridiem[1]);
-                    if (meridian != meridianOld) {
-                        if (meridianOld != '') {
-                            html.push('</fieldset>');
-                        }
-                        html.push('<fieldset class="hour"><legend>'+meridian.toUpperCase()+'</legend>');
-                    }
-                    meridianOld = meridian;
-                    txt = (i%12?i%12:12);
-                    html.push('<span class="hour'+clsName+' hour_'+(i<12?'am':'pm')+'">'+txt+'</span>');
-                    if (i == 23) {
-                        html.push('</fieldset>');
-                    }
-                } else {
-                    txt = i+':00';
-                    html.push('<span class="hour'+clsName+'">'+txt+'</span>');
-                }
+								if (this.showMeridian && dates[this.language].meridiem.length == 2) {
+										meridian = (i<12?dates[this.language].meridiem[0]:dates[this.language].meridiem[1]);
+										if (meridian != meridianOld) {
+												if (meridianOld != '') {
+														html.push('</fieldset>');
+												}
+												html.push('<fieldset class="hour"><legend>'+meridian.toUpperCase()+'</legend>');
+										}
+										meridianOld = meridian;
+										txt = (i%12?i%12:12);
+										html.push('<span class="hour'+clsName+' hour_'+(i<12?'am':'pm')+'">'+txt+'</span>');
+										if (i == 23) {
+												html.push('</fieldset>');
+										}
+								} else {
+										txt = i+':00';
+										html.push('<span class="hour'+clsName+'">'+txt+'</span>');
+								}
 			}
 			this.picker.find('.datetimepicker-hours td').html(html.join(''));
 
 			html = [];
-            txt = '', meridian = '', meridianOld = '';
+						txt = '', meridian = '', meridianOld = '';
 			for(var i=0;i<60;i+=this.minuteStep) {
 				var actual = UTCDate(year, month, dayMonth, hours, i, 0);
 				clsName = '';
@@ -533,26 +565,26 @@
 				} else if (Math.floor(minutes/this.minuteStep) == Math.floor(i/this.minuteStep)) {
 					clsName += ' active';
 				}
-                if (this.showMeridian && dates[this.language].meridiem.length == 2) {
-                    meridian = (hours<12?dates[this.language].meridiem[0]:dates[this.language].meridiem[1]);
-                    if (meridian != meridianOld) {
-                        if (meridianOld != '') {
-                            html.push('</fieldset>');
-                        }
-                        html.push('<fieldset class="minute"><legend>'+meridian.toUpperCase()+'</legend>');
-                    }
-                    meridianOld = meridian;
-                    txt = (hours%12?hours%12:12);
-                    //html.push('<span class="minute'+clsName+' minute_'+(hours<12?'am':'pm')+'">'+txt+'</span>');
-                    html.push('<span class="minute'+clsName+'">'+txt+':'+(i<10?'0'+i:i)+'</span>');
-                    if (i == 59) {
-                        html.push('</fieldset>');
-                    }
-                } else {
-                    txt = i+':00';
-                    //html.push('<span class="hour'+clsName+'">'+txt+'</span>');
-                    html.push('<span class="minute'+clsName+'">'+hours+':'+(i<10?'0'+i:i)+'</span>');
-                }
+								if (this.showMeridian && dates[this.language].meridiem.length == 2) {
+										meridian = (hours<12?dates[this.language].meridiem[0]:dates[this.language].meridiem[1]);
+										if (meridian != meridianOld) {
+												if (meridianOld != '') {
+														html.push('</fieldset>');
+												}
+												html.push('<fieldset class="minute"><legend>'+meridian.toUpperCase()+'</legend>');
+										}
+										meridianOld = meridian;
+										txt = (hours%12?hours%12:12);
+										//html.push('<span class="minute'+clsName+' minute_'+(hours<12?'am':'pm')+'">'+txt+'</span>');
+										html.push('<span class="minute'+clsName+'">'+txt+':'+(i<10?'0'+i:i)+'</span>');
+										if (i == 59) {
+												html.push('</fieldset>');
+										}
+								} else {
+										txt = i+':00';
+										//html.push('<span class="hour'+clsName+'">'+txt+'</span>');
+										html.push('<span class="minute'+clsName+'">'+hours+':'+(i<10?'0'+i:i)+'</span>');
+								}
 			}
 			this.picker.find('.datetimepicker-minutes td').html(html.join(''));
 
@@ -588,6 +620,7 @@
 				year += 1;
 			}
 			yearCont.html(html);
+			this.place();
 		},
 
 		updateNavArrows: function() {
@@ -607,9 +640,9 @@
 						this.picker.find('.prev').css({visibility: 'visible'});
 					}
 					if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() 
-												  && month >= this.endDate.getUTCMonth()
-												  && day >= this.endDate.getUTCDate()
-												  && hour >= this.endDate.getUTCHours()) {
+													&& month >= this.endDate.getUTCMonth()
+													&& day >= this.endDate.getUTCDate()
+													&& hour >= this.endDate.getUTCHours()) {
 						this.picker.find('.next').css({visibility: 'hidden'});
 					} else {
 						this.picker.find('.next').css({visibility: 'visible'});
@@ -624,8 +657,8 @@
 						this.picker.find('.prev').css({visibility: 'visible'});
 					}
 					if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() 
-												  && month >= this.endDate.getUTCMonth()
-												  && day >= this.endDate.getUTCDate()) {
+													&& month >= this.endDate.getUTCMonth()
+													&& day >= this.endDate.getUTCDate()) {
 						this.picker.find('.next').css({visibility: 'hidden'});
 					} else {
 						this.picker.find('.next').css({visibility: 'visible'});
@@ -639,7 +672,7 @@
 						this.picker.find('.prev').css({visibility: 'visible'});
 					}
 					if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() 
-												  && month >= this.endDate.getUTCMonth()) {
+													&& month >= this.endDate.getUTCMonth()) {
 						this.picker.find('.next').css({visibility: 'hidden'});
 					} else {
 						this.picker.find('.next').css({visibility: 'visible'});
@@ -717,25 +750,25 @@
 						break;
 					case 'span':
 						if (!target.is('.disabled')) {
-                            var year    = this.viewDate.getUTCFullYear(),
-                                month   = this.viewDate.getUTCMonth(),
-                                day     = this.viewDate.getUTCDate(),
-                                hours   = this.viewDate.getUTCHours(),
-                                minutes = this.viewDate.getUTCMinutes(),
-                                seconds = this.viewDate.getUTCSeconds();
+														var year    = this.viewDate.getUTCFullYear(),
+																month   = this.viewDate.getUTCMonth(),
+																day     = this.viewDate.getUTCDate(),
+																hours   = this.viewDate.getUTCHours(),
+																minutes = this.viewDate.getUTCMinutes(),
+																seconds = this.viewDate.getUTCSeconds();
 
 							if (target.is('.month')) {
 								this.viewDate.setUTCDate(1);
 								month = target.parent().find('span').index(target);
-                                day   = this.viewDate.getUTCDate();
+																day   = this.viewDate.getUTCDate();
 								this.viewDate.setUTCMonth(month);
 								this.element.trigger({
 									type: 'changeMonth',
 									date: this.viewDate
 								});
-                                if (this.viewSelect >= 3) {
-								    this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
-                                }
+																if (this.viewSelect >= 3) {
+										this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
+																}
 							} else if (target.is('.year')) {
 								this.viewDate.setUTCDate(1);
 								year = parseInt(target.text(), 10) || 0;
@@ -744,36 +777,36 @@
 									type: 'changeYear',
 									date: this.viewDate
 								});
-                                if (this.viewSelect >= 4) {
-                                    this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
-                                }
+																if (this.viewSelect >= 4) {
+																		this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
+																}
 							} else if (target.is('.hour')){
 								hours = parseInt(target.text(), 10) || 0;
-                                if (target.hasClass('hour_am') || target.hasClass('hour_pm')) {
-                                    if (hours == 12 && target.hasClass('hour_am')) {
-                                        hours = 0;
-                                    } else if (hours != 12 && target.hasClass('hour_pm')) {
-                                        hours += 12;
-                                    }
-                                }
-                                this.viewDate.setUTCHours(hours);
+																if (target.hasClass('hour_am') || target.hasClass('hour_pm')) {
+																		if (hours == 12 && target.hasClass('hour_am')) {
+																				hours = 0;
+																		} else if (hours != 12 && target.hasClass('hour_pm')) {
+																				hours += 12;
+																		}
+																}
+																this.viewDate.setUTCHours(hours);
 								this.element.trigger({
 									type: 'changeHour',
 									date: this.viewDate
 								});
-                                if (this.viewSelect >= 1) {
-								    this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
-                                }
+																if (this.viewSelect >= 1) {
+										this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
+																}
 							} else if (target.is('.minute')){
 								minutes = parseInt(target.text().substr(target.text().indexOf(':')+1), 10) || 0;
-                                this.viewDate.setUTCMinutes(minutes);
+																this.viewDate.setUTCMinutes(minutes);
 								this.element.trigger({
 									type: 'changeMinute',
 									date: this.viewDate
 								});
-                                if (this.viewSelect >= 0) {
-								    this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
-                                }
+																if (this.viewSelect >= 0) {
+										this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
+																}
 							}
 							if (this.viewMode != 0) {
 								var oldViewMode = this.viewMode;
@@ -813,16 +846,16 @@
 									month += 1;
 								}
 							}
-                            this.viewDate.setUTCDate(day);
-                            this.viewDate.setUTCMonth(month);
-                            this.viewDate.setUTCFullYear(year);
-                            this.element.trigger({
-                                type: 'changeDay',
-                                date: this.viewDate
-                            });
-                            if (this.viewSelect >= 2) {
-							    this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
-                            }
+														this.viewDate.setUTCDate(day);
+														this.viewDate.setUTCMonth(month);
+														this.viewDate.setUTCFullYear(year);
+														this.element.trigger({
+																type: 'changeDay',
+																date: this.viewDate
+														});
+														if (this.viewSelect >= 2) {
+									this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
+														}
 						}
 						var oldViewMode = this.viewMode;
 						this.showMode(-1);
@@ -841,10 +874,6 @@
 			if (!which || which  == 'view')
 				this.viewDate = date;
 			this.fill();
-			this.element.trigger({
-				type: 'changeDate',
-				date: this.date
-			});
 			this.setValue();
 			var element;
 			if (this.isInput) {
@@ -858,6 +887,10 @@
 					//this.hide();
 				}
 			}
+			this.element.trigger({
+				type: 'changeDate',
+				date: this.date
+			});
 		},
 
 		moveMinute: function(date, dir){
@@ -950,28 +983,28 @@
 				case 39: // right
 					if (!this.keyboardNavigation) break;
 					dir = e.keyCode == 37 ? -1 : 1;
-                    viewMode = this.viewMode;
-                    if (e.ctrlKey) {
-                        viewMode += 2;
-                    } else if (e.shiftKey) {
-                        viewMode += 1;
-                    }
-                    if (viewMode == 4) {
+										viewMode = this.viewMode;
+										if (e.ctrlKey) {
+												viewMode += 2;
+										} else if (e.shiftKey) {
+												viewMode += 1;
+										}
+										if (viewMode == 4) {
 						newDate = this.moveYear(this.date, dir);
 						newViewDate = this.moveYear(this.viewDate, dir);
-                    } else if (viewMode == 3) {
+										} else if (viewMode == 3) {
 						newDate = this.moveMonth(this.date, dir);
 						newViewDate = this.moveMonth(this.viewDate, dir);
-                    } else if (viewMode == 2) {
+										} else if (viewMode == 2) {
 						newDate = this.moveDate(this.date, dir);
 						newViewDate = this.moveDate(this.viewDate, dir);
-                    } else if (viewMode == 1) {
+										} else if (viewMode == 1) {
 						newDate = this.moveHour(this.date, dir);
 						newViewDate = this.moveHour(this.viewDate, dir);
-                    } else if (viewMode == 0) {
+										} else if (viewMode == 0) {
 						newDate = this.moveMinute(this.date, dir);
 						newViewDate = this.moveMinute(this.viewDate, dir);
-                    }
+										}
 					if (this.dateWithinRange(newDate)){
 						this.date = newDate;
 						this.viewDate = newViewDate;
@@ -985,33 +1018,33 @@
 				case 40: // down
 					if (!this.keyboardNavigation) break;
 					dir = e.keyCode == 38 ? -1 : 1;
-                    viewMode = this.viewMode;
-                    if (e.ctrlKey) {
-                        viewMode += 2;
-                    } else if (e.shiftKey) {
-                        viewMode += 1;
-                    }
-                    if (viewMode == 4) {
+										viewMode = this.viewMode;
+										if (e.ctrlKey) {
+												viewMode += 2;
+										} else if (e.shiftKey) {
+												viewMode += 1;
+										}
+										if (viewMode == 4) {
 						newDate = this.moveYear(this.date, dir);
 						newViewDate = this.moveYear(this.viewDate, dir);
-                    } else if (viewMode == 3) {
+										} else if (viewMode == 3) {
 						newDate = this.moveMonth(this.date, dir);
 						newViewDate = this.moveMonth(this.viewDate, dir);
-                    } else if (viewMode == 2) {
+										} else if (viewMode == 2) {
 						newDate = this.moveDate(this.date, dir * 7);
 						newViewDate = this.moveDate(this.viewDate, dir * 7);
-                    } else if (viewMode == 1) {
-                        if (this.showMeridian) {
-                            newDate = this.moveHour(this.date, dir * 6);
-                            newViewDate = this.moveHour(this.viewDate, dir * 6);
-                        } else {
-                            newDate = this.moveHour(this.date, dir * 4);
-                            newViewDate = this.moveHour(this.viewDate, dir * 4);
-                        }
-                    } else if (viewMode == 0) {
+										} else if (viewMode == 1) {
+												if (this.showMeridian) {
+														newDate = this.moveHour(this.date, dir * 6);
+														newViewDate = this.moveHour(this.viewDate, dir * 6);
+												} else {
+														newDate = this.moveHour(this.date, dir * 4);
+														newViewDate = this.moveHour(this.viewDate, dir * 4);
+												}
+										} else if (viewMode == 0) {
 						newDate = this.moveMinute(this.date, dir * 4);
 						newViewDate = this.moveMinute(this.viewDate, dir * 4);
-                    }
+										}
 					if (this.dateWithinRange(newDate)){
 						this.date = newDate;
 						this.viewDate = newViewDate;
@@ -1022,19 +1055,19 @@
 					}
 					break;
 				case 13: // enter
-                    if (this.viewMode != 0) {
-                        var oldViewMode = this.viewMode;
-                        this.showMode(-1);
-                        this.fill();
-                        if (oldViewMode == this.viewMode && this.autoclose) {
-                            this.hide();
-                        }
-                    } else {
-                        this.fill();
-                        if (this.autoclose) {
-					        this.hide();
-                        }
-                    }
+										if (this.viewMode != 0) {
+												var oldViewMode = this.viewMode;
+												this.showMode(-1);
+												this.fill();
+												if (oldViewMode == this.viewMode && this.autoclose) {
+														this.hide();
+												}
+										} else {
+												this.fill();
+												if (this.autoclose) {
+									this.hide();
+												}
+										}
 					e.preventDefault();
 					break;
 				case 9: // tab
@@ -1042,10 +1075,6 @@
 					break;
 			}
 			if (dateChanged){
-				this.element.trigger({
-					type: 'changeDate',
-					date: this.date
-				});
 				var element;
 				if (this.isInput) {
 					element = this.element;
@@ -1055,6 +1084,10 @@
 				if (element) {
 					element.change();
 				}
+				this.element.trigger({
+					type: 'changeDate',
+					date: this.date
+				});
 			}
 		},
 
@@ -1062,17 +1095,24 @@
 			if (dir) {
 				var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir));
 				if (newViewMode >= this.minView && newViewMode <= this.maxView) {
+					this.element.trigger({
+						type: 'changeMode',
+						date: this.viewDate,
+						oldViewMode: this.viewMode,
+						newViewMode: newViewMode
+					});
+
 					this.viewMode = newViewMode;
 				}
 			}
 			/*
-			  vitalets: fixing bug of very special conditions:
-			  jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover.
-			  Method show() does not set display css correctly and datetimepicker is not shown.
-			  Changed to .css('display', 'block') solve the problem.
-			  See https://github.com/vitalets/x-editable/issues/37
+				vitalets: fixing bug of very special conditions:
+				jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover.
+				Method show() does not set display css correctly and datetimepicker is not shown.
+				Changed to .css('display', 'block') solve the problem.
+				See https://github.com/vitalets/x-editable/issues/37
 
-			  In jquery 1.7.2+ everything works fine.
+				In jquery 1.7.2+ everything works fine.
 			*/
 			//this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
 			this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).css('display', 'block');
@@ -1187,7 +1227,7 @@
 		parseDate: function(date, format, language, type) {
 			if (date instanceof Date) {
 				var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000);
-                dateUTC.setMilliseconds(0);
+								dateUTC.setMilliseconds(0);
 				return dateUTC;
 			}
 			if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) {
@@ -1254,7 +1294,7 @@
 				val, filtered, part;
 			setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
 			setters_map['dd'] = setters_map['d'];
-		    	setters_map['P'] = setters_map['p'];
+					setters_map['P'] = setters_map['p'];
 			date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
 			if (parts.length == format.parts.length) {
 				for (var i=0, cnt = format.parts.length; i < cnt; i++) {
@@ -1278,10 +1318,10 @@
 								});
 								val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
 								break;
-						    case 'p':
-						    case 'P':
-						        val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem);
-						        break;
+								case 'p':
+								case 'P':
+										val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem);
+										break;
 						}
 					}
 					parsed[part] = val;
@@ -1320,9 +1360,9 @@
 					// second
 					s: date.getUTCSeconds()
 				};
-                val.H  = (val.h%12==0? 12 : val.h%12);
-                val.HH = (val.H < 10 ? '0' : '') + val.H;
-                val.P  = val.p.toUpperCase();
+								val.H  = (val.h%12==0? 12 : val.h%12);
+								val.HH = (val.H < 10 ? '0' : '') + val.H;
+								val.P  = val.p.toUpperCase();
 				val.hh = (val.h < 10 ? '0' : '') + val.h;
 				val.ii = (val.i < 10 ? '0' : '') + val.i;
 				val.ss = (val.s < 10 ? '0' : '') + val.s;
diff --git a/src/inputs/datetime/datetime.js b/src/inputs/datetime/datetime.js
index 808dadc..991ba50 100644
--- a/src/inputs/datetime/datetime.js
+++ b/src/inputs/datetime/datetime.js
@@ -67,6 +67,16 @@ $(function(){
         render: function () {
             this.$input.datetimepicker(this.options.datetimepicker);
             
+            //adjust container position when viewMode changes
+            //see https://github.com/smalot/bootstrap-datetimepicker/pull/80
+            this.$input.on('changeMode', function(e) {
+                var f = $(this).closest('form').parent();
+                //timeout here, otherwise container changes position before form has new size
+                setTimeout(function(){
+                    f.triggerHandler('resize');
+                }, 0);
+            });            
+            
             //"clear" link
             if(this.options.clear) {
                 this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){