diff --git a/Makefile.am b/Makefile.am
index 27cb8bd9ea5fd8d944a0d9a60cfe2338535acced..3c7820a194a394ef5037b211406d362eee109719 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -228,6 +228,7 @@ pkgpython_PYTHON = \
 	lib/objectutils.py \
 	lib/opcodes.py \
 	lib/ovf.py \
+	lib/pathutils.py \
 	lib/qlang.py \
 	lib/query.py \
 	lib/rpc.py \
diff --git a/htools/Ganeti/Runtime.hs b/htools/Ganeti/Runtime.hs
index b6371d3be18623c085d08db9de22aa59224ae56b..7a8acca2b132f7a90a0b7fb1ee34f7912be45e06 100644
--- a/htools/Ganeti/Runtime.hs
+++ b/htools/Ganeti/Runtime.hs
@@ -92,12 +92,11 @@ daemonGroup (ExtraGroup  AdminGroup)    = C.adminGroup
 
 -- | Returns the log file for a daemon.
 daemonLogFile :: GanetiDaemon -> FilePath
-daemonLogFile GanetiConfd = C.daemonsLogfilesGanetiConfd
-daemonLogFile _           = error "Unimplemented"
+daemonLogFile daemon = C.logDir </> daemonName daemon <.> "log"
 
 -- | Returns the pid file name for a daemon.
 daemonPidFile :: GanetiDaemon -> FilePath
-daemonPidFile daemon = C.runGanetiDir </> daemonName daemon <.> "pid"
+daemonPidFile daemon = C.runDir </> daemonName daemon <.> "pid"
 
 -- | All groups list. A bit hacking, as we can't enforce it's complete
 -- at compile time.
diff --git a/lib/backend.py b/lib/backend.py
index 5f7bbb1ec77715dfcf021acf8aef1d3b774132cf..744cac001c4c7878eb67b330a9bd05cd1eb0a9f2 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -2168,7 +2168,7 @@ def DiagnoseOS(top_dirs=None):
   @type top_dirs: list
   @param top_dirs: the list of directories in which to
       search (if not given defaults to
-      L{constants.OS_SEARCH_PATH})
+      L{pathutils.OS_SEARCH_PATH})
   @rtype: list of L{objects.OS}
   @return: a list of tuples (name, path, status, diagnose, variants,
       parameters, api_version) for all (potential) OSes under all
@@ -3538,7 +3538,7 @@ class HooksRunner(object):
 
     @type hooks_base_dir: str or None
     @param hooks_base_dir: if not None, this overrides the
