Index: core/src/org/apache/pivot/beans/BeanAdapter.java
===================================================================
--- core/src/org/apache/pivot/beans/BeanAdapter.java	(revision 952628)
+++ core/src/org/apache/pivot/beans/BeanAdapter.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.apache.pivot.beans;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -847,4 +848,28 @@
 
         return (T)coercedValue;
     }
+
+    /**
+     * Walks up the class hierarchy from a given type to locate an annotation.
+     *
+     * @param type
+     * @param annotationClass
+     *
+     * @return
+     * The annotation, if found; <tt>null</tt>, otherwise.
+     */
+    public static <A extends Annotation> A findAnnotation(Class<?> type, Class<A> annotationClass) {
+        A annotation = null;
+
+        while (annotation == null
+            && type != Object.class) {
+            annotation= type.getAnnotation(annotationClass);
+
+            if (annotation == null) {
+                type = type.getSuperclass();
+            }
+        }
+
+        return annotation;
+    }
 }
Index: wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java
===================================================================
--- wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java	(working copy)
@@ -548,6 +548,11 @@
             // No-op
         }
 
+        @Override
+        public void nameChanged(Component component, String previousName) {
+            // No-op
+        }
+
         // TableViewListener methods
 
         @Override
Index: wtk/src/org/apache/pivot/wtk/Container.java
===================================================================
--- wtk/src/org/apache/pivot/wtk/Container.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtk/Container.java	(working copy)
@@ -308,6 +308,23 @@
         return component;
     }
 
+    public Component getNamedComponent(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException();
+        }
+
+        Component namedComponent = null;
+
+        for (Component component : this) {
+            if (name.equals(component.getName())) {
+                namedComponent = component;
+                break;
+            }
+        }
+
+        return namedComponent;
+    }
+
     @Override
     public void setVisible(boolean visible) {
         if (!visible
Index: wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java
===================================================================
--- wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java	(working copy)
@@ -224,6 +224,11 @@
         // No-op
     }
 
+    @Override
+    public void nameChanged(Component component, String previousName) {
+        // No-op
+    }
+
     // Component state events
     @Override
     public void enabledChanged(Component component) {
Index: wtk/src/org/apache/pivot/wtk/Component.java
===================================================================
--- wtk/src/org/apache/pivot/wtk/Component.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtk/Component.java	(working copy)
@@ -38,6 +38,7 @@
 import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.util.ThreadUtilities;
 import org.apache.pivot.wtk.effects.Decorator;
+import org.apache.pivot.wtkx.IDProperty;
 
 /**
  * Top level abstract base class for all components. In MVC terminology, a
@@ -49,6 +50,7 @@
  * TODO Add a contains() method or some equivalent that will support mouse
  * interaction with non-rectangular components.
  */
+@IDProperty("name")
 public abstract class Component implements ConstrainedVisual {
     /**
      * Style dictionary implementation.
@@ -369,6 +371,13 @@
                 listener.menuHandlerChanged(component, previousMenuHandler);
             }
         }
+
+        @Override
+        public void nameChanged(Component component, String previousName) {
+            for (ComponentListener listener : this) {
+                listener.nameChanged(component, previousName);
+            }
+        }
     }
 
     private static class ComponentStateListenerList extends
@@ -626,6 +635,9 @@
     // The component's menu handler
     private MenuHandler menuHandler = null;
 
+    // The component's name
+    private String name = null;
+
     // User data
     private HashMap<String, Object> userData = new HashMap<String, Object>();
     private UserDataDictionary userDataDictionary = new UserDataDictionary();
@@ -2412,6 +2424,27 @@
     }
 
     /**
+     * Returns the component's name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the component's name.
+     *
+     * @param name
+     */
+    public void setName(String name) {
+        String previousName = this.name;
+
+        if (previousName != name) {
+            this.name = name;
+            componentListeners.nameChanged(this, previousName);
+        }
+    }
+
+    /**
      * Returns the user data dictionary.
      */
     public UserDataDictionary getUserData() {
Index: wtk/src/org/apache/pivot/wtk/ComponentListener.java
===================================================================
--- wtk/src/org/apache/pivot/wtk/ComponentListener.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtk/ComponentListener.java	(working copy)
@@ -78,6 +78,10 @@
         @Override
         public void menuHandlerChanged(Component component, MenuHandler previousMenuHandler) {
         }
+
+        @Override
+        public void nameChanged(Component component, String previousName) {
+        }
     }
 
     /**
@@ -192,4 +196,11 @@
      * @param previousMenuHandler
      */
     public void menuHandlerChanged(Component component, MenuHandler previousMenuHandler);
+
+    /**
+     * Called when a component's name has changed.
+     * @param component
+     * @param previousName
+     */
+    public void nameChanged(Component component, String previousName);
 }
Index: wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java
===================================================================
--- wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java	(revision 952343)
+++ wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java	(working copy)
@@ -757,6 +757,15 @@
                     }
 
                     namedObjects.put(element.id, element.value);
+
+                    // If the type has an ID property, use it
+                    Class<?> type = element.value.getClass();
+                    IDProperty idProperty = BeanAdapter.findAnnotation(type, IDProperty.class);
+
+                    if (idProperty != null) {
+                        BeanAdapter beanAdapter = new BeanAdapter(element.value);
+                        beanAdapter.put(idProperty.value(), element.id);
+                    }
                 }
 
                 // Apply instance attributes
