diff --git a/stack/monitor/buildout.cfg b/stack/monitor/buildout.cfg
index 4996e68688be880f544bc9293026f9c038b79df8..f61794cf388a7a28ecb5d98a17e0e4f4ab44bd7d 100644
--- a/stack/monitor/buildout.cfg
+++ b/stack/monitor/buildout.cfg
@@ -26,12 +26,6 @@ download-only = true
 url = ${:_profile_base_location_}/${:filename}
 mode = 0644
 
-[monitor-web-base]
-<= monitor-download-base
-url = ${:_profile_base_location_}/web/${:filename}
-destination = ${buildout:parts-directory}/monitor-web
-on-update = true
-
 [monitor-template-base]
 <= monitor-download-base
 url = ${:_profile_base_location_}/templates/${:filename}
@@ -61,14 +55,9 @@ eggs =
 # Monitor templates files
 [monitor-httpd-conf]
 <= monitor-template-base
-md5sum = 65cf2c8f5cfffa509ec3fc06b37e7509
+md5sum = 40dc51fc156f1ad7eb94be7f3cbf08b4
 filename = monitor-httpd.conf.in
 
-[monitor-service-conf-template]
-<= monitor-template-base
-filename = monitor-service.cfg.in
-md5sum = 5913d2a0096b50537f394a49b762b3e5
-
 [monitor-template-wrapper]
 <= monitor-template-base
 filename = wrapper.in
@@ -100,7 +89,7 @@ recipe = slapos.recipe.template:jinja2
 filename = template-monitor.cfg
 template = ${:_profile_base_location_}/instance-monitor.cfg.jinja2.in
 rendered = ${buildout:directory}/template-monitor.cfg
-md5sum = 9d6f50e616655c1ae11ace419ac2861e  
+md5sum = 7ac78495de73cadafea87f97428e487f
 context =
     key apache_location apache:location
     key gzip_location gzip:location
@@ -111,13 +100,11 @@ context =
     raw monitor_https_cors ${monitor-httpd-cors:location}/${monitor-httpd-cors:filename}
     raw monitor_instance_info ${monitor-instance-info:location}/${monitor-instance-info:filename}
     raw monitor_globalstate ${monitor-globalstate:location}/${monitor-globalstate:filename}
-    raw monitor_password_promise_template ${monitor-password-promise:location}/${monitor-password-promise:filename}
     raw curl_executable_location ${curl:location}/bin/curl
     raw dash_executable_location ${dash:location}/bin/dash
     raw dcron_executable_location ${dcron:location}/sbin/crond
     raw logrotate_executable_location ${logrotate:location}/usr/sbin/logrotate
     raw monitor_httpd_template ${monitor-httpd-conf:location}/${monitor-httpd-conf:filename}
-    raw monitor_service_conf_template ${monitor-service-conf-template:location}/${monitor-service-conf-template:filename}
     raw openssl_executable_location ${openssl:location}/bin/openssl
     raw python_executable ${buildout:executable}
     raw python_with_eggs ${buildout:directory}/bin/${extra-eggs:interpreter}
@@ -131,31 +118,26 @@ depends =
 [monitor2-bin]
 <= monitor-template-script
 filename = monitor.py
-md5sum = 280412f9024030c8cae343c2b07e5130
+md5sum = 5525e7445dab16fd03f4eeccf069b74b
 
 [run-promise-py]
 recipe = slapos.recipe.template:jinja2
 template = ${:_profile_base_location_}/scripts/run-promise.py
 rendered = ${buildout:parts-directory}/monitor-scripts/run-promise.py
-md5sum = 641c6917bbd19a7abaebb120ccd4e713
+md5sum = 97148dfbb730cc4f55ed54513ce823e0
 mode = 0755
 context =
   raw python ${buildout:directory}/bin/${extra-eggs:interpreter}
 
-[monitor-password-promise]
-<= monitor-template-script
-filename = monitor-password-promise.py
-md5sum = f7e937d6619eb674f39f34718928d91d
-
 [status2rss-executable]
 <= monitor-template-script
 filename = status2rss.py
-md5sum = f297779d0881f4bd48081506efb492a4
+md5sum = 88e3bf955e1e4eac76a444d50fa4f020
 
 [monitor-globalstate]
 <= monitor-template-script
 filename = globalstate.py
-md5sum = 1ebead4480d62d5e1d2612c2d9f4e1d8
+md5sum = 3377e325baa4ecfcd6eee06945fb69fc
 
 [monitor-collect]
 <= monitor-template-script
@@ -165,12 +147,5 @@ md5sum = 78fbcb56761315bde354fe7914d3c54f
 [monitor-document-edit]
 <= monitor-template-script
 filename = monitor-document.py
