diff --git a/public/images/jstoolbar/bt_h1.png b/public/images/jstoolbar/bt_h1.png
new file mode 100644
index 0000000000000000000000000000000000000000..01f3eec0da09b79d6f034e68cfd31179826f7f17
Binary files /dev/null and b/public/images/jstoolbar/bt_h1.png differ
diff --git a/public/images/jstoolbar/bt_h2.png b/public/images/jstoolbar/bt_h2.png
new file mode 100644
index 0000000000000000000000000000000000000000..36b15048e67810f070655de8d1c67fa7d2d3b04a
Binary files /dev/null and b/public/images/jstoolbar/bt_h2.png differ
diff --git a/public/images/jstoolbar/bt_h3.png b/public/images/jstoolbar/bt_h3.png
new file mode 100644
index 0000000000000000000000000000000000000000..029d648e54ebdbaa7c246c76493247dbcfe94c25
Binary files /dev/null and b/public/images/jstoolbar/bt_h3.png differ
diff --git a/public/images/jstoolbar/bt_heading.png b/public/images/jstoolbar/bt_heading.png
deleted file mode 100644
index a143f23a7aa4afb87cf3f96b0533b2e11e5aea2b..0000000000000000000000000000000000000000
Binary files a/public/images/jstoolbar/bt_heading.png and /dev/null differ
diff --git a/public/images/jstoolbar/bt_img.png b/public/images/jstoolbar/bt_img.png
new file mode 100644
index 0000000000000000000000000000000000000000..91c9a8a87caa26e20c36a13412c39b7ba9bda2fc
Binary files /dev/null and b/public/images/jstoolbar/bt_img.png differ
diff --git a/public/images/jstoolbar/bt_pre.png b/public/images/jstoolbar/bt_pre.png
new file mode 100644
index 0000000000000000000000000000000000000000..df3f917d0eebb3d8ddcb46a2eee079aae81b2a20
Binary files /dev/null and b/public/images/jstoolbar/bt_pre.png differ
diff --git a/public/javascripts/jstoolbar.js b/public/javascripts/jstoolbar.js
index fd4611e2dd04888a90dbcc08318f6136d0c53dbd..b94a4ed80b7e0a16bbf73469a0be143de6e217fb 100644
--- a/public/javascripts/jstoolbar.js
+++ b/public/javascripts/jstoolbar.js
@@ -228,6 +228,58 @@ jsToolBar.prototype = {
 		this.encloseSelection(stag,etag);
 	},
 	
