diff --git a/src/lua/swim.lua b/src/lua/swim.lua
index dcb4968e242d63642454cbaa8ff38bfd236db986..d3d6b01e97cb27f993506dadb232572e2f619d1f 100644
--- a/src/lua/swim.lua
+++ b/src/lua/swim.lua
@@ -338,7 +338,11 @@ end
 --
 local function swim_member_payload_str(m)
     local ptr = swim_check_member(m, 'member:payload_str()')
-    return ffi.string(swim_member_payload_raw(ptr))
+    local cdata, size = swim_member_payload_raw(ptr)
+    if size > 0 then
+        return ffi.string(swim_member_payload_raw(ptr))
+    end
+    return nil
 end
 
 --
@@ -367,7 +371,7 @@ local function swim_member_payload(m)
     local cdata, size = swim_member_payload_raw(ptr)
     local ok, result
     if size == 0 then
-        result = ''
+        result = nil
     else
         ok, result = pcall(msgpack.decode, cdata, size)
         if not ok then
diff --git a/test/swim/swim.result b/test/swim/swim.result
index 53a7cc6a4044d0645a4b093446035fa0ead39db9..dffacd999b5fabfe33a1f9f229b7ed00a6dfb663 100644
--- a/test/swim/swim.result
+++ b/test/swim/swim.result
@@ -429,11 +429,11 @@ s:payload_cdata()
 ...
 s:payload_str()
 ---
-- 
+- null
 ...
 s:payload()
 ---
-- 
+- null
 ...
 s:is_dropped()
 ---
@@ -536,7 +536,7 @@ s:set_payload()
 ...
 self:payload()
 ---
-- 
+- null
 ...
 s:set_payload({a = 100})
 ---
@@ -603,7 +603,7 @@ s:set_payload()
 ...
 self:payload()
 ---
-- 
+- null
 ...
 s:set_payload(100)
 ---
@@ -619,7 +619,7 @@ s:set_payload_raw()
 ...
 self:payload()
 ---
-- 
+- null
 ...
 -- Raw payload setting can be used when MessagePack is not needed,
 -- or already encoded.
@@ -724,7 +724,7 @@ s1_view = s2:member_by_uuid(uuid(1))
 ...
 s1_view:payload()
 ---
-- 
+- null
 ...
 s1_view:incarnation()
 ---
@@ -878,7 +878,7 @@ s1_self:payload() == p
 ---
 - true
 ...
-while s1_view:payload() == '' do fiber.sleep(0.01) end
+while not s1_view:payload() do fiber.sleep(0.01) end
 ---
 ...
 p = s1_view:payload()
diff --git a/test/swim/swim.test.lua b/test/swim/swim.test.lua
index b43160cc470dad2135918badd4f0182c5dc894c2..081d89b3a7f19c3e53e14daa9fe8b0428252a462 100644
--- a/test/swim/swim.test.lua
+++ b/test/swim/swim.test.lua
@@ -284,7 +284,7 @@ s1:set_payload({a = 100})
 p = s1_self:payload()
 s1_self:payload() == p
 
-while s1_view:payload() == '' do fiber.sleep(0.01) end
+while not s1_view:payload() do fiber.sleep(0.01) end
 p = s1_view:payload()
 s1_view:payload() == p