diff of 6615ffc75e868e68111c664c830cd5662dafad34

6615ffc75e868e68111c664c830cd5662dafad34
diff --git a/aggressive-murja.asd b/aggressive-murja.asd
index 3075e73..56bc25c 100644
--- a/aggressive-murja.asd
+++ b/aggressive-murja.asd
@@ -35,11 +35,57 @@
   :description "A rewrite of the <a href=\"https://github.com/feuery/murja-blog/\">murja blogging engine</a> in lisp"
   :components ((:module "src"
 		:components
-		((:module "local-lib"
+		((:module "packages"
+		  :components
+		  ((:file "lisp-fixup")
+		   (:file "halisql")
+		   (:file "migrations")
+		   (:file "json")
+		   (:file "session-db")
+		   (:file "middleware-db")
+		   (:file "user")
+		   (:file "post")
+		   (:file "log")
+		   (:file "settings")
+		   (:file "setting-definitions")
+		   (:file "genurl")
+		   (:file "json-middleware")
+		   (:file "auth")
+		   (:file "session")
+		   (:file "post-db")
+		   (:file "media-db")
+		   (:file "reader-db")
+		   (:file "login-routes")
+		   (:file "post-routes")
+		   (:file "media-routes")
+		   (:file "rss-routes")
+		   (:file "rss-reader-routes")
+		   (:file "user-editor")
+		   (:file "root-routes")
+		   (:file "root-component")
+		   (:file "tabs-component")
+		   (:file "blogpost-component")
+		   (:file "single-post")
+		   (:file "blog-root")
+		   (:file "tag-script")
+		   (:file "previouslies-script")
+		   (:file "dnd-script")
+		   (:file "editor")
+		   (:file "components-log")
+		   (:file "post-list")
+		   (:file "media-admin")
+		   (:file "new-post")
+		   (:file "logs")
+		   (:file "rss")
+		   (:file "settings-view")
+		   (:file "main")))
+		 
+		 (:module "local-lib"
 		  :components ((:file "lisp-fixup")
 			       (:file "halisql")
 			       (:file "migrations")
 			       (:file "json")))
+		 
 		 (:file "migration-list")
 		 (:file "session-db")
 		 (:file "middleware-db")
diff --git a/src/genurl.lisp b/src/genurl.lisp
index b1e6f1e..c32dfbd 100644
--- a/src/genurl.lisp
+++ b/src/genurl.lisp
@@ -1,17 +1,37 @@
-(defpackage murja.genurl
-  (:use :cl)
-  (:export :route->url)
-  (:documentation "Provides functions for transforming murja.view.components.tabs:deftab'bed and easy-routes:defroute'd url symbols into correctly prefixed url strings")
-  (:local-nicknames (:settings :murja.setting-definitions)))
-
 (in-package :murja.genurl)
 
 (defun route->url (symbol &rest params)
+  "A server side route->url transformer. Symbol and params are passed on into #'easy-routes:genurl, refer to its documentation or murja's genurl-tests.lisp for usage"
   (format nil "~a~a"
 	  (settings:prefix)
 	  (apply #'easy-routes:genurl symbol params)))
 
 
-;; (route->url 'murja.view.rss::rss-single-item :feed-id "ffffeed-id" :item-id "itemiiii-id")
-;; "/feeds/ffffeed-id/item/itemiiii-id"
-;; "/feeds/feed-id/item/item-id"
+(defun route->url-ps (symbol &rest params)
+  "route->url for the frontend code.
+
+usage: (ps ....
+           (lisp (route>url-ps 'murja.view.rss::rss-single-item
+	       :feed-id 'feedy-id :item-id 'ps-symboli))),
+where feedy-id and ps-symboli are expected to be found in the containing ps scope.
+
+THIS FUNCTION RETURNS LISTS TO PASS INTO (ps:lisp)"
+  (let* ((params-map (alexandria:plist-hash-table params))
+	 (js-placeholders (make-hash-table :test 'equal)))
+    (maphash (lambda (k v)
+	       (setf (gethash k js-placeholders) (format nil "SPLIT_FOR_~a" v)))
+	     params-map)
+
+    (let* ((url (apply #'easy-routes:genurl symbol (alexandria:hash-table-plist js-placeholders)))
+	   (body (alexandria:flatten
+		  `(+ ,(settings:prefix)
+		      ,@(map 'list (lambda (part)
+				     (if (str:starts-with-p "SPLIT_FOR_" part)
+					 (list 
+					  (read-from-string (str:replace-all "SPLIT_FOR_" "" part)) "/")
+					 (format nil "~a/"
+						 part)))
+			     (str:split "/" url))))))
+      (if (equalp (alexandria:last-elt body) "/")
+	  (butlast body)
+	  body))))
diff --git a/src/local-lib/halisql.lisp b/src/local-lib/halisql.lisp
index 4ec7a3f..fe8f72e 100644
--- a/src/local-lib/halisql.lisp
+++ b/src/local-lib/halisql.lisp
@@ -1,8 +1,3 @@
-(defpackage halisql
-  (:use :cl :binding-arrows)
-  (:import-from :lisp-fixup :slurp-utf-8 :drop :partial  :compose)
-  (:export :slurp-sql :get-sql :*log* :pick-queries :defqueries :*system-name*))
-
 (in-package :halisql)
 
 (defvar *system-name* :aggressive-murja
diff --git a/src/local-lib/json.lisp b/src/local-lib/json.lisp
index 358f587..d37cd94 100644
--- a/src/local-lib/json.lisp
+++ b/src/local-lib/json.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.json
-  (:use :cl)
-  (:import-from :binding-arrows :->>)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:export :bind-json)
-  (:documentation "Convenience tools for handling json"))
-
 (in-package :murja.json)
 
 (defmacro bind-json (requireds optionals json &rest body)
diff --git a/src/local-lib/lisp-fixup.lisp b/src/local-lib/lisp-fixup.lisp
index d594457..f7da698 100644
--- a/src/local-lib/lisp-fixup.lisp
+++ b/src/local-lib/lisp-fixup.lisp
@@ -1,17 +1,3 @@
-(defpackage lisp-fixup
-  (:use :cl :cl-hash-util)
-  (:export :if-modified-since->simpledate-timestamp :*rfc822*
-	   :month->string
-	   :group-by
-	   :*dev?* :to-secs
-	   :fix-timestamp
-	   :*now*
-   :sha-512 :partial
-   :compose :drop
-   :slurp-bytes :slurp-utf-8
-	   :range :range2
-	   :formdata->hashmap))
-
 (in-package :lisp-fixup)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
diff --git a/src/local-lib/migrations.lisp b/src/local-lib/migrations.lisp
index 65298c4..6f4df1a 100644
--- a/src/local-lib/migrations.lisp
+++ b/src/local-lib/migrations.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.migrations
-  (:use :halisql)
-  (:use :cl)
-  (:export :migration-does-exist :deflispmigration :defmigration :migrate))
-
 (in-package :murja.migrations)
 
 (defparameter *migrations* nil)
diff --git a/src/main.lisp b/src/main.lisp
index d0a5847..7e1af8a 100644
--- a/src/main.lisp
+++ b/src/main.lisp
@@ -1,10 +1,3 @@
-(defpackage murja
-  (:use :cl)
-  (:import-from :murja.posts.post-db)
-  (:import-from :murja.middleware.db :with-db)
-  (:import-from :murja.migrations :migrate)
-  (:export :main :start-server))
-
 (in-package :murja)
 
 (defvar *server* nil)
diff --git a/src/media/media-db.lisp b/src/media/media-db.lisp
index 746097f..d12af02 100644
--- a/src/media/media-db.lisp
+++ b/src/media/media-db.lisp
@@ -1,10 +1,3 @@
-(defpackage :murja.media.media-db
-  (:use :cl :postmodern)
-  (:import-from :com.inuoe.jzon :parse)
-  (:import-from :halisql :defqueries)
-  (:import-from :lisp-fixup :fix-timestamp)
-  (:export :get-media :insert-media :select-referencing-posts*))
-
 (in-package :murja.media.media-db)
 
 (defqueries "media-fns")
diff --git a/src/middleware-db.lisp b/src/middleware-db.lisp
index e22299c..31a37f1 100644
--- a/src/middleware-db.lisp
+++ b/src/middleware-db.lisp
@@ -1,11 +1,3 @@
-(defpackage murja.middleware.db
-  (:use :cl :postmodern)
-  (:export :connect-murjadb-toplevel
-	   :@db
-	   :@transaction 
-	   :with-db
-	   :*automatic-tests-on?*))
-
 (in-package :murja.middleware.db)
 
 (defvar *automatic-tests-on?* nil)
diff --git a/src/middleware/auth.lisp b/src/middleware/auth.lisp
index ea9172e..526b7c0 100644
--- a/src/middleware/auth.lisp
+++ b/src/middleware/auth.lisp
@@ -1,9 +1,3 @@
-(defpackage murja.middleware.auth
-  (:use :cl :postmodern)
-  (:import-from :murja.model.user :user-username)
-  (:local-nicknames (:users :murja.model.user))
-  (:export :@ssr-authenticated :*now* :*session-key* :*user* :@can?))
-
 (in-package :murja.middleware.auth)
 
 (defvar *user* nil
diff --git a/src/middleware/json.lisp b/src/middleware/json.lisp
index 61e5cbe..e57512c 100644
--- a/src/middleware/json.lisp
+++ b/src/middleware/json.lisp
@@ -1,7 +1,3 @@
-(defpackage murja.middleware.json
-  (:use :cl)
-  (:import-from :com.inuoe.jzon :stringify))
-
 (in-package :murja.middleware.json)
 
 (defun @json (next)
diff --git a/src/model/log.lisp b/src/model/log.lisp
index a98e27c..2f82b14 100644
--- a/src/model/log.lisp
+++ b/src/model/log.lisp
@@ -1,9 +1,3 @@
-(defpackage murja.model.log
-  (:use :cl :binding-arrows)
-  (:import-from :halisql :defqueries)
-  (:import-from :lisp-fixup :partial)
-  (:export :get-alarmy-groups :get-groups :get-logs))
-
 (in-package :murja.model.log)
 
 (defun get-logs ()
diff --git a/src/model/post.lisp b/src/model/post.lisp
index 8f3a7c0..24bad73 100644
--- a/src/model/post.lisp
+++ b/src/model/post.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.model.post
-  (:use :cl)
-  (:export :RSS-Post :rss-link :Post :get-page :get-post :post-id :post-title :article :creator :tags :created-at :post-hidden? :post-unlisted? :next-post-id :previous-post-id :previouslies
-	   :id :title :creator :created-at :content :admin-get-all-titles
-	   :title :month :year :id :tags :hidden :unlisted :get-tagged)
-  (:import-from :com.inuoe.jzon :parse))
-
 (in-package :murja.model.post)
 
 ;; fuck it we're moving from hashmaps to clos now 
diff --git a/src/model/settings.lisp b/src/model/settings.lisp
index aedc917..b925d88 100644
--- a/src/model/settings.lisp
+++ b/src/model/settings.lisp
@@ -1,20 +1,3 @@
-(defpackage murja.model.settings
-  (:use :cl)
-  (:export :setting-getter :all-setting-names :update-setting :defsetting :define-settings :create-settings)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:documentation "This package specifies macros define-settings and defsetting, which are used thus:
-
-```
-(define-settings
-  (site-name \"default-site\")
-  (test-setting 12345))
-```
-
-After running that form, one can get setting's current value by funcalling its symbol (for example: `(site-name) => \"default site\")`. If you wish to change
-the value of this setting, you call its symbol with a parameter (`(site-name \"a new site\")`, after which calling it with 0-arity begins returning \"a new site\").
-
-These changes are saved in murja's table `blog.Settings`."))
-
 (in-package :murja.model.settings)
 
 (named-readtables:in-readtable :murja.ps)
diff --git a/src/model/user.lisp b/src/model/user.lisp
index be68806..337d8ba 100644
--- a/src/model/user.lisp
+++ b/src/model/user.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.model.user
-  (:use :cl)
-  (:local-nicknames (:json :com.inuoe.jzon))
-  (:export :get-user :User :user-id :user-username :register-user :user-password :user-nickname :user-img-location :abilities))
-
 (in-package :murja.model.user)
 
 (defclass User ()
diff --git a/src/packages/auth.lisp b/src/packages/auth.lisp
new file mode 100644
index 0000000..bff8555
--- /dev/null
+++ b/src/packages/auth.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.middleware.auth
+  (:use :cl :postmodern)
+  (:import-from :murja.model.user :user-username)
+  (:local-nicknames (:users :murja.model.user))
+  (:export :@ssr-authenticated :*now* :*session-key* :*user* :@can?))
+
diff --git a/src/packages/blog-root.lisp b/src/packages/blog-root.lisp
new file mode 100644
index 0000000..06dd18f
--- /dev/null
+++ b/src/packages/blog-root.lisp
@@ -0,0 +1,8 @@
+(defpackage :murja.view.blog-root
+  (:use :cl :binding-arrows
+	:murja.view.components.blogpost
+   :easy-routes :cl-hash-util)
+  (:export :root :page-tab)
+  (:import-from :murja.view.components.tabs :deftab)
+  (:import-from :murja.model.post :get-page)
+  (:local-nicknames (:settings :murja.setting-definitions)))
diff --git a/src/packages/blogpost-component.lisp b/src/packages/blogpost-component.lisp
new file mode 100644
index 0000000..fb41d01
--- /dev/null
+++ b/src/packages/blogpost-component.lisp
@@ -0,0 +1,4 @@
+(defpackage murja.view.components.blogpost
+  (:use :cl :binding-arrows :spinneret :murja.model.post :murja.model.user :cl-hash-util)
+  (:import-from :murja.middleware.auth :*user*)
+  (:export :page :blogpost))
diff --git a/src/packages/components-log.lisp b/src/packages/components-log.lisp
new file mode 100644
index 0000000..19c626d
--- /dev/null
+++ b/src/packages/components-log.lisp
@@ -0,0 +1,3 @@
+(defpackage :murja.view.admin.components.log
+  (:use :cl :binding-arrows :spinneret)
+  (:export :log-group))
diff --git a/src/packages/dnd-script.lisp b/src/packages/dnd-script.lisp
new file mode 100644
index 0000000..b233c5a
--- /dev/null
+++ b/src/packages/dnd-script.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.view.admin.components.dnd-script
+  (:use :cl :binding-arrows :parenscript :paren-async)
+  (:export :editor-dnd-script)
+  (:documentation "Parenscript logic for making picture drag and drop work"))
+
diff --git a/src/packages/editor.lisp b/src/packages/editor.lisp
new file mode 100644
index 0000000..fa0518e
--- /dev/null
+++ b/src/packages/editor.lisp
@@ -0,0 +1,8 @@
+(defpackage murja.view.admin.components.editor
+  (:use :cl :binding-arrows :spinneret :parenscript :murja.view.admin.components.dnd-script)
+  (:export :editor)
+  (:import-from :murja.view.admin.components.tag-script :tags-component-frontend)
+  (:import-from :murja.view.admin.components.previouslies-script :previouslies-component-frontend)
+  (:import-from :murja.model.post :post-id :tags :article :post-title :post-hidden? :post-unlisted?)
+  (:local-nicknames (:posts :murja.model.post)
+		    (:json :com.inuoe.jzon)))
\ No newline at end of file
diff --git a/src/packages/genurl.lisp b/src/packages/genurl.lisp
new file mode 100644
index 0000000..b5b2346
--- /dev/null
+++ b/src/packages/genurl.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.genurl
+  (:use :cl :ps)
+  (:export :route->url-ps-m :route->url :route->url-ps)
+  (:documentation "Provides functions for transforming murja.view.components.tabs:deftab'bed and easy-routes:defroute'd url symbols into correctly prefixed url strings")
+  (:local-nicknames (:settings :murja.setting-definitions)))
diff --git a/src/packages/halisql.lisp b/src/packages/halisql.lisp
new file mode 100644
index 0000000..c398ef8
--- /dev/null
+++ b/src/packages/halisql.lisp
@@ -0,0 +1,4 @@
+(defpackage :halisql
+  (:use :cl :binding-arrows)
+  (:import-from :lisp-fixup :slurp-utf-8 :drop :partial  :compose)
+  (:export :slurp-sql :get-sql :*log* :pick-queries :defqueries :*system-name*))
diff --git a/src/packages/json-middleware.lisp b/src/packages/json-middleware.lisp
new file mode 100644
index 0000000..0f29a96
--- /dev/null
+++ b/src/packages/json-middleware.lisp
@@ -0,0 +1,4 @@
+(defpackage :murja.middleware.json
+  (:use :cl)
+  (:import-from :com.inuoe.jzon :stringify))
+
diff --git a/src/packages/json.lisp b/src/packages/json.lisp
new file mode 100644
index 0000000..bdcb4f0
--- /dev/null
+++ b/src/packages/json.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.json
+  (:use :cl)
+  (:import-from :binding-arrows :->>)
+  (:import-from :com.inuoe.jzon :stringify :parse)
+  (:export :bind-json)
+  (:documentation "Convenience tools for handling json"))
diff --git a/src/packages/lisp-fixup.lisp b/src/packages/lisp-fixup.lisp
new file mode 100644
index 0000000..7181bca
--- /dev/null
+++ b/src/packages/lisp-fixup.lisp
@@ -0,0 +1,13 @@
+(defpackage :lisp-fixup
+  (:use :cl :cl-hash-util)
+  (:export :if-modified-since->simpledate-timestamp :*rfc822*
+	   :month->string
+	   :group-by
+	   :*dev?* :to-secs
+	   :fix-timestamp
+	   :*now*
+   :sha-512 :partial
+   :compose :drop
+   :slurp-bytes :slurp-utf-8
+	   :range :range2
+	   :formdata->hashmap))
diff --git a/src/packages/log.lisp b/src/packages/log.lisp
new file mode 100644
index 0000000..333e75b
--- /dev/null
+++ b/src/packages/log.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.model.log
+  (:use :cl :binding-arrows)
+  (:import-from :halisql :defqueries)
+  (:import-from :lisp-fixup :partial)
+  (:export :get-alarmy-groups :get-groups :get-logs))
diff --git a/src/packages/login-routes.lisp b/src/packages/login-routes.lisp
new file mode 100644
index 0000000..c0f65dd
--- /dev/null
+++ b/src/packages/login-routes.lisp
@@ -0,0 +1,11 @@
+(defpackage murja.routes.login-routes
+  (:use :cl :binding-arrows :murja.setting-definitions)
+  (:export :get-session-key :set-session-cookies :formdata->hashmap :forms-post-login)
+  (:import-from :cl-hash-util :hash)
+  (:import-from :murja.session :set-session-value)
+  (:import-from :lisp-fixup :sha-512)
+  (:import-from :murja.middleware.auth :*user*)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :easy-routes :defroute)
+  (:import-from :com.inuoe.jzon :parse :stringify)
+  (:local-nicknames (:users :murja.model.user)))
diff --git a/src/packages/logs.lisp b/src/packages/logs.lisp
new file mode 100644
index 0000000..164ebe7
--- /dev/null
+++ b/src/packages/logs.lisp
@@ -0,0 +1,3 @@
+(defpackage :murja.view.admin.logs
+  (:use :cl :binding-arrows :spinneret :com.inuoe.jzon :easy-routes :murja.model.log :murja.view.admin.components.log)
+  (:import-from :murja.view.components.tabs :deftab))
diff --git a/src/packages/main.lisp b/src/packages/main.lisp
new file mode 100644
index 0000000..b1590dd
--- /dev/null
+++ b/src/packages/main.lisp
@@ -0,0 +1,6 @@
+(defpackage murja
+  (:use :cl)
+  (:import-from :murja.posts.post-db)
+  (:import-from :murja.middleware.db :with-db)
+  (:import-from :murja.migrations :migrate)
+  (:export :main :start-server))
diff --git a/src/packages/media-admin.lisp b/src/packages/media-admin.lisp
new file mode 100644
index 0000000..a4deb5b
--- /dev/null
+++ b/src/packages/media-admin.lisp
@@ -0,0 +1,4 @@
+(defpackage :murja.view.admin.media-admin
+  (:use :cl :binding-arrows :spinneret :ps :paren-async)
+  (:import-from :murja.media.media-db :select-referencing-posts*)
+  (:import-from :murja.view.components.tabs :deftab))
diff --git a/src/packages/media-db.lisp b/src/packages/media-db.lisp
new file mode 100644
index 0000000..07f846f
--- /dev/null
+++ b/src/packages/media-db.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.media.media-db
+  (:use :cl :postmodern)
+  (:import-from :com.inuoe.jzon :parse)
+  (:import-from :halisql :defqueries)
+  (:import-from :lisp-fixup :fix-timestamp)
+  (:export :get-media :insert-media :select-referencing-posts*))
diff --git a/src/packages/media-routes.lisp b/src/packages/media-routes.lisp
new file mode 100644
index 0000000..7598cfe
--- /dev/null
+++ b/src/packages/media-routes.lisp
@@ -0,0 +1,12 @@
+(defpackage :murja.routes.media-routes
+  (:use :cl)
+  (:import-from :lisp-fixup :slurp-bytes)
+  (:import-from :com.inuoe.jzon :stringify :parse)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :murja.media.media-db :get-media :insert-media)
+  (:import-from :murja.middleware.auth :@can? :*user*)
+  (:import-from :easy-routes :defroute)
+
+
+  (:export :post-pic :delete-pic))
+
diff --git a/src/packages/middleware-db.lisp b/src/packages/middleware-db.lisp
new file mode 100644
index 0000000..154df51
--- /dev/null
+++ b/src/packages/middleware-db.lisp
@@ -0,0 +1,7 @@
+(defpackage :murja.middleware.db
+  (:use :cl :postmodern)
+  (:export :connect-murjadb-toplevel
+	   :@db
+	   :@transaction 
+	   :with-db
+	   :*automatic-tests-on?*))
diff --git a/src/packages/migrations.lisp b/src/packages/migrations.lisp
new file mode 100644
index 0000000..b390c87
--- /dev/null
+++ b/src/packages/migrations.lisp
@@ -0,0 +1,4 @@
+(defpackage :murja.migrations
+  (:use :halisql)
+  (:use :cl)
+  (:export :migration-does-exist :deflispmigration :defmigration :migrate))
diff --git a/src/packages/new-post.lisp b/src/packages/new-post.lisp
new file mode 100644
index 0000000..30b5b04
--- /dev/null
+++ b/src/packages/new-post.lisp
@@ -0,0 +1,11 @@
+(defpackage murja.view.admin.new-post
+  (:use :cl :easy-routes :binding-arrows :spinneret :murja.model.post :murja.view.admin.components.editor)
+  ;; (:import-from :murja.model.post :article :post-title)
+  (:import-from :murja.middleware.db :@transaction :@db)
+  (:import-from :murja.middleware.auth :@ssr-authenticated :*user*)
+  (:import-from :murja.model.user :user-id )
+  (:import-from :murja.view.components.tabs :deftab)
+  (:import-from :murja.posts.post-db :insert-post)
+  (:local-nicknames (:json :com.inuoe.jzon))
+
+  (:export :blog/post/editor :blog/new-post))
diff --git a/src/packages/post-db.lisp b/src/packages/post-db.lisp
new file mode 100644
index 0000000..d753269
--- /dev/null
+++ b/src/packages/post-db.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.posts.post-db
+  (:use :cl :postmodern)
+  (:import-from :com.inuoe.jzon :parse)
+  (:import-from :halisql :defqueries)
+  (:import-from :lisp-fixup :fix-timestamp)
+  (:export :search-posts :last-modified* :link-previously :get-tagged :get-post-version :get-page :get-titles-by-year :insert-post :update-post :get-post))
diff --git a/src/packages/post-list.lisp b/src/packages/post-list.lisp
new file mode 100644
index 0000000..6e0a91e
--- /dev/null
+++ b/src/packages/post-list.lisp
@@ -0,0 +1,7 @@
+(defpackage murja.view.admin.post-list
+  (:use :cl :binding-arrows :spinneret
+   :easy-routes :cl-hash-util
+   :murja.view.components.blogpost)
+  (:import-from :murja.view.components.tabs :deftab)
+  (:import-from :murja.model.post :admin-get-all-titles :title :month :year :id :tags :hidden :unlisted)
+  (:export :blog/postadmin))
diff --git a/src/packages/post-routes.lisp b/src/packages/post-routes.lisp
new file mode 100644
index 0000000..1d05540
--- /dev/null
+++ b/src/packages/post-routes.lisp
@@ -0,0 +1,9 @@
+(defpackage :murja.routes.post-routes
+  (:use :cl)
+  (:import-from :lisp-fixup :partial)
+  (:import-from :com.inuoe.jzon :stringify :parse)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :murja.middleware.auth :*user* :@can?)
+  (:import-from :murja.posts.post-db :get-post-version :get-post :get-page :get-titles-by-year)
+  (:import-from :easy-routes :defroute)
+  (:export :search-prev))
diff --git a/src/packages/post.lisp b/src/packages/post.lisp
new file mode 100644
index 0000000..217c5ef
--- /dev/null
+++ b/src/packages/post.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.model.post
+  (:use :cl)
+  (:export :RSS-Post :rss-link :Post :get-page :get-post :post-id :post-title :article :creator :tags :created-at :post-hidden? :post-unlisted? :next-post-id :previous-post-id :previouslies
+	   :id :title :creator :created-at :content :admin-get-all-titles
+	   :title :month :year :id :tags :hidden :unlisted :get-tagged)
+  (:import-from :com.inuoe.jzon :parse))
diff --git a/src/packages/previouslies-script.lisp b/src/packages/previouslies-script.lisp
new file mode 100644
index 0000000..0bdf65c
--- /dev/null
+++ b/src/packages/previouslies-script.lisp
@@ -0,0 +1,4 @@
+(defpackage murja.view.admin.components.previouslies-script
+  (:use :cl :binding-arrows :parenscript :paren-async)
+  (:export :previouslies-component-frontend)
+  (:documentation "All the parenscript logic hidden from making murja.view.admin.components.editor an eyesore"))
diff --git a/src/packages/reader-db.lisp b/src/packages/reader-db.lisp
new file mode 100644
index 0000000..ee516b1
--- /dev/null
+++ b/src/packages/reader-db.lisp
@@ -0,0 +1,7 @@
+(defpackage :murja.rss.reader-db
+  (:use :cl :postmodern :binding-arrows)
+  (:import-from :halisql :defqueries)
+  (:import-from :lisp-fixup :partial :compose)
+  (:import-from :cl-date-time-parser :parse-date-time)
+  (:export :*last-updated* :subscribe-to-feed2 :get-user-feeds2 :get-feed-name-and-url :*updates* :get-user-feeds :subscribe-to-feed :mark-as-read :delete-feed :download))
+	
diff --git a/src/packages/root-component.lisp b/src/packages/root-component.lisp
new file mode 100644
index 0000000..b870759
--- /dev/null
+++ b/src/packages/root-component.lisp
@@ -0,0 +1,8 @@
+(defpackage :murja.view.components.root
+  (:use :cl :spinneret :binding-arrows
+	:murja.setting-definitions
+   :murja.middleware.auth
+	:murja.model.user)
+
+  (:export :*inject-to-head* :*inject-to-sidebar* :root-component)
+  (:import-from :murja.posts.post-db :get-titles-by-year))
diff --git a/src/packages/root-routes.lisp b/src/packages/root-routes.lisp
new file mode 100644
index 0000000..daa0e4b
--- /dev/null
+++ b/src/packages/root-routes.lisp
@@ -0,0 +1,8 @@
+(defpackage :murja.routes.root-routes
+  (:use :cl)
+  (:import-from :binding-arrows :->> :->)
+  (:import-from :lisp-fixup :partial)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :easy-routes :defroute)
+
+  (:export :resources))
diff --git a/src/packages/rss-reader-routes.lisp b/src/packages/rss-reader-routes.lisp
new file mode 100644
index 0000000..bfd3ba4
--- /dev/null
+++ b/src/packages/rss-reader-routes.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.routes.rss-reader-routes
+  (:use :cl)
+  (:import-from :easy-routes :defroute)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :murja.rss.reader-db))
diff --git a/src/packages/rss-routes.lisp b/src/packages/rss-routes.lisp
new file mode 100644
index 0000000..8be5cc7
--- /dev/null
+++ b/src/packages/rss-routes.lisp
@@ -0,0 +1,7 @@
+(defpackage :murja.routes.rss-routes
+  (:use :cl :murja.setting-definitions)
+  (:import-from :easy-routes :defroute)
+  (:import-from :murja.posts.post-db :get-page)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :murja.middleware.auth :*user*))
+
diff --git a/src/packages/rss.lisp b/src/packages/rss.lisp
new file mode 100644
index 0000000..8422ccb
--- /dev/null
+++ b/src/packages/rss.lisp
@@ -0,0 +1,7 @@
+(defpackage murja.view.rss
+  (:use :cl :binding-arrows :spinneret :murja.rss.reader-db :easy-routes :ps :paren-async)
+  (:local-nicknames (:genurl :murja.genurl))
+  (:import-from :murja.view.components.tabs :deftab)
+  (:import-from :murja.middleware.auth :*user* :@ssr-authenticated)
+  (:import-from :murja.middleware.db :@db)
+  (:import-from :murja.model.user :user-id))
diff --git a/src/packages/session-db.lisp b/src/packages/session-db.lisp
new file mode 100644
index 0000000..29d7953
--- /dev/null
+++ b/src/packages/session-db.lisp
@@ -0,0 +1,9 @@
+(defpackage :murja.session.db
+  (:use :cl)
+  (:import-from :halisql :defqueries)
+  (:export :ensure-username-session* :assert-ownership
+	   :assert-ownership-username :all-session-vals
+	   :login-query-session*
+	   :now
+	   :set-session-val* :ensure-session*
+	   :insert-session* :get-session-val*))
diff --git a/src/packages/session.lisp b/src/packages/session.lisp
new file mode 100644
index 0000000..96e1213
--- /dev/null
+++ b/src/packages/session.lisp
@@ -0,0 +1,6 @@
+(defpackage :murja.session
+  (:use :cl)
+  (:export :set-session-value :get-session-value)
+  (:import-from :murja.session.db :assert-ownership :set-session-val* :get-session-val*)
+  (:local-nicknames (:users :murja.model.user))
+  (:import-from :murja.middleware.auth :*user* :*session-key*))
diff --git a/src/packages/setting-definitions.lisp b/src/packages/setting-definitions.lisp
new file mode 100644
index 0000000..0a86747
--- /dev/null
+++ b/src/packages/setting-definitions.lisp
@@ -0,0 +1,4 @@
+(defpackage :murja.setting-definitions
+  (:use :cl :murja.model.settings)
+  (:export :page-size :rss-email :rss-lang :rss-description :rss-link :rss-title :prefix
+	   :blog-title :domain :previously_label :recent-post-count :time-format))
diff --git a/src/packages/settings-view.lisp b/src/packages/settings-view.lisp
new file mode 100644
index 0000000..9749c51
--- /dev/null
+++ b/src/packages/settings-view.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.view.settings
+  (:use :cl :binding-arrows :spinneret :easy-routes :murja.model.settings)
+  (:import-from :murja.middleware.db :@transaction :@db)
+  (:import-from :murja.middleware.auth :@ssr-authenticated :*user*)
+  (:import-from :murja.view.components.tabs :deftab))
diff --git a/src/packages/settings.lisp b/src/packages/settings.lisp
new file mode 100644
index 0000000..a230d02
--- /dev/null
+++ b/src/packages/settings.lisp
@@ -0,0 +1,16 @@
+(defpackage :murja.model.settings
+  (:use :cl)
+  (:export :setting-getter :all-setting-names :update-setting :defsetting :define-settings :create-settings)
+  (:import-from :com.inuoe.jzon :stringify :parse)
+  (:documentation "This package specifies macros define-settings and defsetting, which are used thus:
+
+```
+(define-settings
+  (site-name \"default-site\")
+  (test-setting 12345))
+```
+
+After running that form, one can get setting's current value by funcalling its symbol (for example: `(site-name) => \"default site\")`. If you wish to change
+the value of this setting, you call its symbol with a parameter (`(site-name \"a new site\")`, after which calling it with 0-arity begins returning \"a new site\").
+
+These changes are saved in murja's table `blog.Settings`."))
diff --git a/src/packages/single-post.lisp b/src/packages/single-post.lisp
new file mode 100644
index 0000000..a8cf1ae
--- /dev/null
+++ b/src/packages/single-post.lisp
@@ -0,0 +1,7 @@
+(defpackage murja.view.single-post
+  (:use :cl :binding-arrows
+   :easy-routes :cl-hash-util
+   :murja.view.components.blogpost)
+  (:import-from :murja.view.components.tabs :deftab)
+  (:export :blog/post/id)
+  (:import-from :murja.model.post :get-post))
diff --git a/src/packages/tabs-component.lisp b/src/packages/tabs-component.lisp
new file mode 100644
index 0000000..70b7d86
--- /dev/null
+++ b/src/packages/tabs-component.lisp
@@ -0,0 +1,5 @@
+(defpackage :murja.view.components.tabs
+  (:use :cl :easy-routes :murja.middleware.auth :murja.view.components.root :spinneret)
+  (:import-from :murja.middleware.db :@transaction)
+  (:export :*inject-to-head* :deftab))
+
diff --git a/src/packages/tag-script.lisp b/src/packages/tag-script.lisp
new file mode 100644
index 0000000..b55c042
--- /dev/null
+++ b/src/packages/tag-script.lisp
@@ -0,0 +1,4 @@
+(defpackage murja.view.admin.components.tag-script
+  (:use :cl :binding-arrows :parenscript)
+  (:export :tags-component-frontend)
+  (:documentation "All the parenscript logic hidden from making murja.view.admin.components.editor an eyesore"))
diff --git a/src/packages/user-editor.lisp b/src/packages/user-editor.lisp
new file mode 100644
index 0000000..765c5df
--- /dev/null
+++ b/src/packages/user-editor.lisp
@@ -0,0 +1,13 @@
+(defpackage murja.routes.user-editor
+  (:use :cl)
+  (:import-from :murja.json :bind-json)
+  (:import-from :cl-hash-util :with-keys :hash)
+  (:import-from :lisp-fixup :sha-512)
+  (:import-from :murja.middleware.db :@transaction)
+  (:import-from :murja.middleware.auth :*user*)
+  (:import-from :murja.media.media-db :insert-media)
+  (:import-from :com.inuoe.jzon :stringify :parse)
+  (:import-from :easy-routes :defroute)
+
+  (:local-nicknames (:login :murja.routes.login-routes)
+		    (:users :murja.model.user)))
diff --git a/src/packages/user.lisp b/src/packages/user.lisp
new file mode 100644
index 0000000..fab2d06
--- /dev/null
+++ b/src/packages/user.lisp
@@ -0,0 +1,4 @@
+(defpackage :murja.model.user
+  (:use :cl)
+  (:local-nicknames (:json :com.inuoe.jzon))
+  (:export :get-user :User :user-id :user-username :register-user :user-password :user-nickname :user-img-location :abilities))
diff --git a/src/posts/post-db.lisp b/src/posts/post-db.lisp
index 4ac8d8b..1261a90 100644
--- a/src/posts/post-db.lisp
+++ b/src/posts/post-db.lisp
@@ -1,10 +1,3 @@
-(defpackage :murja.posts.post-db
-  (:use :cl :postmodern)
-  (:import-from :com.inuoe.jzon :parse)
-  (:import-from :halisql :defqueries)
-  (:import-from :lisp-fixup :fix-timestamp)
-  (:export :search-posts :last-modified* :link-previously :get-tagged :get-post-version :get-page :get-titles-by-year :insert-post :update-post :get-post))
-
 (in-package :murja.posts.post-db)
 
 (defqueries "post-fns")
diff --git a/src/routes/login-routes.lisp b/src/routes/login-routes.lisp
index 6943f77..c91416c 100644
--- a/src/routes/login-routes.lisp
+++ b/src/routes/login-routes.lisp
@@ -1,17 +1,3 @@
-(defpackage murja.routes.login-routes
-  (:use :cl :binding-arrows :murja.setting-definitions)
-  (:export :get-session-key :set-session-cookies :formdata->hashmap)
-  (:import-from :cl-hash-util :hash)
-  (:import-from :murja.session :set-session-value)
-  (:import-from :lisp-fixup :sha-512)
-  (:import-from :murja.middleware.auth :@test-now :@authenticated :*user*)
-  (:import-from :murja.middleware.db :@transaction)
-   
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :easy-routes :defroute)
-  (:import-from :com.inuoe.jzon :parse :stringify)
-  (:local-nicknames (:users :murja.model.user)))
-
 (in-package :murja.routes.login-routes)
 
 ;; obviously called in forms-post-login
diff --git a/src/routes/media-routes.lisp b/src/routes/media-routes.lisp
index 55f42da..b3e3173 100644
--- a/src/routes/media-routes.lisp
+++ b/src/routes/media-routes.lisp
@@ -1,14 +1,3 @@
-(defpackage murja.routes.media-routes
-  (:use :cl)
-  (:import-from :lisp-fixup :slurp-bytes)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.media.media-db :get-media :insert-media :delete-picture*)
-   
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :murja.middleware.auth :@authenticated :@can? :*user*)
-  (:import-from :easy-routes :defroute))
-
 (in-package :murja.routes.media-routes)
 
 ;; called from murja.view.admin.components.dnd-script
diff --git a/src/routes/post-routes.lisp b/src/routes/post-routes.lisp
index 307ebca..c46e00c 100644
--- a/src/routes/post-routes.lisp
+++ b/src/routes/post-routes.lisp
@@ -1,14 +1,3 @@
-(defpackage murja.routes.post-routes
-  (:use :cl)
-  (:import-from :lisp-fixup :partial)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.middleware.auth :@authenticated :*user* :@can?)
-  (:import-from :murja.posts.post-db :get-post-version :get-post :get-page :get-titles-by-year)
-   
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :easy-routes :defroute))
-
 (in-package :murja.routes.post-routes)
 
 ;; TODO redo excerpts in feed reader?
diff --git a/src/routes/root-routes.lisp b/src/routes/root-routes.lisp
index 221effe..ecaddf8 100644
--- a/src/routes/root-routes.lisp
+++ b/src/routes/root-routes.lisp
@@ -1,12 +1,3 @@
-(defpackage murja.routes.root-routes
-  (:use :cl)
-  (:import-from :binding-arrows :->> :->)
-  (:import-from :lisp-fixup :partial)
-  (:import-from :murja.middleware.db :@transaction)
-   
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :easy-routes :defroute))
-
 (in-package :murja.routes.root-routes)
 
 ;; thsi whole package becomes unnecessary once murja.css has been embedded inside lisp image 
diff --git a/src/routes/rss-reader-routes.lisp b/src/routes/rss-reader-routes.lisp
index c2800f9..36503ed 100644
--- a/src/routes/rss-reader-routes.lisp
+++ b/src/routes/rss-reader-routes.lisp
@@ -1,9 +1,3 @@
-(defpackage murja.routes.rss-reader-routes
-  (:use :cl)
-  (:import-from :easy-routes :defroute)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.rss.reader-db :update-feeds))
-
 (in-package :murja.routes.rss-reader-routes)
 
 ;; This will be called by cron/curl
diff --git a/src/routes/rss-routes.lisp b/src/routes/rss-routes.lisp
index dc57161..9148d14 100644
--- a/src/routes/rss-routes.lisp
+++ b/src/routes/rss-routes.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.routes.rss-routes
-  (:use :cl :murja.setting-definitions)
-  (:import-from :easy-routes :defroute)
-  (:import-from :murja.posts.post-db :get-page)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.middleware.auth :@authenticated :*user*))
-
 (in-package :murja.routes.rss-routes)
 
 (defun posts->rss (posts)
diff --git a/src/routes/user-editor.lisp b/src/routes/user-editor.lisp
index 594cda6..209724d 100644
--- a/src/routes/user-editor.lisp
+++ b/src/routes/user-editor.lisp
@@ -1,18 +1,3 @@
-(defpackage murja.routes.user-editor
-  (:use :cl)
-  (:import-from :murja.json :bind-json)
-  (:import-from :cl-hash-util :with-keys :hash)
-  (:import-from :lisp-fixup :sha-512)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :murja.middleware.auth :@authenticated :*user*)
-  (:import-from :murja.media.media-db :insert-media)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:import-from :easy-routes :defroute)
-
-  (:local-nicknames (:login :murja.routes.login-routes)
-		    (:users :murja.model.user)))
-
 (in-package :murja.routes.user-editor)
 
 ;; TODO redo with spinneret
