diff --git a/game/engines/default/data/sound/ui/subtle_button_sound.ogg b/game/engines/default/data/sound/ui/subtle_button_sound.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..d903090157e053afe728d016a696704960b53bef
Binary files /dev/null and b/game/engines/default/data/sound/ui/subtle_button_sound.ogg differ
diff --git a/game/engines/default/engine/ui/Base.lua b/game/engines/default/engine/ui/Base.lua
index 541e23bbdcee8c6f2363232108a8a7d1511273da..f090411bbf7089d9d28cf748544fb75a812d4af6 100644
--- a/game/engines/default/engine/ui/Base.lua
+++ b/game/engines/default/engine/ui/Base.lua
@@ -41,6 +41,10 @@ _M.font_bold_h = _M.font_bold:lineSkip()
 _M.ui = "stone"
 _M.defaultui = "stone"
 
+sounds = {
+	button = "ui/subtle_button_sound",
+}
+
 _M.ui_conf = {
 	stone = {
 		frame_shadow = {x=15, y=15, a=0.5},
@@ -162,3 +166,9 @@ end
 
 function _M:positioned(x, y)
 end
+
+function _M:sound(name)
+	if game.playSound and sounds[name] then
+		game:playSound(sounds[name])
+	end
+end
diff --git a/game/engines/default/engine/ui/Button.lua b/game/engines/default/engine/ui/Button.lua
index ca2470614c6df7dbf58488b0667c3015f3c94031..5d51e52c61335192cd43ef8b176a086b0770edca 100644
--- a/game/engines/default/engine/ui/Button.lua
+++ b/game/engines/default/engine/ui/Button.lua
@@ -53,8 +53,8 @@ function _M:generate()
 	self.font:setStyle("normal")
 
 	-- Add UI controls
-	self.mouse:registerZone(0, 0, self.w+6, self.h+6, function(button, x, y, xrel, yrel, bx, by, event) if button == "left" and event == "button" then self.fct() end end)
-	self.key:addBind("ACCEPT", function() self.fct() end)
+	self.mouse:registerZone(0, 0, self.w+6, self.h+6, function(button, x, y, xrel, yrel, bx, by, event) if button == "left" and event == "button" then self:sound("button") self.fct() end end)
+	self.key:addBind("ACCEPT", function() self:sound("button") self.fct() end)
 
 	self.rw, self.rh = w, h
 	self.frame = self:makeFrame("ui/button", self.w, self.h)
diff --git a/game/engines/default/engine/ui/Checkbox.lua b/game/engines/default/engine/ui/Checkbox.lua
index 138568e3ab5f8c73a1a205c6057797818ff18e05..b16481b3ed81fcc973769c7ef89767188ef06963 100644
--- a/game/engines/default/engine/ui/Checkbox.lua
+++ b/game/engines/default/engine/ui/Checkbox.lua
@@ -65,6 +65,7 @@ end
 
 function _M:select()
 	self.checked = not self.checked
+	self:sound("button")
 	if self.on_change then self.on_change(self.checked) end
 end
 
diff --git a/game/engines/default/engine/ui/Dropdown.lua b/game/engines/default/engine/ui/Dropdown.lua
index 2982985e5c2d8fb5ec56b3bf038532028663bda5..7a26748dfdd01946ee33a404517d5735deca3125 100644
--- a/game/engines/default/engine/ui/Dropdown.lua
+++ b/game/engines/default/engine/ui/Dropdown.lua
@@ -60,6 +60,7 @@ end
 function _M:positioned(x, y, sx, sy)
 	self.c_list = List.new{width=self.w, list=self.list, select=self.on_select, display_prop=self.display_prop, scrollbar=self.scrollbar, nb_items=self.nb_items, fct=function()
 		game:unregisterDialog(self.popup)
+		self:sound("button")
 		self.fct(self.c_list.list[self.c_list.sel])
 	end}
 	self.popup = Dialog.new(nil, self.w, self.c_list.h, sx, sy + self.h, nil, nil, false, "simple")
@@ -69,6 +70,7 @@ function _M:positioned(x, y, sx, sy)
 	self.popup.key:addBind("EXIT", function()
 		game:unregisterDialog(self.popup)
 		self.c_list.sel = self.previous
+		self:sound("button")
 		self.fct(self.c_list.list[self.c_list.sel])
 	end)
 end
diff --git a/game/engines/default/engine/ui/ImageList.lua b/game/engines/default/engine/ui/ImageList.lua
index 6521e5b93c6d36838b74a8db4c13cb1c191ff030..b6875f96e04d37cf70fca2ab0e38847ade0cf409 100644
--- a/game/engines/default/engine/ui/ImageList.lua
+++ b/game/engines/default/engine/ui/ImageList.lua
@@ -135,6 +135,7 @@ end
 
 function _M:onUse(button)
 	local item = self.dlist[self.sel_j] and self.dlist[self.sel_j][self.sel_i]
+	self:sound("button")
 	if item then self.fct(item) end
 end
 
diff --git a/game/engines/default/engine/ui/List.lua b/game/engines/default/engine/ui/List.lua
index 8bf254d4f4e547bb87f5ae1ab969e6d59e708f81..df28ed7b4c8125d3ff6f87212a5136efee29a94e 100644
--- a/game/engines/default/engine/ui/List.lua
+++ b/game/engines/default/engine/ui/List.lua
@@ -147,6 +147,7 @@ end
 function _M:onUse(...)
 	local item = self.list[self.sel]
 	if not item then return end
+	self:sound("button")
 	if item.fct then item:fct(item, self.sel, ...)
 	else self.fct(item, self.sel, ...) end
 end
diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua
index d185e3cfe6fca07883b7a74df915ee0e746661e8..f7a1d84277ba8e430b411a258983d99f58b55a63 100644
--- a/game/engines/default/engine/ui/ListColumns.lua
+++ b/game/engines/default/engine/ui/ListColumns.lua
@@ -250,6 +250,7 @@ end
 function _M:onUse(...)
 	local item = self.list[self.sel]
 	if not item then return end
+	self:sound("button")
 	if item.fct then item:fct(item, self.sel, ...)
 	else self.fct(item, self.sel, ...) end
 end
diff --git a/game/engines/default/engine/ui/Tab.lua b/game/engines/default/engine/ui/Tab.lua
index e13e840bf9048e9f0978d481c2494054fb705c31..67fc6ab80f28d96cdfe88400ea5b51d8933113d8 100644
--- a/game/engines/default/engine/ui/Tab.lua
+++ b/game/engines/default/engine/ui/Tab.lua
@@ -64,7 +64,10 @@ function _M:generate()
 
 	self.frame_sel = self:makeFrame("ui/button_sel", self.w, self.h)
 
-	self.key:addBind("ACCEPT", function() self.fct(self.selected) end)
+	self.key:addBind("ACCEPT", function()
+		self:sound("button")
+		self.fct(self.selected)
+	end)
 	self.key:addCommands{
 		_SPACE = function() self:select() end,
 	}
diff --git a/game/engines/default/engine/ui/TreeList.lua b/game/engines/default/engine/ui/TreeList.lua
index f552583f1e40555e9ce2110960b3068fba2ff09d..314b0ff761757639d7fe0f126148bb4eb67efe24 100644
--- a/game/engines/default/engine/ui/TreeList.lua
+++ b/game/engines/default/engine/ui/TreeList.lua
@@ -295,6 +295,7 @@ end
 function _M:onUse(...)
 	local item = self.list[self.sel]
 	if not item then return end
+	self:sound("button")
 	if item.fct then item.fct(item, self.sel, ...)
 	else self.fct(item, self.sel, ...) end
 end
diff --git a/game/engines/default/engine/ui/VariableList.lua b/game/engines/default/engine/ui/VariableList.lua
index cf92b37a6b331c536fdf279eba87a5c27b8d5575..82400a17e9e4947e6aee4bd9fc077e07388f2392 100644
--- a/game/engines/default/engine/ui/VariableList.lua
+++ b/game/engines/default/engine/ui/VariableList.lua
@@ -92,6 +92,7 @@ end
 function _M:onUse()
 	local item = self.list[self.sel]
 	if not item then return end
+	self:sound("button")
 	if item.fct then item:fct()
 	else self.fct(item, self.sel) end
 end