-        L{constants.HOOKS_BASE_DIR} (useful for unittests)
+        L{pathutils.HOOKS_BASE_DIR} (useful for unittests)
 
     """
     if hooks_base_dir is None:
diff --git a/lib/bootstrap.py b/lib/bootstrap.py
index a38296aed02fd20ca9e36d6cc7ec2f22d6bea61b..340b36b245125bc915606278d379a8e41aea4651 100644
--- a/lib/bootstrap.py
+++ b/lib/bootstrap.py
@@ -412,7 +412,7 @@ def InitCluster(cluster_name, mac_prefix, # pylint: disable=R0913, R0914
                                (master_netdev,
                                 result.output.strip()), errors.ECODE_INVAL)
 
-  dirs = [(constants.RUN_GANETI_DIR, constants.RUN_DIRS_MODE)]
+  dirs = [(constants.RUN_DIR, constants.RUN_DIRS_MODE)]
   utils.EnsureDirs(dirs)
 
   objects.UpgradeBeParams(beparams)
diff --git a/lib/constants.py b/lib/constants.py
index 560aac5d05810d73b36cccbe993ec526e35a3854..3d55468c93ed88212e9b078ca43286fa75753d95 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -26,6 +26,8 @@ import socket
 
 from ganeti import _autoconf
 from ganeti import _vcsversion
+from ganeti.pathutils import * # pylint: disable=W0401,W0614
+
 
 # various versions
 RELEASE_VERSION = _autoconf.PACKAGE_VERSION
@@ -129,84 +131,17 @@ WIPE_BLOCK_SIZE = 1024 ** 2
 MAX_WIPE_CHUNK = 1024 # 1GB
 MIN_WIPE_CHUNK_PERCENT = 10
 
-
-# file paths
-DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
-RUN_DIR = _autoconf.LOCALSTATEDIR + "/run"
-RUN_GANETI_DIR = RUN_DIR + "/ganeti"
-BDEV_CACHE_DIR = RUN_GANETI_DIR + "/bdev-cache"
-DISK_LINKS_DIR = RUN_GANETI_DIR + "/instance-disks"
 RUN_DIRS_MODE = 0775
-SOCKET_DIR = RUN_GANETI_DIR + "/socket"
 SECURE_DIR_MODE = 0700
 SECURE_FILE_MODE = 0600
-CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto"
-IMPORT_EXPORT_DIR = RUN_GANETI_DIR + "/import-export"
 ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
-LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
-SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
-# User-id pool lock directory
-# The user-ids that are in use have a corresponding lock file in this directory
-UIDPOOL_LOCKDIR = RUN_GANETI_DIR + "/uid-pool"
-CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
-NODED_CERT_FILE = DATA_DIR + "/server.pem"
-RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
-CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
-SPICE_CERT_FILE = DATA_DIR + "/spice.pem"
-SPICE_CACERT_FILE = DATA_DIR + "/spice-ca.pem"
-CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
-INSTANCE_STATUS_FILE = RUN_GANETI_DIR + "/instance-status"
-SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
-RAPI_USERS_FILE = DATA_DIR + "/rapi/users"
-QUEUE_DIR = DATA_DIR + "/queue"
-DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
-SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh"
-KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup"
-KVM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/kvm-console-wrapper"
-XM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/xm-console-wrapper"
 ETC_HOSTS = "/etc/hosts"
-DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
-DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR
 ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
 ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
-SYSCONFDIR = _autoconf.SYSCONFDIR
-TOOLSDIR = _autoconf.TOOLSDIR
-CONF_DIR = SYSCONFDIR + "/ganeti"
-USER_SCRIPTS_DIR = CONF_DIR + "/scripts"
 ENABLE_CONFD = _autoconf.ENABLE_CONFD
 HS_CONFD = _autoconf.HS_CONFD
 ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
 
-#: Lock file for watcher, locked in shared mode by watcher; lock in exclusive
-# mode to block watcher (see L{cli._RunWhileClusterStoppedHelper.Call}
-WATCHER_LOCK_FILE = LOCK_DIR + "/ganeti-watcher.lock"
-
-#: Status file for per-group watcher, locked in exclusive mode by watcher
-WATCHER_GROUP_STATE_FILE = DATA_DIR + "/watcher.%s.data"
-
-#: File for per-group instance status, merged into L{INSTANCE_STATUS_FILE} by
-#: per-group processes
-WATCHER_GROUP_INSTANCE_STATUS_FILE = DATA_DIR + "/watcher.%s.instance-status"
-
-#: File containing Unix timestamp until which watcher should be paused
-WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"
-
-# Master IP address setup scripts paths (default and user-provided)
-DEFAULT_MASTER_SETUP_SCRIPT = TOOLSDIR + "/master-ip-setup"
-EXTERNAL_MASTER_SETUP_SCRIPT = USER_SCRIPTS_DIR + "/master-ip-setup"
-
-ALL_CERT_FILES = frozenset([
-  NODED_CERT_FILE,
-  RAPI_CERT_FILE,
-  SPICE_CERT_FILE,
-  SPICE_CACERT_FILE,
-  ])
-
-#: LUXI socket used for job execution
-MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
-#: LUXI socket used for queries only
-QUERY_SOCKET = SOCKET_DIR + "/ganeti-query"
-
 NODED = "ganeti-noded"
 CONFD = "ganeti-confd"
 RAPI = "ganeti-rapi"
@@ -232,23 +167,6 @@ DEFAULT_NLD_PORT = DAEMONS_PORTS[NLD][1]
 FIRST_DRBD_PORT = 11000
 LAST_DRBD_PORT = 14999
 
-LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti/"
-DAEMONS_LOGFILES = {
-  # "daemon-name": "logfile"
-  NODED: LOG_DIR + "node-daemon.log",
-  CONFD: LOG_DIR + "conf-daemon.log",
-  RAPI: LOG_DIR + "rapi-daemon.log",
-  MASTERD: LOG_DIR + "master-daemon.log",
-  # used in the ganeti-nbma project
-  NLD: LOG_DIR + "nl-daemon.log",
-  }
-
-LOG_OS_DIR = LOG_DIR + "os"
-LOG_WATCHER = LOG_DIR + "watcher.log"
-LOG_COMMANDS = LOG_DIR + "commands.log"
-LOG_BURNIN = LOG_DIR + "burnin.log"
-LOG_SETUP_SSH = LOG_DIR + "setup-ssh.log"
-
 DEV_CONSOLE = "/dev/console"
 
 PROC_MOUNTS = "/proc/mounts"
@@ -264,9 +182,6 @@ SYSLOG_YES = "yes"
 SYSLOG_ONLY = "only"
 SYSLOG_SOCKET = "/dev/log"
 
-OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
-EXPORT_DIR = _autoconf.EXPORT_DIR
-
 EXPORT_CONF_FILE = "config.ini"
 
 XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
@@ -323,8 +238,6 @@ X509_CERT_CN = "ganeti.example.com"
 
 X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
 
-IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"
-
 # Import/export daemon mode
 IEM_IMPORT = "import"
 IEM_EXPORT = "export"
@@ -360,7 +273,6 @@ VALUE_FALSE = "false"
 EXT_PLUGIN_MASK = re.compile("^[a-zA-Z0-9_-]+$")
 
 # hooks-related constants
-HOOKS_BASE_DIR = CONF_DIR + "/hooks"
 HOOKS_PHASE_PRE = "pre"
 HOOKS_PHASE_POST = "post"
 HOOKS_NAME_CFGUPDATE = "config-update"
@@ -693,11 +605,6 @@ OS_VALIDATE_PARAMETERS = "parameters"
 OS_VALIDATE_CALLS = frozenset([OS_VALIDATE_PARAMETERS])
 
 # ssh constants
-SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
-SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
-SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
-SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
-SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
 SSH = "ssh"
 SCP = "scp"
 
@@ -1193,7 +1100,6 @@ HYPER_TYPES = frozenset([
 HTS_REQ_PORT = frozenset([HT_XEN_HVM, HT_KVM])
 
 VNC_BASE_PORT = 5900
-VNC_PASSWORD_FILE = CONF_DIR + "/vnc-cluster-password"
 VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
 
 # NIC types
@@ -1565,11 +1471,6 @@ NODE_EVAC_MODES = frozenset([
 
 # Job queue
 JOB_QUEUE_VERSION = 1
-JOB_QUEUE_LOCK_FILE = QUEUE_DIR + "/lock"
-JOB_QUEUE_VERSION_FILE = QUEUE_DIR + "/version"
-JOB_QUEUE_SERIAL_FILE = QUEUE_DIR + "/serial"
-JOB_QUEUE_ARCHIVE_DIR = QUEUE_DIR + "/archive"
-JOB_QUEUE_DRAIN_FILE = QUEUE_DIR + "/drain"
 JOB_QUEUE_SIZE_HARD_LIMIT = 5000
 
 JOB_ID_TEMPLATE = r"\d+"
@@ -2128,3 +2029,6 @@ FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
 
 # Do not re-export imported modules
 del re, _vcsversion, _autoconf, socket
+
+# Unintended imports from pathutils (temporary)
+del GetLogFilename
diff --git a/lib/daemon.py b/lib/daemon.py
index 565a18ecb9886e452af7a9109b271faf839a1248..ed5665e1f196d48e78ea356be9e1a1e40fac7efc 100644
--- a/lib/daemon.py
+++ b/lib/daemon.py
@@ -41,6 +41,7 @@ from ganeti import netutils
 from ganeti import ssconf
 from ganeti import runtime
 from ganeti import compat
+from ganeti import pathutils
 
 
 class SchedulerBreakout(Exception):
@@ -778,15 +779,16 @@ def GenericMain(daemon_name, optionparser,
   if check_fn is not None:
     check_fn(options, args)
 
+  log_filename = pathutils.GetLogFilename(daemon_name)
+
   if options.fork:
     utils.CloseFDs()
-    (wpipe, stdio_reopen_fn) = \
-      utils.Daemonize(logfile=constants.DAEMONS_LOGFILES[daemon_name])
+    (wpipe, stdio_reopen_fn) = utils.Daemonize(logfile=log_filename)
   else:
     (wpipe, stdio_reopen_fn) = (None, None)
 
   log_reopen_fn = \
-    utils.SetupLogging(constants.DAEMONS_LOGFILES[daemon_name], daemon_name,
+    utils.SetupLogging(log_filename, daemon_name,
                        debug=options.debug,
                        stderr_logging=not options.fork,
                        multithreaded=multithreaded,
diff --git a/lib/hypervisor/hv_chroot.py b/lib/hypervisor/hv_chroot.py
index 3830f5f6b2af6937521dfcacdb0f4bcb26c06202..991bb7326ba0087bd3b26a5f5fe859ecb6d7c23d 100644
--- a/lib/hypervisor/hv_chroot.py
+++ b/lib/hypervisor/hv_chroot.py
@@ -58,7 +58,7 @@ class ChrootManager(hv_base.BaseHypervisor):
     - instance alive check is based on whether any process is using the chroot
 
   """
