diff --git a/accessibility.admin.inc b/accessibility.admin.inc
index 59656c7..71c8ef5 100644
--- a/accessibility.admin.inc
+++ b/accessibility.admin.inc
@@ -52,7 +52,7 @@ function accessibility_tests_list($form, $form_state) {
       $categories[$tag] = $tag;
     }
   }
-
+  ksort($categories);
   $form['filter']['category'] = array(
     '#type' => 'select',
     '#title' => t('Filter by category'),
diff --git a/accessibility.module b/accessibility.module
index 8871b70..0f80786 100644
--- a/accessibility.module
+++ b/accessibility.module
@@ -49,15 +49,8 @@ function accessibility_load() {
   drupal_add_js($library_path . '/src/quail.js');
   drupal_add_js($module_path . '/js/accessibility.js');
   drupal_add_css($module_path . '/css/accessibility.css');
-  if (module_exists('beautytips')) {
-    $style = variable_get('beautytips_default_style', 'default');
-    beautytips_add_beautytips(array('accessibility' => array('style' => $style)));
-  }
-  else {
-    drupal_add_js($module_path .'/js/popover/accessibility.popover.js');
-    drupal_add_css($module_path .'/js/popover/accessibility.popover.css');
-  }
-  drupal_add_js(array('accessibility' => array('quail_path' => $library_path . '/src/resources')), 'setting');
+  drupal_add_css($module_path .'/js/popover/accessibility.popover.css');
+  drupal_add_js(array('accessibility' => array('icon_path' => drupal_get_path('module', 'accessibility') .'/css/img/', 'quail_path' => $library_path . '/src/resources')), 'setting');
   module_invoke_all('accessibility_load');
 }
 
@@ -226,6 +219,15 @@ function accessibility_menu() {
     'type' => MENU_LOCAL_TASK
   );
   
+  $items['accessibility-test/%accessibility_test/json'] = array(
+    'title callback' => 'accessibility_test_page_title',
+    'title arguments' => array(1),
+    'page callback' => 'accessibility_test_page_view_json',
+    'page arguments' => array(1),
+    'access arguments' => array('view accessibility tests'),
+    'type' => MENU_CALLBACK
+  );
+
   $items['accessibility-test/%accessibility_test'] = array(
     'title callback' => 'accessibility_test_page_title',
     'title arguments' => array(1),
@@ -268,6 +270,7 @@ function accessibility_menu() {
     'page callback' => 'accessibility_tests_json',
     'access arguments' => array('view accessibility tests'),
     'file' => 'accessibility.pages.inc',
+    'type' => MENU_CALLBACK
   );
   
   return $items;
@@ -574,6 +577,25 @@ function accessibility_test_page_view($test, $view_mode = 'full') {
 }
 
 /**
+ * JSON render callback for accessibility test entities.
+ */
+function accessibility_test_page_view_json($test, $view_mode = 'full') {
+  $test->content = array();
+
+  // Build fields content.
+  field_attach_prepare_view('accessibility_test', array($test->test_id => $test), $view_mode);
+  entity_prepare_view('accessibility_test', array($test->test_id => $test));
+  $test->content += field_attach_view('accessibility_test', $test, $view_mode);
+  $test->content['#prefix'] = '<div class="accessibility-test">';
+  $test->content['#suffix'] = '</div>';
+  $json = array('content' => drupal_render($test->content),
+                'title'   => $test->name
+                );
+  drupal_json_output($json);
+}
+
+
+/**
  * Implements hook_field_extra_fields().
  */
 function accessibility_field_extra_fields() {
diff --git a/css/accessibility.css b/css/accessibility.css
index 9c40a2d..7ad89e0 100644
--- a/css/accessibility.css
+++ b/css/accessibility.css
@@ -45,4 +45,41 @@
 
 .accessibility-result img {
   padding: 3px;
+}
+
+.accessibility-icon img {
+  width: 23px;
+  height: 23px;
+  margin-right: -23px;
+  display: inline-block;
+  z-index: 1000;
+  position: absolute;
+}
+
+#accessibility-console {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  height: 190px;
+  width: 100%;
+  background: white;
+  box-shadow: inset 0px 4px 8px 0px rgba(99, 99, 99, .2);
+  border-top: 1px inset #737C70;
+  padding: 15px 10px;
+  z-index: 1001;
+}
+
+#accessibility-console .close-console {
+  position: absolute;
+  right: 40px;
+  top: 0px;
+  color: #595959;
+  font-weight: bold;
+  text-decoration: none;
+  display: block;
+  font-size: 2em;
+}
+
+#accessibility-console .accessibility-console-content {
+  overflow: scroll;
 }
