diff --git a/.gitignore b/.gitignore
index d3d77504cc8a66eafe9c94ecf187cd414d0f7dd0..d3935bdcacc13577fbad33eae5a2fd5c8dc459ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,6 +38,8 @@ doc/www-data.in/_text/download.md
 doc/www-data.in/doc
 extra/rpm.spec
 extra/rpm/tarantool.rpm.spec
+extra/dist/tarantool.service
+extra/dist/tarantool.init
 include/tarantool/config.h
 src/trivia/config.h
 install_manifest.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a3a1c472adcc6ece2c3cc695a351ac94bcbaf0f8..fd8dcac63c3157995fff317ab21ac1cfd1679a50 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,7 @@ include(cmake/compiler.cmake)
 include(cmake/simd.cmake)
 include(cmake/profile.cmake)
 include(cmake/FindReadline.cmake)
+include(cmake/systemd.cmake)
 
 if (NOT READLINE_FOUND)
     message(FATAL_ERROR "readline library not found.")
diff --git a/cmake/rpm.cmake b/cmake/rpm.cmake
index 45e53f85c3cff7444bf25dea17f1f206c036fb7c..d01a879e8a0f194464cab4dfe1141978968d4817 100644
--- a/cmake/rpm.cmake
+++ b/cmake/rpm.cmake
@@ -48,6 +48,13 @@ if (RPMBUILD)
         WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
         )
 
+    add_custom_target(rpm_systemd
+        DEPENDS rpm_src
+        DEPENDS ${RPM_BUILDROOT}
+        COMMAND ${RPMBUILD} --buildroot ${RPM_BUILDROOT} --with systemd --rebuild ${PROJECT_BINARY_DIR}/tarantool-${VERSION}-${RELEASE}.src.rpm
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+        )
+
     add_custom_target(rpm_scl_full_old
         DEPENDS ${RPM_BUILDROOT}
         DEPENDS ${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..c9a052c2e7682ea542985e2f3c54e304e3c03285
--- /dev/null
+++ b/cmake/systemd.cmake
@@ -0,0 +1,17 @@
+find_package(PkgConfig REQUIRED)
+
+pkg_check_modules(SYSTEMD "systemd")
+
+if (SYSTEMD_FOUND AND NOT SYSTEMD_SERVICES_INSTALL_DIR)
+    execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemdsystemunitdir systemd OUTPUT_VARIABLE SYSTEMD_SERVICES_INSTALL_DIR)
+    string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SERVICES_INSTALL_DIR "${SYSTEMD_SERVICES_INSTALL_DIR}")
+endif(SYSTEMD_FOUND AND NOT SYSTEMD_SERVICES_INSTALL_DIR)
+
+if (NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR)
+    message (FATAL_ERROR "Variable SYSTEMD_SERVICES_INSTALL_DIR is defined,")
+    message (FATAL_ERROR "but we can't find systemd using pkg-config")
+endif(NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR)
+
+if (SYSTEMD_FOUND)
+    message(STATUS "SYSTEMD_SERVICES_INSTALL_DIR: ${SYSTEMD_SERVICES_INSTALL_DIR}")
+endif (SYSTEMD_FOUND)
diff --git a/debian/tarantool-common.install b/debian/tarantool-common.install
index 24890c9173c5353c5fa96887bc8104bd5a910c6a..efb24957995f5c378bbbe78b7abdd03380acb169 100644
--- a/debian/tarantool-common.install
+++ b/debian/tarantool-common.install
@@ -1,2 +1,2 @@
 extra/dist/default.deb/tarantool /etc/default
