diff --git a/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java b/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
index 20de05a..70edf65 100644
--- a/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
+++ b/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
@@ -11,6 +11,8 @@
 
 import java.io.Reader;
 import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.dltk.core.IBuffer;
 import org.eclipse.dltk.core.IMember;
@@ -18,17 +20,20 @@
 import org.eclipse.dltk.core.ISourceRange;
 import org.eclipse.dltk.core.ModelException;
 import org.eclipse.dltk.ui.documentation.IScriptDocumentationProvider;
+import org.eclipse.dltk.utils.TextUtils;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.Document;
 
-public class TclCommentDocumentationProvider extends
-		ScriptDocumentationProvider implements IScriptDocumentationProvider {
+public class TclCommentDocumentationProvider implements
+		IScriptDocumentationProvider {
+
+	private static final char COMMENT_SIGN = '#';
 
 	protected String getLine(Document d, int line) throws BadLocationException {
 		return d.get(d.getLineOffset(line), d.getLineLength(line));
 	}
 
-	protected String getHeaderComment(IMember member) {
+	protected List getHeaderComment(IMember member) {
 		// if (member instanceof IField) {
 		// return null;
 		// }
@@ -55,77 +60,100 @@
 				contents = member.getSourceModule().getSource();
 			}
 
-			String result = "";
-
 			Document doc = new Document(contents);
 			try {
 				int line = doc.getLineOfOffset(start);
-				line--;
-				if (line < 0)
-					return null;
-				boolean emptyEnd = true;
-				while (line >= 0) {
-					String curLine = getLine(doc, line);
-					String curLineTrimmed = curLine.trim();
-					if ((curLineTrimmed.length() == 0 && emptyEnd)
-							|| curLineTrimmed.startsWith("#")) {
-						if (curLineTrimmed.length() != 0)
-							emptyEnd = false;
-						result = curLine + result;
-					} else
-						break;
-
-					line--;
+				--line; // look on the previous line
+				if (line >= 0) {
+					final List result = new ArrayList();
+					do {
+						final String curLine = getLine(doc, line).trim();
+						if (curLine.length() > 0
+								&& curLine.charAt(0) == COMMENT_SIGN) {
+							result.add(0, curLine);
+						} else if (!(curLine.length() == 0 && result.isEmpty())) {
+							// skip empty lines between comment and code only
+							break;
+						}
+					} while (--line >= 0);
+					return result;
 				}
 			} catch (BadLocationException e) {
-				return null;
+				// ignore
 			}
 
-			return result;
-
 		} catch (ModelException e) {
+			// ignore
 		}
 		return null;
 	}
 
 	public Reader getInfo(IMember member, boolean lookIntoParents,
 			boolean lookIntoExternal) {
-		String header = getHeaderComment(member);
-		return new StringReader(convertToHTML(header));
+		final List header = getHeaderComment(member);
+		if (header != null && !header.isEmpty()) {
+			return new StringReader(convertToHTML(header));
+		} else {
+			return null;
+		}
 	}
 
-	protected String convertToHTML(String header) {
-		StringBuffer result = new StringBuffer();
-		// result.append("<p>\n");
-		Document d = new Document(header);
-		for (int line = 0;; line++) {
-			try {
-				String str = getLine(d, line).trim();
-				if (str == null)
-					break;
-				while (str.length() > 0 && str.startsWith("#"))
-					str = str.substring(1);
-				while (str.length() > 0 && str.endsWith("#"))
-					str = str.substring(0, str.length() - 1);
-				if (str.length() == 0)
-					result.append("<p>");
-				else {
-					if (str.trim().matches("\\w*:")) {
-						result.append("<h4>");
-						result.append(str);
-						result.append("</h4>");
-					} else
-						result.append(str + "<br>");
-				}
-			} catch (BadLocationException e) {
-				break;
+	protected String convertToHTML(List header) {
+		final StringBuffer result = new StringBuffer();
+		boolean paragraphStarted = false;
+		for (int line = 0; line < header.size(); line++) {
+			String str = (String) header.get(line);
+			int begin = 0;
+			int end = str.length();
+			while (begin < end && str.charAt(begin) == COMMENT_SIGN) {
+				++begin;
 			}
-
+			while (begin < end && Character.isWhitespace(str.charAt(begin))) {
+				++begin;
+			}
+			while (begin < end && str.charAt(end - 1) == COMMENT_SIGN) {
+				--end;
+			}
+			while (begin < end && Character.isWhitespace(str.charAt(end - 1))) {
+				--end;
+			}
+			if (begin == end) {
+				if (paragraphStarted) {
+					result.append(P_END);
+					paragraphStarted = false;
+				}
+			} else {
+				str = str.substring(begin, end);
+				if (str.matches("\\w+(\\s+\\w+)*:")) { //$NON-NLS-1$
+					if (paragraphStarted) {
+						result.append(P_END);
+						paragraphStarted = false;
+					}
+					result.append("<h4>"); //$NON-NLS-1$
+					result.append(TextUtils.escapeHTML(str));
+					result.append("</h4>\n"); //$NON-NLS-1$
+				} else {
+					if (!paragraphStarted) {
+						result.append(P_BEGIN);
+						paragraphStarted = true;
+					} else {
+						result.append(LINE_BREAK);
+					}
+					result.append(TextUtils.escapeHTML(str));
+				}
+			}
 		}
-		// result.append("</p>\n");
+		if (paragraphStarted) {
+			result.append(P_END);
+		}
 		return result.toString();
 	}
 
+	private static final String P_BEGIN = "<p>"; //$NON-NLS-1$
+	private static final String P_END = "</p>"; //$NON-NLS-1$
+
+	private static final String LINE_BREAK = "<br>\n"; //$NON-NLS-1$
+
 	public Reader getInfo(String content) {
 		return null;
 	}