-md5sum = f3e557e5d81291a22d6d2837a9e37bd0
+md5sum = 399ff4939b55ff74e6d48bec5a495981
 
-
-[make-rss-script]
-recipe = slapos.recipe.template
-url = ${:_profile_base_location_}/make-rss.sh.in
-md5sum = 98c8f6fd81e405b0ad10db07c3776321
-output = ${buildout:directory}/template-make-rss.sh.in
-mode = 0644
diff --git a/stack/monitor/instance-monitor.cfg.jinja2.in b/stack/monitor/instance-monitor.cfg.jinja2.in
index 7b392579a4ed455f9da2430fb4d32b102c956447..176aebba3404d6d554bebf1c2c20d009da12b911 100644
--- a/stack/monitor/instance-monitor.cfg.jinja2.in
+++ b/stack/monitor/instance-monitor.cfg.jinja2.in
@@ -78,13 +78,8 @@ public = ${directory:monitor}/public
 private = ${directory:monitor}/private
 services = ${directory:services}
 services-conf = ${directory:etc}/monitor.conf.d
-www = ${directory:monitor}/web
-web-dir = ${directory:monitor}/web
 log = ${directory:log}/monitor
 monitor-var = ${directory:var}/monitor
-monitor-password-var = ${monitor-directory:monitor-var}/password
-monitor-password-interface = ${monitor-directory:monitor-password-var}/password/interface
-monitor-status2rss-var = ${monitor-directory:monitor-var}/status2rss
 
 [logrotate-directory]
 recipe = slapos.cookbook:mkdirectory
@@ -135,7 +130,6 @@ public-folder = ${monitor-directory:public}
 private-folder = ${monitor-directory:private}
 webdav-folder = ${monitor-directory:webdav}
 report-folder = ${monitor-directory:reports}
-web-folder = ${monitor-directory:web-dir}
 base-url = ${monitor-instance-parameter:monitor-base-url}
 monitor-hal-json = ${monitor-directory:public}/monitor.hal.json
 service-pid-folder = ${monitor-directory:pids}
@@ -230,7 +224,6 @@ password = ${monitor-instance-parameter:password}
 listening-ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
 port = ${monitor-instance-parameter:monitor-httpd-port}
 pid-file = ${directory:run}/monitor-httpd.pid
-cgid-pid-file = ${directory:run}/cgid.pid
 access-log = ${monitor-directory:log}/monitor-httpd-access.log
 error-log = ${monitor-directory:log}/monitor-httpd-error.log
 cert-file = ${ca-directory:certs}/httpd.crt
@@ -279,7 +272,7 @@ command = kill -USR1 $(cat ${monitor-httpd-conf-parameter:pid-file})
 [monitor-status2rss-wrapper]
 recipe = slapos.cookbook:wrapper
 # XXX - hard-coded Urls
-command-line = {{ python_with_eggs }} {{ status2rss_executable_path }} --output '${monitor-directory:public}/feed' --items_folder '${monitor-directory:public}' --public_url '${monitor-conf-parameters:base-url}/share/jio_public/' --private_url '${monitor-conf-parameters:base-url}/share/jio_private/' --instance_name '${monitor-conf-parameters:title}' --hosting_name '${monitor-conf-parameters:root-title}'
+command-line = {{ python_with_eggs }} {{ status2rss_executable_path }} --output '${monitor-directory:public}/feed' --items_folder '${monitor-directory:public}'  --feed_url '${monitor-conf-parameters:base-url}/public/feed' --public_url '${monitor-conf-parameters:base-url}/share/jio_public/' --private_url '${monitor-conf-parameters:base-url}/share/jio_private/' --instance_name '${monitor-conf-parameters:title}' --hosting_name '${monitor-conf-parameters:root-title}'
 
 wrapper-path = ${directory:bin}/monitor-status2rss.py
 
@@ -324,45 +317,6 @@ check-secure = 1
 dash_path = {{ dash_executable_location }}
 curl_path = {{ curl_executable_location }}
 