-extra/dist/dist.lua          /usr/lib/tarantool
+extra/dist/dist.lua          /usr/bin/tarantool_ctl
diff --git a/debian/tarantool-common.tarantool.init b/debian/tarantool-common.tarantool.init
index ce760cce966c35d39e90c86ab13f15659d2f4dd7..3e8b3b2b53b0e8fe60186f6b8f5d3c1cf2c657bc 120000
--- a/debian/tarantool-common.tarantool.init
+++ b/debian/tarantool-common.tarantool.init
@@ -1 +1 @@
-../extra/dist/tarantool
\ No newline at end of file
+../extra/dist/tarantool.init
\ No newline at end of file
diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt
index c87cbccffd51f3d31f06a2d3d69afe210f1d9547..44d349ac3f80c7ffff30afc25aa0e51957dba9d9 100644
--- a/extra/CMakeLists.txt
+++ b/extra/CMakeLists.txt
@@ -1,36 +1,4 @@
-#
-# Scripts for a RPM package
-#
-if (ENABLE_RPM)
-	# chmod +x 655
- 	install (FILES dist/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d/
- 		 PERMISSIONS
- 		 OWNER_READ OWNER_WRITE
- 		 GROUP_READ GROUP_EXECUTE
- 		 WORLD_READ WORLD_EXECUTE)
-	install (FILES dist/default.rpm/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/sysconfig/
-		 PERMISSIONS
- 		 OWNER_READ OWNER_WRITE
- 		 GROUP_READ GROUP_EXECUTE
- 		 WORLD_READ WORLD_EXECUTE)
-	install (FILES dist/dist.lua DESTINATION ${CMAKE_INSTALL_LIBDIR}/tarantool/
-		 PERMISSIONS
- 		 OWNER_READ OWNER_WRITE
- 		 GROUP_READ GROUP_EXECUTE
- 		 WORLD_READ WORLD_EXECUTE)
-# 	# chmod +x 755
-# 	install (FILES tarantool_multi.sh DESTINATION bin
-# 		 PERMISSIONS
-# 		 OWNER_READ OWNER_WRITE OWNER_EXECUTE
-# 		 GROUP_READ GROUP_EXECUTE
-# 		 WORLD_READ WORLD_EXECUTE)
-# 	# chmod +x 755
-# 	install (FILES tarantool_deploy.sh DESTINATION bin
-# 		 PERMISSIONS
-# 		 OWNER_READ OWNER_WRITE OWNER_EXECUTE
-# 		 GROUP_READ GROUP_EXECUTE
-# 		 WORLD_READ WORLD_EXECUTE)
-endif()
+add_subdirectory(dist)
 
 configure_file(rpm/tarantool.rpm.spec.in rpm/tarantool.rpm.spec @ONLY)
 
@@ -40,7 +8,7 @@ if (TARGET_OS_DARWIN)
 	# Also cmake doesn't support changing package id from 'com.' to 'org.'
 	# Need chage to 'org.' after update lines this file:
 	# https://github.com/Kitware/CMake/blob/v2.8.11.2/Source/CPack/cmCPackPackageMakerGenerator.cxx#L763
-	# 
+	#
 	# ^^^ DO NOT CHANGE DARWIN_PACKAGE_ID BEFORE SEE URL ABOVE ^^^
 	#
 	set (DARWIN_PACKAGE_ID "com")
diff --git a/extra/dist/CMakeLists.txt b/extra/dist/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..14c372bf5058c9e747df193c55e0bbc938d66adb
--- /dev/null
+++ b/extra/dist/CMakeLists.txt
@@ -0,0 +1,43 @@
+#
+# Scripts for a RPM package
+#
+configure_file("tarantool.init.in" "tarantool.init")
+
+set(SYSV_INITD_PATH ${CMAKE_INSTALL_LIBDIR}/tarantool/tarantool.init)
+configure_file("tarantool.service.in" "tarantool.service")
+
+if (ENABLE_RPM)
+    # chmod +x 655
+    if (SYSTEMD_FOUND AND WITH_SYSTEMD)
+	message (STATUS "Building RPM with SYSTEMD")
+        install (FILES tarantool.service DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR}
+            PERMISSIONS
+            OWNER_READ OWNER_WRITE
+            GROUP_READ GROUP_EXECUTE
+            WORLD_READ WORLD_EXECUTE)
+        install (FILES tarantool.init DESTINATION ${CMAKE_INSTALL_LIBDIR}/tarantool/
+            PERMISSIONS
+            OWNER_READ OWNER_WRITE
+            GROUP_READ GROUP_EXECUTE
+            WORLD_READ WORLD_EXECUTE)
+    else (SYSTEMD_FOUND AND WITH_SYSTEMD)
+	message (STATUS "Building RPM without SYSTEMD")
+        install (FILES tarantool.init DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d/
+            RENAME tarantool
+            PERMISSIONS
+            OWNER_READ OWNER_WRITE
+            GROUP_READ GROUP_EXECUTE
+            WORLD_READ WORLD_EXECUTE)
+    endif(SYSTEMD_FOUND AND WITH_SYSTEMD)
+    install (FILES default.rpm/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/sysconfig/
+	PERMISSIONS
+	OWNER_READ OWNER_WRITE
+	GROUP_READ GROUP_EXECUTE
+	WORLD_READ WORLD_EXECUTE)
+    install (FILES dist.lua DESTINATION ${CMAKE_INSTALL_BINDIR}
+	RENAME tarantool_ctl
+	PERMISSIONS
+	OWNER_READ OWNER_WRITE
+	GROUP_READ GROUP_EXECUTE
+	WORLD_READ WORLD_EXECUTE)
+endif()
diff --git a/extra/dist/default.deb/tarantool b/extra/dist/default.deb/tarantool
index fd29a7260171edfe303a03b96bad98fb2b15201e..b840cda22cfa56a021f1887a464366806d7a0703 100644
--- a/extra/dist/default.deb/tarantool
+++ b/extra/dist/default.deb/tarantool
@@ -3,7 +3,7 @@
 SNAPS=/var/lib/tarantool
 XLOGS=/var/lib/tarantool
 LOGS=/var/log/tarantool
