--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -292,33 +292,30 @@
                 var $name_input = $('input[name="%(project_name)s"]');
                 var $unixname_input = $('input[name="%(project_unixname)s"]');
                 var $url_fragment = $('#url_fragment');
-                var $error_icon = $('#error_icon');
-                var $success_icon = $('#success_icon');
                 var delay = (function(){
-                  var timer = 0;
+                  var timers = {};
                   return function(callback, ms){
-                    clearTimeout (timer);
-                    timer = setTimeout(callback, ms);
+                    clearTimeout (timers[callback]);
+                    timers[callback] = setTimeout(callback, ms);
                   };
                 })();
                 $name_input.focus();
-                var handle_name_taken = function(message){
-                    if(message){
-                        $success_icon.hide();
-                        $error_icon.show();
-                        $name_avail_message.html(message);
-                        $name_avail_message.removeClass('success');
-                        $name_avail_message.addClass('error');
+                var update_icon = function($input) {
+                    var $success_icon = $input.parent().next().find('.success_icon');
+                    var $error_icon = $input.parent().next().find('.error_icon');
+                    var is_error = $input.nextAll('.error').is(':visible');
+                    $success_icon.toggle(!is_error);
+                    $error_icon.toggle(is_error);
+                };
+                if ($name_input.val() != '') update_icon($name_input);
+                if ($unixname_input.val() != '') update_icon($unixname_input);
+                var handle_error = function($input, message) {
+                    var $error_field = $input.nextAll('.error');
+                    if ($error_field.length === 0) {
+                        $error_field = $('<div class="error" style="display: none"></div>').insertAfter($input);
                     }
-                    else{
-                        $error_icon.hide();
-                        $success_icon.show();
-                        $name_avail_message.html('This name is available.');
-                        $name_avail_message.removeClass('error');
-                        $name_avail_message.addClass('success');
-                    }
-                    $('div.error').hide();
-                    $name_avail_message.show();
+                    $error_field.text(message).toggle(!!message);
+                    update_icon($input);
                 };
                 $scms.change(function(){
                     if ( $(this).attr('checked') ) {
@@ -330,22 +327,40 @@
                         });
                     }
                 });
-                $name_input.blur(function(){
-                    if ($unixname_input.val() === "" || $name_avail_message.hasClass('error')) {
-                        $.getJSON('suggest_name',{'project_name':$name_input.val()},function(result){
-                            $unixname_input.val(result.suggested_name);
-                            $url_fragment.html(result.suggested_name);
-                            handle_name_taken(result.message);
-                        });
-                    }
+                var check_names = function() {
+                    var data = {
+                        'project_name':$name_input.val(),
+                        'unix_name': $unixname_input.val()
+                    };
+                    $.getJSON('check_names', data, function(result){
+                        handle_error($name_input, result.name_message);
+                        handle_error($unixname_input, result.unixname_message);
+                    });
+                };
+                var manual = false;
+                $name_input.keyup(function(){
+                    delay(function() {
+                        if (!manual) {
+                            var data = {
+                                'project_name':$name_input.val()
+                            };
+                            $.getJSON('suggest_name', data, function(result){
+                                old_val = result.suggested_name;
+                                $unixname_input.val(result.suggested_name);
+                                $url_fragment.html(result.suggested_name);
+                                check_names();
+                            });
+                        } else {
+                            check_names();
+                        }
+                    }, 500);
+                });
+                $unixname_input.change(function() {
+                    manual = true;
                 });
                 $unixname_input.keyup(function(){
                     $url_fragment.html($unixname_input.val());
-                    delay(function(){
-                        $.getJSON('check_name',{'project_name':$unixname_input.val()},function(result){
-                            handle_name_taken(result.message);
-                        });
-                    }, 500 );
+                    delay(check_names, 500);
                 });
             });
         ''' % dict(project_name=project_name, project_unixname=project_unixname))