diff --git a/Tomboy/Addins/Makefile.am b/Tomboy/Addins/Makefile.am
index a5f32f9..40b8125 100644
--- a/Tomboy/Addins/Makefile.am
+++ b/Tomboy/Addins/Makefile.am
@@ -12,6 +12,7 @@ SUBDIRS =				\
 	Sketching			\
 	SshSyncService		\
 	StickyNoteImport	\
+	TableOfContent		\
 	Tasque			\
 	NoteDirectoryWatcher			\
 	Underline		\
diff --git a/Tomboy/Addins/TableOfContent/Makefile.am b/Tomboy/Addins/TableOfContent/Makefile.am
new file mode 100644
index 0000000..4fd9d23
--- /dev/null
+++ b/Tomboy/Addins/TableOfContent/Makefile.am
@@ -0,0 +1,40 @@
+include $(top_srcdir)/Makefile.include
+
+CSFLAGS = 		\
+	-debug 		\
+	-define:DEBUG 	\
+	-target:library
+
+ASSEMBLIES = 					\
+	$(LINK_TOMBOY_EXE)			\
+	$(GTKSHARP_LIBS) 				\
+	$(LINK_MONO_ADDINS)			\
+	-r:Mono.Posix
+
+ADDIN_NAME = TableOfContent
+TARGET = $(top_builddir)/bin/addins/$(ADDIN_NAME).dll
+CSFILES = \
+	$(srcdir)/TableOfContentMenuItem.cs		\
+	$(srcdir)/TableOfContentNoteAddin.cs
+RESOURCES = \
+	-resource:$(srcdir)/$(ADDIN_NAME).addin.xml
+
+$(TARGET).mdb: $(TARGET)
+
+$(TARGET): $(CSFILES) $(TOMBOY_EXE_PATH)
+	mkdir -p `dirname $(TARGET)` && $(CSC) -out:$@ $(CSFLAGS) $(ASSEMBLIES) $(CSFILES) $(RESOURCES)
+
+
+addinsdir = $(pkglibdir)/addins
+addins_DATA = 			\
+	$(TARGET)		\
+	$(TARGET).mdb
+
+EXTRA_DIST =            	\
+	$(CSFILES) \
+	$(srcdir)/$(ADDIN_NAME).addin.xml
+
+CLEANFILES =				\
+	$(TARGET).mdb \
+	$(TARGET)
+
diff --git a/Tomboy/Addins/TableOfContent/TableOfContent.addin.xml b/Tomboy/Addins/TableOfContent/TableOfContent.addin.xml
new file mode 100644
index 0000000..9d51a6e
--- /dev/null
+++ b/Tomboy/Addins/TableOfContent/TableOfContent.addin.xml
@@ -0,0 +1,21 @@
+<Addin id="TableOfContentAddin"
+	namespace="Tomboy"
+	name="Table of Content"
+	author="Luc Pionchon"
+	description="This Addin shows in a menu the Table of Content of the current Note. Headers are lines formatted with bold+large or bold+huge. Clicking a menu item jumps to the selected header."
+	category="Tools"
+	defaultEnabled="true"
+	version="0.3">
+
+	<Runtime>
+	<Import assembly="TableOfContent.dll" />
+	</Runtime>
+
+	<Dependencies>
+		<Addin id="Tomboy" version="0.10" />
+	</Dependencies>
+
+	<Extension path="/Tomboy/NoteAddins">
+		<NoteAddin type="Tomboy.TableOfContent.TableOfContentNoteAddin" />
+	</Extension>
+</Addin>
diff --git a/Tomboy/Addins/TableOfContent/TableOfContentMenuItem.cs b/Tomboy/Addins/TableOfContent/TableOfContentMenuItem.cs
new file mode 100644
index 0000000..880acb7
--- /dev/null
+++ b/Tomboy/Addins/TableOfContent/TableOfContentMenuItem.cs
@@ -0,0 +1,69 @@
+//
+//  "Table of content" is a Note addin for Tomboy.
+//     It lists Note's table of contents in a menu.
+//     Headers are bold/large and bold/huge lines.
+//
+//  Copyright (C) 2011 Luc Pionchon <pionchon.luc@gmail.com>
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public License
+//  as published by the Free Software Foundation; either version 2.1
+//  of the License, or (at your option) any later version.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free
+//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+//  02111-1307 USA
+//
+//  Originally based on Tomboy/Addins/Backlinks/*
+
+using System;
+using Gtk;
+using Tomboy;
+
+namespace Tomboy.TableOfContent
+{
+	public class TableOfContentMenuItem : Gtk.ImageMenuItem
+	{
+		Note note;
+		int  header_position;
+
+		public TableOfContentMenuItem (Note   note,
+		                               string header,
+		                               int    header_level,
+		                               int    header_position)
+		                              : base (header)
+		{
+			this.note            = note;
+			this.header_position = header_position;
+
+			//set MenuItem's icon
+			if (header_position == 0) {
+				this.Image = new Gtk.Image (GuiUtils.GetIcon ("note", 16));
+			}
+			else if (header_level == 2) {
+				this.Image = new Gtk.Image (Gtk.Stock.GoForward, Gtk.IconSize.Menu);
+			}
+		}
+
+		protected override void OnActivated ()
+		{
+			if (note == null)
+				return;
+
+			NoteBuffer buffer = note.Buffer; //a GtkTextBuffer subclass
+			Gtk.TextIter header_iter = buffer.GetIterAtOffset (this.header_position);
+			Gtk.TextView editor = note.Window.Editor;
+			editor.ScrollToIter (header_iter, 0.1, true, 0.0, 0.0);
+			//TODO: possibly move the cursor too (?)
+			//TODO: possibly highlight the header (?)
+			//**/Console.WriteLine (this.header_position);
+		}
+
+	}/*class TableOfContentMenuItem*/
+}
diff --git a/Tomboy/Addins/TableOfContent/TableOfContentNoteAddin.cs b/Tomboy/Addins/TableOfContent/TableOfContentNoteAddin.cs
new file mode 100644
index 0000000..39cba03
--- /dev/null
+++ b/Tomboy/Addins/TableOfContent/TableOfContentNoteAddin.cs
@@ -0,0 +1,169 @@
+//
+//  "Table of content" is a Note addin for Tomboy.
+//     It lists Note's table of contents in a menu.
+//     Headers are bold/large and bold/huge lines.
+//
+//  Copyright (C) 2011 Luc Pionchon <pionchon.luc@gmail.com>
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public License
+//  as published by the Free Software Foundation; either version 2.1
+//  of the License, or (at your option) any later version.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free
+//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+//  02111-1307 USA
+//
+//  Originally based on Tomboy/Addins/Backlinks/*
+
+using System;
+using System.Collections.Generic;
+using Mono.Unix;
+using Gtk;
+using Tomboy;
+
+namespace Tomboy.TableOfContent
+{
+	public class TableOfContentNoteAddin : NoteAddin
+	{
+		Gtk.Menu           menu;
+		Gtk.ImageMenuItem  menu_item;
+
+		bool submenu_built;
+
+		public override void Initialize ()
+		{
+			submenu_built = false;
+		}
+
+		public override void Shutdown ()
+		{
+			if (menu      != null)      menu.Hidden    -= OnMenuHidden;
+			if (menu_item != null) menu_item.Activated -= OnMenuItemActivated;
+		}
+
+		public override void OnNoteOpened ()
+		{
+			menu = new Gtk.Menu ();
+			menu.Hidden += OnMenuHidden;
+			menu.ShowAll ();
+
+			menu_item = new Gtk.ImageMenuItem (Catalog.GetString ("Table of content"));
+			menu_item.Image = new Gtk.Image (Gtk.Stock.JumpTo, Gtk.IconSize.Menu);
+			menu_item.Submenu = menu;
+			menu_item.Activated += OnMenuItemActivated;
+			menu_item.Show ();
+
+			AddPluginMenuItem (menu_item); //FIXME: to do once on initialize(). only submenu needs repopulate
+		}
+
+		void OnMenuItemActivated (object sender, EventArgs args)
+		{
+			if (submenu_built == true)
+				return; // submenu already built.  do nothing.
+
+			UpdateMenu ();
+		}
+
+		void OnMenuHidden (object sender, EventArgs args)
+		{
+			// Force the submenu to rebuild next time it's supposed to show
+			submenu_built = false;
+		}
+
+		void UpdateMenu ()
+		{
+			// Clear out the old list
+			foreach (Gtk.MenuItem old_item in menu.Children) {
+				menu.Remove (old_item);
+			}
+
+			// Build a new list
+			foreach (TableOfContentMenuItem item in GetTableOfContentMenuItems ()) {
+				item.ShowAll ();
+				menu.Append (item);
+			}
+
+			// If nothing was found, add an explanatory text
+			if (menu.Children.Length == 0) {
+				Gtk.MenuItem item = new Gtk.MenuItem (Catalog.GetString (
+					"The Table of Content is empty\n\n"               +
+					"When you set headers, they will show here\n\n"   +
+					"Headers are lines formatted in 'bold',\n"        +
+					"whith 'large' or 'huge' font size.\n"));
+				item.Sensitive = false;
+				item.ShowAll ();
+				menu.Append (item);
+			}
+
+			submenu_built = true;
+		}
+
+		TableOfContentMenuItem [] GetTableOfContentMenuItems ()
+		{
+			List<TableOfContentMenuItem> items = new List<TableOfContentMenuItem> ();
+
+			TableOfContentMenuItem item = null;
+
+			string header = null;
+			int    header_level;
+			int    header_position;
+
+			Gtk.TextIter iter = this.Note.Buffer.StartIter;
+			Gtk.TextIter eol;
+			Gtk.TextTag bold  = this.Note.Buffer.TagTable.Lookup ("bold");
+			Gtk.TextTag large = this.Note.Buffer.TagTable.Lookup ("size:large");
+			Gtk.TextTag huge  = this.Note.Buffer.TagTable.Lookup ("size:huge");
+
+			//for each line,
+			//check if the full line has bold and (large or huge) tags
+			header_level = -1;
+			while (iter.IsEnd != true) {
+				eol = iter;
+				eol.ForwardToLineEnd();
+
+				if (hasTagOverRange (bold, iter, eol)) {
+					if (hasTagOverRange (large, iter, eol)) {
+						header_level = 3;
+					}
+					else if (hasTagOverRange (huge, iter, eol)) {
+						header_level = 2;
+					}
+				}
+				if (header_level == 2 || header_level == 3) {
+					header_position = iter.Offset;
+					header = iter.GetText(eol);
+					if (header_level == 3) header = "└→  " + header;
+					if (items.Count == 0) {
+						//It's the first header found,
+						//we also insert an entry linked to the Note's Title:
+						item = new TableOfContentMenuItem (this.Note, this.Note.Title, 2, 0);
+						items.Add (item);
+					}
+					item = new TableOfContentMenuItem (this.Note, header, header_level, header_position);
+					items.Add (item);
+				}
+				//next line
+				header_level = -1;
+				iter.ForwardVisibleLine();
+			}
+			return items.ToArray ();
+		}
+
+		//true if tag is set from start to end
+		static bool hasTagOverRange (Gtk.TextTag tag, Gtk.TextIter start, Gtk.TextIter end){
+			Gtk.TextIter iter = start;
+			bool has = false;
+			while (iter.Compare(end) != 0 && (has = iter.HasTag(tag))){
+				iter.ForwardChar();
+			}
+			return has;
+		}
+	}/*class TableOfContentNoteAddin*/
+}
diff --git a/configure.in b/configure.in
index 82d1c1e..dd01c43 100644
--- a/configure.in
+++ b/configure.in
@@ -353,6 +353,7 @@ Tomboy/Addins/PrintNotes/Makefile
 Tomboy/Addins/Sketching/Makefile
 Tomboy/Addins/SshSyncService/Makefile
 Tomboy/Addins/StickyNoteImport/Makefile
+Tomboy/Addins/TableOfContent/Makefile
 Tomboy/Addins/Tasque/Makefile
 Tomboy/Addins/Underline/Makefile
 Tomboy/Addins/WebDavSyncService/Makefile