-PIDS=/var/pid/tarantool
+PIDS=/var/run/tarantool
 USERNAME=tarantool
 INSTDIR=/etc/tarantool/instances.enabled
 
diff --git a/extra/dist/default.rpm/tarantool b/extra/dist/default.rpm/tarantool
index fd29a7260171edfe303a03b96bad98fb2b15201e..b840cda22cfa56a021f1887a464366806d7a0703 100644
--- a/extra/dist/default.rpm/tarantool
+++ b/extra/dist/default.rpm/tarantool
@@ -3,7 +3,7 @@
 SNAPS=/var/lib/tarantool
 XLOGS=/var/lib/tarantool
 LOGS=/var/log/tarantool
-PIDS=/var/pid/tarantool
+PIDS=/var/run/tarantool
 USERNAME=tarantool
 INSTDIR=/etc/tarantool/instances.enabled
 
diff --git a/extra/dist/dist.lua b/extra/dist/dist.lua
index 9a5f6be69e1ba9c26d76b20f40e3100afbcadf80..5064686764a969a1ae2122f6b1daf7a57f9af893 100755
--- a/extra/dist/dist.lua
+++ b/extra/dist/dist.lua
@@ -115,6 +115,8 @@ for i = 0, 128 do
     end
 end
 
+local force_cfg_console = fio.pathjoin(cfg.PIDS, instance .. '.control')
+
 local force_cfg = {
     pid_file    = fio.pathjoin(cfg.PIDS, instance .. '.pid'),
     wal_dir     = fio.pathjoin(cfg.XLOGS, instance),
@@ -122,7 +124,6 @@ local force_cfg = {
     snap_dir    = fio.pathjoin(cfg.SNAPS, instance),
     username    = cfg.USERNAME,
     logger      = fio.pathjoin(cfg.LOGS, instance .. '.log'),
-    console     = fio.pathjoin(cfg.PIDS, instance .. '.control'),
     background  = true,
 }
 
@@ -135,8 +136,8 @@ box.cfg = function(cfg)
     end
     local res = orig_cfg(cfg)
 
-    log.info('Run console at %s', force_cfg.console)
-    console.listen(force_cfg.console)
+    log.info('Run console at %s', force_cfg_console)
+    console.listen(force_cfg_console)
     
     return res
 end
diff --git a/extra/dist/tarantool b/extra/dist/tarantool.init.in
similarity index 73%
rename from extra/dist/tarantool
rename to extra/dist/tarantool.init.in
index cccecc2707ddc75c895e4afa7a1007d7141f8621..c6053397e4855b714c0fa2cedd175b23f66834fe 100644
--- a/extra/dist/tarantool
+++ b/extra/dist/tarantool.init.in
@@ -13,22 +13,34 @@
 
 # Author: Dmitry E. Oboukhov <unera@debian.org>
 
-PATH=/sbin:/usr/sbin:/bin:/usr/bin
+PATH=/sbin:/usr/sbin:/bin:/usr/bin:@CMAKE_INSTALL_BINDIR@
 CONF_DIR=/etc/tarantool/instances.enabled
 SCRIPTNAME=/etc/init.d/tarantool
-DAEMON=/usr/bin/tarantool
-INSTANCES=`find $CONF_DIR -xtype f -name '*lua'`
-DIST_LUA=/usr/lib/tarantool/dist.lua
+DAEMON=@CMAKE_INSTALL_BINDIR@/tarantool
+DIST_LUA=@CMAKE_INSTALL_BINDIR@/tarantool_ctl
 
 # Exit if the package is not installed
 [ -x "$DAEMON" ] || exit 0
 
+if [ -e "/lib/init/vars.sh" ]; then
+    . /lib/init/vars.sh
+elif [ -e "/etc/rc.d/init.d/functions" ]; then
+    . /etc/rc.d/init.d/functions
+fi
+
+if [ -e "/etc/sysconfig/tarantool" ]; then
+    . /etc/sysconfig/tarantool
+elif [ -e "/etc/default/tarantool" ]; then
+    . /etc/default/tarantool
+fi
+
+INSTANCES=`find $CONF_DIR -xtype f -name '*lua'`
+
 if test -z "$INSTANCES"; then
     echo "tarantool: There are no instances  (*.lua) in $CONF_DIR"
     exit 0
 fi
 
-
 #
 # Function that starts the daemon/service
 #
@@ -75,10 +87,10 @@ case "$1" in
         do_stop
         do_start
     ;;
-    
+
     *)
