diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 56e26a06f183dd2eab121e1dad7cde0a23db08ea..25732ae5289b363f541348f5ab936d3c08241720 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -26,7 +26,6 @@ $(document).ready(function(){
     $(this).select();
   });
 
-
   $('body').on('ajax:complete, ajax:beforeSend, submit', 'form', function(e){
     var buttons = $('[type="submit"]', this);
     switch( e.type ){
@@ -70,6 +69,26 @@ $(document).ready(function(){
   $(".supp_diff_link").bind("click", function() {
     showDiff(this);
   });
+
+  /**
+   * Note markdown preview
+   *
+   */
+  $('#preview-link').on('click', function(e) {
+    $('#preview-note').text('Loading...');
+
+    var previewLinkText = ($(this).text() == 'Preview' ? 'Edit' : 'Preview');
+    $(this).text(previewLinkText);
+
+    var note = $('#note_note').val();
+    if (note.trim().length === 0) { note = 'Nothing to preview'; }
+    $.post($(this).attr('href'), {note: note}, function(data) {
+      $('#preview-note').html(data);
+    });
+
+    $('#preview-note, #note_note').toggle();
+    e.preventDefault();
+  });
 });
 
 function focusSearch() {
@@ -108,6 +127,6 @@ function showDiff(link) {
 })(jQuery);
 
 
-function ajaxGet(url) { 
-  $.ajax({type: "GET", url: url, dataType: "script"}); 
+function ajaxGet(url) {
+  $.ajax({type: "GET", url: url, dataType: "script"});
 }
diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb
index e8e4bb544a83d34531acb1a9b1b918e076209997..8fac6428a58b253b0417fbd1338559c86b74bb3e 100644
--- a/app/controllers/notes_controller.rb
+++ b/app/controllers/notes_controller.rb
@@ -33,7 +33,11 @@ class NotesController < ApplicationController
     end
   end
 
-  protected 
+  def preview
+    render :text => view_context.markdown(params[:note])
+  end
+
+  protected
 
   def notes
     @notes = Notes::LoadContext.new(project, current_user, params).execute
diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml
index 43d95564cc07dcf926936a81c9831603a639a237..f5571aede5e38c930fbcdbe9bcd17892f80924a2 100644
--- a/app/views/notes/_form.html.haml
+++ b/app/views/notes/_form.html.haml
@@ -7,10 +7,12 @@
 
   = f.hidden_field :noteable_id
   = f.hidden_field :noteable_type
-  = f.text_area :note,  :size => 255
+  = f.text_area :note, :size => 255
+  #preview-note.well.hide
   %p.hint
     = link_to "Gitlab Markdown", help_markdown_path, :target => '_blank'
     is enabled.
+    = link_to 'Preview', preview_project_notes_path(@project), :id => 'preview-link'
 
   .row.note_advanced_opts.hide
     .span2
diff --git a/config/routes.rb b/config/routes.rb
index 7ece304450d37c9153b1a4b7cd152c1795e669de..04e13bc4a86dbbc9ba11342c8c879bc154858c7b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -203,7 +203,11 @@ Gitlab::Application.routes.draw do
         get   :search
       end
     end
-    resources :notes, :only => [:index, :create, :destroy]
+    resources :notes, :only => [:index, :create, :destroy] do
+      collection do
+        post :preview
+      end
+    end
   end
   root :to => "dashboard#index"
 end