diff --git a/sitegin/config.js b/sitegin/config.js
index ef505e968f3d1c57d5470c6dad8496891294f93b..9b2e93c665f84029a287ed41535465a4d0b2018c 100644
--- a/sitegin/config.js
+++ b/sitegin/config.js
@@ -39,6 +39,7 @@ module.exports = function() {
         staticDir: options.staticdir,
         themeDir: options.themedir,
         articlesLocation: 'articles',
+        redirectsLocation: 'redirects',
         linksPerPage: 6
       }});
     }
diff --git a/sitegin/parseRedirects.js b/sitegin/parseRedirects.js
new file mode 100644
index 0000000000000000000000000000000000000000..352e89b9419b1f4491b86765e844a076a49f74d8
--- /dev/null
+++ b/sitegin/parseRedirects.js
@@ -0,0 +1,34 @@
+'use strict';
+var toml = require('toml');
+var path = require('path');
+
+var readRedirectWorker = function(content, obj) {
+  if(content === undefined) throw new Error('content is undefined');
+  try {
+    obj.metadata = toml.parse(content);
+  } catch(e) {
+    console.log(obj.filename+': Failed to parse metadata');
+    throw e;
+  }
+  obj.content = obj.metadata.target;
+  console.log(obj.file)
+  obj.file = obj.file.split(path.sep).join('/');
+  if(obj.file.match(/^redirects\/(.*)index\.toml/))
+    obj.file = obj.file.replace(/^redirects\/(.*)index\.toml/,'$1');
+  else
+    obj.file = obj.file.replace(/^redirects\/(.*)\.toml/,'$1');
+  console.log(obj.file)
+  return obj;
+}
+
+module.exports = function(obj) {
+  console.log('Build step: ParseRedirects');
+  return new Promise(function(resolve, reject) {
+    var redirects = [];
+    obj.redirects.forEach(function(page) {
+      redirects.push(readRedirectWorker(page.content, page));
+    })
+    obj.redirects = redirects;
+    resolve(obj);
+  });
+}
diff --git a/sitegin/pipeline.js b/sitegin/pipeline.js
index b1e249dc1bb55d965d19aa2bb3cbd0a9950f7eed..1a16514831ac92d72e6b60155c16ffad433f7165 100644
--- a/sitegin/pipeline.js
+++ b/sitegin/pipeline.js
@@ -8,6 +8,7 @@ module.exports = function(jobs) {
     'config',
     'readFiles',
     'parseHugo',
+    'parseRedirects',
     'gitInfo',
     'urls',
     'sitemap',
diff --git a/sitegin/readFiles.js b/sitegin/readFiles.js
index e467e78254bc35f67ea8815e82192365af0c4406..a2aed1b2f90d2609ee22a9eaa799852e2f8b3f1b 100644
--- a/sitegin/readFiles.js
+++ b/sitegin/readFiles.js
@@ -1,3 +1,4 @@
+'use strict';
 /*
  * This job reads files from config.articlesLocation and loads this list to `pages`
  */
@@ -7,33 +8,57 @@ var path = require('path');
 
 module.exports = function(obj) {
   console.log('Build step: ReadFiles');
-  return new Promise(function(resolve, reject) {
+  var onFile = function(root, fileStats, next, array) {
+    var filename = path.join(root,fileStats.name);
+    var file = path.relative(obj.config.sourceDir, filename);
+    fs.readFile(filename, 'utf8', function(err,data) {
+      if(err) {
+        console.log('Error reading file '+filename)
+        console.log(err);
+      } else {
+        array.push({
+          filename: filename,
+          file: file,
+          content: data
+        })
+      }
+      next()
+    })
+  };
+
+  var promise1 = new Promise(function(resolve, reject) {
     var pages = [];
     walk.walk(path.join(obj.config.sourceDir,obj.config.articlesLocation))
-    .on('file',function(root, fileStats, next) {
-      var filename = path.join(root,fileStats.name);
-      var file = path.relative(obj.config.sourceDir, filename);
-      fs.readFile(filename, 'utf8', function(err,data) {
-        if(err) {
-          console.log('Error reading file '+filename)
-          console.log(err);
-        } else {
-          pages.push({
-            filename: filename,
-            file: file,
-            content: data
-          })
-        }
-        next()
-      })
+    .on('file',function(root,fileStats,next) {
+      onFile(root,fileStats,next,pages);
+    })
+    .on('errors',function(root, nodeStatsArray, next) {
+      console.log('Walker error', root, nodeStatsArray);
+      next();
+    })
+    .on('end', function() {
+      resolve({type: 'pages', val: pages});
+    })
+  })
+
+  var promise2 = new Promise(function(resolve, reject) {
+    let redirects = [];
+    walk.walk(path.join(obj.config.sourceDir,obj.config.redirectsLocation))
+    .on('file',function(root,fileStats,next) {
+      onFile(root,fileStats,next,redirects);
     })
     .on('errors',function(root, nodeStatsArray, next) {
       console.log('Walker error', root, nodeStatsArray);
       next();
     })
     .on('end', function() {
-      obj.pages = pages;
-      resolve(obj);
+      resolve({type: 'redirects', val: redirects});
     })
   })
+  return Promise.all([promise1,promise2]).then(function(arr) {
+    arr.forEach(function(v) {
+      obj[v.type] = v.val;
+    });
+    return obj;
+  });
 }
diff --git a/sitegin/sitegin.js b/sitegin/sitegin.js
index be2db35498cf1df569226721e30bc8fee169fd6c..68387c57ff50483530312f91e5a7c03e65847b78 100644
--- a/sitegin/sitegin.js
+++ b/sitegin/sitegin.js
@@ -17,6 +17,7 @@ module.exports = function(config) {
     ['writeFiles', './writeFiles'],
     ['resetJobs', './resetJobs'],
     ['sitemap', './sitemap'],
+    ['parseRedirects','./parseRedirects'],
 
     ['pipeline','./pipeline']
   )
diff --git a/sitegin/tags.js b/sitegin/tags.js
index be2386ed1b137fe98daded528fd9d7af8cb780cd..bf8a32de047d7356df68ba83002938020220f26e 100644
--- a/sitegin/tags.js
+++ b/sitegin/tags.js
@@ -42,7 +42,7 @@ module.exports = function(obj) {
     });
 
     obj.tags = [];
-    obj.redirects = [];
+    if(!Array.isArray(obj.redirects)) obj.redirects = [];
 
     var generateTagPages = function(file, pageList) {
       var pg = {};
diff --git a/sitegin/tests/content/redirects/index.toml b/sitegin/tests/content/redirects/index.toml
new file mode 100644
index 0000000000000000000000000000000000000000..6dc609757f5f15ebb5cb91104f54811b1a82a943
--- /dev/null
+++ b/sitegin/tests/content/redirects/index.toml
@@ -0,0 +1 @@
+target = "/tag/clanek/1/"
diff --git a/sitegin/writeFiles.js b/sitegin/writeFiles.js
index afc4ff2a0df6c328b567f55ecbc08b965233b91e..002e8354e518c6c21ede88b6e2d19061bca3117c 100644
--- a/sitegin/writeFiles.js
+++ b/sitegin/writeFiles.js
@@ -26,6 +26,8 @@ module.exports = function(obj) {
           var f = path.join(builddir,article.file,'index.'+o.type);
           doWrite(f, o.content);
         })
+      } else {
+        console.log(article);
       }
     }
     obj.pages.forEach(function(o) { writeFile(o); })
diff --git a/theme/static/index.html b/theme/static/index.html
deleted file mode 100644
index 3989517e183ac618046c49ce47527f974020573d..0000000000000000000000000000000000000000
--- a/theme/static/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en-US">
-    <head>
-        <meta charset="UTF-8">
-        <meta http-equiv="refresh" content="1;url=/tag/clanek">
-        <script type="text/javascript">
-            window.location.href = "/tag/clanek"
-        </script>
-        <title>Přesměrování...</title>
-    </head>
-    <body>
-        Pokud nebudete přesměrováni automaticky tak následujte <a href='/tag/clanek'>tento odkaz</a>
-    </body>
-</html>
diff --git a/theme/static/index.php b/theme/static/index.php
deleted file mode 100644
index bf2dbaefed9bbf78861f25e6003324ca80e5f6eb..0000000000000000000000000000000000000000
--- a/theme/static/index.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-header("location: /tag/clanek");
-?>
-<!DOCTYPE HTML>
-<html lang="en-US">
-    <head>
-        <meta charset="UTF-8">
-        <meta http-equiv="refresh" content="1;url=/tag/clanek">
-        <script type="text/javascript">
-            window.location.href = "/tag/clanek"
-        </script>
-        <title>Přesměrování...</title>
-    </head>
-    <body>
-        Pokud nebudete přesměrováni automaticky tak následujte <a href='/tag/clanek'>tento odkaz</a>
-    </body>
-</html>