diff --git a/Main.tscn b/Main.tscn
index bb604ab..43bef61 100644
--- a/Main.tscn
+++ b/Main.tscn
@@ -18,14 +18,7 @@ position = Vector2(156, 90)
 texture = ExtResource("3_kjcur")
 
 [node name="Timer" type="Timer" parent="."]
-wait_time = 3.0
-one_shot = true
-autostart = true
-
-[node name="Timer2" type="Timer" parent="."]
-wait_time = 3.0
 one_shot = true
 autostart = true
 
 [connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
-[connection signal="timeout" from="Timer2" to="." method="_on_timer_timeout"]
diff --git a/MouseSignals.tscn b/MouseSignals.tscn
new file mode 100644
index 0000000..c977361
--- /dev/null
+++ b/MouseSignals.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://dcmh5yv0fjmsb"]
+
+[ext_resource type="Script" path="res://src/mouse_signals.gd" id="1_mpp7j"]
+
+[node name="MouseSignals" type="Node2D" groups=["mouse_signals"]]
+script = ExtResource("1_mpp7j")
diff --git a/NoCreMouseSignals.tscn b/NoCreMouseSignals.tscn
new file mode 100644
index 0000000..95527ee
--- /dev/null
+++ b/NoCreMouseSignals.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://5g4mecc4tb6f"]
+
+[ext_resource type="Script" path="res://no_cre_build_signals.gd" id="1_bgmgm"]
+
+[node name="MouseSignals" type="Node2D"]
+script = ExtResource("1_bgmgm")
diff --git a/components/Cursor/cursor.gd b/components/Cursor/cursor.gd
index ea68741..115298a 100644
--- a/components/Cursor/cursor.gd
+++ b/components/Cursor/cursor.gd
@@ -7,25 +7,72 @@ extends Base
 const CURSOR_UI = preload("res://components/Cursor/hover-1.png")
 const CURSOR_HOLD = preload("res://components/Cursor/grab-1.png")
 const CURSOR = preload("res://components/Cursor/normal-1.png")
+const CREATURE = preload("res://src/Creature.tscn")
 var rotation_tween
 
 var cursor_tween
 var hovered_objects = 0
 var holding = false
-var held_item
+var grabbed_creature
+var signal_object
+var original_window
+var original_position
+var timer = 0
+var hover_timer = 0
 
 func _ready() -> void:
 	Persister.data_persisted.connect(_on_data_persisted)
 	Triggerer.listen("grab_creature", _on_grab_creature)
+	Triggerer.listen("hovered", _on_hovered)
+		
+	for child in get_parent().get_children():
+		if child.is_in_group("mouse_signals"):
+			signal_object = child
+
+
+func _on_hovered(_data):
+	hover_timer = 0.125
 
 
 func _on_grab_creature(data):
-	held_item = data.creature
+	print("GRAB")
+	grabbed_creature = CREATURE.instantiate()
+	grabbed_creature.key = data.creature
+	mouse_control.add_child(grabbed_creature)
+	grabbed_creature.position = Vector2(0, 0)
 	holding = true
+	
+	original_window = data.old_window
+	original_position = data.old_position
 
+func let_go():
+	if holding and grabbed_creature:
+		if get_window().get_window_id() == 0 and not Persister.get_value("hovered"):
+			var new_creature = CREATURE.instantiate()
+			new_creature.key = grabbed_creature.key
+			new_creature.position = original_position
+			original_window.add_child(new_creature)
+		
+		if get_window().get_window_id() == 0:
+			Persister.persist_data("grabbing", false)
+		
+		if signal_object and signal_object.mouse_in_window:
+			var new_creature = CREATURE.instantiate()
+			new_creature.key = grabbed_creature.key
+			new_creature.global_position = grabbed_creature.global_position
+			get_window().add_child(new_creature)
+		grabbed_creature.queue_free()
+		grabbed_creature = null
+	
+	
+	
+	holding = false
 
 func _on_release():
-	holding = false
+	print("RElEASED %d" % [get_window().get_window_id()])
+	let_go()
+	Triggerer.trigger("released")
+	
 	var overlapping_areas = mouse_control.get_overlapping_areas()
 	overlapping_areas.sort_custom(func(a, b):
 		return a.z_index > b.z_index
@@ -85,8 +132,14 @@ func _process(delta):
 	#Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
 	mouse_control.position = mouse_control.get_global_mouse_position()
 	
-	if held_item:
-		held_item.position = mouse_control.position
+	if timer > 0:
+		timer -= delta
+		if timer <= 0:
+			let_go()
+	
+	if hover_timer > 0:
+		hover_timer -= delta
+		timer = 0
 	
 	if not Input.is_action_pressed("left_click"):
 		sprite_2d.rotation = move_toward(sprite_2d.rotation, 0, delta)
diff --git a/components/Triggerer/triggerer.gd b/components/Triggerer/triggerer.gd
index ada5aa0..fa6d0cf 100644
--- a/components/Triggerer/triggerer.gd
+++ b/components/Triggerer/triggerer.gd
@@ -13,15 +13,19 @@ var _connections = {}
 
 ## Trigger an event to be read in by other objects
 func trigger(key: String, data: Dictionary = {}) -> void:
-	_info("Triggered key ∧%s∧" % [key])
+	#_info("Triggered key ∧%s∧" % [key])
 	
 	data.trigger = key
 	
 	if _connections.has(key):
+		_connections[key] = _connections[key].filter(func(x): return x.is_valid())
+		
 		for callback in _connections[key]:
 			callback.call(data)
 	
 	if _connections.has("any"):
+		_connections["any"] = _connections["any"].filter(func(x): return x.is_valid())
+		
 		for callback in _connections["any"]:
 			callback.call(data)
 
diff --git a/main.gd b/main.gd
index 1fa2f3d..d58d07b 100644
--- a/main.gd
+++ b/main.gd
@@ -7,6 +7,7 @@ const ZONE = preload("res://src/Zone.tscn")
 const UI_BUTTONS = preload("res://src/UIButtons.tscn")
 const PAUSE_WINDOW = preload("res://src/PauseWindow.tscn")
 const BUILD_WINDOW = preload("res://src/BuildWindow.tscn")
+const CREATURE_WINDOW = preload("res://src/CreatureWindow.tscn")
 
 var build_object
 
@@ -41,10 +42,6 @@ func _on_spawn_window(data) -> void:
 	get_tree().root.add_child(new_window)
 
 
-func _on_timer_timeout() -> void:
-	Triggerer.trigger("spawn_window", {"key": ["farm", "desert", "lake", "forest"].pick_random()})
-
-
 func _on_quit(_data) -> void:
 	get_tree().quit()
 
@@ -58,3 +55,12 @@ func _on_build_menu(data):
 		build_object = new_window
 	else:
 		build_object.queue_free()
+
+
+func _on_timer_timeout() -> void:
+	var new_window = CREATURE_WINDOW.instantiate()
+	var new_cursor = CURSOR.instantiate()
+	new_window.add_child(new_cursor)
+	add_child(new_window)
+	
+	Triggerer.trigger("spawn_window", {"key": ["forest"].pick_random()})
diff --git a/no_cre_build_signals.gd b/no_cre_build_signals.gd
new file mode 100644
index 0000000..5e8e7e8
--- /dev/null
+++ b/no_cre_build_signals.gd
@@ -0,0 +1,22 @@
+extends Node2D
+
+var mouse_in_window
+
+func _ready() -> void:
+	Triggerer.listen("released", _on_released)
+
+
+func _on_released(_data):
+	if mouse_in_window:
+		get_window().grab_focus()
+
+
+func _notification(blah):
+	match blah:
+		NOTIFICATION_WM_MOUSE_EXIT:
+			mouse_in_window = false
+		NOTIFICATION_WM_MOUSE_ENTER:
+			mouse_in_window = true
+			
+			if not Persister.get_value("grabbing"):
+				get_window().grab_focus()
diff --git a/parts/zones/images/forest.png b/parts/zones/images/forest.png
index 7a88f8f..41c08da 100644
Binary files a/parts/zones/images/forest.png and b/parts/zones/images/forest.png differ
diff --git a/project.godot b/project.godot
index 6091fc3..b6b9c83 100644
--- a/project.godot
+++ b/project.godot
@@ -23,6 +23,7 @@ Triggerer="*res://components/Triggerer/Triggerer.tscn"
 Persister="*res://components/Persister/Persister.tscn"
 Achievements="*res://components/Achievements/Achievements.tscn"
 Dialogue="*res://components/Dialogue/Dialogue.tscn"
+Cursor="*res://components/Cursor/Cursor.tscn"
 
 [display]
 
diff --git a/src/BuildWindow.tscn b/src/BuildWindow.tscn
index bcf2a67..5c2552a 100644
--- a/src/BuildWindow.tscn
+++ b/src/BuildWindow.tscn
@@ -1,12 +1,17 @@
-[gd_scene load_steps=5 format=3 uid="uid://b5gq1bw4bj56b"]
+[gd_scene load_steps=8 format=3 uid="uid://rfc6w6wnl1c2"]
 
+[ext_resource type="PackedScene" uid="uid://5g4mecc4tb6f" path="res://NoCreMouseSignals.tscn" id="1_33eve"]
 [ext_resource type="Theme" uid="uid://ck7603ob4gflc" path="res://Fonts/Theme.tres" id="1_ta3q3"]
 [ext_resource type="Script" path="res://src/build_window.gd" id="1_y8qy0"]
 [ext_resource type="Script" path="res://small_wave.gd" id="3_0qyx5"]
+[ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="4_3uk60"]
 
 [sub_resource type="RichTextEffect" id="RichTextEffect_lhkb8"]
 script = ExtResource("3_0qyx5")
 
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_ehvvg"]
+size = Vector2(52, 73)
+
 [node name="BuildWindow" type="Window"]
 canvas_item_default_texture_filter = 0
 position = Vector2i(0, 36)
@@ -14,6 +19,8 @@ size = Vector2i(900, 500)
 always_on_top = true
 content_scale_factor = 4.0
 
+[node name="MouseSignals" parent="." instance=ExtResource("1_33eve")]
+
 [node name="Control" type="Control" parent="."]
 layout_mode = 3
 anchors_preset = 15
@@ -94,6 +101,12 @@ offset_bottom = 86.24
 bbcode_enabled = true
 text = "[center]20G"
 
+[node name="MouseHandler" parent="Control/HBoxContainer/Upgrade" instance=ExtResource("4_3uk60")]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Control/HBoxContainer/Upgrade/MouseHandler"]
+position = Vector2(16.5, 20)
+shape = SubResource("RectangleShape2D_ehvvg")
+
 [node name="Upgrade2" type="ColorRect" parent="Control/HBoxContainer"]
 custom_minimum_size = Vector2(32, 40)
 layout_mode = 2
@@ -119,6 +132,12 @@ offset_bottom = 86.24
 bbcode_enabled = true
 text = "[center]20G"
 
+[node name="MouseHandler2" parent="Control/HBoxContainer/Upgrade2" instance=ExtResource("4_3uk60")]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Control/HBoxContainer/Upgrade2/MouseHandler2"]
+position = Vector2(16.5, 20)
+shape = SubResource("RectangleShape2D_ehvvg")
+
 [node name="Upgrade3" type="ColorRect" parent="Control/HBoxContainer"]
 custom_minimum_size = Vector2(32, 40)
 layout_mode = 2
@@ -143,3 +162,13 @@ offset_right = 56.38
 offset_bottom = 86.24
 bbcode_enabled = true
 text = "[center]20G"
+
+[node name="MouseHandler3" parent="Control/HBoxContainer/Upgrade3" instance=ExtResource("4_3uk60")]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Control/HBoxContainer/Upgrade3/MouseHandler3"]
+position = Vector2(16.5, 20)
+shape = SubResource("RectangleShape2D_ehvvg")
+
+[connection signal="clicked" from="Control/HBoxContainer/Upgrade/MouseHandler" to="Control" method="_on_mouse_handler_clicked"]
+[connection signal="clicked" from="Control/HBoxContainer/Upgrade2/MouseHandler2" to="Control" method="_on_mouse_handler_2_clicked"]
+[connection signal="clicked" from="Control/HBoxContainer/Upgrade3/MouseHandler3" to="Control" method="_on_mouse_handler_3_clicked"]
diff --git a/src/CreatureWindow.tscn b/src/CreatureWindow.tscn
new file mode 100644
index 0000000..b0073d5
--- /dev/null
+++ b/src/CreatureWindow.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=3 format=3 uid="uid://dcaqcebxdrgu7"]
+
+[ext_resource type="Script" path="res://src/creature_window.gd" id="1_eufhm"]
+[ext_resource type="PackedScene" uid="uid://dcmh5yv0fjmsb" path="res://MouseSignals.tscn" id="2_3cu4o"]
+
+[node name="CreatureWindow" type="Window"]
+canvas_item_default_texture_filter = 0
+position = Vector2i(0, 36)
+size = Vector2i(300, 300)
+always_on_top = true
+content_scale_factor = 4.0
+
+[node name="Node2D" type="Node2D" parent="."]
+script = ExtResource("1_eufhm")
+
+[node name="MouseSignals" parent="." instance=ExtResource("2_3cu4o")]
diff --git a/src/UIButtons.tscn b/src/UIButtons.tscn
index daa1147..2ee67d2 100644
--- a/src/UIButtons.tscn
+++ b/src/UIButtons.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=8 format=3 uid="uid://bqd2ulwe0bsrb"]
+[gd_scene load_steps=8 format=3 uid="uid://dmsrxabynq46i"]
 
 [ext_resource type="Script" path="res://src/buttons.gd" id="1_rc6dx"]
 [ext_resource type="PackedScene" uid="uid://br46gg7k10wt2" path="res://src/ui/ActionButton.tscn" id="1_ydcg5"]