\ No newline at end of file
diff --git a/css/img/moderate.png b/css/img/moderate.png
new file mode 100644
index 0000000..ec04711
Binary files /dev/null and b/css/img/moderate.png differ
diff --git a/css/img/severe.png b/css/img/severe.png
new file mode 100644
index 0000000..8dd5e75
Binary files /dev/null and b/css/img/severe.png differ
diff --git a/css/img/suggestion.png b/css/img/suggestion.png
new file mode 100644
index 0000000..90f333f
Binary files /dev/null and b/css/img/suggestion.png differ
diff --git a/js/accessibility.js b/js/accessibility.js
index 86c14df..81f4848 100644
--- a/js/accessibility.js
+++ b/js/accessibility.js
@@ -4,8 +4,6 @@
 
     settings : false,
 
-    messages : { },
-
     loadSettings : function(callback) {
       if (typeof this.settings === 'object') {
         callback(this.settings);
@@ -19,6 +17,9 @@
     },
 
     checkElement : function(element, testFailed, complete) {
+      if(typeof testFailed !== 'object') {
+        testFailed = this.highlightElement;
+      }
       if (typeof this.settings !== 'object') {
         var that = this;
         that.loadSettings(function() {
@@ -35,28 +36,108 @@
       }
     },
 
-    attachHint : function(event, context) {
-      var that = this;
+    highlightElement : function(event) {
+      var that = Drupal.accessibility;
+      if (!event.element.hasClass('accessibility-result')) {
+        event.element.addClass('accessibility-result')
+             .addClass(event.severity);
+        var $image = $('<img>')
+                     .attr('alt', Drupal.t('@severity error', { '@severity' : Drupal.t(event.severity) } ))
+                     .attr('src', Drupal.settings.basePath + Drupal.settings.accessibility.icon_path + event.severity + '.png');
+        var $link = $('<a>')
+                    .attr('href', '#a')
+                    .addClass('accessibility-icon')
+                    .addClass(event.severity)
+                    .append($image);
+        event.element.before($link);
+        Drupal.accessibility.attachHint(event);
+      }
       var test = that.settings.tests[event.testName].testId;
-      if (!that.messages[test]) {
-        $.get(Drupal.settings.basePath + 'accessibility-test/' + test, function(data) {
-          that.messages[test] = { message : $(data).find('#content .content').first().html(),
-                                  title : $(data).find('h1.title').first().html() };
-          that.addHint(event, that.messages[test], test, context);
+      if (typeof that.errorConsole.messages[test] == 'undefined') {
+        $.getJSON(Drupal.settings.basePath + 'accessibility-test/' + test + '/json', function(data) {
+          that.errorConsole.messages[test] = data;
         });
       }
-      else {
-        that.addHint(event, that.messages[test], test, context);
-      }
+      var elementTests = event.element.data('accessibility-tests') || { };
+      elementTests[that.settings.tests[event.testName].testId] = that.settings.tests[event.testName].testId;
+      event.element.add(event.element.prev($('accessibility-icon'))).data('accessibility-tests', elementTests);
+        
+    },
+
+    attachHint : function(event, context) {
+      var that = this;
+
+      event.element.add(event.element.prev($('.accessibility-icon')))
+                   .click(function(event) {
+                     var tests = $(this).data('accessibility-tests');
+                     that.errorConsole.showTests(tests);
+                     $('html, body').animate({
+                       scrollTop: $(this).offset().top
+                     }, 10);
+                     event.preventDefault();
+                   });
+    },
+
+    cleanUpHighlight : function() {
+      $('.accessibility-result').each(function() {
+        $(this).removeClass('accessibility-result')
+               .removeClass('severe')
+               .removeClass('moderate')
+               .removeClass('suggestion');
+      });
+      $('.accessibility-icon').remove();
     },
 
-    addHint : function(event, message, id, context) {      
-      event.element.accessibilityPopover({
-          title    : message.title,
-          content  : message.message,
-          trigger  : 'click',
-          context  : context
+    errorConsole : {
+
+      messages : { },
+
+      $console : false,
+
+      init : function() {
+        if($('#accessibility-console').length) {
+          return;
+        }
+        var that = this;
+        $('body').append('<div id="accessibility-console" class="element-invisible">');
+        this.$console = $('#accessibility-console');
+        this.$console.append('<div class="accessibility-console-content">');
+        var $close = this.$console.append('<a class="close-console" href="#close" title="' +
+                      Drupal.t('close accessibility console') +
+                      '">&times;</a>');
+        $close.click(function() {
+          that.hide()
+          return false;
         });
+      },
+
+      show : function() {
+        this.init();
+        this.$console.removeClass('element-invisible');
+        $('body').trigger('accessibility-console-show');
+      },
+
+      hide : function() {
+        this.init();
+        this.$console.addClass('element-invisible');
+        $('body').trigger('accessibility-console-hide');
+      },
+
+      addTest : function(test) {
+        this.$console.append('<h3>' + this.messages[test].title + '</h3>');
+      },
+
+      showTests : function(tests) {
+        var that = this;
+        that.init();
+        var $content = that.$console.find('.accessibility-console-content');
+        $content.html('');
+        $.each(tests, function(index, test) {
+          $content.append('<h3>' + that.messages[test].title + '</h3>');
+          $content.append(that.messages[test].content);
+        });
+        that.show();
+      }
     }
 
   };
diff --git a/js/popover/accessibility.popover.css b/js/popover/accessibility.popover.css
deleted file mode 100644
index 65da779..0000000
--- a/js/popover/accessibility.popover.css
+++ /dev/null
@@ -1,103 +0,0 @@
-.accessibility-popover-wrap {
-	display: none;
-	position: absolute;
-}
-
-.accessibility-popover {
-	z-index: 1000;
-	width: 250px;
-	padding: 10px;
-	background: #f1f1f1;
-	position: relative;
-	border: 1px solid #999;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	border-radius: 5px;
-	-webkit-box-shadow: 0 1px 3px #aaa;
-	-moz-box-shadow: 0 1px 3px #aaa;
-	box-shadow: 0 1px 3px #aaa;
-}
-
-.accessibility-popover:before {
-	position: absolute;
-	content: '';
-	top: -14px;
-	left: 120px;
-	height: 14px;
-	width: 32px;
-	background: url('arrow.png') no-repeat 0 0;
-}
-
-.accessibility-popover h3.accessibility-popover-title {
-	text-align: center;
-	color: #333;
-	font-weight: bold;
-	margin: 0 0 4px;
-}
-
-.accessibility-popover .accessibility-popover-content {
-	margin: 0 0 10px;
-}
-
-.accessibility-popover ul {
-	width: 100%;
-	margin: 0;
-}
-
-.accessibility-popover li {
-	list-style: none;
-	margin: 0 000 1px;
-}
-
-.accessibility-popover li a {
-	display: block;
-	line-height: 1.5em;
-	padding: 0 10px;
-	background: #ccc;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	text-decoration: none;
-	color: #000;
-	text-shadow: 0 1px 1px #fff;
-}
-
-.accessibility-popover li a:hover {
-	background: #cce4e7;
-}
-
-.accessibility-popover a.close {
-	font-size: 22px;
-	line-height: .5;
-	position: absolute;
-	bottom: 10px;
-	left: 10px;
-	color: #aaa;
-	text-shadow: 0 -1px 1px rbga(0,0,0,.6);
-	font-weight: bold;
-	cursor: pointer;
-	text-decoration: none !important;
-	-webkit-transition: all .15s ease;
-	-moz-transition: all .15s ease;
-	transition: all .15s ease;
-}
-
-.accessibility-popover a.close:hover {
-	color: #666;
-}
-
-.accessibility-popover a.close:active {
-	bottom: 9px;
-	color: #333;
-}
-
-#accessibility-popover-bg {
-	position: fixed;
-	background: #000;
-	height: 100%;
-	width: 100%;
-	z-index: 999;
-	display: none;
-	top: 0;
-	left: 0;
-}
\ No newline at end of file
diff --git a/js/popover/accessibility.popover.js b/js/popover/accessibility.popover.js
deleted file mode 100644
index 36ed16b..0000000
--- a/js/popover/accessibility.popover.js
+++ /dev/null
@@ -1,133 +0,0 @@
-;(function($) {
-	var count = 0; 
-	
-	$.accessibilityPopover = function(element, options) {
-		var $element = $(element), plugin = this;
-		var $all, $wrap, bg, $bg,
-				activeClass, closeSpeed;
-		
-		var defaults = {
-			remove : false, // If true, we remove the popover
-			trigger: 'click', // what event should trigger the popover; http://api.jquery.com/bind/#bind1
-			closeHTML: '&#215;', // the text that gets displayed                
-			appearUnder: element, // accepts any jQuery selector              
-			escape: true, // enable using the escape button to close the popover
-			clickOff: true, // enables closing the popover by clicking anywhere but the popover itself
-			maskOpacity: 0, // the opacity of the background mask
-			animationSpeed: 370, // the speed of the animation
-			title: $element.text(), // the title of the popover
-			content: '',              
-		};
-		
-		plugin.settings = {};
-				
-		plugin.init = function() {
-			plugin.settings = $.extend({}, defaults, options);
-			
-			if (plugin.settings.remove) {
-				$element.unbind(plugin.settings.trigger, plugin.bindTrigger);
-				$('.accessibility-popover-wrap').remove();
-				return;
-			}
-
-			bg = '#accessibility-popover-bg'; $bg = $(bg);
-			activeClass = 'accessibility-popover-active';
-			closeSpeed = plugin.settings.animationSpeed / 2.5;
-			
-			buildHTML();
-			
-			var close = '.accessibility-popover-wrap a.close';
-			close += (plugin.settings.clickOff) ? ', ' + bg : '';
-			
-			$element.bind(plugin.settings.trigger, plugin.bindTrigger);
-			
-			if (plugin.settings.escape) {
-				$('body').keyup(function(e) {
-					if (e.which === 27) {
-						var speed = (e.shiftKey) ? closeSpeed * 7 : closeSpeed;
-						plugin.hidePopover(speed);
-					}
-				});
-			}
-
-			$(close).click(function(e) {
-				var speed = (e.shiftKey) ? closeSpeed * 7 : closeSpeed;
-				plugin.hidePopover(speed);
-				e.preventDefault();
-			});
-		};
-		
-		plugin.destroy = function() {
-			
-		};
-		
-		plugin.showPopover = function(speed) {
-			speed = typeof(speed) != 'undefined' ? speed : plugin.settings.animationSpeed;
-			
-			plugin.hidePopover();
-			
-			$bg.css('opacity', plugin.settings.maskOpacity).show();
-			$element.addClass(activeClass);
-			
-			var $under = $(plugin.settings.appearUnder);
-			var pos = $under.offset();
-			var width = $under.width();
-			var height = $under.height();
-			var pop = $wrap.width();
-			var context = { left : 0, top: 0 };
-			if(typeof plugin.settings.context !== 'undefined') {
-				context = plugin.settings.context.offset();
-			}
-
-			$wrap.css({
-				left: (pos.left + (width / 2) - (pop / 2)) + context.left + 'px', 
-				top: (pos.top + height + 14) + context.top + 'px' 
-			}).fadeIn(speed);
-		};
-		
-		plugin.hidePopover = function(speed) {
-			speed = typeof(speed) != 'undefined' ? speed : closeSpeed;
-			$bg.hide();
-			$('.' + activeClass).removeClass(activeClass);
-			$all.fadeOut(speed);
-		};
-		
-		var buildHTML = function() {
-			if (!$bg.length) $('body').append('<div id="accessibility-popover-bg" />');
-			$bg = $(bg);
-			var markup  = '<div class="accessibility-popover-wrap"><div class="accessibility-popover">';
-					markup += '<h3 class="accessibility-popover-title">' + plugin.settings.title + '</h3>';
-					markup += '<div class="accessibility-popover-content" />';
-					markup += '<a href="#" class="close">' + plugin.settings.closeHTML + '</a>';
-					markup += '<br class="clear" /></div></div>';
-			$('body').append(markup);
-			
-			$all = $('.accessibility-popover-wrap');
-			$wrap = $($all[count]);
-			
-			$wrap.find('.accessibility-popover-content').html(plugin.settings.content);
-		};
-
-		plugin.bindTrigger = function(e) {
-			plugin.showPopover();
-			e.preventDefault();
-		};
-		
-		plugin.init();
-	};
-	
-	$.fn.accessibilityPopover = function(options) {
-		return this.each(function() {
-			if (!$(this).data('accessibility-popover')) {
-				var plugin = new $.accessibilityPopover(this, options);
-				$(this).data('accessibility-popover', plugin);
-				count++;
-			}
-			if(options.remove) {
-				$(this).data('accessibility-popover', false);
-				var plugin = new $.accessibilityPopover(this, options);
-				count--;
-			}
-		});
-	};
-})(jQuery);
\ No newline at end of file
diff --git a/js/popover/arrow.png b/js/popover/arrow.png
deleted file mode 100644
index d4a02e9..0000000
Binary files a/js/popover/arrow.png and /dev/null differ
diff --git a/modules/accessibility_content/css/accessibility_content.css b/modules/accessibility_content/css/accessibility_content.css
index 0c78d94..badb60d 100644
--- a/modules/accessibility_content/css/accessibility_content.css
+++ b/modules/accessibility_content/css/accessibility_content.css
@@ -3,7 +3,7 @@
   bottom: 0px;
   left: 20px;
   font-size: 14px;
-  background: #3A5D67;
+  background: #737C70;
   padding: 10px;
   border-radius: 5px 5px 0 0;
 }
diff --git a/modules/accessibility_content/js/accessibility_content.js b/modules/accessibility_content/js/accessibility_content.js
index 873cda1..824f015 100644
--- a/modules/accessibility_content/js/accessibility_content.js
+++ b/modules/accessibility_content/js/accessibility_content.js
@@ -79,7 +79,8 @@
         if ($('body').hasClass('accessibility-checked')) {
           $(this).html(Drupal.settings.accessibility_content.toggle.off_message);
           $('body').removeClass('accessibility-checked');
-          that.removeChecks();
+          Drupal.accessibility.cleanUpHighlight();
+          Drupal.accessibility.errorConsole.hide();
         }
         else {
           $(this).html(Drupal.settings.accessibility_content.toggle.on_message);
@@ -90,21 +91,12 @@
       if (Drupal.settings.accessibility_content.show_default) {
         $('#accessibility-content-toggle a').click();
       }
-    },
-    
-    removeChecks : function() {
-      var that = this;
-      $('.accessibility-result').each(function() {
-        $(this).removeClass('accessibility-result')
-               .removeClass('severe')
-               .removeClass('moderate')
-               .removeClass('suggestion');
-        if (typeof $.fn.accessibilityPopover !== 'undefined') {
-          $(this).accessibilityPopover({ remove : true });
-        }
-        else {
-          $(this).unwrap();
-        }
+      $('body').bind('accessibility-console-show', function() {
+        var height = $('#accessibility-console').outerHeight();
+        $('#accessibility-content-toggle').css('bottom', height + 'px');
+      });
+      $('body').bind('accessibility-console-hide', function() {
+        $('#accessibility-content-toggle').css('bottom', '0px');
       });
     },
     
@@ -114,17 +106,7 @@
         return;
       }
       $('body').addClass('accessibility-checked');
-      Drupal.accessibility.checkElement($('.ac-check-field'), this.testFailed);
-    },
-
-    testFailed : function(event) {
-      var that = this;
-      if (!event.element.hasClass('accessibility-result')) {
-        event.element.addClass('accessibility-result')
-             .addClass(event.severity);
-        
-        Drupal.accessibility.attachHint(event);
-      }
+      Drupal.accessibility.checkElement($('.ac-check-field'));
     }
   };
 })(jQuery);
