diff --git a/tests/test_invite.py b/tests/test_invite.py
index dee382d03988b7046a8ada3a8ac224d846957f38..0408ca6d9cf0c192a47166234a30ab7cb65ce705 100644
--- a/tests/test_invite.py
+++ b/tests/test_invite.py
@@ -367,7 +367,7 @@ class TestInviteAdminViews(UffdTestCase):
 		r = self.client.get(path=url_for('invite.new'), follow_redirects=True)
 		dump('invite_new', r)
 		self.assertEqual(r.status_code, 200)
-		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat()
+		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat(timespec='minutes')
 		self.assertListEqual(Invite.query.all(), [])
 		r = self.client.post(path=url_for('invite.new_submit'),
 			data={'single-use': '1', 'valid-until': valid_until,
@@ -387,7 +387,7 @@ class TestInviteAdminViews(UffdTestCase):
 		db.session.add(role)
 		db.session.commit()
 		role_id = role.id
-		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat()
+		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat(timespec='minutes')
 		r = self.client.post(path=url_for('invite.new_submit'),
 			data={'single-use': '1', 'valid-until': valid_until,
 			      'allow-signup': '1', 'role-%d'%role_id: '1'}, follow_redirects=True)
@@ -397,7 +397,7 @@ class TestInviteAdminViews(UffdTestCase):
 	def test_new_empty(self):
 		current_app.config['ACL_SIGNUP_GROUP'] = 'uffd_access'
 		self.login_as('user')
-		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat()
+		valid_until = (datetime.datetime.now() + datetime.timedelta(seconds=60)).isoformat(timespec='minutes')
 		r = self.client.post(path=url_for('invite.new_submit'),
 			data={'single-use': '1', 'valid-until': valid_until,
 			      'allow-signup': '0'}, follow_redirects=True)
diff --git a/uffd/invite/templates/invite/new.html b/uffd/invite/templates/invite/new.html
index 5c69f52e59b6414ad3ff06669b48d7877e98c4b7..0e734a7599231c6700096b14c69e5ad5f6316135 100644
--- a/uffd/invite/templates/invite/new.html
+++ b/uffd/invite/templates/invite/new.html
@@ -5,21 +5,21 @@
 	<div class="form-group">
 		<label for="single-use">{{_('Link Type')}}</label>
 		<select class="form-control" id="single-use" name="single-use">
-			<option value="1">{{_('Valid for a single successful use')}}</option>
-			<option value="0">{{_('Multi-use')}}</option>
+			<option value="1" {{ 'selected' if request.values.get('single-use', '1') == '1' }}>{{_('Valid for a single successful use')}}</option>
+			<option value="0" {{ 'selected' if request.values.get('single-use', '1') == '0' }}>{{_('Multi-use')}}</option>
 		</select>
 	</div>
 	<div class="form-group">
 		<label for="valid-until">{{_('Valid Until')}}</label>
-		<input class="form-control" type="datetime-local" id="valid-until" name="valid-until" value="{{ (datetime.now() + timedelta(hours=36)).replace(hour=23, minute=59, second=59, microsecond=0).isoformat(timespec='minutes') }}">
+		<input class="form-control" type="datetime-local" id="valid-until" name="valid-until" value="{{ request.values.get('valid-until') or (datetime.now() + timedelta(hours=36)).replace(hour=23, minute=59).isoformat(timespec='minutes') }}" min="{{ datetime.now().isoformat(timespec='minutes') }}" max="{{ (datetime.now() + timedelta(days=config['INVITE_MAX_VALID_DAYS'])).isoformat(timespec='minutes') }}">
 		<small class="text-muted">{{_('Must be within the next %(max_valid_days)d days', max_valid_days=config['INVITE_MAX_VALID_DAYS'])}}</small>
 	</div>
 	{% if allow_signup %}
 	<div class="form-group">
 		<label for="allow-signup">{{_('Account Registration')}}</label>
 		<select class="form-control" id="allow-signup" name="allow-signup">
-			<option value="1">{{_('Link allows account registration')}}</option>
-			<option value="0">{{_('No account registration allowed')}}</option>
+			<option value="1" {{ 'selected' if request.values.get('allow-signup', '1') == '1' }}>{{_('Link allows account registration')}}</option>
+			<option value="0" {{ 'selected' if request.values.get('allow-signup', '1') == '0' }}>{{_('No account registration allowed')}}</option>
 		</select>
 	</div>
 	{% else %}
diff --git a/uffd/invite/views.py b/uffd/invite/views.py
index ef406294860dd60dce69f535055982a84acc88e2..820d4ff938615cac09a9649c317aab3a3b7bb21b 100644
--- a/uffd/invite/views.py
+++ b/uffd/invite/views.py
@@ -73,13 +73,13 @@ def new_submit():
 			invite.roles.append(Role.query.get(key[5:]))
 	if invite.valid_until > datetime.datetime.now() + datetime.timedelta(days=current_app.config['INVITE_MAX_VALID_DAYS']):
 		flash(_('The "Expires After" date is too far in the future'))
-		return redirect(url_for('invite.new'))
+		return new()
 	if not invite.permitted:
 		flash(_('You are not allowed to create invite links with these permissions'))
-		return redirect(url_for('invite.new'))
+		return new()
 	if not invite.allow_signup and not invite.roles:
 		flash(_('Invite link must either allow signup or grant at least one role'))
-		return redirect(url_for('invite.new'))
+		return new()
 	db.session.add(invite)
 	db.session.commit()
 	return redirect(url_for('invite.index'))