diff --git a/address_utils/address_utils.go b/address_utils/address_utils.go
index a1f2730a283e3d640cb7321f48ca34d4dcbd854d..b90563d946ed467dffef1b931563f8140c647c3c 100644
--- a/address_utils/address_utils.go
+++ b/address_utils/address_utils.go
@@ -3,6 +3,7 @@ package address_utils
 import (
 	"crypto/md5"
 	"fmt"
+	"math"
 	"regexp"
 	"strings"
 
@@ -275,3 +276,23 @@ func GetZoneDisplayName(zone string) string {
 
 	return zone
 }
+
+func GetDistanceInKmBetweenCoordinates(lat1 float64, lng1 float64, lat2 float64, lng2 float64) float64 {
+	radlat1 := float64(math.Pi * lat1 / 180)
+	radlat2 := float64(math.Pi * lat2 / 180)
+
+	theta := float64(lng1 - lng2)
+	radtheta := float64(math.Pi * theta / 180)
+
+	dist := math.Sin(radlat1)*math.Sin(radlat2) + math.Cos(radlat1)*math.Cos(radlat2)*math.Cos(radtheta)
+	if dist > 1 {
+		dist = 1
+	}
+
+	dist = math.Acos(dist)
+	dist = dist * 180 / math.Pi
+	dist = dist * 60 * 1.1515
+
+	// Return in kilometers
+	return dist * 1.609344
+}
diff --git a/string_utils/string_utils.go b/string_utils/string_utils.go
index b649cc2d75f2d1991e235b76348d6291d8998335..9b4cafe14ca1760701000f80aa1af10f5eaf6e8a 100644
--- a/string_utils/string_utils.go
+++ b/string_utils/string_utils.go
@@ -151,6 +151,20 @@ func ConcatP(args ...*string) string {
 	return s
 }
 
+// Concat concatenates all specified non-empty strings with ", " separators
+func Concat(args []string, separator string) string {
+	s := ""
+	for _, arg := range args {
+		if arg != "" {
+			if s != "" {
+				s += separator
+			}
+			s += arg
+		}
+	}
+	return s
+}
+
 func ToJSONString(object interface{}) (string, error) {
 	jsonBytes, err := json.Marshal(&object)
 	if err != nil {