diff --git a/src/rss/reader-db.lisp b/src/rss/reader-db.lisp
index 70a985b..aa60656 100644
--- a/src/rss/reader-db.lisp
+++ b/src/rss/reader-db.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.rss.reader-db
-  (:use :cl :postmodern :binding-arrows)
-  (:import-from :halisql :defqueries)
-  (:import-from :lisp-fixup :partial :compose)
-  (:import-from :cl-date-time-parser :parse-date-time)
-  (:export :*last-updated* :subscribe-to-feed2 :get-user-feeds2 :get-feed-name-and-url :*updates* :get-user-feeds :subscribe-to-feed :mark-as-read :delete-feed :download))
-	
 (in-package :murja.rss.reader-db)
 
 (defparameter unix-epoch
diff --git a/src/session-db.lisp b/src/session-db.lisp
index ce88694..c4659ed 100644
--- a/src/session-db.lisp
+++ b/src/session-db.lisp
@@ -1,13 +1,3 @@
-(defpackage murja.session.db
-  (:use :cl)
-  (:import-from :halisql :defqueries)
-  (:export :ensure-username-session* :assert-ownership
-	   :assert-ownership-username :all-session-vals
-	   :login-query-session*
-	   :now
-	   :set-session-val* :ensure-session*
-	   :insert-session* :get-session-val*)) 	   
-
 (in-package :murja.session.db)
 
 (defqueries "session-fns")
diff --git a/src/session.lisp b/src/session.lisp
index 682b011..81c44e1 100644
--- a/src/session.lisp
+++ b/src/session.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.session
-  (:use :cl)
-  (:export :set-session-value :get-session-value)
-  (:import-from :murja.session.db :assert-ownership :set-session-val* :get-session-val*)
-  (:local-nicknames (:users :murja.model.user))
-  (:import-from :murja.middleware.auth :*user* :*session-key*))
-
 (in-package :murja.session)
 
 (defun set-session-value (key val)
diff --git a/src/setting-definitions.lisp b/src/setting-definitions.lisp
index 42cf805..36c57fb 100644
--- a/src/setting-definitions.lisp
+++ b/src/setting-definitions.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.setting-definitions
-  (:use :cl :murja.model.settings)
-  (:export :page-size :rss-email :rss-lang :rss-description :rss-link :rss-title :prefix
-	   :blog-title :domain :previously_label :recent-post-count :time-format))
-
 (in-package :murja.setting-definitions)
 
 (named-readtables:in-readtable :murja.ps)
