diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt
index 62c354c8f7544f6af83be1a59e81c5fb8cca9b58..9c973f4741757791cce0f3d39348c736b6cfa3ca 100644
--- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt
+++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt
@@ -16,6 +16,7 @@ import space.rethelyi.mosogepsch.model.data.MosogepSchDatabase
 import space.rethelyi.mosogepsch.network.Api
 import space.rethelyi.mosogepsch.notification.createNotificationChannel
 import space.rethelyi.mosogepsch.view.*
+import java.util.*
 
 class MainActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -40,6 +41,7 @@ class MainActivity : ComponentActivity() {
 fun MosogepSCH() {
     var rooms by remember { mutableStateOf(listOf<LaundryRoom>()) }
     var error by remember { mutableStateOf(false) }
+    var lastRequestTime by remember { mutableStateOf<Date?>(null) }
     val coroutineScope = rememberCoroutineScope()
 
     val ctx = LocalContext.current
@@ -48,11 +50,13 @@ fun MosogepSCH() {
     suspend fun reload() {
         try {
             val tmprooms = Api.getLaundryRooms()
+            lastRequestTime = Date()
             for (room in tmprooms) {
                 room.machines.forEach {
                     it.last_query_time = room.last_query_time
                     it.floorId = room.id.toString()
                 }
+                room.machines = room.machines.sortedBy { it.kind_of }
                 room.toDb(ctx)
             }
             rooms = tmprooms
@@ -62,7 +66,9 @@ fun MosogepSCH() {
             val list = db.dao.getAllLaundryRoom()
             val oldRooms: MutableList<LaundryRoom> = mutableListOf()
             list.forEach { element ->
-                oldRooms.add(element.toLaundryRoom(ctx))
+                val floor = element.toLaundryRoom(ctx)
+                floor.machines = floor.machines.sortedBy { it.kind_of }
+                oldRooms.add(floor)
             }
             rooms = oldRooms
         }
@@ -71,8 +77,12 @@ fun MosogepSCH() {
     if (rooms.isEmpty()) {
         LoadingScreen()
     } else {
-        MainScreen(rooms, error) {
-            coroutineScope.launch { reload() }
+        MainScreen(rooms, error, lastRequestTime) {
+            coroutineScope.launch {
+                it.isRefreshing = true
+                reload()
+                it.isRefreshing = false
+            }
         }
     }
 
diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt
index 8bf8ffd2dbbc99fbac5056d0df532fbb6431447f..b346ae3f832a0c6fa80e73e22d234c462c2bc7a2 100644
--- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt
+++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt
@@ -34,7 +34,7 @@ fun AppBar(internet: Boolean) {
             if (!internet) {
                 Icon(
                     painter = painterResource(R.drawable.cloud_off),
-                    contentDescription = "no internet connection"
+                    contentDescription = stringResource(R.string.no_internet)
                 )
             }
         },
diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt
index 21afcb4feafed5dc58c9a4cb1fa1149c538f1074..298521d144c679435d87344672cfc7077b4a54f5 100644
--- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt
+++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt
@@ -13,9 +13,10 @@ import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import space.rethelyi.mosogepsch.R
 import space.rethelyi.mosogepsch.model.Machine
+import java.util.*
 
 @Composable
-fun FloorListItem(floor: Floor) {
+fun FloorListItem(floor: Floor, lastRequestTime: Date?) {
     val modifier = Modifier.fillMaxWidth()
     Card(
         modifier = modifier,
@@ -41,7 +42,8 @@ fun FloorListItem(floor: Floor) {
                     for(machine in floor.machines) {
                         MachineOnFloorView(
                             machine = machine,
-                            modifier = Modifier.weight(1f)
+                            modifier = Modifier.weight(1f),
+                            lastRequestTime = lastRequestTime
                         )
                     }
                 }
diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt
index 2df1dc8caf93e8772f16122b262329224e27e8cb..d94574a79fdd22b664576565b8b7ef6094a862f4 100644
--- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt
+++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt
@@ -12,9 +12,12 @@ import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
 import space.rethelyi.mosogepsch.R
 import space.rethelyi.mosogepsch.model.Machine
+import java.time.Instant
+import java.time.LocalDateTime
+import java.util.*
 
 @Composable
-fun MachineOnFloorView(machine: Machine, modifier: Modifier) {
+fun MachineOnFloorView(machine: Machine, modifier: Modifier, lastRequestTime: Date?) {
     val context = LocalContext.current
     Card(
         modifier = modifier
@@ -25,7 +28,15 @@ fun MachineOnFloorView(machine: Machine, modifier: Modifier) {
                     intent.putExtra("machine", machine)
                     context.startActivity(intent)
                 }),
-        color = if (machine.status == 1) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary,
+        color = when {
+            machine.last_query_time.isLostInSpace(lastRequestTime) -> {
+                MaterialTheme.colorScheme.background
+            }
+            machine.status == 1 -> {
+                MaterialTheme.colorScheme.error
+            }
+            else -> MaterialTheme.colorScheme.primary
+        },
     ) {
         Column(
             modifier = Modifier
@@ -56,3 +67,11 @@ fun MachineOnFloorView(machine: Machine, modifier: Modifier) {
         }
     }
 }
+
+const val spaceThreshold = 10*60*1000 // 10 minutes
+
+fun Date.isLostInSpace(lastRequestTime: Date?) : Boolean {
+    if (lastRequestTime == null) return false
+    val diff = lastRequestTime.time - this.time
+    return diff > spaceThreshold
+}
\ No newline at end of file
diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt
index b6a51465c0fa3cff4321050f443130b880467afc..619da5329da73d7c27febd4f9c5af695456a8569 100644
--- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt
+++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt
@@ -16,10 +16,11 @@ import androidx.compose.ui.unit.dp
 import com.google.accompanist.swiperefresh.SwipeRefresh
 import com.google.accompanist.swiperefresh.SwipeRefreshState
 import space.rethelyi.mosogepsch.model.LaundryRoom
+import java.util.*
 
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, reload: (swipe: SwipeRefreshState) -> Unit) {
+fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, lastRequestTime: Date?, reload: (swipe: SwipeRefreshState) -> Unit) {
     val isRefreshing by remember { mutableStateOf(SwipeRefreshState(!error)) }
     Scaffold(
         topBar = { AppBar(!error) }
@@ -42,7 +43,8 @@ fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, reload: (swipe: SwipeRe
                             floor = Floor(
                                 id = it.id,
                                 machines = it.machines
-                            )
+                            ),
+                            lastRequestTime = lastRequestTime
                         )
                     }
                 )
diff --git a/frontend/app/src/main/res/values-hu/strings.xml b/frontend/app/src/main/res/values-hu/strings.xml
index bb1a7b9b10c665640cc2df2ad8da65ae97515d2c..38d650730861f87538f3b5528c5b9f63c82969fa 100644
--- a/frontend/app/src/main/res/values-hu/strings.xml
+++ b/frontend/app/src/main/res/values-hu/strings.xml
@@ -16,4 +16,5 @@
     <string name="unsub_fail">Sikertelen leiratkozás</string>
     <string name="title">%1$s. emeleti %2$s</string>
     <string name="notification_msg">A %1$s. emeleti %2$s %3$s lett.</string>
+    <string name="no_internet">nincs internet kapcsolat</string>
 </resources>
\ No newline at end of file
diff --git a/frontend/app/src/main/res/values/strings.xml b/frontend/app/src/main/res/values/strings.xml
index d81072b3c10cbaa5be0aef32e4bd19139a20f0ef..b9e3cab918072257bbe8e29c09d765bda8bea7f6 100644
--- a/frontend/app/src/main/res/values/strings.xml
+++ b/frontend/app/src/main/res/values/strings.xml
@@ -18,4 +18,5 @@
     <string name="unsub_fail">Failed to unsubscribe</string>
     <string name="title">%2$s on floor %1$s</string>
     <string name="notification_msg">The %2$s on floor %1$s became %3$s</string>
+    <string name="no_internet">no internet connection</string>
 </resources>
\ No newline at end of file