diff --git a/src/lua/swim.lua b/src/lua/swim.lua
index 4893d57678e493e60803fded9f157a5fa01bd4eb..adb102d06c7a084b175dfdd0321a66718631dea7 100644
--- a/src/lua/swim.lua
+++ b/src/lua/swim.lua
@@ -391,7 +391,15 @@ end
 -- metatable, serialization, string conversions etc.
 --
 local function swim_member_uuid(m)
-    return capi.swim_member_uuid(swim_check_member(m, 'member:uuid()'))
+    local ptr = swim_check_member(m, 'member:uuid()')
+    local u = m.u
+    if not u then
+        ptr = capi.swim_member_uuid(ptr)
+        u = ffi.new('struct tt_uuid')
+        ffi.copy(u, ptr, ffi.sizeof('struct tt_uuid'))
+        rawset(m, 'u', u)
+    end
+    return u
 end
 
 local function swim_member_serialize(m)
diff --git a/test/swim/swim.result b/test/swim/swim.result
index 436d4e57929a0dfe1be2d705fe48ca1d7dcdf243..5696d984bb1ed5abf641431d661548bfea5bfece 100644
--- a/test/swim/swim.result
+++ b/test/swim/swim.result
@@ -403,6 +403,10 @@ s:uuid()
 ---
 - 00000000-0000-1000-8000-000000000001
 ...
+s:uuid() == s:uuid()
+---
+- true
+...
 s:uri()
 ---
 - 127.0.0.1:<port>
diff --git a/test/swim/swim.test.lua b/test/swim/swim.test.lua
index a3eac9b460d1fcf14cc5ba6e49688e7353885c3c..44376e3dba4dfe0dd6768edcc9ff60e5ae7944ec 100644
--- a/test/swim/swim.test.lua
+++ b/test/swim/swim.test.lua
@@ -137,6 +137,7 @@ s = s1:self()
 s
 s:status()
 s:uuid()
+s:uuid() == s:uuid()
 s:uri()
 s:incarnation()
 s:payload_cdata()