@@ -22,4 +17,3 @@
 
   ;; for example, "/blog" on feuerx.net
   (prefix ""))
-  
diff --git a/src/view/admin/components/dnd-script.lisp b/src/view/admin/components/dnd-script.lisp
index f0e1602..2b3c3da 100644
--- a/src/view/admin/components/dnd-script.lisp
+++ b/src/view/admin/components/dnd-script.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.view.admin.components.dnd-script
-  (:use :cl :binding-arrows :parenscript :paren-async)
-  (:export :editor-dnd-script)
-  (:documentation "Parenscript logic for making picture drag and drop work"))
-
 (in-package :murja.view.admin.components.dnd-script)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
@@ -28,7 +23,7 @@
 	  (chain form-data
 		 (append "file" (chain item (get-as-file)))))
 
-	(let ((response (await (fetch "/api/pictures"
+	(let ((response (await (fetch (murja.genurl:route->url-ps 'murja.routes.media-routes:post-pic)
 				      (create
 				       method "POST"
 				       body form-data)))))
diff --git a/src/view/admin/components/editor.lisp b/src/view/admin/components/editor.lisp
index ed448e0..f20aa56 100644
--- a/src/view/admin/components/editor.lisp
+++ b/src/view/admin/components/editor.lisp
@@ -1,12 +1,3 @@
-(defpackage murja.view.admin.components.editor
-  (:use :cl :binding-arrows :spinneret :parenscript :murja.view.admin.components.dnd-script)
-  (:export :editor)
-  (:import-from :murja.view.admin.components.tag-script :tags-component-frontend)
-  (:import-from :murja.view.admin.components.previouslies-script :previouslies-component-frontend)
-  (:import-from :murja.model.post :post-id :tags :article :post-title :post-hidden? :post-unlisted?)
-  (:local-nicknames (:posts :murja.model.post)
-		    (:json :com.inuoe.jzon)))
-
 (in-package :murja.view.admin.components.editor)
 
 (defun add-previously-dialog ()
diff --git a/src/view/admin/components/log.lisp b/src/view/admin/components/log.lisp
index c050f47..da5fb1a 100644
--- a/src/view/admin/components/log.lisp
+++ b/src/view/admin/components/log.lisp
@@ -1,7 +1,3 @@
-(defpackage murja.view.admin.components.log
-  (:use :cl :binding-arrows :spinneret)
-  (:export :log-group))
-
 (in-package :murja.view.admin.components.log)
 
 (defun log-group (group-log)
diff --git a/src/view/admin/components/previouslies-script.lisp b/src/view/admin/components/previouslies-script.lisp
index 9191794..f88fe61 100644
--- a/src/view/admin/components/previouslies-script.lisp
+++ b/src/view/admin/components/previouslies-script.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.view.admin.components.previouslies-script
-  (:use :cl :binding-arrows :parenscript :paren-async)
-  (:export :previouslies-component-frontend)
-  (:documentation "All the parenscript logic hidden from making murja.view.admin.components.editor an eyesore"))
-
 (in-package :murja.view.admin.components.previouslies-script)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
@@ -74,7 +69,7 @@
 	nil))
 
     (defun-async previously-searched (e)
-      (let ((result (await (fetch "/api/posts/search-previously"
+      (let ((result (await (fetch (murja.genurl:route->url-ps 'murja.routes.post-routes:search-prev)
 				  (create
 				   method "POST"
 				   body (@ e target value)
diff --git a/src/view/admin/components/tag-script.lisp b/src/view/admin/components/tag-script.lisp
index 744669a..c1315d8 100644
--- a/src/view/admin/components/tag-script.lisp
+++ b/src/view/admin/components/tag-script.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.view.admin.components.tag-script
-  (:use :cl :binding-arrows :parenscript)
-  (:export :tags-component-frontend)
-  (:documentation "All the parenscript logic hidden from making murja.view.admin.components.editor an eyesore"))
-
 (in-package :murja.view.admin.components.tag-script)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
diff --git a/src/view/admin/logs.lisp b/src/view/admin/logs.lisp
index 98235f6..4c30f5c 100644
--- a/src/view/admin/logs.lisp
+++ b/src/view/admin/logs.lisp
@@ -1,7 +1,3 @@
-(defpackage murja.view.admin.logs
-  (:use :cl :binding-arrows :spinneret :com.inuoe.jzon :easy-routes :murja.model.log :murja.view.admin.components.log)
-  (:import-from :murja.view.components.tabs :deftab))
-
 (in-package :murja.view.admin.logs)
 
 
@@ -52,7 +48,8 @@
 
 	 (groups-with-logs (cons untitled-group groups-with-logs)))
     (:a :href (str:replace-all "?ungroup=NIL" ""
-			       (format nil "/blog/logs?ungroup=~a" (not ungroup)))
+			       (murja.genurl:route->url
+				'blog/logs :ungroup (not ungroup)))
 			       
 	 (if ungroup
 	     "Show grouped logs"
diff --git a/src/view/admin/media-admin.lisp b/src/view/admin/media-admin.lisp
index 88246f5..ace3ff6 100644
--- a/src/view/admin/media-admin.lisp
+++ b/src/view/admin/media-admin.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.view.admin.media-admin
-  (:use :cl :binding-arrows :spinneret :ps :paren-async)
-  (:import-from :murja.media.media-db :select-referencing-posts*)
-  (:import-from :murja.view.components.tabs :deftab))
-
 (in-package :murja.view.admin.media-admin)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
@@ -19,7 +14,7 @@
 					    (map (lambda (node)
 						   (@ node dataset picid))))))
 	     (result (await 
-		      (fetch "/api/pictures"
+		      (fetch (murja.genurl:route->url-ps 'murja.routes.media-routes:delete-pic)
 			     (create
 			      method "DELETE"
 			      body (chain JSON (stringify delete-payload))
@@ -70,5 +65,6 @@
 			  (:ul 
 			   (dolist (referencer referencing-posts)
 			     (destructuring-bind (post-id post-title) referencer 
-			       (:li (:a :href (format nil "/blog/post/~a" post-id) post-title)))))
+			       (:li (:a :href
+					(murja.genurl:route->url 'murja.view.single-post:blog/post/id :id post-id) post-title)))))
 			  (:div "No referencing posts"))))))))))
diff --git a/src/view/admin/new-post.lisp b/src/view/admin/new-post.lisp
index b532a1a..3833386 100644
--- a/src/view/admin/new-post.lisp
+++ b/src/view/admin/new-post.lisp
@@ -1,13 +1,3 @@
-(defpackage murja.view.admin.new-post
-  (:use :cl :easy-routes :binding-arrows :spinneret :murja.model.post :murja.view.admin.components.editor)
-  ;; (:import-from :murja.model.post :article :post-title)
-  (:import-from :murja.middleware.db :@transaction :@db)
-  (:import-from :murja.middleware.auth :@authenticated :@ssr-authenticated :*user*)
-  (:import-from :murja.model.user :user-id )
-  (:import-from :murja.view.components.tabs :deftab)
-  (:import-from :murja.posts.post-db :insert-post)
-  (:local-nicknames (:json :com.inuoe.jzon)))
-
 (in-package :murja.view.admin.new-post)
 
 (defun head-script ()
@@ -29,7 +19,9 @@
 		;; TODO wrap these stupid sql-wrappers with something that unbinds values automatically
 		(caar (insert-post "New post" "New title" (user-id *user*) "[]" t t))))
 	  (log:info "A new post with id ~d should now exist~%" post-id)
-	  (hunchentoot:redirect (format nil "/blog/post/editor/~d" post-id)))
+	  (hunchentoot:redirect (murja.genurl:route->url
+				 'murja.view.admin.new-post:blog/post/editor
+				 :id  post-id)))
 	"no can do")))
 
 (deftab blog/post/editor (:url "/post/editor/:id"
@@ -70,5 +62,8 @@
 	    (murja.posts.post-db:link-previously (post-id post) id)))
 
 	(if (post-hidden? post)
-	    (hunchentoot:redirect "/blog")
-	    (hunchentoot:redirect (format nil "/blog/post/~d" (post-id post))))))))
+	    (hunchentoot:redirect (murja.genurl:route->url
+				   'murja.view.blog-root:root))
+	    (hunchentoot:redirect (murja.genurl:route->url
+				   'murja.view.single-post:blog/post/id
+				   :id (post-id post))))))))
diff --git a/src/view/admin/post-list.lisp b/src/view/admin/post-list.lisp
index 9c99df5..ac1b4a1 100644
--- a/src/view/admin/post-list.lisp
+++ b/src/view/admin/post-list.lisp
@@ -1,11 +1,3 @@
-(defpackage murja.view.admin.post-list
-  (:use :cl :binding-arrows :spinneret
-   :easy-routes :cl-hash-util
-   :murja.view.components.blogpost)
-  (:import-from :murja.view.components.tabs :deftab)
-  (:import-from :murja.model.post :admin-get-all-titles :title :month :year :id :tags :hidden :unlisted)
-  (:export :blog/postadmin))
-
 (in-package :murja.view.admin.post-list)
 
 (defun admin-post-row (title-to-print)
@@ -13,12 +5,15 @@
     (with-html
       (:div.title-flex-container
        (:span.post-admin-title (format nil "~a - ~a ~d" title month year))
-       (:a :href (format nil "/blog/post/editor/~d" id) "Edit")
+       (:a :href
+	   (murja.genurl:route->url 'murja.view.admin.new-post:blog/post/editor :id id)
+	   "Edit")
        (:div.post-admin-title
 	(:h* "Tags")
 	(:ul
 	 (dolist (tag tags)
 	   (:li
+	    ;; TODO NOT IMPLEMENTED 
 	    (:a :href (format nil "/blog/tags/~a" tag) tag)))))))))
 
 (defun tagcloud ()
@@ -41,6 +36,7 @@ from blog.post as orig_post,
        (:ul
 	(dolist (c counted)
 	  (destructuring-bind (tag . count) c
+	    ;; TODO NOT IMPLEMENTED 
 	    (:li (:a :href (format nil "/blog/tags/~a" tag)
 		     (format nil "~a (~d)" tag count))))))))))
      
