From 8c4aa39481bbfde2b403f4787c85c057e84f2e12 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Wed, 22 Jul 2009 09:01:13 -0400
Subject: [PATCH] Merged revisions 1216 - 1279 from trunk

---
 interface/web/sites/templates/database_edit.htm                |   14 
 interface/web/mail/mail_user_filter_edit.php                   |   46 
 interface/web/sites/lib/lang/br_shell_user_list.lng            |    8 
 interface/web/admin/templates/server_config_list.htm           |   90 
 interface/web/sites/lib/lang/bg_web_sites_stats_list.lng       |    8 
 interface/web/sites/lib/lang/se_ftp_user.lng                   |    1 
 interface/web/admin/lib/lang/es_server_config.lng              |    6 
 interface/web/sites/cron_edit.php                              |  220 +
 interface/web/admin/software_update_list.php                   |    4 
 interface/web/admin/lib/lang/de_server_config.lng              |    6 
 interface/web/admin/lib/lang/nl_server_config.lng              |    6 
 interface/web/designer/lib/lang/br_form_show.lng               |   18 
 interface/web/mail/lib/lang/br_spamfilter_config_list.lng      |    5 
 interface/web/mail/lib/lang/br_mail_spamfilter_list.lng        |    9 
 interface/web/mail/spamfilter_blacklist_edit.php               |   16 
 interface/web/sites/lib/lang/es_database.lng                   |    2 
 interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng        |    1 
 interface/web/admin/lib/lang/br_server_ip_list.lng             |    7 
 interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng   |    9 
 interface/web/sites/lib/lang/se_web_sites_stats_list.lng       |    8 
 interface/web/client/lib/module.conf.php                       |   32 
 interface/web/dns/lib/lang/br_dns_aaaa.lng                     |   15 
 interface/web/dns/lib/lang/de_dns_aaaa.lng                     |   15 
 interface/web/mail/lib/lang/en_mail_alias.lng                  |    1 
 interface/web/sites/lib/lang/ru_cron_list.lng                  |   12 
 interface/web/dns/lib/lang/fr_dns_a.lng                        |    1 
 interface/web/sites/templates/cron_list.htm                    |   71 
 interface/web/admin/lib/lang/br_server_ip.lng                  |    7 
 interface/web/dns/lib/lang/es_dns_a.lng                        |    1 
 interface/web/admin/lib/lang/br_users.lng                      |   29 
 interface/web/client/lib/lang/fr_client.lng                    |    6 
 interface/web/admin/templates/language_import.htm              |   63 
 server/server.php                                              |    7 
 interface/web/client/templates/reseller_edit_address.htm       |  101 
 interface/web/client/reseller_list.php                         |   55 
 interface/web/sites/lib/lang/fr_web_sites_stats_list.lng       |    8 
 server/plugins-available/software_update_plugin.inc.php        |   31 
 install/dist/conf/centos52.conf.php                            |    8 
 interface/web/dns/lib/lang/fi_dns_aaaa.lng                     |   15 
 interface/web/sites/lib/lang/fr_cron.lng                       |   21 
 interface/web/admin/lib/lang/ru_server_config.lng              |    6 
 interface/web/mail/lib/lang/br_mail_user_list.lng              |    6 
 interface/web/mail/lib/lang/br_mail_content_filter_list.lng    |    8 
 interface/web/mail/lib/lang/fi_mail_alias.lng                  |    1 
 server/plugins-available/cron_jailkit_plugin.inc.php           |  272 +
 interface/web/admin/lib/lang/en_server_config.lng              |    7 
 server/scripts/ispconfig_update.php                            |    2 
 interface/web/client/lib/lang/nl_client_template.lng           |    5 
 interface/web/admin/lib/lang/br_software_repo_list.lng         |    6 
 interface/web/designer/lib/lang/br_module_nav_edit.lng         |    6 
 interface/web/mail/lib/lang/se_mail_alias.lng                  |    1 
 interface/web/mail/lib/lang/de_mail_alias.lng                  |    1 
 docs/INSTALL_DEBIAN_4.0.txt                                    |   16 
 interface/web/mail/lib/lang/es_mail_user_filter_list.lng       |    1 
 interface/web/dns/templates/dns_hinfo_edit.htm                 |   76 
 interface/web/sites/templates/cron_edit.htm                    |   68 
 interface/web/sites/lib/lang/br_web_subdomain.lng              |   39 
 interface/web/mail/lib/lang/ru_mail_user.lng                   |    1 
 interface/web/sites/lib/lang/fi_cron_list.lng                  |   12 
 interface/web/mail/lib/lang/ru_mail_alias.lng                  |    1 
 server/plugins-available/apache2_plugin.inc.php                |   90 
 interface/web/mail/lib/lang/br_spamfilter_users.lng            |    8 
 interface/web/help/lib/lang/br.lng                             |    8 
 interface/web/dns/templates/dns_a_edit.htm                     |   78 
 interface/web/client/lib/lang/it_client.lng                    |    6 
 interface/web/mail/lib/lang/br_mail_domain_catchall.lng        |    9 
 interface/web/mail/lib/lang/se_mail_forward.lng                |    1 
 interface/web/sites/lib/lang/it_cron.lng                       |   21 
 server/plugins-available/webmail_symlink_plugin.inc.php        |  121 
 interface/web/mail/spamfilter_policy_edit.php                  |   16 
 interface/web/mail/lib/lang/br_mail_content_filter.lng         |    9 
 interface/web/mail/lib/lang/nl_mail_alias.lng                  |    1 
 interface/web/sites/lib/lang/nl_web_sites_stats_list.lng       |    8 
 interface/web/sites/lib/lang/it_web_sites_stats_list.lng       |    8 
 interface/web/dns/templates/dns_ptr_edit.htm                   |   76 
 interface/web/sites/lib/lang/bg_cron.lng                       |   21 
 interface/web/dns/lib/lang/br_dns_txt.lng                      |   15 
 interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng   |    9 
 interface/web/admin/lib/lang/br_firewall.lng                   |   10 
 interface/lib/classes/custom_datasource.inc.php                |   50 
 interface/web/admin/lib/lang/br_software_repo.lng              |    8 
 interface/web/admin/lib/lang/br_language_add.lng               |    9 
 interface/web/sites/lib/lang/it_ftp_user.lng                   |    1 
 interface/web/dns/lib/lang/es_dns_wizard.lng                   |   12 
 interface/web/mail/lib/lang/se_mail_user_filter_list.lng       |    1 
 interface/web/dns/lib/lang/bg_dns_a.lng                        |    1 
 interface/web/sites/database_edit.php                          |   16 
 interface/web/client/lib/lang/ru_client_template.lng           |    5 
 interface/web/client/templates/reseller_edit_limits.htm        |  171 
 interface/web/dns/lib/lang/es_dns_aaaa.lng                     |   15 
 interface/web/client/lib/lang/fr_client_template.lng           |    5 
 interface/web/sites/lib/lang/es_cron.lng                       |   21 
 install/tpl/apache_ispconfig.conf.master                       |    2 
 interface/web/admin/lib/lang/br_server_config.lng              |   42 
 interface/web/sites/lib/lang/bg_ftp_user.lng                   |    1 
 install/dist/conf/centos53.conf.php                            |    8 
 server/scripts/update_from_svn.sh                              |    4 
 interface/web/client/lib/lang/br_client_template_list.lng      |    6 
 interface/web/dns/templates/dns_txt_edit.htm                   |   76 
 server/plugins-available/cron_plugin.inc.php                   |  239 +
 interface/web/dns/lib/lang/br.lng                              |   19 
 interface/web/mail/lib/lang/it_spamfilter_blacklist.lng        |    1 
 interface/web/mail/mail_get_edit.php                           |   16 
 server/mods-available/web_module.inc.php                       |    3 
 interface/web/mail/lib/lang/br_mail_whitelist_list.lng         |   10 
 interface/web/mail/lib/lang/fi_mail_user_filter_list.lng       |    1 
 interface/web/admin/software_package_list.php                  |   51 
 interface/web/dns/lib/lang/de_dns_wizard.lng                   |   12 
 interface/web/sites/web_aliasdomain_edit.php                   |   16 
 interface/web/mail/lib/lang/se_spamfilter_blacklist.lng        |    1 
 interface/web/mail/lib/lang/nl_mail_user_filter_list.lng       |    1 
 interface/web/mail/lib/lang/es_mail_forward.lng                |    1 
 interface/web/admin/templates/language_export.htm              |   52 
 server/conf/vhost.conf.master                                  |  591 +-
 interface/web/mail/lib/lang/br_mail_alias.lng                  |   10 
 interface/web/mail/lib/lang/en_mail_user_filter_list.lng       |    1 
 interface/web/mail/mail_forward_edit.php                       |   25 
 interface/web/client/lib/lang/en_client_template.lng           |    5 
 interface/web/mail/lib/lang/br_spamfilter_blacklist.lng        |    8 
 install/dist/conf/gentoo.conf.php                              |    8 
 interface/web/mail/lib/lang/nl_mail_forward.lng                |    1 
 interface/web/mail/lib/lang/bg_mail_user.lng                   |    1 
 interface/web/dns/dns_a_edit.php                               |    5 
 interface/web/help/lib/lang/br_support_message_list.lng        |    7 
 interface/web/sites/lib/lang/br_cron.lng                       |   21 
 interface/web/sites/lib/lang/ru_cron.lng                       |   21 
 interface/web/admin/lib/lang/se_server_config.lng              |    6 
 interface/web/dns/templates/dns_aaaa_edit.htm                  |    2 
 interface/web/mail/mail_blacklist_edit.php                     |   16 
 interface/web/dns/templates/dns_alias_edit.htm                 |   76 
 interface/web/mail/lib/lang/de_mail_user.lng                   |    1 
 interface/web/mail/lib/lang/en_mail_user.lng                   |    1 
 interface/web/client/lib/lang/de_client_template.lng           |    5 
 interface/web/mail/lib/lang/es_mail_user.lng                   |    1 
 interface/web/client/form/reseller.tform.php                   |  733 +++
 interface/web/sites/lib/lang/fi_database.lng                   |    2 
 interface/web/admin/form/server.tform.php                      |    4 
 interface/web/sites/lib/lang/it_database.lng                   |    2 
 install/dist/conf/debian40.conf.php                            |    8 
 interface/web/sites/form/cron.tform.php                        |  189 
 interface/lib/classes/validate_cron.inc.php                    |  191 
 interface/web/mail/lib/lang/br_mail_whitelist.lng              |    9 
 interface/web/sites/lib/lang/ru_web_sites_stats_list.lng       |    8 
 interface/web/mail/lib/lang/br_mail_forward_list.lng           |    8 
 interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng        |    1 
 interface/web/sites/templates/ftp_user_advanced_client.htm     |   22 
 interface/web/mail/lib/lang/fr_mail_user.lng                   |    1 
 interface/web/mail/lib/lang/br_mail_alias_list.lng             |    8 
 interface/web/mail/lib/lang/fr_mail_user_filter_list.lng       |    1 
 interface/web/dns/lib/lang/fi_dns_a.lng                        |    1 
 interface/web/client/templates/client_template_edit_limits.htm |  214 
 interface/web/admin/lib/lang/br_users_list.lng                 |    8 
 interface/web/client/templates/client_edit_limits.htm          |   18 
 interface/web/dns/lib/lang/se_dns_wizard.lng                   |   12 
 interface/web/sites/lib/lang/nl_cron_list.lng                  |   12 
 interface/web/client/lib/lang/it_client_template.lng           |    5 
 install/dist/lib/opensuse.lib.php                              |   18 
 interface/web/client/lib/lang/ru_client.lng                    |    6 
 interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng        |    1 
 interface/web/sites/lib/lang/br_web_domain.lng                 |   50 
 interface/web/sites/web_domain_edit.php                        |   38 
 interface/web/mail/lib/lang/it_mail_forward.lng                |    1 
 interface/web/admin/templates/server_config_vlogger_edit.htm   |   22 
 interface/web/mail/mail_alias_edit.php                         |   25 
 interface/web/mail/lib/lang/br_mail_get_list.lng               |    9 
 interface/web/mail/lib/lang/br_mail_get.lng                    |   15 
 interface/web/sites/lib/lang/br_database.lng                   |   22 
 interface/web/dns/lib/lang/fi_dns_wizard.lng                   |   12 
 interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng        |    1 
 interface/lib/app.inc.php                                      |   15 
 interface/web/login/lib/lang/br.lng                            |   15 
 server/plugins-available/firewall_plugin.inc.php               |   18 
 interface/web/mail/mail_domain_catchall_edit.php               |   16 
 interface/web/admin/lib/lang/br_server_config_list.lng         |    5 
 interface/web/dns/lib/lang/ru_dns_aaaa.lng                     |   15 
 install/dist/lib/fedora.lib.php                                |   18 
 interface/web/dns/lib/lang/se_dns_a.lng                        |    1 
 interface/web/dns/lib/lang/fr_dns_aaaa.lng                     |   15 
 interface/web/mail/lib/lang/fr_mail_forward.lng                |    1 
 interface/web/dns/templates/dns_ns_edit.htm                    |   76 
 interface/web/admin/lib/lang/br_language_import.lng            |    7 
 install/lib/installer_base.lib.php                             |  165 
 interface/web/client/lib/lang/br_clients_list.lng              |   10 
 interface/web/mail/lib/lang/it_spamfilter_whitelist.lng        |    1 
 interface/web/mail/lib/lang/de_mail_user_filter_list.lng       |    1 
 interface/web/admin/lib/lang/br.lng                            |   35 
 interface/web/mail/lib/lang/de_spamfilter_blacklist.lng        |    1 
 interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng        |    1 
 interface/web/sites/form/ftp_user.tform.php                    |  208 
 interface/web/sites/lib/lang/br_ftp_user_list.lng              |    8 
 interface/web/dns/lib/lang/de_dns_a.lng                        |    1 
 install/dist/conf/fedora9.conf.php                             |    8 
 interface/web/designer/lib/lang/br_module_nav_item_edit.lng    |    8 
 interface/web/dns/lib/lang/br_dns_ptr.lng                      |   15 
 interface/web/dns/lib/lang/it_dns_a.lng                        |    1 
 interface/web/client/lib/lang/de_client.lng                    |    6 
 interface/web/sites/lib/lang/br_web_domain_list.lng            |    8 
 interface/web/client/lib/lang/br_client_template.lng           |   48 
 server/mods-available/cron_module.inc.php                      |   97 
 interface/web/mail/lib/lang/fi_mail_forward.lng                |    1 
 interface/web/monitor/lib/lang/br_syslog_list.lng              |    8 
 interface/web/sites/lib/lang/ru_database.lng                   |    2 
 interface/web/sites/lib/lang/de_web_sites_stats_list.lng       |    8 
 interface/web/admin/lib/lang/br_language_list.lng              |    8 
 interface/web/dns/dns_template_edit.php                        |  116 
 interface/web/mail/lib/lang/es_spamfilter_blacklist.lng        |    1 
 interface/web/dns/templates/dns_cname_edit.htm                 |   76 
 interface/web/admin/lib/lang/br_system_config.lng              |   14 
 interface/web/dns/lib/lang/br_dns_wizard.lng                   |   16 
 interface/web/mail/lib/lang/br_mail_user_stats_list.lng        |    8 
 interface/web/dns/lib/lang/br_dns_ns.lng                       |   15 
 interface/web/sites/lib/lang/fi_web_sites_stats_list.lng       |    8 
 interface/web/sites/lib/lang/nl_database.lng                   |    2 
 interface/web/dns/lib/lang/se_dns_aaaa.lng                     |   15 
 interface/web/mail/lib/lang/bg_mail_user_filter_list.lng       |    1 
 interface/web/dns/lib/lang/br_dns_hinfo.lng                    |   15 
 interface/web/mail/lib/lang/ru_mail_user_filter_list.lng       |    1 
 interface/web/sites/lib/lang/nl_cron.lng                       |   21 
 interface/web/sites/lib/lang/it_cron_list.lng                  |   12 
 interface/lib/classes/validate_database.inc.php                |   72 
 interface/web/dns/lib/lang/nl_dns_a.lng                        |    1 
 interface/web/client/lib/lang/br_client.lng                    |   85 
 interface/web/admin/templates/server_config_jailkit_edit.htm   |    4 
 interface/web/sites/lib/lang/en_ftp_user.lng                   |    2 
 interface/web/designer/lib/lang/br_form_list.lng               |    7 
 interface/web/sites/lib/lang/se_database.lng                   |    2 
 interface/web/client/form/client.tform.php                     | 1426 +++---
 interface/web/mail/mail_domain_edit.php                        |   42 
 interface/web/admin/lib/lang/br_software_package_list.lng      |    8 
 interface/web/sites/list/web_sites_stats.list.php              |   60 
 interface/web/sites/lib/lang/fr_database.lng                   |    2 
 interface/web/admin/lib/lang/it_server_config.lng              |    6 
 interface/web/admin/lib/lang/br_firewall_list.lng              |    8 
 interface/web/admin/templates/server_config_web_edit.htm       |   16 
 interface/web/client/templates/resellers_list.htm              |   62 
 interface/web/mail/spamfilter_users_edit.php                   |   16 
 server/scripts/run-getmail.sh                                  |    6 
 interface/web/mail/mail_user_edit.php                          |   57 
 interface/web/client/lib/lang/nl_client.lng                    |    6 
 server/plugins-available/mysql_clientdb_plugin.inc.php         |   79 
 interface/web/admin/lib/lang/br_groups.lng                     |    6 
 interface/web/sites/cron_del.php                               |   64 
 interface/web/admin/templates/server_list.htm                  |  126 
 interface/web/mail/lib/lang/bg_mail_forward.lng                |    1 
 interface/web/sites/lib/lang/de_ftp_user.lng                   |    1 
 interface/web/sites/lib/lang/br_cron_list.lng                  |   12 
 docs/INSTALL_DEBIAN_5.0.txt                                    |   42 
 interface/web/admin/lib/lang/fi_server_config.lng              |    6 
 interface/web/help/lib/lang/br_support_message.lng             |    8 
 install/dist/conf/opensuse110.conf.php                         |    8 
 interface/web/mail/lib/lang/br_spamfilter_config.lng           |   21 
 interface/web/sites/lib/lang/br_web_sites_stats_list.lng       |    8 
 interface/web/client/lib/lang/es_client.lng                    |    6 
 interface/web/dns/lib/lang/nl_dns_aaaa.lng                     |   15 
 interface/web/dns/lib/lang/it_dns_wizard.lng                   |   12 
 interface/web/mail/lib/lang/br_mail_domain.lng                 |   14 
 interface/web/mail/lib/lang/it_mail_user_filter_list.lng       |    1 
 interface/web/admin/lib/lang/br_language_complete.lng          |    8 
 interface/web/client/lib/lang/se_client_template.lng           |    5 
 interface/web/client/lib/lang/bg_client.lng                    |    6 
 interface/web/client/lib/lang/se_client.lng                    |    6 
 interface/web/admin/lib/lang/en_firewall.lng                   |    3 
 interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng   |    9 
 interface/web/sites/form/database.tform.php                    |   12 
 interface/web/dns/dns_soa_edit.php                             |   42 
 interface/web/dns/lib/lang/fr_dns_wizard.lng                   |   12 
 interface/web/sites/lib/lang/se_cron.lng                       |   21 
 interface/web/sites/lib/lang/fi_ftp_user.lng                   |    1 
 interface/web/dns/lib/lang/br_dns_mx.lng                       |   16 
 interface/web/sites/lib/lang/es_web_sites_stats_list.lng       |    8 
 install/install.php                                            |   12 
 interface/web/dns/lib/lang/br_dns_soa.lng                      |   24 
 interface/web/admin/lib/lang/br_server.lng                     |   12 
 interface/web/sites/lib/lang/br_ftp_user.lng                   |   27 
 interface/web/sites/lib/lang/bg_cron_list.lng                  |   12 
 interface/web/designer/lib/lang/br_module_list.lng             |    5 
 interface/web/dns/lib/lang/nl_dns_wizard.lng                   |   12 
 interface/web/client/lib/lang/en_resellers_list.lng            |    9 
 interface/web/client/lib/lang/en_client.lng                    |    5 
 interface/web/mail/lib/lang/fr_mail_alias.lng                  |    1 
 interface/web/admin/lib/lang/br_language_edit.lng              |    9 
 install/sql/ispconfig3.sql                                     |   50 
 interface/lib/classes/tform_actions.inc.php                    |    8 
 interface/web/mail/lib/lang/se_mail_user.lng                   |    1 
 interface/web/dns/dns_wizard.php                               |   35 
 interface/web/sites/lib/lang/br_database_list.lng              |    8 
 interface/web/mail/lib/lang/es_mail_alias.lng                  |    1 
 interface/web/sites/lib/lang/en_shell_user.lng                 |    1 
 interface/web/mail/lib/lang/br_mail_blacklist.lng              |    9 
 interface/web/sites/lib/lang/br_shell_user.lng                 |   23 
 interface/web/mail/lib/lang/br_mail_domain_list.lng            |    7 
 interface/web/dns/lib/lang/br_dns_template.lng                 |    6 
 interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng        |    1 
 interface/web/sites/lib/lang/bg_database.lng                   |    2 
 interface/web/client/lib/lang/bg_client_template.lng           |    5 
 interface/web/mail/lib/lang/br_mail_blacklist_list.lng         |   10 
 interface/web/mail/mail_transport_edit.php                     |   16 
 interface/web/dns/lib/lang/ru_dns_wizard.lng                   |   12 
 interface/web/sites/lib/lang/de_cron_list.lng                  |   12 
 interface/lib/classes/validate_ftpuser.inc.php                 |   89 
 interface/web/mail/lib/lang/ru_mail_forward.lng                |    1 
 interface/web/dns/templates/dns_srv_edit.htm                   |   76 
 interface/web/dns/templates/dns_mx_edit.htm                    |   84 
 interface/web/client/lib/lang/en_reseller.lng                  |   93 
 interface/web/mail/lib/lang/br.lng                             |   49 
 interface/web/admin/form/server_config.tform.php               |  110 
 interface/web/dns/lib/lang/it_dns_aaaa.lng                     |   15 
 interface/web/sites/shell_user_edit.php                        |   21 
 interface/web/mail/lib/lang/br_spamfilter_whitelist.lng        |    8 
 interface/web/sites/lib/lang/se_cron_list.lng                  |   12 
 interface/web/sites/form/shell_user.tform.php                  |    8 
 server/cron_daily.php                                          |    4 
 interface/web/admin/lib/lang/fr_server_config.lng              |    6 
 interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng        |    1 
 interface/web/mail/lib/lang/br_mail_transport.lng              |   10 
 interface/web/admin/templates/server_config_cron_edit.htm      |   30 
 interface/web/mail/lib/lang/br_mail_transport_list.lng         |    9 
 interface/web/dns/lib/lang/ru_dns_a.lng                        |    1 
 interface/web/mail/spamfilter_whitelist_edit.php               |   16 
 interface/web/dns/lib/lang/br_dns_a.lng                        |   15 
 interface/web/dns/lib/lang/bg_dns_aaaa.lng                     |   15 
 interface/lib/lang/br.lng                                      |   25 
 interface/web/admin/lib/lang/br_groups_list.lng                |    7 
 interface/web/client/form/client_template.tform.php            |   36 
 interface/web/sites/web_domain_del.php                         |    6 
 interface/web/mail/lib/lang/br_spamfilter_users_list.lng       |   10 
 interface/web/dns/lib/module.conf.php                          |   39 
 interface/web/dns/list/dns_soa.list.php                        |    7 
 server/plugins-available/pma_symlink_plugin.inc.php            |  121 
 server/mods-available/monitor_core_module.inc.php              |    2 
 interface/web/sites/lib/lang/es_ftp_user.lng                   |    1 
 interface/web/client/list/reseller.list.php                    |   87 
 interface/lib/classes/validate_reseller.inc.php                |   47 
 interface/web/sites/lib/lang/de_database.lng                   |    2 
 interface/web/dns/lib/lang/br_dns_alias.lng                    |   15 
 interface/web/dns/lib/lang/br_dns_rp.lng                       |   15 
 interface/web/dns/lib/lang/br_dns_template_list.lng            |    6 
 interface/web/sites/lib/lang/fr_cron_list.lng                  |   12 
 interface/web/client/reseller_del.php                          |   81 
 server/scripts/vlogger                                         |  564 ++
 interface/web/client/lib/lang/fi_client.lng                    |    6 
 interface/web/mail/lib/lang/br_mail_user_filter_list.lng       |    6 
 server/scripts/update_from_tgz.sh                              |   17 
 interface/web/dns/templates/dns_wizard.htm                     |    8 
 interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng        |    1 
 interface/web/strengthmeter/lib/lang/br_strengthmeter.lng      |    9 
 server/plugins-available/ftpuser_base_plugin.inc.php           |  112 
 interface/web/sites/lib/lang/en_cron_list.lng                  |   12 
 interface/web/sites/lib/lang/es_cron_list.lng                  |   12 
 interface/web/mail/lib/lang/br_mail_forward.lng                |    6 
 docs/INSTALL_UBUNTU_8.04.txt                                   |   17 
 interface/web/mail/lib/lang/se_spamfilter_whitelist.lng        |    1 
 interface/web/mail/lib/lang/en_mail_forward.lng                |    1 
 interface/web/mail/lib/lang/br_mail_user_filter.lng            |    9 
 interface/web/designer/lib/lang/br_module_show.lng             |   17 
 interface/web/sites/lib/lang/fi_cron.lng                       |   21 
 interface/web/dns/lib/lang/en_dns_a.lng                        |    1 
 interface/web/mail/lib/lang/de_spamfilter_whitelist.lng        |    1 
 interface/web/designer/lib/lang/br_form_edit.lng               |   26 
 interface/web/sites/lib/lang/en_web_sites_stats_list.lng       |    8 
 interface/web/client/client_list.php                           |    1 
 interface/web/mail/mail_whitelist_edit.php                     |   16 
 interface/web/monitor/lib/lang/br.lng                          |  138 
 server/plugins-available/mail_plugin.inc.php                   |   49 
 interface/web/admin/lib/lang/br_software_update_list.lng       |    9 
 interface/web/sites/lib/lang/br_web_subdomain_list.lng         |    8 
 interface/web/mail/lib/lang/fi_mail_user.lng                   |    1 
 server/conf/apache_ispconfig.conf.master                       |    2 
 interface/lib/classes/tform.inc.php                            |   84 
 interface/web/sites/lib/lang/br_web_aliasdomain_list.lng       |   11 
 interface/web/client/lib/lang/en.lng                           |    3 
 interface/web/sites/list/cron.list.php                         |  152 
 interface/web/mail/lib/lang/it_mail_alias.lng                  |    1 
 interface/web/admin/templates/users_list.htm                   |  120 
 interface/web/mail/lib/lang/nl_mail_user.lng                   |    1 
 interface/web/dns/lib/lang/br_dns_soa_list.lng                 |    9 
 interface/web/admin/lib/lang/br_language_export.lng            |    7 
 interface/web/admin/lib/lang/bg_server_config.lng              |    6 
 install/tpl/config.inc.php.master                              |    2 
 interface/web/sites/templates/web_sites_stats_list.htm         |   52 
 interface/web/mail/lib/lang/br_mail_user.lng                   |   31 
 interface/web/sites/lib/module.conf.php                        |   36 
 install/update.php                                             |   11 
 interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng        |    1 
 interface/web/mail/lib/lang/br_spamfilter_policy.lng           |   38 
 interface/web/mail/lib/lang/es_spamfilter_whitelist.lng        |    1 
 interface/web/client/lib/lang/es_client_template.lng           |    5 
 interface/web/admin/lib/lang/br_server_list.lng                |   12 
 interface/web/dns/lib/lang/br_dns_a_list.lng                   |   14 
 interface/web/dns/lib/lang/br_dns_srv.lng                      |   15 
 interface/web/mail/lib/lang/it_mail_user.lng                   |    1 
 interface/web/sites/ftp_user_edit.php                          |   35 
 interface/web/client/lib/lang/br.lng                           |   10 
 interface/web/sites/web_subdomain_edit.php                     |   16 
 interface/web/sites/lib/lang/ru_ftp_user.lng                   |    1 
 interface/web/sites/web_sites_stats.php                        |   64 
 interface/web/sites/lib/lang/br.lng                            |   17 
 interface/web/tools/lib/lang/br_usersettings.lng               |    9 
 interface/web/dns/lib/lang/br_dns_cname.lng                    |   15 
 interface/web/sites/lib/lang/de_cron.lng                       |   21 
 server/conf/php-fcgi-starter.master                            |    6 
 install/tpl/server.ini.master                                  |   12 
 interface/web/mail/lib/lang/bg_mail_alias.lng                  |    1 
 interface/web/sites/lib/lang/fr_ftp_user.lng                   |    1 
 interface/web/mail/lib/lang/de_mail_forward.lng                |    1 
 interface/web/designer/lib/lang/br_module_edit.lng             |   23 
 interface/web/sites/lib/lang/nl_ftp_user.lng                   |    1 
 interface/web/designer/lib/lang/br.lng                         |    3 
 interface/web/client/lib/lang/fi_client_template.lng           |    5 
 interface/web/mail/lib/lang/br_mail_spamfilter.lng             |   17 
 interface/web/sites/lib/lang/en_database.lng                   |    2 
 interface/web/client/reseller_edit.php                         |  214 
 interface/web/sites/lib/lang/en_cron.lng                       |   21 
 interface/web/tools/lib/lang/br.lng                            |    7 
 interface/lib/classes/validate_client.inc.php                  |    2 
 interface/web/dns/templates/dns_rp_edit.htm                    |   76 
 install/tpl/vlogger-dbi.conf.master                            |    4 
 interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng        |    1 
 interface/web/mail/lib/lang/br_spamfilter_policy_list.lng      |    9 
 interface/web/dns/lib/lang/bg_dns_wizard.lng                   |   12 
 /dev/null                                                      |    2 
 interface/web/sites/cron_list.php                              |   23 
 422 files changed, 10,558 insertions(+), 2,330 deletions(-)

diff --git a/docs/INSTALL_DEBIAN_4.0.txt b/docs/INSTALL_DEBIAN_4.0.txt
index 7ac2dc5..935f197 100644
--- a/docs/INSTALL_DEBIAN_4.0.txt
+++ b/docs/INSTALL_DEBIAN_4.0.txt
@@ -124,15 +124,15 @@
 
 7) Install Jailkit (optional, only needed if you want to use chrroting for SSH users)
 
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
 cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
-rm -rf jailkit-2.5*
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
+cd ..
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
 
 8) Install fail2ban (optional but recomended, because the monitor tries to show the log)
 More info at: http://www.howtoforge.com/fail2ban_debian_etch
diff --git a/docs/INSTALL_DEBIAN_5.0.txt b/docs/INSTALL_DEBIAN_5.0.txt
index 137493e..dad7e2b 100644
--- a/docs/INSTALL_DEBIAN_5.0.txt
+++ b/docs/INSTALL_DEBIAN_5.0.txt
@@ -82,33 +82,6 @@
 
 a2enmod suexec rewrite ssl actions include
 
-# Secure phpMyAdmin by deleting setuppassword-file
-# and removing/commenting Setup Authorization from apache.conf
-
-rm /etc/phpmyadmin/htpasswd.setup
-
-vi /etc/phpmyadmin/apache.conf
-
-# delete/comment following lines (between the ----- lines):
-------------------------------------------------------
-        # Authorize for setup
-       <Files setup.php>
-           # For Apache 1.3 and 2.0
-           <IfModule mod_auth.c>
-               AuthType Basic
-               AuthName "phpMyAdmin Setup"
-               AuthUserFile /etc/phpmyadmin/htpasswd.setup
-           </IfModule>
-           # For Apache 2.2
-           <IfModule mod_authn_file.c>
-               AuthType Basic
-               AuthName "phpMyAdmin Setup"
-               AuthUserFile /etc/phpmyadmin/htpasswd.setup
-           </IfModule>
-           Require valid-user
-       </Files>
-------------------------------------------------------
-
 # restart apache before continuing
 
 /etc/init.d/apache2 restart
@@ -263,16 +236,15 @@
 
 7) Install Jailkit (optional, only needed if you want to use chrroting for SSH users)
 
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
 cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
 cd ..
-rm -rf jailkit-2.5*
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
 
 8) Install fail2ban (optional but recomended, because the monitor tries to show the log)
 More info at: http://www.howtoforge.com/fail2ban_debian_etch
diff --git a/docs/INSTALL_UBUNTU_8.04.txt b/docs/INSTALL_UBUNTU_8.04.txt
index 4bedb14..c782ba2 100644
--- a/docs/INSTALL_UBUNTU_8.04.txt
+++ b/docs/INSTALL_UBUNTU_8.04.txt
@@ -115,7 +115,7 @@
 
 set docroot to:
 ###
-docroot=/var/clients
+docroot=/var/www/clients
 ###
 
 Change: application/x-httpd-php=php:/usr/bin/php-cgi to:
@@ -233,14 +233,15 @@
 7.1) OPTIONAL: Installing Jailkit
 *******************************************************************************
 ___
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
 cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
+cd ..
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
 ___
 
 
diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php
index 6f169fd..e1ee4be 100644
--- a/install/dist/conf/centos52.conf.php
+++ b/install/dist/conf/centos52.conf.php
@@ -147,6 +147,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php
index d0f35f5..260eedb 100644
--- a/install/dist/conf/centos53.conf.php
+++ b/install/dist/conf/centos53.conf.php
@@ -147,6 +147,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php
index 0d58421..6d10711 100644
--- a/install/dist/conf/debian40.conf.php
+++ b/install/dist/conf/debian40.conf.php
@@ -147,6 +147,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php
index 8a69fc4..c49f133 100644
--- a/install/dist/conf/fedora9.conf.php
+++ b/install/dist/conf/fedora9.conf.php
@@ -147,6 +147,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php
index ff7b626..9003aeb 100644
--- a/install/dist/conf/gentoo.conf.php
+++ b/install/dist/conf/gentoo.conf.php
@@ -96,6 +96,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php
index e4991fe..58b9d38 100644
--- a/install/dist/conf/opensuse110.conf.php
+++ b/install/dist/conf/opensuse110.conf.php
@@ -147,6 +147,14 @@
 $conf['jailkit']['jk_init'] = 'jk_init.ini';
 $conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
 $conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
 
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
 
 ?>
\ No newline at end of file
diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php
index bc6f25e..1e59f87 100644
--- a/install/dist/lib/fedora.lib.php
+++ b/install/dist/lib/fedora.lib.php
@@ -409,6 +409,7 @@
 		if(is_file('/etc/suphp.conf')) {
 			//replaceLine('/etc/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
 			replaceLine('/etc/suphp.conf','docroot=','docroot=/var/www',0);
+			replaceLine('/etc/suphp.conf','umask=0077','umask=0022',0);
 		}
 		
 		//* Create the logging directory for the vhost logfiles
@@ -444,6 +445,23 @@
 			exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
 		}
 		
+		//* make sure that webalizer finds its config file when it is directly in /etc
+		if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+			exec('mkdir /etc/webalizer');
+			exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+		}
+		
+		if(is_file('/etc/webalizer/webalizer.conf')) {
+			// Change webalizer mode to incremental
+			replaceLine('/etc/webalizer/webalizer.conf','Incremental     no','Incremental     yes',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','HistoryName     webalizer.hist','HistoryName     webalizer.hist',0,0);
+		}
+		
+		//* add a sshusers group
+		$command = 'groupadd sshusers';
+		if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+		
 	}
 	
 	public function configure_firewall()
diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php
index b175e07..be5c8e0 100644
--- a/install/dist/lib/opensuse.lib.php
+++ b/install/dist/lib/opensuse.lib.php
@@ -432,6 +432,7 @@
 		//if(is_file('/etc/suphp.conf')) {
 		replaceLine('/etc/suphp.conf','php=php','x-httpd-suphp=php:/srv/www/cgi-bin/php5',0,0);
 		replaceLine('/etc/suphp.conf','docroot=','docroot=/srv/www',0,0);
+		replaceLine('/etc/suphp.conf','umask=0077','umask=0022',0);
 		//}
 		
 		// Sites enabled and avaulable dirs
@@ -464,6 +465,23 @@
 			exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
 		}
 		
+		//* make sure that webalizer finds its config file when it is directly in /etc
+		if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+			exec('mkdir /etc/webalizer');
+			exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+		}
+		
+		if(is_file('/etc/webalizer/webalizer.conf')) {
+			// Change webalizer mode to incremental
+			replaceLine('/etc/webalizer/webalizer.conf','Incremental     no','Incremental     yes',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','HistoryName     webalizer.hist','HistoryName     webalizer.hist',0,0);
+		}
+		
+		//* add a sshusers group
+		$command = 'groupadd sshusers';
+		if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+		
 	}
 	
 	public function configure_firewall()
diff --git a/install/install.php b/install/install.php
index 9474eb5..4378fd7 100644
--- a/install/install.php
+++ b/install/install.php
@@ -53,6 +53,10 @@
 //** Include the base class of the installer class
 require_once('lib/installer_base.lib.php');
 
+//** Ensure that current working directory is install directory
+$cur_dir = getcwd();
+if(realpath(dirname(__FILE__)) != $cur_dir) die("Please run installation/update from _inside_ the install directory!\n");
+
 //** Install logfile
 define('ISPC_LOG_FILE', '/var/log/ispconfig_install.log');
 define('ISPC_INSTALL_ROOT', realpath(dirname(__FILE__).'/../'));
@@ -191,6 +195,10 @@
 	swriteln('Configuring Apache');
 	$inst->configure_apache();
 	
+    //** Configure vlogger
+    swriteln('Configuring vlogger');
+    $inst->configure_vlogger();
+    
 	//* Configure Firewall
 	swriteln('Configuring Firewall');
 	$inst->configure_firewall();
@@ -355,6 +363,10 @@
 		$conf['services']['web'] = true;
 		swriteln('Configuring Apache');
 		$inst->configure_apache();
+        
+        //** Configure vlogger
+        swriteln('Configuring vlogger');
+        $inst->configure_vlogger();
 	}
 	
 	//** Configure Firewall
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index ed3c043..4886536 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -210,7 +210,11 @@
 		$tpl_ini_array['web']['website_basedir'] = $conf['web']['website_basedir'];
 		$tpl_ini_array['web']['website_path'] = $conf['web']['website_path'];
 		$tpl_ini_array['web']['website_symlinks'] = $conf['web']['website_symlinks'];
-		
+        $tpl_ini_array['cron']['crontab_dir'] = $conf['cron']['crontab_dir'];
+		$tpl_ini_array['web']['security_level'] = 20;
+		$tpl_ini_array['web']['user'] = $conf['apache']['user'];
+		$tpl_ini_array['web']['group'] = $conf['apache']['group'];
+        
 		$server_ini_content = array_to_ini($tpl_ini_array);
 		$server_ini_content = mysql_real_escape_string($server_ini_content);
 		
@@ -233,33 +237,10 @@
 			$sql = "INSERT INTO `server` (`server_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES ('".$conf['server_id']."',1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
 			$this->db->query($sql);
 			
-			//* insert the ispconfig user in the remote server
-			$from_host = $conf['hostname'];
-			$from_ip = gethostbyname($conf['hostname']);
-			
 			//* username for the ispconfig user
 			$conf['mysql']['master_ispconfig_user'] = 'ispcsrv'.$conf['server_id'];
-		
-			//* Delete ISPConfig user in the master database, in case that it exists
-			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
-			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
-			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
-			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
-			$this->dbmaster->query('FLUSH PRIVILEGES;');
-		
-			//* Create the ISPConfig database user in the remote database
-        	$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
-                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_host."' "
-                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
-			if(!$this->dbmaster->query($query)) {
-				$this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
-			}
-			$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
-                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_ip."' "
-                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
-			if(!$this->dbmaster->query($query)) {
-				$this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
-			}
+            
+            $this->grant_master_database_rights();
 		
 		} else {
 			//* Insert the server, if its not a mster / slave setup
@@ -272,6 +253,93 @@
 		
 	}
 	
+    public function grant_master_database_rights()
+    {
+        global $conf;
+        
+        if($conf['mysql']['master_slave_setup'] != 'y') return;
+        
+        //* insert the ispconfig user in the remote server
+        $from_host = $conf['hostname'];
+        $from_ip = gethostbyname($conf['hostname']);
+        
+        //* Delete ISPConfig user in the master database, in case that it exists
+        $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
+        $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
+        $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
+        $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
+        $this->dbmaster->query('FLUSH PRIVILEGES;');
+    
+        $hosts = array($from_host, $from_ip);
+        
+        foreach($hosts as $src_host) {
+            //* Create the ISPConfig database user in the remote database
+            $query = "GRANT SELECT ON ".$conf['mysql']['master_database'].".`server` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT SELECT, INSERT ON ".$conf['mysql']['master_database'].".`sys_log` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT SELECT, UPDATE(`status`) ON ".$conf['mysql']['master_database'].".`sys_datalog` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT UPDATE(`status`) ON ".$conf['mysql']['master_database'].".`software_update_inst` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT UPDATE (`ssl_request`, `ssl_cert`, `ssl_action`) ON ".$conf['mysql']['master_database'].".`web_domain` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT SELECT ON ".$conf['mysql']['master_database'].".`sys_group` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT INSERT , DELETE ON ".$conf['mysql']['master_database'].".`monitor_data` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT SELECT, INSERT, UPDATE ON ".$conf['mysql']['master_database'].".`mail_traffic` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+            $query = "GRANT SELECT, INSERT, UPDATE ON ".$conf['mysql']['master_database'].".`web_traffic` "
+                    ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+                    ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+            if(!$this->dbmaster->query($query)) {
+                $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+            }
+            
+        }
+    
+    }
 
     //** writes postfix configuration files
     public function process_postfix_config($configfile)
@@ -710,6 +778,7 @@
 		if(is_file('/etc/suphp/suphp.conf')) {
 			replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
 			//replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
+			replaceLine('/etc/suphp/suphp.conf','umask=0077','umask=0022',0);
 		}
 		
 		if(is_file('/etc/apache2/sites-enabled/000-default')) {
@@ -743,6 +812,23 @@
 		if(!@is_link($vhost_conf_enabled_dir."/000-ispconfig.conf")) {
 			exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
 		}
+		
+		//* make sure that webalizer finds its config file when it is directly in /etc
+		if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+			exec('mkdir /etc/webalizer');
+			exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+		}
+		
+		if(is_file('/etc/webalizer/webalizer.conf')) {
+			// Change webalizer mode to incremental
+			replaceLine('/etc/webalizer/webalizer.conf','Incremental     no','Incremental     yes',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+			replaceLine('/etc/webalizer/webalizer.conf','HistoryName     webalizer.hist','HistoryName     webalizer.hist',0,0);
+		}
+		
+		//* add a sshusers group
+		$command = 'groupadd sshusers';
+		if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
 		
 	}
 	
@@ -807,7 +893,32 @@
 
 	}
 	
-	
+    public function configure_vlogger()
+    {
+        global $conf;
+        
+        //** Configure vlogger to use traffic logging to mysql (master) db
+        $configfile = 'vlogger-dbi.conf';
+        if(is_file($conf["vlogger"]["config_dir"].'/'.$configfile)) copy($conf["vlogger"]["config_dir"].'/'.$configfile,$conf["vlogger"]["config_dir"].'/'.$configfile.'~');
+        if(is_file($conf["vlogger"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["vlogger"]["config_dir"].'/'.$configfile.'~');
+        $content = rf("tpl/".$configfile.".master");
+        if($conf['mysql']['master_slave_setup'] == 'y') {
+            $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['master_ispconfig_user'],$content);
+            $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['master_ispconfig_password'], $content);
+            $content = str_replace('{mysql_server_database}',$conf['mysql']['master_database'],$content);
+            $content = str_replace('{mysql_server_ip}',$conf["mysql"]["master_host"],$content);
+        } else {
+            $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
+            $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
+            $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
+            $content = str_replace('{mysql_server_ip}',$conf["mysql"]["host"],$content);
+        }
+        wf($conf["vlogger"]["config_dir"].'/'.$configfile,$content);
+        exec('chmod 600 '.$conf["vlogger"]["config_dir"].'/'.$configfile);
+        exec('chown root:root '.$conf["vlogger"]["config_dir"].'/'.$configfile);
+    
+    }
+    
 	public function install_ispconfig()
     {
 		global $conf;
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index e6f9dc8..c74261b 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -92,6 +92,9 @@
   `limit_dns_record` int(11) NOT NULL default '-1',
   `default_dbserver` int(11) NOT NULL default '1',
   `limit_database` int(11) NOT NULL default '-1',
+  `limit_cron` int(11) NOT NULL default '0',
+  `limit_cron_type` enum('url','chrooted','full') NOT NULL default 'url',
+  `limit_cron_frequency` int(11) NOT NULL default '5',
   `limit_client` int(11) NOT NULL default '0',
   `parent_client_id` int(11) unsigned NOT NULL default '0',
   `username` varchar(64) default NULL,
@@ -140,9 +143,39 @@
   `limit_dns_zone` int(11) NOT NULL default '-1',
   `limit_dns_record` int(11) NOT NULL default '-1',
   `limit_database` int(11) NOT NULL default '-1',
+  `limit_cron` int(11) NOT NULL default '0',
+  `limit_cron_type` enum('url','chrooted','full') NOT NULL default 'url',
+  `limit_cron_frequency` int(11) NOT NULL default '5',
   `limit_client` int(11) NOT NULL default '0',
   PRIMARY KEY  (`template_id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table  `dns_rr`
+-- 
+CREATE TABLE `cron` (
+  `id` int(11) unsigned NOT NULL auto_increment,
+  `sys_userid` int(11) unsigned NOT NULL default '0',
+  `sys_groupid` int(11) unsigned NOT NULL default '0',
+  `sys_perm_user` varchar(5) NULL default NULL,
+  `sys_perm_group` varchar(5) NULL default NULL,
+  `sys_perm_other` varchar(5) NULL default NULL,
+  `server_id` int(11) unsigned NOT NULL default '0',
+  `parent_domain_id` int(11) unsigned NOT NULL default '0',
+  `type` enum('url','chrooted','full') NOT NULL default 'url',
+  `command` varchar(255) NOT NULL,
+  `run_min` varchar(100) NULL,
+  `run_hour` varchar(100) NULL,
+  `run_mday` varchar(100) NULL,
+  `run_month` varchar(100) NULL,
+  `run_wday` varchar(100) NULL,
+  `active` enum('n','y') NOT NULL default 'y',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM  AUTO_INCREMENT=1;
+
 
 -- --------------------------------------------------------
 
@@ -1010,9 +1043,24 @@
   `database_password` varchar(64) default NULL,
   `database_charset` varchar(64) default NULL,
   `remote_access` enum('n','y') NOT NULL default 'y',
+  `remote_ips` text NOT NULL,
   `active` enum('n','y') NOT NULL default 'y',
   PRIMARY KEY  (`database_id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table  `web_traffic`
+--
+
+CREATE TABLE `web_traffic` (
+  `hostname` varchar(255) NOT NULL,
+  `traffic_date` date NOT NULL,
+  `traffic_bytes` bigint(32) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`hostname`,`traffic_date`)
+) ENGINE=MyISAM;
 
 
 -- --------------------------------------------------------
@@ -1148,7 +1196,7 @@
 -- Dumping data for table `sys_config`
 --
 
-INSERT INTO sys_config VALUES ('1','db','db_version','3.0.1.3');
+INSERT INTO sys_config VALUES ('1','db','db_version','3.0.1.4');
 
 -- --------------------------------------------------------
 
diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master
index c6d044b..49d0d9b 100644
--- a/install/tpl/apache_ispconfig.conf.master
+++ b/install/tpl/apache_ispconfig.conf.master
@@ -5,7 +5,7 @@
 ################################################
 
 LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
-CustomLog "| /usr/sbin/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig
+CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig
 
 <Directory /var/www/clients>
     AllowOverride None
diff --git a/install/tpl/config.inc.php.master b/install/tpl/config.inc.php.master
index 9ba9799..f4d0b9c 100644
--- a/install/tpl/config.inc.php.master
+++ b/install/tpl/config.inc.php.master
@@ -57,7 +57,7 @@
 
 //** Application
 define('ISPC_APP_TITLE', 'ISPConfig');
-define('ISPC_APP_VERSION', '3.0.1.3');
+define('ISPC_APP_VERSION', '3.0.1.4');
 
 
 //** Database
diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index 463397e..68d7e8e 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -34,6 +34,9 @@
 website_symlinks=/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/
 vhost_conf_dir=/etc/apache2/sites-available
 vhost_conf_enabled_dir=/etc/apache2/sites-enabled
+security_level=10
+user=www-data
+group=www-data
 
 [fastcgi]
 fastcgi_starter_path=/var/www/php-fcgi-scripts/[system_user]/
@@ -48,3 +51,12 @@
 jailkit_chroot_home=/home/[username]
 jailkit_chroot_app_sections=basicshell editors extendedshell netutils ssh sftp scp groups jk_lsh
 jailkit_chroot_app_programs=/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico
+jailkit_chroot_cron_programs=/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php
+
+[vlogger]
+config_dir=/etc
+
+[cron]
+init_script=cron
+crontab_dir=/etc/cron.d
+wget=/usr/bin/wget
diff --git a/install/tpl/vlogger-dbi.conf.master b/install/tpl/vlogger-dbi.conf.master
new file mode 100644
index 0000000..883bd6a
--- /dev/null
+++ b/install/tpl/vlogger-dbi.conf.master
@@ -0,0 +1,4 @@
+dsn DBI:mysql:database={mysql_server_database};host={mysql_server_ip}:3306
+user {mysql_server_ispconfig_user}
+pass {mysql_server_ispconfig_password}
+dump 30
\ No newline at end of file
diff --git a/install/update.php b/install/update.php
index b309509..83bca4d 100644
--- a/install/update.php
+++ b/install/update.php
@@ -53,6 +53,10 @@
 //** Include the base class of the installer class
 require_once('lib/installer_base.lib.php');
 
+//** Ensure that current working directory is install directory
+$cur_dir = getcwd();
+if(realpath(dirname(__FILE__)) != $cur_dir) die("Please run installation/update from _inside_ the install directory!\n");
+
 //** Install logfile
 define('ISPC_LOG_FILE', '/var/log/ispconfig_install.log');
 define('ISPC_INSTALL_ROOT', realpath(dirname(__FILE__).'/../'));
@@ -155,6 +159,9 @@
 
 //** Create the mysql database
 $inst->configure_database();
+
+//** Update master database rights
+$inst->grant_master_database_rights();
 
 //** empty all databases
 $db_tables = $inst->db->getTables();
@@ -284,6 +291,10 @@
 		//** Configure Apache
 		swriteln('Configuring Apache');
 		$inst->configure_apache();
+        
+        //** Configure vlogger
+        swriteln('Configuring vlogger');
+        $inst->configure_vlogger();
 	}
 	
 
diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php
index 6dcb171..e70922a 100644
--- a/interface/lib/app.inc.php
+++ b/interface/lib/app.inc.php
@@ -151,17 +151,14 @@
     public function lng($text)
     {
 		if($this->_language_inc != 1) {
-			//* loading global and module Wordbook
-            // TODO: this need to be made clearer somehow - pedro
-			//@include_once(ISPC_ROOT_PATH.'/lib/lang/'.$_SESSION['s']['language'].'.lng');
+			//* loading global Wordbook
 			$this->load_language_file('/lib/lang/'.$_SESSION['s']['language'].'.lng');
+			//* Load module wordbook, if it exists
 			if(isset($_SESSION['s']['module']['name']) && isset($_SESSION['s']['language'])) {
 				$lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
-				if(!file_exists($lng_file)) $lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
-				//@include_once($lng_file);
+				if(!file_exists(ISPC_ROOT_PATH.$lng_file)) $lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
 				$this->load_language_file($lng_file);
 			}
-			//if(isset($wb)) $this->_wb = $wb;
 			$this->_language_inc = 1;
 		}		
 		if(!empty($this->_wb[$text])) {
@@ -189,7 +186,11 @@
     public function tpl_defaults()
     {	
 		$this->tpl->setVar('app_title', $this->_conf['app_title']);
-		$this->tpl->setVar('app_version', $this->_conf['app_version']);
+		if(isset($_SESSION['s']['user'])) {
+			$this->tpl->setVar('app_version', $this->_conf['app_version']);
+		} else {
+			$this->tpl->setVar('app_version', '');
+		}
 		$this->tpl->setVar('app_link', $this->_conf['app_link']);
 		if(isset($this->_conf['app_logo']) && $this->_conf['app_logo'] != '' && @is_file($this->_conf['app_logo'])){
 			$this->tpl->setVar('app_logo', '<img src="'.$this->_conf['app_logo'].'">');
diff --git a/interface/lib/classes/custom_datasource.inc.php b/interface/lib/classes/custom_datasource.inc.php
index 298e997..52cd8b7 100644
--- a/interface/lib/classes/custom_datasource.inc.php
+++ b/interface/lib/classes/custom_datasource.inc.php
@@ -40,6 +40,56 @@
 		}
 		return $records_new;
 	}
+	
+	function dns_servers($field, $record) {
+		global $app, $conf;
+		
+		if($_SESSION["s"]["user"]["typ"] == 'user') {
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			$sql = "SELECT server_id,server_name FROM server WHERE server_id = ".$client['default_dnsserver'];
+		} else {
+			$sql = "SELECT server_id,server_name FROM server WHERE dns_server = 1 ORDER BY server_name";
+		}
+		$records = $app->db->queryAllRecords($sql);
+		$records_new = array();
+		if(is_array($records)) {
+			foreach($records as $rec) {
+				$key = $rec['server_id'];
+				$records_new[$key] = $rec['server_name'];
+			}
+		}
+		return $records_new;
+	}
+	
+	
+	function client_servers($field, $record) {
+		global $app, $conf;
+		
+		$server_type = $field['name'];
+		
+		if($_SESSION["s"]["user"]["typ"] == 'user') {
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$sql = "SELECT $server_type as server_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id";
+			$client = $app->db->queryOneRecord($sql);
+			$sql = "SELECT server_id,server_name FROM server WHERE server_id = ".$client['server_id'];
+		} else {
+			$sql = "SELECT server_id,server_name FROM server WHERE dns_server = 1 ORDER BY server_name";
+		}
+		$records = $app->db->queryAllRecords($sql);
+		$records_new = array();
+		if(is_array($records)) {
+			foreach($records as $rec) {
+				$key = $rec['server_id'];
+				$records_new[$key] = $rec['server_name'];
+			}
+		}
+		return $records_new;
+	}
+	
+	
 
 }
 
diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php
index 33103a0..b7b378d 100644
--- a/interface/lib/classes/tform.inc.php
+++ b/interface/lib/classes/tform.inc.php
@@ -276,6 +276,33 @@
 				}
 			}
 			
+			//* values are limited to a field in the reseller settings
+			if($limit_parts[0] == 'reseller') {
+				if($_SESSION["s"]["user"]["typ"] == 'admin') {
+					return $values;
+				} else {
+					//* Get the limits of the client that is currently logged in
+					$client_group_id = $_SESSION["s"]["user"]["default_group"];
+					$client = $app->db->queryOneRecord("SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+					//echo "SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id";
+					//* If the client belongs to a reseller, we will check against the reseller Limit too
+					if($client['parent_client_id'] != 0) {
+				
+						//* first we need to know the groups of this reseller
+						$tmp = $app->db->queryOneRecord("SELECT userid, groups FROM sys_user WHERE client_id = ".$client['parent_client_id']);
+						$reseller_groups = $tmp["groups"];
+						$reseller_userid = $tmp["userid"];
+				
+						// Get the limits of the reseller of the logged in client
+						$client_group_id = $_SESSION["s"]["user"]["default_group"];
+						$reseller = $app->db->queryOneRecord("SELECT ".$limit_parts[1]." as lm FROM client WHERE client_id = ".$client['parent_client_id']);
+						$allowed = explode(',',$reseller['lm']);
+					} else {
+						return $values;
+					}
+				} // end if admin
+			} // end if reseller
+			
 			//* values are limited to a field in the system settings
 			if($limit_parts[0] == 'system') {
 				$app->uses('getconf');
@@ -1148,6 +1175,63 @@
 			}
 			
 		}
+		
+		function checkClientLimit($limit_name,$sql_where = '') {
+			global $app;
+			
+			$check_passed = true;
+			$limit_name = $app->db->quote($limit_name);
+			if($limit_name == '') $app->error('Limit name missing in function checkClientLimit.');
+			
+			// Get the limits of the client that is currently logged in
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT $limit_name as number, parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			
+			// Check if the user may add another item
+			if($client["number"] >= 0) {
+				$sql = "SELECT count(".$this->formDef['db_table_idx'].") as number FROM ".$this->formDef['db_table']." WHERE ".$this->getAuthSQL('u');
+				if($sql_where != '') $sql .= ' and '.$sql_where;
+				$tmp = $app->db->queryOneRecord($sql);
+				if($tmp["number"] >= $client["number"]) $check_passed = false;
+			}
+			
+			return $check_passed;
+		}
+		
+		function checkResellerLimit($limit_name,$sql_where = '') {
+			global $app;
+			
+			$check_passed = true;
+			$limit_name = $app->db->quote($limit_name);
+			if($limit_name == '') $app->error('Limit name missing in function checkClientLimit.');
+			
+			// Get the limits of the client that is currently logged in
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			
+			//* If the client belongs to a reseller, we will check against the reseller Limit too
+			if($client['parent_client_id'] != 0) {
+				
+				//* first we need to know the groups of this reseller
+				$tmp = $app->db->queryOneRecord("SELECT userid, groups FROM sys_user WHERE client_id = ".$client['parent_client_id']);
+				$reseller_groups = $tmp["groups"];
+				$reseller_userid = $tmp["userid"];
+				
+				// Get the limits of the reseller of the logged in client
+				$client_group_id = $_SESSION["s"]["user"]["default_group"];
+				$reseller = $app->db->queryOneRecord("SELECT $limit_name as number FROM client WHERE client_id = ".$client['parent_client_id']);
+			
+				// Check if the user may add another item
+				if($reseller["number"] >= 0) {
+					$sql = "SELECT count(".$this->formDef['db_table_idx'].") as number FROM ".$this->formDef['db_table']." WHERE (sys_groupid IN (".$reseller_groups.") or sys_userid = ".$reseller_userid.")";
+					if($sql_where != '') $sql .= ' and '.$sql_where;
+					$tmp = $app->db->queryOneRecord($sql);
+					if($tmp["number"] >= $reseller["number"]) $check_passed = false;
+				}
+			}
+			
+			return $check_passed;
+		}
 
 }
 
diff --git a/interface/lib/classes/tform_actions.inc.php b/interface/lib/classes/tform_actions.inc.php
index b280d26..0593c03 100644
--- a/interface/lib/classes/tform_actions.inc.php
+++ b/interface/lib/classes/tform_actions.inc.php
@@ -359,7 +359,7 @@
 			if($app->tform->formDef['auth'] == 'no') {
             	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
             } else {
-            	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+            	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
             }
             if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
 			
@@ -400,7 +400,7 @@
 				if($app->tform->formDef['auth'] == 'no') {
             		$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
             	} else {
-            		$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+            		$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
             	}
             	if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
 			
@@ -436,7 +436,7 @@
 			if($app->tform->formDef['auth'] == 'no') {
             	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
             } else {
-            	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+            	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
             }
             if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
 			
@@ -527,7 +527,7 @@
                 // bestehenden Datensatz anzeigen
                 if($app->tform->errorMessage == '') {
                         if($app->tform->formDef['auth'] == 'yes' && $_SESSION["s"]["user"]["typ"] != 'admin') {
-                        	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+                        	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
                         } else {
                         	$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
                         }
diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php
index f721298..1124d72 100644
--- a/interface/lib/classes/validate_client.inc.php
+++ b/interface/lib/classes/validate_client.inc.php
@@ -40,7 +40,7 @@
         	$num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM sys_user WHERE username = '".$app->db->quote($field_value)."'");
             	if($num_rec["number"] > 0) {
                 	$errmsg = $validator['errmsg'];
-					if(isset($this->wordbook[$errmsg])) {
+					if(isset($app->tform->wordbook[$errmsg])) {
                     	return $app->tform->wordbook[$errmsg]."<br>\r\n";
 					} else {
 						return $errmsg."<br>\r\n";
diff --git a/interface/lib/classes/validate_cron.inc.php b/interface/lib/classes/validate_cron.inc.php
new file mode 100644
index 0000000..42d9eb6
--- /dev/null
+++ b/interface/lib/classes/validate_cron.inc.php
@@ -0,0 +1,191 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class validate_cron {
+	
+    function get_error($errmsg) {
+        global $app;
+        
+        if(isset($app->tform->wordbook[$errmsg])) {
+            return $app->tform->wordbook[$errmsg]."<br>\r\n";
+        } else {
+            return $errmsg."<br>\r\n";
+        }
+    }
+    
+    /*
+        Validator function to check if a given cron command is in correct form (url only).
+    */
+    function command_format($field_name, $field_value, $validator) {
+        if(preg_match("'^(\w+):\/\/'", $field_value, $matches)) {
+            
+            $parsed = parse_url($field_value);
+            if($parsed === false) return $this->get_error($validator['errmsg']);
+            
+            if($parsed["scheme"] != "http" && $parsed["scheme"] != "https") return $this->get_error($validator['errmsg']);
+            
+            if(preg_match("'^([a-z0-9][a-z0-9-]{0,62}\.)+([a-z]{2,4})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']);
+        }
+    }
+    
+	/*
+		Validator function to check if a given cron time is in correct form.
+	*/
+	function run_time_format($field_name, $field_value, $validator) {
+		global $app;
+		
+        //* check general form
+        $is_ok = true;
+        $field_value = str_replace(" ", "", $field_value); // spaces are not needed
+        $used_times = array();
+        
+        if(preg_match("'^[0-9\-\,\/\*]+$'", $field_value) == false) return $this->get_error($validator['errmsg']); // allowed characters are 0-9, comma, *, -, /
+        elseif(preg_match("'[\-\,\/][\-\,\/]'", $field_value) == true) return $this->get_error($validator['errmsg']); // comma, - and / never stand together
+        //* now split list and check each entry. store used values in array for later limit-check
+        $time_list = split(",", $field_value);
+        if(count($time_list) < 1) return $this->get_error($validator['errmsg']);
+        
+        $max_entry = 0;
+        $min_entry = 0;
+        $in_minutes = 1;
+        //* get maximum value of entry for each field type (name)
+        switch($field_name) {
+            case "run_min":
+                $max_entry = 59;
+                break;
+            case "run_hour":
+                $max_entry = 23;
+                $in_minutes = 60;
+                break;
+            case "run_mday":
+                $max_entry = 31;
+                $min_entry = 1;
+                $in_minutes = 1440;
+                break;
+            case "run_month":
+                $max_entry = 12;
+                $min_entry = 1;
+                $in_minutes = 1440 * 28; // not exactly but enough
+                break;
+            case "run_wday":
+                $max_entry = 7;
+                $in_minutes = 1440;
+                break;
+        }
+        
+        if($max_entry == 0) return $this->get_error('unknown_fieldtype_error');
+        
+        foreach($time_list as $entry) {
+            //* possible value combinations:
+            //* x               =>      ^(\d+)$
+            //* x-y             =>      ^(\d+)\-(\d+)$
+            //* x/y             =>      ^(\d+)\/([1-9]\d*)$
+            //* x-y/z           =>      ^(\d+)\-(\d+)\/([1-9]\d*)$
+            //* */x             =>      ^\*\/([1-9]\d*)$
+            //* combined regex  =>      ^(\d+|\*)(\-(\d+))?(\/([1-9]\d*))?$
+            
+            if(preg_match("'^(((\d+)(\-(\d+))?)|\*)(\/([1-9]\d*))?$'", $entry, $matches) == false) {
+                return $this->get_error($validator['errmsg']);
+            }
+            
+            //* matches contains:
+            //* 1       =>      * or value or x-y range
+            //* 2       =>      unused
+            //* 3       =>      value if [1] != *
+            //* 4       =>      empty if no range was used
+            //* 5       =>      2nd value of range if [1] != * and range was used
+            //* 6       =>      empty if step was not used
+            //* 7       =>      step
+            
+            $loop_step = 1;
+            $loop_from = $min_entry;
+            $loop_to = $max_entry;
+            
+            //* calculate used values
+            if($matches[1] == "*") {
+                //* not to check
+            } else {
+                if($matches[3] < $min_entry || $matches[3] > $max_entry) {
+                    //* check if value is in allowed range
+                    return $this->get_error($validator['errmsg']);
+                } elseif($matches[4] && ($matches[5] < $min_entry || $matches[5] > $max_entry || $matches[5] <= $matches[3])) {
+                    //* check if value is in allowed range and not less or equal to first value
+                    return $this->get_error($validator['errmsg']);
+                }
+                
+                $loop_from = $matches[3];
+                $loop_to = $matches[3];
+                if($matches[4]) $loop_to = $matches[5];
+            }
+            if($matches[6] && ($matches[7] < 2 || $matches[7] > $max_entry - 1)) {
+                //* check if step value is valid
+                return $this->get_error($validator['errmsg']);
+            }
+            if($matches[7]) $loop_step = $matches[7];
+            
+            //* loop through values to set used times
+            for($t = $loop_from; $t <= $loop_to; $t = $t + $loop_step) {
+                $used_times[] = $t;
+            }
+        } //* end foreach entry loop
+        
+        //* sort used times and erase doubles
+        sort($used_times);
+        $used_times = array_unique($used_times);
+        
+        //* get minimum frequency and store it in $app->tform->cron_min_freq for usage in onUpdateSave and onInsertSave!
+        $min_freq = -1;
+        $prev_time = -1;
+        foreach($used_times as $curtime) {
+            if($prev_time != -1) {
+                $freq = $curtime - $prev_time;
+                if($min_freq == -1 || $freq < $min_freq) $min_freq = $freq;
+            }
+            $prev_time = $curtime;
+        }
+        
+        //* check last against first (needed because e.g. wday 1,4,7 has diff 1 not 3
+        $prev_time = $used_times[0];
+        $freq = ($prev_time - $min_entry) + ($max_entry - $curtime) + 1;
+        if($min_freq == -1 || $freq < $min_freq) $min_freq = $freq;
+        
+        if($min_freq > 0 && $min_freq <= $max_entry) { //* only store if > 1 && < $max_entry!
+            $min_freq = $min_freq * $in_minutes; // we have to overwrite $app->tform->cron_min_freq if this is higher value
+            if(!$app->tform->cron_min_freq || $app->tform->cron_min_freq > $min_freq) $app->tform->cron_min_freq = $min_freq;
+        }
+        
+        //return "DEBUG: " . $app->tform->cron_min_freq . " ($min_freq) --- " . var_export($used_times, true) . "<br />";
+	}
+	
+	
+	
+	
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_database.inc.php b/interface/lib/classes/validate_database.inc.php
new file mode 100644
index 0000000..c4ea5d0
--- /dev/null
+++ b/interface/lib/classes/validate_database.inc.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class validate_database {
+	
+	/*
+		Validator function to check if a given list of ips is ok.
+	*/
+	function valid_ip_list($field_name, $field_value, $validator) {
+		global $app;
+		
+    if($_POST["remote_access"] == "y") {
+        if(trim($field_value) == "") return;
+        
+        $values = split(",", $field_value);
+        foreach($values as $cur_value) {
+            $cur_value = trim($cur_value);
+            
+            $valid = true;
+            if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $cur_value)) {
+                $groups = explode(".", $cur_value);
+                foreach($groups as $group){
+                  if($group<0 OR $group>255)
+                  $valid=false;
+                }
+            } else {
+                $valid = false;
+            }
+            
+            if($valid == false) {
+                $errmsg = $validator['errmsg'];
+                if(isset($app->tform->wordbook[$errmsg])) {
+                    return $app->tform->wordbook[$errmsg]."<br>\r\n";
+                } else {
+                    return $errmsg."<br>\r\n";
+                }
+            }
+        }
+    }
+  }
+	
+	
+	
+	
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_ftpuser.inc.php b/interface/lib/classes/validate_ftpuser.inc.php
new file mode 100644
index 0000000..7e04cb9
--- /dev/null
+++ b/interface/lib/classes/validate_ftpuser.inc.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class validate_ftpuser {
+	
+	/*
+		Validator function to check if a given dir is ok.
+	*/
+	function ftp_dir($field_name, $field_value, $validator) {
+		global $app;
+		
+        if($app->tform->primary_id == 0) {
+            $errmsg = $validator['errmsg'];
+            if(isset($app->tform->wordbook[$errmsg])) {
+                return $app->tform->wordbook[$errmsg]."<br>\r\n";
+            } else {
+                return $errmsg."<br>\r\n";
+            }
+        }
+        
+        
+        $ftp_data = $app->db->queryOneRecord("SELECT parent_domain_id FROM ftp_user WHERE ftp_user_id = '".$app->db->quote($app->tform->primary_id)."'");
+        if(!$ftp_data["parent_domain_id"]) {
+            $errmsg = $validator['errmsg'];
+            if(isset($app->tform->wordbook[$errmsg])) {
+                return $app->tform->wordbook[$errmsg]."<br>\r\n";
+            } else {
+                return $errmsg."<br>\r\n";
+            }
+        }
+        
+        $domain_data = $app->db->queryOneRecord("SELECT domain_id, document_root FROM web_domain WHERE domain_id = '".$app->db->quote($ftp_data["parent_domain_id"])."'");
+        if(!$domain_data["domain_id"]) {
+            $errmsg = $validator['errmsg'];
+            if(isset($app->tform->wordbook[$errmsg])) {
+                return $app->tform->wordbook[$errmsg]."<br>\r\n";
+            } else {
+                return $errmsg."<br>\r\n";
+            }
+        }
+        
+        $doc_root = $domain_data["document_root"];
+        $is_ok = false;
+        if($doc_root == $field_value) $is_ok = true;
+        
+        $doc_root .= "/";
+        if(substr($field_value, 0, strlen($doc_root)) == $doc_root) $is_ok = true;
+        
+        if($is_ok == false) {
+            $errmsg = $validator['errmsg'];
+            if(isset($app->tform->wordbook[$errmsg])) {
+                return $app->tform->wordbook[$errmsg]."<br>\r\n";
+            } else {
+                return $errmsg."<br>\r\n";
+            }
+        }
+	}
+	
+	
+	
+	
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_reseller.inc.php b/interface/lib/classes/validate_reseller.inc.php
new file mode 100644
index 0000000..5453905
--- /dev/null
+++ b/interface/lib/classes/validate_reseller.inc.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class validate_reseller {
+    
+    /*
+        Validator function to check if a given cron command is in correct form (url only).
+    */
+    function limit_client($field_name, $field_value, $validator) {
+        global $app;
+		
+		if($field_value <= 0) {
+			return $app->tform->lng('limit_client_error_positive');
+		} else {
+			return '';
+		}
+    }
+
+	
+}
\ No newline at end of file
diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng
new file mode 100644
index 0000000..3aad6e0
--- /dev/null
+++ b/interface/lib/lang/br.lng
@@ -0,0 +1,25 @@
+<?php
+$wb['conf_format_dateshort'] = 'd/m/Y';
+$wb['conf_format_datelong'] = 'l dS of F Y';
+$wb['conf_format_timeshort'] = 'H:i';
+$wb['conf_format_timelong'] = 'H:i:s';
+$wb['conf_format_datetime'] = 'd/m/Y H:i';
+$wb['301'] = 'Módulo não permitido para o usuário corrente.';
+$wb['302'] = 'Módulo Inválido';
+$wb['1001'] = 'O nome de usuário e senha não podem estar em branco!';
+$wb['1002'] = 'Nome de usuário ou senha incorretos!';
+$wb['1003'] = 'O Usuário está inativo!';
+$wb['delete_confirmation'] = 'Tem certeza de que deseja remover este registro?';
+$wb['error_no_view_permission'] = 'Você não tem permissão para ver este registro ou o mesmo não existe!';
+$wb['error_no_delete_permission'] = 'Você não tem permissão para remover este registro!';
+$wb['page_txt'] = 'Página';
+$wb['page_of_txt'] = 'de';
+$wb['page_next_txt'] = 'Próximo';
+$wb['page_back_txt'] = 'Voltar';
+$wb['delete_txt'] = 'Remover';
+$wb['filter_txt'] = 'Filtrar';
+$wb['add_new_record_txt'] = 'Adcionar novo registro';
+$wb['btn_save_txt'] = 'Salvar';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/form/server.tform.php b/interface/web/admin/form/server.tform.php
index 80b672e..87b1c18 100644
--- a/interface/web/admin/form/server.tform.php
+++ b/interface/web/admin/form/server.tform.php
@@ -122,7 +122,7 @@
 	)
 );
 
-
+/*
 $form["tabs"]['config'] = array (
 	'title' 	=> "Config",
 	'width' 	=> 100,
@@ -146,6 +146,6 @@
 	##################################
 	)
 );
-
+*/
 
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php
index 754000b..999a1f9 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -339,6 +339,34 @@
 			'width'		=> '40',
 			'maxlength'	=> '255'
 		),
+		'security_level' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'SELECT',
+			'default'	=> '20',
+			'value'		=> array('10' => 'Medium', '20' => 'High')
+		),
+		'user' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'apache_user_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+		'group' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'apache_group_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
 	##################################
 	# ENDE Datatable fields
 	##################################
@@ -478,6 +506,17 @@
 			'width'		=> '40',
 			'maxlength'	=> '1000'
 		),
+        'jailkit_chroot_cron_programs' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'default'   => '',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'jailkit_chroot_cron_programs_error_empty'),
+                                    ),
+            'value'     => '',
+            'width'     => '40',
+            'maxlength' => '1000'
+        ),
 	##################################
 	# ENDE Datatable fields
 	##################################
@@ -485,10 +524,79 @@
 );
 
 
+$form["tabs"]['vlogger'] = array (
+    'title'     => "vlogger",
+    'width'     => 80,
+    'template'  => "templates/server_config_vlogger_edit.htm",
+    'fields'    => array (
+    ##################################
+    # Begin Datatable fields
+    ##################################
+        'config_dir' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'default'   => '',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'vlogger_config_dir_error_empty'),
+                                    ),
+            'value'     => '',
+            'width'     => '40',
+            'maxlength' => '255'
+        ),
+    ##################################
+    # ENDE Datatable fields
+    ##################################
+    )
+);
 
 
 
-
+$form["tabs"]['cron'] = array (
+    'title'     => "Cron",
+    'width'     => 80,
+    'template'  => "templates/server_config_cron_edit.htm",
+    'fields'    => array (
+    ##################################
+    # Begin Datatable fields
+    ##################################
+        'init_script' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'default'   => '',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'cron_init_script_error_empty'),
+                                    ),
+            'value'     => '',
+            'width'     => '40',
+            'maxlength' => '255'
+        ),
+        'crontab_dir' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'default'   => '',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'crontab_dir_error_empty'),
+                                    ),
+            'value'     => '',
+            'width'     => '40',
+            'maxlength' => '255'
+        ),
+        'wget' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'default'   => '',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'cron_wget_error_empty'),
+                                    ),
+            'value'     => '',
+            'width'     => '40',
+            'maxlength' => '255'
+        ),
+    ##################################
+    # ENDE Datatable fields
+    ##################################
+    )
+);
 
 
 
diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/bg_server_config.lng
+++ b/interface/web/admin/lib/lang/bg_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/br.lng b/interface/web/admin/lib/lang/br.lng
new file mode 100644
index 0000000..6081ef2
--- /dev/null
+++ b/interface/web/admin/lib/lang/br.lng
@@ -0,0 +1,35 @@
+<?php
+$wb['1001'] = 'Por favor, preencha o nome do usuário e senha!';
+$wb['1002'] = 'Nome do usuário ou senha incorretos!';
+$wb['Firewall'] = 'Firewall';
+$wb['Groups'] = 'Grupos';
+$wb['groups_description'] = 'Formulário para edição dos Grupos de usuários do sistema.';
+$wb['Server'] = 'Servidor';
+$wb['Services'] = 'Serviços';
+$wb['Config'] = 'Configuração';
+$wb['Server Config'] = 'Configuração do Servidor';
+$wb['Mail'] = 'Mail';
+$wb['Getmail'] = 'Getmail';
+$wb['Web'] = 'Web';
+$wb['FastCGI'] = 'FastCGI';
+$wb['Jailkit'] = 'Jailkit';
+$wb['System'] = 'Sistema';
+$wb['Add user'] = 'Adicionar Usuário';
+$wb['Edit user'] = 'Editar Usuário';
+$wb['CP Users'] = 'Usuários Visar';
+$wb['Add group'] = 'Adicionar Grupo';
+$wb['Edit group'] = 'Editar Grupo';
+$wb['Edit server'] = 'Editar Servidor';
+$wb['Edit Server IP'] = 'Editar Endereço IP do Servidor';
+$wb['Servers'] = 'Servidores';
+$wb['Sync. Now'] = 'Sincronizar agora';
+$wb['DB Sync.'] = 'Sincronizar Bando de Dados';
+$wb['Languages'] = 'Idiomas';
+$wb['New Language'] = 'Novo Idioma';
+$wb['Export'] = 'Exportar';
+$wb['Import'] = 'Importar';
+$wb['Language Editor'] = 'Editor de Idiomas';
+$wb['Software'] = 'Software';
+$wb['Repositories'] = 'Repositórios';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_firewall.lng b/interface/web/admin/lib/lang/br_firewall.lng
new file mode 100644
index 0000000..1f276e5
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_firewall.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['tcp_port_txt'] = 'Portas TCP abertas';
+$wb['udp_port_txt'] = 'Portas UDP abertas';
+$wb['tcp_port_help_txt'] = 'Separado por vírgula';
+$wb['udp_port_help_txt'] = 'Separado por vírgula';
+$wb['active_txt'] = 'Ativo';
+$wb['firewall_error_unique'] = 'Já existe uma regra de firewall para este servidor!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_firewall_list.lng b/interface/web/admin/lib/lang/br_firewall_list.lng
new file mode 100644
index 0000000..143a966
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_firewall_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Firewall';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["tcp_port_txt"] = 'Portas TCP abertas';
+$wb["udp_port_txt"] = 'Portas UDP abertas';
+$wb["add_new_record_txt"] = 'Adcionar registro de firewall';
+?>
diff --git a/interface/web/admin/lib/lang/br_groups.lng b/interface/web/admin/lib/lang/br_groups.lng
new file mode 100644
index 0000000..ee75776
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_groups.lng
@@ -0,0 +1,6 @@
+<?php
+$wb['description_txt'] = 'Descrição';
+$wb['name_txt'] = 'Grupo';
+$wb['name_err'] = 'O Nome do Grupo deve conter de 1 a 30 caracteres!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_groups_list.lng b/interface/web/admin/lib/lang/br_groups_list.lng
new file mode 100644
index 0000000..68a49ce
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_groups_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Grupos de usuários do sistema';
+$wb['description_txt'] = 'Descrição';
+$wb['name_txt'] = 'Grupo';
+$wb['add_new_record_txt'] = 'Adicionar novo Grupo';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_add.lng b/interface/web/admin/lib/lang/br_language_add.lng
new file mode 100644
index 0000000..d31fb97
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_add.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Adcionar novo idioma';
+$wb['language_select_txt'] = 'Selecione o idioma base';
+$wb['language_new_txt'] = 'Novo Idioma';
+$wb['language_new_hint_txt'] = '2 letras código ISO 639-1 (Veja http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)';
+$wb['btn_save_txt'] = 'Criar um novo conjunto de idioma';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_complete.lng b/interface/web/admin/lib/lang/br_language_complete.lng
new file mode 100644
index 0000000..4a6795e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_complete.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Mesclar Idioma';
+$wb['list_desc_txt'] = 'Mesclar o arquivo de idioma selecionado com o arquivo de idioma principal (em inglês). <br />Isto permite completar qualquer falha de tradução, com o arquivo principal original em inglês.';
+$wb['language_select_txt'] = 'Selecionar Idioma';
+$wb['btn_save_txt'] = 'Mesclar arquivos agora';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_edit.lng b/interface/web/admin/lib/lang/br_language_edit.lng
new file mode 100644
index 0000000..f023e9c
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_edit.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Editor de Arquivos de Idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['module_txt'] = 'Módulo';
+$wb['lang_file_txt'] = 'Arquivo de Idioma';
+$wb['btn_save_txt'] = 'Salvar';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_export.lng b/interface/web/admin/lib/lang/br_language_export.lng
new file mode 100644
index 0000000..f7f924c
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_export.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Exportar arquivos de idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['btn_save_txt'] = 'Exportar idioma selecionado para um arquivo';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_import.lng b/interface/web/admin/lib/lang/br_language_import.lng
new file mode 100644
index 0000000..71d0d5e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_import.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Importar arquivo de idioma';
+$wb["language_import_txt"] = 'Buscar arquivo de idioma';
+$wb['btn_save_txt'] = 'Importar Arquivo de Idioma Selecionado';
+$wb["language_overwrite_txt"] = 'Sobre escrever o arquivo se existir.';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
diff --git a/interface/web/admin/lib/lang/br_language_list.lng b/interface/web/admin/lib/lang/br_language_list.lng
new file mode 100644
index 0000000..fe3d2a4
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Editor de arquivo de idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['module_txt'] = 'Módulo';
+$wb['lang_file_txt'] = 'Arquido de Idioma';
+$wb['lang_file_date_txt'] = 'Ultima Modificação';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server.lng b/interface/web/admin/lib/lang/br_server.lng
new file mode 100644
index 0000000..ce97f76
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['config_txt'] = 'Configuração';
+$wb['server_name_txt'] = 'Nome do Servidor';
+$wb['mail_server_txt'] = 'Servidor de Mail';
+$wb['web_server_txt'] = 'Servidor Web';
+$wb['dns_server_txt'] = 'Servidor DNS';
+$wb['file_server_txt'] = 'Servidor de Arquivo';
+$wb['db_server_txt'] = 'Servidor de Banco de Dados';
+$wb['vserver_server_txt'] = 'Servidor VServer';
+$wb['active_txt'] = 'Ativado';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng
new file mode 100644
index 0000000..65b7b26
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_config.lng
@@ -0,0 +1,42 @@
+<?php
+$wb['jailkit_chroot_home_txt'] = 'Chroot Jailkit home';
+$wb['jailkit_chroot_app_sections_txt'] = 'Aplicações Jailkit chroot (Sessões)';
+$wb['jailkit_chroot_app_programs_txt'] = 'Aplicações Jailkit em ambiente chroot';
+$wb['website_path_txt'] = 'Website path';
+$wb['website_symlinks_txt'] = 'Website symlinks: link simbólico';
+$wb['website_basedir_txt'] = 'Website basedir: Diretório base ';
+$wb['vhost_conf_dir_txt'] = 'Vhost config dir';
+$wb['vhost_conf_enabled_dir_txt'] = 'Vhost diretório de configuração ativo';
+$wb['getmail_config_dir_txt'] = 'Getmail config dir';
+$wb['fastcgi_starter_path_txt'] = 'FastCGI: Caminho diretório inicial';
+$wb['fastcgi_starter_script_txt'] = 'FastCGI: Script inicial';
+$wb['fastcgi_alias_txt'] = 'FastCGI: Alias';
+$wb['fastcgi_phpini_path_txt'] = 'FastCGI: Caminho do php.ini ';
+$wb['fastcgi_children_txt'] = 'FastCGI: Filhos';
+$wb['fastcgi_max_requests_txt'] = 'FastCGI: Requisições máximas';
+$wb['fastcgi_bin_txt'] = 'FastCGI Bin';
+$wb['module_txt'] = 'Módulo';
+$wb['maildir_path_txt'] = 'Caminho do diretório Maildir';
+$wb['homedir_path_txt'] = 'Caminho do diretório Home';
+$wb['mailuser_uid_txt'] = 'UID usuário de email';
+$wb['mailuser_gid_txt'] = 'GID usuário de email';
+$wb['mailuser_name_txt'] = 'Nome usuário de email';
+$wb['mailuser_group_txt'] = 'Grupo usuário de email';
+$wb['relayhost_txt'] = 'Host Relay';
+$wb['relayhost_user_txt'] = 'Usuário do Host Relay';
+$wb['relayhost_password_txt'] = 'Senha do Host Relay';
+$wb['mailbox_size_limit_txt'] = 'Tamanho máximo da Caixa Postal';
+$wb['message_size_limit_txt'] = 'Tamanho máximo de mensagem';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['netmask_txt'] = 'Máscara de Rede';
+$wb['gateway_txt'] = 'Gateway';
+$wb['hostname_txt'] = 'Nome do Host';
+$wb['nameservers_txt'] = 'Servidores DNS';
+$wb['auto_network_configuration_txt'] = 'Configuração de Rede';
+$wb['ip_address_error_wrong'] = 'Formato do Endereço IP inválido!';
+$wb['netmask_error_wrong'] = 'Formato da Máscara de Rede inválio!';
+$wb['gateway_error_wrong'] = 'Gateway inválido!';
+$wb['hostname_error_empty'] = 'Por favor, entre com o nome do Host.';
+$wb['nameservers_error_empty'] = 'Por favor, entre com  o Servidor DNS.';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_config_list.lng b/interface/web/admin/lib/lang/br_server_config_list.lng
new file mode 100644
index 0000000..551867d
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_config_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb['list_head_txt'] = 'Configuração do Servidor';
+$wb['server_name_txt'] = 'Servidor';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_ip.lng b/interface/web/admin/lib/lang/br_server_ip.lng
new file mode 100644
index 0000000..b1bbc8e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_ip.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['virtualhost_txt'] = 'Nome VirtualHost HTTP';
+$wb['ip_err'] = 'Endereço IP inválido!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_ip_list.lng b/interface/web/admin/lib/lang/br_server_ip_list.lng
new file mode 100644
index 0000000..6b137cc
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_ip_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Endereço IP';
+$wb['server_id_txt'] = 'Servidor';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['add_new_record_txt'] = 'Adicionar novo Endereço IP';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_list.lng b/interface/web/admin/lib/lang/br_server_list.lng
new file mode 100644
index 0000000..011e47e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Servidor';
+$wb['server_name_txt'] = 'Nome';
+$wb['mail_server_txt'] = 'Mail';
+$wb['web_server_txt'] = 'Web';
+$wb['dns_server_txt'] = 'DNS';
+$wb['file_server_txt'] = 'Arquivo';
+$wb['db_server_txt'] = 'Banco de Dados';
+$wb['vserver_server_txt'] = 'VServer';
+$wb['add_new_record_txt'] = 'Adicionar novo Servidor';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_package_list.lng b/interface/web/admin/lib/lang/br_software_package_list.lng
new file mode 100644
index 0000000..2faa815
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_package_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Pacotes de Software';
+$wb['installed_txt'] = 'Status';
+$wb['package_title_txt'] = 'Pacote';
+$wb['package_description_txt'] = 'Descrição';
+$wb['action_txt'] = 'Acão';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_repo.lng b/interface/web/admin/lib/lang/br_software_repo.lng
new file mode 100644
index 0000000..9d09727
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_repo.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['repo_name_txt'] = 'Repositório';
+$wb['repo_url_txt'] = 'URL';
+$wb['repo_username_txt'] = 'Usuário (opcional)';
+$wb['repo_password_txt'] = 'Senha (opcional)';
+$wb['active_txt'] = 'Ativo';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_repo_list.lng b/interface/web/admin/lib/lang/br_software_repo_list.lng
new file mode 100644
index 0000000..4352970
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_repo_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Repositório';
+$wb["active_txt"] = 'Ativo';
+$wb["repo_name_txt"] = 'Repositório';
+$wb["repo_url_txt"] = 'URL';
+?>
diff --git a/interface/web/admin/lib/lang/br_software_update_list.lng b/interface/web/admin/lib/lang/br_software_update_list.lng
new file mode 100644
index 0000000..6cc6a55
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_update_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Atualizações de Programas';
+$wb['server_select_txt'] = 'Selecione o servidor';
+$wb['installed_txt'] = 'Ações';
+$wb['update_title_txt'] = 'Atualizar';
+$wb['version_txt'] = 'Versão';
+$wb['action_txt'] = 'Ação';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng
new file mode 100644
index 0000000..bc22ce6
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_system_config.lng
@@ -0,0 +1,14 @@
+<?php
+$wb['warning'] = 'Edite estes valores com cuidado! Não remova os prefixos em um sistema com mais de um cliente!!';
+$wb['dbname_prefix_txt'] = 'Prefixo Nome do Banco de Dados';
+$wb['dbuser_prefix_txt'] = 'Prefixo Usuário do Banco de Dados';
+$wb['shelluser_prefix_txt'] = 'Prefixo Usuário de Shell';
+$wb['ftpuser_prefix_txt'] = 'Prefixo Usuário FTP';
+$wb['dbname_prefix_error_regex'] = 'Caractere não permitido para o prefixo do nome do Banco de Dados!';
+$wb['dbuser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário do Banco de Dados!';
+$wb['ftpuser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário FTP!';
+$wb['shelluser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário Shell!';
+$wb['dblist_phpmyadmin_link_txt'] = 'Link para phpmyadmin';
+$wb['mailboxlist_webmail_link_txt'] = 'Link para o webmail';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_users.lng b/interface/web/admin/lib/lang/br_users.lng
new file mode 100644
index 0000000..a63a2f4
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_users.lng
@@ -0,0 +1,29 @@
+<?php
+$wb['username_txt'] = 'Usuário';
+$wb['username_err'] = 'O Nome do Usuário é muito longo ou contém caracteres inválidos!';
+$wb['username_empty'] = 'Por favor, entre com o nome do Usuário.';
+$wb['username_unique'] = 'Já existe um Usuário com este nome!';
+$wb['passwort_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança da Senha';
+$wb['modules_txt'] = 'Módulos';
+$wb['startmodule_txt'] = 'Módulo Inicial';
+$wb['app_theme_txt'] = 'Tema';
+$wb['typ_txt'] = 'Tipo';
+$wb['active_txt'] = 'Ativo';
+$wb['language_txt'] = 'Idioma';
+$wb['name_txt'] = 'Nome';
+$wb['vorname_txt'] = 'Sobrenome';
+$wb['unternehmen_txt'] = 'Empresa';
+$wb['strasse_txt'] = 'Endereço';
+$wb['ort_txt'] = 'Cidade';
+$wb['plz_txt'] = 'CEP';
+$wb['land_txt'] = 'País';
+$wb['email_txt'] = 'E-mail';
+$wb['url_txt'] = 'Site';
+$wb['telefon_txt'] = 'Telefone';
+$wb['fax_txt'] = 'Fax';
+$wb['groups_txt'] = 'Grupos';
+$wb['default_group_txt'] = 'Grupo Padrão';
+$wb['startmodule_err'] = 'O módulo inicial não está contido nos módulos.';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_users_list.lng b/interface/web/admin/lib/lang/br_users_list.lng
new file mode 100644
index 0000000..44e69fa
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_users_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuários';
+$wb["username_txt"] = 'Nome de Usuário';
+$wb["name_txt"] = 'Nome';
+$wb["vorname_txt"] = 'Sobrenome';
+$wb["ort_txt"] = 'cidade';
+$wb["add_new_record_txt"] = 'Adcionar novo usuário';
+?>
diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng
index 97f3e7f..756a3c9 100644
--- a/interface/web/admin/lib/lang/de_server_config.lng
+++ b/interface/web/admin/lib/lang/de_server_config.lng
@@ -2,6 +2,7 @@
 $wb['jailkit_chroot_home_txt'] = 'Jailkit chroot home';
 $wb['jailkit_chroot_app_sections_txt'] = 'Jailkit chroot app sections';
 $wb['jailkit_chroot_app_programs_txt'] = 'Jailkit chrooted applications';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
 $wb['website_path_txt'] = 'Website path';
 $wb['website_symlinks_txt'] = 'Website symlinks';
 $wb['vhost_conf_dir_txt'] = 'Vhost config dir';
@@ -38,4 +39,9 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/en_firewall.lng b/interface/web/admin/lib/lang/en_firewall.lng
index 9e06314..025108b 100644
--- a/interface/web/admin/lib/lang/en_firewall.lng
+++ b/interface/web/admin/lib/lang/en_firewall.lng
@@ -6,4 +6,7 @@
 $wb["udp_port_help_txt"] = 'Separated by comma';
 $wb["active_txt"] = 'Active';
 $wb["firewall_error_unique"] = 'There is already a firewall record for this server.';
+$wb["active_txt"] = 'Active';
+$wb["tcp_ports_error_regex"] = 'Character not allowed in tcp port definition. Allowed characters are numbers, ":" and ",".';
+$wb["udp_ports_error_regex"] = 'Character not allowed in udp port definition. Allowed characters are numbers, ":" and ",".';
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng
index 447ae3a..47b2d70 100644
--- a/interface/web/admin/lib/lang/en_server_config.lng
+++ b/interface/web/admin/lib/lang/en_server_config.lng
@@ -2,6 +2,7 @@
 $wb["jailkit_chroot_home_txt"] = 'Jailkit chroot home';
 $wb["jailkit_chroot_app_sections_txt"] = 'Jailkit chroot app sections';
 $wb["jailkit_chroot_app_programs_txt"] = 'Jailkit chrooted applications';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
 $wb["website_path_txt"] = 'Website path';
 $wb["website_symlinks_txt"] = 'Website symlinks';
 $wb["website_basedir_txt"] = 'Website basedir';
@@ -38,4 +39,10 @@
 $wb["gateway_error_wrong"] = 'Invalid Gateway format.';
 $wb["hostname_error_empty"] = 'Hostname is empty.';
 $wb["nameservers_error_empty"] = 'Nameserver is empty.';
+$wb["config_dir_txt"] = 'Config directory';
+$wb["init_script_txt"] = 'Cron init script name';
+$wb["crontab_dir_txt"] = 'Path for individual crontabs';
+$wb["wget_txt"] = 'Path to wget program';
+$wb["web_user_txt"] = 'Apache user';
+$wb["web_group_txt"] = 'Apache group';
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng
index dd08bd4..d279768 100644
--- a/interface/web/admin/lib/lang/es_server_config.lng
+++ b/interface/web/admin/lib/lang/es_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng
index 77e0a98..ec4a7a7 100755
--- a/interface/web/admin/lib/lang/fi_server_config.lng
+++ b/interface/web/admin/lib/lang/fi_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/fr_server_config.lng
+++ b/interface/web/admin/lib/lang/fr_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng
index b9c68b2..ab6a29b 100644
--- a/interface/web/admin/lib/lang/it_server_config.lng
+++ b/interface/web/admin/lib/lang/it_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng
index 1add83e..fe73f16 100644
--- a/interface/web/admin/lib/lang/nl_server_config.lng
+++ b/interface/web/admin/lib/lang/nl_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng
index 19f9583..d84a211 100644
--- a/interface/web/admin/lib/lang/ru_server_config.lng
+++ b/interface/web/admin/lib/lang/ru_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/se_server_config.lng
+++ b/interface/web/admin/lib/lang/se_server_config.lng
@@ -38,4 +38,10 @@
 $wb['gateway_error_wrong'] = 'Invalid Gateway format.';
 $wb['hostname_error_empty'] = 'Hostname is empty.';
 $wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
 ?>
diff --git a/interface/web/admin/software_package_list.php b/interface/web/admin/software_package_list.php
index 19a7518..24c53ec 100644
--- a/interface/web/admin/software_package_list.php
+++ b/interface/web/admin/software_package_list.php
@@ -62,7 +62,46 @@
 				}
 			}
 		}
-	
+        
+        $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC");
+        if(is_array($packages)) {
+            foreach($packages as $p) {
+            
+                $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4'];
+                $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']);
+                
+                if(is_array($updates)) {
+                    foreach($updates as $u) {
+                        
+                        $version_array = explode('.',$u['version']);
+                        $v1 = intval($version_array[0]);
+                        $v2 = intval($version_array[1]);
+                        $v3 = intval($version_array[2]);
+                        $v4 = intval($version_array[3]);
+                        
+                        $package_name = $app->db->quote($u['package_name']);
+                        $software_repo_id = intval($repo['software_repo_id']);
+                        $update_url = $app->db->quote($u['url']);
+                        $update_md5 = $app->db->quote($u['md5']);
+                        $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):'';
+                        $update_title = $app->db->quote($u['title']);
+                        $type = $app->db->quote($u['type']);
+                        
+                        // Check that we do not have this update in the database yet
+                        $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'";
+                        $tmp = $app->db->queryOneRecord($sql);
+                        if(!isset($tmp['software_update_id'])) {
+                            // Insert the update in the datbase
+                            $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) 
+                            VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')";
+                            //die($sql);
+                            $app->db->query($sql);
+                        }
+                        
+                    }
+                }
+            }
+        }
 	}
 }
 
@@ -74,8 +113,8 @@
 	$tmp = $app->db->queryOneRecord($sql);
 	$software_update_id = $tmp['software_update_id'];
 	
-	// $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
-	$insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
+	$insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
+	// $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
 	$app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
 	
 }
@@ -100,8 +139,10 @@
 			
 			if($inst['status'] == 'installed') {
 				$installed_txt .= $s['server_name'].": Installed version $version<br />";
-			} elseif ($inst['status'] == 'installing') {
-				$installed_txt .= $s['server_name'].": Installation in progress<br />";
+            } elseif ($inst['status'] == 'installing') {
+                $installed_txt .= $s['server_name'].": Installation in progress<br />";
+            } elseif ($inst['status'] == 'failed') {
+                $installed_txt .= $s['server_name'].": Installation failed<br />";
 			} elseif ($inst['status'] == 'deleting') {
 				$installed_txt .= $s['server_name'].": Deletion in progress<br />";
 			} else {
diff --git a/interface/web/admin/software_update_list.php b/interface/web/admin/software_update_list.php
index d4255b7..03d2658 100644
--- a/interface/web/admin/software_update_list.php
+++ b/interface/web/admin/software_update_list.php
@@ -104,8 +104,8 @@
 	$server_id = intval($_GET['server_id']);
 	$software_update_id = intval($_GET['id']);
 	
-	// $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
-	$insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
+	$insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
+	// $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
 	$app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
 	
 }
diff --git a/interface/web/admin/templates/language_export.htm b/interface/web/admin/templates/language_export.htm
index b8c718b..d0ba3a3 100644
--- a/interface/web/admin/templates/language_export.htm
+++ b/interface/web/admin/templates/language_export.htm
@@ -1,24 +1,28 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_language_export">
-  
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels"><legend>Language Export</legend>
-      <div class="ctrlHolder">
-      	<label for="lng_select">{tmpl_var name='language_select_txt'}</label>
-        <select name="lng_select" id="language" class="selectInput withicons">
-					{tmpl_var name='language_option'}
-				</select>
-      </div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_export.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_export">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Language Export</legend>
+      <div class="ctrlHolder">
+      	<label for="lng_select">{tmpl_var name='language_select_txt'}</label>
+        <select name="lng_select" id="lng_select" class="selectInput withicons">
+					{tmpl_var name='language_option'}
+				</select>
+      </div>
+    </fieldset>
+	
+	<tmpl_if name="msg">
+	<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+	</tmpl_if>
+	
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_export.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/admin/templates/language_import.htm b/interface/web/admin/templates/language_import.htm
index 0547e55..8f4cffb 100644
--- a/interface/web/admin/templates/language_import.htm
+++ b/interface/web/admin/templates/language_import.htm
@@ -1,28 +1,35 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_language_import">
-  
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels"><legend>Language Import</legend>
-      <div class="ctrlHolder">
-	      <label for="lng_select"><em>*</em> {tmpl_var name='language_import_txt'}</label>
-	      <input name="file" id="file" size="30" type="file" class="fileUpload" />
-      </div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='language_overwrite_txt'}</p>
-					<div class="multiField">
-						<input id="overwrite" type="checkbox" value="1" name="overwrite"/>
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitUploadForm('pageForm','admin/language_import.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_import">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Language Import</legend>
+      <div class="ctrlHolder">
+	      <label for="lng_select"><em>*</em> {tmpl_var name='language_import_txt'}</label>
+	      <input name="file" id="file" size="30" type="file" class="fileUpload" />
+      </div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='language_overwrite_txt'}</p>
+					<div class="multiField">
+						<input id="overwrite" type="checkbox" value="1" name="overwrite"/>
+					</div>
+			</div>
+    </fieldset>
+	
+	<tmpl_if name="msg">
+	<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+  </tmpl_if>
+  <tmpl_if name="error">
+	<div id="errorMsg"><h3>ERROR</h3><ol><tmpl_var name="error"></ol></div>
+  </tmpl_if>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitUploadForm('pageForm','admin/language_import.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/admin/templates/server_config_cron_edit.htm b/interface/web/admin/templates/server_config_cron_edit.htm
new file mode 100644
index 0000000..066693e
--- /dev/null
+++ b/interface/web/admin/templates/server_config_cron_edit.htm
@@ -0,0 +1,30 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_server_config">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+        <label for="init_script">{tmpl_var name='init_script_txt'}</label>
+        <input name="init_script" id="init_script" value="{tmpl_var name='init_script'}" size="40" maxlength="255" type="text" class="textInput" />
+            </div>
+      <div class="ctrlHolder">
+        <label for="crontab_dir">{tmpl_var name='crontab_dir_txt'}</label>
+        <input name="crontab_dir" id="crontab_dir" value="{tmpl_var name='crontab_dir'}" size="40" maxlength="255" type="text" class="textInput" />
+            </div>
+      <div class="ctrlHolder">
+        <label for="wget">{tmpl_var name='wget_txt'}</label>
+        <input name="wget" id="wget" value="{tmpl_var name='wget'}" size="40" maxlength="255" type="text" class="textInput" />
+            </div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/server_config_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/server_config_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/admin/templates/server_config_jailkit_edit.htm b/interface/web/admin/templates/server_config_jailkit_edit.htm
index ec2081d..320fb87 100644
--- a/interface/web/admin/templates/server_config_jailkit_edit.htm
+++ b/interface/web/admin/templates/server_config_jailkit_edit.htm
@@ -17,6 +17,10 @@
       	<label for="jailkit_chroot_app_programs">{tmpl_var name='jailkit_chroot_app_programs_txt'}</label>
         <input name="jailkit_chroot_app_programs" id="jailkit_chroot_app_programs" value="{tmpl_var name='jailkit_chroot_app_programs'}" size="40" maxlength="1000" type="text" class="textInput" />
 			</div>
+      <div class="ctrlHolder">
+        <label for="jailkit_chroot_cron_programs">{tmpl_var name='jailkit_chroot_cron_programs_txt'}</label>
+        <input name="jailkit_chroot_cron_programs" id="jailkit_chroot_cron_programs" value="{tmpl_var name='jailkit_chroot_cron_programs'}" size="40" maxlength="1000" type="text" class="textInput" />
+            </div>
     </fieldset>
 
     <input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/admin/templates/server_config_list.htm b/interface/web/admin/templates/server_config_list.htm
index d6584b6..f635cad 100644
--- a/interface/web/admin/templates/server_config_list.htm
+++ b/interface/web/admin/templates/server_config_list.htm
@@ -1,50 +1,40 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_server_config">
-
-  <div class="pnl_toolsarea">
-    <fieldset><legend>Tools</legend>
-      <div class="buttons">
-        <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/server_config_edit.php');">
-          <span>{tmpl_var name="add_new_record_txt"}</span>
-        </button>
-      </div>
-    </fieldset>
-  </div>
-
-  <div class="pnl_listarea">
-    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
-      <table class="list">
-        <thead>
-          <tr>
-            <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
-            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
-          </tr>
-          <tr>
-            <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
-            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_config_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
-          </tr>
-        </thead>
-        <tbody>
-          <tmpl_loop name="records">
-          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
-            <td class="tbl_col_server_name"><a href="#" onClick="loadContent('admin/server_config_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
-            <td class="tbl_col_buttons">
-              <div class="buttons icons16">    
-                <a class="icons16 icoDelete" href="javascript: del_record('admin/server_config_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
-              </div>
-            </td>
-          </tr>
-          </tmpl_loop>
-        </tbody>
-        <tfoot>
-          <tr>
-            <td class="tbl_footer tbl_paging" colspan="2"><tmpl_var name="paging"></td>
-          </tr>
-        </tfoot>
-      </table>
-    </fieldset>
-  </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_server_config">
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
+            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_config_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_server_name"><a href="#" onClick="loadContent('admin/server_config_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+                <a class="icons16 icoDelete" href="javascript: del_record('admin/server_config_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="2"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/admin/templates/server_config_vlogger_edit.htm b/interface/web/admin/templates/server_config_vlogger_edit.htm
new file mode 100644
index 0000000..bf6a82a
--- /dev/null
+++ b/interface/web/admin/templates/server_config_vlogger_edit.htm
@@ -0,0 +1,22 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_server_config">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="config_dir">{tmpl_var name='config_dir_txt'}</label>
+        <input name="config_dir" id="config_dir" value="{tmpl_var name='config_dir'}" size="40" maxlength="255" type="text" class="textInput" />
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/server_config_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/server_config_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm
index 92d5262..646c076 100644
--- a/interface/web/admin/templates/server_config_web_edit.htm
+++ b/interface/web/admin/templates/server_config_web_edit.htm
@@ -25,6 +25,22 @@
       	<label for="vhost_conf_enabled_dir">{tmpl_var name='vhost_conf_enabled_dir_txt'}</label>
         <input name="vhost_conf_enabled_dir" id="vhost_conf_enabled_dir" value="{tmpl_var name='vhost_conf_enabled_dir'}" size="40" maxlength="255" type="text" class="textInput" />
 			</div>
+	  <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='security_level_txt'}</p>
+					<div class="multiField">
+						<select name="security_level" id="security_level" class="selectInput">
+					{tmpl_var name='security_level'}
+				</select>
+					</div>
+			</div>
+	  <div class="ctrlHolder">
+      	<label for="user">{tmpl_var name='web_user_txt'}</label>
+        <input name="user" id="user" value="{tmpl_var name='user'}" size="40" maxlength="255" type="text" class="textInput" />
+			</div>
+	  <div class="ctrlHolder">
+      	<label for="group">{tmpl_var name='web_group_txt'}</label>
+        <input name="group" id="group" value="{tmpl_var name='group'}" size="40" maxlength="255" type="text" class="textInput" />
+			</div>
     </fieldset>
 
     <input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/admin/templates/server_list.htm b/interface/web/admin/templates/server_list.htm
index b0ca262..7163843 100644
--- a/interface/web/admin/templates/server_list.htm
+++ b/interface/web/admin/templates/server_list.htm
@@ -1,68 +1,58 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_server">
-
-  <div class="pnl_toolsarea">
-    <fieldset><legend>Tools</legend>
-      <div class="buttons">
-        <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/server_edit.php');">
-          <span>{tmpl_var name="add_new_record_txt"}</span>
-        </button>
-      </div>
-    </fieldset>
-  </div>
-
-  <div class="pnl_listarea">
-    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
-      <table class="list">
-        <thead>
-          <tr>
-            <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
-            <th class="tbl_col_mail_server" scope="col"><tmpl_var name="mail_server_txt"></th>
-            <th class="tbl_col_web_server" scope="col"><tmpl_var name="web_server_txt"></th>
-            <th class="tbl_col_dns_server" scope="col"><tmpl_var name="dns_server_txt"></th>
-            <th class="tbl_col_file_server" scope="col"><tmpl_var name="file_server_txt"></th>
-            <th class="tbl_col_db_server" scope="col"><tmpl_var name="db_server_txt"></th>
-            <th class="tbl_col_vserver_server" scope="col"><tmpl_var name="vserver_server_txt"></th>
-            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
-          </tr>
-          <tr>
-            <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
-            <td class="tbl_col_mail_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_mail_server'}</select></td>
-            <td class="tbl_col_web_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_web_server'}</select></td>
-            <td class="tbl_col_dns_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_dns_server'}</select></td>
-            <td class="tbl_col_file_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_file_server'}</select></td>
-            <td class="tbl_col_db_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_db_server'}</select></td>
-            <td class="tbl_col_vserver_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_vserver_server'}</select></td>
-            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
-          </tr>
-        </thead>
-        <tbody>
-          <tmpl_loop name="records">
-          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
-            <td class="tbl_col_server_name"><a href="#" onClick="loadContent('admin/server_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
-            <td class="tbl_col_mail_server">{tmpl_var name="mail_server"}</td>
-            <td class="tbl_col_web_server">{tmpl_var name="web_server"}</td>
-            <td class="tbl_col_dns_server">{tmpl_var name="dns_server"}</td>
-            <td class="tbl_col_file_server">{tmpl_var name="file_server"}</td>
-            <td class="tbl_col_db_server">{tmpl_var name="db_server"}</td>
-            <td class="tbl_col_vserver_server">{tmpl_var name="vserver_server"}</td>
-            <td class="tbl_col_buttons">
-              <div class="buttons icons16">    
-                <a class="icons16 icoDelete" href="javascript: del_record('admin/server_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
-              </div>
-            </td>
-          </tr>
-          </tmpl_loop>
-        </tbody>
-        <tfoot>
-          <tr>
-            <td class="tbl_footer tbl_paging" colspan="8"><tmpl_var name="paging"></td>
-          </tr>
-        </tfoot>
-      </table>
-    </fieldset>
-  </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_server">
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
+            <th class="tbl_col_mail_server" scope="col"><tmpl_var name="mail_server_txt"></th>
+            <th class="tbl_col_web_server" scope="col"><tmpl_var name="web_server_txt"></th>
+            <th class="tbl_col_dns_server" scope="col"><tmpl_var name="dns_server_txt"></th>
+            <th class="tbl_col_file_server" scope="col"><tmpl_var name="file_server_txt"></th>
+            <th class="tbl_col_db_server" scope="col"><tmpl_var name="db_server_txt"></th>
+            <th class="tbl_col_vserver_server" scope="col"><tmpl_var name="vserver_server_txt"></th>
+            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
+            <td class="tbl_col_mail_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_mail_server'}</select></td>
+            <td class="tbl_col_web_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_web_server'}</select></td>
+            <td class="tbl_col_dns_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_dns_server'}</select></td>
+            <td class="tbl_col_file_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_file_server'}</select></td>
+            <td class="tbl_col_db_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_db_server'}</select></td>
+            <td class="tbl_col_vserver_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_vserver_server'}</select></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_server_name"><a href="#" onClick="loadContent('admin/server_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
+            <td class="tbl_col_mail_server">{tmpl_var name="mail_server"}</td>
+            <td class="tbl_col_web_server">{tmpl_var name="web_server"}</td>
+            <td class="tbl_col_dns_server">{tmpl_var name="dns_server"}</td>
+            <td class="tbl_col_file_server">{tmpl_var name="file_server"}</td>
+            <td class="tbl_col_db_server">{tmpl_var name="db_server"}</td>
+            <td class="tbl_col_vserver_server">{tmpl_var name="vserver_server"}</td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+                <a class="icons16 icoDelete" href="javascript: del_record('admin/server_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="8"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/admin/templates/users_list.htm b/interface/web/admin/templates/users_list.htm
index f7ef8bd..3407c9b 100644
--- a/interface/web/admin/templates/users_list.htm
+++ b/interface/web/admin/templates/users_list.htm
@@ -1,60 +1,60 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_users">
-
-  <div class="pnl_toolsarea">
-    <fieldset><legend>Tools</legend>
-      <div class="buttons">
-        <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/users_edit.php');">
-          <span>{tmpl_var name="add_new_record_txt"}</span>
-        </button>
-      </div>
-    </fieldset>
-  </div>
-
-  <div class="pnl_listarea">
-    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
-      <table class="list">
-        <thead>
-          <tr>
-            <th class="tbl_col_username" scope="col"><tmpl_var name="username_txt"></th>
-            <th class="tbl_col_vorname" scope="col"><tmpl_var name="vorname_txt"></th>
-            <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
-            <th class="tbl_col_ort" scope="col"><tmpl_var name="ort_txt"></th>
-            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
-          </tr>
-          <tr>
-            <td class="tbl_col_username"><input type="text" name="search_username" value="{tmpl_var name='search_username'}" /></td>
-            <td class="tbl_col_vorname"><input type="text" name="search_vorname" value="{tmpl_var name='search_vorname'}" /></td>
-            <td class="tbl_col_name"><input type="text" name="search_name" value="{tmpl_var name='search_name'}" /></td>
-            <td class="tbl_col_ort"><input type="text" name="search_ort" value="{tmpl_var name='search_ort'}" /></td>
-            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/users_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
-          </tr>
-        </thead>
-        <tbody>
-          <tmpl_loop name="records">
-          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
-            <td class="tbl_col_username"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="username"}</a></td>
-            <td class="tbl_col_vorname"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="vorname"}</a></td>
-            <td class="tbl_col_name"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
-            <td class="tbl_col_ort"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="ort"}</a></td>
-            <td class="tbl_col_buttons">
-              <div class="buttons icons16">    
-			    <a class="icons16 icoLoginAs" href="#" onclick="loadContent('admin/login_as.php?id={tmpl_var name='id'}');"><span>{tmpl_var name='login_as_txt'}</span></a>
-                <a class="icons16 icoDelete" href="javascript: del_record('admin/users_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
-              </div>
-            </td>
-          </tr>
-          </tmpl_loop>
-        </tbody>
-        <tfoot>
-          <tr>
-            <td class="tbl_footer tbl_paging" colspan="5"><tmpl_var name="paging"></td>
-          </tr>
-        </tfoot>
-      </table>
-    </fieldset>
-  </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_users">
+
+  <div class="pnl_toolsarea">
+    <fieldset><legend>Tools</legend>
+      <div class="buttons">
+        <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/users_edit.php');">
+          <span>{tmpl_var name="add_new_record_txt"}</span>
+        </button>
+      </div>
+    </fieldset>
+  </div>
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_username" scope="col"><tmpl_var name="username_txt"></th>
+            <th class="tbl_col_vorname" scope="col"><tmpl_var name="vorname_txt"></th>
+            <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
+            <th class="tbl_col_ort" scope="col"><tmpl_var name="ort_txt"></th>
+            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_username"><input type="text" name="search_username" value="{tmpl_var name='search_username'}" /></td>
+            <td class="tbl_col_vorname"><input type="text" name="search_vorname" value="{tmpl_var name='search_vorname'}" /></td>
+            <td class="tbl_col_name"><input type="text" name="search_name" value="{tmpl_var name='search_name'}" /></td>
+            <td class="tbl_col_ort"><input type="text" name="search_ort" value="{tmpl_var name='search_ort'}" /></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/users_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_username"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="username"}</a></td>
+            <td class="tbl_col_vorname"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="vorname"}</a></td>
+            <td class="tbl_col_name"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
+            <td class="tbl_col_ort"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="ort"}</a></td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+			    <tmpl_if name="username" op="!=" value="admin"><a class="icons16 icoLoginAs" href="#" onclick="loadContent('admin/login_as.php?id={tmpl_var name='id'}');"><span>{tmpl_var name='login_as_txt'}</span></a>
+                <a class="icons16 icoDelete" href="javascript: del_record('admin/users_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a></tmpl_if>
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="5"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/client/client_list.php b/interface/web/client/client_list.php
index 84eb799..590da21 100644
--- a/interface/web/client/client_list.php
+++ b/interface/web/client/client_list.php
@@ -18,6 +18,7 @@
 $app->uses('listform_actions');
 
 $app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id';
+$app->listform_actions->SQLExtWhere = "limit_client = 0";
 $app->listform_actions->onLoad();
 
 
diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php
index 288e893..4d369ce 100644
--- a/interface/web/client/form/client.tform.php
+++ b/interface/web/client/form/client.tform.php
@@ -1,696 +1,732 @@
-<?php
-
-/*
-	Form Definition
-
-	Tabledefinition
-
-	Datatypes:
-	- INTEGER (Forces the input to Int)
-	- DOUBLE
-	- CURRENCY (Formats the values to currency notation)
-	- VARCHAR (no format check, maxlength: 255)
-	- TEXT (no format check)
-	- DATE (Dateformat, automatic conversion to timestamps)
-
-	Formtype:
-	- TEXT (Textfield)
-	- TEXTAREA (Textarea)
-	- PASSWORD (Password textfield, input is not shown when edited)
-	- SELECT (Select option field)
-	- RADIO
-	- CHECKBOX
-	- CHECKBOXARRAY
-	- FILE
-
-	VALUE:
-	- Wert oder Array
-
-	Hint:
-	The ID field of the database table is not part of the datafield definition.
-	The ID field must be always auto incement (int or bigint).
-
-
-*/
-
-$form["title"] 			= "Client";
-$form["description"] 	= "";
-$form["name"] 			= "client";
-$form["action"]			= "client_edit.php";
-$form["db_table"]		= "client";
-$form["db_table_idx"]	= "client_id";
-$form["db_history"]		= "yes";
-$form["tab_default"]	= "address";
-$form["list_default"]	= "client_list.php";
-$form["auth"]			= 'yes';
-
-$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
-$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
-$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
-$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
-$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
-
-//* Languages
-$language_list = array();
-$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
-while ($file = @readdir ($handle)) {
-    if ($file != '.' && $file != '..') {
-        if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
-			$tmp = substr($file, 0, 2);
-			$language_list[$tmp] = $tmp;
-        }
-	}
-}
-
-$form["tabs"]['address'] = array (
-	'title' 	=> "Address",
-	'width' 	=> 100,
-	'template' 	=> "templates/client_edit_address.htm",
-	'fields' 	=> array (
-	##################################
-	# Begin Datatable fields
-	##################################
-		'company_name' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'contact_name' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'contact_error_empty'),
-										),
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'username' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'username_error_empty'),
-										1 => array (	'type'	=> 'CUSTOM',
-														'class' => 'validate_client',
-														'function' => 'username_unique',
-														'errmsg'=> 'username_error_unique'),
-										2 => array (	'type'	=> 'REGEX',
-														'regex' => '/^[\w\.\-\_]{0,64}$/',
-														'errmsg'=> 'username_error_regex'),
-										),
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'password' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'PASSWORD',
-			'encryption'=> 'CRYPT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'language' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'SELECT',
-			'default'	=> $conf["language"],
-			'value'		=> $language_list,
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'usertheme' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'SELECT',
-			'default'	=> 'default',
-			'value'		=> array('default' => 'default'),
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'street' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'zip' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'city' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'state' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'country' => array (
-			'datatype'	=> 'VARCHAR',
-
-			'formtype'	=> 'SELECT',
-			'default'	=> 'DE',
-			'datasource'	=> array ( 	'type'	=> 'SQL',
-										'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
-										'keyfield'=> 'iso',
-										'valuefield'=> 'printable_name'
-									 ),
-			'value'		=> ''
-		),
-		'telephone' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'mobile' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'fax' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'email' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'internet' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> 'http://',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'icq' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'notes' => array (
-			'datatype'	=> 'TEXT',
-			'formtype'	=> 'TEXTAREA',
-			'default'	=> '',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '',
-			'maxlength'	=> '',
-			'rows'		=> '10',
-			'cols'		=> '30'
-		),
-	##################################
-	# END Datatable fields
-	##################################
-	)
-);
-
-$form["tabs"]['limits'] = array (
-	'title' 	=> "Limits",
-	'width' 	=> 80,
-	'template' 	=> "templates/client_edit_limits.htm",
-	'fields' 	=> array (
-	##################################
-	# Begin Datatable fields
-	##################################
-		'template_master' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'SELECT',
-			'default'	=> '1',
-			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
-										'class'=> 'custom_datasource',
-										'function'=> 'master_templates'
-									 ),
-			'value'		=> ''
-		),
-		'template_additional' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-		),
-		'default_mailserver' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'SELECT',
-			'default'	=> '1',
-			'datasource'	=> array ( 	'type'	=> 'SQL',
-										'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name',
-										'keyfield'=> 'server_id',
-										'valuefield'=> 'server_name'
-									 ),
-			'value'		=> ''
-		),
-		'limit_maildomain' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_maildomain_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailbox' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailbox_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailalias' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailalias_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailforward' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailforward_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailcatchall' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailcatchall_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailrouting' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailrouting_error_notint'),
-									),
-			'default'	=> '0',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailfilter' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailfilter_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_fetchmail' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailfetchmail_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_mailquota' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_mailquota_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_spamfilter_wblist' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_spamfilter_user' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_spamfilter_user_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_spamfilter_policy' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_spamfilter_policy_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'default_webserver' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'SELECT',
-			'default'	=> '1',
-			'datasource'	=> array ( 	'type'	=> 'SQL',
-										'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
-										'keyfield'=> 'server_id',
-										'valuefield'=> 'server_name'
-									 ),
-			'value'		=> ''
-		),
-		'limit_web_domain' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_web_domain_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'web_php_options' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'CHECKBOXARRAY',
-			'default'	=> '',
-			'separator' => ',',
-			'value'		=> array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
-		),
-		'limit_web_aliasdomain' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_web_aliasdomain_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_web_subdomain' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_web_subdomain_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_ftp_user' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_ftp_user_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_shell_user' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_shell_user_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'ssh_chroot' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'CHECKBOXARRAY',
-			'default'	=> '',
-			'separator' => ',',
-			'value'		=> array('no' => 'None', 'jailkit' => 'Jailkit')
-		),
-		'default_dnsserver' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'SELECT',
-			'default'	=> '1',
-			'datasource'	=> array ( 	'type'	=> 'SQL',
-										'querystring' => 'SELECT server_id,server_name FROM server WHERE dns_server = 1 AND {AUTHSQL} ORDER BY server_name',
-										'keyfield'=> 'server_id',
-										'valuefield'=> 'server_name'
-									 ),
-			'value'		=> ''
-		),
-		'limit_dns_zone' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_dns_zone_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_dns_record' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_dns_record_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'limit_client' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_client_error_notint'),
-									),
-			'default'	=> '0',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-		'default_dbserver' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'SELECT',
-			'default'	=> '1',
-			'datasource'	=> array ( 	'type'	=> 'SQL',
-										'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name',
-										'keyfield'=> 'server_id',
-										'valuefield'=> 'server_name'
-									 ),
-			'value'		=> ''
-		),
-		'limit_database' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
-														'errmsg'=> 'limit_database_error_notint'),
-									),
-			'default'	=> '-1',
-			'value'		=> '',
-			'separator'	=> '',
-			'width'		=> '10',
-			'maxlength'	=> '10',
-			'rows'		=> '',
-			'cols'		=> ''
-		),
-	##################################
-	# END Datatable fields
-	##################################
-	)
-);
-
-/*
-$form["tabs"]['ipaddress'] = array (
-	'title' 	=> "IP Addresses",
-	'width' 	=> 100,
-	'template' 	=> "templates/client_edit_ipaddress.htm",
-	'fields' 	=> array (
-	##################################
-	# Beginn Datatable fields
-	##################################
-		'ip_address' => array (
-			'datatype'	=> 'TEXT',
-			'formtype'	=> 'CHECKBOXARRAY',
-			'default'	=> '',
-			'value'		=> array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
-			'separator'	=> ';'
-		),
-	##################################
-	# ENDE Datatable fields
-	##################################
-	)
-);
-*/
-
-
+<?php
+
+/*
+	Form Definition
+
+	Tabledefinition
+
+	Datatypes:
+	- INTEGER (Forces the input to Int)
+	- DOUBLE
+	- CURRENCY (Formats the values to currency notation)
+	- VARCHAR (no format check, maxlength: 255)
+	- TEXT (no format check)
+	- DATE (Dateformat, automatic conversion to timestamps)
+
+	Formtype:
+	- TEXT (Textfield)
+	- TEXTAREA (Textarea)
+	- PASSWORD (Password textfield, input is not shown when edited)
+	- SELECT (Select option field)
+	- RADIO
+	- CHECKBOX
+	- CHECKBOXARRAY
+	- FILE
+
+	VALUE:
+	- Wert oder Array
+
+	Hint:
+	The ID field of the database table is not part of the datafield definition.
+	The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] 			= "Client";
+$form["description"] 	= "";
+$form["name"] 			= "client";
+$form["action"]			= "client_edit.php";
+$form["db_table"]		= "client";
+$form["db_table_idx"]	= "client_id";
+$form["db_history"]		= "yes";
+$form["tab_default"]	= "address";
+$form["list_default"]	= "client_list.php";
+$form["auth"]			= 'yes';
+
+$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+//* Languages
+$language_list = array();
+$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
+while ($file = @readdir ($handle)) {
+    if ($file != '.' && $file != '..') {
+        if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
+			$tmp = substr($file, 0, 2);
+			$language_list[$tmp] = $tmp;
+        }
+	}
+}
+
+$form["tabs"]['address'] = array (
+	'title' 	=> "Address",
+	'width' 	=> 100,
+	'template' 	=> "templates/client_edit_address.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'company_name' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'contact_name' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'contact_error_empty'),
+										),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'username' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'username_error_empty'),
+										1 => array (	'type'	=> 'CUSTOM',
+														'class' => 'validate_client',
+														'function' => 'username_unique',
+														'errmsg'=> 'username_error_unique'),
+										2 => array (	'type'	=> 'REGEX',
+														'regex' => '/^[\w\.\-\_]{0,64}$/',
+														'errmsg'=> 'username_error_regex'),
+										),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'password' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'PASSWORD',
+			'encryption'=> 'CRYPT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'language' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'SELECT',
+			'default'	=> $conf["language"],
+			'value'		=> $language_list,
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'usertheme' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'SELECT',
+			'default'	=> 'default',
+			'value'		=> array('default' => 'default'),
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'street' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'zip' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'city' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'state' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'country' => array (
+			'datatype'	=> 'VARCHAR',
+
+			'formtype'	=> 'SELECT',
+			'default'	=> 'DE',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
+										'keyfield'=> 'iso',
+										'valuefield'=> 'printable_name'
+									 ),
+			'value'		=> ''
+		),
+		'telephone' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'mobile' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'fax' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'email' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'internet' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> 'http://',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'icq' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'notes' => array (
+			'datatype'	=> 'TEXT',
+			'formtype'	=> 'TEXTAREA',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '',
+			'maxlength'	=> '',
+			'rows'		=> '10',
+			'cols'		=> '30'
+		),
+	##################################
+	# END Datatable fields
+	##################################
+	)
+);
+
+$form["tabs"]['limits'] = array (
+	'title' 	=> "Limits",
+	'width' 	=> 80,
+	'template' 	=> "templates/client_edit_limits.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'template_master' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'master_templates'
+									 ),
+			'value'		=> ''
+		),
+		'template_additional' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+		),
+		'default_mailserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'client_servers'
+									 ),
+			'value'		=> '',
+			'name'		=> 'default_mailserver'
+		),
+		'limit_maildomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_maildomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailbox' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailbox_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailalias' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailalias_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailforward' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailforward_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailcatchall' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailcatchall_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailrouting' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailrouting_error_notint'),
+									),
+			'default'	=> '0',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailfilter' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailfilter_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_fetchmail' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailfetchmail_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailquota' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailquota_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_wblist' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_policy' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_policy_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'default_webserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'client_servers'
+									 ),
+			'value'		=> '',
+			'name'		=> 'default_webserver'
+		),
+		'limit_web_domain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_domain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'web_php_options' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'separator' => ',',
+			'valuelimit' => 'client:web_php_options',
+			'value'		=> array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
+		),
+		'limit_web_aliasdomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_aliasdomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_web_subdomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_subdomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_ftp_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_ftp_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_shell_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_shell_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'ssh_chroot' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'separator' => ',',
+			'valuelimit' => 'client:ssh_chroot',
+			'value'		=> array('no' => 'None', 'jailkit' => 'Jailkit')
+		),
+		'default_dnsserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'client_servers'
+									 ),
+			'value'		=> '',
+			'name'		=> 'default_dnsserver'
+		),
+		'limit_dns_zone' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_dns_zone_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_dns_record' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_dns_record_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_client' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_client_error_notint'),
+									),
+			'default'	=> '0',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'default_dbserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'client_servers'
+									 ),
+			'value'		=> '',
+			'name'		=> 'default_dbserver'
+		),
+		'limit_database' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_database_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+        'limit_cron' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_notint'),
+                                    ),
+            'default'   => '0',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
+        'limit_cron_type' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'SELECT',
+            'default'   => '',
+            'value'     => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+        ),
+        'limit_cron_frequency' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_frequency'),
+                                    ),
+            'default'   => '-1',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
+	##################################
+	# END Datatable fields
+	##################################
+	)
+);
+
+/*
+$form["tabs"]['ipaddress'] = array (
+	'title' 	=> "IP Addresses",
+	'width' 	=> 100,
+	'template' 	=> "templates/client_edit_ipaddress.htm",
+	'fields' 	=> array (
+	##################################
+	# Beginn Datatable fields
+	##################################
+		'ip_address' => array (
+			'datatype'	=> 'TEXT',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'value'		=> array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
+			'separator'	=> ';'
+		),
+	##################################
+	# ENDE Datatable fields
+	##################################
+	)
+);
+*/
+
+
 ?>
\ No newline at end of file
diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php
index f732faf..5f34c58 100644
--- a/interface/web/client/form/client_template.tform.php
+++ b/interface/web/client/form/client_template.tform.php
@@ -367,6 +367,7 @@
 			'rows'		=> '',
 			'cols'		=> ''
 		),
+		/*
 		'limit_client' => array (
 			'datatype'	=> 'INTEGER',
 			'formtype'	=> 'TEXT',
@@ -381,6 +382,7 @@
 			'rows'		=> '',
 			'cols'		=> ''
 		),
+		*/
 		'limit_database' => array (
 			'datatype'	=> 'INTEGER',
 			'formtype'	=> 'TEXT',
@@ -395,6 +397,40 @@
 			'rows'		=> '',
 			'cols'		=> ''
 		),
+        'limit_cron' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_notint'),
+                                    ),
+            'default'   => '0',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
+        'limit_cron_type' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'SELECT',
+            'default'   => '',
+            'value'     => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+        ),
+        'limit_cron_frequency' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_frequency'),
+                                    ),
+            'default'   => '-1',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
 	##################################
 	# END Datatable fields
 	##################################
diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php
new file mode 100644
index 0000000..d069e00
--- /dev/null
+++ b/interface/web/client/form/reseller.tform.php
@@ -0,0 +1,733 @@
+<?php
+
+/*
+	Form Definition
+
+	Tabledefinition
+
+	Datatypes:
+	- INTEGER (Forces the input to Int)
+	- DOUBLE
+	- CURRENCY (Formats the values to currency notation)
+	- VARCHAR (no format check, maxlength: 255)
+	- TEXT (no format check)
+	- DATE (Dateformat, automatic conversion to timestamps)
+
+	Formtype:
+	- TEXT (Textfield)
+	- TEXTAREA (Textarea)
+	- PASSWORD (Password textfield, input is not shown when edited)
+	- SELECT (Select option field)
+	- RADIO
+	- CHECKBOX
+	- CHECKBOXARRAY
+	- FILE
+
+	VALUE:
+	- Wert oder Array
+
+	Hint:
+	The ID field of the database table is not part of the datafield definition.
+	The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] 			= "Reseller";
+$form["description"] 	= "";
+$form["name"] 			= "reseller";
+$form["action"]			= "reseller_edit.php";
+$form["db_table"]		= "client";
+$form["db_table_idx"]	= "client_id";
+$form["db_history"]		= "yes";
+$form["tab_default"]	= "address";
+$form["list_default"]	= "reseller_list.php";
+$form["auth"]			= 'yes';
+
+$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+//* Languages
+$language_list = array();
+$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
+while ($file = @readdir ($handle)) {
+    if ($file != '.' && $file != '..') {
+        if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
+			$tmp = substr($file, 0, 2);
+			$language_list[$tmp] = $tmp;
+        }
+	}
+}
+
+$form["tabs"]['address'] = array (
+	'title' 	=> "Address",
+	'width' 	=> 100,
+	'template' 	=> "templates/reseller_edit_address.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'company_name' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'contact_name' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'contact_error_empty'),
+										),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'username' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'username_error_empty'),
+										1 => array (	'type'	=> 'CUSTOM',
+														'class' => 'validate_client',
+														'function' => 'username_unique',
+														'errmsg'=> 'username_error_unique'),
+										2 => array (	'type'	=> 'REGEX',
+														'regex' => '/^[\w\.\-\_]{0,64}$/',
+														'errmsg'=> 'username_error_regex'),
+										),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'password' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'PASSWORD',
+			'encryption'=> 'CRYPT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'language' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'SELECT',
+			'default'	=> $conf["language"],
+			'value'		=> $language_list,
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'usertheme' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'SELECT',
+			'default'	=> 'default',
+			'value'		=> array('default' => 'default'),
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'street' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'zip' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'city' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'state' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'country' => array (
+			'datatype'	=> 'VARCHAR',
+
+			'formtype'	=> 'SELECT',
+			'default'	=> 'DE',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
+										'keyfield'=> 'iso',
+										'valuefield'=> 'printable_name'
+									 ),
+			'value'		=> ''
+		),
+		'telephone' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'mobile' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'fax' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'email' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'internet' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> 'http://',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'icq' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'notes' => array (
+			'datatype'	=> 'TEXT',
+			'formtype'	=> 'TEXTAREA',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '',
+			'maxlength'	=> '',
+			'rows'		=> '10',
+			'cols'		=> '30'
+		),
+	##################################
+	# END Datatable fields
+	##################################
+	)
+);
+
+$form["tabs"]['limits'] = array (
+	'title' 	=> "Limits",
+	'width' 	=> 80,
+	'template' 	=> "templates/reseller_edit_limits.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'template_master' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+										'class'=> 'custom_datasource',
+										'function'=> 'master_templates'
+									 ),
+			'value'		=> ''
+		),
+		'template_additional' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+		),
+		'default_mailserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name',
+										'keyfield'=> 'server_id',
+										'valuefield'=> 'server_name'
+									 ),
+			'value'		=> ''
+		),
+		'limit_maildomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_maildomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailbox' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailbox_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailalias' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailalias_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailforward' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailforward_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailcatchall' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailcatchall_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailrouting' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailrouting_error_notint'),
+									),
+			'default'	=> '0',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailfilter' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailfilter_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_fetchmail' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailfetchmail_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_mailquota' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_mailquota_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_wblist' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_spamfilter_policy' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_spamfilter_policy_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'default_webserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
+										'keyfield'=> 'server_id',
+										'valuefield'=> 'server_name'
+									 ),
+			'value'		=> ''
+		),
+		'limit_web_domain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_domain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'web_php_options' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'separator' => ',',
+			'value'		=> array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
+		),
+		'limit_web_aliasdomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_aliasdomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_web_subdomain' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_web_subdomain_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_ftp_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_ftp_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_shell_user' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_shell_user_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'ssh_chroot' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'separator' => ',',
+			'value'		=> array('no' => 'None', 'jailkit' => 'Jailkit')
+		),
+		'default_dnsserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT server_id,server_name FROM server WHERE dns_server = 1 AND {AUTHSQL} ORDER BY server_name',
+										'keyfield'=> 'server_id',
+										'valuefield'=> 'server_name'
+									 ),
+			'value'		=> ''
+		),
+		'limit_dns_zone' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_dns_zone_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_dns_record' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_dns_record_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'limit_client' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_client_error_notint'),
+										1 => array (	'type'	=> 'CUSTOM',
+														'class' => 'validate_reseller',
+														'function' => 'limit_client'),
+									),
+			'default'	=> '1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'default_dbserver' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'default'	=> '1',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name',
+										'keyfield'=> 'server_id',
+										'valuefield'=> 'server_name'
+									 ),
+			'value'		=> ''
+		),
+		'limit_database' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'ISINT',
+														'errmsg'=> 'limit_database_error_notint'),
+									),
+			'default'	=> '-1',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '10',
+			'maxlength'	=> '10',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+        'limit_cron' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_notint'),
+                                    ),
+            'default'   => '0',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
+        'limit_cron_type' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'SELECT',
+            'default'   => '',
+            'value'     => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+        ),
+        'limit_cron_frequency' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'ISINT',
+                                                        'errmsg'=> 'limit_cron_error_frequency'),
+                                    ),
+            'default'   => '-1',
+            'value'     => '',
+            'separator' => '',
+            'width'     => '10',
+            'maxlength' => '10',
+            'rows'      => '',
+            'cols'      => ''
+        ),
+	##################################
+	# END Datatable fields
+	##################################
+	)
+);
+
+/*
+$form["tabs"]['ipaddress'] = array (
+	'title' 	=> "IP Addresses",
+	'width' 	=> 100,
+	'template' 	=> "templates/client_edit_ipaddress.htm",
+	'fields' 	=> array (
+	##################################
+	# Beginn Datatable fields
+	##################################
+		'ip_address' => array (
+			'datatype'	=> 'TEXT',
+			'formtype'	=> 'CHECKBOXARRAY',
+			'default'	=> '',
+			'value'		=> array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
+			'separator'	=> ';'
+		),
+	##################################
+	# ENDE Datatable fields
+	##################################
+	)
+);
+*/
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/bg_client.lng b/interface/web/client/lib/lang/bg_client.lng
index ea51e62..2fbb064 100644
--- a/interface/web/client/lib/lang/bg_client.lng
+++ b/interface/web/client/lib/lang/bg_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/bg_client_template.lng b/interface/web/client/lib/lang/bg_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/bg_client_template.lng
+++ b/interface/web/client/lib/lang/bg_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/br.lng b/interface/web/client/lib/lang/br.lng
new file mode 100644
index 0000000..6aed105
--- /dev/null
+++ b/interface/web/client/lib/lang/br.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['Client'] = 'Cliente';
+$wb['Address'] = 'Endereço';
+$wb['Limits'] = 'Limites';
+$wb['Add Client'] = 'Adcionar Cliente';
+$wb['Edit Client'] = 'Editar Cliente';
+$wb['Clients'] = 'Clientes';
+$wb['Edit Client-Templates'] = 'Editar Gabaritos de Clientes';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client.lng b/interface/web/client/lib/lang/br_client.lng
new file mode 100644
index 0000000..5391c13
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client.lng
@@ -0,0 +1,85 @@
+<?php
+$wb['limit_maildomain_txt'] = 'Número máximo de domínios de correio';
+$wb['limit_mailbox_txt'] = 'Número máximo de caixas de correio';
+$wb['limit_mailalias_txt'] = 'Número máximo de aliases de correio';
+$wb['limit_mailforward_txt'] = 'Número máximo de redirecionamento de correio';
+$wb['limit_mailcatchall_txt'] = 'Número máximo de catchall de correio';
+$wb['limit_mailrouting_txt'] = 'Número máximo de rotas de correio';
+$wb['limit_mailfilter_txt'] = 'Número máximo de filtros de correio';
+$wb['limit_fetchmail_txt'] = 'Número máximo de fetchmail de correio';
+$wb['limit_mailquota_txt'] = 'Quota de Correio';
+$wb['limit_spamfilter_wblist_txt'] = 'Número máximo de filtros spam lista branca / negra';
+$wb['limit_spamfilter_user_txt'] = 'Número máximo de usuários de filtros spam';
+$wb['limit_spamfilter_policy_txt'] = 'Número máximo de políticas de filtros spam';
+$wb['default_mailserver_txt'] = 'Servidor de Correio Padrão';
+$wb['company_name_txt'] = 'Empresa';
+$wb['contact_name_txt'] = 'Contato';
+$wb['username_txt'] = 'Nome de Usuário';
+$wb['password_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança da senha';
+$wb['language_txt'] = 'Idioma';
+$wb['usertheme_txt'] = 'Tema';
+$wb['street_txt'] = 'Rua';
+$wb['zip_txt'] = 'CEP';
+$wb['city_txt'] = 'Cidade';
+$wb['state_txt'] = 'Estado';
+$wb['country_txt'] = 'Pais';
+$wb['telephone_txt'] = 'Telefone';
+$wb['mobile_txt'] = 'Celular';
+$wb['fax_txt'] = 'Fax';
+$wb['email_txt'] = 'Correio Eletrônico';
+$wb['internet_txt'] = 'Internet';
+$wb['icq_txt'] = 'ICQ';
+$wb['notes_txt'] = 'Notas';
+$wb['company_txt'] = 'Empresa';
+$wb['title_txt'] = 'Título';
+$wb['firstname_txt'] = 'Nome';
+$wb['surname_txt'] = 'Sobrenome';
+$wb['limit_domain_txt'] = 'limite_dominio';
+$wb['limit_subdomain_txt'] = 'limit_subdominio';
+$wb['limit_webquota_txt'] = 'limit_webquota';
+$wb['limit_database_txt'] = 'Número máximo de banco de dados';
+$wb['ip_address_txt'] = 'endereco_ip';
+$wb['limit_client_error_notint'] = 'O limite de um sub-cliente deve ser um número';
+$wb['firstname_error_empty'] = 'Nome está em branco.';
+$wb['contact_error_empty'] = 'Contato está em branco.';
+$wb['default_webserver_txt'] = 'Servidor Web Padrão';
+$wb['limit_web_domain_txt'] = 'Número máximo de domínios web';
+$wb['limit_web_aliasdomain_txt'] = 'Número máximo de domínios alias';
+$wb['limit_web_subdomain_txt'] = 'Número máximo de sub-domínios';
+$wb['limit_ftp_user_txt'] = 'Número máximo de usuários FTP';
+$wb['default_dnsserver_txt'] = 'Servidor de Nomes Padrão';
+$wb['limit_dns_zone_txt'] = 'Número máximo de zonas DNS';
+$wb['limit_dns_record_txt'] = 'Número máximo de registros DNS';
+$wb['limit_shell_user_txt'] = 'Número máximo de usuários de shell';
+$wb['limit_client_txt'] = 'Número máximo de clientes';
+$wb['username_error_empty'] = 'Nome do usuário está em branco';
+$wb['username_error_unique'] = 'O nome do usuário deve ser único';
+$wb['limit_maildomain_error_notint'] = 'O limite de caixas de correio no domínio deve ser um número.';
+$wb['limit_mailbox_error_notint'] = 'Limite da caixa de correio deve ser um número.';
+$wb['limit_mailalias_error_notint'] = 'Limite do aliase de correio deve ser um número.';
+$wb['limit_mailforward_error_notint'] = 'Limite de redirecionamento de correio deve ser um número';
+$wb['limit_mailcatchall_error_notint'] = 'Limite de catchall deve ser um número.';
+$wb['limit_mailrouting_error_notint'] = 'Limite de rotas de correio deve ser um número.';
+$wb['limit_mailfilter_error_notint'] = 'Limite de filtros de correio deve ser um número.';
+$wb['limit_mailfetchmail_error_notint'] = 'Limite de fetchmail deve ser um número.';
+$wb['limit_mailquota_error_notint'] = 'A quota de correio deve ser um número';
+$wb['limit_spamfilter_wblist_error_notint'] = 'O limite de filtros spam lista branca / negra deve ser um número.';
+$wb['limit_spamfilter_user_error_notint'] = 'O limite de filtros spam do usuário deve ser um número.';
+$wb['limit_spamfilter_policy_error_notint'] = 'O limite de políticas de filtros spam deve ser um número.';
+$wb['limit_web_domain_error_notint'] = 'O limite de sites deve ser um número.';
+$wb['limit_web_aliasdomain_error_notint'] = 'O limite de alias de domínios de sites deve ser um número.';
+$wb['limit_web_subdomain_error_notint'] = 'O limite de sub-domínios de sites deve ser um número';
+$wb['limit_ftp_user_error_notint'] = 'O limite de usuários de FTP deve ser um número.';
+$wb['limit_shell_user_error_notint'] = 'O limite de usuários de Shell deve ser um número.';
+$wb['limit_dns_zone_error_notint'] = 'O limite de registros de DNS deve ser um número';
+$wb['default_dbserver_txt'] = 'Servidor de Banco de Dados Padrão';
+$wb['limit_database_error_notint'] = 'O limite de banco de dados deve ser um número';
+$wb['username_error_regex'] = 'O nome de usuário contem caracteres inválidos.';
+$wb['template_master_txt'] = 'Gabarito Principal';
+$wb['template_additional_txt'] = 'Template Adcional';
+$wb['ssh_chroot_txt'] = 'Opções de SSH Chroot';
+$wb['web_php_options_txt'] = 'Opções do PHP';
+$wb['limit_client_error'] = 'O número máximo de clientes foi atingido.';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client_template.lng b/interface/web/client/lib/lang/br_client_template.lng
new file mode 100644
index 0000000..45a3b3e
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client_template.lng
@@ -0,0 +1,48 @@
+<?php
+$wb['limit_client_error_notint'] = 'O limite do cliente não é um número.';
+$wb['limit_maildomain_txt'] = 'Limite Máximo de domínios de correio';
+$wb['limit_mailbox_txt'] = 'Limite Máximo de caixas de correio';
+$wb['limit_mailalias_txt'] = 'Limite Máximo de alias de correio';
+$wb['limit_mailforward_txt'] = 'Limite Máximo de redirecionamentos de correio';
+$wb['limit_mailcatchall_txt'] = 'Limite máximo de contas catchall';
+$wb['limit_mailrouting_txt'] = 'Limite máximo de rotas de Correio';
+$wb['limit_mailfilter_txt'] = 'Número Máximo de Filtros de Correio';
+$wb['limit_fetchmail_txt'] = 'Número Máximo de Contas fetchmail';
+$wb['limit_mailquota_txt'] = 'Espaço de Caixa de Correio';
+$wb['limit_spamfilter_wblist_txt'] = 'Número máximo de spamfilter permitidos /lista negra';
+$wb['limit_spamfilter_user_txt'] = 'Número máx de usuários spamfilter';
+$wb['limit_spamfilter_policy_txt'] = 'Número máx de políticas spamfilter';
+$wb['limit_domain_txt'] = 'limite_dominio';
+$wb['limit_subdomain_txt'] = 'limite_subdominio';
+$wb['limit_webquota_txt'] = 'limite_webquota';
+$wb['limit_database_txt'] = 'Número máximo de banco de dados';
+$wb['limit_web_domain_txt'] = 'Número máximo de domínios web';
+$wb['limit_web_aliasdomain_txt'] = 'Número maximo de apelidos web';
+$wb['limit_web_subdomain_txt'] = 'Número máximo de sub-domínios';
+$wb['limit_ftp_user_txt'] = 'Número máximo de usuários de FTP';
+$wb['limit_dns_zone_txt'] = 'Número máximo de zonas DNS';
+$wb['limit_dns_record_txt'] = 'Número máximo de registros DNS';
+$wb['limit_shell_user_txt'] = 'Número máximo de usuários de Shell';
+$wb['limit_client_txt'] = 'Número máximo de clientes';
+$wb['limit_maildomain_error_notint'] = 'O limite de correio de domínio deve ser numérico';
+$wb['limit_mailbox_error_notint'] = 'O limite da caixa de correio deve ser numérico';
+$wb['limit_mailalias_error_notint'] = 'O limite do apelido de correio deve ser númerico';
+$wb['limit_mailforward_error_notint'] = 'O limite de direcionamento de correio deve ser um número';
+$wb['limit_mailcatchall_error_notint'] = 'O limite de catchall do domínio deve ser um número';
+$wb['limit_mailrouting_error_notint'] = 'Limite de rota de correio deve ser um número';
+$wb['limit_mailfilter_error_notint'] = 'O limite de filtro de correio deve ser um número.';
+$wb['limit_mailfetchmail_error_notint'] = 'Limite fetchmail deve ser um número.';
+$wb['limit_mailquota_error_notint'] = 'Cota de correio deve ser um número.';
+$wb['limit_spamfilter_wblist_error_notint'] = 'O limite de spamfilter permitido / lista negra deve ser um número';
+$wb['limit_spamfilter_user_error_notint'] = 'O limite do spamfilter deve ser um número.';
+$wb['limit_spamfilter_policy_error_notint'] = 'O limite da política do spamfilter deve ser um número.';
+$wb['limit_web_domain_error_notint'] = 'O limite de websites deve ser um número';
+$wb['limit_web_aliasdomain_error_notint'] = 'O limite de apelidos de domínio deve ser um número';
+$wb['limit_web_subdomain_error_notint'] = 'O limite de sub-domínios deve ser um número';
+$wb['limit_ftp_user_error_notint'] = 'O limite de contas FTP deve ser um número';
+$wb['limit_shell_user_error_notint'] = 'O limite de contas shell DNS deve ser um número';
+$wb['limit_dns_zone_error_notint'] = 'O limite de zonas DNS deve ser um número';
+$wb['limit_database_error_notint'] = 'O limite dos bancos de dados deve ser um número';
+$wb['error_template_name_empty'] = 'Por favor insira o nome do gabarito';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client_template_list.lng b/interface/web/client/lib/lang/br_client_template_list.lng
new file mode 100644
index 0000000..3f9dd52
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client_template_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb['list_head_txt'] = 'Gabarito de Cliente ';
+$wb['template_type_txt'] = 'Tipo';
+$wb['template_name_txt'] = 'Nome do Gabarito';
+?>
+
diff --git a/interface/web/client/lib/lang/br_clients_list.lng b/interface/web/client/lib/lang/br_clients_list.lng
new file mode 100644
index 0000000..db70b35
--- /dev/null
+++ b/interface/web/client/lib/lang/br_clients_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['list_head_txt'] = 'Clientes';
+$wb['client_id_txt'] = 'ID';
+$wb['company_name_txt'] = 'Empresa';
+$wb['contact_name_txt'] = 'Nome do contato';
+$wb['city_txt'] = 'Cidade';
+$wb['country_txt'] = 'Pais';
+$wb['add_new_record_txt'] = 'Adcionar novo cliente';
+?>
+
diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng
index 05fad56..2e3bf4c 100644
--- a/interface/web/client/lib/lang/de_client.lng
+++ b/interface/web/client/lib/lang/de_client.lng
@@ -39,6 +39,9 @@
 $wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains';
 $wb['limit_webquota_txt'] = 'Max. Webquota';
 $wb['limit_database_txt'] = 'Max. Anzahl an Datenbanken';
+$wb['limit_cron_txt'] = 'Max. Anzahl Cron Jobs';
+$wb['limit_cron_type_txt'] = 'Max. erlaubter Typ von Cron Jobs (chrooted und full erlauben auch url)';
+$wb['limit_cron_frequency_txt'] = 'Min. Abstand zwischen Ausf&uuml;hrungen';
 $wb['ip_address_txt'] = 'IP Adresse';
 $wb['limit_client_error_notint'] = 'The sub client limit must be a number.';
 $wb['firstname_error_empty'] = 'Vorname ist leer.';
@@ -74,10 +77,13 @@
 $wb['limit_dns_zone_error_notint'] = 'Das DNS Einträge Limit muss eine Nummer sein.';
 $wb['default_dbserver_txt'] = 'Standarddatenbankserver';
 $wb['limit_database_error_notint'] = 'Das Datenbank Limit muss eine Nummer sein.';
+$wb['limit_cron_error_notint'] = 'Das Cron Job Limit muss eine Zahl sein.';
+$wb['limit_cron_error_frequency'] = 'Das Cron Job Intervall-Limit muss eine Zahl sein.';
 $wb['username_error_regex'] = 'Der Benutzername enthält ungültige Zeichen.';
 $wb['password_strength_txt'] = 'Passwortkomplexität';
 $wb['template_master_txt'] = 'Master';
 $wb['template_additional_txt'] = 'Addons';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Optionen';
 $wb['web_php_options_txt'] = 'PHP Optionen';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/de_client_template.lng b/interface/web/client/lib/lang/de_client_template.lng
index 8a29d47..3efd721 100644
--- a/interface/web/client/lib/lang/de_client_template.lng
+++ b/interface/web/client/lib/lang/de_client_template.lng
@@ -17,6 +17,9 @@
 $wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains';
 $wb['limit_webquota_txt'] = 'Max. Webquota';
 $wb['limit_database_txt'] = 'Max. Anzahl an Datenbanken';
+$wb['limit_cron_txt'] = 'Max. Anzahl Cron Jobs';
+$wb['limit_cron_type_txt'] = 'Max. erlaubter Typ von Cron Jobs (chrooted und full erlauben auch url)';
+$wb['limit_cron_frequency_txt'] = 'Min. Abstand zwischen Ausf&uuml;hrungen';
 $wb['limit_web_domain_txt'] = 'Max. Anzahl an Web Domains';
 $wb['limit_web_aliasdomain_txt'] = 'Max. Anzahl an Web Aliasdomains';
 $wb['limit_web_subdomain_txt'] = 'Max. Anzahl an Web Subdomains';
@@ -43,5 +46,7 @@
 $wb['limit_shell_user_error_notint'] = 'Das Shell Benutzer Limit muss eine Nummer sein.';
 $wb['limit_dns_zone_error_notint'] = 'Das DNS Einträge Limit muss eine Nummer sein.';
 $wb['limit_database_error_notint'] = 'Das Datenbanken Limit muss eine Nummer sein.';
+$wb['limit_cron_error_notint'] = 'Das Cron Job Limit muss eine Zahl sein.';
+$wb['limit_cron_error_frequency'] = 'Das Cron Job Intervall-Limit muss eine Zahl sein.';
 $wb['error_template_name_empty'] = 'Bitte geben sie einen Vorlagenamen ein';
 ?>
diff --git a/interface/web/client/lib/lang/en.lng b/interface/web/client/lib/lang/en.lng
index af8ccc2..e384def 100644
--- a/interface/web/client/lib/lang/en.lng
+++ b/interface/web/client/lib/lang/en.lng
@@ -6,4 +6,7 @@
 $wb['Edit Client'] = 'Edit Client';
 $wb['Clients'] = 'Clients';
 $wb['Edit Client-Templates'] = 'Edit Client-Templates';
+$wb['Add Reseller'] = 'Add Reseller';
+$wb['Edit Reseller'] = 'Edit Reseller';
+$wb['Resellers'] = 'Resellers';
 ?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng
index 74c166f..03cec3f 100644
--- a/interface/web/client/lib/lang/en_client.lng
+++ b/interface/web/client/lib/lang/en_client.lng
@@ -39,6 +39,9 @@
 $wb["limit_subdomain_txt"] = 'limit_subdomain';
 $wb["limit_webquota_txt"] = 'limit_webquota';
 $wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
 $wb["ip_address_txt"] = 'ip_address';
 $wb["limit_client_error_notint"] = 'Client Limit is not a number.';
 $wb["firstname_error_empty"] = 'Firstname is empty.';
@@ -78,6 +81,8 @@
 $wb["default_dbserver_txt"] = 'Default Database Server';
 $wb["limit_database_txt"] = 'Max. number of Databases';
 $wb["limit_database_error_notint"] = 'The database limit must be a number.';
+$wb["limit_cron_error_notint"] = 'The cron limit must be a number.';
+$wb["limit_cron_error_frequency"] = 'The cron frequency limit must be a number.';
 $wb["username_error_regex"] = 'The Username contains invalid chracaters.';
 $wb["template_master_txt"] = 'Master template';
 $wb["template_additional_txt"] = 'Addon template';
diff --git a/interface/web/client/lib/lang/en_client_template.lng b/interface/web/client/lib/lang/en_client_template.lng
index c3453a8..6d9ee11 100644
--- a/interface/web/client/lib/lang/en_client_template.lng
+++ b/interface/web/client/lib/lang/en_client_template.lng
@@ -17,6 +17,9 @@
 $wb["limit_subdomain_txt"] = 'limit_subdomain';
 $wb["limit_webquota_txt"] = 'limit_webquota';
 $wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
 $wb["limit_web_domain_txt"] = 'Max. number of web domains';
 $wb["limit_web_aliasdomain_txt"] = 'Max. number of web aliasdomains';
 $wb["limit_web_subdomain_txt"] = 'Max. number of web subdomains';
@@ -46,5 +49,7 @@
 $wb["limit_dns_zone_error_notint"] = 'The dns record limit must be a number.';
 $wb["limit_database_txt"] = 'Max. number of Databases';
 $wb["limit_database_error_notint"] = 'The database limit must be a number.';
+$wb["limit_cron_error_notint"] = 'The cron limit must be a number.';
+$wb["limit_cron_error_frequency"] = 'The cron frequency limit must be a number.';
 $wb["error_template_name_empty"] = 'Please enter a Template name';
 ?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/en_reseller.lng b/interface/web/client/lib/lang/en_reseller.lng
new file mode 100644
index 0000000..906fd44
--- /dev/null
+++ b/interface/web/client/lib/lang/en_reseller.lng
@@ -0,0 +1,93 @@
+<?php
+$wb["limit_maildomain_txt"] = 'Max. number of email domains';
+$wb["limit_mailbox_txt"] = 'Max. number of mailboxes';
+$wb["limit_mailalias_txt"] = 'Max. number of email aliases';
+$wb["limit_mailforward_txt"] = 'Max. number of email forwarders';
+$wb["limit_mailcatchall_txt"] = 'Max. number of email catchall accounts';
+$wb["limit_mailrouting_txt"] = 'Max. number of email routes';
+$wb["limit_mailfilter_txt"] = 'Max. number of email filters';
+$wb["limit_fetchmail_txt"] = 'Max. number of fetchmail accounts';
+$wb["limit_mailquota_txt"] = 'Mailbox quota';
+$wb["limit_spamfilter_wblist_txt"] = 'Max. number of spamfilter white / blacklist filters';
+$wb["limit_spamfilter_user_txt"] = 'Max. number of spamfilter users';
+$wb["limit_spamfilter_policy_txt"] = 'Max. number of spamfilter policys';
+$wb["default_mailserver_txt"] = 'Default Mailserver';
+$wb["company_name_txt"] = 'Company name';
+$wb["contact_name_txt"] = 'Contact name';
+$wb["username_txt"] = 'Username';
+$wb["password_txt"] = 'Password';
+$wb["password_strength_txt"] = 'Password strength';
+$wb["language_txt"] = 'Language';
+$wb["usertheme_txt"] = 'Theme';
+$wb["street_txt"] = 'Street';
+$wb["zip_txt"] = 'ZIP';
+$wb["city_txt"] = 'City';
+$wb["state_txt"] = 'State';
+$wb["country_txt"] = 'Country';
+$wb["telephone_txt"] = 'Telephone';
+$wb["mobile_txt"] = 'Mobile';
+$wb["fax_txt"] = 'Fax';
+$wb["email_txt"] = 'Email';
+$wb["internet_txt"] = 'Internet';
+$wb["icq_txt"] = 'ICQ';
+$wb["notes_txt"] = 'Notes';
+$wb["company_txt"] = 'Company';
+$wb["title_txt"] = 'Title';
+$wb["firstname_txt"] = 'Firstname';
+$wb["surname_txt"] = 'Surname';
+$wb["limit_domain_txt"] = 'limit_domain';
+$wb["limit_subdomain_txt"] = 'limit_subdomain';
+$wb["limit_webquota_txt"] = 'limit_webquota';
+$wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
+$wb["ip_address_txt"] = 'ip_address';
+$wb["limit_client_error_notint"] = 'Client Limit is not a number.';
+$wb["firstname_error_empty"] = 'Firstname is empty.';
+$wb["contact_error_empty"] = 'Contact name is empty.';
+$wb["default_webserver_txt"] = 'Default Webserver';
+$wb["limit_web_domain_txt"] = 'Max. number of web domains';
+$wb["limit_web_aliasdomain_txt"] = 'Max. number of web aliasdomains';
+$wb["limit_web_subdomain_txt"] = 'Max. number of web subdomains';
+$wb["limit_ftp_user_txt"] = 'Max. number of FTP users';
+$wb["default_dnsserver_txt"] = 'Default DNS Server';
+$wb["limit_dns_zone_txt"] = 'Max. number of DNS zones';
+$wb["limit_dns_record_txt"] = 'Max. number DNS records';
+$wb["limit_shell_user_txt"] = 'Max. number of Shell users';
+$wb["limit_client_txt"] = 'Max. number of Clients';
+$wb["username_error_empty"] = 'Username is empty.';
+$wb["username_error_unique"] = 'The username must be unique.';
+$wb["limit_maildomain_error_notint"] = 'The email domain limit must be a number.';
+$wb["limit_mailbox_error_notint"] = 'The mailbox limit must be a number.';
+$wb["limit_mailalias_error_notint"] = 'The email alias limit must be a number.';
+$wb["limit_mailforward_error_notint"] = 'The email forward limit must be a number.';
+$wb["limit_mailcatchall_error_notint"] = 'The email catchall limit must be a number.';
+$wb["limit_mailrouting_error_notint"] = 'The email routing limit must be a number.';
+$wb["limit_mailfilter_error_notint"] = 'The email filter limit must be a number.';
+$wb["limit_mailfetchmail_error_notint"] = 'The fetchmail limit must be a number.';
+$wb["limit_mailquota_error_notint"] = 'The email quota limit must be a number.';
+$wb["limit_spamfilter_wblist_error_notint"] = 'The spamfilter white / blacklist limit must be a number.';
+$wb["limit_spamfilter_user_error_notint"] = 'The spamfilter user limit must be a number.';
+$wb["limit_spamfilter_policy_error_notint"] = 'The spamfilter policy limit must be a number.';
+$wb["limit_web_domain_error_notint"] = 'The website limit must be a number.';
+$wb["limit_web_aliasdomain_error_notint"] = 'The website alias domain limit must be a number.';
+$wb["limit_web_subdomain_error_notint"] = 'The website subdomain limit must be a number.';
+$wb["limit_ftp_user_error_notint"] = 'The ftp user limit must be a number.';
+$wb["limit_shell_user_error_notint"] = 'The shell user limit must be a number.';
+$wb["limit_dns_zone_error_notint"] = 'The dns zone limit must be a number.';
+$wb["limit_dns_zone_error_notint"] = 'The dns record limit must be a number.';
+$wb["limit_client_error_notint"] = 'The sub client limit must be a number.';
+$wb["default_dbserver_txt"] = 'Default Database Server';
+$wb["limit_database_txt"] = 'Max. number of Databases';
+$wb["limit_database_error_notint"] = 'The database limit must be a number.';
+$wb["limit_cron_error_notint"] = 'The cron limit must be a number.';
+$wb["limit_cron_error_frequency"] = 'The cron frequency limit must be a number.';
+$wb["username_error_regex"] = 'The Username contains invalid chracaters.';
+$wb["template_master_txt"] = 'Master template';
+$wb["template_additional_txt"] = 'Addon template';
+$wb["ssh_chroot_txt"] = 'SSH-Chroot Options';
+$wb["web_php_options_txt"] = 'PHP Options';
+$wb["limit_client_error"] = 'The max. number of clients is reached.';
+$wb["limit_client_error_positive"] = 'The number of clients must be > 0';
+?>
diff --git a/interface/web/client/lib/lang/en_resellers_list.lng b/interface/web/client/lib/lang/en_resellers_list.lng
new file mode 100644
index 0000000..523a467
--- /dev/null
+++ b/interface/web/client/lib/lang/en_resellers_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Resellers';
+$wb["client_id_txt"] = 'ID';
+$wb["company_name_txt"] = 'Company name';
+$wb["contact_name_txt"] = 'Contact name';
+$wb["city_txt"] = 'City';
+$wb["country_txt"] = 'Country';
+$wb["add_new_record_txt"] = 'Add new reseller';
+?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/es_client.lng b/interface/web/client/lib/lang/es_client.lng
index 4ce030d..66ac5ad 100644
--- a/interface/web/client/lib/lang/es_client.lng
+++ b/interface/web/client/lib/lang/es_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/es_client_template.lng b/interface/web/client/lib/lang/es_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/es_client_template.lng
+++ b/interface/web/client/lib/lang/es_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/fi_client.lng b/interface/web/client/lib/lang/fi_client.lng
index 518b935..089c981 100755
--- a/interface/web/client/lib/lang/fi_client.lng
+++ b/interface/web/client/lib/lang/fi_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Lisämalli';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/fi_client_template.lng b/interface/web/client/lib/lang/fi_client_template.lng
index 3139049..983f503 100755
--- a/interface/web/client/lib/lang/fi_client_template.lng
+++ b/interface/web/client/lib/lang/fi_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'DNS-tietueiden raja-arvon pitää olla numero.';
 $wb['limit_database_error_notint'] = 'Tietokantojen raja-arvon pitää olla numero.';
 $wb['error_template_name_empty'] = 'Anna mallilomakkeen nimi';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/fr_client.lng b/interface/web/client/lib/lang/fr_client.lng
index bb196de..7e8f6f6 100644
--- a/interface/web/client/lib/lang/fr_client.lng
+++ b/interface/web/client/lib/lang/fr_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/fr_client_template.lng b/interface/web/client/lib/lang/fr_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/fr_client_template.lng
+++ b/interface/web/client/lib/lang/fr_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng
index 85046ef..c3da1ad 100644
--- a/interface/web/client/lib/lang/it_client.lng
+++ b/interface/web/client/lib/lang/it_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Aggiuntivo';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/it_client_template.lng b/interface/web/client/lib/lang/it_client_template.lng
index e59338d..6ad8f11 100644
--- a/interface/web/client/lib/lang/it_client_template.lng
+++ b/interface/web/client/lib/lang/it_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Devi inserire il nome del modello';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/nl_client.lng b/interface/web/client/lib/lang/nl_client.lng
index e145844..faa9073 100644
--- a/interface/web/client/lib/lang/nl_client.lng
+++ b/interface/web/client/lib/lang/nl_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/nl_client_template.lng b/interface/web/client/lib/lang/nl_client_template.lng
index 0626847..6098bec 100644
--- a/interface/web/client/lib/lang/nl_client_template.lng
+++ b/interface/web/client/lib/lang/nl_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'De dns record limiet moet een numerieke waarde zijn.';
 $wb['limit_database_error_notint'] = 'De database limiet moet een numerieke waarde zijn.';
 $wb['error_template_name_empty'] = 'Voer a.u.b. de template naam in.';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/ru_client.lng b/interface/web/client/lib/lang/ru_client.lng
index e6d2909..3f6aab3 100644
--- a/interface/web/client/lib/lang/ru_client.lng
+++ b/interface/web/client/lib/lang/ru_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/ru_client_template.lng b/interface/web/client/lib/lang/ru_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/ru_client_template.lng
+++ b/interface/web/client/lib/lang/ru_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/lang/se_client.lng b/interface/web/client/lib/lang/se_client.lng
index bb196de..7e8f6f6 100644
--- a/interface/web/client/lib/lang/se_client.lng
+++ b/interface/web/client/lib/lang/se_client.lng
@@ -80,4 +80,10 @@
 $wb['template_additional_txt'] = 'Addon';
 $wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
 $wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
 ?>
diff --git a/interface/web/client/lib/lang/se_client_template.lng b/interface/web/client/lib/lang/se_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/se_client_template.lng
+++ b/interface/web/client/lib/lang/se_client_template.lng
@@ -44,4 +44,9 @@
 $wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
 $wb['limit_database_error_notint'] = 'The database limit must be a number.';
 $wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$wb['limit_cron_error_notint'] = 'The cron limit must be a number.';
+$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.';
 ?>
diff --git a/interface/web/client/lib/module.conf.php b/interface/web/client/lib/module.conf.php
index 4d9a0ce..cc4347b 100644
--- a/interface/web/client/lib/module.conf.php
+++ b/interface/web/client/lib/module.conf.php
@@ -28,4 +28,36 @@
 $module["nav"][] = array(	'title'	=> 'Clients',
 							'open' 	=> 1,
 							'items'	=> $items);
+
+unset($items);
+
+
+if($_SESSION["s"]["user"]["typ"] == 'admin'){
+
+$items[] = array( 'title' 	=> "Add Reseller",
+				  'target' 	=> 'content',
+				  'link'	=> 'client/reseller_edit.php');
+
+$items[] = array( 'title' 	=> "Edit Reseller",
+				  'target' 	=> 'content',
+				  'link'	=> 'client/reseller_list.php');
+
+$module["nav"][] = array(	'title'	=> 'Resellers',
+							'open' 	=> 1,
+							'items'	=> $items);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ?>
\ No newline at end of file
diff --git a/interface/web/client/list/reseller.list.php b/interface/web/client/list/reseller.list.php
new file mode 100644
index 0000000..39b8ecc
--- /dev/null
+++ b/interface/web/client/list/reseller.list.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+	Datatypes:
+	- INTEGER
+	- DOUBLE
+	- CURRENCY
+	- VARCHAR
+	- TEXT
+	- DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] 				= "resellers";
+
+// Database table
+$liste["table"] 			= "client";
+
+// Index index field of the database table
+$liste["table_idx"]			= "client_id";
+
+// Search Field Prefix
+$liste["search_prefix"] 	= "search_";
+
+// Records per page
+$liste["records_per_page"] 	= 15;
+
+// Script File of the list
+$liste["file"]				= "reseller_list.php";
+
+// Script file of the edit form
+$liste["edit_file"]			= "reseller_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"]		= "reseller_del.php";
+
+// Paging Template
+$liste["paging_tpl"]		= "templates/paging.tpl.htm";
+
+// Enable authe
+$liste["auth"]				= "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+$liste["item"][] = array(	'field'		=> "company_name",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");
+
+$liste["item"][] = array(	'field'		=> "contact_name",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");  
+
+$liste["item"][] = array(	'field'		=> "city",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");
+
+$liste["item"][] = array(	'field'		=> "country",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_del.php b/interface/web/client/reseller_del.php
new file mode 100644
index 0000000..8ee40a5
--- /dev/null
+++ b/interface/web/client/reseller_del.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/reseller.list.php";
+$tform_def_file = "form/reseller.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('client');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.');
+
+$app->uses('tpl,tform');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+	function onAfterDelete() {
+		global $app, $conf;
+		
+		$client_id = intval($this->dataRecord['client_id']);
+		
+		if($client_id > 0) {
+			// TODO: Delete all records (sub-clients, mail, web, etc....)  of this client.
+			
+			// remove the group of the client from the resellers group
+			$parent_client_id = intval($this->dataRecord['parent_client_id']);
+			$parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id");
+			$client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id");
+			$app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']);
+			
+			// delete the group of the client
+			$app->db->query("DELETE FROM sys_group WHERE client_id = $client_id");
+			
+			// delete the sys user(s) of the client
+			$app->db->query("DELETE FROM sys_user WHERE client_id = $client_id");
+		}
+		
+	}
+}
+
+$page = new page_action;
+$page->onDelete()
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_edit.php b/interface/web/client/reseller_edit.php
new file mode 100644
index 0000000..3df9375
--- /dev/null
+++ b/interface/web/client/reseller_edit.php
@@ -0,0 +1,214 @@
+<?php
+/*
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$tform_def_file = "form/reseller.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+require_once('tools.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('client');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+
+	function onShowNew() {
+		global $app, $conf;
+		
+		// we will check only users, not admins
+		if($_SESSION["s"]["user"]["typ"] == 'user') {
+			
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			
+			// Check if the user may add another website.
+			if($client["limit_client"] >= 0) {
+				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id");
+				if($tmp["number"] >= $client["limit_client"]) {
+					$app->error($app->tform->wordbook["limit_client_txt"]);
+				}
+			}
+		}
+		
+		parent::onShowNew();
+	}
+	
+	
+	function onSubmit() {
+		global $app, $conf;
+		
+		// we will check only users, not admins
+		if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) {
+			
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			
+			// Check if the user may add another website.
+			if($client["limit_client"] >= 0) {
+				$tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id");
+				if($tmp["number"] >= $client["limit_client"]) {
+					$app->error($app->tform->wordbook["limit_client_txt"]);
+				}
+			}
+		}
+		
+		parent::onSubmit();
+	}
+
+
+	function onShowEnd() {
+
+		global $app;
+
+		$sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'";
+		$tpls = $app->db->queryAllRecords($sql);
+		$option = '';
+		$tpl = array();
+		foreach($tpls as $item){
+			$option .= '<option value="' . $item['template_id'] . '|' .  $item['template_name'] . '">' . $item['template_name'] . '</option>';
+			$tpl[$item['template_id']] = $item['template_name'];
+		}
+		$app->tpl->setVar('tpl_add_select',$option);
+
+		$sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id;
+		$result = $app->db->queryOneRecord($sql);
+		$tplAdd = explode("/", $result['template_additional']);
+		$text = '';
+		foreach($tplAdd as $item){
+			if (trim($item) != ''){
+				if ($text != '') $text .= '<br />';
+				$text .= $tpl[$item];
+			}
+		}
+
+		$app->tpl->setVar('template_additional_list', $text);
+
+		parent::onShowEnd();
+
+	}
+
+	/*
+	 This function is called automatically right after
+	 the data was successful inserted in the database.
+	*/
+	function onAfterInsert() {
+		global $app;
+		// Create the group for the reseller
+		$groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid');
+		$groups = $groupid;
+		
+		$username = $app->db->quote($this->dataRecord["username"]);
+		$password = $app->db->quote($this->dataRecord["password"]);
+		$modules = ISPC_INTERFACE_MODULES_ENABLED.',client';
+		$startmodule = 'client';
+		$usertheme = $app->db->quote($this->dataRecord["usertheme"]);
+		$type = 'user';
+		$active = 1;
+		$language = $app->db->quote($this->dataRecord["language"]);
+		
+		// Create the controlpaneluser for the reseller
+		$sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id)
+		VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")";
+		$app->db->query($sql);
+		
+		//* set the number of clients to 1
+		$app->db->query("UPDATE client SET limit_client = 1 WHERE client_id = ".$this->id);
+
+		/* If there is a client-template, process it */
+		applyClientTemplates($this->id);
+
+		parent::onAfterInsert();
+	}
+	
+	
+	/*
+	 This function is called automatically right after
+	 the data was successful updated in the database.
+	*/
+	function onAfterUpdate() {
+		global $app;
+		
+		// username changed
+		if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) {
+			$username = $app->db->quote($this->dataRecord["username"]);
+			$client_id = $this->id;
+			$sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id";
+			$app->db->query($sql);
+			
+			$tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id");
+			$app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']);
+			unset($tmp);
+		}
+		
+		// password changed
+		if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') {
+			$password = $app->db->quote($this->dataRecord["password"]);
+			$client_id = $this->id;
+			$sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id";
+			$app->db->query($sql);
+		}
+		
+		// reseller status changed
+		if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) {
+			$modules = ISPC_INTERFACE_MODULES_ENABLED.',client';
+			$modules = $app->db->quote($modules);
+			$client_id = $this->id;
+			$sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id";
+			$app->db->query($sql);
+		}
+		/*
+		 *  If there is a client-template, process it */
+		applyClientTemplates($this->id);
+
+		parent::onAfterUpdate();
+	}
+}
+
+$page = new page_action;
+$page->onLoad();
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_list.php b/interface/web/client/reseller_list.php
new file mode 100644
index 0000000..4d2a462
--- /dev/null
+++ b/interface/web/client/reseller_list.php
@@ -0,0 +1,55 @@
+<?php
+/*
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/reseller.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('client');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.');
+
+$app->uses('listform_actions');
+
+$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id';
+$app->listform_actions->SQLExtWhere = "limit_client > 0";
+$app->listform_actions->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm
index e12abe9..ee5ab67 100644
--- a/interface/web/client/templates/client_edit_limits.htm
+++ b/interface/web/client/templates/client_edit_limits.htm
@@ -142,10 +142,6 @@
         <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
 			</div>
       <div class="ctrlHolder">
-      	<label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
-        <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
       	<label for="default_dbserver">{tmpl_var name='default_dbserver_txt'}</label>
         <select name="default_dbserver" id="default_dbserver" class="selectInput">
 					{tmpl_var name='default_dbserver'}
@@ -155,6 +151,20 @@
       	<label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
         <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
 			</div>
+      <div class="ctrlHolder">
+        <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+        <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+        <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+          {tmpl_var name='limit_cron_type'}
+        </select>
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+        <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
     </fieldset>
 
     <input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm
index bd01dce..1ee1a1e 100644
--- a/interface/web/client/templates/client_template_edit_limits.htm
+++ b/interface/web/client/templates/client_template_edit_limits.htm
@@ -1,102 +1,112 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_client_template">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels"><legend>Limits</legend>
-      <div class="ctrlHolder">
-      	<label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
-        <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
-        <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
-        <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
-        <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
-        <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
-        <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
-        <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
-        <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
-        <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
-        <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
-        <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
-        <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
-        <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
-        <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
-        <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
-        <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
-        <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_dns_zone">{tmpl_var name='limit_dns_zone_txt'}</label>
-        <input name="limit_dns_zone" id="limit_dns_zone" value="{tmpl_var name='limit_dns_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
-        <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
-        <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
-        <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','client/client_template_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('client/client_template_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client_template">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Limits</legend>
+      <div class="ctrlHolder">
+      	<label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
+        <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
+        <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
+        <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
+        <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
+        <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
+        <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
+        <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
+        <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
+        <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
+        <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
+        <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
+        <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
+        <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
+        <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
+        <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
+        <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
+        <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_dns_zone">{tmpl_var name='limit_dns_zone_txt'}</label>
+        <input name="limit_dns_zone" id="limit_dns_zone" value="{tmpl_var name='limit_dns_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
+        <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
+        <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+        <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+        <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+        <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+          {tmpl_var name='limit_cron_type'}
+        </select>
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+        <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','client/client_template_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('client/client_template_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/client/templates/reseller_edit_address.htm b/interface/web/client/templates/reseller_edit_address.htm
new file mode 100644
index 0000000..493a930
--- /dev/null
+++ b/interface/web/client/templates/reseller_edit_address.htm
@@ -0,0 +1,101 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Address</legend>
+      <div class="ctrlHolder">
+      	<label for="company_name">{tmpl_var name='company_name_txt'}</label>
+        <input name="company_name" id="company_name" value="{tmpl_var name='company_name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="contact_name">{tmpl_var name='contact_name_txt'}</label>
+        <input name="contact_name" id="contact_name" value="{tmpl_var name='contact_name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="username">{tmpl_var name='username_txt'}</label>
+        <input name="username" id="username" value="{tmpl_var name='username'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="password">{tmpl_var name='password_txt'}</label>
+        <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value)" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='password_strength_txt'}</p>
+				<div id="passBar"></div>
+				<p class="formHint"><span id="passText">&nbsp;</span></p>
+			</div>
+      <div class="ctrlHolder">
+      	<label for="language">{tmpl_var name='language_txt'}</label>
+        <select name="language" id="language" class="selectInput withicons">
+					{tmpl_var name='language'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="usertheme">{tmpl_var name='usertheme_txt'}</label>
+        <select name="usertheme" id="usertheme" class="selectInput">
+					{tmpl_var name='usertheme'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="street">{tmpl_var name='street_txt'}</label>
+        <input name="street" id="street" value="{tmpl_var name='street'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="zip">{tmpl_var name='zip_txt'}</label>
+        <input name="zip" id="zip" value="{tmpl_var name='zip'}" size="10" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="city">{tmpl_var name='city_txt'}</label>
+        <input name="city" id="city" value="{tmpl_var name='city'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="state">{tmpl_var name='state_txt'}</label>
+        <input name="state" id="state" value="{tmpl_var name='state'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="country">{tmpl_var name='country_txt'}</label>
+        <select name="country" id="country" class="selectInput withicons">
+					{tmpl_var name='country'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="telephone">{tmpl_var name='telephone_txt'}</label>
+        <input name="telephone" id="telephone" value="{tmpl_var name='telephone'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="mobile">{tmpl_var name='mobile_txt'}</label>
+        <input name="mobile" id="mobile" value="{tmpl_var name='mobile'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="fax">{tmpl_var name='fax_txt'}</label>
+        <input name="fax" id="fax" value="{tmpl_var name='fax'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="email">{tmpl_var name='email_txt'}</label>
+        <input name="email" id="email" value="{tmpl_var name='email'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="internet">{tmpl_var name='internet_txt'}</label>
+        <input name="internet" id="internet" value="{tmpl_var name='internet'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="icq">{tmpl_var name='icq_txt'}</label>
+        <input name="icq" id="icq" value="{tmpl_var name='icq'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="notes">{tmpl_var name='notes_txt'}</label>
+        <textarea name="notes" id="notes" rows='10' cols='30'>{tmpl_var name='notes'}</textarea>
+      </div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','client/reseller_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('client/reseller_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm
new file mode 100644
index 0000000..7e027e4
--- /dev/null
+++ b/interface/web/client/templates/reseller_edit_limits.htm
@@ -0,0 +1,171 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Limits</legend>
+<tmpl_if name="is_admin">
+      <div class="ctrlHolder">
+      	<label for="template_master">{tmpl_var name='template_master_txt'}</label>
+        <select name="template_master" id="template_master" class="selectInput">
+					{tmpl_var name='template_master'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="template_additional">{tmpl_var name='template_additional_txt'}</label>
+        <select name="tpl_add_select" id="tpl_add_select" class="selectInput">
+					{tmpl_var name='tpl_add_select'}
+				</select>
+	      <span id="template_additional_list">{tmpl_var name='template_additional_list'}</span>
+	  	  <input type="hidden" id="template_additional" name="template_additional" value="{tmpl_var name='template_additional'}">
+      </div>
+	  <div class="ctrlHolder">
+	    &nbsp;
+	  </div>
+</tmpl_if>
+      <div class="ctrlHolder">
+      	<label for="default_mailserver">{tmpl_var name='default_mailserver_txt'}</label>
+        <select name="default_mailserver" id="default_mailserver" class="selectInput">
+					{tmpl_var name='default_mailserver'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
+        <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
+        <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
+        <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
+        <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
+        <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
+        <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
+        <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
+        <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
+        <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />&nbsp;MB
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
+        <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
+        <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
+        <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="default_webserver">{tmpl_var name='default_webserver_txt'}</label>
+        <select name="default_webserver" id="default_webserver" class="selectInput">
+					{tmpl_var name='default_webserver'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
+        <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='web_php_options_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='web_php_options'}
+					</div>
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
+        <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
+        <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
+        <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
+        <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='ssh_chroot_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='ssh_chroot'}
+					</div>
+			</div>
+      <div class="ctrlHolder">
+      	<label for="default_dnsserver">{tmpl_var name='default_dnsserver_txt'}</label>
+        <select name="default_dnsserver" id="default_dnsserver" class="selectInput">
+					{tmpl_var name='default_dnsserver'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="limit_dns_zone">{tmpl_var name='limit_dns_zone_txt'}</label>
+        <input name="limit_dns_zone" id="limit_dns_zone" value="{tmpl_var name='limit_dns_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
+        <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
+        <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="default_dbserver">{tmpl_var name='default_dbserver_txt'}</label>
+        <select name="default_dbserver" id="default_dbserver" class="selectInput">
+					{tmpl_var name='default_dbserver'}
+				</select>
+      </div>
+      <div class="ctrlHolder">
+      	<label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
+        <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+        <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+        <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+        <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+          {tmpl_var name='limit_cron_type'}
+        </select>
+            </div>
+      <div class="ctrlHolder">
+        <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+        <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+            </div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','client/reseller_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('client/reseller_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/client/templates/resellers_list.htm b/interface/web/client/templates/resellers_list.htm
new file mode 100644
index 0000000..c8dc083
--- /dev/null
+++ b/interface/web/client/templates/resellers_list.htm
@@ -0,0 +1,62 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_clients">
+
+  <div class="pnl_toolsarea">
+    <fieldset><legend>Tools</legend>
+      <div class="buttons">
+        <button class="iconstxt icoAdd" type="button" onClick="loadContent('client/reseller_edit.php');">
+          <span>{tmpl_var name="add_new_record_txt"}</span>
+        </button>
+      </div>
+    </fieldset>
+  </div>
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_client_id" scope="col"><tmpl_var name="client_id_txt"></th>
+            <th class="tbl_col_company_name" scope="col"><tmpl_var name="company_name_txt"></th>
+            <th class="tbl_col_contact_name" scope="col"><tmpl_var name="contact_name_txt"></th>
+            <th class="tbl_col_city" scope="col"><tmpl_var name="city_txt"></th>
+            <th class="tbl_col_country" scope="col"><tmpl_var name="country_txt"></th>
+            <th class="tbl_col_country" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_client_id"><input type="text" name="search_client_id" value="{tmpl_var name='search_client_id'}" /></td>
+            <td class="tbl_col_company_name"><input type="text" name="search_company_name" value="{tmpl_var name='search_company_name'}" /></td>
+            <td class="tbl_col_contact_name"><input type="text" name="search_contact_name" value="{tmpl_var name='search_contact_name'}" /></td>
+            <td class="tbl_col_city"><input type="text" name="search_city" value="{tmpl_var name='search_city'}" /></td>
+            <td class="tbl_col_country"><input type="text" name="search_country" value="{tmpl_var name='search_country'}" /></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','client/reseller_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_client_id"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="client_id"}</a></td>
+            <td class="tbl_col_company_name"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="company_name"}</a></td>
+            <td class="tbl_col_contact_name"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="contact_name"}</a></td>
+            <td class="tbl_col_city"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="city"}</a></td>
+            <td class="tbl_col_country"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="country"}</a></td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+                <a class="icons16 icoDelete" href="javascript: del_record('client/reseller_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="6"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/designer/lib/lang/br.lng b/interface/web/designer/lib/lang/br.lng
new file mode 100644
index 0000000..62a2de0
--- /dev/null
+++ b/interface/web/designer/lib/lang/br.lng
@@ -0,0 +1,3 @@
+<?php
+
+?>
diff --git a/interface/web/designer/lib/lang/br_form_edit.lng b/interface/web/designer/lib/lang/br_form_edit.lng
new file mode 100644
index 0000000..89b84c1
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_edit.lng
@@ -0,0 +1,26 @@
+<?php
+$wb["name_txt"] = 'Nome do Formulário';
+$wb["title_txt"] = 'Título do Formulário';
+$wb["template_txt"] = 'Gabarito';
+$wb["navframe_txt"] = 'Frame de Navegação';
+$wb["startpage_txt"] = 'Página Inicial';
+$wb["tab_width_txt"] = 'Tamanho da aba';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+$wb["header_txt"] = 'Propriedades do Formulário';
+$wb["description_txt"] = 'Descrição';
+$wb["action_txt"] = 'Ação (script)';
+$wb["db_table_txt"] = 'Tabela do DB';
+$wb["db_table_idx_txt"] = 'Indíce da tabela do DB';
+$wb["db_history_txt"] = 'Desfazer Log';
+$wb["tab_default_txt"] = 'Aba Padrão';
+$wb["list_default_txt"] = 'Exibir Padrão';
+$wb["tab_width_txt"] = 'Tamanho da aba';
+$wb["auth_txt"] = 'Permissões';
+$wb["auth_preset_userid_txt"] = 'Usuário(ID)';
+$wb["auth_preset_groupid_txt"] = 'Grupo(ID)';
+$wb["auth_preset_perm_user_txt"] = 'Perm. Usuário';
+$wb["auth_preset_perm_group_txt"] = 'Perm. Grupo';
+$wb["auth_preset_perm_other_txt"] = 'Perm. Outros';
+
+?>
diff --git a/interface/web/designer/lib/lang/br_form_list.lng b/interface/web/designer/lib/lang/br_form_list.lng
new file mode 100644
index 0000000..2c6baa5
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Formulário de Backend';
+$wb["form_txt"] = 'Formulário';
+$wb["module_txt"] = 'Módulo';
+$wb["title_txt"] = 'Título';
+$wb["description_txt"] = 'Descrição';
+?>
diff --git a/interface/web/designer/lib/lang/br_form_show.lng b/interface/web/designer/lib/lang/br_form_show.lng
new file mode 100644
index 0000000..fe9cf14
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_show.lng
@@ -0,0 +1,18 @@
+<?php
+$wb["header_txt"] = 'Editor de Formulários';
+$wb["title_txt"] = 'Título do Formulário';
+$wb["name_txt"] = 'Nome do Formulário';
+$wb["delete_txt"] = 'Remover';
+$wb["properties_txt"] = 'Propriedades';
+$wb["new_tab_txt"] = 'Nova Aba';
+$wb["edit_txt"] = 'Editar';
+$wb["new_txt"] = 'Novo';
+$wb["up_txt"] = '^';
+$wb["down_txt"] = 'v';
+$wb["module_txt"] = 'Módulo';
+$wb["form_txt"] = 'Formulário';
+$wb["description_txt"] = 'Descrição';
+$wb["module_del_txt"] = "Remover o módulo e todos seus sub-diretórios?";
+$wb["menu_del_txt"] = "Remover o menu e todos os seus itens?";
+$wb["item_del_txt"] = "Remover o item de menu?";
+?>
diff --git a/interface/web/designer/lib/lang/br_module_edit.lng b/interface/web/designer/lib/lang/br_module_edit.lng
new file mode 100644
index 0000000..de4ec59
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_edit.lng
@@ -0,0 +1,23 @@
+<?php
+$wb["name_txt"] = 'Nome do Módulo';
+$wb["title_txt"] = 'Título do Módulo';
+$wb["template_txt"] = 'Arquivo de Gabarito';
+$wb["navframe_txt"] = 'Frame de Navegação';
+$wb["startpage_txt"] = 'Página Padrão';
+$wb["tab_width_txt"] = 'Tamanho da Aba';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+$wb["header_txt"] = 'Propriedades do Módulo';
+$wb["description_txt"] = '
+<b>Descrição</b>
+<br><br>
+<b>Nome do Módulo:</b> Nome do diretório do módulo. Somente números, letras e underscores são permitidos.<br>
+<b>Título do Módulo:</b> Será exibido em caixa alta no menu de navegação.<br>
+<b>Arquivo de Gabarito:</b> Arquivo de Gabarito do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.<br>
+<b>Frame de Navegação:</b> Se modulo_tree.tpl.htm foi selecionado como arquivo de gabarito, insira aqui o caminho do script para o frame a esquerda.<br>
+<b>Página Padrão:</b> Esta página será exibida quando o módulo for aberto.<br>
+<b>Tamanho da Aba:</b> Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Você pode informar valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).<br>
+<b>Dica:</b> Todos os caminhos são relativos ao diretório "web".
+';
+
+?>
diff --git a/interface/web/designer/lib/lang/br_module_list.lng b/interface/web/designer/lib/lang/br_module_list.lng
new file mode 100644
index 0000000..fc33032
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb["list_head_txt"] = 'Módulo do Backend';
+$wb["module_txt"] = 'Módulo';
+$wb["title_txt"] = 'Título';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_nav_edit.lng b/interface/web/designer/lib/lang/br_module_nav_edit.lng
new file mode 100644
index 0000000..6fa8819
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_nav_edit.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["title_txt"] = 'Título';
+$wb["header_txt"] = 'Propriedades de Navegação';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_nav_item_edit.lng b/interface/web/designer/lib/lang/br_module_nav_item_edit.lng
new file mode 100644
index 0000000..9f790f0
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_nav_item_edit.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["title_txt"] = 'Título';
+$wb["target_txt"] = 'Target';
+$wb["link_txt"] = 'Link';
+$wb["header_txt"] = 'Propriedades de Navegação';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_show.lng b/interface/web/designer/lib/lang/br_module_show.lng
new file mode 100644
index 0000000..6054ce7
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_show.lng
@@ -0,0 +1,17 @@
+<?php
+$wb["header_txt"] = 'Editor de Menu';
+$wb["title_txt"] = 'Título';
+$wb["name_txt"] = 'Módulo';
+$wb["delete_txt"] = 'Remover';
+$wb["properties_txt"] = 'Propriedades';
+$wb["new_menu_txt"] = 'Novo Menu';
+$wb["edit_txt"] = 'Editar';
+$wb["delete_txt"] = 'Remover';
+$wb["new_txt"] = 'Novo';
+$wb["up_txt"] = 'Subir';
+$wb["down_txt"] = 'Descer';
+$wb["module_txt"] = 'Módulo';
+$wb['module_del_txt'] = 'Deseja eliminar este módulo e todos os arquivos contidos no diretório?';
+$wb['menu_del_txt'] = 'Deseja apagar este menu e todos seus elementos?';
+$wb['item_del_txt'] = 'Deseja apagar este elemento do menu?';
+?>
diff --git a/interface/web/dns/dns_a_edit.php b/interface/web/dns/dns_a_edit.php
index b242c81..431b4ac 100644
--- a/interface/web/dns/dns_a_edit.php
+++ b/interface/web/dns/dns_a_edit.php
@@ -96,6 +96,11 @@
 			}
 		} // end if user is not admin
 		
+		//* Check for duplicates where IP and hostname are the same
+		$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE zone = '".$this->dataRecord["zone"]."' and data = '".$this->dataRecord["data"]."' and id != ".$this->id);
+		if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("data_error_duplicate")."<br>";
+		unset($tmp);
+		
 		
 		// Set the server ID of the rr record to the same server ID as the parent record.
 		$this->dataRecord["server_id"] = $soa["server_id"];
diff --git a/interface/web/dns/dns_soa_edit.php b/interface/web/dns/dns_soa_edit.php
index 0616c56..3f120db 100644
--- a/interface/web/dns/dns_soa_edit.php
+++ b/interface/web/dns/dns_soa_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_dns_zone FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another maildomain.
-			if($client["limit_dns_zone"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_soa WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_dns_zone"]) {
-					$app->error($app->tform->wordbook["limit_dns_zone_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_dns_zone')) {
+				$app->error($app->tform->wordbook["limit_dns_zone_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_dns_zone_txt"]);
 			}
 		}
 		
@@ -76,7 +70,7 @@
 		global $app, $conf;
 		
 		// If user is admin, we will allow him to select to whom this record belongs
-		if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+		if($_SESSION["s"]["user"]["typ"] == 'admin') {
 			// Getting Domains of the user
 			$sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0";
 			$clients = $app->db->queryAllRecords($sql);
@@ -89,6 +83,24 @@
 				}
 			}
 		$app->tpl->setVar("client_group_id",$client_select);
+		} else if($app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+		
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			
+			// Fill the client select field
+			$sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
+			$clients = $app->db->queryAllRecords($sql);
+			$client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
+			if(is_array($clients)) {
+				foreach( $clients as $client) {
+					$selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
+					$client_select .= "<option value='$client[groupid]' $selected>$client[name]</option>\r\n";
+				}
+			}
+			$app->tpl->setVar("client_group_id",$client_select);
+		
 		}
 		
 		parent::onShowEnd();
@@ -128,9 +140,9 @@
 		$this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]);
 		
 		//* Check if soa, ns and mbox have a dot at the end
-		if(substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.';
-		if(substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.';
-		if(substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.';
+		if(strlen($this->dataRecord["origin"]) > 0 && substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.';
+		if(strlen($this->dataRecord["ns"]) > 0 && substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.';
+		if(strlen($this->dataRecord["mbox"]) > 0 && substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.';
 		
 		//* Replace @ in mbox
 		if(stristr($this->dataRecord["mbox"],'@')) {
diff --git a/interface/web/dns/dns_template_edit.php b/interface/web/dns/dns_template_edit.php
index ac2704e..5dda4da 100644
--- a/interface/web/dns/dns_template_edit.php
+++ b/interface/web/dns/dns_template_edit.php
@@ -1,58 +1,60 @@
-<?php
-/*
-Copyright (c) 2007, Till Brehm, projektfarm Gmbh
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * Neither the name of ISPConfig nor the names of its contributors
-      may be used to endorse or promote products derived from this software without
-      specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-
-/******************************************
-* Begin Form configuration
-******************************************/
-
-$tform_def_file = "form/dns_template.tform.php";
-
-/******************************************
-* End Form configuration
-******************************************/
-
-require_once('../../lib/config.inc.php');
-require_once('../../lib/app.inc.php');
-
-//* Check permissions for module
-$app->auth->check_module_permissions('dns');
-
-// Loading classes
-$app->uses('tpl,tform,tform_actions');
-$app->load('tform_actions');
-
-class page_action extends tform_actions {
-	
-}
-
-$page = new page_action;
-$page->onLoad();
-
+<?php
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$tform_def_file = "form/dns_template.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('dns');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access denied for non admin users.');
+
+class page_action extends tform_actions {
+	
+}
+
+$page = new page_action;
+$page->onLoad();
+
 ?>
\ No newline at end of file
diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php
index e01c207..1b083dc 100644
--- a/interface/web/dns/dns_wizard.php
+++ b/interface/web/dns/dns_wizard.php
@@ -93,8 +93,29 @@
 	}
 
 	$app->tpl->setVar("client_group_id",$client_select);
-	
 }
+
+if ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+	
+	// Get the limits of the client
+	$client_group_id = $_SESSION["s"]["user"]["default_group"];
+	$client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+	
+	// load the list of clients
+	$sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
+	$clients = $app->db->queryAllRecords($sql);
+	$client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
+	if(is_array($clients)) {
+		foreach( $clients as $client) {
+			$selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
+			$client_select .= "<option value='$client[groupid]' $selected>$client[name]</option>\r\n";
+		}
+	}
+
+	$app->tpl->setVar("client_group_id",$client_select);
+}
+
 
 $template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = '$template_id'");
 $fields = explode(',',$template_record['fields']);
@@ -116,6 +137,18 @@
 	if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'<br />';
 	if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'<br />';
 	
+	$tform_def_file = "form/dns_soa.tform.php";
+	$app->uses('tform');
+	$app->tform->loadFormDef($tform_def_file);
+	
+	
+	if(!$app->tform->checkClientLimit('limit_dns_zone')) {
+		$error .= $app->tform->wordbook["limit_dns_zone_txt"];
+	}
+	if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
+		$error .= $app->tform->wordbook["limit_dns_zone_txt"];
+	}
+	
 	
 	// replace template placeholders
 	$tpl_content = $template_record['template'];
diff --git a/interface/web/dns/lib/lang/bg_dns_a.lng b/interface/web/dns/lib/lang/bg_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/bg_dns_a.lng
+++ b/interface/web/dns/lib/lang/bg_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'The hostname has the wrong format.';
 $wb['data_error_empty'] = 'IP-Address empty';
 $wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/bg_dns_wizard.lng b/interface/web/dns/lib/lang/bg_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/bg_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/bg_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/br.lng b/interface/web/dns/lib/lang/br.lng
new file mode 100644
index 0000000..e166b4d
--- /dev/null
+++ b/interface/web/dns/lib/lang/br.lng
@@ -0,0 +1,19 @@
+<?php
+
+$wb['DNS'] = 'DNS';
+$wb['Zones'] = 'Zonas';
+$wb['DNS A'] = 'DNS A';
+$wb['DNS ALIAS'] = 'ALIAS DNS';
+$wb['DNS CNAME'] = 'CNAME DNS';
+$wb['DNS hinfo'] = 'hinfo DNS';
+$wb['DNS mx'] = 'mx DNS';
+$wb['DNS ns'] = 'ns DNS';
+$wb['DNS ptr'] = 'ptr DNS';
+$wb['DNS RP'] = 'RP DNS';
+$wb['DNS Zone'] = 'Zona DNS';
+$wb['Records'] = 'Registros';
+$wb['DNS SRV'] = 'SRV DNS';
+$wb['DNS TXT Record'] = 'Registro TXT DNS';
+$wb['DNS TXT'] = 'TXT DNS';
+
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_a.lng b/interface/web/dns/lib/lang/br_dns_a.lng
new file mode 100644
index 0000000..68af3ba
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_a.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Endereço-IP';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_a_list.lng b/interface/web/dns/lib/lang/br_dns_a_list.lng
new file mode 100644
index 0000000..760c4a5
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_a_list.lng
@@ -0,0 +1,14 @@
+<?php
+$wb["list_head_txt"] = 'Registro (A)';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Nome';
+$wb["data_txt"] = 'Data';
+$wb["aux_txt"] = 'Prioridade';
+$wb["type_txt"] = 'Tipo';
+$wb["add_new_record_txt"] = 'Adcionar um novo registro DNS (A)';
+$wb["page_txt"] = 'Página';
+$wb["page_of_txt"] = 'de';
+$wb['delete_confirmation'] = 'Tem certeza que deseja remover este registro?';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/br_dns_alias.lng b/interface/web/dns/lib/lang/br_dns_alias.lng
new file mode 100644
index 0000000..6e9e78b
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_alias.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Alvo';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de registros DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname está em branco.';
+$wb["name_error_regex"] = 'O hostname está em um formato inválido.';
+$wb["data_error_empty"] = 'Hostname de destino está em branco';
+$wb["data_error_regex"] = 'O hostname de destino está em um formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_cname.lng b/interface/web/dns/lib/lang/br_dns_cname.lng
new file mode 100644
index 0000000..1bb0074
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_cname.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname de Destino';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de registros DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname está em branco.';
+$wb["name_error_regex"] = 'O hostname está em um formato inválido.';
+$wb["data_error_empty"] = 'Hostname de destino está em branco';
+$wb["data_error_regex"] = 'O hostname de destino está em um formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_hinfo.lng b/interface/web/dns/lib/lang/br_dns_hinfo.lng
new file mode 100644
index 0000000..1e08214
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_hinfo.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Informações do Host';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_mx.lng b/interface/web/dns/lib/lang/br_dns_mx.lng
new file mode 100644
index 0000000..7f2cb4e
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_mx.lng
@@ -0,0 +1,16 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname do servidor de correio';
+$wb["aux_txt"] = 'Prioridade';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Hostname do servidor de correio em branco';
+$wb["data_error_regex"] = 'Hostname do servidor de correio formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_ns.lng b/interface/web/dns/lib/lang/br_dns_ns.lng
new file mode 100644
index 0000000..3632e47
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_ns.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Zona';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Servidor de Nomes';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'A zona está em branco.';
+$wb["name_error_regex"] = 'A zona está com formato inválido.';
+$wb["data_error_empty"] = 'Servidor de nomes em branco';
+$wb["data_error_regex"] = 'Servidor de nomes com formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_ptr.lng b/interface/web/dns/lib/lang/br_dns_ptr.lng
new file mode 100644
index 0000000..7311624
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_ptr.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Nnome';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Canônico';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_rp.lng b/interface/web/dns/lib/lang/br_dns_rp.lng
new file mode 100644
index 0000000..b20aa21
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_rp.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Pessoa Responsável';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'O Hostname está em branco.';
+$wb["name_error_regex"] = 'O Hostname está com formato inválido.';
+$wb["data_error_empty"] = 'Pessoa responsável em branco';
+$wb["data_error_regex"] = 'Pessoa responsável formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_soa.lng b/interface/web/dns/lib/lang/br_dns_soa.lng
new file mode 100644
index 0000000..673cf4c
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_soa.lng
@@ -0,0 +1,24 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["origin_txt"] = 'Zona (SOA)';
+$wb["ns_txt"] = 'NS';
+$wb["mbox_txt"] = 'Correio';
+$wb["serial_txt"] = 'Serial';
+$wb["refresh_txt"] = 'Refresh';
+$wb["retry_txt"] = 'Retry';
+$wb["expire_txt"] = 'Expire';
+$wb["minimum_txt"] = 'Minimum';
+$wb["ttl_txt"] = 'TTL';
+$wb["xfer_txt"] = 'Permitir transferências de zona para <br />estes IPs (lista separada por ponto e vírgula)';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_zone_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["client_txt"] = 'Cliente';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["server_id_error_empty"] = 'Servidor não selecionado';
+$wb["origin_error_empty"] = 'Zona vazia.';
+$wb["origin_error_unique"] = 'Este registro já existe nesta zona.';
+$wb["origin_error_regex"] = 'Formato de zona inválido.';
+$wb["ns_error_regex"] = 'NS tem um formato inválido.';
+$wb["mbox_error_empty"] = 'Correio está em branco.';
+$wb["mbox_error_regex"] = 'Correio com formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_soa_list.lng b/interface/web/dns/lib/lang/br_dns_soa_list.lng
new file mode 100644
index 0000000..94577f3
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_soa_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Zonas DNS';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["origin_txt"] = 'Zona';
+$wb["ns_txt"] = 'NS';
+$wb["mbox_txt"] = 'Correio';
+$wb["add_new_record_txt"] = 'Adcionar uma nova zona dns (SOA)';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_srv.lng b/interface/web/dns/lib/lang/br_dns_srv.lng
new file mode 100644
index 0000000..06610c8
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_srv.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Registro do Servidor';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'O Hostname está em branco.';
+$wb["name_error_regex"] = 'O Hostname está com formato inválido.';
+$wb["data_error_empty"] = 'Registro do Servidor em branco';
+$wb["data_error_regex"] = 'Registro do Servidor com formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_template.lng b/interface/web/dns/lib/lang/br_dns_template.lng
new file mode 100644
index 0000000..92c62d3
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_template.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["name_txt"] = 'Nome';
+$wb["fields_txt"] = 'Campos';
+$wb["template_txt"] = 'Gabarito';
+$wb["visible_txt"] = 'Visível';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_template_list.lng b/interface/web/dns/lib/lang/br_dns_template_list.lng
new file mode 100644
index 0000000..8fefc2e
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_template_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Assistente de Gabaritos DNS';
+$wb["visible_txt"] = 'Visível';
+$wb["name_txt"] = 'Nome';
+$wb["add_new_record_txt"] = 'Adcionar novo registro';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_txt.lng b/interface/web/dns/lib/lang/br_dns_txt.lng
new file mode 100644
index 0000000..5fda9f2
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_txt.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Text';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_wizard.lng b/interface/web/dns/lib/lang/br_dns_wizard.lng
new file mode 100644
index 0000000..5d33da9
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_wizard.lng
@@ -0,0 +1,16 @@
+<?php
+
+$wb['template_id_txt'] = 'Gabarito';
+$wb['server_id_txt'] = 'Servidor';
+$wb['client_txt'] = 'Cliente';
+$wb["btn_save_txt"] = 'Criar Registro DNS';
+$wb["btn_cancel_txt"] = 'Cancelar';
+$wb['domain_txt'] = 'Domínio';
+$wb['email_txt'] = 'Correio';
+$wb['ns1_txt'] = 'NS 1';
+$wb['ns2_txt'] = 'NS 2';
+$wb['ip_txt'] = 'Endereço IP';
+
+$wb['error_origin_empty'] = 'Origem em branco.';
+
+?>
diff --git a/interface/web/dns/lib/lang/de_dns_a.lng b/interface/web/dns/lib/lang/de_dns_a.lng
index 8f2a6dd..1f1bd19 100644
--- a/interface/web/dns/lib/lang/de_dns_a.lng
+++ b/interface/web/dns/lib/lang/de_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.';
 $wb['data_error_empty'] = 'IP Adresse ist leer';
 $wb['data_error_regex'] = 'Format der IP Adresse ist ungültig';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/de_dns_wizard.lng b/interface/web/dns/lib/lang/de_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/de_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/de_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng
index 477f9e4..599de5c 100644
--- a/interface/web/dns/lib/lang/en_dns_a.lng
+++ b/interface/web/dns/lib/lang/en_dns_a.lng
@@ -12,4 +12,5 @@
 $wb["name_error_regex"] = 'The hostname has the wrong format.';
 $wb["data_error_empty"] = 'IP-Address empty';
 $wb["data_error_regex"] = 'IP-Address format invalid';
+$wb["data_error_duplicate"] = 'Duplicate A-Record';
 ?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/es_dns_a.lng b/interface/web/dns/lib/lang/es_dns_a.lng
index 7f923e7..dc33df0 100644
--- a/interface/web/dns/lib/lang/es_dns_a.lng
+++ b/interface/web/dns/lib/lang/es_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'El formato del nombre de máquina es incorrecto.';
 $wb['data_error_empty'] = 'Dirección IP vacía';
 $wb['data_error_regex'] = 'El formato de la dirección IP es inválido.';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/es_dns_aaaa.lng b/interface/web/dns/lib/lang/es_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/es_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/es_dns_wizard.lng b/interface/web/dns/lib/lang/es_dns_wizard.lng
index 94852f3..d19c6e3 100644
--- a/interface/web/dns/lib/lang/es_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/es_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'Dirección IP';
 $wb['error_origin_empty'] = 'Origen vacío.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/fi_dns_a.lng b/interface/web/dns/lib/lang/fi_dns_a.lng
index 0248631..184150a 100755
--- a/interface/web/dns/lib/lang/fi_dns_a.lng
+++ b/interface/web/dns/lib/lang/fi_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.';
 $wb['data_error_empty'] = 'IP-osoite tyhjä';
 $wb['data_error_regex'] = 'IP-osoite on vääränlainen';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/fi_dns_aaaa.lng b/interface/web/dns/lib/lang/fi_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/fi_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/fi_dns_wizard.lng b/interface/web/dns/lib/lang/fi_dns_wizard.lng
index 966447f..40b6458 100755
--- a/interface/web/dns/lib/lang/fi_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/fi_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = '2. nimipalvelin';
 $wb['ip_txt'] = 'IP-osoite';
 $wb['error_origin_empty'] = 'Verkkotunnusta ei ole annettu.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/fr_dns_a.lng b/interface/web/dns/lib/lang/fr_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/fr_dns_a.lng
+++ b/interface/web/dns/lib/lang/fr_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'The hostname has the wrong format.';
 $wb['data_error_empty'] = 'IP-Address empty';
 $wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/fr_dns_wizard.lng b/interface/web/dns/lib/lang/fr_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/fr_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/fr_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/it_dns_a.lng
+++ b/interface/web/dns/lib/lang/it_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'The hostname has the wrong format.';
 $wb['data_error_empty'] = 'IP-Address empty';
 $wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/it_dns_wizard.lng b/interface/web/dns/lib/lang/it_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/it_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/it_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/nl_dns_a.lng b/interface/web/dns/lib/lang/nl_dns_a.lng
index 3f84271..cb9ea8f 100644
--- a/interface/web/dns/lib/lang/nl_dns_a.lng
+++ b/interface/web/dns/lib/lang/nl_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'De hostname has the wrong format.';
 $wb['data_error_empty'] = 'IP-Adres is leeg.';
 $wb['data_error_regex'] = 'IP-Adres formaat ongeldig.';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/nl_dns_wizard.lng b/interface/web/dns/lib/lang/nl_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/nl_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/nl_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/ru_dns_a.lng b/interface/web/dns/lib/lang/ru_dns_a.lng
index 80d9c87..b6f3bc1 100644
--- a/interface/web/dns/lib/lang/ru_dns_a.lng
+++ b/interface/web/dns/lib/lang/ru_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.';
 $wb['data_error_empty'] = 'IP-адрес пустой';
 $wb['data_error_regex'] = 'Формат IP-адреса неправилен';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/ru_dns_wizard.lng b/interface/web/dns/lib/lang/ru_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/ru_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/ru_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/se_dns_a.lng
+++ b/interface/web/dns/lib/lang/se_dns_a.lng
@@ -12,4 +12,5 @@
 $wb['name_error_regex'] = 'The hostname has the wrong format.';
 $wb['data_error_empty'] = 'IP-Address empty';
 $wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
 ?>
diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/se_dns_wizard.lng b/interface/web/dns/lib/lang/se_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/se_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/se_dns_wizard.lng
@@ -10,4 +10,16 @@
 $wb['ns2_txt'] = 'NS 2';
 $wb['ip_txt'] = 'IP Address';
 $wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
 ?>
diff --git a/interface/web/dns/lib/module.conf.php b/interface/web/dns/lib/module.conf.php
index d233ba2..0d33ad8 100644
--- a/interface/web/dns/lib/module.conf.php
+++ b/interface/web/dns/lib/module.conf.php
@@ -6,6 +6,26 @@
 $module["startpage"] 	= "dns/dns_soa_list.php";
 $module["tab_width"]    = '';
 
+
+$items[] = array( 'title' 	=> "Add DNS Zone",
+				  'target' 	=> 'content',
+				  'link'	=> 'dns/dns_wizard.php');
+
+if($_SESSION["s"]["user"]["typ"] == 'admin') {
+				  
+	$items[] = array( 	'title' 	=> "Templates",
+				  		'target' 	=> 'content',
+				  		'link'		=> 'dns/dns_template_list.php');
+}
+
+
+$module["nav"][] = array(	'title'	=> 'DNS Wizard',
+							'open' 	=> 1,
+							'items'	=> $items);
+
+							
+unset($items);
+
 /*
 	Email accounts menu
 */
@@ -26,25 +46,6 @@
 							'items'	=> $items);
 
 unset($items);
-
-
-$items[] = array( 'title' 	=> "Add DNS Zone",
-				  'target' 	=> 'content',
-				  'link'	=> 'dns/dns_wizard.php');
-
-
-$items[] = array( 'title' 	=> "Templates",
-				  'target' 	=> 'content',
-				  'link'	=> 'dns/dns_template_list.php');
-
-
-
-$module["nav"][] = array(	'title'	=> 'DNS Wizard',
-							'open' 	=> 1,
-							'items'	=> $items);
-
-
-
 
 
 
diff --git a/interface/web/dns/list/dns_soa.list.php b/interface/web/dns/list/dns_soa.list.php
index 2fbea3c..c235fe7 100644
--- a/interface/web/dns/list/dns_soa.list.php
+++ b/interface/web/dns/list/dns_soa.list.php
@@ -64,10 +64,9 @@
 							'op'		=> "like",
 							'prefix'	=> "%",
 							'suffix'	=> "%",
-							'datasource'	=> array ( 	'type'	=> 'SQL',
-														'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name',
-														'keyfield'=> 'server_id',
-														'valuefield'=> 'server_name'
+							'datasource'	=> array ( 	'type'	=> 'CUSTOM',
+														'class'=> 'custom_datasource',
+														'function'=> 'dns_servers'
 									 				  ),
 							'width'		=> "",
 							'value'		=> "");
diff --git a/interface/web/dns/templates/dns_a_edit.htm b/interface/web/dns/templates/dns_a_edit.htm
index 395abcd..6a5577c 100644
--- a/interface/web/dns/templates/dns_a_edit.htm
+++ b/interface/web/dns/templates/dns_a_edit.htm
@@ -1,39 +1,39 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_a">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-				<p class="formHint">{tmpl_var name='name_hint_txt'}</p>
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput formLengthIPv4" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_a_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_a">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+				<p class="formHint">{tmpl_var name='name_hint_txt'}</p>
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput formLengthIPv4" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_a_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm
index b58557e..10bfb09 100644
--- a/interface/web/dns/templates/dns_aaaa_edit.htm
+++ b/interface/web/dns/templates/dns_aaaa_edit.htm
@@ -32,7 +32,7 @@
 
     <div class="buttonHolder buttons">
       <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_aaaa_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
     </div>
   </div>
   
diff --git a/interface/web/dns/templates/dns_alias_edit.htm b/interface/web/dns/templates/dns_alias_edit.htm
index 50a3335..dceb8cb 100644
--- a/interface/web/dns/templates/dns_alias_edit.htm
+++ b/interface/web/dns/templates/dns_alias_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_alias">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_alias_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_alias">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_alias_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_cname_edit.htm b/interface/web/dns/templates/dns_cname_edit.htm
index dd799af..9a63021 100644
--- a/interface/web/dns/templates/dns_cname_edit.htm
+++ b/interface/web/dns/templates/dns_cname_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_cname">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_cname_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_cname">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_cname_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_hinfo_edit.htm b/interface/web/dns/templates/dns_hinfo_edit.htm
index 976d3cf..e5a34f0 100644
--- a/interface/web/dns/templates/dns_hinfo_edit.htm
+++ b/interface/web/dns/templates/dns_hinfo_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_hinfo">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_hinfo_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_hinfo">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_hinfo_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_mx_edit.htm b/interface/web/dns/templates/dns_mx_edit.htm
index 3e16f7f..f212489 100644
--- a/interface/web/dns/templates/dns_mx_edit.htm
+++ b/interface/web/dns/templates/dns_mx_edit.htm
@@ -1,42 +1,42 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_mx">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="aux">{tmpl_var name='aux_txt'}</label>
-        <input name="aux" id="aux" value="{tmpl_var name='aux'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_mx_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_mx">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="aux">{tmpl_var name='aux_txt'}</label>
+        <input name="aux" id="aux" value="{tmpl_var name='aux'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_mx_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_ns_edit.htm b/interface/web/dns/templates/dns_ns_edit.htm
index 1d9d0e7..6498311 100644
--- a/interface/web/dns/templates/dns_ns_edit.htm
+++ b/interface/web/dns/templates/dns_ns_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_ns">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ns_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_ns">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ns_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_ptr_edit.htm b/interface/web/dns/templates/dns_ptr_edit.htm
index 45f3516..eaaaa23 100644
--- a/interface/web/dns/templates/dns_ptr_edit.htm
+++ b/interface/web/dns/templates/dns_ptr_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_ptr">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ptr_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_ptr">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ptr_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_rp_edit.htm b/interface/web/dns/templates/dns_rp_edit.htm
index 20adddc..59c47ee 100644
--- a/interface/web/dns/templates/dns_rp_edit.htm
+++ b/interface/web/dns/templates/dns_rp_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_rp">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_rp_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_rp">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_rp_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_srv_edit.htm b/interface/web/dns/templates/dns_srv_edit.htm
index 154f52d..f76ab18 100644
--- a/interface/web/dns/templates/dns_srv_edit.htm
+++ b/interface/web/dns/templates/dns_srv_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_srv">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_srv_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_srv">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_srv_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_txt_edit.htm b/interface/web/dns/templates/dns_txt_edit.htm
index 4dfb321..00294c8 100644
--- a/interface/web/dns/templates/dns_txt_edit.htm
+++ b/interface/web/dns/templates/dns_txt_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_txt">
-
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels">
-      <div class="ctrlHolder">
-      	<label for="name">{tmpl_var name='name_txt'}</label>
-        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="data">{tmpl_var name='data_txt'}</label>
-        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
-        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
-			</div>
-      <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='active_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='active'}
-					</div>
-			</div>
-    </fieldset>
-
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
-    <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_txt_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
-    </div>
-  </div>
-  
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_txt">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="name">{tmpl_var name='name_txt'}</label>
+        <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="data">{tmpl_var name='data_txt'}</label>
+        <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+      	<label for="ttl">{tmpl_var name='ttl_txt'}</label>
+        <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+    <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_txt_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm
index 4f926ba..971e521 100644
--- a/interface/web/dns/templates/dns_wizard.htm
+++ b/interface/web/dns/templates/dns_wizard.htm
@@ -29,6 +29,14 @@
 				</select>
       </div>
       </tmpl_if>
+	  <tmpl_if name="is_reseller">
+	  <div class="ctrlHolder">
+      	<label for="client_group_id">{tmpl_var name='client_txt'}</label>
+        <select name="client_group_id" id="client_group_id" class="selectInput">
+					{tmpl_var name='client_group_id'}
+				</select>
+      </div>
+	  </tmpl_if>
 		  <tmpl_if name="DOMAIN_VISIBLE">
 	      <div class="ctrlHolder">
 	      	<label for="domain">{tmpl_var name='domain_txt'}</label>
diff --git a/interface/web/help/lib/lang/br.lng b/interface/web/help/lib/lang/br.lng
new file mode 100644
index 0000000..0fc39c4
--- /dev/null
+++ b/interface/web/help/lib/lang/br.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['Support Message'] = 'Mensagem de Suporte';
+$wb['Message'] = 'Mensagem';
+$wb['Send message'] = 'Enviar Mensagem';
+$wb['View messages'] = 'Ver Mensagem';
+$wb['Support'] = 'Suporte';
+?>
+
diff --git a/interface/web/help/lib/lang/br_support_message.lng b/interface/web/help/lib/lang/br_support_message.lng
new file mode 100644
index 0000000..ce48ca9
--- /dev/null
+++ b/interface/web/help/lib/lang/br_support_message.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['recipient_id_txt'] = 'Para';
+$wb['sender_id_txt'] = 'De';
+$wb['subject_txt'] = 'Assunto';
+$wb['message_txt'] = 'Mensagem';
+$wb['tstamp_txt'] = 'Data';
+?>
+
diff --git a/interface/web/help/lib/lang/br_support_message_list.lng b/interface/web/help/lib/lang/br_support_message_list.lng
new file mode 100644
index 0000000..ffd7d85
--- /dev/null
+++ b/interface/web/help/lib/lang/br_support_message_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Mensagens de Suporte';
+$wb['sender_id_txt'] = 'De';
+$wb['subject_txt'] = 'Assunto';
+$wb['add_new_record_txt'] = 'Crie uma nova mensagem de suporte';
+?>
+
diff --git a/interface/web/login/lib/lang/br.lng b/interface/web/login/lib/lang/br.lng
new file mode 100644
index 0000000..01d32b2
--- /dev/null
+++ b/interface/web/login/lib/lang/br.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['1001'] = 'Nome de usuário ou senha em branco.';
+$wb['1002'] = 'Nome de usuário ou senha inválido.';
+$wb['1003'] = 'O usuário está bloqueado!';
+$wb['1004'] = 'Várias tentativas sem sucesso de login. Por favor tente novamente daqui a 15 minutos.';
+$wb['pass_reset_txt'] = 'Uma nova senha foi gerada e será enviada para você via correio eletrônico cadastrado no sistema.';
+$wb['pw_reset'] = 'Senha restabelecida! Será enviada para você via correio eletrônico cadastrado no sistema.';
+$wb['pw_error'] = 'Nome de usuário ou correio eletrônico não coincidem.';
+$wb['pw_error_noinput'] = 'Favor informar nome de usuário e endereço de correio válidos.';
+$wb['pw_reset_mail_msg'] = 'Sua senha do painel de controle foi restabelecida. A sua nova senha é: ';
+$wb['pw_reset_mail_title'] = 'Sua senha do painel de controle foi restabelecida.';
+$wb['user_regex_error'] = 'O nome de usuário contém mais de 64 caracteres ou contém caracteres inválidos.';
+$wb['pw_error_length'] = 'Tamanho da senha não pode ser maior do que 64 caracteres.';
+?>
+
diff --git a/interface/web/mail/lib/lang/bg_mail_alias.lng b/interface/web/mail/lib/lang/bg_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/bg_mail_alias.lng
+++ b/interface/web/mail/lib/lang/bg_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
 $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/bg_mail_forward.lng b/interface/web/mail/lib/lang/bg_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/bg_mail_forward.lng
+++ b/interface/web/mail/lib/lang/bg_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Destination Email';
 $wb['active_txt'] = 'Active';
 $wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/bg_mail_user.lng
+++ b/interface/web/mail/lib/lang/bg_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng b/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Add new Filter';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/br.lng b/interface/web/mail/lib/lang/br.lng
new file mode 100644
index 0000000..899ef0f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br.lng
@@ -0,0 +1,49 @@
+<?php
+$wb['Email Alias'] = 'Aliases de Correio';
+$wb['Email Blacklist'] = 'Lista Negra de Correio';
+$wb['Blacklist'] = 'Lista Negra';
+$wb['Mail Content Filter'] = 'Filtro de Conteúdo de Correio';
+$wb['Filter'] = 'Filtro';
+$wb['Mail Domain'] = 'Domínio de Correio';
+$wb['Domain'] = 'Domínio';
+$wb['Email Catchall'] = 'Correio Catchall';
+$wb['Email Forward'] = 'Encaminhamento de Correio';
+$wb['Get Email'] = 'Get Email';
+$wb['Spamfilter'] = 'Filtro de Spam';
+$wb['Email Routing'] = 'Rota de Correio';
+$wb['Email transport'] = 'Transporte de Correio';
+$wb['Mailbox'] = 'Caixa de Correio';
+$wb['Autoresponder'] = 'Autoresponder';
+$wb['Mail Filter'] = 'Filtro de Correio';
+$wb['Custom Rules'] = 'Regras Personalizadas';
+$wb['Email filter'] = 'Filtro de Correio';
+$wb['Email Whitelist'] = 'Lista Branca de Correio';
+$wb['Whitelist'] = 'Lista Branca';
+$wb['Spamfilter blacklist'] = 'Filtro Spam (Lista Negra)';
+$wb['Blacklist'] = 'Lista Negra';
+$wb['Spamfilter Config'] = 'Configuração do Filtro Spam';
+$wb['Server'] = 'Servidor';
+$wb['Spamfilter policy'] = 'Políticas de Filtro Spam';
+$wb['Policy'] = 'Política';
+$wb['Quarantine'] = 'Quarentena';
+$wb['Tag-Level'] = 'Tag-Level';
+$wb['Other'] = 'Outros';
+$wb['Spamfilter users'] = 'Usuários de Filtro Spam';
+$wb['Users'] = 'Usuários';
+$wb['Spamfilter Whitelist'] = 'Filtro Spam Lista Branca';
+$wb['Whitelist'] = 'Lista Branca';
+$wb['Email'] = 'Correio';
+$wb['Email Mailbox'] = 'Caixa de Correio';
+$wb['Email Accounts'] = 'Contas de Correio';
+$wb['User / Domain'] = 'Usuário / Domínio';
+$wb['Server Settings'] = 'Configurações do Servidor';
+$wb['Spamfilter'] = 'Filtro Spam';
+$wb['Fetchmail'] = 'Fetchmail';
+$wb['Mailbox traffic'] = 'Tráfego de Correio';
+$wb['Statistics'] = 'Estatísticas';
+$wb['Postfix Whitelist'] = 'Postfix (Lista Branca)';
+$wb['Postfix Blacklist'] = 'Postfix (Lista Negra)';
+$wb['Content Filter'] = 'Filtros de Conteúdo';
+$wb['Global Filters'] = 'Filtros Globais';
+
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_alias.lng b/interface/web/mail/lib/lang/br_mail_alias.lng
new file mode 100644
index 0000000..e8e38a7
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_alias.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["email_txt"] = 'Correio';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["email_error_isemail"] = 'Endereço de correio inválido.';
+$wb["email_error_unique"] = 'Endereço de correio duplicado.';
+$wb["no_domain_perm"] = "Você não tem permissão para este domínio.";
+$wb["destination_error_isemail"] = 'Endereço de destino inválido';
+$wb["limit_mailalias_txt"] = 'O número máximo de aliases para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_alias_list.lng b/interface/web/mail/lib/lang/br_mail_alias_list.lng
new file mode 100644
index 0000000..f4a916f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_alias_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Email Alias';
+$wb["active_txt"] = 'Active';
+$wb["source_txt"] = 'source';
+$wb["destination_txt"] = 'Destination';
+$wb["email_txt"] = 'Email';
+$wb["add_new_record_txt"] = 'Add new Email alias';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_blacklist.lng b/interface/web/mail/lib/lang/br_mail_blacklist.lng
new file mode 100644
index 0000000..465fc02
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_blacklist.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereço Lista Negra';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["active_txt"] = 'Ativo';
+$wb["source_error_notempty"] = 'Endereço em branco.';
+$wb["type_txt"] = 'Tipo';
+$wb["limit_mailfilter_txt"] = 'O número máximo de filtros de correio para sua conta foi atingido..';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_blacklist_list.lng b/interface/web/mail/lib/lang/br_mail_blacklist_list.lng
new file mode 100644
index 0000000..d31ef50
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_blacklist_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Correio Lista Negra';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Correio na lista negra';
+$wb["type_txt"] = 'Tipo';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["add_new_record_txt"] = 'Adcionar novo registro a lista';
+$wb["access_txt"] = 'acesso';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_content_filter.lng b/interface/web/mail/lib/lang/br_mail_content_filter.lng
new file mode 100644
index 0000000..d3ae62b
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_content_filter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Filtro';
+$wb["pattern_txt"] = 'Padrão de Expressão Regular.';
+$wb["data_txt"] = 'Data';
+$wb["action_txt"] = 'Ação';
+$wb["active_txt"] = 'Ativo';
+$wb["pattern_error_empty"] = 'Padrão em branco';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_content_filter_list.lng b/interface/web/mail/lib/lang/br_mail_content_filter_list.lng
new file mode 100644
index 0000000..0de79ec
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_content_filter_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Cabeçalhos Postfix e Body Checks';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["pattern_txt"] = 'Padrão';
+$wb["action_txt"] = 'Ação';
+$wb["add_new_record_txt"] = 'Adcionar um novo filtro de conteúdo';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain.lng b/interface/web/mail/lib/lang/br_mail_domain.lng
new file mode 100644
index 0000000..c8ee61f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain.lng
@@ -0,0 +1,14 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['domain_txt'] = 'Domínio';
+$wb['type_txt'] = 'Tipo';
+$wb['active_txt'] = 'Ativo';
+$wb['domain_error_empty'] = 'Domínio em branco.';
+$wb['domain_error_unique'] = 'Domínio duplicado';
+$wb['domain_error_regex'] = 'Nome de domínio inválido';
+$wb['client_txt'] = 'Cliente';
+$wb['limit_maildomain_txt'] = 'O número máximo de contas de correio eletrônico para este domínio foi atingido.';
+$wb['policy_txt'] = 'Filtro Anti-Spam';
+$wb['no_policy'] = '- desativado -';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_domain_catchall.lng b/interface/web/mail/lib/lang/br_mail_domain_catchall.lng
new file mode 100644
index 0000000..6311a0d
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_catchall.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["domain_txt"] = 'Domínio';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["domain_error_unique"] = "Já existe um registro de Catchall para este domínio.";
+$wb["no_domain_perm"] = "Você não tem permissão para este domínio.";
+$wb["domain_error_regex"] = 'O nome do domínio contém caracteres inválidos';
+$wb["limit_mailcatchall_txt"] = 'O número máximo de catchall para este domínio foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng b/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng
new file mode 100644
index 0000000..40fd05c
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Catchall de Correio';
+$wb["active_txt"] = 'Ativo';
+$wb["source_txt"] = 'origem';
+$wb["destination_txt"] = 'Endereço de destino';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar novo Catchall';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain_list.lng b/interface/web/mail/lib/lang/br_mail_domain_list.lng
new file mode 100644
index 0000000..e08daf1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Domínio de Correio';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar novo domínio';
+$wb["active_txt"] = 'Ativo';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_forward.lng b/interface/web/mail/lib/lang/br_mail_forward.lng
new file mode 100644
index 0000000..6c40c1f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_forward.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["email_txt"] = 'Correio';
+$wb["destination_txt"] = 'Correio de Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_mailforward_txt"] = 'O número máximo de encaminhamentos para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_forward_list.lng b/interface/web/mail/lib/lang/br_mail_forward_list.lng
new file mode 100644
index 0000000..8bf63fe
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_forward_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Encaminhamento de Correio';
+$wb["active_txt"] = 'Ativo';
+$wb["source_txt"] = 'origem';
+$wb["destination_txt"] = 'Destino';
+$wb["email_txt"] = 'Correio';
+$wb["add_new_record_txt"] = 'Adcionar novo encaminhamento';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_get.lng b/interface/web/mail/lib/lang/br_mail_get.lng
new file mode 100644
index 0000000..cb2b0ca
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_get.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Tipo';
+$wb["source_server_txt"] = 'Servidor Pop3/Imap';
+$wb["source_username_txt"] = 'Usuário';
+$wb["source_password_txt"] = 'Senha';
+$wb["source_delete_txt"] = 'Remover mensagens da origem após o recebimento';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_fetchmail_txt"] = 'O número máximo de Fetchmail para sua conta foi atingido.';
+$wb["source_server_error_isempty"] = 'Servidor em branco.';
+$wb["source_username_error_isempty"] = 'Usuário em branco.';
+$wb["source_password_error_isempty"] = 'Senha em branco.';
+$wb["destination_error_isemail"] = 'Destino não selecionado.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_get_list.lng b/interface/web/mail/lib/lang/br_mail_get_list.lng
new file mode 100644
index 0000000..5634723
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_get_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Fetch de mensagens de um servidor POP3 / IMAP';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_server_txt"] = 'Servidor Externo';
+$wb["source_username_txt"] = 'Usuário';
+$wb["destination_txt"] = 'Destino';
+$wb["add_new_record_txt"] = 'Adcionar nova Conta';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_spamfilter.lng b/interface/web/mail/lib/lang/br_mail_spamfilter.lng
new file mode 100644
index 0000000..e4b6c81
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_spamfilter.lng
@@ -0,0 +1,17 @@
+<?php
+$wb["email_txt"] = 'Email';
+$wb["spam_rewrite_score_int_txt"] = 'Pontução de Rewrite';
+$wb["spam_redirect_score_int_txt"] = 'Pontuação de Redirecionamento';
+$wb["spam_delete_score_int_txt"] = 'Remover Pontuação';
+$wb["spam_rewrite_subject_txt"] = 'Re-escrever assunto';
+$wb["spam_redirect_maildir_txt"] = 'Redirecionar Caixa de Correio';
+$wb["active_txt"] = 'Active';
+$wb["spam_rewrite_txt"] = 'Re-escrever assunto da mensagem depois desta pontuação.';
+$wb["spam_redirect_txt"] = 'Redirecione esta mensagem depois desta pontuação para esta caixa postal';
+$wb["spam_delete_txt"] = 'Remover esta mensagem depois desta pontuação.';
+$wb["disable_txt"] = 'Dica: Para desativar uma opção de filtro, configure a pontuação como 0.00.';
+$wb["email_error_isemail"] = 'Endereço de correio inválido.';
+$wb["email_error_unique"] = 'Já existem registros de spamfilter para esta caixa de correio.';
+$wb["spam_redirect_maildir_purge_txt"] = 'Remover Maildir depois';
+$wb["days_txt"] = 'Dias.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng b/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng
new file mode 100644
index 0000000..00b8daf
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Filtro Anti-Spam';
+$wb['active_txt'] = 'Ativo';
+$wb['server_id_txt'] = 'Servidor';
+$wb['server_name_txt'] = 'nome_servidor';
+$wb['email_txt'] = 'Correio';
+$wb['add_new_record_txt'] = 'Adcionar novo filtro anti-spam';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_transport.lng b/interface/web/mail/lib/lang/br_mail_transport.lng
new file mode 100644
index 0000000..b4394c6
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_transport.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["destination_txt"] = 'Destino';
+$wb["type_txt"] = 'Tipo';
+$wb["mx_txt"] = 'Sem MX lookup';
+$wb["sort_order_txt"] = 'Ordenar por';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_mailrouting_txt"] = 'O número máximo de rotas para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_transport_list.lng b/interface/web/mail/lib/lang/br_mail_transport_list.lng
new file mode 100644
index 0000000..88acaee
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_transport_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Rota Avançada de Correio';
+$wb["active_txt"] = 'Ativa';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["transport_txt"] = 'Transporte';
+$wb["sort_order_txt"] = 'Ordenar por';
+$wb["add_new_record_txt"] = 'Adcionar um novo transporte';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng
new file mode 100644
index 0000000..1ba5162
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user.lng
@@ -0,0 +1,31 @@
+<?php
+$wb["custom_mailfilter_txt"] = 'Formula de filtro de correio';
+$wb["email_txt"] = 'Correio';
+$wb["cryptpwd_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Tamanho da Senha';
+$wb["active_txt"] = 'Ativo';
+$wb["email_error_isemail"] = 'Endereço de Correio Inválido.';
+$wb["email_error_unique"] = 'Endereço de Correio Duplicado.';
+$wb["autoresponder_text_txt"] = 'Texto';
+$wb["autoresponder_txt"] = 'Autoresponder';
+$wb["no_domain_perm"] = 'Sem permissão para este domínio.';
+$wb["error_no_pwd"] = 'Senha em branco.';
+$wb["quota_error_isint"] = 'O tamanho da caixa de correio deve ser um número.';
+$wb["quota_txt"] = 'Quota';
+$wb["server_id_txt"] = 'Aerver_id';
+$wb["password_txt"] = 'Senha';
+$wb["maildir_txt"] = 'Maildir';
+$wb["postfix_txt"] = 'Habilitar Recebimento';
+$wb["access_txt"] = 'Habilitar Acesso';
+$wb["policy_txt"] = 'Spamfilter';
+$wb["no_policy"] = '- desativado -';
+$wb["limit_mailbox_txt"] = 'O número máximo de caixas de correio para sua conta foi atingido.';
+$wb["limit_mailquota_txt"] = 'O espaço em disco disponível para criação de contas foi atingido.';
+$wb["welcome_mail_fromname_txt"] = 'ISPConfig3';
+$wb["welcome_mail_fromemail_txt"] = "webmaster@localhost.tld";
+$wb["welcome_mail_subject"] = 'Parabéns sua conta de correio foi criada.';
+$wb["welcome_mail_message"] = "Parabéns sua conta de correio foi criada. Att. Seu webmaster.";
+$wb["disableimap_txt"] = 'Desativar IMAP';
+$wb["disablepop3_txt"] = 'Disativar POP3';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_user_filter.lng b/interface/web/mail/lib/lang/br_mail_user_filter.lng
new file mode 100644
index 0000000..4ab4489
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_filter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["rulename_txt"] = 'Nome';
+$wb["action_txt"] = 'Ação';
+$wb["target_txt"] = 'Pasta';
+$wb["active_txt"] = 'Ativo';
+$wb["rulename_error_empty"] = 'Nome está em branco.';
+$wb["searchterm_is_empty"] = 'Termo de busca em branco.';
+$wb["source_txt"] = 'Origem';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_filter_list.lng b/interface/web/mail/lib/lang/br_mail_user_filter_list.lng
new file mode 100644
index 0000000..0d21666
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_filter_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["rulename_txt"] = 'Nome';
+$wb["add_new_record_txt"] = 'Adcionar novo filtro';
+$wb["page_txt"] = 'Página';
+$wb["page_of_txt"] = 'de';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_list.lng b/interface/web/mail/lib/lang/br_mail_user_list.lng
new file mode 100644
index 0000000..a8a495a
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Caixa de Correio';
+$wb["email_txt"] = 'Correio';
+$wb["autoresponder_txt"] = 'Autoresponder';
+$wb["add_new_record_txt"] = 'Adcionar nova caixa de correio';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_stats_list.lng b/interface/web/mail/lib/lang/br_mail_user_stats_list.lng
new file mode 100644
index 0000000..ba41259
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Tráfego de Correio';
+$wb["email_txt"] = 'Correio';
+$wb["this_month_txt"] = 'Este Mês';
+$wb["last_month_txt"] = 'Último Mês';
+$wb["this_year_txt"] = 'Este Ano';
+$wb["last_year_txt"] = 'Último Ano';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_whitelist.lng b/interface/web/mail/lib/lang/br_mail_whitelist.lng
new file mode 100644
index 0000000..12ffb66
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_whitelist.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereço Lista Branca';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["active_txt"] = 'Activo';
+$wb["source_error_notempty"] = 'Endereço em Branco.';
+$wb["type_txt"] = 'Tipo';
+$wb["limit_mailfilter_txt"] = 'O número máximo de filtros para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_whitelist_list.lng b/interface/web/mail/lib/lang/br_mail_whitelist_list.lng
new file mode 100644
index 0000000..fce3148
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_whitelist_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Correio Lista Branca';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereços na Lista Branca';
+$wb["type_txt"] = 'Tipo';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["add_new_record_txt"] = 'Adcionar um novo registro a lista';
+$wb["access_txt"] = 'acesso';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng
new file mode 100644
index 0000000..23ac482
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["wb_txt"] = 'wb';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Email';
+$wb["priority_txt"] = 'Prioridade';
+$wb["active_txt"] = 'Ativo';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng b/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng
new file mode 100644
index 0000000..8ff80e1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Spamfilter Lista Negra';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Correio na Lista Negra';
+$wb["add_new_record_txt"] = 'Adcionar novo registro a lista';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_config.lng b/interface/web/mail/lib/lang/br_spamfilter_config.lng
new file mode 100644
index 0000000..23ffae1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_config.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['getmail_config_dir_txt'] = 'Caminho de Configuração Getmail ';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['netmask_txt'] = 'Mascara de Rede';
+$wb['gateway_txt'] = 'Gateway';
+$wb['hostname_txt'] = 'Hostname';
+$wb['nameservers_txt'] = 'Servidor de Nomes';
+$wb['module_txt'] = 'Server Module';
+$wb['maildir_path_txt'] = 'Caminho do Maildir';
+$wb['homedir_path_txt'] = 'Caminho do Homedir';
+$wb['mailuser_uid_txt'] = 'Usuário de Correio UID';
+$wb['mailuser_gid_txt'] = 'Usuário de Correio GID';
+$wb['mailuser_name_txt'] = 'Nome do Usuário de Correio';
+$wb['mailuser_group_txt'] = 'Grupo do Usuário de Correio';
+$wb['relayhost_txt'] = 'Host Relay';
+$wb['relayhost_user_txt'] = 'Usuário Host Relay';
+$wb['relayhost_password_txt'] = 'Senha Host Relay';
+$wb['mailbox_size_limit_txt'] = 'Tamanho Caixa de Correio';
+$wb['message_size_limit_txt'] = 'Tamanho da Mensagem';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_spamfilter_config_list.lng b/interface/web/mail/lib/lang/br_spamfilter_config_list.lng
new file mode 100644
index 0000000..c23fcf9
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_config_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb["list_head_txt"] = 'Configurações do Servidor';
+$wb["server_name_txt"] = 'Servidor';
+$wb["server_id_txt"] = 'id_servidor';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_policy.lng b/interface/web/mail/lib/lang/br_spamfilter_policy.lng
new file mode 100644
index 0000000..bd809bd
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_policy.lng
@@ -0,0 +1,38 @@
+<?php
+$wb["policy_name_txt"] = 'Nome da Regra';
+$wb["virus_lover_txt"] = 'Virusl lover';
+$wb["spam_lover_txt"] = 'SPAM lover';
+$wb["banned_files_lover_txt"] = 'Banned files lover';
+$wb["bad_header_lover_txt"] = 'Bad header lover';
+$wb["bypass_virus_checks_txt"] = 'Bypass virus checks';
+$wb["bypass_banned_checks_txt"] = 'Bypass banned checks';
+$wb["bypass_header_checks_txt"] = 'Bypass header checks';
+$wb["virus_quarantine_to_txt"] = 'Forward virus to email';
+$wb["spam_quarantine_to_txt"] = 'Forward spam to email';
+$wb["banned_quarantine_to_txt"] = 'Forward banned to email';
+$wb["bad_header_quarantine_to_txt"] = 'Forward bad header to email';
+$wb["clean_quarantine_to_txt"] = 'Forward clean to email';
+$wb["other_quarantine_to_txt"] = 'Forward other to email';
+$wb["spam_tag_level_txt"] = 'SPAM tag level';
+$wb["spam_tag2_level_txt"] = 'SPAM tag2 level';
+$wb["spam_kill_level_txt"] = 'SPAM kill level';
+$wb["spam_dsn_cutoff_level_txt"] = 'SPAM dsn cutoff level';
+$wb["spam_quarantine_cutoff_level_txt"] = 'SPAM quarantine cutoff level';
+$wb["spam_modifies_subj_txt"] = 'SPAM modifies subject';
+$wb["spam_subject_tag_txt"] = 'SPAM subject tag';
+$wb["spam_subject_tag2_txt"] = 'SPAM subject tag2';
+$wb["addr_extension_virus_txt"] = 'Addr. extension virus';
+$wb["addr_extension_spam_txt"] = 'Addr. extension SPAM';
+$wb["addr_extension_banned_txt"] = 'Addr. extension banned';
+$wb["addr_extension_bad_header_txt"] = 'Addr extension bad header';
+$wb["warnvirusrecip_txt"] = 'Warn virus recip.';
+$wb["warnbannedrecip_txt"] = 'Warn banned recip.';
+$wb["warnbadhrecip_txt"] = 'Warn bad header recip.';
+$wb["newvirus_admin_txt"] = 'Newvirus admin';
+$wb["virus_admin_txt"] = 'Virus admin';
+$wb["banned_admin_txt"] = 'Banned admin';
+$wb["bad_header_admin_txt"] = 'Bad header admin';
+$wb["spam_admin_txt"] = 'SPAM admin';
+$wb["message_size_limit_txt"] = 'Message size limit';
+$wb["banned_rulenames_txt"] = 'Banned rulenames';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng b/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng
new file mode 100644
index 0000000..2bc05dc
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Políticas de Spam';
+$wb["policy_name_txt"] = 'Nome';
+$wb["virus_lover_txt"] = 'Virus lover';
+$wb["spam_lover_txt"] = 'Spam lover';
+$wb["banned_files_lover_txt"] = 'Banned Files lover';
+$wb["bad_header_lover_txt"] = 'Bad Header lover';
+$wb["add_new_record_txt"] = 'Adcionar Registro';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_users.lng b/interface/web/mail/lib/lang/br_spamfilter_users.lng
new file mode 100644
index 0000000..058c4f6
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_users.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["policy_id_txt"] = 'Política';
+$wb["email_txt"] = 'Correio (Padrão)';
+$wb["fullname_txt"] = 'Nome';
+$wb["local_txt"] = 'Local';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_users_list.lng b/interface/web/mail/lib/lang/br_spamfilter_users_list.lng
new file mode 100644
index 0000000..e17627e
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_users_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Filtro Anti-Spam Usuários';
+$wb["local_txt"] = 'Local';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["policy_id_txt"] = 'Políticas';
+$wb["fullname_txt"] = 'Nome';
+$wb["email_txt"] = 'Email';
+$wb["add_new_record_txt"] = 'Adcionar Usuário';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng
new file mode 100644
index 0000000..cbae9db
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["wb_txt"] = 'wb';
+$wb["rid_txt"] = 'User';
+$wb["email_txt"] = 'Email';
+$wb["priority_txt"] = 'Priority';
+$wb["active_txt"] = 'Active';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng b/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng
new file mode 100644
index 0000000..d751df9
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Spamfilter Lista Branca';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Correio na lista branca';
+$wb["add_new_record_txt"] = 'Adcionar um novo correio';
+?>
diff --git a/interface/web/mail/lib/lang/de_mail_alias.lng b/interface/web/mail/lib/lang/de_mail_alias.lng
index 8001e0a..66718ad 100644
--- a/interface/web/mail/lib/lang/de_mail_alias.lng
+++ b/interface/web/mail/lib/lang/de_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'Sie haben keine Berechtigung für diese Domain.';
 $wb['destination_error_isemail'] = 'Ziel Emailadresse ist ungültig.';
 $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/de_mail_forward.lng b/interface/web/mail/lib/lang/de_mail_forward.lng
index db52472..c376920 100644
--- a/interface/web/mail/lib/lang/de_mail_forward.lng
+++ b/interface/web/mail/lib/lang/de_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Ziel Emailadresse';
 $wb['active_txt'] = 'Aktiv';
 $wb['limit_mailforward_txt'] = 'Die max. Anzahl an Emailweiterleitungen für ihren Account wurde erreicht.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng
index bc288bf..63babff 100644
--- a/interface/web/mail/lib/lang/de_mail_user.lng
+++ b/interface/web/mail/lib/lang/de_mail_user.lng
@@ -27,4 +27,5 @@
 $wb['password_strength_txt'] = 'Passwortkomplexität';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@ihredomain.at';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/de_mail_user_filter_list.lng b/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
index 08191ae..7e0d53e 100644
--- a/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Neuen Filter hinzufügen';
 $wb['page_txt'] = 'Seite';
 $wb['page_of_txt'] = 'von';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
index e4034b8..c9441b8 100644
--- a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Emailadresse';
 $wb['priority_txt'] = 'Priorität';
 $wb['active_txt'] = 'Aktiv';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
index c0ffba7..7aec5c5 100644
--- a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priorität';
 $wb['active_txt'] = 'Aktiv';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/en_mail_alias.lng b/interface/web/mail/lib/lang/en_mail_alias.lng
index c912bca..d7c5e7a 100644
--- a/interface/web/mail/lib/lang/en_mail_alias.lng
+++ b/interface/web/mail/lib/lang/en_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb["no_domain_perm"] = "You have no permission for this domain.";
 $wb["destination_error_isemail"] = 'Destination Emailaddress is invalid.';
 $wb["limit_mailalias_txt"] = 'The max. number of email aliases for your account is reached.';
+$wb["duplicate_mailbox_txt"] = 'There is already a mailbox with this email address';
 ?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng
index ca1764d..dee6271 100644
--- a/interface/web/mail/lib/lang/en_mail_forward.lng
+++ b/interface/web/mail/lib/lang/en_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb["destination_txt"] = 'Destination Email';
 $wb["active_txt"] = 'Active';
 $wb["limit_mailforward_txt"] = 'The max. number of email forwarders for your account is reached.';
+$wb["duplicate_mailbox_txt"] = 'There is already a mailbox with this email address';
 ?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng
index c6db506..65ee78a 100644
--- a/interface/web/mail/lib/lang/en_mail_user.lng
+++ b/interface/web/mail/lib/lang/en_mail_user.lng
@@ -27,4 +27,5 @@
 $wb["welcome_mail_message"] = "Welcome to your new email account. Your webmaster.";
 $wb["disableimap_txt"] = 'Disable IMAP';
 $wb["disablepop3_txt"] = 'Disable POP3';
+$wb["duplicate_alias_or_forward_txt"] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/en_mail_user_filter_list.lng b/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
index cc6890d..97cc11a 100644
--- a/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb["add_new_record_txt"] = 'Add new Filter';
 $wb["page_txt"] = 'Page';
 $wb["page_of_txt"] = 'of';
+$wb["delete_confirmation"] = 'Do you really want to Delete the mailfilter?';
 ?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/es_mail_alias.lng b/interface/web/mail/lib/lang/es_mail_alias.lng
index 57666d5..fc151c8 100644
--- a/interface/web/mail/lib/lang/es_mail_alias.lng
+++ b/interface/web/mail/lib/lang/es_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'No tiene permiso para este dominio';
 $wb['destination_error_isemail'] = 'La dirección de correo de destino no es válida';
 $wb['limit_mailalias_txt'] = 'Ha alcanzado el número máximo de alias de correo para esta cuenta';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/es_mail_forward.lng b/interface/web/mail/lib/lang/es_mail_forward.lng
index 21cd623..a31cb19 100644
--- a/interface/web/mail/lib/lang/es_mail_forward.lng
+++ b/interface/web/mail/lib/lang/es_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Correo de destino';
 $wb['active_txt'] = 'Activar';
 $wb['limit_mailforward_txt'] = 'Se ha alcanzado el número máximo de reenvíos para esta cuenta';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/es_mail_user.lng
+++ b/interface/web/mail/lib/lang/es_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/es_mail_user_filter_list.lng b/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
index 1de7a21..b679b5b 100644
--- a/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Añadir nuevo filtro';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
index 437f441..efd5737 100644
--- a/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Correo';
 $wb['priority_txt'] = 'Prioridad';
 $wb['active_txt'] = 'Activar';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
index 437f441..efd5737 100644
--- a/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Correo';
 $wb['priority_txt'] = 'Prioridad';
 $wb['active_txt'] = 'Activar';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_mail_alias.lng b/interface/web/mail/lib/lang/fi_mail_alias.lng
index f3a6dad..02214e1 100755
--- a/interface/web/mail/lib/lang/fi_mail_alias.lng
+++ b/interface/web/mail/lib/lang/fi_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'Käyttäjätunnuksella ei ole oikeuksia tähän verkkotunnukseen.';
 $wb['destination_error_isemail'] = 'Kohteena oleva sähköpostiosoite on vääränlainen.';
 $wb['limit_mailalias_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä aliasosoitteita.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_mail_forward.lng b/interface/web/mail/lib/lang/fi_mail_forward.lng
index 5423874..fb69f1b 100755
--- a/interface/web/mail/lib/lang/fi_mail_forward.lng
+++ b/interface/web/mail/lib/lang/fi_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Vastaanottajan sähköposti';
 $wb['active_txt'] = 'Käytössä';
 $wb['limit_mailforward_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä edelleenlähetysosoitteita.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng
index e2fe0c3..ab511f6 100755
--- a/interface/web/mail/lib/lang/fi_mail_user.lng
+++ b/interface/web/mail/lib/lang/fi_mail_user.lng
@@ -27,4 +27,5 @@
 $wb['disableimap_txt'] = 'Estä IMAP';
 $wb['disablepop3_txt'] = 'Estä POP3';
 $wb['password_strength_txt'] = 'Salasanan vahvuus';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng b/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
index 41ce0ed..5468146 100755
--- a/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Lisää uusi suodatussääntö';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
index f44c20f..a72ccb0 100755
--- a/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Sähköpostiosoite';
 $wb['priority_txt'] = 'Tärkeysjärjestys';
 $wb['active_txt'] = 'Käytössä';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
index 78d2012..f691ba6 100755
--- a/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Sähköpostiosoite';
 $wb['priority_txt'] = 'Tärkeysjärjestys';
 $wb['active_txt'] = 'Käytössä';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_mail_alias.lng b/interface/web/mail/lib/lang/fr_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/fr_mail_alias.lng
+++ b/interface/web/mail/lib/lang/fr_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
 $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_mail_forward.lng b/interface/web/mail/lib/lang/fr_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/fr_mail_forward.lng
+++ b/interface/web/mail/lib/lang/fr_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Destination Email';
 $wb['active_txt'] = 'Active';
 $wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/fr_mail_user.lng
+++ b/interface/web/mail/lib/lang/fr_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng b/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Add new Filter';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/it_mail_alias.lng b/interface/web/mail/lib/lang/it_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/it_mail_alias.lng
+++ b/interface/web/mail/lib/lang/it_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'You have no permission for this domain.';
 $wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
 $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/it_mail_forward.lng b/interface/web/mail/lib/lang/it_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/it_mail_forward.lng
+++ b/interface/web/mail/lib/lang/it_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Destination Email';
 $wb['active_txt'] = 'Active';
 $wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/it_mail_user.lng
+++ b/interface/web/mail/lib/lang/it_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/it_mail_user_filter_list.lng b/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Add new Filter';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_mail_alias.lng b/interface/web/mail/lib/lang/nl_mail_alias.lng
index 4006c38..021749a 100644
--- a/interface/web/mail/lib/lang/nl_mail_alias.lng
+++ b/interface/web/mail/lib/lang/nl_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'U heeft geen toestemming voor dit domain.';
 $wb['destination_error_isemail'] = 'Emailadres geadresseerde is ongeldig.';
 $wb['limit_mailalias_txt'] = 'Het max. aantal emailaliassen voor uw account is bereikt.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_mail_forward.lng b/interface/web/mail/lib/lang/nl_mail_forward.lng
index 12d72f7..d12e664 100644
--- a/interface/web/mail/lib/lang/nl_mail_forward.lng
+++ b/interface/web/mail/lib/lang/nl_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Emailadres geadresseerde';
 $wb['active_txt'] = 'Actief';
 $wb['limit_mailforward_txt'] = 'Het max. aantal email forwarders voor uw account is bereikt.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng
index 08ef5a8..28182ef 100644
--- a/interface/web/mail/lib/lang/nl_mail_user.lng
+++ b/interface/web/mail/lib/lang/nl_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Uitschakelen POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng b/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
index 37f5138..c8318ee 100644
--- a/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Toevoegen Filter';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
index bcd3238..f7314fa 100644
--- a/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Prioriteit';
 $wb['active_txt'] = 'Actief';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
index bcd3238..f7314fa 100644
--- a/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Prioriteit';
 $wb['active_txt'] = 'Actief';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_mail_alias.lng b/interface/web/mail/lib/lang/ru_mail_alias.lng
index ddbe0d1..e7a451c 100644
--- a/interface/web/mail/lib/lang/ru_mail_alias.lng
+++ b/interface/web/mail/lib/lang/ru_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'Вы не имеете прав для этого домена.';
 $wb['destination_error_isemail'] = 'Email получателя неправилен.';
 $wb['limit_mailalias_txt'] = 'Максимальное число алиасов достигнуто.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_mail_forward.lng b/interface/web/mail/lib/lang/ru_mail_forward.lng
index 5973116..ea8340e 100644
--- a/interface/web/mail/lib/lang/ru_mail_forward.lng
+++ b/interface/web/mail/lib/lang/ru_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Получатель Email';
 $wb['active_txt'] = 'Активный';
 $wb['limit_mailforward_txt'] = 'Максимальное число forwarders достигнуто.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng
index 75e1f8d..a65096e 100644
--- a/interface/web/mail/lib/lang/ru_mail_user.lng
+++ b/interface/web/mail/lib/lang/ru_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng b/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
index 7c69b92..694dc3b 100644
--- a/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Добавить новый Фильтр';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
index e41656c..223e88e 100644
--- a/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Приоритет';
 $wb['active_txt'] = 'Активный';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
index e41656c..223e88e 100644
--- a/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Приоритет';
 $wb['active_txt'] = 'Активный';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/se_mail_alias.lng b/interface/web/mail/lib/lang/se_mail_alias.lng
index 29948b4..742a20a 100644
--- a/interface/web/mail/lib/lang/se_mail_alias.lng
+++ b/interface/web/mail/lib/lang/se_mail_alias.lng
@@ -7,4 +7,5 @@
 $wb['no_domain_perm'] = 'Du har ingen beh�righet f�r denna dom�nen.';
 $wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
 $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/se_mail_forward.lng b/interface/web/mail/lib/lang/se_mail_forward.lng
index 8d73688..be714f4 100644
--- a/interface/web/mail/lib/lang/se_mail_forward.lng
+++ b/interface/web/mail/lib/lang/se_mail_forward.lng
@@ -3,4 +3,5 @@
 $wb['destination_txt'] = 'Mottagande Epost';
 $wb['active_txt'] = 'Aktiv';
 $wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
 ?>
diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/se_mail_user.lng
+++ b/interface/web/mail/lib/lang/se_mail_user.lng
@@ -29,4 +29,5 @@
 $wb['disablepop3_txt'] = 'Disable POP3';
 $wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
 $wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
 ?>
diff --git a/interface/web/mail/lib/lang/se_mail_user_filter_list.lng b/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
 $wb['add_new_record_txt'] = 'Add new Filter';
 $wb['page_txt'] = 'Page';
 $wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
 ?>
diff --git a/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
 $wb['email_txt'] = 'Email';
 $wb['priority_txt'] = 'Priority';
 $wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
 ?>
diff --git a/interface/web/mail/mail_alias_edit.php b/interface/web/mail/mail_alias_edit.php
index 641d609..b6ce17f 100644
--- a/interface/web/mail/mail_alias_edit.php
+++ b/interface/web/mail/mail_alias_edit.php
@@ -1,6 +1,6 @@
 <?php
 /*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailalias FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailalias"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'alias'");
-				if($tmp["number"] >= $client["limit_mailalias"]) {
-					$app->error($app->tform->wordbook["limit_mailalias_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailalias',"type = 'alias'")) {
+				$app->error($app->tform->wordbook["limit_mailalias_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailalias',"type = 'alias'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailalias_txt"]);
 			}
 		}
 		
@@ -80,7 +74,7 @@
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
 		
 		// Getting Domains of the user
-		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
 		$domains = $app->db->queryAllRecords($sql);
 		$domain_select = '';
 		if(is_array($domains)) {
@@ -126,6 +120,11 @@
 		unset($this->dataRecord["email_local_part"]);
 		unset($this->dataRecord["email_domain"]);
 		
+		//* Check if there is no mailbox with this address
+		$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["source"])."'");
+		if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."<br>";
+		unset($tmp);
+		
 		parent::onSubmit();
 	}
 	
diff --git a/interface/web/mail/mail_blacklist_edit.php b/interface/web/mail/mail_blacklist_edit.php
index 558c29d..b2f4f67 100644
--- a/interface/web/mail/mail_blacklist_edit.php
+++ b/interface/web/mail/mail_blacklist_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailfilter"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_mailfilter"]) {
-					$app->error($app->tform->wordbook["limit_mailfilter_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailfilter')) {
+				$app->error($app->tform->wordbook["limit_mailfilter_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailfilter')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/mail_domain_catchall_edit.php b/interface/web/mail/mail_domain_catchall_edit.php
index eebc7e4..c3338cc 100644
--- a/interface/web/mail/mail_domain_catchall_edit.php
+++ b/interface/web/mail/mail_domain_catchall_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailcatchall FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailcatchall"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'catchall'");
-				if($tmp["number"] >= $client["limit_mailcatchall"]) {
-					$app->error($app->tform->wordbook["limit_mailcatchall_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailcatchall',"type = 'catchall'")) {
+				$app->error($app->tform->wordbook["limit_mailcatchall_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailcatchall',"type = 'catchall'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailcatchall_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php
index 74ea170..14ef8e2 100644
--- a/interface/web/mail/mail_domain_edit.php
+++ b/interface/web/mail/mail_domain_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_maildomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another maildomain.
-			if($client["limit_maildomain"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_maildomain"]) {
-					$app->error($app->tform->wordbook["limit_maildomain_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_maildomain')) {
+				$app->error($app->tform->wordbook["limit_maildomain_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_maildomain')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_maildomain_txt"]);
 			}
 		}
 		
@@ -98,7 +92,7 @@
 
 			// Get the limits of the client
 			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			$client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
 			
 			// Set the webserver to the default server of the client
 			$tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]");
@@ -108,7 +102,7 @@
 			// Fill the client select field
 			$sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
 			$clients = $app->db->queryAllRecords($sql);
-			$client_select = '';
+			$client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
 			if(is_array($clients)) {
 				foreach( $clients as $client) {
 					$selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
@@ -180,6 +174,11 @@
 			// Clients may not set the client_group_id, so we unset them if user is not a admin
 			if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]);
 		}
+		
+		//* make sure that the email domain is lowercase
+		if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]);
+		
+		
 		parent::onSubmit();
 	}
 	
@@ -221,11 +220,21 @@
 		//* Check if the server has been changed
 		// We do this only for the admin or reseller users, as normal clients can not change the server ID anyway
 		if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
-			$rec = $app->db->queryOneRecord("SELECT server_id from mail_domain WHERE domain_id = ".$this->id);
+			$rec = $app->db->queryOneRecord("SELECT server_id, domain from mail_domain WHERE domain_id = ".$this->id);
 			if($rec['server_id'] != $this->dataRecord["server_id"]) {
 				//* Add a error message and switch back to old server
 				$app->tform->errorMessage .= $app->lng('The Server can not be changed.');
 				$this->dataRecord["server_id"] = $rec['server_id'];
+			}
+			unset($rec);
+		//* If the user is neither admin nor reseller
+		} else {
+			//* We do not allow users to change a domain which has been created by the admin
+			$rec = $app->db->queryOneRecord("SELECT domain from mail_domain WHERE domain_id = ".$this->id);
+			if($rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) {
+				//* Add a error message and switch back to old server
+				$app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.');
+				$this->dataRecord["domain"] = $rec['domain'];
 			}
 			unset($rec);
 		}
@@ -298,6 +307,11 @@
 				}
 			}
 			
+			//* Delete the old spamfilter record
+			$tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->oldDataRecord["domain"])."'");
+			$app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]);
+			unset($tmp);
+			
 		} // end if domain name changed
 		
 	}
diff --git a/interface/web/mail/mail_forward_edit.php b/interface/web/mail/mail_forward_edit.php
index b6871aa..f89cd36 100644
--- a/interface/web/mail/mail_forward_edit.php
+++ b/interface/web/mail/mail_forward_edit.php
@@ -1,6 +1,6 @@
 <?php
 /*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailforward FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailforward"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'forward'");
-				if($tmp["number"] >= $client["limit_mailforward"]) {
-					$app->error($app->tform->wordbook["limit_mailforward_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailforward',"type = 'forward'")) {
+				$app->error($app->tform->wordbook["limit_mailforward_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailforward',"type = 'forward'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailforward_txt"]);
 			}
 		}
 		
@@ -80,7 +74,7 @@
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
 		
 		// Getting Domains of the user
-		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
 		$domains = $app->db->queryAllRecords($sql);
 		$domain_select = '';
 		foreach( $domains as $domain) {
@@ -123,6 +117,11 @@
 		unset($this->dataRecord["email_local_part"]);
 		unset($this->dataRecord["email_domain"]);
 		
+		//* Check if there is no mailbox with this address
+		$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["source"])."'");
+		if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."<br>";
+		unset($tmp);
+		
 		parent::onSubmit();
 	}
 	
diff --git a/interface/web/mail/mail_get_edit.php b/interface/web/mail/mail_get_edit.php
index ec9aeb9..5bc512a 100644
--- a/interface/web/mail/mail_get_edit.php
+++ b/interface/web/mail/mail_get_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-		
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_fetchmail FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another transport.
-			if($client["limit_fetchmail"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(mailget_id) as number FROM mail_get WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_fetchmail"]) {
-					$app->error($app->tform->wordbook["limit_fetchmail_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_fetchmail')) {
+				$app->error($app->tform->wordbook["limit_fetchmail_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_fetchmail')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_fetchmail_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/mail_transport_edit.php b/interface/web/mail/mail_transport_edit.php
index 6ab58fb..58b06dc 100644
--- a/interface/web/mail/mail_transport_edit.php
+++ b/interface/web/mail/mail_transport_edit.php
@@ -56,17 +56,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailrouting FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another transport.
-			if($client["limit_mailrouting"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(transport_id) as number FROM mail_transport WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_mailrouting"]) {
-					$app->error($app->tform->wordbook["limit_mailrouting_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailrouting')) {
+				$app->error($app->tform->wordbook["limit_mailrouting_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailrouting')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailrouting_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php
index 5a746bc..9289eeb 100644
--- a/interface/web/mail/mail_user_edit.php
+++ b/interface/web/mail/mail_user_edit.php
@@ -1,6 +1,6 @@
 <?php
 /*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -56,17 +56,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailbox FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailbox"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_mailbox"]) {
-					$app->error($app->tform->wordbook["limit_mailbox_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailbox')) {
+				$app->error($app->tform->wordbook["limit_mailbox_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailbox')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailbox_txt"]);
 			}
 		}
 		
@@ -81,7 +75,7 @@
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
 		
 		// Getting Domains of the user
-		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
 		$domains = $app->db->queryAllRecords($sql);
 		$domain_select = '';
 		if(is_array($domains)) {
@@ -98,7 +92,7 @@
 		$tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '".$this->dataRecord["email"]."'");
 		$sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r');
 		$policys = $app->db->queryAllRecords($sql);
-		$policy_select = "<option value='0'>".$app->tform->wordbook["no_policy"]."</option>";
+		$policy_select = "<option value='0'>".$app->tform->lng("no_policy")."</option>";
 		if(is_array($policys)) {
 			foreach( $policys as $p) {
 				$selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':'';
@@ -119,19 +113,19 @@
 	function onSubmit() {
 		global $app, $conf;
 		
-		// Check if Domain belongs to user
+		//* Check if Domain belongs to user
 		if(isset($_POST["email_domain"])) {
 			$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
-			if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+			if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm");
 		}
 		
 		
-		// if its an insert, check that the password is not empty
+		//* if its an insert, check that the password is not empty
 		if($this->id == 0 && $_POST["password"] == '') {
-			$app->tform->errorMessage .= $app->tform->wordbook["error_no_pwd"]."<br>";
+			$app->tform->errorMessage .= $app->tform->lng("error_no_pwd")."<br>";
 		}
 		
-		// Check the client limits, if user is not the admin
+		//* Check the client limits, if user is not the admin
 		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
 			// Get the limits of the client
 			$client_group_id = $_SESSION["s"]["user"]["default_group"];
@@ -142,7 +136,7 @@
 			if($this->id == 0 && $client["limit_mailbox"] >= 0) {
 				$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id");
 				if($tmp["number"] >= $client["limit_mailbox"]) {
-					$app->tform->errorMessage .= $app->tform->wordbook["limit_mailbox_txt"]."<br>";
+					$app->tform->errorMessage .= $app->tform->lng("limit_mailbox_txt")."<br>";
 				}
 				unset($tmp);
 			}
@@ -154,7 +148,7 @@
 				$new_mailbox_quota = intval($this->dataRecord["quota"]);
 				if($mailquota + $new_mailbox_quota > $client["limit_mailquota"]) {
 					$max_free_quota = $client["limit_mailquota"] - $mailquota;
-					$app->tform->errorMessage .= $app->tform->wordbook["limit_mailquota_txt"].": ".$max_free_quota."<br>";
+					$app->tform->errorMessage .= $app->tform->lng("limit_mailquota_txt").": ".$max_free_quota."<br>";
 					// Set the quota field to the max free space
 					$this->dataRecord["quota"] = $max_free_quota;
 				}
@@ -164,9 +158,9 @@
 		} // end if user is not admin
 		
 
-		// compose the email field
+		//* compose the email field
 		if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) {
-			$this->dataRecord["email"] = $_POST["email_local_part"]."@".$_POST["email_domain"];
+			$this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]);
 		
 			// Set the server id of the mailbox = server ID of mail domain.
 			$this->dataRecord["server_id"] = $domain["server_id"];
@@ -186,8 +180,13 @@
 			$this->dataRecord["homedir"] = $mail_config["homedir_path"];
 			$this->dataRecord["uid"] = $mail_config["mailuser_uid"];
 			$this->dataRecord["gid"] = $mail_config["mailuser_gid"];
+			
+			//* Check if there is no alias or forward with this address
+			$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE source = '".$app->db->quote($this->dataRecord["email"])."'");
+			if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."<br>";
+			unset($tmp);
+			
 		}
-
 		
 		parent::onSubmit();
 	}
@@ -203,23 +202,23 @@
 //		mail($this->dataRecord["email"],$app->tform->wordbook["welcome_mail_subject"],$app->tform->wordbook["welcome_mail_message"]);
 		
 		// tries to detect current charset, and encode subject-header and body from it to ISO-8859-1.
-		$fromCharset      = mb_detect_encoding($app->tform->wordbook["welcome_mail_subject"]);
+		$fromCharset      = mb_detect_encoding($app->tform->lng("welcome_mail_subject"));
 		$iconvPreferences = array("input-charset" => $fromCharset,
 					"output-charset" => "ISO-8859-1",
 					"line-length" => 76,
 					"line-break-chars" => "\n",
 					"scheme" => "Q");
 
-		$welcomeFromName  = $app->tform->wordbook["welcome_mail_fromname_txt"];
-		$welcomeFromEmail = $app->tform->wordbook["welcome_mail_fromemail_txt"];
+		$welcomeFromName  = $app->tform->lng("welcome_mail_fromname_txt");
+		$welcomeFromEmail = $app->tform->lng("welcome_mail_fromemail_txt");
 		$mailHeaders      = "MIME-Version: 1.0" . "\n";
 		$mailHeaders     .= "Content-type: text/plain; charset=iso-8859-1" . "\n";
 		$mailHeaders     .= "From: $welcomeFromName  <$welcomeFromEmail>" . "\n";
 		$mailHeaders     .= "Reply-To: <$welcomeFromEmail>" . "\n";
 		$mailTarget       = $this->dataRecord["email"];
-		$mailSubject      = iconv_mime_encode("trimoff", $app->tform->wordbook["welcome_mail_subject"], $iconvPreferences);
+		$mailSubject      = iconv_mime_encode("trimoff", $app->tform->lng("welcome_mail_subject"), $iconvPreferences);
 		$mailSubject      = str_replace("trimoff: ", "", $mailSubject);
-		$mailBody         = iconv ($fromCharset, "ISO-8859-1", $app->tform->wordbook["welcome_mail_message"]);
+		$mailBody         = iconv ($fromCharset, "ISO-8859-1", $app->tform->lng("welcome_mail_message"));
 
 		mail($mailTarget, $mailSubject, $mailBody, $mailHeaders);
 		
diff --git a/interface/web/mail/mail_user_filter_edit.php b/interface/web/mail/mail_user_filter_edit.php
index e21801e..89f4b4f 100644
--- a/interface/web/mail/mail_user_filter_edit.php
+++ b/interface/web/mail/mail_user_filter_edit.php
@@ -113,24 +113,35 @@
 		
 		$content = '';
 		$content .= '### BEGIN FILTER_ID:'.$this->id."\n";
-		
+
+		$TargetNoQuotes = $this->dataRecord["target"];
+		$TargetQuotes = "\"$TargetNoQuotes\"";
+
+		$TestChDirNoQuotes = '$DEFAULT/.'.$TargetNoQuotes;
+		$TestChDirQuotes = "\"$TestChDirNoQuotes\"";
+
+		$MailDirMakeNoQuotes = $TargetQuotes.' $DEFAULT';
+
+		$EchoTargetFinal = $TargetNoQuotes;
+
+
 		if($this->dataRecord["action"] == 'move') {
-		
+
 			$content .= "
-`test -e ".'$DEFAULT/.'.$this->dataRecord["target"]."`
-if ( ".'$RETURNCODE'." != 0 )
+`test -e ".$TestChDirQuotes." && exit 1 || exit 0`
+if ( ".'$RETURNCODE'." != 1 )
 {
-  `maildirmake -f ".$this->dataRecord["target"].' $DEFAULT'."`
-  `chmod -R 0700 ".'$DEFAULT/'.$this->dataRecord["target"]."`
-  `echo INBOX.".$this->dataRecord["target"]." >> ".'$DEFAULT'."/courierimapsubscribed`
+	`maildirmake -f $MailDirMakeNoQuotes`
+	`chmod -R 0700 ".$TestChDirQuotes."`
+	`echo \"INBOX.$EchoTargetFinal\" >> ".'$DEFAULT'."/courierimapsubscribed`
 }
-";		
+";
 		}
-		
+
 		$content .= "if (/^".$this->dataRecord["source"].":";
-		
+
 		$searchterm = preg_quote($this->dataRecord["searchterm"]);
-		
+
 		if($this->dataRecord["op"] == 'contains') {
 			$content .= ".*".$searchterm."/:h)\n";
 		} elseif ($this->dataRecord["op"] == 'is') {
@@ -140,18 +151,21 @@
 		} elseif ($this->dataRecord["op"] == 'ends') {
 			$content .= ".*".$searchterm."$/:h)\n";
 		}
-		
+
 		$content .= "{\n";
 		$content .= "exception {\n";
-		
+
 		if($this->dataRecord["action"] == 'move') {
-			$content .= 'to $DEFAULT/.'.$this->dataRecord["target"]."/\n";
+			$content .= 'ID' . "$this->id" . 'EndFolder = "$DEFAULT/.' . $this->dataRecord['target'] . '/"' . "\n";
+			$content .= "to ". '$ID' . "$this->id" . 'EndFolder' . "\n";
 		} else {
 			$content .= "to /dev/null\n";
 		}
+
+		$content .= "}\n";
+		$content .= "}\n";
 		
-		$content .= "}\n";
-		$content .= "}\n";
+		//}
 		
 		$content .= '### END FILTER_ID:'.$this->id."\n";
 		
diff --git a/interface/web/mail/mail_whitelist_edit.php b/interface/web/mail/mail_whitelist_edit.php
index c4fd8c2..a377729 100644
--- a/interface/web/mail/mail_whitelist_edit.php
+++ b/interface/web/mail/mail_whitelist_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_mailfilter"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_mailfilter"]) {
-					$app->error($app->tform->wordbook["limit_mailfilter_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_mailfilter')) {
+				$app->error($app->tform->wordbook["limit_mailfilter_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_mailfilter')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/spamfilter_blacklist_edit.php b/interface/web/mail/spamfilter_blacklist_edit.php
index a75af75..b6c45dd 100644
--- a/interface/web/mail/spamfilter_blacklist_edit.php
+++ b/interface/web/mail/spamfilter_blacklist_edit.php
@@ -54,17 +54,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_spamfilter_wblist"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_spamfilter_wblist"]) {
-					$app->error($app->tform->lng("limit_spamfilter_wblist_txt"));
-				}
+			if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) {
+				$app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/spamfilter_policy_edit.php b/interface/web/mail/spamfilter_policy_edit.php
index 03b569b..abc28e9 100644
--- a/interface/web/mail/spamfilter_policy_edit.php
+++ b/interface/web/mail/spamfilter_policy_edit.php
@@ -54,17 +54,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_spamfilter_policy FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_limit_spamfilter_policy"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_policy WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_spamfilter_policy"]) {
-					$app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_spamfilter_policy')) {
+				$app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_spamfilter_policy')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_policy_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/spamfilter_users_edit.php b/interface/web/mail/spamfilter_users_edit.php
index f76f909..02cebbf 100644
--- a/interface/web/mail/spamfilter_users_edit.php
+++ b/interface/web/mail/spamfilter_users_edit.php
@@ -54,17 +54,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_limit_spamfilter_user"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_spamfilter_user"]) {
-					$app->error($app->tform->wordbook["limit_spamfilter_user_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_spamfilter_user')) {
+				$app->error($app->tform->wordbook["limit_spamfilter_user_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_spamfilter_user')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_user_txt"]);
 			}
 		}
 		
diff --git a/interface/web/mail/spamfilter_whitelist_edit.php b/interface/web/mail/spamfilter_whitelist_edit.php
index b6762af..c4bba0e 100644
--- a/interface/web/mail/spamfilter_whitelist_edit.php
+++ b/interface/web/mail/spamfilter_whitelist_edit.php
@@ -54,17 +54,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another mailbox.
-			if($client["limit_spamfilter_wblist"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_spamfilter_wblist"]) {
-					$app->error($app->tform->lng("limit_spamfilter_wblist_txt"));
-				}
+			if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) {
+				$app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]);
 			}
 		}
 		
diff --git a/interface/web/monitor/lib/lang/br.lng b/interface/web/monitor/lib/lang/br.lng
new file mode 100644
index 0000000..e04c601
--- /dev/null
+++ b/interface/web/monitor/lib/lang/br.lng
@@ -0,0 +1,138 @@
+<?php
+$wb['Server online since'] = 'Servidor online desde';
+$wb['Users online'] = 'Usuários Online';
+$wb['System load 1 minute'] = 'Sistema carregado 1 Min';
+$wb['System load 5 minutes'] = 'Sistema carregado 5 Min';
+$wb['System load 15 minutes'] = 'Sistema carregado 15 Min';
+$wb['Server Load'] = 'Servidor carregado';
+$wb['Disk usage'] = 'Uso do disco';
+$wb['Memory usage'] = 'Uso da memória';
+$wb['no_data_serverload_txt'] = 'Sem registro carga do servidor disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_memusage_txt'] = 'Sem registro uso de memória disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_diskusage_txt'] = 'Sem registro de uso de disco disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_cpuinfo_txt'] = 'Sem registro de CPU disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_services_txt'] = 'Sem registro sobre os serviços disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_updates_txt'] = 'Sem atualização de dados disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_raid_txt'] = 'Sem registro de RAID disponível no momento. Tente novamente mais tarde.';
+$wb['no_data_rkhunter_txt'] = 'Sem registro de RKHUNTER disponível no momento. Tente novamente mais tarde.';
+$wb['no_data_mailq_txt'] = 'Sem registro de fila de correio disponível no momento. Tente novamente mais tarde.';
+$wb['no_logdata_txt'] = 'Sem registro de log disponível no momento. Tente novamente mais tarde.';
+$wb['Monitoring'] = 'Monitoramento';
+$wb['Server to Monitor'] = 'Servidor a monitorar';
+$wb['Logfiles'] = 'Arquivos de log';
+$wb['Status of services'] = 'Status dos serviços';
+$wb['No Refresh'] = 'Não atualize';
+$wb['minutes'] = 'minutos';
+$wb['Show Overview'] = 'Exibir Visão Geral';
+$wb['System State (All Servers)'] = 'Estado do Sistema (Todos os Servidores)';
+$wb['Hardware-Information'] = 'Informação de Hardware';
+$wb['Show CPU info'] = 'Exibir informações da UCP';
+$wb['Server State'] = 'Estado do Servidor';
+$wb['Show Update State'] = 'Exiba Status Atualizado';
+$wb['Show RAID state'] = 'Exiba Status do RAID';
+$wb['Show Server load'] = 'Exiba Carga do Servidor';
+$wb['Show Disk usage'] = 'Exiba Uso de Disco';
+$wb['Show Memory usage'] = 'Exiba Uso de Memória';
+$wb['Show Services'] = 'Exibir Serviços';
+$wb['Show Mail-Queue'] = 'Exibir Fila de Correio';
+$wb['Show Mail-Log'] = 'Exibir Log de Correio';
+$wb['Show Mail warn-Log'] = 'Exibir Log de Avisos de Correio';
+$wb['Show Mail err-Log'] = 'Exibir Log de Erros de Correio';
+$wb['Show System-Log'] = 'Exibir Log de Sistema';
+$wb['Show ISPC Cron-Log'] = 'Exibir ISPC Log do Cron';
+$wb['Show Freshclam-Log'] = 'Exibir Log do Freshclam';
+$wb['Show Clamav-Log'] = 'Exibir Log do Clamav';
+$wb['Show ISPConfig-Log'] = 'Exibir Log do ISPConfig';
+$wb['Show RKHunter-Log'] = 'Exibir Log do RKHunter';
+$wb['Show Jobqueue'] = 'Exibir Fila de Trabalho';
+$wb['monitor_general_serverstate_txt'] = 'Estado do Servidor';
+$wb['monitor_general_systemstate_txt'] = 'Estado do Sistema';
+$wb['monitor_diskusage_filesystem_txt'] = 'Sistema de Arquivos';
+$wb['monitor_diskusage_type_txt'] = 'Tipo';
+$wb['monitor_diskusage_size_txt'] = 'Tamanho';
+$wb['monitor_diskusage_used_txt'] = 'Usado';
+$wb['monitor_diskusage_available_txt'] = 'Disponível';
+$wb['monitor_diskusage_usage_txt'] = 'Uso %';
+$wb['monitor_diskusage_mounted_txt'] = 'Montado em';
+$wb['monitor_logs_mail_txt'] = 'Log de Correio';
+$wb['monitor_logs_mailwarn_txt'] = 'Log de Avisos';
+$wb['monitor_logs_mailerr_txt'] = 'Log de Erros';
+$wb['monitor_logs_messages_txt'] = 'Log de Sistema';
+$wb['monitor_logs_ispccron_txt'] = 'Log do ISPConfig Cron';
+$wb['monitor_logs_freshclam_txt'] = 'Logo do Freshclam';
+$wb['monitor_logs_clamav_txt'] = 'Log do Clamav ';
+$wb['monitor_logs_ispc_txt'] = 'Log do ISPConfig';
+$wb['monitor_nomdadm_txt'] = 'mdadm não está instalado ou seu servidor não suporta RAID';
+$wb['monitor_norkhunter_txt'] = 'RKHunter não está instalado, então não existem logs a exibir';
+$wb['monitor_serverstate_server_txt'] = 'Servidor';
+$wb['monitor_serverstate_state_txt'] = 'Estado';
+$wb['monitor_serverstate_unknown_txt'] = 'desconhecido';
+$wb['monitor_serverstate_info_txt'] = 'informações';
+$wb['monitor_serverstate_warning_txt'] = 'aviso';
+$wb['monitor_serverstate_critical_txt'] = 'crítico';
+$wb['monitor_serverstate_error_txt'] = 'erro';
+$wb['monitor_serverstate_moreinfo_txt'] = 'Mais informações..';
+$wb['monitor_serverstate_more_txt'] = 'Mais...';
+$wb['monitor_serverstate_fclamok_txt'] = 'Definições de anti-virus ok ...';
+$wb['monitor_serverstate_fclamoutdated_txt'] = 'Definições de anti-virus DESATUALIZADAS!';
+$wb['monitor_serverstate_fclamunknown_txt'] = 'Freshclam: ???!';
+$wb['monitor_serverstate_hdok_txt'] = 'Espaço em disco está ok';
+$wb['monitor_serverstate_hdgoingfull_txt'] = 'O espaço em disco está cheio';
+$wb['monitor_serverstate_hdnearlyfull_txt'] = 'Seu disco está ficando cheio';
+$wb['monitor_serverstate_hdveryfull_txt'] = 'Seu disco está muito cheio';
+$wb['monitor_serverstate_hdfull_txt'] = 'Seu disco não tem mais espaço';
+$wb['monitor_serverstate_hdunknown_txt'] = 'Disco Rígido: ???';
+$wb['monitor_serverstate_listok_txt'] = 'ok';
+$wb['monitor_serverstate_listinfo_txt'] = 'infomação';
+$wb['monitor_serverstate_listwarning_txt'] = 'aviso';
+$wb['monitor_serverstate_listcritical_txt'] = 'crítico';
+$wb['monitor_serverstate_listerror_txt'] = 'erro';
+$wb['monitor_serverstate_listunknown_txt'] = 'desconhecido';
+$wb['monitor_serverstate_loadok_txt'] = 'Servidor carregado ok';
+$wb['monitor_serverstate_loadheavy_txt'] = 'Seu servidor está com uma carga alta';
+$wb['monitor_serverstate_loadhigh_txt'] = 'Seu servidor está ficando com uma carga alta';
+$wb['monitor_serverstate_loaghigher_txt'] = 'Seu servidor está com uma carga muito alta';
+$wb['monitor_serverstate_loadhighest_txt'] = 'Seu servidor está com uma carga super alta';
+$wb['monitor_serverstate_loadunknown_txt'] = 'Carga do Servidor: ???';
+$wb['monitor_serverstate_mailqok_txt'] = 'Sua fila de correio está OK';
+$wb['monitor_serverstate_mailqheavy_txt'] = 'Sua fila de correio está ficando com uma carga alta';
+$wb['monitor_serverstate_mailqhigh_txt'] = 'Sua fila de correio está com uma carga alta';
+$wb['monitor_serverstate_mailqhigher_txt'] = 'Sua fila de correio está com uma carga muito alta';
+$wb['monitor_serverstate_mailqhighest_txt'] = 'Sua fila de correio está com uma carga super alta';
+$wb['monitor_serverstate_mailqunknown_txt'] = 'Fila de Correio: ???';
+$wb['monitor_serverstate_raidok_txt'] = 'Seu RAID está ok';
+$wb['monitor_serverstate_raidresync_txt'] = 'Seu RAID está em modo RESYNC';
+$wb['monitor_serverstate_raidfault_txt'] = 'Seu RAID possui um disco com falhas. Troque-o o mais rápido possível!';
+$wb['monitor_serverstate_raiderror_txt'] = 'Seu RAID não está mais funcionando.';
+$wb['monitor_serverstate_raidunknown_txt'] = 'Estado do RAID: ???';
+$wb['monitor_serverstate_servicesonline_txt'] = 'Todos os serviços necessários estão on-line';
+$wb['monitor_serverstate_servicesoffline_txt'] = 'Um ou mais serviços necessários estão off-line';
+$wb['monitor_serverstate_servicesunknown_txt'] = 'Serviços:???';
+$wb['monitor_serverstate_syslogok_txt'] = 'O System-Log está O.K.';
+$wb['monitor_serverstate_syslogwarning_txt'] = 'Existem alguns avisos em seu System-Log';
+$wb['monitor_serverstate_syslogerror_txt'] = 'Existem erros no seu System-Log';
+$wb['monitor_serverstate_syslogunknown_txt'] = 'sys-log:???';
+$wb['monitor_serverstate_updatesok_txt'] = 'Seu sistema está atualizado.';
+$wb['monitor_serverstate_updatesneeded_txt'] = 'Um ou mais componentes necessitam de atualização';
+$wb['monitor_serverstate_updatesunknown_txt'] = 'Atualização-Sistema:???';
+$wb['monitor_services_online_txt'] = 'Online';
+$wb['monitor_services_offline_txt'] = 'Offline';
+$wb['monitor_services_web_txt'] = 'Servidor Webr:';
+$wb['monitor_services_ftp_txt'] = 'Servidor FTP:';
+$wb['monitor_services_smtp_txt'] = 'Servidor SMTP:';
+$wb['monitor_services_pop_txt'] = 'Servidor POP:';
+$wb['monitor_services_imap_txt'] = 'Servidor IMAP:';
+$wb['monitor_services_mydns_txt'] = 'Servidor myDNS:';
+$wb['monitor_services_mysql_txt'] = 'Servidor MySql:';
+$wb['monitor_settings_datafromdate_txt'] = 'Data de: ';
+$wb['monitor_settings_datetimeformat_txt'] = 'd/m/Y H:i';
+$wb['monitor_settings_refreshsq_txt'] = 'Atualizar sequência:';
+$wb['monitor_settings_server_txt'] = 'Servidor';
+$wb['monitor_title_cpuinfo_txt'] = 'Informação da CPU';
+$wb['monitor_title_updatestate_txt'] = 'Atualizar Estado';
+$wb['monitor_title_mailq_txt'] = 'Fila de Correio';
+$wb['monitor_title_raidstate_txt'] = 'Estado do RAID';
+$wb['monitor_title_rkhunterlog_txt'] = 'Log do RKHunter';
+$wb['monitor_updates_nosupport_txt'] = 'Sua distribuição não suporta este tipo de monitoramento';
+?>
+
diff --git a/interface/web/monitor/lib/lang/br_syslog_list.lng b/interface/web/monitor/lib/lang/br_syslog_list.lng
new file mode 100644
index 0000000..f8ff04c
--- /dev/null
+++ b/interface/web/monitor/lib/lang/br_syslog_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Log do Painel';
+$wb['tstamp_txt'] = 'Data';
+$wb['server_id_txt'] = 'Servidor';
+$wb['loglevel_txt'] = 'Nível do Log';
+$wb['message_txt'] = 'Mensagem';
+?>
+
diff --git a/interface/web/sites/cron_del.php b/interface/web/sites/cron_del.php
new file mode 100644
index 0000000..516b447
--- /dev/null
+++ b/interface/web/sites/cron_del.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/cron.list.php";
+$tform_def_file = "form/cron.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+	function onBeforeDelete() {
+		global $app; $conf;
+		
+		if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission'));
+	}
+}
+
+$page = new page_action;
+$page->onDelete();
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/cron_edit.php b/interface/web/sites/cron_edit.php
new file mode 100644
index 0000000..a3244f0
--- /dev/null
+++ b/interface/web/sites/cron_edit.php
@@ -0,0 +1,220 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$tform_def_file = "form/cron.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions,validate_cron');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+	
+	function onShowNew() {
+		global $app, $conf;
+		
+		// we will check only users, not admins
+		if($_SESSION["s"]["user"]["typ"] == 'user') {
+			if(!$app->tform->checkClientLimit('limit_cron')) {
+				$app->error($app->tform->wordbook["limit_cron_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_cron')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_cron_txt"]);
+			}
+		}
+		
+		parent::onShowNew();
+	}
+	
+	function onShowEnd() {
+		global $app, $conf;
+		
+        if($this->id > 0) {
+            //* we are editing a existing record
+            $app->tpl->setVar("edit_disabled", 1);
+            $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]);
+        } else {
+            $app->tpl->setVar("edit_disabled", 0);
+        }
+		
+		parent::onShowEnd();
+	}
+	
+	function onSubmit() {
+		global $app, $conf;
+		
+		if($_SESSION["s"]["user"]["typ"] != 'admin') {
+			// Get the limits of the client
+			$client_group_id = $_SESSION["s"]["user"]["default_group"];
+			$client = $app->db->queryOneRecord("SELECT limit_cron, limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+		
+			// When the record is updated
+			if($this->id > 0) {
+			// When the record is inserted
+			} else {
+				// Check if the user may add another cron job.
+				if($client["limit_cron"] >= 0) {
+					$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM cron WHERE sys_groupid = $client_group_id");
+					if($tmp["number"] >= $client["limit_cron"]) {
+						$app->error($app->tform->wordbook["limit_cron_txt"]);
+					}
+				}
+			}
+		}
+		
+        // Get the record of the parent domain
+        $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"]));
+        
+        // Set fixed values
+        $this->dataRecord["server_id"] = $parent_domain["server_id"];
+
+        //* get type of command
+        $command = $this->dataRecord["command"];
+        if(preg_match("'^http(s)?:\/\/'i", $command)) {
+            $this->dataRecord["type"] = 'url';
+        } else {
+            $domain_owner = $app->db->queryOneRecord("SELECT limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".intval($parent_domain["sys_groupid"]));
+            if($domain_owner["limit_cron_type"] == 'full') $this->dataRecord["type"] = 'full';
+            else $this->dataRecord["type"] = 'chrooted';
+        }
+        
+        parent::onSubmit();
+	}
+	
+    function onUpdateSave($sql) {
+        global $app;
+        
+        $has_error = false;
+        //* last chance to stop this, so check frequency limit!
+        if($_SESSION["s"]["user"]["typ"] != 'admin') {
+            // Get the limits of the client
+            $client_group_id = $_SESSION["s"]["user"]["default_group"];
+            $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+        
+            if($client["limit_cron_frequency"] > 1) {
+                if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) {
+                    $app->error($app->tform->wordbook["limit_cron_frequency_txt"]);
+                    $has_error = true;
+                }
+            }
+        }
+        
+        if($has_error == true) {
+            parent::onError();
+            exit;
+        }
+        else parent::onUpdateSave($sql);
+    }
+    
+    function onInsertSave($sql) {
+        global $app;
+    
+        $has_error = false;
+        //* last chance to stop this, so check frequency limit!
+        if($_SESSION["s"]["user"]["typ"] != 'admin') {
+            // Get the limits of the client
+            $client_group_id = $_SESSION["s"]["user"]["default_group"];
+            $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+        
+            if($client["limit_cron_frequency"] > 1) {
+                if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) {
+                    $app->error($app->tform->wordbook["limit_cron_frequency_txt"]);
+                    $has_error = true;
+                }
+            }
+        }
+        
+        if($has_error == true) {
+            parent::onError();
+            exit;
+        }
+        else parent::onInsertSave($sql);
+    }
+    
+	function onAfterInsert() {
+		global $app, $conf;
+		
+        $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"]));
+        $server_id = $web["server_id"];
+        
+        // The cron shall be owned by the same group then the website
+        $sys_groupid = $web['sys_groupid'];
+        
+        $sql = "UPDATE shell_user SET server_id = $server_id, sys_groupid = '$sys_groupid' WHERE id = ".$this->id;
+        $app->db->query($sql);
+	}
+	
+	function onAfterUpdate() {
+		global $app, $conf;
+		
+		
+	}
+    
+    function getClientName() {
+        global $app, $conf;
+    
+        if($_SESSION["s"]["user"]["typ"] != 'admin') {
+            // Get the group-id of the user
+            $client_group_id = $_SESSION["s"]["user"]["default_group"];
+        } else {
+            // Get the group-id from the data itself
+            $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id']));
+            $client_group_id = $web['sys_groupid'];
+        }
+        /* get the name of the client */
+        $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id);
+        $clientName = $tmp['name'];
+        if ($clientName == "") $clientName = 'default';
+        $clientName = convertClientName($clientName);
+        
+        return $clientName;
+    
+    }
+	
+}
+
+$page = new page_action;
+$page->onLoad();
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/cron_list.php b/interface/web/sites/cron_list.php
new file mode 100644
index 0000000..68e2316
--- /dev/null
+++ b/interface/web/sites/cron_list.php
@@ -0,0 +1,23 @@
+<?php
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/cron.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->uses('listform_actions');
+
+$app->listform_actions->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/database_edit.php b/interface/web/sites/database_edit.php
index 9e1430b..088e37a 100644
--- a/interface/web/sites/database_edit.php
+++ b/interface/web/sites/database_edit.php
@@ -56,17 +56,11 @@
 
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_database FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
-			// Check if the user may add another database.
-			if($client["limit_database"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_database"]) {
-					$app->error($app->tform->wordbook["limit_database_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_database')) {
+				$app->error($app->tform->wordbook["limit_database_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_database')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_database_txt"]);
 			}
 		}
 
diff --git a/interface/web/sites/form/cron.tform.php b/interface/web/sites/form/cron.tform.php
new file mode 100644
index 0000000..4f9f8dd
--- /dev/null
+++ b/interface/web/sites/form/cron.tform.php
@@ -0,0 +1,189 @@
+<?php
+
+/*
+	Form Definition
+
+	Tabledefinition
+
+	Datatypes:
+	- INTEGER (Forces the input to Int)
+	- DOUBLE
+	- CURRENCY (Formats the values to currency notation)
+	- VARCHAR (no format check, maxlength: 255)
+	- TEXT (no format check)
+	- DATE (Dateformat, automatic conversion to timestamps)
+
+	Formtype:
+	- TEXT (Textfield)
+	- TEXTAREA (Textarea)
+	- PASSWORD (Password textfield, input is not shown when edited)
+	- SELECT (Select option field)
+	- RADIO
+	- CHECKBOX
+	- CHECKBOXARRAY
+	- FILE
+
+	VALUE:
+	- Wert oder Array
+
+	Hint:
+	The ID field of the database table is not part of the datafield definition.
+	The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] 			= "Cron Job";
+$form["description"] 	= "";
+$form["name"] 			= "cron";
+$form["action"]			= "cron_edit.php";
+$form["db_table"]		= "cron";
+$form["db_table_idx"]	= "id";
+$form["db_history"]		= "yes";
+$form["tab_default"]	= "cron";
+$form["list_default"]	= "cron_list.php";
+$form["auth"]			= 'yes'; // yes / no
+
+$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+$form["tabs"]['cron'] = array (
+	'title' 	=> "Cron Job",
+	'width' 	=> 100,
+	'template' 	=> "templates/cron_edit.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'server_id' => array (
+			'datatype'	=> 'INTEGER',
+			'formtype'	=> 'SELECT',
+			'datasource'	=> array ( 	'type'	=> 'SQL',
+										'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
+										'keyfield'=> 'server_id',
+										'valuefield'=> 'server_name'
+									 ),
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'server_id_error_empty'),
+									),
+			'default'	=> '',
+			'value'		=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255'
+		),
+        'parent_domain_id' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'SELECT',
+            'default'   => '',
+            'datasource'    => array (  'type'  => 'SQL',
+                                        'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain",
+                                        'keyfield'=> 'domain_id',
+                                        'valuefield'=> 'domain'
+                                     ),
+            'value'     => ''
+        ),
+        'run_min' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'run_time_format',
+                                                        'errmsg'=> 'run_min_error_format'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'run_hour' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'run_time_format',
+                                                        'errmsg'=> 'run_hour_error_format'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'run_mday' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'run_time_format',
+                                                        'errmsg'=> 'run_mday_error_format'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'run_month' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'run_time_format',
+                                                        'errmsg'=> 'run_month_error_format'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'run_wday' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'run_time_format',
+                                                        'errmsg'=> 'run_wday_error_format'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+		'command' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'command_error_empty'),
+                                        1 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_cron',
+                                                        'function' => 'command_format',
+                                                        'errmsg'=> 'command_error_format'),
+									),
+			'default'	=> '',
+			'value'		=> '',
+			'width'		=> '30',
+			'maxlength'	=> '255'
+		),
+        'type' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'SELECT',
+            'default'   => 'url',
+            'valuelimit' => 'list:url,full,chrooted',
+            'value'     => array('url' => 'Url', 'full' => 'Full', 'chrooted' => 'Chrooted')
+        ),
+		'active' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOX',
+			'default'	=> 'y',
+			'value'		=> array(0 => 'n',1 => 'y')
+		),
+	##################################
+	# ENDE Datatable fields
+	##################################
+	)
+);
+
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/form/database.tform.php b/interface/web/sites/form/database.tform.php
index 7ea10ee..3a7a947 100644
--- a/interface/web/sites/form/database.tform.php
+++ b/interface/web/sites/form/database.tform.php
@@ -133,6 +133,18 @@
 			'default'	=> 'y',
 			'value'		=> array(0 => 'n',1 => 'y')
 		),
+    'remote_ips' => array (
+      'datatype'  => 'TEXT',
+      'formtype'  => 'TEXT',
+      'validators'  => array (  0 => array (  'type' => 'CUSTOM',
+                                              'class' => 'validate_database',
+                                              'function' => 'valid_ip_list',
+                                              'errmsg' => 'database_remote_error_ips'),
+                             ),
+      'default' => '',
+      'value'   => '',
+      'width'   => '60'
+    ),
 	##################################
 	# ENDE Datatable fields
 	##################################
diff --git a/interface/web/sites/form/ftp_user.tform.php b/interface/web/sites/form/ftp_user.tform.php
index 4950a1b..add5c72 100644
--- a/interface/web/sites/form/ftp_user.tform.php
+++ b/interface/web/sites/form/ftp_user.tform.php
@@ -83,12 +83,10 @@
 		'username' => array (
 			'datatype'	=> 'VARCHAR',
 			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'username_error_empty'),
-										1 => array (	'type'	=> 'UNIQUE',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'UNIQUE',
 														'errmsg'=> 'username_error_unique'),
-										2 => array (	'type'	=> 'REGEX',
-														'regex' => '/^[\w\.\-]{1,64}$/',
+										1 => array (	'type'	=> 'REGEX',
+														'regex' => '/^[\w\.\-]{0,64}$/',
 														'errmsg'=> 'username_error_regex'),
 									),
 			'default'	=> '',
@@ -131,93 +129,125 @@
 if($_SESSION["s"]["user"]["typ"] == 'admin') {
 
 $form["tabs"]['advanced'] = array (
-	'title' 	=> "Options",
-	'width' 	=> 100,
-	'template' 	=> "templates/ftp_user_advanced.htm",
-	'fields' 	=> array (
-	##################################
-	# Begin Datatable fields
-	##################################
-		'uid' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'uid_error_empty'),
-									),
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255'
-		),
-		'gid' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'uid_error_empty'),
-									),
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255'
-		),
-		'dir' => array (
-			'datatype'	=> 'VARCHAR',
-			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'directory_error_empty'),
-									),
-			'default'	=> '',
-			'value'		=> '',
-			'width'		=> '30',
-			'maxlength'	=> '255'
-		),
-		'quota_files' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '7',
-			'maxlength'	=> '7'
-		),
-		'ul_ratio' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '7',
-			'maxlength'	=> '7'
-		),
-		'dl_ratio' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '7',
-			'maxlength'	=> '7'
-		),
-		'ul_bandwidth' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '7',
-			'maxlength'	=> '7'
-		),
-		'dl_bandwidth' => array (
-			'datatype'	=> 'INTEGER',
-			'formtype'	=> 'TEXT',
-			'default'	=> '0',
-			'value'		=> '',
-			'width'		=> '7',
-			'maxlength'	=> '7'
-		),
-	##################################
-	# ENDE Datatable fields
-	##################################
-	)
+    'title'     => "Options",
+    'width'     => 100,
+    'template'  => "templates/ftp_user_advanced.htm",
+    'fields'    => array (
+    ##################################
+    # Begin Datatable fields
+    ##################################
+        'uid' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'uid_error_empty'),
+                                    ),
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'gid' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'uid_error_empty'),
+                                    ),
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'dir' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'directory_error_empty'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+        'quota_files' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '7',
+            'maxlength' => '7'
+        ),
+        'ul_ratio' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '7',
+            'maxlength' => '7'
+        ),
+        'dl_ratio' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '7',
+            'maxlength' => '7'
+        ),
+        'ul_bandwidth' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '7',
+            'maxlength' => '7'
+        ),
+        'dl_bandwidth' => array (
+            'datatype'  => 'INTEGER',
+            'formtype'  => 'TEXT',
+            'default'   => '0',
+            'value'     => '',
+            'width'     => '7',
+            'maxlength' => '7'
+        ),
+    ##################################
+    # ENDE Datatable fields
+    ##################################
+    )
+);
+
+} else {
+
+$form["tabs"]['advanced'] = array (
+    'title'     => "Options",
+    'width'     => 100,
+    'template'  => "templates/ftp_user_advanced_client.htm",
+    'fields'    => array (
+    ##################################
+    # Begin Datatable fields
+    ##################################
+        'dir' => array (
+            'datatype'  => 'VARCHAR',
+            'formtype'  => 'TEXT',
+            'validators'    => array (  0 => array (    'type'  => 'NOTEMPTY',
+                                                        'errmsg'=> 'directory_error_empty'),
+                                        1 => array (    'type'  => 'CUSTOM',
+                                                        'class' => 'validate_ftpuser',
+                                                        'function' => 'ftp_dir',
+                                                        'errmsg' => 'directory_error_notinweb'),
+                                    ),
+            'default'   => '',
+            'value'     => '',
+            'width'     => '30',
+            'maxlength' => '255'
+        ),
+    ##################################
+    # ENDE Datatable fields
+    ##################################
+    )
 );
 
 }
 
 
+
 ?>
\ No newline at end of file
diff --git a/interface/web/sites/form/shell_user.tform.php b/interface/web/sites/form/shell_user.tform.php
index 03b4311..0f692e3 100644
--- a/interface/web/sites/form/shell_user.tform.php
+++ b/interface/web/sites/form/shell_user.tform.php
@@ -83,12 +83,10 @@
 		'username' => array (
 			'datatype'	=> 'VARCHAR',
 			'formtype'	=> 'TEXT',
-			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
-														'errmsg'=> 'username_error_empty'),
-										1 => array (	'type'	=> 'UNIQUE',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'UNIQUE',
 														'errmsg'=> 'username_error_unique'),
-										2 => array (	'type'	=> 'REGEX',
-														'regex' => '/^[\w\.\-]{1,64}$/',
+										1 => array (	'type'	=> 'REGEX',
+														'regex' => '/^[\w\.\-]{0,64}$/',
 														'errmsg'=> 'username_error_regex'),
 									),
 			'default'	=> '',
diff --git a/interface/web/sites/ftp_user_edit.php b/interface/web/sites/ftp_user_edit.php
index ec35fd3..511ac90 100644
--- a/interface/web/sites/ftp_user_edit.php
+++ b/interface/web/sites/ftp_user_edit.php
@@ -56,17 +56,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_ftp_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another ftp user.
-			if($client["limit_ftp_user"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(ftp_user_id) as number FROM ftp_user WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_ftp_user"]) {
-					$app->error($app->tform->wordbook["limit_ftp_user_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_ftp_user')) {
+				$app->error($app->tform->wordbook["limit_ftp_user_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_ftp_user')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_ftp_user_txt"]);
 			}
 		}
 		
@@ -107,6 +101,11 @@
 		
 		// Set a few fixed values
 		$this->dataRecord["server_id"] = $parent_domain["server_id"];
+		
+		//die(print_r($this->dataRecord));
+		
+		if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'<br />';
+		if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'<br />';
 		
 		parent::onSubmit();
 	}
@@ -165,6 +164,20 @@
 	function onAfterUpdate() {
 		global $app, $conf;
 		
+		//* When the site of the FTP user has been changed
+		if($this->oldDataRecord['parent_domain_id'] != $this->dataRecord['parent_domain_id']) {
+			$web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"]));
+			$server_id = $web["server_id"];
+			$dir = $web["document_root"];
+			$uid = $web["system_user"];
+			$gid = $web["system_group"];
+		
+			// The FTP user shall be owned by the same group then the website
+			$sys_groupid = $web['sys_groupid'];
+		
+			$sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id;
+			$app->db->query($sql);
+		}
 		
 	}
 	
diff --git a/interface/web/sites/lib/lang/bg_cron.lng b/interface/web/sites/lib/lang/bg_cron.lng
new file mode 100644
index 0000000..fecb4ab
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
diff --git a/interface/web/sites/lib/lang/bg_cron_list.lng b/interface/web/sites/lib/lang/bg_cron_list.lng
new file mode 100644
index 0000000..ad56ea9
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Active';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Hour';
+$wb['run_mday_txt'] = 'Day of month';
+$wb['run_month_txt'] = 'Month';
+$wb['run_wday_txt'] = 'Day of week';
+$wb['command_txt'] = 'Command';
+$wb['add_new_cron_txt'] = 'Add new Cron job';
+?>
diff --git a/interface/web/sites/lib/lang/bg_database.lng b/interface/web/sites/lib/lang/bg_database.lng
index ebc936a..97807e7 100644
--- a/interface/web/sites/lib/lang/bg_database.lng
+++ b/interface/web/sites/lib/lang/bg_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'Достигнат е максималният разрешен брой бази данни.';
 $wb['database_name_change_txt'] = 'Името на базата данни не може да бъде променено.';
 $wb['database_charset_change_txt'] = 'Charset на базата данни не може да бъде променен.';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/bg_ftp_user.lng b/interface/web/sites/lib/lang/bg_ftp_user.lng
index 55dce49..1b7d4aa 100644
--- a/interface/web/sites/lib/lang/bg_ftp_user.lng
+++ b/interface/web/sites/lib/lang/bg_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'Не е посочено GID.';
 $wb['directory_error_empty'] = 'Не е посочена директория.';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng b/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/br.lng b/interface/web/sites/lib/lang/br.lng
new file mode 100644
index 0000000..44b172a
--- /dev/null
+++ b/interface/web/sites/lib/lang/br.lng
@@ -0,0 +1,17 @@
+<?php
+$wb['Database'] = 'Banco de Dados';
+$wb['Options'] = 'Opções';
+$wb['Shell User'] = 'Usuário de Shell';
+$wb['Domain'] = 'Website';
+$wb['Redirect'] = 'Redirecionamento';
+$wb['SSL'] = 'SSL';
+$wb['Subdomain'] = 'Sub-domínio';
+$wb['Sites'] = 'Sites';
+$wb['Aliasdomain'] = 'Alias de Domínio';
+$wb['FTP-User'] = 'Usuário-FTP';
+$wb['FTP'] = 'FTP';
+$wb['Shell-User'] = 'Usuário-Shell';
+$wb['Shell'] = 'Shell';
+$wb['Websites'] = 'Websites';
+$wb["Stats"] = 'Estatísticas';
+?>
diff --git a/interface/web/sites/lib/lang/br_cron.lng b/interface/web/sites/lib/lang/br_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_cron_list.lng b/interface/web/sites/lib/lang/br_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_database.lng b/interface/web/sites/lib/lang/br_database.lng
new file mode 100644
index 0000000..3530656
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_database.lng
@@ -0,0 +1,22 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Tipo';
+$wb["database_name_txt"] = 'Nome do Banco de Dados';
+$wb["database_user_txt"] = 'Usuário do Banco de Dados';
+$wb["database_password_txt"] = 'Senha do Banco de Dados';
+$wb["password_strength_txt"] = 'Segurança da Senha';
+$wb["database_charset_txt"] = 'Charset do Banco de Dados';
+$wb["remote_access_txt"] = 'Acesso Remoto';
+$wb["client_txt"] = 'Cliente';
+$wb["active_txt"] = 'Ativo';
+$wb["database_name_error_empty"] = 'O nome do banco está em branco.';
+$wb["database_name_error_unique"] = 'Já existe um banco de dados com este nome no servidor. O nome escolhido deve ser único.';
+$wb["database_name_error_regex"] = 'Nome do banco inválido. O nome do banco só pode conter estes caracteres: a-z, A-Z, 0-9 e o underscore. Tamanho: 2 - 64 caracteres.';
+$wb["database_user_error_empty"] = 'O nome do usuário está em branco.';
+$wb["database_user_error_unique"] = 'Já existe um banco de dados com este nome no servidor. O nome escolhido deve ser único.';
+$wb["database_user_error_regex"] = 'Nome do banco inválido. O nome do banco só pode conter estes caracteres: a-z, A-Z, 0-9 e o underscore. Tamanho: 2 - 64 caracteres.';
+$wb["limit_database_txt"] = 'O limite máximo de bancos de dados foi atingido.';
+$wb["database_name_change_txt"] = 'O nome do banco não pode ser modificado';
+$wb["database_charset_change_txt"] = 'O charset do banco não pode ser mudado';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_database_list.lng b/interface/web/sites/lib/lang/br_database_list.lng
new file mode 100644
index 0000000..133f502
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_database_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Banco de Dados';
+$wb["active_txt"] = 'Ativo';
+$wb["remote_access_txt"] = 'Acesso Remoto';
+$wb["server_id_txt"] = 'Servidor';
+$wb["database_name_txt"] = 'Nome do banco';
+$wb["add_new_record_txt"] = 'Adcionar um novo banco';
+?>
diff --git a/interface/web/sites/lib/lang/br_ftp_user.lng b/interface/web/sites/lib/lang/br_ftp_user.lng
new file mode 100644
index 0000000..fb30f46
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_ftp_user.lng
@@ -0,0 +1,27 @@
+<?php
+$wb["uid_txt"] = 'UID';
+$wb["gid_txt"] = 'GID';
+$wb["dir_txt"] = 'Diretório';
+$wb["quota_files_txt"] = 'Quota de Arquivo';
+$wb["quota_files_unity_txt"] = 'Arquivos';
+$wb["ul_ratio_txt"] = 'Taxa de Upload';
+$wb["dl_ratio_txt"] = 'Taxa de Download';
+$wb["ul_bandwidth_txt"] = 'Banda de Upload';
+$wb["dl_bandwidth_txt"] = 'Banda de Download';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["username_txt"] = 'Usuário';
+$wb["password_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Tamanho da senha';
+$wb["quota_size_txt"] = 'Quota de Disco';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_ftp_user_txt"] = 'O número máximo de usuários de FTP para sua conta foi atingido.';
+$wb["username_error_empty"] = 'Nome de usuário em branco.';
+$wb["username_error_unique"] = 'O nome de usuário deve ser único.';
+$wb["username_error_regex"] = 'The username contains charachters that are not allowed.';
+$wb["quota_size_error_empty"] = 'Quota em branco.';
+$wb["uid_error_empty"] = 'UID em branco.';
+$wb["uid_error_empty"] = 'GID em branco.';
+$wb["directory_error_empty"] = 'Diretório vazio.';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_ftp_user_list.lng b/interface/web/sites/lib/lang/br_ftp_user_list.lng
new file mode 100644
index 0000000..0e111c2
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_ftp_user_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuário-FTP';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Usuário';
+$wb["add_new_record_txt"] = 'Adcionar um novo Usuário FTP';
+?>
diff --git a/interface/web/sites/lib/lang/br_shell_user.lng b/interface/web/sites/lib/lang/br_shell_user.lng
new file mode 100644
index 0000000..80b144a
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_shell_user.lng
@@ -0,0 +1,23 @@
+<?php
+$wb["uid_txt"] = 'Nome do usuário';
+$wb["gid_txt"] = 'Groupo';
+$wb["shell_txt"] = 'Shell';
+$wb["dir_txt"] = 'Diretório';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Nome do usuário';
+$wb["password_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Dificuldade da senha';
+$wb["chroot_txt"] = 'Chroot Shell';
+$wb["quota_size_txt"] = 'Quota';
+$wb["active_txt"] = 'Ativo';
+$wb["username_error_empty"] = 'Nome de usuário em branco.';
+$wb["username_error_unique"] = 'O nome de usuário deve ser único.';
+$wb["username_error_regex"] = 'The username contains charachters that are not allowed.';
+$wb["quota_size_error_empty"] = 'Quota em branco.';
+$wb["uid_error_empty"] = 'UID em branco.';
+$wb["uid_error_empty"] = 'GID em branco.';
+$wb["directory_error_empty"] = 'Diretório vazio.';
+$wb["limit_shell_user_txt"] = 'O número máximo de usuários shell para sua conta foi atingido.';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_shell_user_list.lng b/interface/web/sites/lib/lang/br_shell_user_list.lng
new file mode 100644
index 0000000..d6080a7
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_shell_user_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuário de Shell';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Usuário';
+$wb["add_new_record_txt"] = 'Adcionar novo usuário de Shell';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng b/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng
new file mode 100644
index 0000000..3749d6e
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng
@@ -0,0 +1,11 @@
+<?php
+$wb["list_head_txt"] = 'Domínio Alias';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["domain_txt"] = 'Domínio Alias';
+$wb["add_new_record_txt"] = 'Adcionar novo domínio alias';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'O domínio deve ser único.';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_domain.lng b/interface/web/sites/lib/lang/br_web_domain.lng
new file mode 100644
index 0000000..5952956
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_domain.lng
@@ -0,0 +1,50 @@
+<?php
+$wb["ssl_state_txt"] = 'Estado';
+$wb["ssl_locality_txt"] = 'Localização';
+$wb["ssl_organisation_txt"] = 'Empresa';
+$wb["ssl_organisation_unit_txt"] = 'Departamento';
+$wb["ssl_country_txt"] = 'Pais';
+$wb["ssl_request_txt"] = 'Requisição SSL';
+$wb["ssl_cert_txt"] = 'Certificado SSL';
+$wb["ssl_bundle_txt"] = 'SSL Bundle';
+$wb["ssl_action_txt"] = 'SSL Action';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["type_txt"] = 'Tipo';
+$wb["parent_domain_id_txt"] = 'Site Parente';
+$wb["redirect_type_txt"] = 'Tipo Redirecionamento';
+$wb["redirect_path_txt"] = 'Caminho de redirecionamento';
+$wb["active_txt"] = 'Ativo';
+$wb["document_root_txt"] = 'Documentroot';
+$wb["system_user_txt"] = 'Usuário Linux';
+$wb["system_group_txt"] = 'Groupo Linux';
+$wb["ip_address_txt"] = 'Endereço-IP';
+$wb["vhost_type_txt"] = 'Tipo de VHost';
+$wb["hd_quota_txt"] = 'Quota de Disco';
+$wb["traffic_quota_txt"] = 'Quota de Tráfego';
+$wb["cgi_txt"] = 'CGI';
+$wb["ssi_txt"] = 'SSI';
+$wb["errordocs_txt"] = 'Suas Páginas de  Erro';
+$wb["subdomain_txt"] = 'Auto-Subdomínio';
+$wb["ssl_txt"] = 'SSL';
+$wb["suexec_txt"] = 'SuEXEC';
+$wb["php_txt"] = 'PHP';
+$wb["client_txt"] = 'Cliente';
+$wb["limit_web_domain_txt"] = 'O número máximo de domínios web para sua conta foi atingido.';
+$wb["limit_web_aliasdomain_txt"] = 'O número máximo de aliases domínio para sua conta foi atingido.';
+$wb["limit_web_subdomain_txt"] = 'O número máximo de sub-domínios para sua conta foi atingido.';
+$wb["apache_directives_txt"] = 'Diretivas do Apache';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'Já existe site, alias ou sub-domínio com este nome';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+$wb["hd_quota_error_empty"] = 'Quota de disco está em branco.';
+$wb["traffic_quota_error_empty"] = 'Quota de tráfego está em branco.';
+$wb['error_ssl_state_empty'] = 'Estado do SSL está em branco.';
+$wb['error_ssl_locality_empty'] = 'Localização do SSL está em branco.';
+$wb['error_ssl_organisation_empty'] = 'Empresa do SSL está em branco.';
+$wb['error_ssl_organisation_unit_empty'] = 'Departamento do SSL está em branco.';
+$wb['error_ssl_country_empty'] = 'Pais do SSL em branco.';
+$wb["client_group_id_txt"] = 'Cliente';
+$wb["stats_password_txt"] = 'Senha do diretório de estatísticas';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_web_domain_list.lng b/interface/web/sites/lib/lang/br_web_domain_list.lng
new file mode 100644
index 0000000..e48d6d3
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_domain_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Websites';
+$wb["domain_id_txt"] = 'ID';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar um novo site';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_sites_stats_list.lng b/interface/web/sites/lib/lang/br_web_sites_stats_list.lng
new file mode 100644
index 0000000..20f018b
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Web traffic';
+$wb["domain_txt"] = 'Domain';
+$wb["this_month_txt"] = 'This month';
+$wb["last_month_txt"] = 'Last month';
+$wb["this_year_txt"] = 'This year';
+$wb["last_year_txt"] = 'Last year';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_web_subdomain.lng b/interface/web/sites/lib/lang/br_web_subdomain.lng
new file mode 100644
index 0000000..66e162e
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_subdomain.lng
@@ -0,0 +1,39 @@
+<?php
+$wb["ssl_state_txt"] = 'Estado';
+$wb["ssl_locality_txt"] = 'Localidade';
+$wb["ssl_organisation_txt"] = 'Empresa';
+$wb["ssl_organisation_unit_txt"] = 'Departamento';
+$wb["ssl_country_txt"] = 'Pais';
+$wb["ssl_request_txt"] = 'Requisição SSL';
+$wb["ssl_cert_txt"] = 'Certificado SSL';
+$wb["ssl_bundle_txt"] = 'Pacote SSL';
+$wb["ssl_action_txt"] = 'Ação SSL';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["type_txt"] = 'Tipo';
+$wb["parent_domain_id_txt"] = 'Site Parente';
+$wb["redirect_type_txt"] = 'Tipo do Redirecionamento';
+$wb["redirect_path_txt"] = 'Caminho do Redirecionamento';
+$wb["active_txt"] = 'Ativo';
+$wb["document_root_txt"] = 'Documentroot';
+$wb["system_user_txt"] = 'Usuário no Linux';
+$wb["system_group_txt"] = 'Grupo no Linux';
+$wb["ip_address_txt"] = 'Endereço-IP';
+$wb["vhost_type_txt"] = 'Tipo de VHost';
+$wb["hd_quota_txt"] = 'Quota de Disco';
+$wb["traffic_quota_txt"] = 'Quota de Tráfico';
+$wb["cgi_txt"] = 'CGI';
+$wb["ssi_txt"] = 'SSI';
+$wb["ssl_txt"] = 'SSL';
+$wb["suexec_txt"] = 'SuEXEC';
+$wb["php_txt"] = 'PHP';
+$wb["client_txt"] = 'Cliente';
+$wb["limit_web_domain_txt"] = 'O número máximo de domínios web para esta conta foi atingido.';
+$wb["limit_web_aliasdomain_txt"] = 'O número máximo de aliases para esta conta foi atingido.';
+$wb["limit_web_subdomain_txt"] = 'O número máximo de sub-domínios para esta conta foi atingido.';
+$wb["apache_directives_txt"] = 'Diretivas apache';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'Já existe alias ou sub-domínio com este nome.';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+$wb["host_txt"] = 'Host';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_subdomain_list.lng b/interface/web/sites/lib/lang/br_web_subdomain_list.lng
new file mode 100644
index 0000000..364d321
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_subdomain_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Sub-domínios';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["domain_txt"] = 'Sub=domínio';
+$wb["add_new_record_txt"] = 'Adcionar um novo sub-domínio';
+?>
diff --git a/interface/web/sites/lib/lang/de_cron.lng b/interface/web/sites/lib/lang/de_cron.lng
new file mode 100644
index 0000000..c65bf38
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Zugeordnete Website';
+$wb['active_txt'] = 'Aktiv';
+$wb['client_txt'] = 'Kunde';
+$wb['run_min_txt'] = 'Minuten';
+$wb['run_hour_txt'] = 'Stunden';
+$wb['run_mday_txt'] = 'Tage des Monats';
+$wb['run_month_txt'] = 'Monate';
+$wb['run_wday_txt'] = 'Tage der Woche';
+$wb['command_txt'] = 'Auszuf&uuml;hrender Befehl (Befehle werden mit sh ausgef&uuml;hrt, urls mit wget)';
+$wb['limit_cron_txt'] = 'Die maximale Anzahl von erlaubten Cron Jobs ist bereits erreicht.';
+$wb['limit_cron_frequency_txt'] = 'Die Ausf&uuml;hrungsh&auml;ufigkeit &uuml;bersteigt Ihr erlaubtes Limit.';
+$wb['run_min_error_format'] = 'Das Format f&uuml;r Minuten ist nicht korrekt.';
+$wb['run_hour_error_format'] = 'Das Format f&uuml;r Stunden ist nicht korrekt.';
+$wb['run_mday_error_format'] = 'Das Format f&uuml;r Tage des Monats ist nicht korrekt.';
+$wb['run_month_error_format'] = 'Das Format f&uuml;r Monate ist nicht korrekt.';
+$wb['run_wday_error_format'] = 'Das Format f&uuml;r Wochentage ist nicht korrekt.';
+$wb['command_error_format'] = 'Das Format f&uuml;r den Befehl ist nicht korrekt. Beachte, dass bei einem URL Aufruf nur http und https erlaubt ist.';
+$wb['unknown_fieldtype_error'] = 'Es wurde ein unbekanntes Feld verwendet.';
+?>
diff --git a/interface/web/sites/lib/lang/de_cron_list.lng b/interface/web/sites/lib/lang/de_cron_list.lng
new file mode 100644
index 0000000..7cdfd3b
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Activ';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Stunde';
+$wb['run_mday_txt'] = 'Tag des Monats';
+$wb['run_month_txt'] = 'Monat';
+$wb['run_wday_txt'] = 'Tag der Woche';
+$wb['command_txt'] = 'Befehl';
+$wb['add_new_cron_txt'] = 'Neuen Cron Job anlegen';
+?>
diff --git a/interface/web/sites/lib/lang/de_database.lng b/interface/web/sites/lib/lang/de_database.lng
index 8224fa3..66241ef 100644
--- a/interface/web/sites/lib/lang/de_database.lng
+++ b/interface/web/sites/lib/lang/de_database.lng
@@ -6,6 +6,8 @@
 $wb['database_password_txt'] = 'Datenbank Passwort';
 $wb['database_charset_txt'] = 'Datenbank Zeichensatz';
 $wb['remote_access_txt'] = 'Remotezugang';
+$wb['remote_ips_txt'] = 'Remotezugang-IPs (mit Komma trennen, keine Eingabe f&uuml;r <i>alle</i>)';
+$wb['database_remote_error_ips'] = 'Mindestens eine der eingegebenen IP Adressen ist ung&uuml;ltig.';
 $wb['client_txt'] = 'Kunde';
 $wb['active_txt'] = 'Aktiv';
 $wb['database_name_error_empty'] = 'Datenbankname ist leer.';
diff --git a/interface/web/sites/lib/lang/de_ftp_user.lng b/interface/web/sites/lib/lang/de_ftp_user.lng
index ea02532..3991289 100644
--- a/interface/web/sites/lib/lang/de_ftp_user.lng
+++ b/interface/web/sites/lib/lang/de_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID ist leer.';
 $wb['directory_error_empty'] = 'Verzeichniss ist leer.';
 $wb['password_strength_txt'] = 'Passwortkomplexität';
+$wb['directory_error_notinweb'] = 'Das Verzeichnis befindet sich nicht innerhalb des Verzeichnisses der Website.';
 ?>
diff --git a/interface/web/sites/lib/lang/de_web_sites_stats_list.lng b/interface/web/sites/lib/lang/de_web_sites_stats_list.lng
new file mode 100644
index 0000000..660abfb
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web Datenverkehr';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Diesen Monat';
+$wb['last_month_txt'] = 'Letzten Monat';
+$wb['this_year_txt'] = 'Dieses Jahr';
+$wb['last_year_txt'] = 'Letztes Jahr';
+?>
diff --git a/interface/web/sites/lib/lang/en_cron.lng b/interface/web/sites/lib/lang/en_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_cron_list.lng b/interface/web/sites/lib/lang/en_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_database.lng b/interface/web/sites/lib/lang/en_database.lng
index df47802..555511a 100644
--- a/interface/web/sites/lib/lang/en_database.lng
+++ b/interface/web/sites/lib/lang/en_database.lng
@@ -7,6 +7,8 @@
 $wb["password_strength_txt"] = 'Password strength';
 $wb["database_charset_txt"] = 'Database charset';
 $wb["remote_access_txt"] = 'Remote Access';
+$wb["remote_ips_txt"] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.';
 $wb["client_txt"] = 'Client';
 $wb["active_txt"] = 'Active';
 $wb["database_name_error_empty"] = 'Database name is empty.';
diff --git a/interface/web/sites/lib/lang/en_ftp_user.lng b/interface/web/sites/lib/lang/en_ftp_user.lng
index 691bc7d..f5b1116 100644
--- a/interface/web/sites/lib/lang/en_ftp_user.lng
+++ b/interface/web/sites/lib/lang/en_ftp_user.lng
@@ -23,4 +23,6 @@
 $wb["uid_error_empty"] = 'UID empty.';
 $wb["uid_error_empty"] = 'GID empty.';
 $wb["directory_error_empty"] = 'Directory empty.';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
+$wb["parent_domain_id_error_empty"] = 'No website selected.';
 ?>
diff --git a/interface/web/sites/lib/lang/en_shell_user.lng b/interface/web/sites/lib/lang/en_shell_user.lng
index 45fb214..80e3e0a 100644
--- a/interface/web/sites/lib/lang/en_shell_user.lng
+++ b/interface/web/sites/lib/lang/en_shell_user.lng
@@ -19,4 +19,5 @@
 $wb["uid_error_empty"] = 'GID empty.';
 $wb["directory_error_empty"] = 'Directory empty.';
 $wb["limit_shell_user_txt"] = 'The max number of shell users is reached.';
+$wb["parent_domain_id_error_empty"] = 'No website selected.';
 ?>
diff --git a/interface/web/sites/lib/lang/en_web_sites_stats_list.lng b/interface/web/sites/lib/lang/en_web_sites_stats_list.lng
new file mode 100644
index 0000000..20f018b
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Web traffic';
+$wb["domain_txt"] = 'Domain';
+$wb["this_month_txt"] = 'This month';
+$wb["last_month_txt"] = 'Last month';
+$wb["this_year_txt"] = 'This year';
+$wb["last_year_txt"] = 'Last year';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_cron.lng b/interface/web/sites/lib/lang/es_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_cron_list.lng b/interface/web/sites/lib/lang/es_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_database.lng b/interface/web/sites/lib/lang/es_database.lng
index 1a8e0c1..10f5832 100644
--- a/interface/web/sites/lib/lang/es_database.lng
+++ b/interface/web/sites/lib/lang/es_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'Se ha alcanzado el número máximo de bases de datos';
 $wb['database_name_change_txt'] = 'El nombre de la base de datos no se puede cambiar';
 $wb['database_charset_change_txt'] = 'La tabla de caracteres de la base de datos no se puede cambiar';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/es_ftp_user.lng b/interface/web/sites/lib/lang/es_ftp_user.lng
index 53f6907..148cdc9 100644
--- a/interface/web/sites/lib/lang/es_ftp_user.lng
+++ b/interface/web/sites/lib/lang/es_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID vacío';
 $wb['directory_error_empty'] = 'Directorio vacío';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/es_web_sites_stats_list.lng b/interface/web/sites/lib/lang/es_web_sites_stats_list.lng
new file mode 100644
index 0000000..b2dd3e9
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Tráfico de xxxx';
+$wb['domain_txt'] = 'xxxx';
+$wb['this_month_txt'] = 'Este mes';
+$wb['last_month_txt'] = 'Último mes';
+$wb['this_year_txt'] = 'Este año';
+$wb['last_year_txt'] = 'Último año';
+?>
diff --git a/interface/web/sites/lib/lang/fi_cron.lng b/interface/web/sites/lib/lang/fi_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/fi_cron_list.lng b/interface/web/sites/lib/lang/fi_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/fi_database.lng b/interface/web/sites/lib/lang/fi_database.lng
index ce65740..e903395 100755
--- a/interface/web/sites/lib/lang/fi_database.lng
+++ b/interface/web/sites/lib/lang/fi_database.lng
@@ -18,4 +18,6 @@
 $wb['password_strength_txt'] = 'Salasanan vahvuus';
 $wb['database_charset_txt'] = 'Tietokannan merkistö';
 $wb['database_charset_change_txt'] = 'Tietokannan merkistöä ei voi vaihtaa';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/fi_ftp_user.lng b/interface/web/sites/lib/lang/fi_ftp_user.lng
index 249bf3c..9cdfa08 100755
--- a/interface/web/sites/lib/lang/fi_ftp_user.lng
+++ b/interface/web/sites/lib/lang/fi_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['directory_error_empty'] = 'Kotihakemisto-kenttä on tyhjä.';
 $wb['password_strength_txt'] = 'Salasanan vahvuus';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng b/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng
new file mode 100755
index 0000000..cecf3e3
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Sähköpostiliikenne';
+$wb['domain_txt'] = 'Sähköpostiosoite';
+$wb['this_month_txt'] = 'Tässä kuussa';
+$wb['last_month_txt'] = 'Viime kuussa';
+$wb['this_year_txt'] = 'Tänä vuonna';
+$wb['last_year_txt'] = 'Viime vuonna';
+?>
diff --git a/interface/web/sites/lib/lang/fr_cron.lng b/interface/web/sites/lib/lang/fr_cron.lng
new file mode 100644
index 0000000..fecb4ab
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
diff --git a/interface/web/sites/lib/lang/fr_cron_list.lng b/interface/web/sites/lib/lang/fr_cron_list.lng
new file mode 100644
index 0000000..ad56ea9
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Active';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Hour';
+$wb['run_mday_txt'] = 'Day of month';
+$wb['run_month_txt'] = 'Month';
+$wb['run_wday_txt'] = 'Day of week';
+$wb['command_txt'] = 'Command';
+$wb['add_new_cron_txt'] = 'Add new Cron job';
+?>
diff --git a/interface/web/sites/lib/lang/fr_database.lng b/interface/web/sites/lib/lang/fr_database.lng
index 4dbd36f..42a4b3c 100644
--- a/interface/web/sites/lib/lang/fr_database.lng
+++ b/interface/web/sites/lib/lang/fr_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'The max. number of databases is reached.';
 $wb['database_name_change_txt'] = 'The database name can not be changed';
 $wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/fr_ftp_user.lng b/interface/web/sites/lib/lang/fr_ftp_user.lng
index 7ebbcc4..df48d9a 100644
--- a/interface/web/sites/lib/lang/fr_ftp_user.lng
+++ b/interface/web/sites/lib/lang/fr_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID empty.';
 $wb['directory_error_empty'] = 'Directory empty.';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng b/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/it_cron.lng b/interface/web/sites/lib/lang/it_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/it_cron_list.lng b/interface/web/sites/lib/lang/it_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/it_database.lng b/interface/web/sites/lib/lang/it_database.lng
index ff217b4..a8f6009 100644
--- a/interface/web/sites/lib/lang/it_database.lng
+++ b/interface/web/sites/lib/lang/it_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'The max. number of databases is reached.';
 $wb['database_name_change_txt'] = 'The database name can not be changed';
 $wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/it_ftp_user.lng b/interface/web/sites/lib/lang/it_ftp_user.lng
index 565b5ba..4a5893c 100644
--- a/interface/web/sites/lib/lang/it_ftp_user.lng
+++ b/interface/web/sites/lib/lang/it_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID empty.';
 $wb['directory_error_empty'] = 'Directory empty.';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/it_web_sites_stats_list.lng b/interface/web/sites/lib/lang/it_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/nl_cron.lng b/interface/web/sites/lib/lang/nl_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/nl_cron_list.lng b/interface/web/sites/lib/lang/nl_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/nl_database.lng b/interface/web/sites/lib/lang/nl_database.lng
index b7275a6..afb759f 100644
--- a/interface/web/sites/lib/lang/nl_database.lng
+++ b/interface/web/sites/lib/lang/nl_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'The max. aantal databases is bereikt.';
 $wb['database_name_change_txt'] = 'De databasenaam kan niet worden gewijzigd.';
 $wb['database_charset_change_txt'] = 'The database karakterset kan niet gewijzigd worden.';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/nl_ftp_user.lng b/interface/web/sites/lib/lang/nl_ftp_user.lng
index 4100536..ed5cce6 100644
--- a/interface/web/sites/lib/lang/nl_ftp_user.lng
+++ b/interface/web/sites/lib/lang/nl_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID is leeg.';
 $wb['directory_error_empty'] = 'Directorie is leeg.';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng b/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng
new file mode 100644
index 0000000..45bcd77
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web verkeer';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Deze maand';
+$wb['last_month_txt'] = 'Laatste maand';
+$wb['this_year_txt'] = 'Dit jaar';
+$wb['last_year_txt'] = 'Vorig jaar';
+?>
diff --git a/interface/web/sites/lib/lang/ru_cron.lng b/interface/web/sites/lib/lang/ru_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/ru_cron_list.lng b/interface/web/sites/lib/lang/ru_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/ru_database.lng b/interface/web/sites/lib/lang/ru_database.lng
index 7d361a6..eda3a42 100644
--- a/interface/web/sites/lib/lang/ru_database.lng
+++ b/interface/web/sites/lib/lang/ru_database.lng
@@ -18,4 +18,6 @@
 $wb['database_name_change_txt'] = 'The database name can not be changed';
 $wb['database_charset_change_txt'] = 'The database charset can not be changed';
 $wb['password_strength_txt'] = 'Password strength';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/ru_ftp_user.lng b/interface/web/sites/lib/lang/ru_ftp_user.lng
index 178dcfe..7c89c2e 100644
--- a/interface/web/sites/lib/lang/ru_ftp_user.lng
+++ b/interface/web/sites/lib/lang/ru_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['directory_error_empty'] = 'Directory empty.';
 $wb['password_strength_txt'] = 'Password strength';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng b/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng
new file mode 100644
index 0000000..58a4db0
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web трафик';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Этот месяц';
+$wb['last_month_txt'] = 'Последний месяц';
+$wb['this_year_txt'] = 'Этот год';
+$wb['last_year_txt'] = 'Последний год';
+?>
diff --git a/interface/web/sites/lib/lang/se_cron.lng b/interface/web/sites/lib/lang/se_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/se_cron_list.lng b/interface/web/sites/lib/lang/se_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/se_database.lng b/interface/web/sites/lib/lang/se_database.lng
index 4dbd36f..42a4b3c 100644
--- a/interface/web/sites/lib/lang/se_database.lng
+++ b/interface/web/sites/lib/lang/se_database.lng
@@ -18,4 +18,6 @@
 $wb['limit_database_txt'] = 'The max. number of databases is reached.';
 $wb['database_name_change_txt'] = 'The database name can not be changed';
 $wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
 ?>
diff --git a/interface/web/sites/lib/lang/se_ftp_user.lng b/interface/web/sites/lib/lang/se_ftp_user.lng
index 7ebbcc4..df48d9a 100644
--- a/interface/web/sites/lib/lang/se_ftp_user.lng
+++ b/interface/web/sites/lib/lang/se_ftp_user.lng
@@ -22,4 +22,5 @@
 $wb['uid_error_empty'] = 'GID empty.';
 $wb['directory_error_empty'] = 'Directory empty.';
 $wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
 ?>
diff --git a/interface/web/sites/lib/lang/se_web_sites_stats_list.lng b/interface/web/sites/lib/lang/se_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/module.conf.php b/interface/web/sites/lib/module.conf.php
index 1992fbb..3207caf 100644
--- a/interface/web/sites/lib/module.conf.php
+++ b/interface/web/sites/lib/module.conf.php
@@ -20,9 +20,9 @@
 				  'link'	=> 'sites/web_subdomain_list.php');
 
 
-$items[] = array( 'title' 	=> "Aliasdomain",
-				  'target' 	=> 'content',
-				  'link'	=> 'sites/web_aliasdomain_list.php');
+$items[] = array( 'title'   => "Aliasdomain",
+                  'target'  => 'content',
+                  'link'    => 'sites/web_aliasdomain_list.php');
 
 $module["nav"][] = array(	'title'	=> 'Websites',
 							'open' 	=> 1,
@@ -76,6 +76,36 @@
 							'open' 	=> 1,
 							'items'	=> $items);
 
+
+/*
+    Cron menu
+*/
+$items = array();
+
+$items[] = array( 'title'   => "Cron Jobs",
+                  'target'  => 'content',
+                  'link'    => 'sites/cron_list.php');
+
+
+$module["nav"][] = array(   'title' => 'Cron',
+                            'open'  => 1,
+                            'items' => $items);
+
+
+//**** Statistics menu
+$items = array();
+
+$items[] = array( 'title'   => 'Web traffic',
+                  'target'  => 'content',
+                  'link'    => 'sites/web_sites_stats.php');
+
+
+$module['nav'][] = array(   'title' => 'Statistics',
+                            'open'  => 1,
+                            'items' => $items);
+                            
+                            
+
 // clean up
 unset($items);
 
diff --git a/interface/web/sites/list/cron.list.php b/interface/web/sites/list/cron.list.php
new file mode 100644
index 0000000..dfa2d4b
--- /dev/null
+++ b/interface/web/sites/list/cron.list.php
@@ -0,0 +1,152 @@
+<?php
+
+/*
+	Datatypes:
+	- INTEGER
+	- DOUBLE
+	- CURRENCY
+	- VARCHAR
+	- TEXT
+	- DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] 				= "cron";
+
+// Database table
+$liste["table"] 			= "cron";
+
+// Index index field of the database table
+$liste["table_idx"]			= "id";
+
+// Search Field Prefix
+$liste["search_prefix"] 	= "search_";
+
+// Records per page
+$liste["records_per_page"] 	= 15;
+
+// Script File of the list
+$liste["file"]				= "cron_list.php";
+
+// Script file of the edit form
+$liste["edit_file"]			= "cron_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"]		= "cron_del.php";
+
+// Paging Template
+$liste["paging_tpl"]		= "templates/paging.tpl.htm";
+
+// Enable auth
+$liste["auth"]				= "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+
+$liste["item"][] = array(	'field'		=> "active",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "SELECT",
+							'op'		=> "=",
+							'prefix'	=> "",
+							'suffix'	=> "",
+							'width'		=> "",
+							'value'		=> array('y' => "<div id=\"ir-Yes\" class=\"swap\"><span>Yes</span></div>",'n' => "<div class=\"swap\" id=\"ir-No\"><span>No</span></div>"));
+
+
+$liste["item"][] = array(	'field'		=> "server_id",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "SELECT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'datasource'	=> array ( 	'type'	=> 'SQL',
+														'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name',
+														'keyfield'=> 'server_id',
+														'valuefield'=> 'server_name'
+									 				  ),
+							'width'		=> "",
+							'value'		=> "");
+
+$liste["item"][] = array(   'field'     => "parent_domain_id",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "SELECT",
+                            'op'        => "like",
+                            'prefix'    => "%",
+                            'suffix'    => "%",
+                            'datasource'    => array (  'type'  => 'SQL',
+                                        'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain",
+                                        'keyfield'=> 'domain_id',
+                                        'valuefield'=> 'domain'
+                                     ),
+                            'width'     => "",
+                            'value'     => "");
+
+$liste["item"][] = array(   'field'     => "run_min",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "TEXT",
+                            'op'        => "=",
+                            'prefix'    => "",
+                            'suffix'    => "",
+                            'width'     => "",
+                            'value'     => "");
+
+$liste["item"][] = array(   'field'     => "run_hour",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "TEXT",
+                            'op'        => "=",
+                            'prefix'    => "",
+                            'suffix'    => "",
+                            'width'     => "",
+                            'value'     => "");
+
+$liste["item"][] = array(   'field'     => "run_mday",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "TEXT",
+                            'op'        => "=",
+                            'prefix'    => "",
+                            'suffix'    => "",
+                            'width'     => "",
+                            'value'     => "");
+
+$liste["item"][] = array(   'field'     => "run_month",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "TEXT",
+                            'op'        => "=",
+                            'prefix'    => "",
+                            'suffix'    => "",
+                            'width'     => "",
+                            'value'     => "");
+
+$liste["item"][] = array(   'field'     => "run_wday",
+                            'datatype'  => "VARCHAR",
+                            'formtype'  => "TEXT",
+                            'op'        => "=",
+                            'prefix'    => "",
+                            'suffix'    => "",
+                            'width'     => "",
+                            'value'     => "");
+
+
+$liste["item"][] = array(	'field'		=> "command",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");
+
+
+
+
+
+
+
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/list/web_sites_stats.list.php b/interface/web/sites/list/web_sites_stats.list.php
new file mode 100644
index 0000000..0824ba9
--- /dev/null
+++ b/interface/web/sites/list/web_sites_stats.list.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+	Datatypes:
+	- INTEGER
+	- DOUBLE
+	- CURRENCY
+	- VARCHAR
+	- TEXT
+	- DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] 				= "web_sites_stats";
+
+// Database table
+$liste["table"] 			= "web_domain";
+
+// Index index field of the database table
+$liste["table_idx"]			= "domain_id";
+
+// Search Field Prefix
+$liste["search_prefix"] 	= "search_";
+
+// Records per page
+$liste["records_per_page"] 	= 15;
+
+// Script File of the list
+$liste["file"]				= "web_sites_stats.php";
+
+// Script file of the edit form
+$liste["edit_file"]			= "web_domain_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"]		= "web_domain_del.php";
+
+// Paging Template
+$liste["paging_tpl"]		= "templates/paging.tpl.htm";
+
+// Enable auth
+$liste["auth"]				= "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+$liste["item"][] = array(	'field'		=> "domain",
+							'datatype'	=> "VARCHAR",
+							'formtype'	=> "TEXT",
+							'op'		=> "like",
+							'prefix'	=> "%",
+							'suffix'	=> "%",
+							'width'		=> "",
+							'value'		=> "");
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/shell_user_edit.php b/interface/web/sites/shell_user_edit.php
index 8c92732..422c8a1 100644
--- a/interface/web/sites/shell_user_edit.php
+++ b/interface/web/sites/shell_user_edit.php
@@ -56,17 +56,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_shell_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another shell user.
-			if($client["limit_shell_user"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE sys_groupid = $client_group_id");
-				if($tmp["number"] >= $client["limit_shell_user"]) {
-					$app->error($app->tform->wordbook["limit_shell_user_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_shell_user')) {
+				$app->error($app->tform->wordbook["limit_shell_user_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_shell_user')) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_shell_user_txt"]);
 			}
 		}
 		
@@ -115,6 +109,9 @@
 		// Set a few fixed values
 		$this->dataRecord["server_id"] = $parent_domain["server_id"];
 		
+		if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'<br />';
+		if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'<br />';
+		
 		parent::onSubmit();
 	}
 	
@@ -129,7 +126,7 @@
 			}
 		}
 		unset($blacklist);
-
+		
 		/*
 		 * If the names should be restricted -> do it!
 		 */
diff --git a/interface/web/sites/templates/cron_edit.htm b/interface/web/sites/templates/cron_edit.htm
new file mode 100644
index 0000000..39f9bc6
--- /dev/null
+++ b/interface/web/sites/templates/cron_edit.htm
@@ -0,0 +1,68 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_cron">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>Cron Job</legend>
+      <div class="ctrlHolder">
+        <tmpl_if name="edit_disabled">
+        <label for="parent_domain_id">{tmpl_var name='parent_domain_id_txt'}</label>
+        <select name="parent_domain_id" id="parent_domain_id" class="selectInput" disabled="disabled">
+                    {tmpl_var name='parent_domain_id'}
+        </select>
+        <input type="hidden" name="parent_domain_id" value="{tmpl_var name='parent_domain_id_value'}" />
+        <tmpl_else>
+        <label for="parent_domain_id">{tmpl_var name='parent_domain_id_txt'}</label>
+        <select name="parent_domain_id" id="parent_domain_id" class="selectInput">
+                    {tmpl_var name='parent_domain_id'}
+        </select>
+        </tmpl_if>
+      </div>
+      <div class="ctrlHolder">
+        <label for="run_min">{tmpl_var name='run_min_txt'}</label>
+        <input name="run_min" id="run_min" value="{tmpl_var name='run_min'}" size="10" maxlength="255" type="text" class="textInput" />
+                <p class="formHint">e.g. *, */3, 10-20</p>
+            </div>
+      <div class="ctrlHolder">
+        <label for="run_hour">{tmpl_var name='run_hour_txt'}</label>
+        <input name="run_hour" id="run_hour" value="{tmpl_var name='run_hour'}" size="10" maxlength="255" type="text" class="textInput" />
+                <p class="formHint">e.g. *, */2, 0, 10-12</p>
+            </div>
+      <div class="ctrlHolder">
+        <label for="run_mday">{tmpl_var name='run_mday_txt'}</label>
+        <input name="run_mday" id="run_mday" value="{tmpl_var name='run_mday'}" size="10" maxlength="255" type="text" class="textInput" />
+                <p class="formHint">e.g. *, */4, 1-5</p>
+            </div>
+      <div class="ctrlHolder">
+        <label for="run_month">{tmpl_var name='run_month_txt'}</label>
+        <input name="run_month" id="run_month" value="{tmpl_var name='run_month'}" size="10" maxlength="255" type="text" class="textInput" />
+                <p class="formHint">e.g. *, 1-6</p>
+            </div>
+      <div class="ctrlHolder">
+        <label for="run_wday">{tmpl_var name='run_wday_txt'}</label>
+        <input name="run_wday" id="run_wday" value="{tmpl_var name='run_wday'}" size="10" maxlength="255" type="text" class="textInput" />
+                <p class="formHint">e.g. *, 0, 1-5</p>
+            </div>
+      <div class="ctrlHolder">
+      	<label for="command">{tmpl_var name='command_txt'}</label>
+        <input name="command" id="command" value="{tmpl_var name='command'}" size="30" maxlength="255" type="text" class="textInput" />
+				<p class="formHint">e.g. /var/www/clients/client1/myscript.sh or http://www.mydomain.com/path/script.php</p>
+			</div>
+      <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='active_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='active'}
+					</div>
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+    
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','sites/cron_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('sites/cron_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/sites/templates/cron_list.htm b/interface/web/sites/templates/cron_list.htm
new file mode 100644
index 0000000..e2e8ca9
--- /dev/null
+++ b/interface/web/sites/templates/cron_list.htm
@@ -0,0 +1,71 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_cron">
+
+  <div class="pnl_toolsarea">
+    <fieldset><legend>Tools</legend>
+      <div class="buttons">
+        <button class="iconstxt icoAdd" type="button" onClick="loadContent('sites/cron_edit.php');">
+          <span>{tmpl_var name="add_new_cron_txt"}</span>
+        </button>
+      </div>
+    </fieldset>
+  </div>
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_active" scope="col"><tmpl_var name="active_txt"></th>
+            <th class="tbl_col_server_id" scope="col"><tmpl_var name="server_id_txt"></th>
+            <th class="tbl_col_run_min" scope="col"><tmpl_var name="run_min_txt"></th>
+            <th class="tbl_col_run_hour" scope="col"><tmpl_var name="run_hour_txt"></th>
+            <th class="tbl_col_run_mday" scope="col"><tmpl_var name="run_mday_txt"></th>
+            <th class="tbl_col_run_month" scope="col"><tmpl_var name="run_month_txt"></th>
+            <th class="tbl_col_run_wday" scope="col"><tmpl_var name="run_wday_txt"></th>
+            <th class="tbl_col_command" scope="col"><tmpl_var name="command_txt"></th>
+            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_active"><select name="search_active" onChange="submitForm('pageForm','sites/cron_list.php');">{tmpl_var name='search_active'}</select></td>
+            <td class="tbl_col_server_id"><select name="search_server_id" onChange="submitForm('pageForm','sites/cron_list.php');">{tmpl_var name='search_server_id'}</select></td>
+            <td class="tbl_col_run_min"><input type="text" name="search_run_min" size="3" value="{tmpl_var name='search_run_min'}" /></td>
+            <td class="tbl_col_run_hour"><input type="text" name="search_run_hour" size="3" value="{tmpl_var name='search_run_hour'}" /></td>
+            <td class="tbl_col_run_mday"><input type="text" name="search_run_mday" size="3" value="{tmpl_var name='search_run_mday'}" /></td>
+            <td class="tbl_col_run_month"><input type="text" name="search_run_month" size="3" value="{tmpl_var name='search_run_month'}" /></td>
+            <td class="tbl_col_run_wday"><input type="text" name="search_run_wday" size="3" value="{tmpl_var name='search_run_wday'}" /></td>
+            <td class="tbl_col_command"><input type="text" name="search_command" value="{tmpl_var name='search_command'}" /></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','sites/cron_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_active"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');"><img src="themes/{tmpl_var name='theme'}/icons/{tmpl_var name='_active_'}" border="0" /></a></td>
+            <td class="tbl_col_server_id"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_id"}</a></td>
+            <td class="tbl_col_run_min"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_min"}</a></td>
+            <td class="tbl_col_run_hour"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_hour"}</a></td>
+            <td class="tbl_col_run_mday"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_mday"}</a></td>
+            <td class="tbl_col_run_month"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_month"}</a></td>
+            <td class="tbl_col_run_wday"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_wday"}</a></td>
+            <td class="tbl_col_commnd"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="command"}</a></td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+                <a class="icons16 icoDelete" href="javascript: del_record('sites/cron_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="9"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/sites/templates/database_edit.htm b/interface/web/sites/templates/database_edit.htm
index cb982f3..da5ffec 100644
--- a/interface/web/sites/templates/database_edit.htm
+++ b/interface/web/sites/templates/database_edit.htm
@@ -80,11 +80,15 @@
 		</tmpl_if>
       </div>
       <div class="ctrlHolder">
-				<p class="label">{tmpl_var name='remote_access_txt'}</p>
-					<div class="multiField">
-						{tmpl_var name='remote_access'}
-					</div>
-			</div>
+        <p class="label">{tmpl_var name='remote_access_txt'}</p>
+          <div class="multiField">
+            {tmpl_var name='remote_access'}
+          </div>
+      </div>
+      <div class="ctrlHolder">
+        <label for="remote_ips">{tmpl_var name='remote_ips_txt'}</label>
+        <input name="remote_ips" id="remote_ips" value="{tmpl_var name='remote_ips'}" size="60" type="text" class="textInput formLengthHalf" />
+      </div>
       <div class="ctrlHolder">
 				<p class="label">{tmpl_var name='active_txt'}</p>
 					<div class="multiField">
diff --git a/interface/web/sites/templates/ftp_user_advanced_client.htm b/interface/web/sites/templates/ftp_user_advanced_client.htm
new file mode 100644
index 0000000..fd8d617
--- /dev/null
+++ b/interface/web/sites/templates/ftp_user_advanced_client.htm
@@ -0,0 +1,22 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_ftp_user">
+
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="dir">{tmpl_var name='dir_txt'}</label>
+        <input name="dir" id="dir" value="{tmpl_var name='dir'}" size="30" maxlength="255" type="text" class="textInput" />
+			</div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','sites/ftp_user_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('sites/ftp_user_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/interface/web/sites/templates/web_sites_stats_list.htm b/interface/web/sites/templates/web_sites_stats_list.htm
new file mode 100644
index 0000000..84a9b97
--- /dev/null
+++ b/interface/web/sites/templates/web_sites_stats_list.htm
@@ -0,0 +1,52 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_web_sites_stats">
+
+  <div class="pnl_listarea">
+    <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+      <table class="list">
+        <thead>
+          <tr>
+            <th class="tbl_col_domain" scope="col"><tmpl_var name="domain_txt"></th>
+            <th class="tbl_col_this_month" scope="col"><tmpl_var name="this_month_txt"></th>
+            <th class="tbl_col_last_month" scope="col"><tmpl_var name="last_month_txt"></th>
+            <th class="tbl_col_this_year" scope="col"><tmpl_var name="this_year_txt"></th>
+            <th class="tbl_col_last_year" scope="col"><tmpl_var name="last_year_txt"></th>
+            <th class="tbl_col_buttons" scope="col">&nbsp;</th>
+          </tr>
+          <tr>
+            <td class="tbl_col_domain"><input type="text" name="search_domain" value="{tmpl_var name='search_domain'}" /></td>
+            <td class="tbl_col_this_month"></td>
+            <td class="tbl_col_last_month"></td>
+            <td class="tbl_col_this_year"></td>
+            <td class="tbl_col_last_year"></td>
+            <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','sites/web_sites_stats.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></td>
+          </tr>
+        </thead>
+        <tbody>
+          <tmpl_loop name="records">
+          <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
+            <td class="tbl_col_domain"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="domain"}</a></td>
+            <td class="tbl_col_this_month"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="this_month"} kB</a></td>
+            <td class="tbl_col_last_month"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="last_month"} kB</a></td>
+            <td class="tbl_col_this_year"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="this_year"} kB</a></td>
+            <td class="tbl_col_last_year"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="last_year"} kB</a></td>
+            <td class="tbl_col_buttons">
+              <div class="buttons icons16">    
+              </div>
+            </td>
+          </tr>
+          </tmpl_loop>
+        </tbody>
+
+        <tfoot>
+          <tr>
+            <td class="tbl_footer tbl_paging" colspan="6"><tmpl_var name="paging"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </fieldset>
+  </div>
+
+</div>
diff --git a/interface/web/sites/web_aliasdomain_edit.php b/interface/web/sites/web_aliasdomain_edit.php
index 0f86b62..1fdd8fe 100644
--- a/interface/web/sites/web_aliasdomain_edit.php
+++ b/interface/web/sites/web_aliasdomain_edit.php
@@ -57,17 +57,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_web_aliasdomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another maildomain.
-			if($client["limit_web_aliasdomain"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'alias'");
-				if($tmp["number"] >= $client["limit_web_aliasdomain"]) {
-					$app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_web_aliasdomain',"type = 'alias'")) {
+				$app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_web_aliasdomain',"type = 'alias'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_web_aliasdomain_txt"]);
 			}
 		}
 		
diff --git a/interface/web/sites/web_domain_del.php b/interface/web/sites/web_domain_del.php
index 867d1f4..e5614cf 100644
--- a/interface/web/sites/web_domain_del.php
+++ b/interface/web/sites/web_domain_del.php
@@ -72,6 +72,12 @@
 		foreach($records as $rec) {
 			$app->db->datalogDelete('shell_user','shell_user_id',$rec['shell_user_id']);
 		}
+        
+        // Delete all records that belog to this zone.
+        $records = $app->db->queryAllRecords("SELECT id FROM cron WHERE parent_domain_id = '".intval($this->id)."'");
+        foreach($records as $rec) {
+            $app->db->datalogDelete('cron','id',$rec['id']);
+        }
 	}
 }
 
diff --git a/interface/web/sites/web_domain_edit.php b/interface/web/sites/web_domain_edit.php
index d9d210f..7878e82 100644
--- a/interface/web/sites/web_domain_edit.php
+++ b/interface/web/sites/web_domain_edit.php
@@ -55,17 +55,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_web_domain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another website.
-			if($client["limit_web_domain"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'vhost'");
-				if($tmp["number"] >= $client["limit_web_domain"]) {
-					$app->error($app->tform->wordbook["limit_web_domain_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_web_domain',"type = 'vhost'")) {
+				$app->error($app->tform->wordbook["limit_web_domain_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_web_domain',"type = 'vhost'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_web_domain_txt"]);
 			}
 		}
 		
@@ -109,7 +103,7 @@
 			
 			// Get the limits of the client
 			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			$client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
 			
 			// Set the webserver to the default server of the client
 			$tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]");
@@ -119,7 +113,7 @@
 			// Fill the client select field
 			$sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
 			$clients = $app->db->queryAllRecords($sql);
-			$client_select = '';
+			$client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
 			if(is_array($clients)) {
 				foreach( $clients as $client) {
 					$selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
@@ -207,7 +201,7 @@
 		if($_SESSION["s"]["user"]["typ"] != 'admin') {
 			// Get the limits of the client
 			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+			$client = $app->db->queryOneRecord("SELECT limit_web_domain, default_webserver, parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
 			
 			// When the record is updated
 			if($this->id > 0) {
@@ -294,6 +288,16 @@
 				}
 				unset($rec);
 			}
+		//* If the user is neither admin nor reseller
+		} else {
+			//* We do not allow users to change a domain which has been created by the admin
+			$rec = $app->db->queryOneRecord("SELECT domain from web_domain WHERE domain_id = ".$this->id);
+			if(isset($this->dataRecord["domain"]) && $rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) {
+				//* Add a error message and switch back to old server
+				$app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.');
+				$this->dataRecord["domain"] = $rec['domain'];
+			}
+			unset($rec);
 		}
 		
 		//* Check that all fields for the SSL cert creation are filled
@@ -342,10 +346,10 @@
 			// Set the values for document_root, system_user and system_group
 			$system_user = 'web'.$this->id;
 			$system_group = 'client'.$client_id;
-			//$document_root = str_replace("[client_id]",$client_id,$document_root);
+			$document_root = str_replace("[client_id]",$client_id,$document_root);
 		
-			// $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id;
-			$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id;
+			$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id;
+			//$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id;
 			$app->db->query($sql);
 		}
 		
diff --git a/interface/web/sites/web_sites_stats.php b/interface/web/sites/web_sites_stats.php
new file mode 100644
index 0000000..ee8fd58
--- /dev/null
+++ b/interface/web/sites/web_sites_stats.php
@@ -0,0 +1,64 @@
+<?php
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/web_sites_stats.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->load('listform_actions');
+
+class list_action extends listform_actions {
+	
+	function prepareDataRow($rec)
+    {
+		global $app;
+		
+		$rec = $app->listform->decode($rec);
+
+		//* Alternating datarow colors
+		$this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF';
+		$rec['bgcolor'] = $this->DataRowColor;
+		
+		//* Set the statistics colums
+		//** Traffic of the current month
+		$tmp_year = date('Y');
+        $tmp_month = date('m');
+		$tmp_rec = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'");
+		$rec['this_month'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+		
+		//** Traffic of the current year
+		$tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'");
+		$rec['this_year'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+		
+		//** Traffic of the last month
+        $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
+        $tmp_month = date('m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
+		$tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'");
+		$rec['last_month'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+		
+		//** Traffic of the last year
+		$tmp_year = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1));
+		$tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'");
+		$rec['last_year'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+		
+		//* The variable "id" contains always the index variable
+		$rec['id'] = $rec[$this->idx_key];
+		return $rec;
+	}
+}
+
+$list = new list_action;
+$list->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/web_subdomain_edit.php b/interface/web/sites/web_subdomain_edit.php
index 3dd2f64..2858e34 100644
--- a/interface/web/sites/web_subdomain_edit.php
+++ b/interface/web/sites/web_subdomain_edit.php
@@ -57,17 +57,11 @@
 		
 		// we will check only users, not admins
 		if($_SESSION["s"]["user"]["typ"] == 'user') {
-			
-			// Get the limits of the client
-			$client_group_id = $_SESSION["s"]["user"]["default_group"];
-			$client = $app->db->queryOneRecord("SELECT limit_web_subdomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-			
-			// Check if the user may add another maildomain.
-			if($client["limit_web_subdomain"] >= 0) {
-				$tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'subdomain'");
-				if($tmp["number"] >= $client["limit_web_subdomain"]) {
-					$app->error($app->tform->wordbook["limit_web_subdomain_txt"]);
-				}
+			if(!$app->tform->checkClientLimit('limit_web_subdomain',"type = 'subdomain'")) {
+				$app->error($app->tform->wordbook["limit_web_subdomain_txt"]);
+			}
+			if(!$app->tform->checkResellerLimit('limit_web_subdomain',"type = 'subdomain'")) {
+				$app->error('Reseller: '.$app->tform->wordbook["limit_web_subdomain_txt"]);
 			}
 		}
 		
diff --git a/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng b/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng
new file mode 100644
index 0000000..b7641dd
--- /dev/null
+++ b/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['password_strength_0_txt'] = 'Muito Curto';
+$wb['password_strength_1_txt'] = 'Fraco';
+$wb['password_strength_2_txt'] = 'Rasoável';
+$wb['password_strength_3_txt'] = 'Bom';
+$wb['password_strength_4_txt'] = 'Forte';
+$wb['password_strength_5_txt'] = 'Muito Forte';
+?>
+
diff --git a/interface/web/tools/lib/lang/br.lng b/interface/web/tools/lib/lang/br.lng
new file mode 100644
index 0000000..0dab14b
--- /dev/null
+++ b/interface/web/tools/lib/lang/br.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['User Settings'] = 'Configurações do Usuário';
+$wb['Settings'] = 'Configurações';
+$wb['ISPConfig Tools'] = 'Ferramentas';
+$wb['Password and Language'] = 'Senha e Idioma';
+?>
+
diff --git a/interface/web/tools/lib/lang/br_usersettings.lng b/interface/web/tools/lib/lang/br_usersettings.lng
new file mode 100644
index 0000000..8aaa6f1
--- /dev/null
+++ b/interface/web/tools/lib/lang/br_usersettings.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['passwort_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança de Senha';
+$wb['language_txt'] = 'Idioma';
+$wb['password_mismatch'] = 'As senhas não conhecidem';
+$wb['Form to edit the user password and language.'] = 'Formulário para alterar idioma e senha';
+$wb['Settings'] = 'Configurações';
+?>
+
diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master
index a851b6e..7db2a48 100644
--- a/server/conf/apache_ispconfig.conf.master
+++ b/server/conf/apache_ispconfig.conf.master
@@ -4,7 +4,7 @@
 ################################################
 
 LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
-CustomLog "| /usr/sbin/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig
+CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig
 
 <Directory /var/www/clients>
     AllowOverride None
diff --git a/server/conf/php-fcgi-starter.master b/server/conf/php-fcgi-starter.master
index 9920c4e..c3676ba 100644
--- a/server/conf/php-fcgi-starter.master
+++ b/server/conf/php-fcgi-starter.master
@@ -7,4 +7,8 @@
 export PHP_FCGI_CHILDREN
 PHP_FCGI_MAX_REQUESTS=<tmpl_var name='php_fcgi_max_requests'>
 export PHP_FCGI_MAX_REQUESTS
-exec <tmpl_var name='php_fcgi_bin'> $1
\ No newline at end of file
+exec <tmpl_var name='php_fcgi_bin'> \
+<tmpl_if name="security_level" op="==" value="20"> -d open_basedir=<tmpl_var name='document_root'> \
+-d upload_tmp_dir=<tmpl_var name='document_root'>/tmp \
+-d session.save_path=<tmpl_var name='document_root'>/tmp \
+</tmpl_if> $1
\ No newline at end of file
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 162fcd4..9c8bf65 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -1,295 +1,298 @@
-
-<Directory {tmpl_var name='web_basedir'}/{tmpl_var name='domain'}>
-    AllowOverride None
-    Order Deny,Allow
-    Deny from all
-</Directory>
-
-<VirtualHost <tmpl_var name='ip_address'>:80>
-<tmpl_if name='php' op='==' value='suphp'>
-    DocumentRoot <tmpl_var name='web_document_root'>
-</tmpl_else>
-  <tmpl_if name='php' op='==' value='cgi'>
-    DocumentRoot <tmpl_var name='web_document_root'>
-  </tmpl_else>
-    DocumentRoot <tmpl_var name='web_document_root_www'>
-  </tmpl_if>
-</tmpl_if>
-
-    ServerName <tmpl_var name='domain'>
-<tmpl_if name='alias'>
-    ServerAlias <tmpl_var name='alias'>
-</tmpl_if>
-    ServerAdmin webmaster@<tmpl_var name='domain'>
-
-    ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
-<tmpl_if name='errordocs'>
-
-    ErrorDocument 400 /error/400.html
-    ErrorDocument 401 /error/401.html
-    ErrorDocument 403 /error/403.html
-    ErrorDocument 404 /error/404.html
-    ErrorDocument 405 /error/405.html
-    ErrorDocument 500 /error/500.html
-    ErrorDocument 503 /error/503.html
-</tmpl_if>
-	
-    <Directory {tmpl_var name='web_document_root_www'}>
-        Options FollowSymLinks
-        AllowOverride Indexes AuthConfig Limit FileInfo
-        Order allow,deny
-        Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-        
-        # ssi enabled
-        AddType text/html .shtml
-        AddOutputFilter INCLUDES .shtml
-        Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
-        <Files ~ '.php[s3-6]{0,1}$'>
-            Order allow,deny
-            Deny from all
-            Allow from none
-        </Files>
-</tmpl_if>
-    </Directory>
-    <Directory {tmpl_var name='web_document_root'}>
-        Options FollowSymLinks
-        AllowOverride Indexes AuthConfig Limit FileInfo
-        Order allow,deny
-        Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-        
-        # ssi enabled
-        AddType text/html .shtml
-        AddOutputFilter INCLUDES .shtml
-        Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
-        <Files ~ '.php[s3-6]{0,1}$'>
-            Order allow,deny
-            Deny from all
-            Allow from none
-        </Files>
-</tmpl_if>
-    </Directory>
-
-<tmpl_if name='cgi' op='==' value='y'>
-    # cgi enabled
-	<Directory {tmpl_var name='document_root'}/cgi-bin>
-      Order allow,deny
-      Allow from all
-    </Directory>
-    ScriptAlias  /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
-    AddHandler cgi-script .cgi
-    AddHandler cgi-script .pl
-</tmpl_if>
-<tmpl_if name='suexec' op='==' value='y'>
-    # suexec enabled
-    SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='mod'>
-    # mod_php enabled
-    AddType application/x-httpd-php .php .php3 .php4 .php5
-	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"	
-    php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
-    php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
-    #php_admin_value open_basedir <tmpl_var name='document_root'>:/usr/share/php5
-</tmpl_if>
-<tmpl_if name='php' op='==' value='suphp'>
-    # suphp enabled
-    <Directory {tmpl_var name='web_document_root'}>
-        suPHP_Engine on
-        # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-        AddHandler x-httpd-suphp .php .php3 .php4 .php5
-        suPHP_AddHandler x-httpd-suphp
-    </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='cgi'>
-    # php as cgi enabled
-    ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
-    Action php5-cgi /php5-cgi
-    AddHandler php5-cgi .php .php3 .php4 .php5
-    <Directory {tmpl_var name='cgi_starter_path'}>
-        Order allow,deny
-        Allow from all
-    </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='fast-cgi'>
-    # php as fast-cgi enabled
-    <Directory {tmpl_var name='web_document_root_www'}>
-        AddHandler fcgid-script .php .php3 .php4 .php5
-        FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
-        Options +ExecCGI
-        AllowOverride all
-        Order allow,deny
-        Allow from all
-    </Directory>
-</tmpl_if>
-<tmpl_if name="rewrite_enabled">
-    
-    RewriteEngine on
-<tmpl_loop name="redirects">
-    RewriteCond %{HTTP_HOST}   ^<tmpl_var name='rewrite_domain'> [NC]
-    RewriteRule   ^/(.*)$ <tmpl_var name='rewrite_target'>$1  <tmpl_var name='rewrite_type'>
-</tmpl_loop>
-</tmpl_if>
-
-<tmpl_var name='apache_directives'>
-</VirtualHost>
-
-
-
-<tmpl_if name='ssl_enabled'>
-<IfModule mod_ssl.c>
-###########################################################
-# SSL Vhost
-###########################################################
-
-<VirtualHost <tmpl_var name='ip_address'>:443>
-<tmpl_if name='php' op='==' value='suphp'>
-    DocumentRoot <tmpl_var name='web_document_root'>
-</tmpl_else>
-  <tmpl_if name='php' op='==' value='cgi'>
-    DocumentRoot <tmpl_var name='web_document_root'>
-  </tmpl_else>
-    DocumentRoot <tmpl_var name='web_document_root_www'>
-  </tmpl_if>
-</tmpl_if>
-
-    ServerName <tmpl_var name='domain'>
-<tmpl_if name='alias'>
-    ServerAlias <tmpl_var name='alias'>
-</tmpl_if>
-    ServerAdmin webmaster@<tmpl_var name='domain'>
-    
-    ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
-
-<tmpl_if name='errordocs'>
-    ErrorDocument 400 /error/400.html
-    ErrorDocument 401 /error/401.html
-    ErrorDocument 403 /error/403.html
-    ErrorDocument 404 /error/404.html
-    ErrorDocument 405 /error/405.html
-    ErrorDocument 500 /error/500.html
-    ErrorDocument 503 /error/503.html
-
-</tmpl_if>
-    SSLEngine on
-    SSLCertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.crt
-    SSLCertificateKeyFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.key
-<tmpl_if name='has_bundle_cert'>
-    SSLCACertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.bundle
-</tmpl_if>
-    
-	<Directory {tmpl_var name='web_document_root_www'}>
-        Options FollowSymLinks
-        AllowOverride Indexes AuthConfig Limit FileInfo
-        Order allow,deny
-        Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-        
-        # ssi enabled
-        AddType text/html .shtml
-        AddOutputFilter INCLUDES .shtml
-        Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
-        <Files ~ '.php[s3-6]{0,1}$'>
-            Order allow,deny
-            Deny from all
-            Allow from none
-        </Files>
-</tmpl_if>
-    </Directory>
-    <Directory {tmpl_var name='web_document_root'}>
-        Options FollowSymLinks
-        AllowOverride Indexes AuthConfig Limit FileInfo
-        Order allow,deny
-        Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-        
-        # ssi enabled
-        AddType text/html .shtml
-        AddOutputFilter INCLUDES .shtml
-        Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
-        <Files ~ '.php[s3-6]{0,1}$'>
-            Order allow,deny
-            Deny from all
-            Allow from none
-        </Files>
-</tmpl_if>
-    </Directory>
-
-<tmpl_if name='cgi' op='==' value='y'>
-    # cgi enabled
-	<Directory {tmpl_var name='document_root'}/cgi-bin>
-      Order allow,deny
-      Allow from all
-    </Directory>
-    ScriptAlias  /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
-    AddHandler cgi-script .cgi
-    AddHandler cgi-script .pl
-</tmpl_if>
-<tmpl_if name='ssi'op='==' value='y'>
-    # ssi enabled
-    AddType text/html .shtml
-    AddOutputFilter INCLUDES .shtml
-</tmpl_if>
-<tmpl_if name='suexec'op='==' value='y'>
-    # suexec enabled
-    SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='mod'>
-    # mod_php enabled
-    AddType application/x-httpd-php .php .php3 .php4 .php5
-	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"	
-    php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
-    php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
-    #php_admin_value open_basedir <tmpl_var name='document_root'>:/usr/share/php5
-</tmpl_if>
-<tmpl_if name='php' op='==' value='suphp'>
-    # suphp enabled
-    suPHP_Engine on
-    # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-    AddHandler x-httpd-php .php .php3 .php4 .php5
-    suPHP_AddHandler x-httpd-php
-</tmpl_if>
-<tmpl_if name='php' op='==' value='cgi'>
-    # php as cgi enabled
-    ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
-    Action php5-cgi /php5-cgi
-    AddHandler php5-cgi .php .php3 .php4 .php5
-	<Directory {tmpl_var name='cgi_starter_path'}>
-        Order allow,deny
-        Allow from all
-    </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='fast-cgi'>
-    # php as fast-cgi enabled
-    <Directory {tmpl_var name='web_document_root_www'}>
-        AddHandler fcgid-script .php .php3 .php4 .php5
-        FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
-        Options +ExecCGI
-        AllowOverride all
-        Order allow,deny
-        Allow from all
-    </Directory>
-</tmpl_if>
-<tmpl_if name="rewrite_enabled">
-    
-    RewriteEngine on
-<tmpl_loop name="redirects">
-    RewriteCond %{HTTP_HOST}   ^<tmpl_var name='rewrite_domain'> [NC]
-    RewriteRule   ^/(.*)$ <tmpl_var name='rewrite_target'>$1  <tmpl_var name='rewrite_type'>
-</tmpl_loop>
-</tmpl_if>
-
-<tmpl_var name='apache_directives'>
-</VirtualHost>
-</IfModule>
-
+
+<Directory {tmpl_var name='web_basedir'}/{tmpl_var name='domain'}>
+    AllowOverride None
+    Order Deny,Allow
+    Deny from all
+</Directory>
+
+<VirtualHost <tmpl_var name='ip_address'>:80>
+<tmpl_if name='php' op='==' value='suphp'>
+    DocumentRoot <tmpl_var name='web_document_root'>
+</tmpl_else>
+  <tmpl_if name='php' op='==' value='cgi'>
+    DocumentRoot <tmpl_var name='web_document_root'>
+  </tmpl_else>
+    DocumentRoot <tmpl_var name='web_document_root_www'>
+  </tmpl_if>
+</tmpl_if>
+
+    ServerName <tmpl_var name='domain'>
+<tmpl_if name='alias'>
+    <tmpl_var name='alias'>
+</tmpl_if>
+    ServerAdmin webmaster@<tmpl_var name='domain'>
+
+    ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
+<tmpl_if name='errordocs'>
+
+    ErrorDocument 400 /error/400.html
+    ErrorDocument 401 /error/401.html
+    ErrorDocument 403 /error/403.html
+    ErrorDocument 404 /error/404.html
+    ErrorDocument 405 /error/405.html
+    ErrorDocument 500 /error/500.html
+    ErrorDocument 503 /error/503.html
+</tmpl_if>
+	
+    <Directory {tmpl_var name='web_document_root_www'}>
+        Options FollowSymLinks
+        AllowOverride Indexes AuthConfig Limit FileInfo
+        Order allow,deny
+        Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+        
+        # ssi enabled
+        AddType text/html .shtml
+        AddOutputFilter INCLUDES .shtml
+        Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+        <Files ~ '.php[s3-6]{0,1}$'>
+            Order allow,deny
+            Deny from all
+            Allow from none
+        </Files>
+</tmpl_if>
+    </Directory>
+    <Directory {tmpl_var name='web_document_root'}>
+        Options FollowSymLinks
+        AllowOverride Indexes AuthConfig Limit FileInfo
+        Order allow,deny
+        Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+        
+        # ssi enabled
+        AddType text/html .shtml
+        AddOutputFilter INCLUDES .shtml
+        Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+        <Files ~ '.php[s3-6]{0,1}$'>
+            Order allow,deny
+            Deny from all
+            Allow from none
+        </Files>
+</tmpl_if>
+    </Directory>
+
+<tmpl_if name='cgi' op='==' value='y'>
+    # cgi enabled
+	<Directory {tmpl_var name='document_root'}/cgi-bin>
+      Order allow,deny
+      Allow from all
+    </Directory>
+    ScriptAlias  /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
+    AddHandler cgi-script .cgi
+    AddHandler cgi-script .pl
+</tmpl_if>
+<tmpl_if name='suexec' op='==' value='y'>
+    # suexec enabled
+    SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='mod'>
+    # mod_php enabled
+    AddType application/x-httpd-php .php .php3 .php4 .php5
+    php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"	
+    php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
+    php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
+<tmpl_if name='security_level' op='==' value='20'>
+    php_admin_value open_basedir <tmpl_var name='document_root'>/web:<tmpl_var name='document_root'>/tmp:/usr/share/php5
+</tmpl_if>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='suphp'>
+    # suphp enabled
+    <Directory {tmpl_var name='web_document_root'}>
+        suPHP_Engine on
+        # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+        AddHandler x-httpd-suphp .php .php3 .php4 .php5
+        suPHP_AddHandler x-httpd-suphp
+    </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='cgi'>
+    # php as cgi enabled
+    ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
+    Action php5-cgi /php5-cgi
+    AddHandler php5-cgi .php .php3 .php4 .php5
+    <Directory {tmpl_var name='cgi_starter_path'}>
+        Order allow,deny
+        Allow from all
+    </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='fast-cgi'>
+    # php as fast-cgi enabled
+    <Directory {tmpl_var name='web_document_root_www'}>
+        AddHandler fcgid-script .php .php3 .php4 .php5
+        FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
+        Options +ExecCGI
+        AllowOverride all
+        Order allow,deny
+        Allow from all
+    </Directory>
+</tmpl_if>
+<tmpl_if name="rewrite_enabled">
+    
+    RewriteEngine on
+<tmpl_loop name="redirects">
+    RewriteCond %{HTTP_HOST}   ^<tmpl_var name='rewrite_domain'> [NC]
+    RewriteRule   ^/(.*)$ <tmpl_var name='rewrite_target'>$1  <tmpl_var name='rewrite_type'>
+</tmpl_loop>
+</tmpl_if>
+
+<tmpl_var name='apache_directives'>
+</VirtualHost>
+
+
+
+<tmpl_if name='ssl_enabled'>
+<IfModule mod_ssl.c>
+###########################################################
+# SSL Vhost
+###########################################################
+
+<VirtualHost <tmpl_var name='ip_address'>:443>
+<tmpl_if name='php' op='==' value='suphp'>
+    DocumentRoot <tmpl_var name='web_document_root'>
+</tmpl_else>
+  <tmpl_if name='php' op='==' value='cgi'>
+    DocumentRoot <tmpl_var name='web_document_root'>
+  </tmpl_else>
+    DocumentRoot <tmpl_var name='web_document_root_www'>
+  </tmpl_if>
+</tmpl_if>
+
+    ServerName <tmpl_var name='domain'>
+<tmpl_if name='alias'>
+    <tmpl_var name='alias'>
+</tmpl_if>
+    ServerAdmin webmaster@<tmpl_var name='domain'>
+    
+    ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
+
+<tmpl_if name='errordocs'>
+    ErrorDocument 400 /error/400.html
+    ErrorDocument 401 /error/401.html
+    ErrorDocument 403 /error/403.html
+    ErrorDocument 404 /error/404.html
+    ErrorDocument 405 /error/405.html
+    ErrorDocument 500 /error/500.html
+    ErrorDocument 503 /error/503.html
+
+</tmpl_if>
+    SSLEngine on
+    SSLCertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.crt
+    SSLCertificateKeyFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.key
+<tmpl_if name='has_bundle_cert'>
+    SSLCACertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.bundle
+</tmpl_if>
+    
+	<Directory {tmpl_var name='web_document_root_www'}>
+        Options FollowSymLinks
+        AllowOverride Indexes AuthConfig Limit FileInfo
+        Order allow,deny
+        Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+        
+        # ssi enabled
+        AddType text/html .shtml
+        AddOutputFilter INCLUDES .shtml
+        Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+        <Files ~ '.php[s3-6]{0,1}$'>
+            Order allow,deny
+            Deny from all
+            Allow from none
+        </Files>
+</tmpl_if>
+    </Directory>
+    <Directory {tmpl_var name='web_document_root'}>
+        Options FollowSymLinks
+        AllowOverride Indexes AuthConfig Limit FileInfo
+        Order allow,deny
+        Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+        
+        # ssi enabled
+        AddType text/html .shtml
+        AddOutputFilter INCLUDES .shtml
+        Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+        <Files ~ '.php[s3-6]{0,1}$'>
+            Order allow,deny
+            Deny from all
+            Allow from none
+        </Files>
+</tmpl_if>
+    </Directory>
+
+<tmpl_if name='cgi' op='==' value='y'>
+    # cgi enabled
+	<Directory {tmpl_var name='document_root'}/cgi-bin>
+      Order allow,deny
+      Allow from all
+    </Directory>
+    ScriptAlias  /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
+    AddHandler cgi-script .cgi
+    AddHandler cgi-script .pl
+</tmpl_if>
+<tmpl_if name='ssi'op='==' value='y'>
+    # ssi enabled
+    AddType text/html .shtml
+    AddOutputFilter INCLUDES .shtml
+</tmpl_if>
+<tmpl_if name='suexec'op='==' value='y'>
+    # suexec enabled
+    SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='mod'>
+    # mod_php enabled
+    AddType application/x-httpd-php .php .php3 .php4 .php5
+    php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"	
+    php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
+    php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
+<tmpl_if name='security_level' op='==' value='20'>
+    php_admin_value open_basedir <tmpl_var name='document_root'>/web:<tmpl_var name='document_root'>/tmp:/usr/share/php5
+</tmpl_if>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='suphp'>
+    suPHP_Engine on
+    # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+    AddHandler x-httpd-suphp .php .php3 .php4 .php5
+    suPHP_AddHandler x-httpd-suphp
+</tmpl_if>
+<tmpl_if name='php' op='==' value='cgi'>
+    # php as cgi enabled
+    ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
+    Action php5-cgi /php5-cgi
+    AddHandler php5-cgi .php .php3 .php4 .php5
+	<Directory {tmpl_var name='cgi_starter_path'}>
+        Order allow,deny
+        Allow from all
+    </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='fast-cgi'>
+    # php as fast-cgi enabled
+    <Directory {tmpl_var name='web_document_root_www'}>
+        AddHandler fcgid-script .php .php3 .php4 .php5
+        FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
+        Options +ExecCGI
+        AllowOverride all
+        Order allow,deny
+        Allow from all
+    </Directory>
+</tmpl_if>
+<tmpl_if name="rewrite_enabled">
+    
+    RewriteEngine on
+<tmpl_loop name="redirects">
+    RewriteCond %{HTTP_HOST}   ^<tmpl_var name='rewrite_domain'> [NC]
+    RewriteRule   ^/(.*)$ <tmpl_var name='rewrite_target'>$1  <tmpl_var name='rewrite_type'>
+</tmpl_loop>
+</tmpl_if>
+
+<tmpl_var name='apache_directives'>
+</VirtualHost>
+</IfModule>
+
 </tmpl_if>
diff --git a/server/cron_daily.php b/server/cron_daily.php
index f696688..2cac46c 100644
--- a/server/cron_daily.php
+++ b/server/cron_daily.php
@@ -68,7 +68,7 @@
 		$tstamp = date("Y-m");
 		
 		$sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec["mailuser_id"];
-		$tr = $app->db->queryOneRecord($sql);
+		$tr = $app->dbmaster->queryOneRecord($sql);
 		
 		$mail_traffic += $tr["traffic"];
 		if($tr["traffic_id"] > 0) {
@@ -76,7 +76,7 @@
 		} else {
 			$sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec["mailuser_id"].",$mail_traffic)";
 		}
-		$app->db->query($sql);
+		$app->dbmaster->query($sql);
 		echo $sql;
 		
 	}
diff --git a/server/mods-available/cron_module.inc.php b/server/mods-available/cron_module.inc.php
new file mode 100644
index 0000000..778585c
--- /dev/null
+++ b/server/mods-available/cron_module.inc.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class cron_module {
+	
+	var $module_name = 'cron_module';
+	var $class_name = 'cron_module';
+	var $actions_available = array(	'cron_insert',
+									'cron_update',
+									'cron_delete');
+	
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+		return true;
+		
+	}
+	
+	/*
+	 	This function is called when the module is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Annonce the actions that where provided by this module, so plugins 
+		can register on them.
+		*/
+		
+		$app->plugins->announceEvents($this->module_name,$this->actions_available);
+		
+		/*
+		As we want to get notified of any changes on several database tables,
+		we register for them.
+		
+		The following function registers the function "functionname"
+ 		to be executed when a record for the table "dbtable" is 
+ 		processed in the sys_datalog. "classname" is the name of the
+ 		class that contains the function functionname.
+		*/
+		
+		$app->modules->registerTableHook('cron',$this->module_name,'process');
+		
+	}
+	
+	/*
+	 This function is called when a change in one of the registered tables is detected.
+	 The function then raises the events for the plugins.
+	*/
+
+	function process($tablename,$action,$data) {
+		global $app;
+		
+		switch ($tablename) {
+			case 'cron':
+				if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('cron_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data);
+			break;
+		} // end switch
+	} // end function
+	
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php
index 9a26e83..4452fd1 100644
--- a/server/mods-available/monitor_core_module.inc.php
+++ b/server/mods-available/monitor_core_module.inc.php
@@ -698,7 +698,7 @@
 
     function monitorRkHunter(){
         /*
-         *  This monitoring is expensive, so do it only once a hour
+         *  This monitoring is expensive, so do it only once a day
          */
         $min = date('i');
         $hour = date('H');
diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php
index 9a3f85e..1e7bde7 100644
--- a/server/mods-available/web_module.inc.php
+++ b/server/mods-available/web_module.inc.php
@@ -80,7 +80,8 @@
 		*/
 		
 		$app->modules->registerTableHook('web_domain','web_module','process');
-		$app->modules->registerTableHook('shell_user','web_module','process');
+        $app->modules->registerTableHook('ftp_user','web_module','process');
+        $app->modules->registerTableHook('shell_user','web_module','process');
 		
 		// Register service
 		$app->services->registerService('httpd','web_module','restartHttpd');
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 96be08b..1a962ec 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -146,8 +146,12 @@
     		@unlink($rand_file);
     		$ssl_request = file_get_contents($csr_file);
     		$ssl_cert = file_get_contents($crt_file);
+			/* Update the DB of the (local) Server */
     		$app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'");
 			$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+			/* Update also the master-DB of the Server-Farm */
+    		$app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'");
+			$app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
 		}
 		
 		//* Save a SSL certificate to disk
@@ -160,7 +164,10 @@
 			file_put_contents($csr_file,$data["new"]["ssl_request"]);
 			file_put_contents($crt_file,$data["new"]["ssl_cert"]);
 			if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]);
+			/* Update the DB of the (local) Server */
 			$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+			/* Update also the master-DB of the Server-Farm */
+			$app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
 			$app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG);
 		}
 		
@@ -174,7 +181,12 @@
 			unlink($csr_file);
 			unlink($crt_file);
 			unlink($bundle_file);
+			/* Update the DB of the (local) Server */
+    		$app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'");
 			$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+			/* Update also the master-DB of the Server-Farm */
+    		$app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'");
+			$app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
 			$app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG);
 		}
 		
@@ -249,7 +261,7 @@
 					// Remove trailing slash
 					if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1);
 					// create the symlinks, if not exist
-					if(!is_link($tmp_symlink)) {
+					if(is_link($tmp_symlink)) {
 						exec("rm -f ".escapeshellcmd($tmp_symlink));
 						$app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG);
 					}
@@ -431,7 +443,7 @@
 		
 		$username = escapeshellcmd($data["new"]["system_user"]);
 		if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) {
-			exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname $username -s /bin/false");
+			exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false");
 			$app->log("Adding the user: $username",LOGLEVEL_DEBUG);
 		}
 		
@@ -447,7 +459,6 @@
 			exec("setquota -T -u $username 604800 604800 -a &> /dev/null");
 		}
 		
-		
 		if($this->action == 'insert') {
 			// Chown and chmod the directories below the document root
 			exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"]));
@@ -456,8 +467,35 @@
 			exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]));
 		}
 		
-		// make temp direcory writable for the apache user and the website user
-		exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+		
+		
+		// If the security level is set to high
+		if($web_config['security_level'] == 20) {
+			
+			exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"]."/"));
+			exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"])."/*");
+			exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web"));
+			
+			// make temp direcory writable for the apache user and the website user
+			exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+			
+			$command = 'usermod';
+			$command .= ' --groups sshusers';
+			$command .= ' '.escapeshellcmd($data["new"]["system_user"]);
+			exec($command);
+			
+			//* add the apache user to the client group
+			$app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
+			
+		// If the security Level is set to medium
+		} else {
+		
+			exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/"));
+			exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*"));
+		
+			// make temp direcory writable for the apache user and the website user
+			exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+		}
 		
 		
 		// Create the vhost config file
@@ -470,6 +508,7 @@
 		$vhost_data["web_document_root"] = $data["new"]["document_root"]."/web";
 		$vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web";
 		$vhost_data["web_basedir"] = $web_config["website_basedir"];
+		$vhost_data["security_level"] = $web_config["security_level"];
 		
 		// Check if a SSL cert exists
 		$ssl_dir = $data["new"]["document_root"]."/ssl";
@@ -494,6 +533,7 @@
 		// Rewrite rules
 		$rewrite_rules = array();
 		if($data["new"]["redirect_type"] != '') {
+			if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/';
 			$rewrite_rules[] = array(	'rewrite_domain' 	=> $data["new"]["domain"],
 										'rewrite_type' 		=> ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']',
 										'rewrite_target' 	=> $data["new"]["redirect_path"]);
@@ -515,30 +555,32 @@
 		
 		// get alias domains (co-domains and subdomains)
 		$aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'");
-        switch($data["new"]["subdomain"]) {
+        $server_alias = array();
+		switch($data["new"]["subdomain"]) {
         case 'www':
-            $server_alias .= 'www.'.$data["new"]["domain"].' ';
+            $server_alias[] .= 'www.'.$data["new"]["domain"].' ';
             break;
         case '*':
-            $server_alias .= '*.'.$data["new"]["domain"].' ';    
+            $server_alias[] .= '*.'.$data["new"]["domain"].' ';    
             break;
         }
 		if(is_array($aliases)) {
 			foreach($aliases as $alias) {
                 switch($alias["subdomain"]) {
                 case 'www':
-                    $server_alias .= 'www.'.$alias["domain"].' '.$alias["domain"].' ';
+                    $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' ';
                     break;
                 case '*':
-                    $server_alias .= '*.'.$alias["domain"].' '.$alias["domain"].' ';    
+                    $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' ';    
                     break;
                 default:
-                    $server_alias .= $alias["domain"].' ';            
+                    $server_alias[] .= $alias["domain"].' ';            
                     break;
                 }
 				$app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG);
 				// Rewriting
 				if($alias["redirect_type"] != '') {
+					if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/';
 					$rewrite_rules[] = array(	'rewrite_domain' 	=> $alias["domain"],
 												'rewrite_type' 		=> ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']',
 												'rewrite_target' 	=> $alias["redirect_path"]);
@@ -558,7 +600,24 @@
 				}
 			}
 		}
-		$tpl->setVar('alias',trim($server_alias));
+		
+		//* If we have some alias records
+		if(count($server_alias) > 0) {
+			$server_alias_str = '';
+			$n = 0;
+			
+			// begin a new ServerAlias line after 30 alias domains
+			foreach($server_alias as $tmp_alias) {
+				if($n % 30 == 0) $server_alias_str .= "\n    ServerAlias ";
+				$server_alias_str .= $tmp_alias;
+			}
+			unset($tmp_alias);
+			
+			$tpl->setVar('alias',trim($server_alias_str));
+		} else {
+			$tpl->setVar('alias','');
+		}
+		
 		if(count($rewrite_rules) > 0) {
 			$tpl->setVar('rewrite_enabled',1);
 		} else {
@@ -599,6 +658,7 @@
 			$fcgi_tpl->setVar('php_fcgi_children',$fastcgi_config["fastcgi_children"]);
 			$fcgi_tpl->setVar('php_fcgi_max_requests',$fastcgi_config["fastcgi_max_requests"]);
 			$fcgi_tpl->setVar('php_fcgi_bin',$fastcgi_config["fastcgi_bin"]);
+			$fcgi_tpl->setVar('security_level',$web_config["security_level"]);
 				
 			$fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]);
 			file_put_contents($fcgi_starter_script,$fcgi_tpl->grab());
@@ -650,6 +710,7 @@
 			// This will NOT work!
 			//$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]);
 			$cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]);
+			$cgi_tpl->setVar('security_level',$web_config["security_level"]);
 
 			$cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]);
 			file_put_contents($cgi_starter_script,$cgi_tpl->grab());
@@ -695,7 +756,7 @@
 		}
 		
 		//* Create .htaccess and .htpasswd file for website statistics
-		if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess')) {
+		if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) {
 			if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats');
 			$ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\n<limit GET PUT POST>\nrequire valid-user\n</limit>";
 			file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file);
@@ -717,6 +778,9 @@
 		// request a httpd reload when all records have been processed
 		$app->services->restartServiceDelayed('httpd','reload');
 		
+		//* Unset action to clean it for next processed vhost.
+		$this->action = '';
+		
 	}
 	
 	function delete($event_name,$data) {
diff --git a/server/plugins-available/cron_jailkit_plugin.inc.php b/server/plugins-available/cron_jailkit_plugin.inc.php
new file mode 100644
index 0000000..fc19db6
--- /dev/null
+++ b/server/plugins-available/cron_jailkit_plugin.inc.php
@@ -0,0 +1,272 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class cron_jailkit_plugin {
+	
+	//* $plugin_name and $class_name have to be the same then the name of this class
+	var $plugin_name = 'cron_jailkit_plugin';
+	var $class_name = 'cron_jailkit_plugin';
+	
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+		if($conf['services']['web'] == true) {
+			return true;
+		} else {
+			return false;
+		}
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+        $app->plugins->registerEvent('cron_insert', $this->plugin_name, 'insert');
+        $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update');
+        $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete');
+		
+	}
+	
+	//* This function is called, when a cron job is inserted in the database
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+        if($data["new"]["parent_domain_id"] == '') {
+            $app->log("Parent domain not set",LOGLEVEL_WARN);
+            return 0;
+        }
+        
+        //* get data from web
+        $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+        if(!$parent_domain["domain_id"]) {
+            $app->log("Parent domain not found",LOGLEVEL_WARN);
+            return 0;
+        } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+            $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+            return 0;
+        }
+		
+        $app->uses('system');
+		
+		if($app->system->is_user($parent_domain['system_user'])) {
+		
+			/**
+		 	* Setup Jailkit Chroot System If Enabled 
+		 	*/
+			if ($data['new']['type'] == "chrooted")
+			{
+				// load the server configuration options
+				$app->uses("getconf");
+				$this->data = $data;
+				$this->app = $app;
+				$this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit');
+                $this->parent_domain = $parent_domain;
+			
+				$this->_setup_jailkit_chroot();
+				
+				//$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']);
+				//exec($command);
+				
+				$this->_add_jailkit_user();
+			}
+		
+			$app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG);
+			
+		} else {
+			$app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN);
+		}
+		
+	}
+	
+	//* This function is called, when a cron job is updated in the database
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+        if($data["new"]["parent_domain_id"] == '') {
+            $app->log("Parent domain not set",LOGLEVEL_WARN);
+            return 0;
+        }
+        //* get data from web
+        $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+
+        if(!$parent_domain["domain_id"]) {
+            $app->log("Parent domain not found",LOGLEVEL_WARN);
+            return 0;
+        } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+            $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+            return 0;
+        }
+		
+        $app->uses('system');
+		
+		if($app->system->is_user($parent_domain['system_user'])) {
+        
+			/**
+		 	* Setup Jailkit Chroot System If Enabled 
+		 	*/
+			if ($data['new']['type'] == "chrooted")
+			{
+                $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG);
+				// load the server configuration options
+				$app->uses("getconf");
+				$this->data = $data;
+				$this->app = $app;
+				$this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit');
+                $this->parent_domain = $parent_domain;
+			
+				$this->_setup_jailkit_chroot();
+				$this->_add_jailkit_user();
+			}
+		
+			$app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG);
+			
+		} else {
+			$app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN);
+		}
+		
+	}
+	
+	//* This function is called, when a cron job is deleted in the database
+	function delete($event_name,$data) {
+		global $app, $conf;
+		
+		//* nothing to do here!
+		
+	}
+	
+	function _setup_jailkit_chroot()
+	{
+			//check if the chroot environment is created yet if not create it with a list of program sections from the config
+			if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit'))
+			{
+				$command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh';
+				$command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+				$command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\'';
+				exec($command);
+				
+				$this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+				
+				//$this->_add_jailkit_programs(); // done later on
+				
+				$this->app->load('tpl');
+		
+				$tpl = new tpl();
+				$tpl->newTemplate("bash.bashrc.master");
+				
+				$tpl->setVar('jailkit_chroot',true);
+				$tpl->setVar('domain',$this->parent_domain['domain']);
+                $tpl->setVar('home_dir',$this->_get_home_dir(""));
+				
+				$bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc';
+				if(@is_file($bashrc)) exec('rm '.$bashrc);
+				
+				file_put_contents($bashrc,$tpl->grab());
+				unset($tpl);
+				
+				$this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG);
+				
+				$tpl = new tpl();
+				$tpl->newTemplate("motd.master");
+				
+				$tpl->setVar('domain',$this->parent_domain['domain']);
+				
+				$motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd';
+				if(@is_file($motd)) exec('rm '.$motd);
+				
+				file_put_contents($motd,$tpl->grab());
+				
+			}
+            $this->_add_jailkit_programs();
+	}
+	
+	function _add_jailkit_programs()
+	{
+		//copy over further programs and its libraries
+		$command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh';
+		$command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+		$command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\'';
+		exec($command);
+		
+		$this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+        
+        $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh';
+        $command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+        $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\'';
+        exec($command);
+        
+        $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+	}
+	
+	function _add_jailkit_user()
+	{
+			//add the user to the chroot
+            $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']);
+			
+			if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc');
+			if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd');
+			
+			// IMPORTANT!
+			// ALWAYS create the user. Even if the user was created before
+			// if we check if the user exists, then a update (no shell -> jailkit) will not work
+			// and the user has FULL ACCESS to the root of the server!
+			$command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh';
+			$command .= ' '.escapeshellcmd($this->parent_domain['system_user']);
+			$command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+			$command .= ' '.$jailkit_chroot_userhome;
+			$command .= ' '.escapeshellcmd("/bin/bash");
+			exec($command);
+				
+			$this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG);
+				
+			exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome));
+	}
+	
+    function _get_home_dir($username)
+    {
+        return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]);
+    }
+    
+	
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php
new file mode 100644
index 0000000..233f2d2
--- /dev/null
+++ b/server/plugins-available/cron_plugin.inc.php
@@ -0,0 +1,239 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class cron_plugin {
+	
+	var $plugin_name = 'cron_plugin';
+	var $class_name = 'cron_plugin';
+	
+	// private variables
+	var $action = '';
+	
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+		if($conf['services']['web'] == true) {
+			return true;
+		} else {
+			return false;
+		}
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		$app->plugins->registerEvent('cron_insert',$this->plugin_name,'insert');
+		$app->plugins->registerEvent('cron_update',$this->plugin_name,'update');
+		$app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete');
+		
+	}
+	
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+		$this->action = 'insert';
+		// just run the update function
+		$this->update($event_name,$data);
+		
+	}
+	
+	
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+		if($this->action != 'insert') $this->action = 'update';
+		
+		// load the server configuration options
+		$app->uses("getconf");
+		
+		if($data["new"]["parent_domain_id"] == '') {
+			$app->log("Parent domain not set",LOGLEVEL_WARN);
+			return 0;
+		}
+        
+        //* get data from web
+        $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+        if(!$parent_domain["domain_id"]) {
+            $app->log("Parent domain not found",LOGLEVEL_WARN);
+            return 0;
+        } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+			$app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+			return 0;
+		}
+		
+		// Get the client ID
+		$client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"]));
+		$client_id = intval($client["client_id"]);
+		unset($client);
+		
+		// Create group and user, if not exist
+		$app->uses("system");
+		
+		$groupname = escapeshellcmd($parent_domain["system_group"]);
+		if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) {
+			exec("groupadd $groupname");
+			$app->log("Adding the group: $groupname",LOGLEVEL_DEBUG);
+		}
+		
+		$username = escapeshellcmd($parent_domain["system_user"]);
+		if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) {
+			exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false");
+			$app->log("Adding the user: $username",LOGLEVEL_DEBUG);
+		}
+		
+		// Set the quota for the user
+		if($username != '' && $app->system->is_user($username)) {
+			if($parent_domain["hd_quota"] > 0){
+    			$blocks_soft = $parent_domain["hd_quota"] * 1024;
+    			$blocks_hard = $blocks_soft + 1024;
+  			} else {
+    			$blocks_soft = $blocks_hard = 0;
+  			}
+			exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null");
+			exec("setquota -T -u $username 604800 604800 -a &> /dev/null");
+		}
+		
+		// make temp direcory writable for the apache user and the website user
+		exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp"));
+		
+        /** TODO READ CRON MASTER **/
+        
+        $this->parent_domain = $parent_domain;
+		$this->_write_crontab();
+		
+		$this->action = '';
+        
+	}
+	
+	function delete($event_name,$data) {
+		global $app, $conf;
+		
+        //* get data from web
+        $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"]));
+        if(!$parent_domain["domain_id"]) {
+            $app->log("Parent domain not found",LOGLEVEL_WARN);
+            return 0;
+        }
+        
+        // Get the client ID
+        $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"]));
+        $client_id = intval($client["client_id"]);
+        unset($client);
+        
+        $this->parent_domain = $parent_domain;
+        $this->_write_crontab();
+	}
+    
+    function _write_crontab() {
+        global $app, $conf;
+        
+        //* load the server configuration options
+        $app->uses("getconf");
+        
+        $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron');
+        
+        //* try to find customer's mail address
+        
+        /** TODO: add possibility for client to choose mail notification! **/
+        $cron_content = "MAILTO=''\n\n";
+        $chr_cron_content = "MAILTO=''\n\n";
+        $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n";
+        
+        $cmd_count = 0;
+        $chr_cmd_count = 0;
+        
+        //* read all active cron jobs from database and write them to file
+        $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'");
+        if($cron_jobs && count($cron_jobs) > 0) {
+            foreach($cron_jobs as $job) {
+                $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}";
+                $command .= "\t{$this->parent_domain['system_user']}"; //* running as user
+                if($job['type'] == 'url') {
+                    $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1";
+                } else {
+                    if($job['type'] == 'chrooted') {
+                        if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) {
+                            //* delete the unneeded path part
+                            $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root']));
+                        }
+                    }
+                    
+                    $command .= "\t";
+                    if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'];
+                    $command .= $job['command'];
+                }
+                
+                if($job['type'] == 'chrooted') {
+                    $chr_cron_content .= $command . "\n";
+                    $chr_cmd_count++;
+                } else {
+                    $cron_content .= $command . "\n";
+                    $cmd_count++;
+                }
+            }
+        }
+        
+        $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]);
+        if($cmd_count > 0) {
+            file_put_contents($cron_file, $cron_content);
+            $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG);
+        } else {
+            @unlink($cron_file);
+            $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG);
+        }
+        
+        $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]);
+        if($chr_cmd_count > 0) {
+            file_put_contents($cron_file, $chr_cron_content);
+            $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG);
+        } else {
+            @unlink($cron_file);
+            $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG);
+        }
+        
+        return 0;
+    }
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/firewall_plugin.inc.php b/server/plugins-available/firewall_plugin.inc.php
index e46d0ca..c446852 100644
--- a/server/plugins-available/firewall_plugin.inc.php
+++ b/server/plugins-available/firewall_plugin.inc.php
@@ -79,8 +79,13 @@
 		$ports = explode(',',$data["new"]["tcp_port"]);
 		if(is_array($ports)) {
 			foreach($ports as $p) {
-				$p_int = intval($p);
-				if($p_int > 0) $tcp_ports .= $p_int . ' ';
+				if(strstr($p,':')) {
+					$p_parts = explode(':',$p);
+					$p_clean = intval($p_parts[0]).':'.intval($p_parts[1]);
+				} else {
+					$p_clean = intval($p);
+				}
+				if($p_int > 0) $tcp_ports .= $p_clean . ' ';
 			}
 		}
 		$tcp_ports = trim($tcp_ports);
@@ -88,8 +93,13 @@
 		$ports = explode(',',$data["new"]["udp_port"]);
 		if(is_array($ports)) {
 			foreach($ports as $p) {
-				$p_int = intval($p);
-				if($p_int > 0) $udp_ports .= $p_int . ' ';
+				if(strstr($p,':')) {
+					$p_parts = explode(':',$p);
+					$p_clean = intval($p_parts[0]).':'.intval($p_parts[1]);
+				} else {
+					$p_clean = intval($p);
+				}
+				if($p_int > 0) $udp_ports .= $p_clean . ' ';
 			}
 		}
 		$udp_ports = trim($udp_ports);
diff --git a/server/plugins-available/ftpuser_base_plugin.inc.php b/server/plugins-available/ftpuser_base_plugin.inc.php
new file mode 100644
index 0000000..42edbb5
--- /dev/null
+++ b/server/plugins-available/ftpuser_base_plugin.inc.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class ftpuser_base_plugin {
+	
+	var $plugin_name = 'ftpuser_base_plugin';
+	var $class_name = 'ftpuser_base_plugin';
+	
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+		if($conf['services']['web'] == true) {
+			return true;
+		} else {
+			return false;
+		}
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		$app->plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert');
+		$app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update');
+		$app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete');
+
+		
+	}
+	
+	
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+    if(!is_dir($data['new']['dir'])) {
+      $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
+      
+      $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id']));
+      
+      exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
+      exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
+      
+      $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
+    }
+    
+	}
+	
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+    if(!is_dir($data['new']['dir'])) {
+      $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
+      
+      $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id']));
+      
+      exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
+      exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
+      
+      $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
+    }
+	}
+	
+	function delete($event_name,$data) {
+		global $app, $conf;
+		
+    $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG);
+		
+	}
+	
+	
+	
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php
index baa8edb..e486f0e 100644
--- a/server/plugins-available/mail_plugin.inc.php
+++ b/server/plugins-available/mail_plugin.inc.php
@@ -94,6 +94,12 @@
 			exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']);
 			$app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG);
 		}
+		
+		//* When the mail user dir exists but it is not a valid maildir, remove it
+		if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) {
+			exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail");
+			$app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN);
+		}
 
 		//* Create the maildir, if it doesn not exist, set permissions, set quota.
 		if(!empty($maildomain_path) && !is_dir($maildomain_path)) {
@@ -106,8 +112,10 @@
 		}
 		
 		//* Set the maildir quota
-		exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
-		$app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+		if(is_dir($data['new']['maildir'].'/new')) {
+			exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
+			$app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+		}
 	}
 	
 	function user_update($event_name,$data) {
@@ -118,10 +126,41 @@
 		$mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail');
 		
 		// Create the maildir, if it does not exist
+		/*
 		if(!is_dir($data['new']['maildir'])) {
 			exec('mkdir -p '.escapeshellcmd($data['new']['maildir']));
 			exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir']));
 			$app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG);
+		}
+		*/
+		
+		$maildomain_path = $data['new']['maildir'];
+		$tmp_basepath = $data['new']['maildir'];
+		$tmp_basepath_parts = explode('/',$tmp_basepath);
+		unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]);
+		$base_path = implode('/',$tmp_basepath_parts);
+
+		//* Create the mail domain directory, if it does not exist
+		if(!empty($base_path) && !is_dir($base_path)) {
+			exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']);
+			$app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG);
+		}
+		
+		//* When the mail user dir exists but it is not a valid maildir, remove it
+		if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) {
+			exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail");
+			$app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN);
+		}
+
+		//* Create the maildir, if it doesn not exist, set permissions, set quota.
+		if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) {
+			exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']);
+			$app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+			exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir']));
+			$app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG);
+			//* This is to fix the maildrop quota not being rebuilt after the quota is changed.
+			exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911
+			$app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
 		}
 		
 		// Move mailbox, if domain has changed and delete old mailbox
@@ -137,8 +176,10 @@
 			$app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG);
 		}
 		//This is to fix the maildrop quota not being rebuilt after the quota is changed.
-		exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
-		$app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+		if(is_dir($data['new']['maildir'].'/new')) {
+			exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
+			$app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+		}
 	}
 	
 	function user_delete($event_name,$data) {
diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php
index eaf85e7..493d80f 100644
--- a/server/plugins-available/mysql_clientdb_plugin.inc.php
+++ b/server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -66,6 +66,52 @@
 		
 	}
 	
+  function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") {
+      global $app;
+      
+      $action = strtoupper($action);
+      
+      // set to all hosts if none given
+      if(trim($host_list) == "") $host_list = "%";
+      
+      // process arrays and comma separated strings
+      if(!is_array($host_list)) $host_list = split(",", $host_list);
+      
+      $success = true;
+      
+      // loop through hostlist
+      foreach($host_list as $db_host) {
+          $db_host = trim($db_host);
+          
+          // check if entry is valid ip address
+          $valid = true;
+          if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) {
+              $groups = explode(".", $db_host);
+              foreach($groups as $group){
+                if($group<0 OR $group>255)
+                $valid=false;
+              }
+          } else {
+              $valid = false;
+          }
+          
+          if($valid == false) continue;
+          
+          if($action == "GRANT") {
+              if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false;
+          } elseif($action == "REVOKE") {
+              //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link);
+          } elseif($action == "DROP") {
+              if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false;
+          } elseif($action == "RENAME") {
+              if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false;
+          } elseif($action == "PASSWORD") {
+              if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false;
+          }
+      }
+      
+      return $success;
+  }
 	
 	function db_insert($event_name,$data) {
 		global $app, $conf;
@@ -101,8 +147,7 @@
 			if($data["new"]["active"] == 'y') {
 				
 				if($data["new"]["remote_access"] == 'y') {
-			 		$db_host = '%';
-					mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+          $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
 				}
 				
 				$db_host = 'localhost';
@@ -136,8 +181,7 @@
 			if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') {
 				
 				if($data["new"]["remote_access"] == 'y') {
-			 		$db_host = '%';
-					mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+          $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
 				}
 				
 				$db_host = 'localhost';
@@ -151,8 +195,7 @@
 			if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') {
 				
 				if($data["old"]["remote_access"] == 'y') {
-			 		$db_host = '%';
-					mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link);
+          $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
 				}
 				
 				$db_host = 'localhost';
@@ -167,8 +210,7 @@
 				$db_host = 'localhost';
 				mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link);
 				if($data["old"]["remote_access"] == 'y') {
-					$db_host = '%';
-					mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link);
+          $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]);
 				}
 				$app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
 			}
@@ -180,23 +222,25 @@
 				//mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link);
 				
 				//* set new priveliges
-				$db_host = '%';
 				if($data["new"]["remote_access"] == 'y') { 		
-					mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+					$this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
 				} else {
-					mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link);
+					$this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
 				}
 				$app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG);
-			}
-			
+			} elseif($data["new"]["remote_access"] == 'y' && $data["new"]["remote_ips"] != $data["old"]["remote_ips"]) {
+          //* Change remote access list
+          $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
+          $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
+      }
+      
 			//* Change password
 			if($data["new"]["database_password"] != $data["old"]["database_password"]) {
 				$db_host = 'localhost';
 				mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link);
 
 				if($data["new"]["remote_access"] == 'y') {
-					$db_host = '%';
-					mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link);
+          $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
 				}
 				$app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
 			}
@@ -225,9 +269,8 @@
 			
 			//* Get the db host setting for the access priveliges
 			if($data["old"]["remote_access"] == 'y') {
-			 	$db_host = '%';
-				if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) {
-					$app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG);
+			 	if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) {
+        	$app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG);
 				} else {
 					$app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR);
 				}
diff --git a/server/plugins-available/pma_symlink_plugin.inc.php b/server/plugins-available/pma_symlink_plugin.inc.php
new file mode 100644
index 0000000..06ce787
--- /dev/null
+++ b/server/plugins-available/pma_symlink_plugin.inc.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+Modification (c) 2009, Marius Cramer, pixcept KG 
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class pma_symlink_plugin {
+	
+	var $plugin_name = 'pma_symlink_plugin';
+	var $class_name = 'pma_symlink_plugin';
+	
+    var $action;
+    
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+			return false;
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		$app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert');
+		$app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update');
+	}
+	
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+		$this->action = 'insert';
+		// just run the update function
+		$this->update($event_name,$data);
+	}
+	
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+		if($this->action != 'insert') $this->action = 'update';
+		
+		if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) {
+			
+			$old_parent_domain_id = intval($data["old"]["parent_domain_id"]);
+			$new_parent_domain_id = intval($data["new"]["parent_domain_id"]);
+			
+			// If the parent_domain_id has been chenged, we will have to update the old site as well.
+			if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) {
+				$tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'");
+				$data["new"] = $tmp;
+				$data["old"] = $tmp;
+				$this->action = 'update';
+				$this->update($event_name,$data);
+			}
+			
+			// This is not a vhost, so we need to update the parent record instead.
+			$tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'");
+			$data["new"] = $tmp;
+			$data["old"] = $tmp;
+			$this->action = 'update';
+		}
+		
+		if($data["new"]["document_root"] == '') {
+			$app->log("document_root not set",LOGLEVEL_WARN);
+			return 0;
+		}
+		
+        $symlink = true;
+        if($data["new"]["php"] == "suphp") $symlink = false;
+        elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+        elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+        
+        
+        if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web");
+        if($symlink == false) {
+            if(is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("rm -f ".$data["new"]["document_root"]."/web/phpmyadmin");
+        } else {
+            if(!is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("ln -s /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin");
+            else exec("ln -sf /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin");
+        }
+	}
+	
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php
index bf6aa56..f3b0c32 100644
--- a/server/plugins-available/software_update_plugin.inc.php
+++ b/server/plugins-available/software_update_plugin.inc.php
@@ -62,17 +62,24 @@
 		
 	}
 	
-	
+	function set_install_status($inst_id, $status) {
+        global $app;
+        
+        $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'");
+        $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'");
+    }
+    
 	function process($event_name,$data) {
 		global $app, $conf;
 		
-		if(!$conf['software_updates_enabled'] == true) {
+        if(!$conf['software_updates_enabled'] == true) {
 			$app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_ERROR);
+            $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
 			return false;
 		}
 		
 		//* Get the info of the package:
-		$software_update_id = intval($data["new"]["software_update_id"]);
+        $software_update_id = intval($data["new"]["software_update_id"]);
 		$software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'");
 		
 		$temp_dir = '/tmp/'.md5 (uniqid (rand()));
@@ -80,6 +87,7 @@
 		mkdir($temp_dir);
 		if(!is_dir($temp_dir)) {
 			$app->log("Unable to create temp directory.",LOGLEVEL_ERROR);
+            $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
 			return false;
 		}
 		
@@ -97,6 +105,7 @@
 				$app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_ERROR);
 				exec("rm -rf $temp_dir");
 				$app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
+                $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
 				return false;
 			} else {
 				$app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG);
@@ -110,18 +119,28 @@
 				// Execute the setup script
 				exec('chmod +x '.$temp_dir.'/setup.sh');
 				$app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG);
-				exec('cd '.$temp_dir.' && ./setup.sh');
-				$app->db->query("UPDATE software_update_inst SET status = 'installed' WHERE software_update_inst_id = ".$data["new"]["software_update_inst_id"]);
+				exec('cd '.$temp_dir.' && ./setup.sh > package_install.log');
+                
+                $log_data = @file_get_contents("{$temp_dir}/package_install.log");
+                if(preg_match("'.*\[OK\]\s*$'is", $log_data)) {
+                    $app->log("Installation successful",LOGLEVEL_DEBUG);
+                    $app->log($log_data,LOGLEVEL_DEBUG);
+                    $this->set_install_status($data["new"]["software_update_inst_id"], "installed");
+                } else {
+                    $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_ERROR);
+                    $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
+                }
 			} else {
 				$app->log("setup.sh file not found",LOGLEVEL_ERROR);
+                $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
 			}
 		} else {
 			$app->log("Download of the update file failed",LOGLEVEL_ERROR);
+            $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
 		}
 		
 		exec("rm -rf $temp_dir");
 		$app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
-		
 	}
 	
 
diff --git a/server/plugins-available/webmail_symlink_plugin.inc.php b/server/plugins-available/webmail_symlink_plugin.inc.php
new file mode 100644
index 0000000..db5fd26
--- /dev/null
+++ b/server/plugins-available/webmail_symlink_plugin.inc.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+Modification (c) 2009, Marius Cramer, pixcept KG 
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class webmail_symlink_plugin {
+	
+	var $plugin_name = 'webmail_symlink_plugin';
+	var $class_name = 'webmail_symlink_plugin';
+	
+    var $action;
+    
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+        return false;
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		$app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert');
+		$app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update');
+	}
+	
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+		$this->action = 'insert';
+		// just run the update function
+		$this->update($event_name,$data);
+	}
+	
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+		if($this->action != 'insert') $this->action = 'update';
+		
+		if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) {
+			
+			$old_parent_domain_id = intval($data["old"]["parent_domain_id"]);
+			$new_parent_domain_id = intval($data["new"]["parent_domain_id"]);
+			
+			// If the parent_domain_id has been chenged, we will have to update the old site as well.
+			if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) {
+				$tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'");
+				$data["new"] = $tmp;
+				$data["old"] = $tmp;
+				$this->action = 'update';
+				$this->update($event_name,$data);
+			}
+			
+			// This is not a vhost, so we need to update the parent record instead.
+			$tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'");
+			$data["new"] = $tmp;
+			$data["old"] = $tmp;
+			$this->action = 'update';
+		}
+		
+		if($data["new"]["document_root"] == '') {
+			$app->log("document_root not set",LOGLEVEL_WARN);
+			return 0;
+		}
+		
+        $symlink = true;
+        if($data["new"]["php"] == "suphp") $symlink = false;
+        elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+        elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+        
+        
+        if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web");
+        if($symlink == false) {
+            if(is_link($data["new"]["document_root"]."/web/webmail")) exec("rm -f ".$data["new"]["document_root"]."/web/webmail");
+        } else {
+            if(!is_link($data["new"]["document_root"]."/web/webmail")) exec("ln -s /var/www/webmail ".$data["new"]["document_root"]."/web/webmail");
+            else exec("ln -sf /var/www/webmail ".$data["new"]["document_root"]."/web/webmail");
+        }
+	}
+	
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/scripts/getmail.sh b/server/scripts/getmail.sh
deleted file mode 100644
index cf9160a..0000000
--- a/server/scripts/getmail.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-getmail -g /etc/getmail/ -r /etc/getmail/*.conf
\ No newline at end of file
diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php
index f18963f..f7615e1 100644
--- a/server/scripts/ispconfig_update.php
+++ b/server/scripts/ispconfig_update.php
@@ -95,11 +95,13 @@
 	$new_version = trim($new_version);
 	if($new_version != ISPC_APP_VERSION) {
 		passthru('/usr/local/ispconfig/server/scripts/update_from_tgz.sh');
+		exit;
 	} else {
 		echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n";
 	}
 } else {
 	passthru('/usr/local/ispconfig/server/scripts/update_from_svn.sh');
+	exit;
 }
 
 
diff --git a/server/scripts/run-getmail.sh b/server/scripts/run-getmail.sh
index fab297d..998ecab 100644
--- a/server/scripts/run-getmail.sh
+++ b/server/scripts/run-getmail.sh
@@ -3,7 +3,11 @@
 cd /etc/getmail
 rcfiles=""
 for file in *.conf ; do
+if [ $file != "*.conf" ]; then
 rcfiles="$rcfiles -r $file"
+fi
 done
 #echo $rcfiles
-exec /usr/bin/getmail -n -v -g /etc/getmail $rcfiles
\ No newline at end of file
+if [ "$rcfiles" != "" ]; then
+exec /usr/bin/getmail -n -v -g /etc/getmail $rcfiles
+fi
\ No newline at end of file
diff --git a/server/scripts/update_from_svn.sh b/server/scripts/update_from_svn.sh
index becd7e7..d8ed236 100644
--- a/server/scripts/update_from_svn.sh
+++ b/server/scripts/update_from_svn.sh
@@ -5,4 +5,6 @@
 cd trunk/install
 php -q update.php
 cd /tmp
-rm -rf /tmp/trunk
\ No newline at end of file
+rm -rf /tmp/trunk
+
+exit 0
\ No newline at end of file
diff --git a/server/scripts/update_from_tgz.sh b/server/scripts/update_from_tgz.sh
index 424a390..09dddeb 100644
--- a/server/scripts/update_from_tgz.sh
+++ b/server/scripts/update_from_tgz.sh
@@ -8,8 +8,15 @@
 fi
 
 wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
-tar xvfz ISPConfig-3-stable.tar.gz
-cd ispconfig3_install/install/
-php -q update.php
-rm -rf /tmp/ispconfig3_install/install
-rm -f ISPConfig-3-stable.tar.gz
\ No newline at end of file
+if [ -f ISPConfig-3-stable.tar.gz ]
+then
+	tar xvfz ISPConfig-3-stable.tar.gz
+	cd ispconfig3_install/install/
+	php -q update.php
+	rm -rf /tmp/ispconfig3_install/install
+	rm -f ISPConfig-3-stable.tar.gz
+else
+	echo "Unable to download the update."
+fi
+
+exit 0
\ No newline at end of file
diff --git a/server/scripts/vlogger b/server/scripts/vlogger
new file mode 100755
index 0000000..d136af1
--- /dev/null
+++ b/server/scripts/vlogger
@@ -0,0 +1,564 @@
+#!/usr/bin/perl -T
+#
+# vlogger - smarter logging for apache
+# steve j. kondik  <shade@chemlab.org>
+#
+# this script will take piped logs in STDIN, break off the first component
+# and log the line into the proper directory under $LOGDIR.  it will roll the
+# logs over at midnight on-the-fly and maintain a symlink to the most recent log.
+#
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Library General Public License for more details.
+#
+# 
+# CHANGELOG:
+# 0.1	initial release
+# 0.2	cleanups, added -e option for errorlogs, added strict stuff
+# 0.3	cleanups, bugfixes, docs, added -r size rotation option
+# 0.4   added dbi usage tracking option, code cleanups from cz@digitalfreaks.org
+# 1.0	small bugfixes, first production release
+# 1.1   bugfix release
+# 1.2   support for mod_logio
+# 1.3	various contributed bugfixes
+#
+# 
+# TODO:
+# configurable file compression using Compress::Zlib, maybe.
+# 
+
+package vlogger;
+
+$ENV{PATH} = "/bin:/usr/bin";
+
+my $VERSION = "1.3";
+
+=head1 NAME
+
+vlogger - flexible log rotation and usage tracking in perl
+
+=head1 SYNOPSIS
+
+vlogger [OPTIONS]... [LOGDIR]
+
+=head1 DESCRIPTION
+
+Vlogger is designed to make webserver log rotation simple and easy to manage.
+It deals with VirtualHost logs automatically, so only one directive is required
+to manage all hosts on a webserver.  Vlogger takes piped output from Apache or
+another webserver, splits off the first field, and writes the logs to logfiles
+in subdirectories.  It uses a filehandle cache to avoid resource limitations.
+It will start a new logfile at the beginning of a new day, and optionally start
+new files when a certain filesize is reached.  It can maintain a symlink to
+the most recent log for easy access.  Optionally, host parsing can be disabled
+for use in ErrorLog directives.  
+
+To use vlogger, you need to add a "%v" to the first part of your LogFormat:
+
+LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+
+Then call it from a customlog:
+
+CustomLog "| /usr/local/sbin/vlogger -s access.log -u www-logs -g www-logs /var/log/apache" combined
+
+=head1 OPTIONS
+
+Options are given in short format on the command line.
+
+-a
+	Do not autoflush files.  This may improve performance but may break logfile
+analyzers that depend on full entries in the logs.
+
+-e
+	ErrorLog mode.  In this mode, the host parsing is disabled, and the file is
+written out using the template under the specified LOGDIR.
+	
+-n
+	Disables rotation.  This option disables rotation altogether.
+
+-f MAXFILES
+	Maximum number of filehandles to keep open.  Defaults to 100.  Setting this
+value too high may result in the system running out of file descriptors.
+Setting it too low may affect performance.
+
+-u UID
+	Change user to UID when running as root.
+
+-g GID
+	Change group to GID when running as root.
+
+-t TEMPLATE
+	Filename template using Date::Format codes.  Default is "%m%d%Y-access.log",
+or "%m%d%Y-error.log".  When using the -r option, the default becomes
+"%m%d%Y-%T-access.log" or "%m%d%Y-%T-error.log".
+
+-s SYMLINK
+	Specifies the name of a symlink to the current file.
+
+-r SIZE
+	Rotate files when they reach SIZE.  SIZE is given in bytes.
+
+-d CONFIG
+	Use the DBI usage tracker.
+
+-h
+	Displays help.
+
+-v
+	Prints version information.
+
+=head1 DBI USAGE TRACKER
+
+	Vlogger can automatically keep track of per-virtualhost usage statistics in a
+database.  DBI and the relevant drivers (eg. DBD::mysql) needs to be installed for
+this to work.  Create a table in your database to hold the data.  A "mysql_create.sql"
+script is provided for using this feature with MySQL.  Configure the dsn, user, pass
+and dump values in the vlogger-dbi.conf file.  The "dump" parameter controls how often
+vlogger will dump its stats into the database (the default is 30 seconds).  Copy this
+file to somewhere convienient on your filesystem (like /etc/apache/vlogger-dbi.conf) and
+start vlogger with "-d /etc/apache/vlogger-dbi.conf".  You might want to use this feature
+to easily bill customers on a daily/weekly/monthly basis for bandwidth usage.
+
+=head1 SEE ALSO
+cronolog(1), httplog(1)
+
+=head1 BUGS
+None, yet.
+
+=head1 AUTHORS
+Steve J. Kondik <shade@chemlab.org>
+	
+WWW: http://n0rp.chemlab.org/vlogger
+	
+=cut
+
+# a couple modules we need
+use strict;
+no strict "refs";
+use warnings;
+use sigtrap qw(handler exitall HUP USR1 TERM INT PIPE);
+use Date::Format;
+use Getopt::Std;
+use IO::Handle;
+
+# get command line options
+our %OPTS;
+getopts( 'f:t:s:hu:g:aeivr:d:', \%OPTS );
+
+# print out version
+if ( $OPTS{'v'} ) {
+    print "VLogger $VERSION (apache logfile parser)\n";
+    print "Written by Steve J. Kondik <shade\@chemlab.org>\n\n";
+    print "This is free software; see the source for copying conditions.  There is NO\n";
+    print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+    exit;
+}
+
+# print help
+if ( $OPTS{'h'} || !$ARGV[0] ) {
+    usage();
+    exit;
+}
+
+# log directory
+my $LOGDIR;
+if ( $ARGV[0] ) {
+    if ( !-d $ARGV[0] ) {
+        print STDERR
+          "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n";
+        exit;
+    }
+    $LOGDIR = $ARGV[0];
+}
+$LOGDIR =~ /(.*)/;
+$LOGDIR = $1;
+
+# change uid/gid if requested (and running as root)
+if ( $> == "0" ) {
+    if ( $OPTS{'g'} ) {
+        my $guid = getgrnam( $OPTS{'g'} );
+        if ( !defined $guid || $guid == 0 ) {
+            print STDERR
+              "[vlogger] cannot run as root or nonexistant group.\n\n";
+            exit;
+        }
+
+        $) = $guid;
+        $( = $guid;
+        if ( $) != $guid and $) != ( $guid - 2**32 ) ) {
+            die "fatal: setgid to gid $guid failed\n";
+        }
+    }
+
+    if ( $OPTS{'u'} ) {
+        my $uuid = getpwnam( $OPTS{'u'} );
+        if ( !defined $uuid || $uuid == 0 ) {
+            print STDERR
+              "[vlogger] cannot run as root or nonexistant user.\n\n";
+            exit;
+        }
+
+        $> = $uuid;
+        $< = $uuid;
+        if ( $> != $uuid and $> != ( $uuid - 2**32 ) ) {
+            die "fatal: setuid to uid $uuid failed\n";
+        }
+    }
+}
+
+# set up dbi stuffs
+
+my $DBI_DSN;
+my $DBI_USER;
+my $DBI_PASS;
+my $DBI_DUMP;
+if ( $OPTS{'d'} ) {
+    if ( $OPTS{'e'} ) {
+        print "-d not valid with -e.  exiting.\n";
+        exit;
+    }
+
+    eval "use DBI";
+
+    open CONF, $OPTS{'d'};
+    while (<CONF>) {
+        chomp;
+        my @conf = split (/\s/);
+        if ( $conf[0] eq "dsn" ) {
+            $DBI_DSN = $conf[1];
+        }
+        elsif ( $conf[0] eq "user" ) {
+            $DBI_USER = $conf[1];
+        }
+        elsif ( $conf[0] eq "pass" ) {
+            $DBI_PASS = $conf[1];
+        }
+        elsif ( $conf[0] eq "dump" ) {
+            $DBI_DUMP = $conf[1];
+        }
+    }
+    close CONF;
+
+    unless ( $DBI_DSN && $DBI_USER && $DBI_PASS && $DBI_DUMP ) {
+        print "All values for DBI configuration are not properly defined.\n\n";
+        exit;
+    }
+
+    # test the connection
+    my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
+      or die "DBI Error: $!";
+    $dbh->disconnect;
+
+    # SIGALRM dumps the tracker hash
+    $SIG{ALRM} = \&dump_tracker;
+
+    alarm $DBI_DUMP;
+
+}
+
+# max files to keep open
+my $MAXFILES;
+if ( $OPTS{'f'} ) {
+    $MAXFILES = $OPTS{'f'};
+}
+else {
+    $MAXFILES = "100";
+}
+
+# filesize rotation
+my $MAXSIZE;
+if ( $OPTS{'r'} ) {
+    $MAXSIZE = $OPTS{'r'};
+}
+
+# filename template
+my $TEMPLATE;
+if ( $OPTS{'t'} ) {
+    $TEMPLATE = $OPTS{'t'};
+    $TEMPLATE =~ /(.*)/;
+    $TEMPLATE = $1;
+
+}
+elsif ( $OPTS{'e'} ) {
+    if ( $OPTS{'r'} ) {
+        $TEMPLATE = "%m%d%Y-%T-error.log";
+    }
+    else {
+        $TEMPLATE = "%m%d%Y-error.log";
+    }
+}
+else {
+    if ( $OPTS{'r'} ) {
+        $TEMPLATE = "%m%d%Y-%T-access.log";
+    }
+    else {
+        $TEMPLATE = "%m%d%Y-access.log";
+    }
+}
+
+# symlink
+if ( $OPTS{'s'} ) {
+    $OPTS{'s'} =~ /(.*)/;
+    $OPTS{'s'} = $1;
+}
+
+# chroot to the logdir
+chdir($LOGDIR);
+#chroot("."); we better do not chroot as DBI requires to load a module on the fly -> error!
+
+my %logs     = ();
+my %tracker  = ();
+my $LASTDUMP = time();
+
+# pick a mode
+if ( $OPTS{'e'} ) {
+
+    $0 = "vlogger (error log)";
+    # errorlog mode
+    open ELOG, ">>" . time2str( $TEMPLATE, time() )
+      or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) );
+
+    unless ( $OPTS{'a'} ) {
+        ELOG->autoflush(1);
+    }
+    if ( $OPTS{'s'} ) {
+        if ( -l $OPTS{'s'} ) {
+            unlink( $OPTS{'s'} );
+        }
+        symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+    }
+
+    my $LASTWRITE = time();
+
+    while ( my $log_line = <STDIN> ) {
+        unless ( $OPTS{'n'} ) {
+            if ( time2str( "%Y%m%d", time() ) >
+                time2str( "%Y%m%d", $LASTWRITE ) )
+            {
+
+                # open a new file
+                close ELOG;
+                open_errorlog();
+            }
+            elsif ( $OPTS{'r'} ) {
+
+                # check the size
+                my @filesize = ELOG->stat;
+                print $filesize[7] . "\n";
+                if ( $filesize[7] > $MAXSIZE ) {
+                    close ELOG;
+                    open_errorlog();
+                }
+            }
+
+            $LASTWRITE = time();
+        }
+
+        # we dont need to do any other parsing at all, so write the line.
+        print ELOG $log_line;
+    }
+
+}
+else {
+
+    # accesslog mode
+    $0 = "vlogger (access log)";
+    while ( my $log_line = <STDIN> ) {
+
+        # parse out the first word (the vhost)
+        my @this_line = split ( /\s/, $log_line );
+        my ($vhost) = $this_line[0];
+        my $reqsize = $this_line[10];
+        $vhost = lc($vhost) || "default";
+        if ( $vhost =~ m#[/\\]# ) { $vhost = "default" }
+        $vhost =~ /(.*)/o;
+        $vhost = $1;
+	$vhost = 'default' unless $vhost;
+
+        if ( $OPTS{'i'} ) {
+            $reqsize = $this_line[1] + $this_line[2];
+        }
+        
+        # if we're writing to a log, and it rolls to a new day, close all files.
+        unless ( $OPTS{'n'} ) {
+            if ( $logs{$vhost}
+                && ( time2str( "%Y%m%d", time() ) >
+                    time2str( "%Y%m%d", $logs{$vhost} ) ) )
+            {
+                foreach my $key ( keys %logs ) {
+                    close $key;
+                }
+                %logs = ();
+            }
+            elsif ( $OPTS{'r'} && $logs{$vhost} ) {
+
+                # check the size
+                my @filesize = $vhost->stat;
+                if ( $filesize[7] > $MAXSIZE ) {
+                    close $vhost;
+                    delete( $logs{$vhost} );
+                }
+            }
+        }
+
+        # open a new log
+        if ( !$logs{$vhost} ) {
+
+            # check how many files we have open, close the oldest one
+            if ( keys(%logs) > $MAXFILES ) {
+                my ( $key, $value ) =
+                  sort { $logs{$a} <=> $logs{$b} } ( keys(%logs) );
+                close $key;
+                delete( $logs{$key} );
+            }
+
+            # check if directory is there
+            unless ( -d "${vhost}" ) {
+                mkdir("${vhost}");
+            }
+
+            # open the file using the template
+            open $vhost, ">>${vhost}/" . time2str( $TEMPLATE, time() )
+              or die ( "can't open $LOGDIR/${vhost}/"
+                . time2str( $TEMPLATE, time() ) );
+
+            # autoflush the handle unless -a
+            if ( !$OPTS{'a'} ) {
+                $vhost->autoflush(1);
+            }
+
+            # make a symlink if -s
+            if ( $OPTS{'s'} ) {
+                chdir("${vhost}");
+                if ( -l $OPTS{'s'} ) {
+                    unlink( $OPTS{'s'} );
+                }
+                symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+                chdir("..");
+            }
+        }
+
+        # update the timestamp and write the line
+        $logs{$vhost} = time();
+        if ($OPTS{'i'}) {
+            $log_line =~ s/^\S*\s+\S*\s+\S*\s+//o;
+        }
+        else {
+            $log_line =~ s/^\S*\s+//o;
+        }
+
+        if ( $reqsize =~ m/^\d*$/ && $reqsize > 0 ) {
+            $tracker{$vhost} += $reqsize;
+        }
+
+        print $vhost $log_line;
+
+    }
+}
+
+# sub to close all files
+sub closeall {
+    if ( $OPTS{'e'} ) {
+        close ELOG;
+    }
+    else {
+        foreach my $key ( keys %logs ) {
+            close $key;
+        }
+        %logs = ();
+        if ( $OPTS{'d'} ) {
+            vlogger::dump_tracker();
+        }
+    }
+}
+
+sub exitall {
+    vlogger::closeall;
+    exit;
+}
+
+# sub to open new errorlog
+sub open_errorlog {
+    open ELOG, ">>" . time2str( $TEMPLATE, time() )
+      or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) );
+    if ( $OPTS{'s'} ) {
+        if ( -l $OPTS{'s'} ) {
+            unlink( $OPTS{'s'} );
+        }
+        symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+    }
+
+    # autoflush it unless -a
+    unless ( $OPTS{'a'} ) {
+        ELOG->autoflush(1);
+    }
+}
+
+# sub to update the database with the tracker data
+sub dump_tracker {
+    if ( keys(%tracker) > 0 ) {
+        my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
+          or warn "DBI Error: $!";
+        foreach my $key ( keys(%tracker) ) {
+            my $ts = time2str( "%Y-%m-%d", time() );
+            my $sth =
+              $dbh->prepare( "select * from web_traffic where hostname='" . $key
+                . "' and traffic_date='" . $ts . "'" );
+            $sth->execute;
+            if ( $sth->rows ) {
+                my $query =
+                  "update web_traffic set traffic_bytes=traffic_bytes+"
+                  . $tracker{$key}
+                  . " where hostname='" . $key
+                  . "' and traffic_date='" . $ts . "'";
+                $dbh->do($query);
+            }
+            else {
+                my $query = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('$key', '$ts', '$tracker{$key}')";
+                $dbh->do($query);
+            }
+        }
+        $dbh->disconnect;
+        %tracker = ();
+    }
+    alarm $DBI_DUMP;
+}
+
+# print usage info
+sub usage {
+    print "Usage: vlogger [OPTIONS]... [LOGDIR]\n";
+    print "Handles a piped logfile from a webserver, splitting it into it's\n";
+    print "host components, and rotates the files daily.\n\n";
+    print "  -a                          do not autoflush files\n";
+    print "  -e                          errorlog mode\n";
+    print "  -n                          don't rotate files\n";
+    print "  -f MAXFILES                 max number of files to keep open\n";
+    print "  -u UID                      uid to switch to when running as root\n";
+    print "  -g GID                      gid to switch to when running as root\n";
+    print "  -t TEMPLATE                 filename template (see perldoc Date::Format)\n";
+    print "  -s SYMLINK                  maintain a symlink to most recent file\n";
+    print "  -r SIZE                     rotate when file reaches SIZE\n";
+    print "  -d CONFIG                   use DBI usage tracker (see perldoc vlogger)\n";
+    print "  -i                          extract mod_logio instead of filesize\n";
+    print "  -h                          display this help\n";
+    print "  -v                          output version information\n\n";
+    print "TEMPLATE may be a filename with Date::Format codes.  The default template\n";
+    print "is %m%d%Y-access.log.  SYMLINK is the name of a file that will be linked to\n";
+    print "the most recent file inside the log directory.  The default is access.log.\n";
+    print "MAXFILES is the maximum number of filehandles to cache.  This defaults to 100.\n";
+    print "When running with -a, performance may improve, but this might confuse some\n";
+    print "log analysis software that expects complete log entries at all times.\n";
+    print "Errorlog mode is used when running with an Apache errorlog.  In this mode,\n";
+    print "virtualhost parsing is disabled, and a single file is written in LOGDIR\n";
+    print "using the TEMPLATE (%m%d%Y-error.log is default for -e).  When running with\n";
+    print "-r, the template becomes %m%d%Y-%T-xxx.log.  SIZE is given in bytes.\n\n";
+    print "Report bugs to <shade\@chemlab.org>.\n";
+}
+
diff --git a/server/server.php b/server/server.php
index 3646f81..93e4c21 100644
--- a/server/server.php
+++ b/server/server.php
@@ -54,8 +54,13 @@
 // Check if another process is running
 if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
   clearstatcache();
-  for($i=0;$i<1200;$i++){ // Wait max. 1200 sec, then proceed
+  for($i=0;$i<120;$i++){ // Wait max. 1200 sec, then proceed
     if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
+      exec("ps aux | grep '/usr/local/ispconfig/server/server.php' | grep -v 'grep' | wc -l", $check);
+      if(intval($check[0]) > 1) { // 1 because this is 2nd instance!
+          $app->log("There is already an instance of server.php running. Exiting.", LOGLEVEL_DEBUG);
+          exit;
+      }
 	  $app->log("There is already a lockfile set. Waiting another 10 seconds...", LOGLEVEL_DEBUG);
       sleep(10);
       clearstatcache();

--
Gitblit v1.9.1