diff --git a/src/Zone.tscn b/src/Zone.tscn
index ac1a13b..cdae941 100644
--- a/src/Zone.tscn
+++ b/src/Zone.tscn
@@ -1,6 +1,7 @@
-[gd_scene load_steps=2 format=3 uid="uid://c1bqwhwmkp8aw"]
+[gd_scene load_steps=3 format=3 uid="uid://c1bqwhwmkp8aw"]
 
 [ext_resource type="Script" path="res://src/zone.gd" id="1_gihyf"]
+[ext_resource type="Script" path="res://src/mouse_signals.gd" id="2_28mh4"]
 
 [node name="Zone" type="Window"]
 canvas_item_default_texture_filter = 0
@@ -12,3 +13,6 @@ content_scale_factor = 4.0
 script = ExtResource("1_gihyf")
 
 [node name="Sprite2D" type="Sprite2D" parent="."]
+
+[node name="MouseSignals" type="Node2D" parent="." groups=["mouse_signals"]]
+script = ExtResource("2_28mh4")
diff --git a/src/build_window.gd b/src/build_window.gd
index 76ff907..837a137 100644
--- a/src/build_window.gd
+++ b/src/build_window.gd
@@ -2,7 +2,6 @@ extends Control
 
 var upgrade_pool = Data.data.upgrades.keys()
 var zone_pool = Data.data.zones.keys()