+	encloseLineSelection: function(prefix, suffix, fn) {
+		this.textarea.focus();
+		
+		prefix = prefix || '';
+		suffix = suffix || '';
+		
+		var start, end, sel, scrollPos, subst, res;
+		
+		if (typeof(document["selection"]) != "undefined") {
+			sel = document.selection.createRange().text;
+		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
+			start = this.textarea.selectionStart;
+			end = this.textarea.selectionEnd;
+			scrollPos = this.textarea.scrollTop;
+			// go to the start of the line
+			start = this.textarea.value.substring(0, start).replace(/[^\r\n]*$/g,'').length;
+			// go to the end of the line
+            end = this.textarea.value.length - this.textarea.value.substring(end, this.textarea.value.length).replace(/^[^\r\n]*/, '').length;
+			sel = this.textarea.value.substring(start, end);
+		}
+		
+		if (sel.match(/ $/)) { // exclude ending space char, if any
+			sel = sel.substring(0, sel.length - 1);
+			suffix = suffix + " ";
+		}
+		
+		if (typeof(fn) == 'function') {
+			res = (sel) ? fn.call(this,sel) : fn('');
+		} else {
+			res = (sel) ? sel : '';
+		}
+		
+		subst = prefix + res + suffix;
+		
+		if (typeof(document["selection"]) != "undefined") {
+			document.selection.createRange().text = subst;
+			var range = this.textarea.createTextRange();
+			range.collapse(false);
+			range.move('character', -suffix.length);
+			range.select();
+		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
+			this.textarea.value = this.textarea.value.substring(0, start) + subst +
+			this.textarea.value.substring(end);
+			if (sel) {
+				this.textarea.setSelectionRange(start + subst.length, start + subst.length);
+			} else {
+				this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
+			}
+			this.textarea.scrollTop = scrollPos;
+		}
+	},
+	
 	encloseSelection: function(prefix, suffix, fn) {
 		this.textarea.focus();
 		
@@ -370,28 +422,43 @@ jsToolBar.prototype.elements.code = {
 // spacer
 jsToolBar.prototype.elements.space1 = {type: 'space'}
 
-// heading
-jsToolBar.prototype.elements.heading = {
+// headings
+jsToolBar.prototype.elements.h1 = {
 	type: 'button',
-	title: 'Heading',
+	title: 'Heading 1',
 	fn: {
-		wiki: function() {
-			this.encloseSelection('','',function(str) {
-				str = str.replace(/\r/g,'');
-				return 'h2. '+str.replace(/\n/g,"\n* ");
-			});
+		wiki: function() { 
+		  this.encloseLineSelection('h1. ', '',function(str) {
+		    str = str.replace(/^h\d+\.\s+/, '')
+		    return str;
+		  });
+		}
+	}
+}
+jsToolBar.prototype.elements.h2 = {
+	type: 'button',
+	title: 'Heading 2',
+	fn: {
+		wiki: function() { 
+		  this.encloseLineSelection('h2. ', '',function(str) {
+		    str = str.replace(/^h\d+\.\s+/, '')
+		    return str;
+		  });
+		}
+	}
+}
+jsToolBar.prototype.elements.h3 = {
+	type: 'button',
+	title: 'Heading 3',
+	fn: {
+		wiki: function() { 
+		  this.encloseLineSelection('h3. ', '',function(str) {
+		    str = str.replace(/^h\d+\.\s+/, '')
+		    return str;
+		  });
 		}
 	}
 }
-
-// br
-//jsToolBar.prototype.elements.br = {
-//	type: 'button',
-//	title: 'Line break',
-//	fn: {
-//		wiki: function() { this.encloseSelection("%%%\n",'') }
-//	}
-//}
 
 // spacer
 jsToolBar.prototype.elements.space2 = {type: 'space'}
@@ -402,9 +469,9 @@ jsToolBar.prototype.elements.ul = {
 	title: 'Unordered list',
 	fn: {
 		wiki: function() {
-			this.encloseSelection('','',function(str) {
+			this.encloseLineSelection('','',function(str) {
 				str = str.replace(/\r/g,'');
-				return '* '+str.replace(/\n/g,"\n* ");
+				return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
 			});
 		}
 	}
@@ -416,53 +483,39 @@ jsToolBar.prototype.elements.ol = {
 	title: 'Ordered list',
 	fn: {
 		wiki: function() {
-			this.encloseSelection('','',function(str) {
+			this.encloseLineSelection('','',function(str) {
 				str = str.replace(/\r/g,'');
-				return '# '+str.replace(/\n/g,"\n# ");
+				return str.replace(/(\n|^)[*-]?\s*/g,"$1# ");
 			});
 		}
 	}
 }
 
+// pre
+jsToolBar.prototype.elements.pre = {
+	type: 'button',
+	title: 'Preformatted text',
+	fn: {
+		wiki: function() { this.encloseLineSelection('<pre>\n', '\n</pre>') }
+	}
+}
+
 // spacer
 jsToolBar.prototype.elements.space3 = {type: 'space'}
 
-// link
-/*
+// wiki page
 jsToolBar.prototype.elements.link = {
 	type: 'button',
-	title: 'Link',
-	fn: {},
-	href_prompt: 'Please give page URL:',
-	hreflang_prompt: 'Language of this page:',
-	default_hreflang: '',
-	prompt: function(href,hreflang) {
-		href = href || '';
-		hreflang = hreflang || this.elements.link.default_hreflang;
-		
-		href = window.prompt(this.elements.link.href_prompt,href);
-		if (!href) { return false; }
-		
-		hreflang = ""
-		
-		return { href: this.stripBaseURL(href), hreflang: hreflang };
+	title: 'Wiki Page Link',
+	fn: {
+		wiki: function() { this.encloseSelection("[[", "]]") }
 	}
 }
-
-jsToolBar.prototype.elements.link.fn.wiki = function() {
-	var link = this.elements.link.prompt.call(this);
-	if (link) {
-		var stag = '"';
-		var etag = '":'+link.href;
-		this.encloseSelection(stag,etag);
-	}
-};
-*/
-// link or wiki page
-jsToolBar.prototype.elements.link = {
+// image
+jsToolBar.prototype.elements.img = {
 	type: 'button',
-	title: 'Link',
+	title: 'Inline image',
 	fn: {
-		wiki: function() { this.encloseSelection("[[", "]]") }
+		wiki: function() { this.encloseSelection("!", "!") }
 	}
 }
diff --git a/public/stylesheets/jstoolbar.css b/public/stylesheets/jstoolbar.css
index 62976e537fff22928b7966080e4ea8f92aa38892..df5d2a63308bfb80ace307869f4b3dac57d73326 100644
--- a/public/stylesheets/jstoolbar.css
+++ b/public/stylesheets/jstoolbar.css
@@ -67,8 +67,14 @@
 .jstb_br {
 	background-image: url(../images/jstoolbar/bt_br.png);
 }
-.jstb_heading {
-	background-image: url(../images/jstoolbar/bt_heading.png);
+.jstb_h1 {
+	background-image: url(../images/jstoolbar/bt_h1.png);
+}
+.jstb_h2 {
+	background-image: url(../images/jstoolbar/bt_h2.png);
+}
+.jstb_h3 {
+	background-image: url(../images/jstoolbar/bt_h3.png);
 }
 .jstb_ul {
 	background-image: url(../images/jstoolbar/bt_ul.png);
@@ -76,6 +82,12 @@
 .jstb_ol {
 	background-image: url(../images/jstoolbar/bt_ol.png);
 }
+.jstb_pre {
+	background-image: url(../images/jstoolbar/bt_pre.png);
+}
 .jstb_link {
 	background-image: url(../images/jstoolbar/bt_link.png);
 }
+.jstb_img {
+	background-image: url(../images/jstoolbar/bt_img.png);
+}