diff --git a/src/Core/Category.cs b/src/Core/Category.cs
index a7ed123..f450041 100644
--- a/src/Core/Category.cs
+++ b/src/Core/Category.cs
@@ -58,8 +58,8 @@ namespace FSpot
 			children_need_sort = true;
 		}
 	
-		public Category (Category category, uint id, string name)
-			: base (category, id, name)
+		public Category (Category category, uint id, string name, string description)
+			: base (category, id, name, description)
 		{
 			children = new List<Tag> ();
 		}
diff --git a/src/Core/Tag.cs b/src/Core/Tag.cs
index c9be25d..227c96b 100644
--- a/src/Core/Tag.cs
+++ b/src/Core/Tag.cs
@@ -91,6 +91,12 @@ namespace FSpot
 			get { return tag_icon_size; }
 			set { tag_icon_size = value; }
 		}
+
+		string description;
+		public string Description {
+			et { return description; }
+			set { description = value; }
+		}
 	
 		Pixbuf cached_icon;
 		private IconSize cached_icon_size = IconSize.Hidden;
@@ -126,11 +132,12 @@ namespace FSpot
 	
 	
 		// You are not supposed to invoke these constructors outside of the TagStore class.
-		public Tag (Category category, uint id, string name)
+		public Tag (Category category, uint id, string name, string description)
 			: base (id)
 		{
 			Category = category;
 			Name = name;
+			Description = description;
 		}
 	
 	
diff --git a/src/MainWindow.cs b/src/MainWindow.cs
index bca7a18..f419bf4 100644
--- a/src/MainWindow.cs
+++ b/src/MainWindow.cs
@@ -1707,6 +1707,7 @@ namespace FSpot
 						name_changed = true;
 					}
 					tag.Category = dialog.TagCategory;
