diff --git a/index.js b/index.js
index 8e2615e9b3ec9b9d6fa1bd8e4eb8defa6c58e9dc..e13a009f578cdc66de89fae01c18ca0e8c3b5666 100755
--- a/index.js
+++ b/index.js
@@ -8,7 +8,7 @@ require('./sitegin/sitegin')({
   var fs = require('fs');
 
   function run() {
-    jobs.runSequence('config','readFiles','print')
+    jobs.runSequence('config','readFiles','parseHugo','print')
     .catch(e => console.log(e.stack));
   }
 
diff --git a/package.json b/package.json
index 34b487f1373703938e99333881392691dfa7cbee..fbfc3ce82757b56223f56a8c365b0a192f1fa9a9 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
     "browser-sync": "^2.11.1",
     "chokidar": "^1.4.2",
     "highlight.js": "^9.2.0",
+    "jsesc": "^1.0.0",
     "marked": "^0.3.5",
     "mkdirp": "^0.5.1",
     "moment": "^2.11.2",
diff --git a/sitegin/Page.js b/sitegin/Page.js
deleted file mode 100644
index 42e3f2899cf78586237a1ac5f09764db29927319..0000000000000000000000000000000000000000
--- a/sitegin/Page.js
+++ /dev/null
@@ -1,52 +0,0 @@
-
-exports.Page = function() {
-  this.file = "";
-  this.metadata = {};
-  this.content = "";
-  this.type = "article";
-}
-
-exports.PageList = function() {
-  var list = this;
-  list.list = [];
-
-  list.length = 0;
-
-  list.addPage = function(article) {
-    list.length++;
-    if(! (article instanceof exports.Page))
-      throw "article has to be of type Page";
-    else if(list.containsFile(article.file)) {
-      console.log(list.getPageByFile(article.file));
-      throw "article is already in this list"
-    } else
-      list.list.push(article);
-  }
-
-  list.forEach = function(f) {
-    list.list.forEach(f);
-  }
-
-  list.getPageByFile = function(file) {
-    var rarticle = undefined;
-    list.forEach(function(article) {
-      if(article.file == file) {
-        rarticle = article;
-      }
-    });
-    return rarticle;
-  }
-
-  list.containsFile = function(file) {
-    var contains = false;
-    list.forEach(function(article) {
-      if(article.file == file) {
-        contains = true;
-      }
-    });
-    return contains;
-  }
-
-  return list;
-}
-
diff --git a/sitegin/transformer-git.js b/sitegin/gitInfo.js
similarity index 100%
rename from sitegin/transformer-git.js
rename to sitegin/gitInfo.js
diff --git a/sitegin/input-hugo.js b/sitegin/input-hugo.js
deleted file mode 100644
index a1725dcd23570e2c08084c28d87634b26a62e0b3..0000000000000000000000000000000000000000
--- a/sitegin/input-hugo.js
+++ /dev/null
@@ -1,130 +0,0 @@
-var fs = require('fs');
-var toml = require('toml');
-var PageList = require('./Page').PageList;
-var Page = require('./Page').Page;
-var moment = require('moment');
-var path = require('path');
-
-function walk(currentDirPath, callback, end_cb) {
-  var subcalls = 0;
-  var ender = function() {
-    subcalls--;
-    if(subcalls <= 0) {
-      if(end_cb !== undefined)
-        end_cb();
-    }
-  }
-  var fs = require('fs'), path = require('path');
-  fs.readdir(currentDirPath, function(err, files) {
-    if(err!=null) console.log(err);
-    files.forEach(function(name) {
-      var filePath = path.join(currentDirPath, name);
-      try {
-        var stat = fs.statSync(filePath);
-        if (stat.isFile()) {
-          callback(filePath, stat);
-        } else if (stat.isDirectory()) {
-          if(filePath.indexOf(".git") < 0) {
-            subcalls++;
-            walk(filePath, callback, ender);
-          }
-        }
-      } catch(e) {}
-    });
-    if(subcalls == 0) ender();
-    
-  });
-};
-
-var readPageWorker = function(file, articleName, contentDir) {
-  if(file === undefined) throw new Error("file is undefined");
-  file = file.substring(4);
-  var fm_end = file.indexOf("+++");
-  var obj = new Page;
-  obj.origFile = contentDir+articleName+'.md';
-  obj.file = articleName.replace("articles","clanek");
-  obj.content = file.substring(fm_end+4);
-  try {
-    obj.metadata = toml.parse(file.substring(0,fm_end-1)+"\n");
-  } catch(e) {
-    console.log(articleName+": Failed to parse metadata");
-    throw e;
-  }
-  if(obj.metadata.date && obj.metadata.date.creation) obj.metadata.date.creation = moment(obj.metadata.date.creation);
-  return obj;
-}
-module.exports = function(_contentDir) {
-  var exports = this;
-  exports.walk = walk;
-  exports.fancyname = "loader hugo";
-  var contentDir = _contentDir;
-  if(contentDir == undefined) contentDir = './content/';
-  if(!contentDir.endsWith('/')) contentDir+='/';
-
-  /*
-   * articleName:
-   *   string
-   * callback:
-   *   called when article is read
-   * returns:
-   *   {
-   *     string articleName,content
-   *     object frontmatter
-   *     function save
-   *   }
-   */
-  exports.readPage = function(articleName, cb) {
-    fs.readFile(contentDir+articleName+".md", 'utf8', function(err, data) {
-      if(err != null) throw err;
-      cb(readPageWorker(data, articleName, contentDir));
-    });
-  }
-
-  /*
-   * callback:
-   *     function(articleName)
-   *     called for each article on website
-   * cb_end:
-   *     function()
-   *     called when all articles are listed
-   */
-  exports.forEachPage = function(callback, cb_end) {
-    walk(contentDir+"articles",function(filePath, stat) {
-      console.log(filePath, path.basename(filePath));
-      if(path.basename(filePath).substr(0,1) == ".") return;
-      if(callback !== undefined) callback(filePath.substring(contentDir.length,filePath.length-3));
-    }, function() {
-      if(cb_end !== undefined) cb_end();
-    });
-  };
-
-  /*
-   * cb:
-   *    function(articleList)
-   *    called after all cb_on_each
-   */
-  exports.getPageList = function(cb) {
-    var currentlyReadingCount = 0;
-    var allPagesListed = false;
-    var cb_called = false;
-    var list = new PageList;
-
-    exports.forEachPage(function(articleName) {
-      currentlyReadingCount++;
-      exports.readPage(articleName, function(article){
-        list.addPage(article);
-        currentlyReadingCount--;
-        if(allPagesListed && currentlyReadingCount == 0 && !cb_called) {
-          if(cb !== undefined) cb(list);
-          cb_called = true;
-        }
-      });
-    },function(){
-      if(currentlyReadingCount == 0 && !cb_called) {
-        if(cb !== undefined) cb(list);
-        cb_called = true;
-      }
-      allPagesListed = true;
-    });
-  };
-}
diff --git a/sitegin/transformer-images.js b/sitegin/legacy/images.js
similarity index 100%
rename from sitegin/transformer-images.js
rename to sitegin/legacy/images.js
diff --git a/sitegin/transformer-markdown.js b/sitegin/legacy/markdown.js
similarity index 100%
rename from sitegin/transformer-markdown.js
rename to sitegin/legacy/markdown.js
diff --git a/sitegin/transformer-nunjucks.js b/sitegin/legacy/nunjucks.js
similarity index 100%
rename from sitegin/transformer-nunjucks.js
rename to sitegin/legacy/nunjucks.js
diff --git a/sitegin/transformer-tags.js b/sitegin/legacy/tags.js
similarity index 100%
rename from sitegin/transformer-tags.js
rename to sitegin/legacy/tags.js
diff --git a/sitegin/transformer-urlizetags.js b/sitegin/legacy/urls.js
similarity index 100%
rename from sitegin/transformer-urlizetags.js
rename to sitegin/legacy/urls.js
diff --git a/sitegin/output-filesystem.js b/sitegin/legacy/writeFiles.js
similarity index 100%
rename from sitegin/output-filesystem.js
rename to sitegin/legacy/writeFiles.js
diff --git a/sitegin/output-console.js b/sitegin/output-console.js
deleted file mode 100644
index b9074e197f3a216af4ce99d5c0802e9af2b648b3..0000000000000000000000000000000000000000
--- a/sitegin/output-console.js
+++ /dev/null
@@ -1,9 +0,0 @@
-
-module.exports = function() {
-  var out = this;
-  out.fancyname = "output console";
-  out.forEachPage = function(article, cb) {
-    cb();
-  }
-}
-
diff --git a/sitegin/parseHugo.js b/sitegin/parseHugo.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0cd9a94443c7772624c2f62a2ce1045af7c9993
--- /dev/null
+++ b/sitegin/parseHugo.js
@@ -0,0 +1,40 @@
+var toml = require('toml');
+var moment = require('moment');
+var path = require('path');
+var jsesc = require('jsesc')
+
+var readPageWorker = function(content, articleName) {
+  if(content === undefined) throw new Error("content is undefined");
+  var head = content.substring(0,4)
+  if(head !== '+++\n')
+    throw new Error('Failed to parse file '+articleName+':\n'+
+                    'Wrong header (expected "+++\\n" got "'+jsesc(head)+'")')
+
+  content = content.substring(4);
+  var fm_end = content.indexOf("+++\n");
+  if(fm_end < 0) {
+    console.log(jsesc(content));
+    throw new Error('Cannot find terminating +++\n in file '+articleName);
+  }
+  var obj = {};
+  obj.content = content.substring(fm_end+4);
+  try {
+    obj.metadata = toml.parse(content.substring(0,fm_end-1)+"\n");
+  } catch(e) {
+    console.log(articleName+": Failed to parse metadata");
+    throw e;
+  }
+  if(obj.metadata.date && obj.metadata.date.creation) obj.metadata.date.creation = moment(obj.metadata.date.creation);
+  return obj;
+}
+
+module.exports = function(obj) {
+  return new Promise(function(resolve, reject) {
+    var pages = [];
+    obj.pages.forEach(function(page) {
+      pages.push(readPageWorker(page.content, page.filename));
+    })
+    obj.pages = pages;
+    resolve(obj);
+  });
+}
diff --git a/sitegin/print.js b/sitegin/print.js
index 332c10877c38b739acd977a03f12eff7f4a3a452..c7c44608eb1582638f0b82c6655215cdd9c43e95 100644
--- a/sitegin/print.js
+++ b/sitegin/print.js
@@ -1,7 +1,11 @@
+var util = require('util')
+
 module.exports = function(a) {
   var pages = a.pages
-  a.pages = ['...']
-  console.log(a)
+  var page0 = pages[0]
+  //page0.content = '...'
+  a.pages = [page0]
+  console.log(JSON.stringify(a,null,2))
   a.pages = pages
   return Promise.resolve(a)
 }
diff --git a/sitegin/read-files.js b/sitegin/readFiles.js
similarity index 100%
rename from sitegin/read-files.js
rename to sitegin/readFiles.js
diff --git a/sitegin/sequencer.js b/sitegin/sequencer.js
deleted file mode 100644
index b5c271da37c4c84bf18a83dd91e3e89ed668893a..0000000000000000000000000000000000000000
--- a/sitegin/sequencer.js
+++ /dev/null
@@ -1,59 +0,0 @@
-module.exports = function() {
-  var t = this;
-  var lastEvent;
-  this.load = function(input) {
-    lastEvent = input.fancyname+" done";
-    input.getPageList(function(list) {
-      t.emit(input.fancyname+" done", list);
-    });
-    return this;
-  }
-
-  this.registerNext = function(obj) {
-    // pre
-    t.on(lastEvent, function(list) {
-      if(obj.pre !== undefined) {
-        obj.pre(function() {
-          t.emit(obj.fancyname+' pre done', list);
-        }, list);
-      } else {
-        t.emit(obj.fancyname+' pre done', list);
-      }
-    });
-    // forEachPage
-    t.on(obj.fancyname+' pre done', function(list) {
-      var transforming = list.length;
-      if(obj.forEachPage !== undefined) {
-        list.forEach(function(article) {
-          obj.forEachPage(article, function() {
-            transforming--;
-            if(transforming == 0) {
-              t.emit(obj.fancyname+' forEachPage done', list);
-            }
-          });
-        });
-      } else {
-        t.emit(obj.fancyname+' forEachPage done', list);
-      }
-    });
-    // post
-    t.on(obj.fancyname+' forEachPage done', function(list) {
-      if(obj.post !== undefined) {
-        obj.post(function() {
-          t.emit(obj.fancyname+' post done', list);
-        }, list)
-      } else {
-        t.emit(obj.fancyname+' post done', list);
-      }
-    });
-
-    lastEvent = obj.fancyname+' post done';
-    return this;
-  }
-
-  this.finish = function(f) {
-    t.on(lastEvent, f);
-  }
-}
-
-module.exports.prototype.__proto__ = require('events').EventEmitter.prototype;
diff --git a/sitegin/sitegin.js b/sitegin/sitegin.js
index 9587ec1c046f946799419b43b33cb8230d0039d4..0991f4c0cc07f3611f65148d9e7eb3452dabd1e6 100644
--- a/sitegin/sitegin.js
+++ b/sitegin/sitegin.js
@@ -4,8 +4,8 @@ module.exports = function(config) {
   return jobs.registerMultiple(
     config,
     ['config', './config'],
-    ['readFiles', './read-files'],
-    ['parseHugo', './input-hugo'],
+    ['readFiles', './readFiles'],
+    ['parseHugo', './parseHugo'],
     ['print', './print'],
 
     ['transformer-git', './transformer-git'],
@@ -15,10 +15,8 @@ module.exports = function(config) {
 
     ['transformer-markdown', './transformer-markdown'],
     ['transformer-nunjucks', './transformer-nunjucks'],
-    ['transformer-tags', './transformer-tags'],
     ['transformer-urlizetags', './transformer-urlizetags'],
-    ['transformer-other', './transformer-other'],
-    ['transformer-images', './transformer-images']
+    ['transformer-other', './transformer-other']
   )
   .then(function() {
     return jobs;
diff --git a/sitegin/transformer-basichtml.js b/sitegin/transformer-basichtml.js
deleted file mode 100644
index 3ca958cfd51512aa7a916cdd2be4231919563a24..0000000000000000000000000000000000000000
--- a/sitegin/transformer-basichtml.js
+++ /dev/null
@@ -1,12 +0,0 @@
-
-module.exports = function() {
-  var tr = this;
-  tr.fancyname = "transformer basichtml";
-  tr.forEachPage = function(article, cb) {
-    article.content = "<!DOCTYPE html><html><meta charset=\"UTF-8\" /><head><title>"
-    +article.metadata.title+
-    "</title></head><body>" + article.content + "</body></html>";
-    cb();
-  }
-}
-
diff --git a/sitegin/transformer-other.js b/sitegin/transformer-other.js
deleted file mode 100644
index 1c471a77c5d37827a8e27887c7b3bffd19127bca..0000000000000000000000000000000000000000
--- a/sitegin/transformer-other.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var path = require('path');
-
-module.exports = function(articleList) {
-  console.log(articleList)
-  return Promise.resolve(articleList);
-
-  articleList.forEach(function(article) {
-    var img = article.metadata.image;
-    article.file = article.file.split(path.sep).join("/");
-    if(img) {
-      if(!img.match(/^\//)) {
-        article.metadata.image = article.file+"/"+img;
-      } else {
-        article.metadata.image = img.replace("/","");
-      }
-    }
-  });
-  return Promise.resolve(articleList);
-}