diff --git a/app/src/main/java/com/example/gpswifitracker/MainActivity.kt b/app/src/main/java/com/example/gpswifitracker/MainActivity.kt
index e6dc6c4b07d19dced7c2f41bed4cf3b59847964f..cb803b16c25ef9a3bcff2b4aeb0f4dbc5024ecab 100644
--- a/app/src/main/java/com/example/gpswifitracker/MainActivity.kt
+++ b/app/src/main/java/com/example/gpswifitracker/MainActivity.kt
@@ -12,6 +12,12 @@ import kotlinx.android.synthetic.main.activity_main.*
 import mumayank.com.airlocationlibrary.AirLocation
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
+import androidx.core.app.ComponentActivity
+import androidx.core.app.ComponentActivity.ExtraData
+import androidx.core.content.ContextCompat.getSystemService
+import android.icu.lang.UCharacter.GraphemeClusterBreak.T
+
+
 
 
 class MainActivity : AppCompatActivity() {
@@ -55,13 +61,15 @@ class MainActivity : AppCompatActivity() {
                             currentLocation = Location(location.latitude, location.longitude)
                             var wifiString = ""
                             var wifiLocations: MutableList<WifiLocation> = ArrayList()
-                            var bestLevel = -100
+                            var bestDistance = Double.MAX_VALUE
                             wifiManager?.scanResults?.forEach {
-                                val level = WifiManager.calculateSignalLevel(it.level, 5)
-                                wifiString += "\n" + it.BSSID + ": " + it.SSID + ": " + level
-                                wifiLocations.add(WifiLocation(it.timestamp, it.BSSID, it.SSID, it.level, location.latitude, location.longitude))
-                                if (bestLevel < it.level) {
-                                    bestLevel = it.level
+                                //val level = WifiManager.calculateSignalLevel(it.level, 5)
+                                //https://stackoverflow.com/a/18359639 - constant used returns meters
+                                val distance = Math.pow(10.0, (27.55 - 20 * Math.log10(it.frequency.toDouble()) + Math.abs(it.level)) / 20.0)
+                                wifiString += "\n" + it.BSSID + ": " + it.SSID + ": " + distance
+                                wifiLocations.add(WifiLocation(it.timestamp, it.BSSID, it.SSID, it.level, it.frequency, distance, location.latitude, location.longitude))
+                                if (bestDistance > distance) {
+                                    bestDistance = distance
                                     closestBSSID = it.BSSID
                                 }
                             }
diff --git a/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt b/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt
index 31229bffebb92270e41b1771122a43c66f58bf91..dd80f9e6e6175e9844c168ba926d80e1bfdff650 100644
--- a/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt
+++ b/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt
@@ -11,6 +11,8 @@ data class WifiLocation(
     @ColumnInfo(name = "bssid") @NonNull val bssid: String,
     @ColumnInfo(name = "ssid") @NonNull val ssid: String,
     @ColumnInfo(name = "level") @NonNull val level: Int,
+    @ColumnInfo(name = "frequency") @NonNull val frequency: Int,
+    @ColumnInfo(name = "distance") @NonNull val distance: Double,
     @ColumnInfo(name = "latitude") @NonNull val latitude: Double,
     @ColumnInfo(name = "longitude") @NonNull val longitude: Double
 )
diff --git a/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt b/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt
index 6e407706f01c73f67163ad4bd29bbcfbe0fb4607..d7669cf84127116f4f5d95168e1f35bde35b4517 100644
--- a/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt
+++ b/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt
@@ -21,8 +21,7 @@ interface WifiLocationDao {
     @Query("SELECT * FROM wifilocation WHERE bssid IN (:bssids)")
     suspend fun findLocationsBySSID(bssids: List<String>): List<WifiLocation>
 
-    //TODO: improve algorithm
-    @Query("SELECT latitude, longitude FROM wifilocation WHERE bssid = :bssid ORDER BY level DESC, date DESC LIMIT 1")
+    @Query("SELECT latitude, longitude FROM wifilocation WHERE bssid = :bssid ORDER BY distance DESC, date DESC LIMIT 1")
     suspend fun findBestLocationBySSID(bssid: String): Location
 
     @Insert