diff --git a/game/engines/default/engine/dialogs/ShowStore.lua b/game/engines/default/engine/dialogs/ShowStore.lua
index 14683f56a1b93eecd260033e18f142c0f56962dc..99f4b9b6d8e89d87e024be745671281f226ea883 100644
--- a/game/engines/default/engine/dialogs/ShowStore.lua
+++ b/game/engines/default/engine/dialogs/ShowStore.lua
@@ -35,7 +35,7 @@ function _M:init(title, store_inven, actor_inven, store_filter, actor_filter, ac
 	self.actor_filter = actor_filter
 	Dialog.init(self, title or "Store", game.w * 0.8, game.h * 0.8)
 
-	self:generateList()
+	self:maxH()
 
 	self.c_desc = TextzoneList.new{width=self.iw, height=self.max_h*self.font_h, no_color_bleed=true}
 
@@ -44,14 +44,16 @@ function _M:init(title, store_inven, actor_inven, store_filter, actor_filter, ac
 		{name="Inventory", width=72, display_prop="name", sort="name"},
 		{name="Category", width=20, display_prop="cat", sort="cat"},
 		{name="Price", width=8, display_prop="cost", sort="cost"},
-	}, list=self.actor_list, fct=function(item, sel) self:use(item) end, select=function(item, sel) self:select(item) end}
+	}, list={}, fct=function(item, sel) self:use(item) end, select=function(item, sel) self:select(item) end}
 
 	self.c_store = ListColumns.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.max_h*self.font_h - 10, sortable=true, scrollbar=true, columns={
 		{name="", width={20,"fixed"}, display_prop="char", sort="id"},
 		{name="Store", width=72, display_prop="name"},
 		{name="Category", width=20, display_prop="cat"},
 		{name="Price", width=8, display_prop="cost", sort="cost"},
-	}, list=self.store_list, fct=function(item) self:use(item) end, select=function(item, sel) self:select(item) end}
+	}, list={}, fct=function(item) self:use(item) end, select=function(item, sel) self:select(item) end}
+
+	self:generateList()
 
 	self:loadUI{
 		{left=0, top=0, ui=self.c_store},
@@ -93,10 +95,24 @@ function _M:use(item)
 	if item and item.object then
 		if self.focus_ui and self.focus_ui.ui == self.c_store then
 			self.action("buy", item.object, item.item)
-			self:updateStore()
+--			self:updateStore()
 		else
 			self.action("sell", item.object, item.item)
-			self:updateStore()
+--			self:updateStore()
+		end
+	end
+end
+
+function _M:maxH()
+	self.max_h = 0
+	for item, o in ipairs(self.store_inven) do
+		if not self.store_filter or self.store_filter(o) then
+			self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font))
+		end
+	end
+	for item, o in ipairs(self.actor_inven) do
+		if not self.actor_filter or self.actor_filter(o) then
+			self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font))
 		end
 	end
 end
@@ -106,12 +122,10 @@ function _M:generateList()
 	local list = {}
 	list.chars = {}
 	local i = 1
-	self.max_h = 0
 	for item, o in ipairs(self.store_inven) do
 		if not self.store_filter or self.store_filter(o) then
 			local char = self:makeKeyChar(i)
 			list[#list+1] = { id=#list+1, char=char, name=o:getDisplayString()..o:getName(), color=o:getDisplayColor(), object=o, item=item, cat=o.subtype, cost=o.cost, desc=o:getDesc() }
-			self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font))
 			list.chars[char] = #list
 			i = i + 1
 		end
@@ -126,17 +140,12 @@ function _M:generateList()
 		if not self.actor_filter or self.actor_filter(o) then
 			local char = self:makeKeyChar(i)
 			list[#list+1] = { id=#list+1, char=char, name=o:getDisplayString()..o:getName(), color=o:getDisplayColor(), object=o, item=item, cat=o.subtype, cost=o.cost, desc=o:getDesc() }
-			self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font))
 			list.chars[char] = #list
 			i = i + 1
 		end
 	end
 	self.actor_list = list
 
-	if self.c_inven then
-		self.c_inven.list = self.actor_list
-		self.c_store.list = self.store_list
-		self.c_inven:generate()
-		self.c_store:generate()
-	end
+	self.c_inven:setList(self.actor_list)
+	self.c_store:setList(self.store_list)
 end
diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua
index baa255787ac34ca77e08b0e0e11a6d8e7c25b9ae..f03d9415454237e5016e8aef4a7805bce2b5fe7e 100644
--- a/game/engines/default/engine/ui/ListColumns.lua
+++ b/game/engines/default/engine/ui/ListColumns.lua
@@ -60,6 +60,52 @@ function _M:init(t)
 	Base.init(self, t)
 end
 