-[monitor-httpd-promise-conf]
-recipe = slapos.recipe.template:jinja2
-rendered = ${directory:monitor-promise}/${monitor-httpd-promise:filename}.cfg
-template = {{ monitor_service_conf_template }}
-mode = 0644
-context = section parameter_dict monitor-httpd-promise-conf-parameter
-
-[monitor-httpd-promise-conf-parameter]
-title = Monitor httpd listening
-# frequency 5 minute hour day mounth weekday
-frequency = */5 * * * *
-public-path-list = ${monitor-httpd-conf-parameter:access-log} ${monitor-httpd-conf-parameter:error-log}
-#private-path-list =
-
-[monitor-password-parameter]
-password-changed-once-path = ${directory:var}/monitor-password-changed-once
-
-[monitor-password-promise]
-recipe = slapos.recipe.template:jinja2
-template = {{ monitor_password_promise_template }}
-rendered = ${directory:monitor-promise}/${:filename}
-filename = monitor-password
-mode = 0755
-context =
-  raw python_executable {{ python_executable }}
-  key password_changed_once_path monitor-password-parameter:password-changed-once-path
-
-[monitor-password-promise-conf-parameter]
-title = Monitor password
-frequency = */5 * * * *
-private-path-list = ${monitor-directory:monitor-password-interface}
-
-[monitor-password-promise-conf]
-recipe = slapos.recipe.template:jinja2
-template = {{ monitor_service_conf_template }}
-rendered = ${directory:monitor-promise}/${monitor-password-promise:filename}.cfg
-mode = 0644
-context = section parameter_dict monitor-password-promise-conf-parameter
-
 [publish]
 # XXX depends on monitor-base section
 monitor-base-url = ${monitor-base:base-url}
@@ -376,6 +330,7 @@ monitor-httpd-ipv6 = ${slap-configuration:ipv6-random}
 monitor-httpd-port = 8196
 # XXX - Set monitor-base-url = ${monitor-httpd-conf-parameter:url} => https://[ipv6]:port
 monitor-base-url = ${monitor-frontend-promise:url}
+# monitor-base-url = ${monitor-httpd-conf-parameter:url}
 root-instance-title = ${slap-configuration:root-instance-title}
 monitor-url-list =
 cors-domains = monitor.app.officejs.com 
@@ -390,6 +345,8 @@ instance-configuration =
 
 configuration-file-path = ${monitor-directory:etc}/monitor_knowledge0.cfg
 
+interface-url = https://monitor.app.officejs.com
+
 [monitor-frontend]
 <= slap-connection
 recipe = slapos.cookbook:requestoptional
@@ -427,7 +384,6 @@ depends =
   ${monitor-httpd-promise:filename}
   ${monitor-status2rss-cron-entry:name}
 
-#[buildout]
-#parts =
-#  monitor-base
-#  publish
+[monitor-publish]
+monitor-base-url = ${publish:monitor-base-url}
+monitor-setup-url = ${monitor-instance-parameter:interface-url}/#page=settings_configurator&url=${publish:monitor-url}&username=$${publish:monitor-user}&password=${publish:monitor-password}
diff --git a/stack/monitor/make-rss.sh.in b/stack/monitor/make-rss.sh.in
deleted file mode 100644
index d84092ce8d32b61903a490b890b4fa495c853522..0000000000000000000000000000000000000000
--- a/stack/monitor/make-rss.sh.in
+++ /dev/null
@@ -1,8 +0,0 @@
-#!${dash-output:dash}
-
-STATUS_DB={{ monitor_parameters['db-path'] }}
-RSS_FILE={{ monitor_parameters['rss-path'] }}
-PYTHON=${buildout:directory}/bin/${extra-eggs:interpreter}
-STATUS2RSS=${rss-bin:location}/${rss-bin:filename}
-
-$PYTHON $STATUS2RSS "Monitoring RSS feed" "{{ monitor_parameters['url'] }}/{{ monitor_parameters['index-filename'] }}" $STATUS_DB > $RSS_FILE
diff --git a/stack/monitor/scripts/globalstate.py b/stack/monitor/scripts/globalstate.py
index 18070ec773636fe89849e23e2c84e32c97e64d23..a42b216323bba31d6b450bc0fc4c1a2a80df3307 100644
--- a/stack/monitor/scripts/globalstate.py
+++ b/stack/monitor/scripts/globalstate.py
@@ -53,6 +53,8 @@ def main(args_list):
   statistic_folder = os.path.join(base_folder, 'data', '.jio_documents')
   parameter_file = os.path.join(base_folder, 'config', '.jio_documents', 'config.json')
 
+  report_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+
   if not os.path.exists(statistic_folder):
     try:
       os.makedirs(statistic_folder)
@@ -66,7 +68,6 @@ def main(args_list):
       glob.glob("%s/*.status.json" % status_folder)
     )
   error = warning = success = 0
-  latest_date = ''
   status = 'OK'
   promise_list = []
   global_state_file = os.path.join(base_folder, 'monitor.global.json')
@@ -84,18 +85,13 @@ def main(args_list):
       success += 1
     elif tmp_json['status'] == 'WARNING':
       warning += 1
-    if tmp_json['start-date'] > latest_date:
-      latest_date = tmp_json['start-date']
     tmp_json['time'] = tmp_json['start-date'].split(' ')[1]
