diff --git a/src/Dashboard/Components/VillageStateList.vue b/src/Dashboard/Components/VillageStateList.vue
index 4227060..24859c2 100644
--- a/src/Dashboard/Components/VillageStateList.vue
+++ b/src/Dashboard/Components/VillageStateList.vue
@@ -16,10 +16,26 @@
         <template v-for="village in shared.villages">
           <tr class="normal-line top-line">
             <td :class="{ active: village.active }" :title="village.id">{{ village.name }}</td>
-            <td class="right" v-text="village.lumber"></td>
-            <td class="right" v-text="village.clay"></td>
-            <td class="right" v-text="village.iron"></td>
-            <td class="right" v-text="village.crop"></td>
+            <td
+              class="right"
+              v-text="village.lumber"
+              :title="resourceTitle(village.lumber, village.warehouse, village.lumber_hour)"
+            ></td>
+            <td
+              class="right"
+              v-text="village.clay"
+              :title="resourceTitle(village.clay, village.warehouse, village.clay_hour)"
+            ></td>
+            <td
+              class="right"
+              v-text="village.iron"
+              :title="resourceTitle(village.iron, village.warehouse, village.iron_hour)"
+            ></td>
+            <td
+              class="right"
+              v-text="village.crop"
+              :title="resourceTitle(village.crop, village.granary, village.crop_hour)"
+            ></td>
             <td class="right">
               <a :href="warehousePath(village)" v-text="village.warehouse"></a>
             </td>
@@ -77,6 +93,21 @@ export default {
     quartersPath(village) {
       return path('/build.php', { newdid: village.id, gid: 19 });
     },
+    resourceTitle(current, max, speed) {
+      const percent = Math.floor((current / max) * 100);
+      if (speed < 0) {
+        const time = this.fractionalHourToTime(current / speed);
+        return `${current}, ${percent}%, опустеет через ${time}`;
+      } else {
+        const time = this.fractionalHourToTime((max - current) / speed);
+        return `${current}, ${percent}%, заполнится через ${time}`;
+      }
+    },
+    fractionalHourToTime(value) {
+      const hours = Math.floor(value);
+      const minutes = Math.round((value - hours) * 60);
+      return `${hours}:${String(minutes).padStart(2, '0')}`;
+    },
   },
 };
 </script>
diff --git a/src/Page/VillageBlock.ts b/src/Page/VillageBlock.ts
index 3d85503..a22d852 100644
--- a/src/Page/VillageBlock.ts
+++ b/src/Page/VillageBlock.ts
@@ -40,20 +40,8 @@ function grabVillageInfo($el): Village {
     const id = getNumber(parsedHref.query.newdid);
     const name = $el.find('.name').text();
     const active = $el.hasClass('active');
-    const x = getNumber(
-        $el
-            .find('.coordinateX')
-            .text()
-            .replace('−‭', '-')
-            .replace(/[^0-9-]/gi, '')
-    );
-    const y = getNumber(
-        $el
-            .find('.coordinateY')
-            .text()
-            .replace('−‭', '-')
-            .replace(/[^0-9-]/gi, '')
-    );
+    const x = getNumber($el.find('.coordinateX').text());
+    const y = getNumber($el.find('.coordinateY').text());
     return new Village(id, name, active, new Coordinates(x, y));
 }
 
diff --git a/src/utils.ts b/src/utils.ts
index a4ca548..7832798 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -76,7 +76,10 @@ export function* split(n: number) {
 }
 
 export function toNumber(value: any): number | undefined {
-    const converted = Number(value);
+    const normalized = String(value)
+        .replace('−‭', '-')
+        .replace(/[^0-9-]/gi, '');
+    const converted = Number(normalized);
     return isNaN(converted) ? undefined : converted;
 }