 		@timestamp = cola.sequenceNo()
 
 		if setCurrent
-			entity = page._first
-			while entity
+			for entity in page
 				if entity.state != _Entity.STATE_DELETED
 					@setCurrent(entity)
 					break
-				entity = entity._next
 		return
 
 	_onPathChange: ()->
 		delete @_pathCache
 
 		page = @_first
-		if !page then return
+		if not page then return
 
 		next = page._first
 		while page
-			if next
-				next._onPathChange()
-				next = next._next
-			else
+			for entity in page
+				entity._onPathChange()
+			page = page._next
+		return
+
+	_findPrevious: (entity)->
+		if not (entity?.parent isnt @)
+			if entity
+				page = entity._page
+				if page[page.hotIndex] is entity
+					index = page.hotIndex
+				else
+					index = page.indexOf(entity)
+			else
+				page = @_last
+				index = page.length
+
+			while page
+				while index > 0
+					entity = page[--index]
+					if entity.state isnt _Entity.STATE_DELETED
+						return [entity, index]
+
+				page = page._previous
+				index = page?.length
+		return []
+
+	_findNext: (entity)->
+		if not (entity?.parent isnt @)
+			if entity
+				page = entity._page
+				if page[page.hotIndex] is entity
+					index = page.hotIndex
+				else
+					index = page.indexOf(entity)
+			else
+				page = @_first
+				index = -1
+
+			while page
+				lastIndex = page.length - 1
+				while index < lastIndex
+					entity = page[++index]
+					if entity.state isnt _Entity.STATE_DELETED
+						return [entity, index]
+
 				page = page._next
-				next = page?._first
-		return
-
-	_findPrevious: (entity)->
-		return if entity and entity.parent != @
-
-		if entity
-			page = entity._page
-			previous = entity._previous
-		else
-			page = @_last
-			previous = page._last
-
-		while page
-			if previous
-				if previous.state != _Entity.STATE_DELETED
-					return previous
-				else
-					previous = previous._previous
-			else
-				page = page._previous
-				previous = page?._last
-		return
-
-	_findNext: (entity)->
-		return if entity and entity.parent != @
-
-		if entity
-			page = entity._page
-			next = entity._next
-		else
-			page = @_first
-			next = page._first
-
-		while page
-			if next
-				if next.state != _Entity.STATE_DELETED
-					return next
-				else
-					next = next._next
-			else
-				page = page._next
-				next = page?._first
-		return
+				index = -1
+		return []
 
 	_findPage: (pageNo)->
 		if pageNo < 1 then return null

				return null

		page = @_currentPage or @_first
		if !page then return null

		if page.pageNo == pageNo
			return page
		else if page.pageNo < pageNo
			page = page._next


		page = @_first
		while page
			page.clear()
			page = page._next

		delete @_currentPage