-	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
-	exit 3
+    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+    exit 3
     ;;
 esac
 
diff --git a/extra/dist/tarantool.service.in b/extra/dist/tarantool.service.in
new file mode 100644
index 0000000000000000000000000000000000000000..cbcde05810b27e854ff4c5d3422b966415544c8b
--- /dev/null
+++ b/extra/dist/tarantool.service.in
@@ -0,0 +1,36 @@
+# It's not recommended to modify this file in-place, because it will be
+# overwritten during package upgrades. If you want to customize there're
+# number of ways:
+
+# Recommended way:
+# 1) Use "/etc/sysconfig/tarantool" or "/etc/default/tarantool" -
+# They're supported by our start-stop utility - dist.lua
+
+# Usual way for RPM-based distros
+# 2) Create a file "/etc/systemd/system/tarantool.service",
+# containing
+#   .include /usr/lib/systemd/system/tarantool.service
+#   # Here're your changes
+#
+# For example, if you want to change CONF_DIR create
+# "/etc/systemd/system/tarantool.service" containing:
+#   .include /usr/lib/systemd/system/tarantool.service
+#   [Service]
+#   Environment=CONF_DIR=/etc/tarantool/instances.other
+# This will override the settings appearing below
+
+[Unit]
+Description=Tarantool instances
+After=network.target
+Documentation=man:tarantool(1)
+
+[Service]
+Type=forking
+User=tarantool
+Group=tarantool
+OOMScoreAdjust=-1000
+
+ExecStart=@SYSV_INITD_PATH@ start
+ExecStop=@SYSV_INITD_PATH@ stop
+
+TimeoutSec=300
diff --git a/extra/rpm/tarantool.rpm.spec.in b/extra/rpm/tarantool.rpm.spec.in
index 64f7edd8e6a5496b4c2107c53bd0db71b2597e23..0830ca47854be1617762b762e626fc704b061719 100644
--- a/extra/rpm/tarantool.rpm.spec.in
+++ b/extra/rpm/tarantool.rpm.spec.in
@@ -16,6 +16,11 @@
 %bcond_without postgresql
 %bcond_without mysql
 
+%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7
+%global   _with_systemd 1
+%endif
+%bcond_with    systemd
+
 BuildRequires: readline-devel
 
 %if 0%{?rhel} < 7 && 0%{?rhel} > 0
@@ -32,6 +37,20 @@ BuildRequires: binutils-devel
 BuildRequires: perl-podlators
 %endif
 
+Requires(pre): /usr/sbin/useradd
+Requires(pre): /usr/sbin/groupadd
+%if %{with systemd}
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+BuildRequires: systemd
+%else
+Requires(post): chkconfig
+Requires(post): initscripts
+Requires(preun): chkconfig
+Requires(preun): initscripts
+%endif
+
 # Strange bug.
 # Fix according to http://www.jethrocarr.com/2012/05/23/bad-packaging-habits/
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -140,8 +159,22 @@ tarantool-sql-module.
         if rpm.expand("%{with "..obj.."}") then
             status = "ON"
         end
