diff --git a/themes/bootstrap-blog/scripts/bs_paginator.js b/themes/bootstrap-blog/scripts/bs_paginator.js
new file mode 100644
index 0000000..472f450
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/bs_paginator.js
@@ -0,0 +1,120 @@
+'use strict';
+
+function bsPaginatorHelper(options){
+  /* jshint validthis: true */
+  options = options || {};
+
+  var current = options.current || this.page.current || 0;
+  var total = options.total || this.page.total || 1;
+  var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
+  var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
+  var space = options.hasOwnProperty('space') ? options.space : '&hellip;';
+  var base = options.base || this.page.base || this.config.root || '';
+  var format = options.format || this.config.pagination_dir + '/%d/';
+  var prevText = options.prev_text || 'Prev';
+  var nextText = options.next_text || 'Next';
+  var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
+  var transform = options.transform;
+  var self = this;
+  var result = '';
+  var i;
+
+  if (!current) return '';
+
+  var currentPage = '<li class="active"><span class="page-number">' +
+    (transform ? transform(current) : current) +
+    '</span></li>';
+
+  function link(i){
+    return self.url_for(i === 1 ? base : base + format.replace('%d', i));
+  }
+
+  function pageLink(i){
+    return '<li><a class="page-number" href="' + link(i) + '">' +
+      (transform ? transform(i) : i) +
+      '</a></li>';
+  }
+
+  // Display the link to the previous page
+  if (prevNext){
+    if (current > 1) {
+      result += '<li><a class="page-prev" rel="prev" ' +
+              'href="' + link(current - 1) + '">' + prevText + '</a></li>';
+    } else {
+      result += '<li class="disabled"><span class="page-prev">' + prevText + '</a></li>';
+    }
+  }
+
+  if (options.show_all){
+    // Display pages on the left side of the current page
+    for (i = 1; i < current; i++){
+      result += pageLink(i);
+    }
+
+    // Display the current page
+    result += currentPage;
+
+    // Display pages on the right side of the current page
+    for (i = current + 1; i <= total; i++){
+      result += pageLink(i);
+    }
+  } else {
+    // It's too complicated. May need refactor.
+    var leftEnd = current <= endSize ? current - 1 : endSize;
+    var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
+    var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
+    var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
+    var spaceHtml = '<li class="disabled"><span class="page-space">' + space + '</span></li>';
+
+    // Display pages on the left edge
+    for (i = 1; i <= leftEnd; i++){
+      result += pageLink(i);
+    }
+
+    // Display spaces between edges and middle pages
+    if (space && current - endSize - midSize > 1){
+      result += spaceHtml;
+    }
+
+    // Display left middle pages
+    if (leftMid > leftEnd){
+      for (i = leftMid; i < current; i++){
+        result += pageLink(i);
+      }
+    }
+
+    // Display the current page
+    result += currentPage;
+
+    // Display right middle pages
+    if (rightMid < rightEnd){
+      for (i = current + 1; i <= rightMid; i++){
+        result += pageLink(i);
+      }
+    }
+
+    // Display spaces between edges and middle pages
+    if (space && total - endSize - midSize > current){
+      result += spaceHtml;
+    }
+
+    // Dispaly pages on the right edge
+    for (i = rightEnd; i <= total; i++){
+      result += pageLink(i);
+    }
+  }
+
+  // Display the link to the next page
+  if (prevNext){
+    if (current < total) {
+      result += '<li><a class="page-next" rel="next" ' +
+              'href="' + link(current + 1) + '">' + nextText + '</a></li>';
+    } else {
+      result += '<li class="disabled"><span class="page-next">' + nextText + '</a></li>';
+    }
+  }
+
+  return '<nav><ul class="pagination">' + result + '</ul></nav>';
+}
+
+hexo.extend.helper.register('bs_paginator', bsPaginatorHelper);
diff --git a/themes/bootstrap-blog/scripts/callout.js b/themes/bootstrap-blog/scripts/callout.js
new file mode 100644
index 0000000..6413b33
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/callout.js
@@ -0,0 +1,17 @@
+/**
+ * Bootstrap callout style
+ *
+ * Syntax:
+ *   {% callout [type] %}
+ *   Callout content
+ *   {% endcallout %}
+ */
+
+hexo.extend.tag.register('callout', function(args, content) {
+  var calloutType = args.length ? args[0] : 'default';
+  var result = '';
+  result += '<div class="bs-callout bs-callout-' + calloutType + '">';
+  result += hexo.render.renderSync({text: content, engine: 'markdown'});
+  result += '</div>';
+  return result;
+}, true);
\ No newline at end of file
diff --git a/themes/bootstrap-blog/scripts/fancybox.js b/themes/bootstrap-blog/scripts/fancybox.js
new file mode 100644
index 0000000..50c154f
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/fancybox.js
@@ -0,0 +1,24 @@
+var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
+
+/**
+ * Fancybox tag
+ *
+ * Syntax:
+ *   {% fancybox /path/to/image [/path/to/thumbnail] [title] %}
+ */
+
+hexo.extend.tag.register('fancybox', function(args){
+  var original = args.shift(),
+    thumbnail = '';
+
+  if (args.length && rUrl.test(args[0])){
+    thumbnail = args.shift();
+  }
+
+  var title = args.join(' ');
+
+  return '<a class="fancybox" href="' + original + '" title="' + title + '">' +
+    '<img src="' + (thumbnail || original) + '" alt="' + title + '">'
+    '</a>' +
+    (title ? '<span class="caption">' + title + '</span>' : '');
+});
\ No newline at end of file
