diff --git a/core/ajax/share.php b/core/ajax/share.php
index ca1951ec9ae9afabb152d2acf04f8f4211cb4694..3f04e1e4ad14691830b8f6d06ef6c7191aaa36b9 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -80,6 +80,14 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
 			break;
 		case 'setExpirationDate':
 			if (isset($_POST['date'])) {
+				$l = OC_L10N::get('core');
+				$date = new \DateTime($_POST['date']);
+				$today = new \DateTime('now');
+
+				if ($date < $today) {
+					OC_JSON::error(array('data' => array('message' => $l->t('Expiration date is in the past.'))));
+					return;
+				}
 				$return = OCP\Share::setExpirationDate($_POST['itemType'], $_POST['itemSource'], $_POST['date']);
 				($return) ? OC_JSON::success() : OC_JSON::error();
 			}
diff --git a/core/js/share.js b/core/js/share.js
index 129e50b22d5b5627b3dddf68a12d0cd1c13ccb93..9ee50ff6963473b11e6d1683dd340565f76d2cfc 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -718,9 +718,21 @@ $(document).ready(function() {
 	$(document).on('change', '#dropdown #expirationDate', function() {
 		var itemType = $('#dropdown').data('item-type');
 		var itemSource = $('#dropdown').data('item-source');
+
+		$(this).tipsy('hide');
+		$(this).removeClass('error');
+
 		$.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'setExpirationDate', itemType: itemType, itemSource: itemSource, date: $(this).val() }, function(result) {
 			if (!result || result.status !== 'success') {
-				OC.dialogs.alert(t('core', 'Error setting expiration date'), t('core', 'Error'));
+				var expirationDateField = $('#dropdown #expirationDate');
+				if (!result.data.message) {
+					expirationDateField.attr('original-title', t('core', 'Error setting expiration date'));
+				} else {
+					expirationDateField.attr('original-title', result.data.message);
+				}
+				expirationDateField.tipsy({gravity: 'n', fade: true});
+				expirationDateField.tipsy('show');
+				expirationDateField.addClass('error');
 			}
 		});
 	});