diff --git a/src/view/blog-root.lisp b/src/view/blog-root.lisp
index d601d01..eb9d4be 100644
--- a/src/view/blog-root.lisp
+++ b/src/view/blog-root.lisp
@@ -1,12 +1,3 @@
-(defpackage murja.view.blog-root
-  (:use :cl :binding-arrows
-	:murja.view.components.blogpost
-   :easy-routes :cl-hash-util)
-  (:export :root)
-  (:import-from :murja.view.components.tabs :deftab)
-  (:import-from :murja.model.post :get-page)
-  (:local-nicknames (:settings :murja.setting-definitions)))
-
 (in-package :murja.view.blog-root)
 
 (deftab root (:url "/"
diff --git a/src/view/components/blogpost.lisp b/src/view/components/blogpost.lisp
index 31f2a4d..24dc98a 100644
--- a/src/view/components/blogpost.lisp
+++ b/src/view/components/blogpost.lisp
@@ -1,20 +1,16 @@
-(defpackage murja.view.components.blogpost
-  (:use :cl :binding-arrows :spinneret :murja.model.post :murja.model.user :cl-hash-util)
-  (:import-from :murja.middleware.auth :*user*)
-  (:export :page :blogpost))
-
-  
 (in-package :murja.view.components.blogpost)
 
 (defun previously (prev)
   (with-keys ("id" "title") prev
     (with-html
       (:li 
-       (:a :title title :href (format nil "/blog/post/~d" id) "Previously")))))
+       (:a :title title :href
+	   (murja.genurl:route->url 'murja.view.single-post:blog/post/id :id id) "Previously")))))
 
 (defun tag (tag)
   (with-html
     (:li
+     ;; TODO not implemented so I can't link to a defined route here 
      (:a :href (format nil "/blog/tags/~a" tag) tag))))
 
 (defun blogpost (post)
@@ -27,7 +23,7 @@
 	(:div.post
 	 (:a :href (if (rss-link post)
 		       (rss-link post)
-		       (format nil "/blog/post/~d" id))
+		       (murja.genurl:route->url 'murja.view.single-post:blog/post/id :id id))
 	     title)
 	 (:div.meta
 	  (:img.user_avatar :src img-location)
@@ -38,7 +34,10 @@
 	 (when (and *user*
 		    (not (rss-link post)))
 	   ;; the old editor is in "/blog/post/edit/~d"
-	   (:a :href (format nil "/blog/post/editor/~d" id) "Edit this post"))
+	   (:a :href (murja.genurl:route->url
+		      'murja.view.admin.new-post:blog/post/editor
+		      :id id)
+	       "Edit this post"))
 	 (:article.content
 	  (:raw 
 	   content))
@@ -62,7 +61,12 @@
 		     page)))
 
     (:nav.page-nav (if (> id 1)
-	      (:a :href (format nil "/blog/page/~d" (1- id)) "Newer posts")
+		       (:a :href
+			   (murja.genurl:route->url
+			    'murja.view.blog-root:page-tab :id (1- id))
+			   "Newer posts")
 	      (:span ""))
-	  (:a :href (format nil "/blog/page/~d" (1+ id)) "Older posts"))))
+	  (:a :href (murja.genurl:route->url
+		     'murja.view.blog-root:page-tab :id (1+ id))
+	      "Older posts"))))
 	     
diff --git a/src/view/components/root.lisp b/src/view/components/root.lisp
index 469c4e8..fb027e3 100644
--- a/src/view/components/root.lisp
+++ b/src/view/components/root.lisp
@@ -1,12 +1,3 @@
-(defpackage murja.view.components.root
-  (:use :cl :spinneret :binding-arrows
-	:murja.setting-definitions
-   :murja.middleware.auth
-	:murja.model.user)
-
-  (:export :*inject-to-head* :*inject-to-sidebar* :root-component)
-  (:import-from :murja.posts.post-db :get-titles-by-year))
-
 (in-package :murja.view.components.root)
 
 (defun sidebar-tree ()
@@ -31,7 +22,9 @@
 							    (let ((Id (gethash "Id" title))
 								  (Title (gethash "Title" title)))
 							      (:li
-							       (:a :href (format nil "/blog/post/~d" Id)
+							       (:a :href (murja.genurl:route->url
+									  'murja.view.single-post:blog/post/id
+									  :id  Id)
 								       Title))))
 							  (gethash month by-month)))))))))))))))
 