+					tag.Description = dialog.TagDescription;
 					Database.Tags.Commit (tag, name_changed);
 				} catch (Exception ex) {
 					Log.Exception (ex);
diff --git a/src/TagStore.cs b/src/TagStore.cs
index 3adb4c1..f84d27b 100644
--- a/src/TagStore.cs
+++ b/src/TagStore.cs
@@ -124,18 +124,21 @@ public class TagStore : DbStore<Tag> {
 
 		// Pass 1, get all the tags.
 
-		SqliteDataReader reader = Database.Query ("SELECT id, name, is_category, sort_priority, icon FROM tags");
+		SqliteDataReader reader = Database.Query ("SELECT id, name, is_category, sort_priority, icon, description FROM tags");
 
 		while (reader.Read ()) {
 			uint id = Convert.ToUInt32 (reader ["id"]);
 			string name = reader ["name"].ToString ();
 			bool is_category = (Convert.ToUInt32 (reader ["is_category"]) != 0);
+			string description = null;
+			if (reader ["description"] != null)
+				description = reader ["description"].ToString ();
 
 			Tag tag;
 			if (is_category)
-				tag = new Category (null, id, name);
+				tag = new Category (null, id, name, description);
 			else
-				tag = new Tag (null, id, name);
+				tag = new Tag (null, id, name, description);
 
 			if (reader ["icon"] != null)
 				try {
@@ -194,7 +197,8 @@ public class TagStore : DbStore<Tag> {
 			"	category_id	INTEGER, \n" +
 			"	is_category	BOOLEAN, \n" +
 			"	sort_priority	INTEGER, \n" +
-			"	icon		TEXT\n" +
+			"	icon		TEXT, \n" +
+			"	description	TEXT\n" +
 			")");
 	}
 
@@ -236,8 +240,7 @@ public class TagStore : DbStore<Tag> {
 		: base (database, true)
 	{
 		// The label for the root category is used in new and edit tag dialogs
-		root_category = new Category (null, 0, Catalog.GetString ("(None)"));
-
+		root_category = new Category (null, 0, Catalog.GetString ("(None)"), null);
 		if (! is_new) {
 			LoadAllTags ();
 		} else {
@@ -253,7 +256,7 @@ public class TagStore : DbStore<Tag> {
 		String default_tag_icon_value = autoicon ? null : String.Empty;
 
 		int id = Database.Execute (new DbCommand ("INSERT INTO tags (name, category_id, is_category, sort_priority, icon)"
-                          + "VALUES (:name, :category_id, :is_category, 0, :icon)",
+			+ "VALUES (:name, :category_id, :is_category, 0, :icon)",
 						  "name", name,
 						  "category_id", parent_category_id,
 						  "is_category", is_category ? 1 : 0,
@@ -270,7 +273,7 @@ public class TagStore : DbStore<Tag> {
 
 		uint id = InsertTagIntoTable (category, name, false, autoicon);
 
-		Tag tag = new Tag (category, id, name);
+		Tag tag = new Tag (category, id, name, null);
 		tag.IconWasCleared = !autoicon;
 
 		AddToCache (tag);
@@ -286,7 +289,7 @@ public class TagStore : DbStore<Tag> {
 
 		uint id = InsertTagIntoTable (parent_category, name, true, autoicon);
 
-		Category new_category = new Category (parent_category, id, name);
+		Category new_category = new Category (parent_category, id, name, null);
 		new_category.IconWasCleared = !autoicon;
 
 		AddToCache (new_category);
@@ -355,13 +358,15 @@ public class TagStore : DbStore<Tag> {
 
 		foreach (Tag tag in tags) {
 			Database.ExecuteNonQuery (new DbCommand ("UPDATE tags SET name = :name, category_id = :category_id, "
-                	    + "is_category = :is_category, sort_priority = :sort_priority, icon = :icon WHERE id = :id",
+			+ "is_category = :is_category, sort_priority = :sort_priority, icon = :icon, "
+			+ "description = :description WHERE id = :id",
 							  "name", tag.Name,
 							  "category_id", tag.Category.Id,
 							  "is_category", tag is Category ? 1 : 0,
 							  "sort_priority", tag.SortPriority,
 							  "icon", GetIconString (tag),
-							  "id", tag.Id));
+							  "id", tag.Id,
+							  "description", tag.Description));
 			
 			if (update_xmp && Preferences.Get<bool> (Preferences.METADATA_EMBED_IN_IMAGE)) {
 				Photo [] photos = App.Instance.Database.Photos.Query (new Tag [] { tag });
diff --git a/src/UI.Dialog/EditTagDialog.cs b/src/UI.Dialog/EditTagDialog.cs
index 2f28407..5ef33ce 100644
--- a/src/UI.Dialog/EditTagDialog.cs
+++ b/src/UI.Dialog/EditTagDialog.cs
@@ -29,6 +29,7 @@ namespace FSpot.UI.Dialog
 		[GtkBeans.Builder.Object] Gtk.Image icon_image;
 		[GtkBeans.Builder.Object] Button icon_button;
 		[GtkBeans.Builder.Object] OptionMenu category_option_menu;
+		[GtkBeans.Builder.Object] TextView tag_description_entry;
 
 
 		public EditTagDialog (Db db, Tag t, Gtk.Window parent_window) : base ("EditTagDialog.ui", "edit_tag_dialog")
@@ -39,6 +40,8 @@ namespace FSpot.UI.Dialog
 
 			orig_name = last_valid_name = t.Name;
 			tag_name_entry.Text = t.Name;
+			if (t.Description != null)
+				tag_description_entry.Buffer.Text = t.Description;
 
 			icon_image.Pixbuf = t.Icon;
 			Cms.Profile screen_profile;
@@ -63,6 +66,16 @@ namespace FSpot.UI.Dialog
 			get { return categories [category_option_menu.History] as Category;}
 		}
 
+		public string TagDescription {
+			get {
+				string desc = tag_description_entry.Buffer.Text;
+				if (desc == String.Empty)
+					return null;
+				else
+					return desc;
+			}
+		}
+
 		ArrayList categories;
 
 		void HandleTagNameEntryChanged (object sender, EventArgs args)
diff --git a/src/UI.Dialog/ui/EditTagDialog.ui b/src/UI.Dialog/ui/EditTagDialog.ui
index 5639d0b..9e18381 100644
--- a/src/UI.Dialog/ui/EditTagDialog.ui
+++ b/src/UI.Dialog/ui/EditTagDialog.ui
@@ -123,6 +123,25 @@
           </packing>
         </child>
         <child>
+          <object class="GtkLabel" id="descLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Description:</property>
+          </object>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTextView" id="tag_description_entry">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkAlignment" id="alignment7">
             <property name="visible">True</property>
             <property name="xalign">0</property>
@@ -137,7 +156,7 @@
           </object>
           <packing>
             <property name="fill">False</property>
-            <property name="position">2</property>
+            <property name="position">4</property>
           </packing>
         </child>
         <child internal-child="action_area">
diff --git a/src/Updater.cs b/src/Updater.cs
index bc56161..d7608a9 100644
--- a/src/Updater.cs
+++ b/src/Updater.cs
@@ -587,6 +587,10 @@ namespace FSpot.Database {
 			AddUpdate (new Version (17,1),delegate () {	
 				Execute ("UPDATE tags SET name = 'Imported Tags' WHERE name = 'Import Tags'");
 			});
+
+			AddUpdate (new Version (17,2),delegate () {
+				Execute("ALTER TABLE tags ADD COLUMN description TEXT;");
+			});
 			
 		}
 