-var current_zone
 
 @onready var cards = [
 	{
@@ -19,9 +18,16 @@ var current_zone
 	}
 ]
 
+var chosen_cards = [
+	null,
+	null,
+	null
+]
+
 func _ready() -> void:
 	upgrade_pool.shuffle()
 	zone_pool.shuffle()
+	Persister.change_value("gold", 100) # TEMP
 	
 	var screen_size = DisplayServer.screen_get_size(0)
 	
@@ -40,13 +46,43 @@ func _update_card(index):
 	var cost
 	
 	if index == 2:
+		if zone_pool.size() == 0:
+			zone_pool = Data.data.zones.keys()
+			zone_pool.shuffle()
 		choice = zone_pool.pop_back()
 		card_data = Data.data.zones[choice]
 		cost = 20
 	else:
+		if upgrade_pool.size() == 0:
+			upgrade_pool = Data.data.upgrades.keys()
+			upgrade_pool.shuffle()
 		choice = upgrade_pool.pop_back()
 		card_data = Data.data.upgrades[choice]
 		cost = card_data.cost
 	
 	cards[index].title.text = "[center]%s" % [card_data.name]
 	cards[index].cost.text = "[center]%d G" % [cost]
+	card_data.key = choice
+	chosen_cards[index] = card_data
+
+
+func _on_mouse_handler_clicked() -> void:
+	_buy_upgrade(0)
+
+
+func _on_mouse_handler_2_clicked() -> void:
+	_buy_upgrade(1)
+
+
+func _on_mouse_handler_3_clicked() -> void:
+	_buy_upgrade(2)
+
+
+func _buy_upgrade(index):
+	var card_data = chosen_cards[index]
+	if Persister.get_value("gold", PersisterEnums.Scope.UNKNOWN, 0) >= (card_data.cost if card_data.has("cost") else 20):
+		Persister.change_value("gold", -(card_data.cost if card_data.has("cost") else 20))
+		_update_card(index)
+		
+		if index == 2:
+			Triggerer.trigger("spawn_window", {"key": card_data.key})
diff --git a/src/creature.gd b/src/creature.gd
index b73e515..f4d6255 100644
--- a/src/creature.gd
+++ b/src/creature.gd
@@ -7,17 +7,12 @@ var key
 
 @onready var sprite_2d: Sprite2D = $Sprite2D
 
