 			return _treeController ?? parent?.treeController
 		}
 		set {
+			willMoveToTreeController(newValue)
 			_treeController = newValue
-			didMoveToTreeController(treeController)
-		}
-	}
-	
-	open func didMoveToTreeController(_ treeController: TreeController?) {
-		children.forEach {$0.didMoveToTreeController(treeController)}
-	}
-	
-	open var isExpandable: Bool = true
+		}
+	}
+	
+	open func willMoveToTreeController(_ treeController: TreeController?) {
+		children.forEach {$0.willMoveToTreeController(treeController)}
+	}
+	
+	open var isExpandable: Bool = false
 	open var canMove: Bool = false
 	
 	private var removeRange: CountableRange<Int>?
 	open var isExpanded: Bool = true {
 		willSet {
+			guard !isInBatch else {return}
 			guard treeController != nil else {return}
 			guard isExpanded else {return}
 			guard newValue != isExpanded else {return}

		
		set {
			
			let from = _children
			let to = newValue

			if !isInBatch {
				if let from = _children {
					var set = Set(from)
					for a in to {

	func performBatchUpdates(_ updates: () -> Void) {
		if !isInBatch {
			let from = _children
			
			var size = isViewable ? 1 : 0
			if let from = from, !isExpandable || isExpanded || !isViewable {
				size = from.reduce(size, {$0 + $1.size})
			}

			
			batchUpdatesCounter += 1
			updates()
