diff --git a/src/lua/box_net_box.lua b/src/lua/box_net_box.lua
index 9c629d262b1a19abb5f9520379203060089d0753..43f9764c71d61e874bfb9bdd8974ad6c02d3ce90 100644
--- a/src/lua/box_net_box.lua
+++ b/src/lua/box_net_box.lua
@@ -8,6 +8,7 @@ local errno = require 'errno'
 local ffi = require 'ffi'
 local digest = require 'digest'
 local yaml = require 'yaml'
+local urilib = require 'uri'
 
 -- packet codes
 local OK                = 0
@@ -347,6 +348,32 @@ local remote_methods = {
             setmetatable(self, getmetatable(remote))
         end
 
+
+        -- uri as the first argument
+        if opts == nil then
+            opts = {}
+            if type(port) == 'table' then
+                opts = port
+                port = nil
+            end
+
+            if port == nil then
+                
+                local address = urilib.parse(tostring(host))
+                if address == nil or address.service == nil then
+                    box.error(box.error.PROC_LUA,
+                        "usage: remote:new(uri[, opts] | host, port[, opts])")
+                end
+
+                host = address.host
+                port = address.service
+
+                opts.user = address.login or opts.user
+                opts.password = address.password or opts.password
+            end
+        end
+
+
         self.is_instance = true
         self.host = host
         self.port = port
diff --git a/test/box/box.net.box.result b/test/box/box.net.box.result
index 0515000fc8adb7c36aa5133744079dd09e70b81b..b7bd596ad36dcc9b7ff460699d2a67be2ed4e253 100644
--- a/test/box/box.net.box.result
+++ b/test/box/box.net.box.result
@@ -141,7 +141,7 @@ cn.space.net_box_test_space:insert{234, 1,2,3}
 ...
 cn.space.net_box_test_space.insert{234, 1,2,3}
 ---
-- error: 'builtin/net.box.lua:228: Use space:method(...) instead space.method(...)'
+- error: 'builtin/net.box.lua:229: Use space:method(...) instead space.method(...)'
 ...
 cn.space.net_box_test_space:replace{354, 1,2,3}
 ---
@@ -603,3 +603,34 @@ remote.self.call('console_test')
 ---
 - error: 'usage: remote:call(proc_name, ...)'
 ...
+-- uri as the first argument
+uri = string.format('%s:%s@%s:%s', 'netbox', 'test', LISTEN.host, LISTEN.service)
+---
+...
+cn = remote.new(uri)
+---
+...
+cn:ping()
+---
+- true
+...
+cn:close()
+---
+...
+uri = string.format('%s@%s:%s', 'netbox', LISTEN.host, LISTEN.service)
+---
+...
+remote.new(uri)
+---
+- error: 'net.box: password is not defined'
+...
+cn = remote.new(uri, { password = 'test' })
+---
+...
+cn:ping()
+---
+- true
+...
+cn:close()
+---
+...
diff --git a/test/box/box.net.box.test.lua b/test/box/box.net.box.test.lua
index 97c4f6015a41c62da5084ccae64139a6bb4fd97b..e1b7396b052abe0e74b7ac37f9759e8433b61377 100644
--- a/test/box/box.net.box.test.lua
+++ b/test/box/box.net.box.test.lua
@@ -238,3 +238,17 @@ cn.ping()
 remote.self:call('console_test')
 remote.self.call('console_test')
 
+
+-- uri as the first argument
+uri = string.format('%s:%s@%s:%s', 'netbox', 'test', LISTEN.host, LISTEN.service)
+
+cn = remote.new(uri)
+cn:ping()
+cn:close()
+
+uri = string.format('%s@%s:%s', 'netbox', LISTEN.host, LISTEN.service)
+remote.new(uri)
+cn = remote.new(uri, { password = 'test' })
+cn:ping()
+cn:close()
+