PMC approved fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=260931.
diff --git a/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/AllTests.java b/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/AllTests.java
index a814f3e..8a29bb4 100644
--- a/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/AllTests.java
+++ b/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/AllTests.java
@@ -12,6 +12,7 @@
 package org.eclipse.jst.jsf.designtime.tests;
 
 import org.eclipse.jst.jsf.designtime.tests.views.TestJSPViewDefnAdapter;
+import org.eclipse.jst.jsf.designtime.tests.views.persistence.TestSerializableTLDTagElement;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -74,7 +75,7 @@
         suite.addTestSuite(TestStartupHandler.class);
         suite.addTestSuite(TestDesignTimeApplicationManager.class);
         suite.addTestSuite(TestJSPViewDefnAdapter.class);
-
+        suite.addTestSuite(TestSerializableTLDTagElement.class);
         //addTestSuite(suite, JSPViewSuite.class);
 
         // $JUnit-END$
diff --git a/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/views/persistence/TestSerializableTLDTagElement.java b/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/views/persistence/TestSerializableTLDTagElement.java
new file mode 100644
index 0000000..120d517
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.designtime.tests/src/org/eclipse/jst/jsf/designtime/tests/views/persistence/TestSerializableTLDTagElement.java
@@ -0,0 +1,110 @@
+package org.eclipse.jst.jsf.designtime.tests.views.persistence;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Map;
+import java.util.zip.ZipFile;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.jsf.core.tests.TestsPlugin;
+import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.CMNodeNamedMapAdapter;
+import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDTagElement;
+import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.NullAttributeAdvisor;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
+import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
+import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class TestSerializableTLDTagElement extends TestCase
+{
+
+    private WebProjectTestEnvironment _webProject;
+    private TLDElementDeclaration _sampleTldElementDeclaration;
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        final ZipFile zipFile = JSFTestUtil.createZipFile(TestsPlugin
+                .getDefault().getBundle(), "/testfiles/testzips/TLDTests.zip");
+
+        _webProject = new WebProjectTestEnvironment(this,
+                JavaFacetUtils.JAVA_50, ProjectFacetsManager.getProjectFacet(
+                        "jst.web").getVersion("2.4"));
+        _webProject.createFromZip(zipFile, true);
+        assertNotNull(_webProject);
+
+        _sampleTldElementDeclaration = findElementDeclaration(_webProject
+                .getTestProject(), "uri-supplied", "useBean");
+        assertNotNull(_sampleTldElementDeclaration);
+    }
+
+    // regression for: https://bugs.eclipse.org/bugs/show_bug.cgi?id=260931
+    public void testSerialization() throws Exception
+    {
+         final TLDTagElement tldTagElement = new TLDTagElement(_sampleTldElementDeclaration, new NullAttributeAdvisor());
+         verifyUseBean(tldTagElement);
+         ByteArrayOutputStream  out = new ByteArrayOutputStream();
+         ObjectOutputStream outStream = new ObjectOutputStream(out);
+         outStream.writeObject(tldTagElement);
+         ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+         ObjectInputStream inStream = new ObjectInputStream(in);
+         Object readObject = inStream.readObject();
+         assertNotNull(readObject);
+         assertTrue(readObject instanceof TLDTagElement);
+         verifyUseBean((TLDTagElement) readObject);
+         // from the bug: CMNodeNamedMapAdapter should never get serialized as the attribute handler map.
+         assertFalse(((TLDTagElement)readObject).getAttributeHandlers() instanceof CMNodeNamedMapAdapter);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void verifyUseBean(final TLDTagElement tldTagElement)
+    {
+        assertEquals("useBean", tldTagElement.getName());
+        assertEquals("uri-supplied", tldTagElement.getUri());
+        assertEquals("sample.http.taglib.UseBeanTag", tldTagElement.getTagHandlerClassName());
+        Map attributeHandlers = tldTagElement.getAttributeHandlers();
+        assertTrue(attributeHandlers.containsKey("id"));
+        assertTrue(attributeHandlers.containsKey("cls"));
+        assertTrue(attributeHandlers.containsKey("type"));
+        assertTrue(attributeHandlers.containsKey("request"));
+        assertTrue(attributeHandlers.containsKey("scope"));
+        assertEquals(5, attributeHandlers.size());
+    }
+    
+    private static TLDElementDeclaration findElementDeclaration(
+            final IProject project, final String shortName, final String name)
+    {
+        final ITaglibRecord tagRecord = findTagRecord(project, shortName);
+        assertNotNull(tagRecord);
+        final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
+        final TLDDocument doc = (TLDDocument) factory
+                .createCMDocument(tagRecord);
+        assertNotNull(doc);
+        return (TLDElementDeclaration) doc.getElements().getNamedItem(name);
+    }
+
+    private static ITaglibRecord findTagRecord(final IProject project,
+            final String shortName)
+    {
+        for (final ITaglibRecord record : TaglibIndex
+                .getAvailableTaglibRecords(project.getFullPath()))
+        {
+            if (shortName.equals(record.getDescriptor().getShortName()))
+            {
+                return record;
+            }
+        }
+        return null;
+    }
+
+}