-        return " -D"..flag.."="..status
+        return cmake_key_value(flag, status)
     end
+    local function dev_with_kv (obj, key, value)
+        if rpm.expand("%{with "..obj.."}") then
+            return cmake_key_value(key, value)
+        end
+        return ""
+    end
+    local function dev_without (obj, flag)
+        local status = "ON"
+        if rpm.expand("%{without "..obj.."}") then
+            status = "OFF"
+        end
+        return cmake_key_value(flag, status)
+    end
+
     local cmd = 'cmake'
     if is_rhel_old() then
         cmd = 'cmake28'
@@ -165,6 +198,8 @@ tarantool-sql-module.
         .. ' %{?scl:-DENABLE_RPM_SCL=ON}'
         .. dev_with('postgresql', 'WITH_POSTGRESQL')
         .. dev_with('mysql', 'WITH_MYSQL')
+        .. dev_with('systemd', 'WITH_SYSTEMD')
+        .. dev_with_kv('systemd', 'SYSTEMD_SERVICES_INSTALL_DIR', '%{_unitdir}')
 
     print(wrap_with_toolset(cmd))
 }
@@ -173,16 +208,46 @@ tarantool-sql-module.
     print(wrap_with_toolset('make %{?_smp_mflags}\n'))
 }
 %install
-mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/tarantool/instances.enabled
-make DESTDIR=%{buildroot} install
+make VERBOSE=1 DESTDIR=%{buildroot} install
+
+%pre
+/usr/sbin/groupadd -r tarantool > /dev/null 2>&1 || :
+%if 0%{?rhel} < 6
+/usr/sbin/useradd -M -g tarantool -r -d /var/lib/tarantool -s /sbin/nologin\
+    -c "Tarantool Server" tarantool > /dev/null 2>&1 || :
+%else
+/usr/sbin/useradd -M -N -g tarantool -r -d /var/lib/tarantool -s /sbin/nologin\
+    -c "Tarantool Server" tarantool > /dev/null 2>&1 || :
+%endif
 
 %post
-chkconfig tarantool on
-service tarantool start
+mkdir -m 0755 -p %{_var}/run/tarantool/
+chown tarantool:tarantool %{_var}/run/tarantool/
+mkdir -m 0755 -p %{_var}/log/tarantool/
+chown tarantool:tarantool %{_var}/log/tarantool/
+mkdir -m 0755 -p %{_var}/lib/tarantool/
+chown tarantool:tarantool %{_var}/lib/tarantool/
+mkdir -m 0755 -p %{_sysconfdir}/tarantool/instances.enabled/
+chown tarantool:tarantool %{_sysconfdir}/tarantool/instances.enabled/
+%if %{with systemd}
+%systemd_post tarantool.service
+%else
+chkconfig --add tarantool
+/sbin/service tarantool start
+%endif
 
 %preun
-service tarantool stop
-chkconfig tarantool off
+%if %{with systemd}
+%systemd_preun tarantool.service
+%else
+/sbin/service tarantool stop
+chkconfig --del tarantool
+%endif
+
+# %%postun
+# %%if %%{with systemd}
+# %%systemd_postun_with_restart tarantool.service
+# %%endif
 
 %files
 %defattr(-,root,root,-)
@@ -197,12 +262,16 @@ chkconfig tarantool off
 "%{_mandir}/man1/tarantool.1.gz"
 
 "%{_sysconfdir}/sysconfig/tarantool"
+
+%if %{with systemd}
+"%{_unitdir}/tarantool.service"
+"%{_libdir}/tarantool/tarantool.init"
+%else
 "%{_sysconfdir}/init.d/tarantool"
-%dir "%{_sysconfdir}/tarantool"
-%dir "%{_sysconfdir}/tarantool/instances.enabled"
+%endif
 
 %dir "%{_libdir}/tarantool/"
-"%{_libdir}/tarantool/dist.lua"
+"%{_bindir}/tarantool_ctl"
 
 %files sql-module
 %defattr(-,root,root,-)