diff --git a/src/box/func.cc b/src/box/func.cc
index 21708cb6a0b2945c188ae2e63b0a4714ac43a6d7..73f00a346f9f97d6ea5e97cf23c4da1c054db906 100644
--- a/src/box/func.cc
+++ b/src/box/func.cc
@@ -90,16 +90,16 @@ func_load(struct func *func)
 	 * Extract package name from function name.
 	 * E.g. name = foo.bar.baz, function = baz, package = foo.bar
 	 */
+	const char *sym;
 	const char *package = func->def.name;
-	const char *package_end = NULL;
-	const char *sym = package;
-	while ((sym = strchr(sym, '.')))
-		package_end = sym;
-	if (package_end == NULL) {
+	const char *package_end = strrchr(package, '.');
+	if (package_end != NULL) {
+		/* module.submodule.function => module.submodule, function */
+		sym = package_end + 1;
+	} else {
+		/* package == function => function, function */
 		sym = package;
 		package_end = package + strlen(package);
-	} else {
-		sym = package_end + 1;
 	}
 
 	/* First argument of searchpath: name */
diff --git a/test/app/function1.c b/test/app/function1.c
index b73e500823a27fd7398fd08b153020198ea630da..d0308c662bfe1eb1780a4eafffe0dbc36c2b0216 100644
--- a/test/app/function1.c
+++ b/test/app/function1.c
@@ -1,8 +1,18 @@
 #include "tarantool.h"
+#include <stdio.h>
 
 int
 function1(struct request *request, struct port *port)
 {
 	say_info("-- function1 -  called --");
+	printf("ok - function1\n");
+	return 0;
+}
+
+int
+test(struct request *request, struct port *port)
+{
+	say_info("-- test  -  called --");
+	printf("ok - test\n");
 	return 0;
 }
diff --git a/test/app/function1.result b/test/app/function1.result
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..208183413473d241189f187817cf0d9f79201ca6 100644
--- a/test/app/function1.result
+++ b/test/app/function1.result
@@ -0,0 +1,2 @@
+ok - function1
+ok - test
diff --git a/test/app/function1.test.lua b/test/app/function1.test.lua
index f84ff151a4e5bda83b1701ce0c1a095adbb2e412..f63a02f9ae43c26ccd05db7170439295a649c5f0 100755
--- a/test/app/function1.test.lua
+++ b/test/app/function1.test.lua
@@ -15,8 +15,11 @@ net = require('net.box')
 
 box.schema.func.create('function1', {language = "C"})
 box.schema.user.grant('guest', 'execute', 'function', 'function1')
+box.schema.func.create('function1.test', {language = "C"})
+box.schema.user.grant('guest', 'execute', 'function', 'function1.test')
 
 c = net:new(os.getenv("LISTEN"))
 c:call('function1')
+c:call('function1.test')
 
 os.exit(0)