 					// ignore propertyName and always return the internalObject
 					object = (object as ILinkableDynamicObject).internalObject;
 				}
-				else if (getLinkablePropertyNames(object).indexOf(propertyName) < 0)
+				else if (object[propertyName] is ILinkableObject)
+				{
+					object = object[propertyName];
+				}
+				else
 				{
 					if (object is ILinkableObjectWithNewProperties || JS.hasProperty(object, DEPRECATED_STATE_MAPPING))
 						return getObjectFromDeprecatedPath(object[DEPRECATED_STATE_MAPPING], path, i);
 					return null;
-				}
-				else
-				{
-					object = object[propertyName] as ILinkableObject;
 				}
 			}
 			return map_disposed.get(object) ? null : object;

			return result;
		}
		
		/**
		 * This function gets a list of sessioned property names so accessor functions for non-sessioned properties do not have to be called.
		 * @param linkableObject An object containing sessioned properties.

				JS.error("SessionManager.getLinkablePropertyNames(): linkableObject cannot be null.");
				return [];
			}
			
			var propertyNames:Array;
			var linkableNames:Array;
			var name:String;
			var property:Object;
			
			var info:Object = WeaveAPI.ClassRegistry.getClassInfo(linkableObject);
			if (info && false)
			{
				if (!info[LINKABLE_PROPERTIES])
				{
					info[LINKABLE_PROPERTIES] = propertyNames = [];
					for each (var lookup:Object in [info.variables, info.accessors])
						for (name in lookup)
							if (Weave.isLinkable(Weave.getDefinition(lookup[name].type)))
								propertyNames.push(name);
				}
				propertyNames = info[LINKABLE_PROPERTIES];
				if (!filtered)
					return propertyNames; // already filtered by Weave.isLinkable()
			}
			else
			{
				// get the names from the object itself because each instance must have different
				// linkable children, so we don't want to grab them from the prototype
				if (Weave.isAsyncClass(linkableObject['constructor']))
					propertyNames = JS.getOwnPropertyNames(linkableObject);
				else
					propertyNames = JS.getPropertyNames(linkableObject, true); // includes getters on prototype
			}
			
			linkableNames = [];
			for each (name in propertyNames)
			{
				property = linkableObject[name];
				if (Weave.isLinkable(property))
					if (!filtered || d2d_child_parent.get(property, linkableObject))
						linkableNames.push(name);
			}
			return linkableNames;
		}
		