+local ls, ls_w, ls_h = _M:getImage("ui/selection-left-sel.png")
+local ms, ms_w, ms_h = _M:getImage("ui/selection-middle-sel.png")
+local rs, rs_w, rs_h = _M:getImage("ui/selection-right-sel.png")
+local l, l_w, l_h = _M:getImage("ui/selection-left.png")
+local m, m_w, m_h = _M:getImage("ui/selection-middle.png")
+local r, r_w, r_h = _M:getImage("ui/selection-right.png")
+
+local cls, cls_w, cls_h = _M:getImage("ui/selection-left-column-sel.png")
+local cms, cms_w, cms_h = _M:getImage("ui/selection-middle-column-sel.png")
+local crs, crs_w, crs_h = _M:getImage("ui/selection-right-column-sel.png")
+local cl, cl_w, cl_h = _M:getImage("ui/selection-left-column.png")
+local cm, cm_w, cm_h = _M:getImage("ui/selection-middle-column.png")
+local cr, cr_w, cr_h = _M:getImage("ui/selection-right-column.png")
+
+function _M:drawItem(item)
+	for j, col in ipairs(self.columns) do
+		local fw, fh = col.fw, self.fh
+
+		local text = tostring(util.getval(item[col.display_prop or col.sort], item))
+		local color = item.color or {255,255,255}
+		local ss = core.display.newSurface(fw, fh)
+		local sus = core.display.newSurface(fw, fh)
+		local s = core.display.newSurface(fw, fh)
+
+		ss:merge(ls, 0, 0)
+		for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end
+		ss:merge(rs, fw - rs_w, 0)
+		ss:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
+
+		s:erase(0, 0, 0)
+		s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
+
+		sus:merge(l, 0, 0)
+		for i = l_w, fw - r_w do sus:merge(m, i, 0) end
+		sus:merge(r, fw - r_w, 0)
+		sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
+
+		item._tex = item._tex or {}
+		item._stex = item._stex or {}
+		item._sustex = item._sustex or {}
+		item._tex[j] = {s:glTexture()}
+		item._stex[j] = {ss:glTexture()}
+		item._sustex[j] = {sus:glTexture()}
+	end
+end
+
 function _M:generate()
 	self.mouse:reset()
 	self.key:reset()
@@ -69,21 +115,6 @@ function _M:generate()
 	self.max = #self.list
 	self:selectColumn(1, true)
 
-	local ls, ls_w, ls_h = self:getImage("ui/selection-left-sel.png")
-	local ms, ms_w, ms_h = self:getImage("ui/selection-middle-sel.png")
-	local rs, rs_w, rs_h = self:getImage("ui/selection-right-sel.png")
-	local l, l_w, l_h = self:getImage("ui/selection-left.png")
-	local m, m_w, m_h = self:getImage("ui/selection-middle.png")
-	local r, r_w, r_h = self:getImage("ui/selection-right.png")
-
-	local cls, cls_w, cls_h = self:getImage("ui/selection-left-column-sel.png")
-	local cms, cms_w, cms_h = self:getImage("ui/selection-middle-column-sel.png")
-	local crs, crs_w, crs_h = self:getImage("ui/selection-right-column-sel.png")
-	local cl, cl_w, cl_h = self:getImage("ui/selection-left-column.png")
-	local cm, cm_w, cm_h = self:getImage("ui/selection-middle-column.png")
-	local cr, cr_w, cr_h = self:getImage("ui/selection-right-column.png")
-
-
 	local fh = ls_h
 	self.fh = fh
 
@@ -127,41 +158,15 @@ function _M:generate()
 		col._tex, col._tex_w, col._tex_h = s:glTexture()
 		col._stex = ss:glTexture()
 
-		-- Draw the list items
-		for i, item in ipairs(self.list) do
-			local text = tostring(util.getval(item[col.display_prop or col.sort], item))
-			local color = item.color or {255,255,255}
-			local ss = core.display.newSurface(fw, fh)
-			local sus = core.display.newSurface(fw, fh)
-			local s = core.display.newSurface(fw, fh)
-
-			ss:merge(ls, 0, 0)
-			for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end
-			ss:merge(rs, fw - rs_w, 0)
-			ss:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
-
-			s:erase(0, 0, 0)
-			s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
-
-			sus:merge(l, 0, 0)
-			for i = l_w, fw - r_w do sus:merge(m, i, 0) end
-			sus:merge(r, fw - r_w, 0)
-			sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w)
-
-			item._tex = item._tex or {}
-			item._stex = item._stex or {}
-			item._sustex = item._sustex or {}
-			item._tex[j] = {s:glTexture()}
-			item._stex[j] = {ss:glTexture()}
-			item._sustex[j] = {sus:glTexture()}
-		end
-
 		self.mouse:registerZone(colx, 0, col.width, self.fh, function(button, x, y, xrel, yrel, bx, by, event)
 			if button == "left" and event == "button" then self:selectColumn(j) end
 		end)
 		colx = colx + col.width
 	end
 
+	-- Draw the list items
+	for i, item in ipairs(self.list) do self:drawItem(item) end
+
 	-- Add UI controls
 	self.mouse:registerZone(0, self.fh, self.w, self.h - (self.hide_columns and 0 or self.fh), function(button, x, y, xrel, yrel, bx, by, event)
 		if button == "wheelup" and event == "button" then self.scroll = util.bound(self.scroll - 1, 1, self.max - self.max_display + 1)
@@ -202,6 +207,17 @@ function _M:generate()
 	self:onSelect()
 end
 
+function _M:setList(list)
+	self.list = list
+	self.max = #self.list
+	self.sel = util.bound(self.sel, 1, self.max)
+	self.scroll = util.bound(self.scroll, 1, self.max)
+	self.scroll = util.scroll(self.sel, self.scroll, self.max_display)
+	self:selectColumn(1, true)
+
+	for i, item in ipairs(self.list) do self:drawItem(item) end
+end
+
 function _M:onSelect()
 	local item = self.list[self.sel]
 	if not item then return end
@@ -238,7 +254,6 @@ end
 
 function _M:display(x, y)
 	local bx, by = x, y
-
 	for j = 1, #self.columns do
 		local col = self.columns[j]
 		local y = y