-    del tmp_json['start-date']
     promise_list.append(tmp_json)
 
   if error:
     status = 'ERROR'
   elif warning:
     status = 'WARNING'
-  if not latest_date:
-    latest_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
 
   global_state_dict = dict(
       status=status,
@@ -105,7 +101,7 @@ def main(args_list):
         'warning': warning,
       },
       type='global',
-      date=latest_date,
+      date=report_date,
       _links={"rss_url": {"href": "%s/public/feed" % base_url},
               "public_url": {"href": "%s/share/jio_public/" % base_url},
               "private_url": {"href": "%s/share/jio_private/" % base_url}
@@ -150,7 +146,7 @@ def main(args_list):
   # Public information with the link to private folder
   public_state_dict = dict(
     status=status,
-    date=latest_date,
+    date=report_date,
     _links={'monitor': {'href': '%s/share/jio_private/' % base_url}},
     title=global_state_dict.get('title', '')
   )
diff --git a/stack/monitor/scripts/monitor-document.py b/stack/monitor/scripts/monitor-document.py
index 4d52d6b02db1f984106d527eb2ef6af3032ceeff..4aa9ed181691db7dea59574dd3957283e59941e3 100644
--- a/stack/monitor/scripts/monitor-document.py
+++ b/stack/monitor/scripts/monitor-document.py
@@ -63,7 +63,10 @@ def httpdCorsDomainWrite(httpd_cors_file, httpd_gracefull_bin, cors_domain):
     try:
       with open(old_httpd_cors_file, 'r') as cors_file:
         if cors_file.read() == cors_domain:
-          return True
+          if os.path.exists(httpd_cors_file) and (os.stat(httpd_cors_file).st_size > 0
+            or (cors_domain == "" and os.stat(httpd_cors_file).st_size == 0)):
+            # Skip if cors file is not empty
+            return True
     except OSError, e:
       print "Failed to open file at %s. \n%s" % (old_httpd_cors_file, str(e))
   for domain in cors_domain_list:
diff --git a/stack/monitor/scripts/monitor-password-promise.py b/stack/monitor/scripts/monitor-password-promise.py
deleted file mode 100644
index 1853b6d65bd37146dcc8f8381d142f5a8d34a597..0000000000000000000000000000000000000000
--- a/stack/monitor/scripts/monitor-password-promise.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python
-
-password_changed_once_path = "{{ password_changed_once_path }}"
-
-import os
-
-def main():
-  if os.path.exists(password_changed_once_path):
-    print('{"status":"OK"}')
-    return 0
-  print('{"status":"BAD","message":"Password never changed"}')
-  return 1
-
-if __name__ == "__main__":
-  exit(main())
diff --git a/stack/monitor/scripts/monitor.py b/stack/monitor/scripts/monitor.py
index ea45f4f540c94f9e9de789cf5aecbb5e488c08ed..d02806e5b2b5527578fd32a79d627c0750ffff46 100644
--- a/stack/monitor/scripts/monitor.py
+++ b/stack/monitor/scripts/monitor.py
@@ -8,10 +8,9 @@ import json
 import ConfigParser
 import traceback
 import argparse
-import time
-import glob
 import urllib2
 import ssl
+import glob
 from datetime import datetime
 
 OPML_START = """<?xml version="1.0" encoding="UTF-8"?>
@@ -39,24 +38,6 @@ def parseArguments():
   parser.add_argument('--config_file',
                       default='monitor.cfg',
                       help='Monitor Configuration file')
-  parser.add_argument('--promise-folder',
-                      action='append', dest='promise_folder_list',
-                      default=[],
-                      help='The path to get promise executable files')
-
-  parser.add_argument('--public-folder',
-                      action='append', dest='public_folder',
-                      help='The path of public folder. All files in this folders will have public acess')
-
-  parser.add_argument('--private-folder',
-                      action='append', dest='private_folder',
-                      help='The path of private folder. All files in this folders will be accessible with password')
-
-  parser.add_argument('--promise-runner',
-                      help='The path of promise runner, use to run promise files')
-
-  parser.add_argument('--wrapper-path',
-                      help='Path of monitor generated promise scripts files.')
 
   return parser.parse_args()
 
@@ -75,6 +56,13 @@ def softConfigGet(config, *args, **kwargs):
   except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
     return None
 
+def createSymlink(source, destination):
+  try:
+    os.symlink(source, destination)
+  except OSError, e:
+    if e.errno != os.errno.EEXIST:
+      raise
+
 class Monitoring(object):
 
   def __init__(self, configuration_file):
@@ -199,14 +187,6 @@ class Monitoring(object):
         self.promise_dict[filename] = {"path": path,
                                   "configuration": ConfigParser.ConfigParser()}
 
-    # get promises configurations
-    #for filename in os.listdir(monitor_promise_folder):
-    #  path = os.path.join(monitor_promise_folder, filename)
-    #  if os.path.isfile(path) and filename[-4:] == ".cfg":
-    #    promise_name = filename[:-4]
-    #    if promise_name in promise_dict:
-    #      loadConfig([path], promise_dict[promise_name]["configuration"])
-
   def createSymlinksFromConfig(self, destination_folder, source_path_list, name=""):
     if destination_folder:
       if source_path_list:
@@ -277,32 +257,30 @@ class Monitoring(object):
     jio_private = os.path.join(self.webdav_folder, 'jio_private')
     mkdirAll(jio_public)
     mkdirAll(jio_private)
-    try:
-      os.symlink(self.public_folder, os.path.join(jio_public, '.jio_documents'))
-    except OSError, e:
-      if e.errno != os.errno.EEXIST:
-        raise
-    try:
-      os.symlink(self.private_folder, os.path.join(jio_private, '.jio_documents'))
-    except OSError, e:
-      if e.errno != os.errno.EEXIST:
-        raise
+
+    createSymlink(self.public_folder,
+                  os.path.join(jio_public, '.jio_documents'))
+    createSymlink(self.private_folder,
+                  os.path.join(jio_private, '.jio_documents'))
 
     self.data_folder = os.path.join(self.private_folder, 'data', '.jio_documents')
+    self.document_folder = os.path.join(self.private_folder, 'documents')
     config_folder = os.path.join(self.config_folder, '.jio_documents')
+
     mkdirAll(self.data_folder)
     mkdirAll(config_folder)
-    try:
-      os.symlink(os.path.join(self.private_folder, 'data'),
+
+    createSymlink(os.path.join(self.private_folder, 'data'),
                   os.path.join(jio_private, 'data'))
-    except OSError, e:
-      if e.errno != os.errno.EEXIST:
-        raise
-    try:
-      os.symlink(self.config_folder, os.path.join(jio_private, 'config'))
-    except OSError, e:
-      if e.errno != os.errno.EEXIST:
-        raise
+    createSymlink(self.config_folder, os.path.join(jio_private, 'config'))
+    createSymlink(self.data_folder, self.document_folder)
+
+    # Cleanup private folder
+    for file in glob.glob("%s/*.history.json" % self.private_folder):
+      try:
+        os.unlink(file)
+      except OSError:
+        print "failed to remove file %s. Ignoring..." % file
 
   def makeConfigurationFiles(self):
     config_folder = os.path.join(self.config_folder, '.jio_documents')
@@ -352,12 +330,12 @@ class Monitoring(object):
     opml_content += OPML_OUTLINE_FEED % {'title': self.title,
         'html_url': self.public_url + '/feed',
         'xml_url': self.public_url + '/feed',
-        'global_url': "%s/jio_public/" % self.webdav_url}
+        'global_url': "%s/jio_private/" % self.webdav_url}
     for feed_url in feed_url_list:
       opml_content += OPML_OUTLINE_FEED % {'title': self.getMonitorTitleFromUrl(feed_url + "/share/jio_public/"),
         'html_url': feed_url + '/public/feed',
         'xml_url': feed_url + '/public/feed',
-        'global_url': "%s/share/jio_public/" % feed_url}
+        'global_url': "%s/share/jio_private/" % feed_url}
 
     opml_content += OPML_END
 
@@ -376,37 +354,6 @@ class Monitoring(object):
     with open(file_path, 'w') as flog:
       flog.write(content)
 
-  def generateMonitorHalJson(self):
-    monitor_link_dict = {"webdav": {"href": self.webdav_url},
-                          "public": {"href": "%s/public" % self.webdav_url},
-                          "private": {"href": "%s/private" % self.webdav_url},
-                          "rss": {"href": "%s/feed" % self.public_url},
-                          "jio_public": {"href": "%s/jio_public/" % self.webdav_url},
-                          "jio_private": {"href": "%s/jio_private/" % self.webdav_url}
-                        }
-    if self.title:
-      self.monitor_dict["title"] = self.title
-    if self.monitor_url_list:
-      monitor_link_dict["related_monitor"] = [{"href": url}
-                                  for url in self.monitor_url_list]
-    self.monitor_dict["_links"] = monitor_link_dict
-    if self.promise_items:
-      service_list = []
-      for service_name, promise in self.promise_items:
-        service_config = promise["configuration"]
-        tmp = softConfigGet(service_config, "service", "title")
-        service_dict = {}
-        service_dict["id"] = service_name
-        service_dict["_links"] = {"status": {"href": "%s/public/%s.status.json" % (self.webdav_url, service_name)}}  # hardcoded
-        if tmp:
-          service_dict["title"] = tmp
-        service_list.append(service_dict)
-
-      self.monitor_dict["_embedded"] = {"service": service_list}
-
-    with open(self.monitor_hal_json, "w") as fp:
-      json.dump(self.monitor_dict, fp)
-
   def generateReportCronEntries(self):
     cron_line_list = []
 
@@ -429,7 +376,7 @@ class Monitoring(object):
           '--promise_script "%s"' % report_script,
           '--promise_name "%s"' % report_name,
           '--monitor_url "%s/jio_private/"' % self.webdav_url, # XXX hardcoded,
-          '--history_folder "%s"' % self.report_folder,
+          '--history_folder "%s"' % self.data_folder,
           '--instance_name "%s"' % self.title,
           '--hosting_name "%s"' % self.root_title,
           '--promise_type "report"']
@@ -484,11 +431,6 @@ class Monitoring(object):
       if service_name in service_name_list:
         service_name_list.pop(service_name_list.index(service_name))
 
-      """wrapper_path = os.path.join(self.wraper_folder, service_name)
-      with open(wrapper_path, "w") as fp:
-        fp.write("#!/bin/sh\n%s" % command)  # XXX hardcoded, use dash, sh or bash binary!
-      os.chmod(wrapper_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IROTH )"""
-
     if service_name_list != []:
       # XXX Some service was removed, delete his status file so monitor will not consider his status anymore
       for service_name in service_name_list:
@@ -532,10 +474,6 @@ class Monitoring(object):
                                       private_path_list.split(),
                                       service_name)
 
-    # generate monitor.json
-    self.monitor_dict = {}
-    self.generateMonitorHalJson()
-
     # Generate OPML file
     self.generateOpmlFile(self.monitor_url_list,
       os.path.join(self.public_folder, 'feeds'))
@@ -551,11 +489,13 @@ class Monitoring(object):
 
     # Rotate monitor data files
     option_list = [
-      'daily', 'nocreate', 'noolddir', 'rotate 5',
+      'daily', 'nocreate', 'olddir %s' % self.data_folder, 'rotate 5',
       'nocompress', 'extension .json', 'dateext',
       'dateformat -%Y-%m-%d', 'notifempty'
     ]
-    file_list = ["%s/*.data.json" % self.data_folder]
+    file_list = [
+      "%s/*.data.json" % self.private_folder,
+      "%s/*.data.json" % self.data_folder]
     self.generateLogrotateEntry('monitor.data', file_list, option_list)
 
     # Rotate public history status file, delete data of previous days
diff --git a/stack/monitor/scripts/rsstoopml.py b/stack/monitor/scripts/rsstoopml.py
deleted file mode 100644
index 30aa2cefa9f07f7ee954eef05516b26883dbe6ea..0000000000000000000000000000000000000000
--- a/stack/monitor/scripts/rsstoopml.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-
-import json
-import os
-import time
-from datetime import datetime
-
-OPML_START = """<?xml version="1.0" encoding="UTF-8"?>
-<!-- OPML generated by SlapOS -->
-<opml version="1.1">
-	<head>
-		<title>SlapOS Monitoring Status Lists</title>
-		<dateCreated>%(creation_date)s</dateCreated>
-		<dateModified>%(mondification_date)s</dateModified>
-	</head>
-	<body>
-	  <outline text="%(outline_title)s">"""
-OPML_END = """	  </outline>
-  </body>
-</opml>"""
-
-OPML_OUTLINE_FEED = '<outline text="%(title)s" title="%(title)s" type="rss" version="RSS" htmlUrl="%(html_url)s" xmlUrl="%(xml_url)s" />'
-
-def main(config_file, output_file):
-  feed_url_list = []
-  if os.path.exists(output_file):
-    creation_date = datetime.fromtimestamp(os.path.getctime(output_file)).utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000")
-    modification_date = datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000")
-  else:
-    creation_date = modification_date = datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000")
-  with open(config_file, 'r') as fconfig:
-    feed_url_list = json.loads(fconfig.read())
-
-  opml_content = OPML_START
-
-	for feed_line in feed_url_list:
-		opml_content += OPML_OUTLINE_FEED % {'title': feed_line['title'], 'html_url': feed_line['url'], 'xml_url': feed_line['url']}
-
-	opml_content += OPML_END
-
-  with open(output_file, 'w') as wfile:
-    wfile.write(opml_content)
-
-if __name__ == "__main__":
-  if len(sys.argv) < 3:
-    print("Usage: %s <rss_conf_file> <output_path>" % sys.argv[0])
-    sys.exit(2)
-	config_file = sys.argv[1]
-	output_file = sys.argv[2]
-	main(config_file, output_file)
\ No newline at end of file
diff --git a/stack/monitor/scripts/run-promise.py b/stack/monitor/scripts/run-promise.py
index a19f86281e9d260c27a8d83ed23ee78f4e865ce6..4daa0eaab2568e836f8de91116b78117f4b24735 100644
--- a/stack/monitor/scripts/run-promise.py
+++ b/stack/monitor/scripts/run-promise.py
@@ -122,6 +122,12 @@ def updateStatusHistoryFolder(name, status_file, history_folder, promise_type):
         }
         f_history.write(json.dumps(data_dict))
     else:
+      # Remove useless informations
+      status_dict.pop('hosting_subscription', '')
+      status_dict.pop('title', '')
+      status_dict.pop('instance', '')
+      status_dict.pop('type', '')
+
       with open (history_file, mode="r+") as f_history:
         f_history.seek(0,2)
         position = f_history.tell() -2
diff --git a/stack/monitor/scripts/status2rss.py b/stack/monitor/scripts/status2rss.py
index 5ee72d484cff9a8fdaedb1e8eb2849fe7d4f9cdf..459ad0ba6a6c951da3a2cf9059f0af4929a1ba7a 100644
--- a/stack/monitor/scripts/status2rss.py
+++ b/stack/monitor/scripts/status2rss.py
@@ -1,7 +1,7 @@
 import sys
 import os
 import json
-import datetime
+from datetime import datetime
 import base64
 import hashlib
 import PyRSS2Gen
@@ -16,6 +16,8 @@ def parseArguments():
                       help='Path where to get *.status.json files which contain result of promises.')
   parser.add_argument('--output',
                       help='The Path of file where feed file will be saved.')
+  parser.add_argument('--feed_url',
+                      help='Url of this feed file.')
   parser.add_argument('--public_url',
                       help='Monitor Instance public URL.')
   parser.add_argument('--private_url',
@@ -36,6 +38,7 @@ def main():
   parser = parseArguments()
 
   rss_item_list = []
+  report_date = datetime.utcnow()
   for filename in os.listdir(parser.items_folder):
     if filename.endswith(".status.json"):
       filepath = os.path.join(parser.items_folder, filename)
@@ -46,7 +49,7 @@ def main():
         print "Failed to load json file: %s" % filepath
         continue
       description = result_dict.get('message', '')
-      event_time = datetime.datetime.fromtimestamp(result_dict['change-time'])
+      event_time = datetime.fromtimestamp(result_dict['change-time'])
       rss_item = PyRSS2Gen.RSSItem(
         categories = [result_dict['status']],
         source = PyRSS2Gen.Source(result_dict['title'], parser.public_url),
@@ -55,7 +58,7 @@ def main():
         description = "%s: %s\n%s" % (event_time, result_dict['status'], description),
         link = parser.private_url,
         pubDate = event_time,
-        guid = PyRSS2Gen.Guid(base64.b64encode("%s, %s" % (event_time, result_dict['status'])))
+        guid = PyRSS2Gen.Guid(base64.b64encode("%s, %s" % (parser.hosting_name, result_dict['title'])))
       )
       rss_item_list.append(rss_item)
 
@@ -64,11 +67,12 @@ def main():
   sorted(rss_item_list, key=getKey)
   rss_feed = PyRSS2Gen.RSS2 (
     title = parser.instance_name,
-    link = parser.public_url,
+    link = parser.feed_url,
     description = parser.hosting_name,
-    lastBuildDate = datetime.datetime.utcnow(),
+    lastBuildDate = report_date,
     items = rss_item_list
     )
+
   with open(parser.output, 'w') as frss:
     frss.write(rss_feed.to_xml())
 
diff --git a/stack/monitor/templates/monitor-httpd.conf.in b/stack/monitor/templates/monitor-httpd.conf.in
index 8e81f7bab09f4af4a477ae2952cb66a84ea85c5f..1a0feb50f9697b28de75efd9b3f9f60d470878d4 100644
--- a/stack/monitor/templates/monitor-httpd.conf.in
+++ b/stack/monitor/templates/monitor-httpd.conf.in
@@ -11,7 +11,7 @@ ServerAdmin someone@email
 Listen [{{ parameter_dict.get('listening-ip') }}]:{{ parameter_dict.get('port') }}
 Define MonitorPort
 </IfDefine>
-DocumentRoot "{{ directory.get('webdav') }}"
+DocumentRoot "{{ directory.get('private') }}"
 ErrorLog "{{ parameter_dict.get('error-log') }}"
 LoadModule unixd_module modules/mod_unixd.so
 LoadModule access_compat_module modules/mod_access_compat.so
@@ -19,7 +19,6 @@ LoadModule authz_core_module modules/mod_authz_core.so
 LoadModule authn_core_module modules/mod_authn_core.so
 LoadModule authz_host_module modules/mod_authz_host.so
 LoadModule mime_module modules/mod_mime.so
-LoadModule cgid_module modules/mod_cgid.so
 LoadModule dir_module modules/mod_dir.so
 LoadModule ssl_module modules/mod_ssl.so
 LoadModule alias_module modules/mod_alias.so
@@ -55,31 +54,12 @@ SSLEngine   On
 
 Include {{ parameter_dict.get('httpd-cors-config-file') }}
 Header set Vary Origin
-Header set Cache-Control "private, max-age=0, must-revalidate"
-Header set Access-Control-Max-Age "0"
-Header unset ETag
-Header set Pragma "no-cache"
+Header set Cache-Control "private, max-age=40"
+Header set Access-Control-Max-Age "40"
 Header set Access-Control-Allow-Credentials "true"
 Header set Access-Control-Allow-Methods "PROPFIND, PROPPATCH, COPY, MOVE, DELETE, MKCOL, LOCK, UNLOCK, PUT, GETLIB, VERSION-CONTROL, CHECKIN, CHECKOUT, UNCHECKOUT, REPORT, UPDATE, CANCELUPLOAD, HEAD, OPTIONS, GET, POST"
 Header set Access-Control-Allow-Headers "Overwrite, Destination, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Authorization"
 
-{% if parameter_dict.has_key('monitor-url-list') -%}
-RewriteEngine on
-SSLProxyEngine on
-ProxyPreserveHost On
-SSLProxyVerify none
-SSLProxyCheckPeerCN off
-SSLProxyCheckPeerName off
-{% set index=1 -%}
-{% set monitor_url_list = parameter_dict.get('monitor-url-list').split('\n') -%}
-{% for url in monitor_url_list -%}
-{%   if url.strip() -%}
-RewriteRule /monitor{{ index }}/(.*)  {{ url }}/$1 [L,P]
-{%     set index = index + 1 -%}
-{%   endif -%}
-{% endfor -%}
-{% endif -%}
-
 DavLockDB {{ directory.get('monitor-var') }}/DavLock
 Alias /share {{ directory.get('webdav') }}
 <Directory {{ directory.get('webdav') }}>
@@ -101,22 +81,6 @@ Alias /share {{ directory.get('webdav') }}
     </Limit>
 </LocationMatch>
 
-ScriptSock {{ parameter_dict.get('cgid-pid-file') }}
-<Directory {{ directory.get('www') }}>
-  SSLVerifyDepth    1
-  SSLRequireSSL
-  SSLOptions        +StrictRequire
-  # XXX: security????
-  DirectoryIndex index.html
-  Options FollowSymLinks
-  AllowOverride All
-  Order Deny,Allow
-  AuthType Basic
-  AuthName "Private access"
-  AuthUserFile "{{ parameter_dict.get('htpasswd-file') }}"
-  Require valid-user
-</Directory>
-
 Alias /private {{ directory.get('private') }}/
 <Directory {{ directory.get('private') }}>
   Order Deny,Allow
@@ -140,24 +104,6 @@ Alias /public {{ directory.get('public') }}/
   Allow from all
 </Directory>
 
-Alias /cgi-bin {{ directory.get('cgi-bin') }}
-<Directory {{ directory.get('cgi-bin') }}>
-  # XXX security ???
-  Order Deny,Allow
-  Deny from all
-  <Files "*.cgi">
-    Order Deny,Allow
-    Deny from env=AUTHREQUIRED
-    AuthType Basic
-    AuthName "Private access"
-    AuthUserFile "{{ parameter_dict.get('htpasswd-file') }}"
-    Require valid-user
-  </Files>
-  Options +ExecCGI
-  AddHandler cgi-script .cgi
-  Options Indexes FollowSymLinks
-  Satisfy all
-</Directory>
 {% if parameter_dict.get('httpd-include-file', '') -%}
 Include {{ parameter_dict.get('httpd-include-file') }}
 {% endif -%}
diff --git a/stack/monitor/templates/monitor-service.cfg.in b/stack/monitor/templates/monitor-service.cfg.in
deleted file mode 100644
index 128eec9dae2af90beacbc5e1fead168fa817ba6c..0000000000000000000000000000000000000000
--- a/stack/monitor/templates/monitor-service.cfg.in
+++ /dev/null
@@ -1,4 +0,0 @@
-[service]
-{% for key, value in parameter_dict.items() -%}
-{{ key }} = {{ value.strip().replace("\n", "\n  ") }}
-{% endfor -%}