Index: /FCKeditor.Java/branches/2.4/src/main/java/net/fckeditor/tool/XHtmlTagTool.java
===================================================================
--- /FCKeditor.Java/branches/2.4/src/main/java/net/fckeditor/tool/XHtmlTagTool.java	(revision 1678)
+++ /FCKeditor.Java/branches/2.4/src/main/java/net/fckeditor/tool/XHtmlTagTool.java	(revision 1679)
@@ -23,4 +23,6 @@
 import java.util.HashMap;
 import java.util.Map;
+
+import net.fckeditor.handlers.CommandHandler;
 
 /**
@@ -115,3 +117,14 @@
 		return tag.toString();
 	}
+
+	@Override
+	public boolean equals(Object obj) {
+		try {
+			XHtmlTagTool tag = (XHtmlTagTool) obj;
+			return value.equals(tag.value) && name.equals(tag.name)
+					&& attributes.equals(tag.attributes);
+		} catch (ClassCastException e) {
+			return false;
+		}
+	}
 }
Index: /FCKeditor.Java/branches/2.4/src/test/java/net/fckeditor/tool/XHtmlTagToolTest.java
===================================================================
--- /FCKeditor.Java/branches/2.4/src/test/java/net/fckeditor/tool/XHtmlTagToolTest.java	(revision 1678)
+++ /FCKeditor.Java/branches/2.4/src/test/java/net/fckeditor/tool/XHtmlTagToolTest.java	(revision 1679)
@@ -21,5 +21,5 @@
 package net.fckeditor.tool;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import org.junit.Test;
@@ -55,3 +55,49 @@
 	    assertEquals("<test> </test>", tag.toString());
     }
+	
+	@Test
+	public void deepEquals01() throws Exception {
+		XHtmlTagTool expected = new XHtmlTagTool("tag", "some text");
+		XHtmlTagTool actual = new XHtmlTagTool("tag", "some text");
+		assertEquals(expected, actual);
+	}
+	
+	@Test
+	public void deepEquals02() throws Exception {
+		XHtmlTagTool unexpected = new XHtmlTagTool("tag", "");
+		XHtmlTagTool actual = new XHtmlTagTool("tag", XHtmlTagTool.SPACE);
+		assertNotSame(unexpected, actual);
+	}
+	
+	@Test
+	public void deepEquals03() throws Exception {
+		XHtmlTagTool expected = new XHtmlTagTool("tag", "some text");
+		expected.addAttribute("id", "some_tag_id");
+		expected.addAttribute("class", "grayShadow");
+		expected.addAttribute("style", "color: red");
+		
+		XHtmlTagTool actual = new XHtmlTagTool("tag", "some text");
+		
+		actual.addAttribute("style", "color: red");
+		actual.addAttribute("id", "some_tag_id");
+		actual.addAttribute("class", "grayShadow");
+		
+		assertEquals(expected, actual);
+	}
+	
+	@Test
+	public void deepEquals04() throws Exception {
+		XHtmlTagTool unexpected = new XHtmlTagTool("tag");
+		unexpected.addAttribute("id", "some_tag_id");
+		unexpected.addAttribute("class", "grayShadow");
+		unexpected.addAttribute("style", "color: red");
+		
+		XHtmlTagTool actual = new XHtmlTagTool("tag");
+		
+		actual.addAttribute("id", "some_tag_id");
+		actual.addAttribute("class", "grayShadow");
+		actual.addAttribute("style", "color: blue");
+		
+		assertNotSame(unexpected, actual);
+	}
 }