@@ -43,7 +36,7 @@
 	       (not (member (cl-ppcre:regex-replace "/\\d+$" (hunchentoot:request-uri*) "")
 			    disabled-routes
 			    :test 'equal)))
-	  (:form :action "/blog/new-post" :method "post"
+	  (:form :action (murja.genurl:route->url 'murja.view.admin.new-post:blog/new-post) :method "post"
 		 (:input :type :submit :value "NEW POST"))))))
 	
 
@@ -51,8 +44,10 @@
   (with-html 
     (if *user*
 	(:p :data-testid "welcome-user-label"
+	    ;; FIXME usersettings doesn't exist 
 	    "Welcome, " (:a :href "/blog/usersettings" (user-nickname *user*)))
-	(:form :method "post" :action "/api/login"
+	(:form :method "post"
+	       :action  (murja.genurl:route->url 'murja.routes.login-routes:forms-post-login)
 	       (:label "Username "
 		       (:input :id "username" :name "username" :data-testid "username-input-field"))
 	       (:label "Password "
@@ -72,7 +67,8 @@
 	     (with-html-string 
 	       (:html
 		(:head
-		 (:link :href "/resources/murja.css" :rel "stylesheet" :type "text/css")
+		 ;; TODO move css into lisp 
+		 (:link :href (murja.genurl:route->url 'murja.routes.root-routes:resources :file "murja.css") :rel "stylesheet" :type "text/css")
 		 (:meta :charset "UTF-8")
 		 (:meta :name "viewport" :content "width=device-width,initial-scale=1.0")
 		 (dolist (head-element *inject-to-head*)
diff --git a/src/view/components/tabs.lisp b/src/view/components/tabs.lisp
index e511b15..d879ae3 100644
--- a/src/view/components/tabs.lisp
+++ b/src/view/components/tabs.lisp
@@ -1,8 +1,3 @@
-(defpackage murja.view.components.tabs
-  (:use :cl :easy-routes :murja.middleware.auth :murja.view.components.root :spinneret)
-  (:import-from :murja.middleware.db :@transaction)
-  (:export :*inject-to-head* :deftab))
-
 (in-package :murja.view.components.tabs)
 
 (defclass tab ()
diff --git a/src/view/rss.lisp b/src/view/rss.lisp
index f19a02e..cd7e4dd 100644
--- a/src/view/rss.lisp
+++ b/src/view/rss.lisp
@@ -1,10 +1,3 @@
-(defpackage murja.view.rss
-  (:use :cl :binding-arrows :spinneret :murja.rss.reader-db :easy-routes :ps :paren-async)
-  (:import-from :murja.view.components.tabs :deftab)
-  (:import-from :murja.middleware.auth :*user* :@ssr-authenticated)
-  (:import-from :murja.middleware.db :@db)
-  (:import-from :murja.model.user :user-id))
-
 (in-package :murja.view.rss)
 
 (deftab rss-single-item (:url "/feeds/:feed-id/item/:item-id"
@@ -43,7 +36,7 @@ ORDER BY pubdate DESC" feed-id (not (not archived))))
 
     (:div
      (:a :href (str:replace-all "?archived=NIL" ""
-				(format nil "/blog/feeds/~a?archived=~a" feed-id (not archived)))
+				(genurl:route->url 'rss-single-feed :feed-id feed-id :archived (not archived)))
 	 (if archived
 	     "Show only unread"
 	     "Show all")))
@@ -52,7 +45,7 @@ ORDER BY pubdate DESC" feed-id (not (not archived))))
      (dolist (item items)
        (destructuring-bind (id fetched title link author pubdate) item
 	 (declare (ignore fetched link author))
-	 (:li (:a :href (format nil "/blog/feeds/~a/item/~a" feed-id id)title)
+	 (:li (:a :href (genurl:route->url 'rss-single-item :feed-id feed-id :item-id id) title)
 	      (:section ("Published ~a" (lisp-fixup:fix-timestamp pubdate)))))))))
 
 
@@ -66,9 +59,8 @@ ORDER BY pubdate DESC" feed-id (not (not archived))))
 
 (defun delete-script ()
   (ps
-
     (defun-async delete-feed (feed-id)
-      (let ((result (await (fetch (+ "/feed/" feed-id)
+      (let ((result (await (fetch (lisp (genurl:route->url-ps 'delete-feed-route :id 'feed-id))
 				  (create method "DELETE")))))
 	(if (equal 204 (await (@ result status)))
 	    (chain location (reload))
@@ -94,7 +86,7 @@ ORDER BY pubdate DESC" feed-id (not (not archived))))
     (&post feed_name feed_url)
   (murja.rss.reader-db:subscribe-to-feed2 feed_name feed_url *user*)
   (let ((referer (hunchentoot:header-in* "referer")))
-      (hunchentoot:redirect referer)))
+    (hunchentoot:redirect referer)))
 
 (deftab rss (:url "/feeds/"
 	     :title "RSS Feeds"
@@ -107,14 +99,15 @@ ORDER BY pubdate DESC" feed-id (not (not archived))))
        (destructuring-bind (id name url count last-modified) feed
 	 (:li.flowy-list-item
 	  (:h*
-	   (:a :href (format nil "/blog/feeds/~a" id) (format nil "~a (~d)" name count)))
+	    (:a :href (genurl:route->url 'rss-single-feed :feed-id id)
+		(format nil "~a (~d)" name count)))
 	  (:div "Feed is located in " (:a :href url url))
 	  (:div ("Last updated ~a" (unless (equalp last-modified :NULL)
 				     (lisp-fixup:fix-timestamp last-modified))))
 
 	  (:button.remove-feed :data-feedid id :data-feedname name "DELETE THIS FEED")))))
 
-    (:form :method "POST" :action "/feed"
+    (:form :method "POST" :action (genurl:route->url 'new-feed)
 	   (:h* "Subscribe into a new feed?")
 	   (:label "Feed name: " (:input :type :text :name "feed_name"))
 	   (:label "Feed url: " (:input :type :text :name "feed_url"))
diff --git a/src/view/settings.lisp b/src/view/settings.lisp
index d0fa314..8982e6c 100644
--- a/src/view/settings.lisp
+++ b/src/view/settings.lisp
@@ -1,9 +1,3 @@
-(defpackage murja.view.settings
-  (:use :cl :binding-arrows :spinneret :easy-routes :murja.model.settings)
-  (:import-from :murja.middleware.db :@transaction :@db)
-  (:import-from :murja.middleware.auth :@authenticated :@ssr-authenticated :*user*)
-  (:import-from :murja.view.components.tabs :deftab))
-
 (in-package :murja.view.settings)
 
 (named-readtables:in-readtable :murja.ps)
diff --git a/src/view/single-post.lisp b/src/view/single-post.lisp
index 93396b2..d522bc7 100644
--- a/src/view/single-post.lisp
+++ b/src/view/single-post.lisp
@@ -1,11 +1,3 @@
-(defpackage murja.view.single-post
-  (:use :cl :binding-arrows
-   :easy-routes :cl-hash-util
-   :murja.view.components.blogpost)
-  (:import-from :murja.view.components.tabs :deftab)
-  (:export :blog/post/id)
-  (:import-from :murja.model.post :get-post))
-
 (in-package :murja.view.single-post)
 
 (deftab blog/post/id (:url "/post/:id"
diff --git a/test/genurl-tests.lisp b/test/genurl-tests.lisp
index bb64426..e68e516 100644
--- a/test/genurl-tests.lisp
+++ b/test/genurl-tests.lisp
@@ -1,5 +1,5 @@
 (defpackage murja.tests.genurl
-  (:use :cl :fiveam :murja.genurl)
+  (:use :cl :fiveam :murja.genurl :ps :paren-async)
   (:import-from :murja.tests :prepare-db-and-server :drakma->string :url :main-suite :prepare-db-and-server)
   (:local-nicknames (:settings :murja.setting-definitions)
 		    (:tabs :murja.view.components.tabs)
@@ -7,6 +7,7 @@
 
 (in-package :murja.tests.genurl)
 
+(named-readtables:in-readtable :murja.ps)
 (in-suite main-suite)
 
 (def-test genurl-test (:fixture prepare-db-and-server)
@@ -28,5 +29,48 @@
 	   ;; instances of tab class keep their inner url prefix-less
 	   (is (string= "/" 
 			(tabs::tab-url 
-			 (gethash 'murja.view.blog-root:root murja.view.components.tabs::*tabs*)))))
+			 (gethash 'murja.view.blog-root:root murja.view.components.tabs::*tabs*))))
+
+	   ;; test the parenscript side
+	   (is (string=
+		"async function deleteFeed(feedId) {
+    var result = await fetch('/a-random-test-murja-instance' + '/' + 'feed/' + feedId, { method : 'DELETE' });
+    __PS_MV_REG = [];
+    return 204 == await result.status ? location.reload() : alert('FAIL ' + await result.text());
+};"
+		(ps
+
+		  (defun-async delete-feed (feed-id)
+		    (let ((result (await (fetch (lisp (route->url-ps 
+						       'feed::delete-feed-route :id 'feed-id))
+						(create method "DELETE")))))
+		      (if (equal 204 (await (@ result status)))
+			  (chain location (reload)) 
+			  (alert (+ "FAIL " (await (chain result (text)))))))))))
+		
+	   
+	   ;; random interesting facts tested when rewriting every url in the frontend
+	   (settings:prefix old-prefix)	   
+	   (is (string=
+		"/feeds/feed-me?archived=NIL"
+		(route->url 'feed::rss-single-feed :feed-id "feed-me" :archived (not t))))
+
+	   ;;make sure resetting prefix changes whatever (lisp (route->url-ps ...)) returns 
+	   (is (string=
+		"async function deleteFeed(feedId) {
+    var result = await fetch('' + '/' + 'feed/' + feedId, { method : 'DELETE' });
+    __PS_MV_REG = [];
+    return 204 == await result.status ? location.reload() : alert('FAIL ' + await result.text());
+};"
+		(ps
+
+		  (defun-async delete-feed (feed-id)
+		    (let ((result (await (fetch (lisp (route->url-ps 
+						       'feed::delete-feed-route :id 'feed-id))
+						(create method "DELETE")))))
+		      (if (equal 204 (await (@ result status)))
+			  (chain location (reload)) 
+			  (alert (+ "FAIL " (await (chain result (text))))))))))))
       (settings:prefix old-prefix))))
+
+