-  _ROOT_DIR = constants.RUN_GANETI_DIR + "/chroot-hypervisor"
+  _ROOT_DIR = constants.RUN_DIR + "/chroot-hypervisor"
 
   PARAMETERS = {
     constants.HV_INIT_SCRIPT: (True, utils.IsNormAbsPath,
diff --git a/lib/hypervisor/hv_fake.py b/lib/hypervisor/hv_fake.py
index d2cd9a5d95668f86424a614ce66f97e61e12d3f9..6b7ab72c7e04997b78d70367b3517a1b3015c1d2 100644
--- a/lib/hypervisor/hv_fake.py
+++ b/lib/hypervisor/hv_fake.py
@@ -43,7 +43,7 @@ class FakeHypervisor(hv_base.BaseHypervisor):
   """
   CAN_MIGRATE = True
 
-  _ROOT_DIR = constants.RUN_GANETI_DIR + "/fake-hypervisor"
+  _ROOT_DIR = constants.RUN_DIR + "/fake-hypervisor"
 
   def __init__(self):
     hv_base.BaseHypervisor.__init__(self)
diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py
index f2e08ec5155c7fc25883d7ed22f3798f31e2287f..1ae01e427cb76a33670a16fbe90e17619457284d 100644
--- a/lib/hypervisor/hv_kvm.py
+++ b/lib/hypervisor/hv_kvm.py
@@ -404,7 +404,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
   """
   CAN_MIGRATE = True
 
-  _ROOT_DIR = constants.RUN_GANETI_DIR + "/kvm-hypervisor"
+  _ROOT_DIR = constants.RUN_DIR + "/kvm-hypervisor"
   _PIDS_DIR = _ROOT_DIR + "/pid" # contains live instances pids
   _UIDS_DIR = _ROOT_DIR + "/uid" # contains instances reserved uids
   _CTRL_DIR = _ROOT_DIR + "/ctrl" # contains instances control sockets
diff --git a/lib/hypervisor/hv_lxc.py b/lib/hypervisor/hv_lxc.py
index 70e73846270f65bc351cd7baa0f40d0cd48f541b..49fd77a310f5260e4ad6d762fc01e81f8f74fdc4 100644
--- a/lib/hypervisor/hv_lxc.py
+++ b/lib/hypervisor/hv_lxc.py
@@ -65,7 +65,7 @@ class LXCHypervisor(hv_base.BaseHypervisor):
       notify_on_release and release_agent feature of cgroups
 
   """
-  _ROOT_DIR = constants.RUN_GANETI_DIR + "/lxc"
+  _ROOT_DIR = constants.RUN_DIR + "/lxc"
   _DEVS = [
     "c 1:3",   # /dev/null
     "c 1:5",   # /dev/zero
diff --git a/lib/pathutils.py b/lib/pathutils.py
new file mode 100644
index 0000000000000000000000000000000000000000..738c66196e6d5e41c84b23f7ee607122d8234089
--- /dev/null
+++ b/lib/pathutils.py
@@ -0,0 +1,135 @@
+#
+#
+
+# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+
+"""Module containing constants and functions for filesystem paths.
+
+"""
+
+from ganeti import _autoconf
+
+# Build-time constants
+DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
+DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR
+EXPORT_DIR = _autoconf.EXPORT_DIR
+OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
+SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
+SYSCONFDIR = _autoconf.SYSCONFDIR
+TOOLSDIR = _autoconf.TOOLSDIR
+
+# Paths which don't change for a virtual cluster
+DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
+IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"
+KVM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/kvm-console-wrapper"
+KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup"
+SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh"
+XM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/tools/xm-console-wrapper"
+
+# Top-level paths
+DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
+LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
+LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti"
+RUN_DIR = _autoconf.LOCALSTATEDIR + "/run/ganeti"
+
+#: Script to configure master IP address
+DEFAULT_MASTER_SETUP_SCRIPT = TOOLSDIR + "/master-ip-setup"
+
+SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
+SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
+SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
+SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
+
+BDEV_CACHE_DIR = RUN_DIR + "/bdev-cache"
+DISK_LINKS_DIR = RUN_DIR + "/instance-disks"
+SOCKET_DIR = RUN_DIR + "/socket"
+CRYPTO_KEYS_DIR = RUN_DIR + "/crypto"
+IMPORT_EXPORT_DIR = RUN_DIR + "/import-export"
+INSTANCE_STATUS_FILE = RUN_DIR + "/instance-status"
+#: User-id pool lock directory (used user IDs have a corresponding lock file in
+#: this directory)
+UIDPOOL_LOCKDIR = RUN_DIR + "/uid-pool"
+
+SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
+
+CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
+NODED_CERT_FILE = DATA_DIR + "/server.pem"
+RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
+CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
+SPICE_CERT_FILE = DATA_DIR + "/spice.pem"
+SPICE_CACERT_FILE = DATA_DIR + "/spice-ca.pem"
+CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
+SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
+RAPI_USERS_FILE = DATA_DIR + "/rapi/users"
+QUEUE_DIR = DATA_DIR + "/queue"
+CONF_DIR = SYSCONFDIR + "/ganeti"
+USER_SCRIPTS_DIR = CONF_DIR + "/scripts"
+VNC_PASSWORD_FILE = CONF_DIR + "/vnc-cluster-password"
+HOOKS_BASE_DIR = CONF_DIR + "/hooks"
+
+#: Lock file for watcher, locked in shared mode by watcher; lock in exclusive
+# mode to block watcher (see L{cli._RunWhileClusterStoppedHelper.Call}
+WATCHER_LOCK_FILE = LOCK_DIR + "/ganeti-watcher.lock"
+
+#: Status file for per-group watcher, locked in exclusive mode by watcher
+WATCHER_GROUP_STATE_FILE = DATA_DIR + "/watcher.%s.data"
+
+#: File for per-group instance status, merged into L{INSTANCE_STATUS_FILE} by
+#: per-group processes
+WATCHER_GROUP_INSTANCE_STATUS_FILE = DATA_DIR + "/watcher.%s.instance-status"
+
+#: File containing Unix timestamp until which watcher should be paused
+WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"
+
+#: User-provided master IP setup script
+EXTERNAL_MASTER_SETUP_SCRIPT = USER_SCRIPTS_DIR + "/master-ip-setup"
+
+#: LUXI socket used for job execution
+MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
+#: LUXI socket used for queries only
+QUERY_SOCKET = SOCKET_DIR + "/ganeti-query"
+
+LOG_OS_DIR = LOG_DIR + "/os"
+
+# Job queue paths
+JOB_QUEUE_LOCK_FILE = QUEUE_DIR + "/lock"
+JOB_QUEUE_VERSION_FILE = QUEUE_DIR + "/version"
+JOB_QUEUE_SERIAL_FILE = QUEUE_DIR + "/serial"
+JOB_QUEUE_ARCHIVE_DIR = QUEUE_DIR + "/archive"
+JOB_QUEUE_DRAIN_FILE = QUEUE_DIR + "/drain"
+
+ALL_CERT_FILES = frozenset([
+  NODED_CERT_FILE,
+  RAPI_CERT_FILE,
+  SPICE_CERT_FILE,
+  SPICE_CACERT_FILE,
+  ])
+
+
+def GetLogFilename(daemon_name):
+  """Returns the full path for a daemon's log file.
+
+  """
+  return "%s/%s.log" % (LOG_DIR, daemon_name)
+
+
+LOG_WATCHER = GetLogFilename("watcher")
+LOG_COMMANDS = GetLogFilename("commands")
+LOG_BURNIN = GetLogFilename("burnin")
+LOG_SETUP_SSH = GetLogFilename("setup-ssh")
diff --git a/lib/tools/ensure_dirs.py b/lib/tools/ensure_dirs.py
index 5fdb723651e6be6234e368c9403eacc396fe798b..2daff97d39c6665dffd6494e252d4277ccbefa74 100644
--- a/lib/tools/ensure_dirs.py
+++ b/lib/tools/ensure_dirs.py
@@ -34,6 +34,7 @@ from ganeti import runtime
 from ganeti import ssconf
 from ganeti import utils
 from ganeti import cli
+from ganeti import pathutils
 
 
 (DIR,
@@ -117,10 +118,10 @@ def GetPaths():
 
   """
   getent = runtime.GetEnts()
-  masterd_log = constants.DAEMONS_LOGFILES[constants.MASTERD]
-  noded_log = constants.DAEMONS_LOGFILES[constants.NODED]
-  confd_log = constants.DAEMONS_LOGFILES[constants.CONFD]
-  rapi_log = constants.DAEMONS_LOGFILES[constants.RAPI]
+  masterd_log = pathutils.GetLogFilename(constants.MASTERD)
+  noded_log = pathutils.GetLogFilename(constants.NODED)
+  confd_log = pathutils.GetLogFilename(constants.CONFD)
+  rapi_log = pathutils.GetLogFilename(constants.RAPI)
 
   rapi_dir = os.path.join(constants.DATA_DIR, "rapi")
 
@@ -166,7 +167,7 @@ def GetPaths():
     (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
     (constants.RAPI_USERS_FILE, FILE, 0640, getent.rapi_uid,
      getent.masterd_gid, False),
-    (constants.RUN_GANETI_DIR, DIR, 0775, getent.masterd_uid,
+    (constants.RUN_DIR, DIR, 0775, getent.masterd_uid,
      getent.daemons_gid),
     (constants.SOCKET_DIR, DIR, 0750, getent.masterd_uid,
      getent.daemons_gid),
diff --git a/lib/utils/io.py b/lib/utils/io.py
index 22a2aa5af0f0e90169e1981c03bbf1f817bebb98..0e2f007c1d2f115717495a132212d1bea9c0b14f 100644
--- a/lib/utils/io.py
+++ b/lib/utils/io.py
@@ -903,7 +903,7 @@ def DaemonPidFileName(name):
       daemon name
 
   """
-  return PathJoin(constants.RUN_GANETI_DIR, "%s.pid" % name)
+  return PathJoin(constants.RUN_DIR, "%s.pid" % name)
 
 
 def WritePidFile(pidfile):