diff --git a/installedPlugins/.empty b/installedPlugins/.data/.empty
similarity index 100%
rename from installedPlugins/.empty
rename to installedPlugins/.data/.empty
diff --git a/src/cli/plugin/plugin.js b/src/cli/plugin/plugin.js
index 7c2bce16a773b..4f2cdae726e3b 100644
--- a/src/cli/plugin/plugin.js
+++ b/src/cli/plugin/plugin.js
@@ -5,6 +5,7 @@ const installer = require('./plugin_installer');
 const remover = require('./plugin_remover');
 const lister = require('./plugin_lister');
 const pluginLogger = require('./plugin_logger');
+const getConfig = require('../../server/path').getConfig;
 
 export default function pluginCli(program) {
   function processCommand(command, options) {
@@ -43,7 +44,7 @@ export default function pluginCli(program) {
     .option(
       '-c, --config <path>',
       'Path to the config file',
-      fromRoot('config/kibana.yml')
+      getConfig()
     )
     .option(
       '-t, --timeout <duration>',
diff --git a/src/cli/serve/serve.js b/src/cli/serve/serve.js
index b98f5b28a8e98..683a530117861 100644
--- a/src/cli/serve/serve.js
+++ b/src/cli/serve/serve.js
@@ -5,6 +5,7 @@ let { resolve } = require('path');
 let cwd = process.cwd();
 let src = require('requirefrom')('src');
 let fromRoot = src('utils/fromRoot');
+const getConfig = require('../../server/path').getConfig;
 
 let canCluster;
 try {
@@ -35,7 +36,7 @@ module.exports = function (program) {
   .option(
     '-c, --config <path>',
     'Path to the config file, can be changed with the CONFIG_PATH environment variable as well',
-    process.env.CONFIG_PATH || fromRoot('config/kibana.yml'))
+    getConfig())
   .option('-p, --port <port>', 'The port to bind to', parseInt)
   .option('-q, --quiet', 'Prevent all logging except errors')
   .option('-Q, --silent', 'Prevent all logging')
diff --git a/src/server/config/schema.js b/src/server/config/schema.js
index dc11a8ed6b1c5..daaa8a1da2853 100644
--- a/src/server/config/schema.js
+++ b/src/server/config/schema.js
@@ -6,6 +6,7 @@ let path = require('path');
 let utils = require('requirefrom')('src/utils');
 let fromRoot = utils('fromRoot');
 const randomBytes = require('crypto').randomBytes;
+const getData = require('../path').getData;
 
 module.exports = () => Joi.object({
   pkg: Joi.object({
@@ -84,6 +85,10 @@ module.exports = () => Joi.object({
     initialize: Joi.boolean().default(true)
   }).default(),
 
+  path: Joi.object({
+    data: Joi.string().default(getData())
+  }).default(),
+
   optimize: Joi.object({
     enabled: Joi.boolean().default(true),
     bundleFilter: Joi.string().default('!tests'),
diff --git a/src/server/path/__tests__/index.js b/src/server/path/__tests__/index.js
new file mode 100644
index 0000000000000..c709df29dc0e3
--- /dev/null
+++ b/src/server/path/__tests__/index.js
@@ -0,0 +1,15 @@
+import expect from 'expect.js';
+import path from '../';
+import { accessSync, R_OK} from 'fs';
+
+describe('Default path finder', function () {
+  it('should find a kibana.yml', () => {
+    const configPath = path.getConfig();
+    expect(() => accessSync(configPath, R_OK)).to.not.throwError();
+  });
+
+  it('should find a data directory', () => {
+    const dataPath = path.getData();
+    expect(() => accessSync(dataPath, R_OK)).to.not.throwError();
+  });
+});
diff --git a/src/server/path/index.js b/src/server/path/index.js
new file mode 100644
index 0000000000000..15ca518055632
--- /dev/null
+++ b/src/server/path/index.js
@@ -0,0 +1,31 @@
+import { accessSync, R_OK} from 'fs';
+import { find } from 'lodash';
+import fromRoot from '../../utils/fromRoot';
+
+const CONFIG_PATHS = [
+  process.env.CONFIG_PATH,
+  fromRoot('config/kibana.yml')
+].filter(Boolean);
+
+const DATA_PATHS = [
+  process.env.DATA_PATH,
+  fromRoot('installedPlugins/.data'),
+  '/var/lib/kibana'
+].filter(Boolean);
+
+function findFile(paths) {
+  const availablePath = find(paths, configPath => {
+    try {
+      accessSync(configPath, R_OK);
+      return true;
+    } catch (e) {
+      //Check the next path
+    }
+  });
+  return availablePath || paths[0];
+}
+
+export default {
+  getConfig: () => findFile(CONFIG_PATHS),
+  getData: () => findFile(DATA_PATHS)
+};
diff --git a/tasks/build/installedPlugins.js b/tasks/build/installedPlugins.js
index 7d8d6618ff488..5d2fcc4d4ed37 100644
--- a/tasks/build/installedPlugins.js
+++ b/tasks/build/installedPlugins.js
@@ -1,5 +1,6 @@
 module.exports = function (grunt) {
   grunt.registerTask('_build:installedPlugins', function () {
     grunt.file.mkdir('build/kibana/installedPlugins');
+    grunt.file.mkdir('build/kibana/installedPlugins/.data');
   });
 };
diff --git a/tasks/build/osPackages.js b/tasks/build/osPackages.js
index 963bb85cf6a2d..4532ccb302b33 100644
--- a/tasks/build/osPackages.js
+++ b/tasks/build/osPackages.js
@@ -42,7 +42,10 @@ export default (grunt) => {
         '--template-value', `user=${config.user}`,
         '--template-value', `group=${config.group}`,
         '--template-value', `optimizeDir=${config.path.home}/optimize`,
-        '--template-value', `pluginsDir=${config.path.plugins}`
+        '--template-value', `pluginsDir=${config.path.plugins}`,
+        '--template-value', `dataDir=${config.path.data}`,
+        //uses relative path to --prefix, strip the leading /
+        '--exclude', `${config.path.home.slice(1)}/installedPlugins/.data`
       ];
       const debOptions = [
         '-t', 'deb',
@@ -54,6 +57,7 @@ export default (grunt) => {
       ];
       const args = [
         `${buildDir}/=${config.path.home}/`,
+        `${buildDir}/installedPlugins/.data/=${config.path.data}/`,
         `${servicesByName.sysv.outputDir}/etc/=/etc/`,
         `${servicesByName.systemd.outputDir}/lib/=/lib/`
       ];
diff --git a/tasks/build/package_scripts/post_install.sh b/tasks/build/package_scripts/post_install.sh
index beef49af21753..bc31f19f19953 100644
--- a/tasks/build/package_scripts/post_install.sh
+++ b/tasks/build/package_scripts/post_install.sh
@@ -15,3 +15,5 @@ if ! user_check "<%= user %>" ; then
   user_create "<%= user %>"
 fi
 chown -R <%= user %>:<%= group %> <%= optimizeDir %>
+chown <%= user %>:<%= group %> <%= dataDir %>
+chown <%= user %>:<%= group %> <%= pluginsDir %>
diff --git a/tasks/build/package_scripts/post_remove.sh b/tasks/build/package_scripts/post_remove.sh
index 5c2858e34ad3f..4e33c25aaa767 100644
--- a/tasks/build/package_scripts/post_remove.sh
+++ b/tasks/build/package_scripts/post_remove.sh
@@ -55,4 +55,8 @@ if [ "$REMOVE_DIRS" = "true" ]; then
   if [ -d "<%= pluginsDir %>" ]; then
     rm -rf "<%= pluginsDir %>"
   fi
+
+  if [ -d "<%= dataDir %>" ]; then
+    rmdir --ignore-fail-on-non-empty "<%= dataDir %>"
+  fi
 fi
diff --git a/tasks/config/packages.js b/tasks/config/packages.js
index 66226e938df50..d7fa93c4f62f5 100644
--- a/tasks/config/packages.js
+++ b/tasks/config/packages.js
@@ -14,6 +14,7 @@ export default (grunt) => {
 
   const FOLDER_CONFIG = '/opt/kibana/config';
   const FOLDER_HOME = '/opt/kibana';
+  const FOLDER_DATA = '/var/lib/kibana';
   const FOLDER_PLUGINS = `${FOLDER_HOME}/installedPlugins`;
 
   const FILE_KIBANA_CONF = `${FOLDER_CONFIG}/kibana.yml`;
@@ -43,6 +44,7 @@ export default (grunt) => {
     version: VERSION,
     path: {
       conf: FOLDER_CONFIG,
+      data: FOLDER_DATA,
       plugins: FOLDER_PLUGINS,
       home: FOLDER_HOME,
       kibanaBin: FILE_KIBANA_BINARY,