-var grabbed = false
 
 func _ready() -> void:
 	sprite_2d.texture = image
 
 
-func _process(delta: float) -> void:
-	if Input.is_action_just_released("left_click"):
-		grabbed = false
-
-
 func _on_mouse_handler_clicked() -> void:
-	Triggerer.trigger("grab_creature", {"creature": self})
-	grabbed = true
+	Triggerer.trigger("grab_creature", {"creature": key, "old_window": get_window(), "old_position": position})
+	Persister.persist_data("grabbing", true)
+	queue_free()
diff --git a/src/creature_window.gd b/src/creature_window.gd
new file mode 100644
index 0000000..d9a4659
--- /dev/null
+++ b/src/creature_window.gd
@@ -0,0 +1,43 @@
+extends Node2D
+
+var minutes_left = 6 * 24
+var creatures_spawned = 0
+var spawn_times = []
+
+const CREATURE = preload("res://src/Creature.tscn")
+
+var mouse_in_window = false
+
+func _ready() -> void:
+	Persister.change_value("creature_amount", 4)
+	Triggerer.listen("minutes", _on_minutes)
+	Triggerer.listen("day", _on_day)
+	_generate_spawn_times()
+	
+	var screen_size = DisplayServer.screen_get_size(0)
+	
+	get_window().position = Vector2i(50, screen_size.y - 300 - 50) + DisplayServer.screen_get_position(0)
+
+
+
+func _on_minutes(_data):
+	minutes_left -= 1
+	
+	if spawn_times.has(minutes_left):
+		var new_creature = CREATURE.instantiate()
+		new_creature.position = Vector2(50, 50)
+		new_creature.key = Data.data.creatures.keys().pick_random()
+		add_child(new_creature)
+
+
+func _on_day(_data):
+	minutes_left = 6 * 24
+	creatures_spawned = 0
+	_generate_spawn_times()
+
+
+func _generate_spawn_times():
+	spawn_times = []
+	
+	for i in range(0, 4):
+		spawn_times.push_back(randi_range(2, 6 * 24 - 2))
diff --git a/src/mouse_signals.gd b/src/mouse_signals.gd
new file mode 100644
index 0000000..751ed78
--- /dev/null
+++ b/src/mouse_signals.gd
@@ -0,0 +1,37 @@
+extends Node2D
+
+var mouse_in_window
+#
+#
+#func _on_creature_window_mouse_entered() -> void:
+	#print("ENTERED")
+	#mouse_in_window = true
+#
+#
+#func _on_creature_window_mouse_exited() -> void:
+	#print("EXITED")
+	#mouse_in_window = false
+
+
+func _ready() -> void:
+	Triggerer.listen("released", _on_released)
+
+
+func _on_released(_data):
+	if mouse_in_window:
+		get_window().grab_focus()
+
+
+func _notification(blah):
+	match blah:
+		NOTIFICATION_WM_MOUSE_EXIT:
+			#print('Mouse left window')
+			mouse_in_window = false
+			Persister.change_value("hovered", -1)
+		NOTIFICATION_WM_MOUSE_ENTER:
+			#print('Mouse entered window')
+			mouse_in_window = true
+			Persister.change_value("hovered", 1)
+			
+			if not Persister.get_value("grabbing"):
+				get_window().grab_focus()
diff --git a/src/zone.gd b/src/zone.gd
index d44526d..aa3d59a 100644
--- a/src/zone.gd
+++ b/src/zone.gd
@@ -17,11 +17,6 @@ func _ready() -> void:
 	title = data.name
 	sprite_2d.texture = image
 	sprite_2d.position = Vector2(int(data.size[0]) * 12 / 2, int(data.size[1]) * 12 / 2)
-	
-	var new_creature = CREATURE.instantiate()
-	new_creature.position = Vector2(50, 50)
-	new_creature.key = "1x1-1"
-	add_child(new_creature)
 
 
 #