diff --git a/_test/tests/inc/auth_deleteprofile.test.php b/_test/tests/inc/auth_deleteprofile.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc38fcd16faa10b6467f6ccc4399ba99cf2a8b0a
--- /dev/null
+++ b/_test/tests/inc/auth_deleteprofile.test.php
@@ -0,0 +1,179 @@
+<?php
+
+class Mock_Auth_Plugin extends DokuWiki_Auth_Plugin {
+
+	public $loggedOff = false;
+
+    public function __construct($canDeleteUser = true) {
+		$this->cando['delUser'] = $canDeleteUser;
+    }
+
+    public function checkPass($user, $pass) {
+        return $pass == 'password';
+    }
+
+    public function deleteUsers($users) {
+    	return in_array($_SERVER['REMOTE_USER'], $users);
+    }
+
+    public function logoff() {
+    	$this->loggedOff = true;
+    }
+
+}
+
+class auth_deleteprofile_test extends DokuWikiTest {
+
+    /*
+     * Tests:
+     *
+     * 1.   It works and the user is logged off 
+     * 2.   Password matches when config requires it
+     * 3,4. Auth plugin can prevent & wiki config can prevent
+     * 5.  Any of invalid security token, missing/not set 'delete' flag, missing/unchecked 'confirm_delete'
+     *
+     */
+
+    function test_success() {
+
+        global $ACT, $INPUT, $conf, $auth;
+
+        $ACT = 'profile_delete';
+        $conf['profileconfirm'] = false;
+    	$_SERVER['REMOTE_USER'] = 'testuser';
+
+        $input = array(
+            'do'                 => $ACT,
+            'sectok'             => getSecurityToken(),
+            'delete'             => '1',
+            'confirm_delete'     => '1',
+        );
+
+        $_POST = $input;
+        $_REQUEST = $input;
+        $INPUT = new Input();
+
+        $auth = new Mock_Auth_Plugin();
+
+        $this->assertTrue(auth_deleteprofile());
+        $this->assertTrue($auth->loggedOff);
+    }
+
+    function test_confirmation_required() {
+
+        global $ACT, $INPUT, $conf, $auth;
+
+        $ACT = 'profile_delete';
+        $conf['profileconfirm'] = true;
+    	$_SERVER['REMOTE_USER'] = 'testuser';
+
+        $input = array(
+            'do'                 => $ACT,
+            'sectok'             => getSecurityToken(),
+            'delete'             => '1',
+            'confirm_delete'     => '1',
+            'oldpass'            => 'wrong',
+        );
+
+        $_POST = $input;
+        $_REQUEST = $input;
+        $INPUT = new Input();
+
+        $auth = new Mock_Auth_Plugin();
+
+        // password check required - it fails, so don't delete profile
+        $this->assertFalse(auth_deleteprofile());
+
+        // now it passes, we're good to go
+        $INPUT->set('oldpass','password');
+        $INPUT->post->set('oldpass','password');
+        $this->assertTrue(auth_deleteprofile());
+    }
+
+    function test_authconfig_prevents() {
+
+        global $ACT, $INPUT, $conf, $auth;
+
+        $ACT = 'profile_delete';
+        $conf['profileconfirm'] = false;
+    	$_SERVER['REMOTE_USER'] = 'testuser';
+
+        $input = array(
+            'do'                 => $ACT,
+            'sectok'             => getSecurityToken(),
+            'delete'             => '1',
+            'confirm_delete'     => '1',
+        );
+
+        $_POST = $input;
+        $_REQUEST = $input;
+        $INPUT = new Input();
+
+        $auth = new Mock_Auth_Plugin(false);
+        $conf['disableactions'] = '';
+        $this->assertFalse(auth_deleteprofile());
+    }
+
+    function test_wikiconfig_prevents() {
+
+        global $ACT, $INPUT, $conf, $auth;
+
+        $ACT = 'profile_delete';
+        $conf['profileconfirm'] = false;
+    	$_SERVER['REMOTE_USER'] = 'testuser';
+
+        $input = array(
+            'do'                 => $ACT,
+            'sectok'             => getSecurityToken(),
+            'delete'             => '1',
+            'confirm_delete'     => '1',
+        );
+
+        $_POST = $input;
+        $_REQUEST = $input;
+        $INPUT = new Input();
+
+        $auth = new Mock_Auth_Plugin();
+        $conf['disableactions'] = 'profile_delete';
+
+        $this->assertFalse(actionOK('profile_delete'));
+        $this->assertTrue($auth->canDo('delUser'));
+
+        $this->assertFalse(auth_deleteprofile());
+    }
+
+    function test_basic_parameters() {
+
+        global $ACT, $INPUT, $conf, $auth;
+
+        $ACT = 'profile_delete';
+        $conf['profileconfirm'] = true;
+    	$_SERVER['REMOTE_USER'] = 'testuser';
+
+        $input = array(
+            'do'                 => $ACT,
+            'sectok'             => getSecurityToken(),
+            'delete'             => '1',
+            'confirm_delete'     => '1',
+            'oldpass'            => 'password',
+        );
+
+        $_POST = $input;
+        $_REQUEST = $input;
+        $input_foundation = new Input();
+
+        $auth = new Mock_Auth_Plugin();
+
+        $INPUT = clone $input_foundation;
+        $INPUT->remove('delete');
+        $this->assertFalse(auth_deleteprofile());
+
+        $INPUT = clone $input_foundation;
+        $INPUT->set('sectok','wrong');
+        $this->assertFalse(auth_deleteprofile());
+
+        $INPUT = clone $input_foundation;
+        $INPUT->remove('confirm_delete');
+        $this->assertFalse(auth_deleteprofile());
+    }
+}
\ No newline at end of file
diff --git a/inc/actions.php b/inc/actions.php
index da3414eb203dd9c939029bd5592bb831ae1385d4..bf124c88709ce81857b04c357988fa9c6ca09cb8 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -92,14 +92,26 @@ function act_dispatch(){
             $ACT = 'login';
         }
 
