 					// 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;

				JS.error("SessionManager.getLinkablePropertyNames(): linkableObject cannot be null.");
				return [];
			}

			var name:String;
			// 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
			var propertyNames:Array;
			if (Weave.isAsyncClass(linkableObject['constructor']))
				propertyNames = JS.getOwnPropertyNames(linkableObject);
			else
				propertyNames = JS.getPropertyNames(linkableObject, true); // includes getters
			
			var linkableNames:Array = [];
			for each (name in propertyNames)
			{
				var property:Object = linkableObject[name];
				if (Weave.isLinkable(property))
					if (!filtered || d2d_child_parent.get(property, linkableObject))
						linkableNames.push(name);
			}
			
			return linkableNames;
		}
		

			return result;
		}
		
		private static const LINKABLE_PROPERTIES:String = 'linkableProperties';
		
		/**
		 * 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.
