diff --git a/interface/web/tools/import_ispconfig.php b/interface/web/tools/import_ispconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb0a2f3b2edcb9766c415d0b162a5690e1e64c2e
--- /dev/null
+++ b/interface/web/tools/import_ispconfig.php
@@ -0,0 +1,303 @@
+auth->check_module_permissions('admin');
+
+//* This is only allowed for administrators
+if(!$app->auth->is_admin()) die('only allowed for administrators.');
+
+$app->uses('tpl,validate_dns');
+
+$app->tpl->newTemplate('form.tpl.htm');
+$app->tpl->setInclude('content_tpl', 'templates/import_ispconfig.htm');
+$msg = '';
+$error = '';
+
+//* load language file
+$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_import_ispconfig.lng';
+include($lng_file);
+$app->tpl->setVar($wb);
+
+if(isset($_POST['connected'])) {
+ $connected = intval($_POST['connected']);
+ if($connected == 0) {
+
+ //* Try to connect to remote server
+ if(empty($_POST['remote_server'])) $error .= 'Remote Server is empty.';
+ if(empty($_POST['remote_user'])) $error .= 'Remote User is empty.';
+ if(empty($_POST['remote_password'])) $error .= 'Remote Password is empty.';
+
+ if($error == '') {
+ try {
+ $client = new SoapClient(null, array('location' => $_POST['remote_server'],
+ 'uri' => $_POST['remote_server'].'/index.php',
+ 'trace' => 1,
+ 'exceptions' => 1));
+
+ if($remote_session_id = $client->login($_POST['remote_user'],$_POST['remote_password'])) {
+ $connected = 1;
+ $msg .= 'Successfully connected to remote server.';
+ }
+ } catch (SoapFault $e) {
+ //echo $client->__getLastResponse();
+ $error .= $e->getMessage();
+ $connected = 0;
+ }
+ }
+ }
+
+ if($connected == 1) {
+
+ //* Fill the client select field
+ $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name";
+ $clients = $app->db->queryAllRecords($sql);
+ $client_select = "";
+ if(is_array($clients)) {
+ foreach( $clients as $client) {
+ $selected = @($client['groupid'] == $_POST['client_group_id'])?'SELECTED':'';
+ $client_select .= "\r\n";
+ }
+ }
+ $app->tpl->setVar("client_group_id",$client_select);
+
+
+ try {
+ $client = new SoapClient(null, array('location' => $_POST['remote_server'],
+ 'uri' => $_POST['remote_server'].'/index.php',
+ 'trace' => 1,
+ 'exceptions' => 1));
+
+ if(!isset($remote_session_id)) $remote_session_id = $_POST['remote_session_id'];
+
+ //* Get all email domains
+ $mail_domains = $client->mail_domain_get($remote_session_id, array('active' => 'y'));
+ $mail_domain_select = '';
+ if(is_array($mail_domains)) {
+ foreach( $mail_domains as $mail_domain) {
+ $selected = @($mail_domain['domain'] == $_POST['mail_domain'])?'SELECTED':'';
+ $mail_domain_select .= "\r\n";
+ }
+ }
+ $app->tpl->setVar("mail_domain",$mail_domain_select);
+
+ //* Do the import
+ if($_POST['mail_domain'] != '') start_domain_import($_POST['mail_domain']);
+
+
+
+ } catch (SoapFault $e) {
+ //echo $client->__getLastResponse();
+ $error .= $e->getMessage();
+ $connected = 0;
+ }
+
+ }
+
+}
+
+$app->tpl->setVar('remote_server',$_POST['remote_server']);
+$app->tpl->setVar('remote_user',$_POST['remote_user']);
+$app->tpl->setVar('remote_password',$_POST['remote_password']);
+$app->tpl->setVar('connected',$connected);
+$app->tpl->setVar('remote_session_id',$remote_session_id);
+$app->tpl->setVar('msg',$msg);
+$app->tpl->setVar('error',$error);
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+###########################################################
+
+function start_domain_import($mail_domain) {
+ global $app, $conf, $client, $msg, $error, $remote_session_id;
+
+ //* Get the user and groupid for the new records
+ $sys_groupid = intval($_POST['client_group_id']);
+ $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = $sys_groupid");
+ $sys_userid = intval($tmp['userid']);
+ unset($tmp);
+ if($sys_groupid == 0) $error .= 'Inavlid groupid
';
+ if($sys_userid == 0) $error .= 'Inavlid Userid
';
+
+ //* get the mail domain record
+ $mail_domain_rec = $client->mail_domain_get($remote_session_id, array('domain' => $mail_domain));
+ if(is_array($mail_domain_rec)) {
+ $mail_domain_rec = $mail_domain_rec[0];
+ $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE domain = '".$app->db->quote($mail_domain)."'");
+ if($tmp['number'] > 0) $error .= 'Domain '.$mail_domain.' exists already in local database.
';
+ unset($tmp);
+
+ //* Change the record owner and remove the index field
+ $mail_domain_rec['sys_userid'] = $sys_userid;
+ $mail_domain_rec['sys_groupid'] = $sys_groupid;
+ unset($mail_domain_rec['domain_id']);
+
+ //* Insert domain if no error occurred
+ if($error == '') {
+ $app->db->datalogInsert('mail_domain', $mail_domain_rec, 'domain_id');
+ $msg .= "Imported mail domain ".$mail_domain_rec['domain']."
";
+ } else {
+ return false;
+ }
+
+ //* Import mailboxes
+ if(isset($_POST['import_mailbox']) && $_POST['import_mailbox'] == 1) {
+ $mail_users = $client->mail_user_get($remote_session_id, array('email' => '%@'.$mail_domain));
+ if(is_array($mail_users)) {
+ foreach($mail_users as $mail_user) {
+ $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($mail_user['email'])."'");
+ if($tmp['number'] == 0) {
+
+ //* Prepare record
+ $mail_user['sys_userid'] = $sys_userid;
+ $mail_user['sys_groupid'] = $sys_groupid;
+ $remote_mailuser_id = $mail_user['mailuser_id'];
+ unset($mail_user['mailuser_id']);
+ if(!isset($_POST['import_user_filter'])) $mail_user['custom_mailfilter'] = '';
+
+ //* Insert record in DB
+ $local_mailuser_id = $app->db->datalogInsert('mail_user', $mail_user, 'mailuser_id');
+ $msg .= "Imported mailbox ".$mail_user['email']."
";
+
+ //* Import mail user filters
+ if(isset($_POST['import_user_filter']) && $_POST['import_user_filter'] == 1 && $local_mailuser_id > 0) {
+
+ $mail_user_filters = $client->mail_user_filter_get($remote_session_id, array('mailuser_id' => $remote_mailuser_id));
+
+ if(is_array($mail_user_filters)) {
+ foreach($mail_user_filters as $mail_user_filter) {
+ $mail_user_filter['sys_userid'] = $sys_userid;
+ $mail_user_filter['sys_groupid'] = $sys_groupid;
+ $mail_user_filter['mailuser_id'] = $local_mailuser_id;
+ unset($mail_user_filter['filter_id']);
+
+ //* Insert record in DB
+ $app->db->datalogInsert('mail_user_filter', $mail_user_filter, 'filter_id');
+ $msg .= "Imported mailbox filter ".$mail_user['email'].": ".$mail_user_filter['rulename']."
";
+ }
+ }
+ }
+ } else {
+ $error .= "Mailbox ".$mail_user['email']." exists in local database. Skipped import of mailbox
";
+ }
+
+ }
+ }
+ }
+
+ //* Import email aliases
+ if(isset($_POST['import_alias']) && $_POST['import_alias'] == 1) {
+ $mail_aliases = $client->mail_alias_get($remote_session_id, array('type' => 'alias', 'destination' => '%@'.$mail_domain));
+ if(is_array($mail_aliases)) {
+ foreach($mail_aliases as $mail_alias) {
+ $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'alias' AND source = '".$app->db->quote($mail_alias['source'])."' AND destination = '".$app->db->quote($mail_alias['destination'])."'");
+ if($tmp['number'] == 0) {
+ $mail_alias['sys_userid'] = $sys_userid;
+ $mail_alias['sys_groupid'] = $sys_groupid;
+ unset($mail_alias['forwarding_id']);
+ $app->db->datalogInsert('mail_forwarding', $mail_alias, 'forwarding_id');
+ $msg .= "Imported email alias ".$mail_alias['source']."
";
+ } else {
+ $error .= "Email alias ".$mail_alias['source']." exists in local database. Skipped import.
";
+ }
+
+ }
+ }
+ }
+
+ //* Import domain aliases
+ if(isset($_POST['import_aliasdomain']) && $_POST['import_aliasdomain'] == 1) {
+ $mail_aliases = $client->mail_alias_get($remote_session_id, array('type' => 'aliasdomain', 'destination' => '@'.$mail_domain));
+ if(is_array($mail_aliases)) {
+ foreach($mail_aliases as $mail_alias) {
+ $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'aliasdomain' AND source = '".$app->db->quote($mail_alias['source'])."' AND destination = '".$app->db->quote($mail_alias['destination'])."'");
+ if($tmp['number'] == 0) {
+ $mail_alias['sys_userid'] = $sys_userid;
+ $mail_alias['sys_groupid'] = $sys_groupid;
+ unset($mail_alias['forwarding_id']);
+ $app->db->datalogInsert('mail_forwarding', $mail_alias, 'forwarding_id');
+ $msg .= "Imported email aliasdomain ".$mail_alias['source']."
";
+ } else {
+ $error .= "Email aliasdomain ".$mail_alias['source']." exists in local database. Skipped import.
";
+ }
+
+ }
+ }
+ }
+
+ //* Import email forward
+ if(isset($_POST['import_forward']) && $_POST['import_forward'] == 1) {
+ $mail_forwards = $client->mail_forward_get($remote_session_id, array('type' => 'forward', 'source' => '%@'.$mail_domain));
+ if(is_array($mail_forwards)) {
+ foreach($mail_forwards as $mail_forward) {
+ $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'forward' AND source = '".$app->db->quote($mail_forward['source'])."' AND destination = '".$app->db->quote($mail_forward['destination'])."'");
+ if($tmp['number'] == 0) {
+ $mail_forward['sys_userid'] = $sys_userid;
+ $mail_forward['sys_groupid'] = $sys_groupid;
+ unset($mail_forward['forwarding_id']);
+ $app->db->datalogInsert('mail_forwarding', $mail_forward, 'forwarding_id');
+ $msg .= "Imported email forward ".$mail_forward['source']."
";
+ } else {
+ $error .= "Email forward ".$mail_forward['source']." exists in local database. Skipped import.
";
+ }
+
+ }
+ }
+ }
+
+ //* Import spamfilter
+ if(isset($_POST['import_spamfilter']) && $_POST['import_spamfilter'] == 1) {
+ $mail_spamfilters = $client->mail_spamfilter_user_get($remote_session_id, array('email' => '%@'.$mail_domain));
+ if(is_array($mail_spamfilters)) {
+ foreach($mail_spamfilters as $mail_spamfilter) {
+ $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE email = '".$app->db->quote($mail_spamfilter['email'])."'");
+ if($tmp['number'] == 0) {
+ $mail_spamfilter['sys_userid'] = $sys_userid;
+ $mail_spamfilter['sys_groupid'] = $sys_groupid;
+ unset($mail_spamfilter['id']);
+ $app->db->datalogInsert('spamfilter_users', $mail_spamfilter, 'id');
+ $msg .= "Imported spamfilter user ".$mail_spamfilter['email']."
";
+ } else {
+ $error .= "Spamfilter user ".$mail_spamfilter['email']." exists in local database. Skipped import.
";
+ }
+
+ }
+ }
+ }
+
+ }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en.lng b/interface/web/tools/lib/lang/en.lng
index 0122dcd8f2c69c957d5cf86a578eba78f370b211..597be726c5948114b2db86dbcca18d932bb1327d 100644
--- a/interface/web/tools/lib/lang/en.lng
+++ b/interface/web/tools/lib/lang/en.lng
@@ -6,4 +6,5 @@ $wb['Password and Language'] = 'Password and Language';
$wb['ispconfig_tools_note'] = 'This module allows you to change the password and language and to start a resync of the DNS records.';
$wb['Sync Tools'] = 'Sync Tools';
$wb['Resync'] = 'Resync';
+$wb['Import'] = 'Import';
?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en_import_ispconfig.lng b/interface/web/tools/lib/lang/en_import_ispconfig.lng
new file mode 100644
index 0000000000000000000000000000000000000000..65ea1459806162a7ad5868dfc5325186b93edcd3
--- /dev/null
+++ b/interface/web/tools/lib/lang/en_import_ispconfig.lng
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en_resync.lng b/interface/web/tools/lib/lang/en_resync.lng
index ae87bbda5348ae1af049f6b9cf785ac18c77bd46..f4cbf0d7fc7ce9f3faeab69ba3bfbd6cbeae1776 100644
--- a/interface/web/tools/lib/lang/en_resync.lng
+++ b/interface/web/tools/lib/lang/en_resync.lng
@@ -5,7 +5,7 @@ $wb['resync_sites_txt'] = 'Resync Websites';
$wb['resync_ftp_txt'] = 'Resync FTP users';
$wb['resync_shell_txt'] = 'Resync shell users';
$wb['resync_cron_txt'] = 'Resync cronjobs';
-$wb['resync_db_txt'] = 'Resync database config';
+$wb['resync_db_txt'] = 'Resync clientdb config';
$wb['resync_mailbox_txt'] = 'Resync Mailboxes';
$wb['resync_dns_txt'] = 'Resync DNS records';
$wb['btn_start_txt'] = 'Start';
diff --git a/interface/web/tools/lib/menu.d/import.menu.php b/interface/web/tools/lib/menu.d/import.menu.php
new file mode 100644
index 0000000000000000000000000000000000000000..086fd6355788072aa8bc48d7b4e4ed37c1998159
--- /dev/null
+++ b/interface/web/tools/lib/menu.d/import.menu.php
@@ -0,0 +1,22 @@
+auth->is_admin()) {
+
+$items = array();
+
+$items[] = array( 'title' => 'ISPConfig 3',
+ 'target' => 'content',
+ 'link' => 'tools/import_ispconfig.php');
+
+
+$module['nav'][] = array( 'title' => 'Import',
+ 'open' => 1,
+ 'items' => $items);
+
+unset($items);
+}
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/templates/import_ispconfig.htm b/interface/web/tools/templates/import_ispconfig.htm
new file mode 100644
index 0000000000000000000000000000000000000000..4980dc42afcaa3f4cc70ba87cc63228ec363021f
--- /dev/null
+++ b/interface/web/tools/templates/import_ispconfig.htm
@@ -0,0 +1,105 @@
+