diff --git a/ext/tagger/images/active.png b/ext/tagger/images/active.png
deleted file mode 100644
index 4e4942c8..00000000
Binary files a/ext/tagger/images/active.png and /dev/null differ
diff --git a/ext/tagger/images/add-tag.png b/ext/tagger/images/add-tag.png
deleted file mode 100644
index dccedf8d..00000000
Binary files a/ext/tagger/images/add-tag.png and /dev/null differ
diff --git a/ext/tagger/images/inactive.png b/ext/tagger/images/inactive.png
deleted file mode 100644
index 20fb1139..00000000
Binary files a/ext/tagger/images/inactive.png and /dev/null differ
diff --git a/ext/tagger/images/rem-tag.png b/ext/tagger/images/rem-tag.png
deleted file mode 100644
index 5fb9827a..00000000
Binary files a/ext/tagger/images/rem-tag.png and /dev/null differ
diff --git a/ext/tagger/images/tag-img.psd b/ext/tagger/images/tag-img.psd
deleted file mode 100644
index 4404dfee..00000000
Binary files a/ext/tagger/images/tag-img.psd and /dev/null differ
diff --git a/ext/tagger/info.php b/ext/tagger/info.php
deleted file mode 100644
index 3eedce9d..00000000
--- a/ext/tagger/info.php
+++ /dev/null
@@ -1,12 +0,0 @@
-"artanis.00@gmail.com"];
-    public $dependencies = [TaggerXMLInfo::KEY];
-    public $description = "Advanced Tagging v2";
-}
diff --git a/ext/tagger/main.php b/ext/tagger/main.php
deleted file mode 100644
index 645d3a19..00000000
--- a/ext/tagger/main.php
+++ /dev/null
@@ -1,28 +0,0 @@
-can(Permissions::EDIT_IMAGE_TAG) && ($event->image->is_locked() || $user->can(Permissions::EDIT_IMAGE_LOCK))) {
-            $this->theme->build_tagger($page, $event);
-        }
-    }
-
-    public function onSetupBuilding(SetupBuildingEvent $event)
-    {
-        $sb = new SetupBlock("Tagger");
-        $sb->add_int_option("ext_tagger_search_delay", "Delay queries by ");
-        $sb->add_label(" milliseconds.");
-        $sb->add_label("
Limit queries returning more than ");
-        $sb->add_int_option("ext_tagger_tag_max");
-        $sb->add_label(" tags to ");
-        $sb->add_int_option("ext_tagger_limit");
-        $event->panel->add_block($sb);
-    }
-}
diff --git a/ext/tagger/script.js b/ext/tagger/script.js
deleted file mode 100644
index 1a72e04e..00000000
--- a/ext/tagger/script.js
+++ /dev/null
@@ -1,221 +0,0 @@
-/*jshint forin:false, nonew:true, undef:true, strict:false, browser:true, jquery:true */
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
-* Tagger - Advanced Tagging v2                                                *
-* Author: Artanis (Erik Youngren )                      *
-* Do not remove this notice.                                                  *
-\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-function byId(id) {
-	return document.getElementById(id);
-}
-
-var Tagger = {
-	initialize : function (image_id) {
-	// object navigation
-		this.tag.parent       = this;
-		this.position.parent  = this;
-	// components
-		this.editor.container = byId('tagger_parent');
-		this.editor.titlebar  = byId('tagger_titlebar');
-		this.editor.toolbar   = byId('tagger_toolbar');
-		//this.editor.menu      = byId('tagger_p-menu');
-		this.editor.body      = byId('tagger_body');
-		this.editor.tags      = byId('tagger_tags');
-		this.editor.form      = this.editor.tags.parentNode;
-		this.editor.statusbar = byId('tagger_statusbar');
-	// initial data
-		this.tag.image        = image_id;
-		this.tag.query        = config.make_link("tagger/tags");
-		this.tag.list         = null;
-		this.tag.suggest      = null;
-		this.tag.image_tags();
-
-	// reveal
-		this.editor.container.style.display = "";
-
-	// dragging
-		DragHandler.attach(this.editor.titlebar);
-
-	// positioning
-		this.position.load();
-
-	// events
-		window.onunload = function () { Tagger.position.save(); };
-	},
-
-	alert : function (type,text,timeout) {
-		var id = "tagger_alert-"+type;
-		var t_alert = byId(id);
-		if (t_alert) {
-			if(text === false) {
-				// remove
-				t_alert.parentNode.removeChild(t_alert);
-			} else {
-				// update
-				t_alert.innerHTML = text;
-			}
-		} else if (text) {
-			// create
-			t_alert = document.createElement("div");
-			t_alert.setAttribute("id",id);
-			t_alert.appendChild(document.createTextNode(text));
-			this.editor.statusbar.appendChild(t_alert);
-			if(timeout>1) {
-				console.log("Tagger.alert('"+type+"',false,0)");
-				setTimeout("Tagger.alert('"+type+"',false,0)",timeout);
-			}
-		}
-	},
-
-	editor : {},
-
-	tag : {
-		submit : function () {
-			var l = this.list.childNodes.length;
-			var tags = [];
-			for(var i=0; i 0) {
-				var tag = document.createElement("tag");
-				tag.setAttribute("count","0");
-				tag.setAttribute("id","newTag_"+tag_name);
-				tag.setAttribute("title","New - 0 uses");
-				tag.onclick = function() {
-					Tagger.tag.toggle(this);
-				};
-				tag.appendChild(document.createTextNode(tag_name));
-				Tagger.tag.list.appendChild(tag);
-			}
-		},
-
-		toggle : function (tag) {
-			if(tag.parentNode == this.list) {
-				this.list.removeChild(tag);
-			} else {
-				this.list.appendChild(tag);
-			}
-		},
-
-		ajax : function (url, callback) {
-			var http = new XMLHttpRequest();
-			http.open("GET",url,true);
-			http.onreadystatechange = function () {
-				if(http.readyState == 4) { callback(http); }
-			};
-			http.send(null);
-		}
-	},
-
-	position : {
-		set : function (x,y) {
-			if (!x || !y) {
-				this.parent.editor.container.style.top = "25px";
-				this.parent.editor.container.style.left = "";
-				this.parent.editor.container.style.right = "25px";
-				this.parent.editor.container.style.bottom = "";
-
-				var xy = this.get();
-				x = xy[0];
-				y = xy[1];
-			}
-			this.parent.editor.container.style.top = y+"px";
-			this.parent.editor.container.style.left = x+"px";
-			this.parent.editor.container.style.right = "";
-			this.parent.editor.container.style.bottom = "";
-		},
-
-		get : function () {
-			// https://www.quirksmode.org/js/findpos.html
-			var left = 0;
-			var top  = 0;
-			var obj  = this.parent.editor.container;
-			if(obj.offsetParent) {
-				left = obj.offsetLeft;
-				top  = obj.offsetTop;
-				while (obj = obj.offsetParent) {
-					left += obj.offsetLeft;
-					top  += obj.offsetTop;
-				}
-			}
-			return [left,top];
-		},
-
-		save : function (x,y) {
-			if (!x || !y) {
-				var xy = this.get();
-				x = xy[0];
-				y = xy[1];
-			}
-			Cookies.set(config.title+"_tagger-position", x+" "+y, {expires: 14});
-		},
-
-		load : function () {
-			var p = Cookies.get(config.title+"_tagger-position");
-			if(p) {
-				var xy = p.split(" ");
-				this.set(xy[0],xy[1]);
-			} else {
-				this.set();
-			}
-		}
-	}
-};
diff --git a/ext/tagger/style.css b/ext/tagger/style.css
deleted file mode 100644
index ba9f8407..00000000
--- a/ext/tagger/style.css
+++ /dev/null
@@ -1,103 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Tagger - Advanced Tagging v2                                              *
- * Author: Artanis (Erik Youngren )                    *
- * Do not remove this notice.                                                *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#tagger_parent {
-	text-align:left;
-	position:fixed;
-	max-width:300px;
-
-}
-#tagger_parent * {
-	background-color:#EEE;
-}
-
-#tagger_titlebar {
-	background-color:#ddd;
-	border:2px solid;
-	cursor:move;
-	font-weight:bold;
-	-moz-border-radius:5px 5px 0 0;
-	padding:.25em;
-	text-align:center;
-}
-
-#tagger_toolbar, #tagger_body {
-	padding:2px 2px 0 2px;
-	border-style:solid;
-	border-width: 0 2px 0 2px;
-}
-#tagger_body {
-	max-height:175px;
-	overflow-x:hidden;
-	overflow-y:auto;
-}
-
-#tagger_statusbar {
-	background-color:#ddd;
-	border:2px solid;
-	font-weight: bold;
-	min-height:16px;
-	-moz-border-radius:0 0 5px 5px;
-	padding:.25em;
-} #tagger_statusbar * { background-color:#ddd; }
-
-#tagger_body div {
-	padding-top:2px;
-	margin-top:2px;
-	border-top:1px solid;
-}
-
-/* Tagger Styling
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#tagger_parent form {
-	display:inline;
-}
-#tagger_parent input {
-	width:auto;
-}
-#tagger_parent input[type=text] {
-	background-color:white;
-}
-
-/* Custom Element Base Styles
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#tagger_parent list {
-	display: block;
-}
-#tagger_parent tag {
-	font-size:1.25em;
-	display:block;
-}
-
-#tagger_parent list[id=image] tag:before {
-	content:url('./images/active.png');
-}
-
-#tagger_parent list[id=search] tag:before {
-	content:url('./images/inactive.png');
-}
-/* Hovering */
-#tagger_parent tag:hover {
-	cursor:pointer;
-	background-color:#ddd;
-}
-
-/*#tagger_parent list[id=image] tag:hover {
-	background-color:#faa;
-}
-
-#tagger_parent list[id=search] tag:hover {
-	background-color:#afa;
-}*/
-
-#tagger_parent list[id=image] tag:hover:before {
-	content:url('./images/rem-tag.png');
-}
-
-#tagger_parent list[id=search] tag:hover:before {
-	content:url('./images/add-tag.png');
-}
diff --git a/ext/tagger/theme.php b/ext/tagger/theme.php
deleted file mode 100644
index a8fa9407..00000000
--- a/ext/tagger/theme.php
+++ /dev/null
@@ -1,75 +0,0 @@
-)                    *
- * Do not remove this notice.                                                *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-class TaggerTheme extends Themelet
-{
-    public function build_tagger(Page $page, DisplayingImageEvent $event)
-    {
-        // Initialization code
-        $base_href = get_base_href();
-        // TODO: AJAX test and fallback.
-
-        $page->add_html_header("");
-        $page->add_block(new Block(
-            null,
-            "",
-            "main",
-            1000
-        ));
-
-        // Tagger block
-        $page->add_block(new Block(
-            null,
-            (string)$this->html($event->get_image()),
-            "main"
-        ));
-    }
-    private function html(Image $image)
-    {
-        global $config;
-        $h_query = isset($_GET['search'])? $h_query= "search=".url_escape($_GET['search']) : "";
-
-        $delay = $config->get_string("ext_tagger_search_delay", "250");
-
-        // TODO: option for initial Tagger window placement.
-        return DIV(
-            ["id"=>"tagger_parent", "style"=>"display:none; top:25px; right:25px;"],
-            DIV(["id"=>"tagger_titlebar"], "Tagger"),
-            DIV(
-                ["id"=>"tagger_toolbar"],
-                INPUT(["type"=>"text", "value"=>"", "id"=>"tagger_filter", "onkeyup"=>"Tagger.tag.search(this.value, $delay);"]),
-                INPUT(["type"=>"button", "value">"Add", "onclick"=>"Tagger.tag.create(byId('tagger_filter').value);"]),
-                FORM(
-                    ["action"=>make_link("tag_edit/set"), "method"=>"POST", "onsubmit"=>"Tagger.tag.submit();"],
-                    INPUT(["type"=>"hidden", "name"=>"image_id", "value"=>$image->id, "id"=>"image_id"]),
-                    INPUT(["type"=>"hidden", "name"=>"query", "value"=>$h_query, "id"=>""]),
-                    INPUT(["type"=>"hidden", "name"=>"source", "value"=>$image->source, "id"=>""]),
-                    INPUT(["type"=>"hidden", "name"=>"tags", "value"=>"", "id"=>"tagger_tags"]),
-                    INPUT(["type"=>"", "value"=>"Set"]),
-                ),
-                # UL(["id"=>"tagger_p-menu"]),
-                # BR(["style"=>"clear:both;"]),
-            ),
-            DIV(
-                ["id"=>"tagger_body"],
-                DIV(["id"=>"tagger_p-search", "name"=>"Searched Tags"]),
-                DIV(["id"=>"tagger_p-applied", "name"=>"Applied Tags"]),
-            ),
-            DIV(
-                ["id"=>"tagger_statusbar"],
-            ),
-        );
-    }
-}
diff --git a/ext/tagger/webtoolkit.drag.js b/ext/tagger/webtoolkit.drag.js
deleted file mode 100644
index 68d48f4a..00000000
--- a/ext/tagger/webtoolkit.drag.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*jshint bitwise:true, curly:true, forin:false, noarg:true, noempty:true, nonew:true, undef:true, strict:false, browser:true, jquery:true */
-
-/**
-*
-* Crossbrowser Drag Handler
-* http://www.webtoolkit.info/
-*
-* Modified by Erik Youngren to move parent node
-**/
-
-var DragHandler = {
-
-
-    // private property.
-    _oElem : null,
-
-
-    // public method. Attach drag handler to an element.
-    attach : function(oElem) {
-        oElem.onmousedown = DragHandler._dragBegin;
-
-        // callbacks
-        oElem.dragBegin = function () {};
-        oElem.drag = function () {};
-        oElem.dragEnd = function () {};
-
-        return oElem;
-    },
-
-
-    // private method. Begin drag process.
-    _dragBegin : function(e) {
-        var oElem = DragHandler._oElem = this;
-
-        if (isNaN(parseInt(oElem.parentNode.style.left))) { oElem.parentNode.style.left = '0px'; }
-        if (isNaN(parseInt(oElem.parentNode.style.top))) { oElem.parentNode.style.top = '0px'; }
-
-        var x = parseInt(oElem.parentNode.style.left);
-        var y = parseInt(oElem.parentNode.style.top);
-
-        e = e ? e : window.event;
-        oElem.mouseX = e.clientX;
-        oElem.mouseY = e.clientY;
-
-        oElem.dragBegin(oElem, x, y);
-
-        document.onmousemove = DragHandler._drag;
-        document.onmouseup = DragHandler._dragEnd;
-        return false;
-    },
-
-
-    // private method. Drag (move) element.
-    _drag : function(e) {
-        var oElem = DragHandler._oElem;
-
-        var x = parseInt(oElem.parentNode.style.left);
-        var y = parseInt(oElem.parentNode.style.top);
-
-        e = e ? e : window.event;
-        oElem.parentNode.style.left = x + (e.clientX - oElem.mouseX) + 'px';
-        oElem.parentNode.style.top = y + (e.clientY - oElem.mouseY) + 'px';
-
-        oElem.mouseX = e.clientX;
-        oElem.mouseY = e.clientY;
-
-        oElem.drag(oElem, x, y);
-
-        return false;
-    },
-
-
-    // private method. Stop drag process.
-    _dragEnd : function() {
-        var oElem = DragHandler._oElem;
-
-        var x = parseInt(oElem.parentNode.style.left);
-        var y = parseInt(oElem.parentNode.style.top);
-
-        oElem.dragEnd(oElem, x, y);
-
-        document.onmousemove = null;
-        document.onmouseup = null;
-        DragHandler._oElem = null;
-    }
-
-};