diff --git a/bsnes/phoenix/windows/widget/list-view.cpp b/bsnes/phoenix/windows/widget/list-view.cpp
index 5c401af..96fb244 100644
--- a/bsnes/phoenix/windows/widget/list-view.cpp
+++ b/bsnes/phoenix/windows/widget/list-view.cpp
@@ -6,6 +6,24 @@ unsigned ListView_GetColumnCount(HWND hwnd) {
   return --count;
 }
 
+int ListView_GetImageIndex(HWND hwnd, unsigned row, unsigned column) {
+  LVITEM item;
+  item.mask = LVIF_IMAGE;
+  item.iItem = row;
+  item.iSubItem = column;
+  ListView_GetItem(hwnd, &item);
+  return item.iImage;
+}
+
+int ListView_SetImageIndex(HWND hwnd, unsigned row, unsigned column, int index) {
+  LVITEM item;
+  item.mask = LVIF_IMAGE;
+  item.iItem = row;
+  item.iSubItem = column;
+  item.iImage = index;
+  return ListView_SetItem(hwnd, &item);
+}
+
 void pListView::append(const lstring &list) {
   wchar_t empty[] = L"";
   unsigned row = ListView_GetItemCount(hwnd);
@@ -42,12 +60,24 @@ void pListView::modify(unsigned row, const lstring &list) {
 }
 
 void pListView::remove(unsigned row) {
+  unsigned columns = ListView_GetColumnCount(hwnd);
+  unsigned rows = ListView_GetItemCount(hwnd);
+  for(unsigned column = 0; column < columns; column++) {
+    int index = ListView_GetImageIndex(hwnd,row,column);
+    ImageList_Remove(imageList,index);
+    for(unsigned r = 0; r < rows; r++) {
+      for(unsigned c = 0; c < columns; c++) {
+        int oldIndex = ListView_GetImageIndex(hwnd,r,c);
+        if(oldIndex > index) ListView_SetImageIndex(hwnd,r,c,oldIndex - 1);
+      }
+    }
+  }
   ListView_DeleteItem(hwnd, row);
-  setImageList();
 }
 
 void pListView::reset() {
   ListView_DeleteAllItems(hwnd);
+  setImageList();
 }
 
 bool pListView::selected() {
@@ -103,7 +133,28 @@ void pListView::setHeaderVisible(bool visible) {
 }
 
 void pListView::setImage(unsigned row, unsigned column, const image &image) {
-  setImageList();
+  int index = ListView_GetImageIndex(hwnd,row,column);
+
+  HBITMAP bitmap;
+
+  if(image.empty()) {
+    nall::image emptyImage;
+    emptyImage.allocate(15, 15);
+    emptyImage.clear(GetSysColor(COLOR_WINDOW));
+    bitmap = CreateBitmap(emptyImage);
+  } else {
+    nall::image newImage = image;
+    newImage.transform(0, 32, 255u << 24, 255u << 16, 255u << 8, 255u << 0);
+    newImage.scale(15, 15, Interpolation::Linear);
+    bitmap = CreateBitmap(newImage);
+  }
+  if(index > 0) {
+    ImageList_Replace(imageList,index,bitmap, NULL);
+  } else {
+    int index = ImageList_Add(imageList, bitmap, NULL);
+    ListView_SetImageIndex(hwnd,row,column,index);
+  }
+  DeleteObject(bitmap);
 }
 
 void pListView::setSelected(bool selected) {
@@ -159,56 +210,17 @@ void pListView::setGeometry(const Geometry &geometry) {
 }
 
 void pListView::setImageList() {
-  auto &list = listView.state.image;
-
   if(imageList) {
     ImageList_Destroy(imageList);
     imageList = nullptr;
   }
-
-  bool found = false;
-  for(auto &row : listView.state.image) {
-    for(auto &column : row) {
-      if(column.empty() == false) {
-        found = true;
-        break;
-      }
-    }
-  }
-  if(found == false) return;
-
   imageList = ImageList_Create(15, 15, ILC_COLOR32, 1, 20);
+  ListView_SetImageList(hwnd, imageList, LVSIL_SMALL);
+
   nall::image image;
   image.allocate(15, 15);
   image.clear(GetSysColor(COLOR_WINDOW));
   HBITMAP bitmap = CreateBitmap(image);
   ImageList_Add(imageList, bitmap, NULL);
   DeleteObject(bitmap);
-
-  for(unsigned row = 0; row < list.size(); row++) {
-    for(unsigned column = 0; column < list(row).size(); column++) {
-      nall::image image = list(row)(column);
-      if(image.empty()) continue;
-      image.transform(0, 32, 255u << 24, 255u << 16, 255u << 8, 255u << 0);
-      image.scale(15, 15, Interpolation::Linear);
-      HBITMAP bitmap = CreateBitmap(image);
-      ImageList_Add(imageList, bitmap, NULL);
-      DeleteObject(bitmap);
-    }
-  }
-
-  ListView_SetImageList(hwnd, imageList, LVSIL_SMALL);
-
-  unsigned ID = 1;
-  for(unsigned row = 0; row < list.size(); row++) {
-    for(unsigned column = 0; column < list(row).size(); column++) {
-      if(list(row)(column).empty()) continue;  //I_IMAGENONE does not work properly
-      LVITEM item;
-      item.mask = LVIF_IMAGE;
-      item.iItem = row;
-      item.iSubItem = column;
-      item.iImage = ID++;
-      ListView_SetItem(hwnd, &item);
-    }
-  }
 }