-        //update user profile
-        if ($ACT == 'profile') {
+        // user profile changes
+        if (in_array($ACT, array('profile','profile_delete'))) {
             if(!$_SERVER['REMOTE_USER']) {
                 $ACT = 'login';
             } else {
-                if(updateprofile()) {
-                    msg($lang['profchanged'],1);
-                    $ACT = 'show';
+                switch ($ACT) {
+                    case 'profile' :
+                        if(updateprofile()) {
+                            msg($lang['profchanged'],1);
+                            $ACT = 'show';
+                        }
+                        break;
+                    case 'profile_delete' :
+                        if(auth_deleteprofile()){
+                            msg($lang['profdeleted'],1);
+                            $ACT = 'show';
+                        } else {
+                            $ACT = 'profile';
+                        }
+                        break;
                 }
             }
         }
@@ -247,7 +259,7 @@ function act_validate($act) {
     //disable all acl related commands if ACL is disabled
     if(!$conf['useacl'] && in_array($act,array('login','logout','register','admin',
                     'subscribe','unsubscribe','profile','revert',
-                    'resendpwd'))){
+                    'resendpwd','profile_delete'))){
         msg('Command unavailable: '.htmlspecialchars($act),-1);
         return 'show';
     }
@@ -258,7 +270,7 @@ function act_validate($act) {
     if(!in_array($act,array('login','logout','register','save','cancel','edit','draft',
                     'preview','search','show','check','index','revisions',
                     'diff','recent','backlink','admin','subscribe','revert',
-                    'unsubscribe','profile','resendpwd','recover',
+                    'unsubscribe','profile','profile_delete','resendpwd','recover',
                     'draftdel','sitemap','media')) && substr($act,0,7) != 'export_' ) {
         msg('Command unknown: '.htmlspecialchars($act),-1);
         return 'show';
@@ -287,7 +299,7 @@ function act_permcheck($act){
         }else{
             $permneed = AUTH_CREATE;
         }
-    }elseif(in_array($act,array('login','search','recent','profile','index', 'sitemap'))){
+    }elseif(in_array($act,array('login','search','recent','profile','profile_delete','index', 'sitemap'))){
         $permneed = AUTH_NONE;
     }elseif($act == 'revert'){
         $permneed = AUTH_ADMIN;
diff --git a/inc/auth.php b/inc/auth.php
index a1c92ec804a503ba876a74f7251167885305b2a2..be6b7ebbe4a21191937ef4423ea6f19d0cd15c3e 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -1042,6 +1042,45 @@ function updateprofile() {
     return false;
 }
 
+function auth_deleteprofile(){
+    global $conf;
+    global $lang;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!$INPUT->post->bool('delete')) return false;
+    if(!checkSecurityToken()) return false;
+
+    // action prevented or auth module disallows 
+    if(!actionOK('profile_delete') || !$auth->canDo('delUser')) {
+        msg($lang['profnodelete'], -1);
+        return false;
+    }
+
+    if(!$INPUT->post->bool('confirm_delete')){
+        msg($lang['profconfdeletemissing'], -1);
+        return false;
+    }
+
+    if($conf['profileconfirm']) {
+        if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) {
+            msg($lang['badpassconfirm'], -1);
+            return false;
+        }
+    }
+
+    $deleted[] = $_SERVER['REMOTE_USER'];
+    if($auth->triggerUserMod('delete', array($deleted))) {
+        // force and immediate logout including removing the sticky cookie
+        auth_logoff();
+        return true;
+    }
+
+    return false;
+}
+
 /**
  * Send a  new password
  *
diff --git a/inc/confutils.php b/inc/confutils.php
index 404cc6050dff8c4cc5406d5a8044935ea7aadbad..0ac003b72b992fe5509c9a189ff4e2bfac91ea6e 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -241,7 +241,7 @@ function getConfigFiles($type) {
  */
 function actionOK($action){
     static $disabled = null;
-    if(is_null($disabled)){
+    if(is_null($disabled) || defined('SIMPLE_TEST')){
         global $conf;
         /** @var auth_basic $auth */
         global $auth;
@@ -261,6 +261,9 @@ function actionOK($action){
         if (is_null($auth) || !$auth->canDo('Profile')) {
             $disabled[] = 'profile';
         }
+        if (is_null($auth) || !$auth->canDo('delUser')) {
+            $disabled[] = 'profile_delete';
+        }
         if (is_null($auth)) {
             $disabled[] = 'login';
         }
diff --git a/inc/html.php b/inc/html.php
index 2d2bb8a7c3a4dba78516b6cad3703010db193a39..96c4eaa1a5f36f5c337096016642b10baad7ad67 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -1390,6 +1390,23 @@ function html_updateprofile(){
 
     $form->endFieldset();
     html_form('updateprofile', $form);
+
+    if ($auth->canDo('delUser') && actionOK('profile_delete')) {
+        $form_profiledelete = new Doku_Form(array('id' => 'dw__profiledelete'));
+        $form_profiledelete->startFieldset($lang['profdeleteuser']);
+        $form_profiledelete->addHidden('do', 'profile_delete');
+        $form_profiledelete->addHidden('delete', '1');
+        $form_profiledelete->addElement(form_makeCheckboxField('confirm_delete', '1', $lang['profconfdelete'],'dw__confirmdelete','', array('required' => 'required')));
+        if ($conf['profileconfirm']) {
+            $form_profiledelete->addElement(form_makeTag('br'));
+            $form_profiledelete->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50', 'required' => 'required')));
+        }
+        $form_profiledelete->addElement(form_makeButton('submit', '', $lang['btn_deleteuser']));
+        $form_profiledelete->endFieldset();
+
+        html_form('profiledelete', $form_profiledelete);
+    }
+
     print '</div>'.NL;
 }
 
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index a8e7f45b75f3aa207546c0e0472409696283f67c..4ee9a0eed23e93c1830931089707f2e30cc83f07 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -64,6 +64,7 @@ $lang['btn_revert']            = 'Wiederherstellen';
 $lang['btn_register']          = 'Registrieren';
 $lang['btn_apply']             = 'Ãœbernehmen';
 $lang['btn_media']             = 'Medien-Manager';
+$lang['btn_deleteuser']        = 'Benutzerprofil löschen';
 $lang['loggedinas']            = 'Angemeldet als';
 $lang['user']                  = 'Benutzername';
 $lang['pass']                  = 'Passwort';
@@ -75,6 +76,7 @@ $lang['fullname']              = 'Voller Name';
 $lang['email']                 = 'E-Mail';
 $lang['profile']               = 'Benutzerprofil';
 $lang['badlogin']              = 'Benutzername oder Passwort sind falsch.';
+$lang['badpassconfirm']        = 'Das Passwort war falsch.';
 $lang['minoredit']             = 'Kleine Änderung';
 $lang['draftdate']             = 'Entwurf gespeichert am';
 $lang['nosecedit']             = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.';
@@ -91,6 +93,11 @@ $lang['profna']                = 'Änderung des Benutzerprofils in diesem Wiki n
 $lang['profnochange']          = 'Keine Änderungen, nichts zu tun.';
 $lang['profnoempty']           = 'Es muss ein Name oder eine E-Mail Adresse angegeben werden.';
 $lang['profchanged']           = 'Benutzerprofil erfolgreich geändert.';
+$lang['profnodelete']          = 'Dieses Wiki unterstützt nicht das Löschen von Benutzern.';
+$lang['profdeleteuser']        = 'Benutzerprofil löschen'; 
+$lang['profdeleted']           = 'Dein Benutzerprofil wurde im Wiki gelöscht.';
+$lang['profconfdelete']        = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
+$lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.'; 
 $lang['pwdforget']             = 'Passwort vergessen? Fordere ein neues an';
 $lang['resendna']              = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
 $lang['resendpwd']             = 'Neues Passwort setzen für';
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index b914f01aa56805b71d75350ada6ef699238a266e..496eff2e5cb44be4d0cb23f984b54b4d1ec4919d 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -65,6 +65,7 @@ $lang['btn_revert']            = 'Wiederherstellen';
 $lang['btn_register']          = 'Registrieren';
 $lang['btn_apply']             = 'Ãœbernehmen';
 $lang['btn_media']             = 'Medien-Manager';
+$lang['btn_deleteuser']        = 'Benutzerprofil löschen';
 $lang['loggedinas']            = 'Angemeldet als';
 $lang['user']                  = 'Benutzername';
 $lang['pass']                  = 'Passwort';
@@ -76,6 +77,7 @@ $lang['fullname']              = 'Voller Name';
 $lang['email']                 = 'E-Mail';
 $lang['profile']               = 'Benutzerprofil';
 $lang['badlogin']              = 'Benutzername oder Passwort sind falsch.';
+$lang['badpassconfirm']        = 'Das Passwort war falsch.';
 $lang['minoredit']             = 'kleine Änderung';
 $lang['draftdate']             = 'Entwurf gespeichert am';
 $lang['nosecedit']             = 'Diese Seite wurde in der Zwischenzeit geändert, Sektionsinfo ist veraltet, lade stattdessen volle Seite.';
@@ -92,6 +94,11 @@ $lang['profna']                = 'Änderung des Benutzerprofils in diesem Wiki n
 $lang['profnochange']          = 'Keine Änderungen, nichts zu tun.';
 $lang['profnoempty']           = 'Es muss ein Name und eine E-Mail-Adresse angegeben werden.';
 $lang['profchanged']           = 'Benutzerprofil erfolgreich geändert.';
+$lang['profnodelete']          = 'Dieses Wiki unterstützt nicht das Löschen von Benutzern.';
+$lang['profdeleteuser']        = 'Benutzerprofil löschen'; 
+$lang['profdeleted']           = 'Ihr Benutzerprofil wurde im Wiki gelöscht.';
+$lang['profconfdelete']        = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
+$lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.'; 
 $lang['pwdforget']             = 'Passwort vergessen? Fordere ein neues an';
 $lang['resendna']              = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
 $lang['resendpwd']             = 'Neues Passwort setzen für';
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 00e71d254590224325d8a1e208584729069d9bc1..630ccb3ffec1b6f45289cd32b0c9bb6a8936b4f2 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -51,6 +51,7 @@ $lang['btn_revert']            = 'Restore';
 $lang['btn_register']          = 'Register';
 $lang['btn_apply']             = 'Apply';
 $lang['btn_media']             = 'Media Manager';
+$lang['btn_deleteuser']        = 'Remove My Account';
 
 $lang['loggedinas']            = 'Logged in as';
 $lang['user']                  = 'Username';
@@ -63,6 +64,7 @@ $lang['fullname']              = 'Real name';
 $lang['email']                 = 'E-Mail';
 $lang['profile']               = 'User Profile';
 $lang['badlogin']              = 'Sorry, username or password was wrong.';
+$lang['badpassconfirm']        = 'Sorry, the password was wrong';
 $lang['minoredit']             = 'Minor Changes';
 $lang['draftdate']             = 'Draft autosaved on'; // full dformat date will be added
 $lang['nosecedit']             = 'The page was changed in the meantime, section info was out of date loaded full page instead.';
@@ -81,6 +83,11 @@ $lang['profna']                = 'This wiki does not support profile modificatio
 $lang['profnochange']          = 'No changes, nothing to do.';
 $lang['profnoempty']           = 'An empty name or email address is not allowed.';
 $lang['profchanged']           = 'User profile successfully updated.';
+$lang['profnodelete']          = 'This wiki does not support deleting users';
+$lang['profdeleteuser']        = 'Delete Account'; 
+$lang['profdeleted']           = 'Your user account has been deleted from this wiki';
+$lang['profconfdelete']        = 'I wish to remove my account from this wiki. <br/> This action can not be undone.';
+$lang['profconfdeletemissing'] = 'Confirmation check box not ticked';
 
 $lang['pwdforget']             = 'Forgotten your password? Get a new one';
 $lang['resendna']              = 'This wiki does not support password resending.';
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index 8d0e7b0473f7ab6f62446fa60c674945f5e97847..67d3ce51f7cc7697ccb0c5c2fc5f7c71e846d321 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -99,6 +99,7 @@ $lang['disableactions'] = 'Disable DokuWiki actions';
 $lang['disableactions_check'] = 'Check';
 $lang['disableactions_subscription'] = 'Subscribe/Unsubscribe';
 $lang['disableactions_wikicode'] = 'View source/Export Raw';
+$lang['disableactions_profile_delete'] = 'Delete Own Account';
 $lang['disableactions_other'] = 'Other actions (comma separated)';
 $lang['auth_security_timeout'] = 'Authentication Security Timeout (seconds)';
 $lang['securecookie'] = 'Should cookies set via HTTPS only be sent via HTTPS by the browser? Disable this option when only the login of your wiki is secured with SSL but browsing the wiki is done unsecured.';
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index 2fb08037d468c91a14d8474ca66abaa76e46c1ba..5d9b049a43339f652ec268f6f100de7d3ec5f240 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -128,7 +128,7 @@ $meta['manager']     = array('string');
 $meta['profileconfirm'] = array('onoff');
 $meta['rememberme'] = array('onoff');
 $meta['disableactions'] = array('disableactions',
-                                '_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','edit','wikicode','check'),
+                                '_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','profile_delete','edit','wikicode','check'),
                                 '_combine' => array('subscription' => array('subscribe','unsubscribe'), 'wikicode' => array('source','export_raw')));
 $meta['auth_security_timeout'] = array('numeric');
 $meta['securecookie'] = array('onoff');
diff --git a/lib/tpl/dokuwiki/css/_forms.css b/lib/tpl/dokuwiki/css/_forms.css
index 6744750ba2985bbe18604023e69d59099c80d365..84b7db8e169b42ec1bbe58558025d5865609099a 100644
--- a/lib/tpl/dokuwiki/css/_forms.css
+++ b/lib/tpl/dokuwiki/css/_forms.css
@@ -79,7 +79,10 @@
 #dw__register fieldset {
     padding-bottom: 0.7em;
 }
-
+#dw__profiledelete {
+    display: block;
+    margin-top: 2.8em;
+}
 
 /**
  * Styles for the subscription page