diff --git a/conda/batch-update-bob.sh b/conda/batch-update-bob.sh
new file mode 100755
index 0000000000000000000000000000000000000000..85954abede80dfd7559b1849901cee3cc1c2f5ea
--- /dev/null
+++ b/conda/batch-update-bob.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+
+
+set -ex
+
+case $1 in
+	1)
+		packages = ("bob.extension");;
+	2)
+		packages = ("bob.blitz");;
+	3)
+		packages = ("bob.core" "bob.ip.draw");;
+	4)
+		packages = ("bob.io.base" "bob.sp" "bob.math");;
+	5)
+		packages = ("bob.ap" "bob.measure" "bob.db.base" "bob.io.image" "bob.io.video" "bob.io.matlab" "bob.ip.base" "bob.ip.color" "bob.ip.gabor" "bob.learn.activation" "bob.learn.libsvm" "bob.learn.boosting");;
+	6)
+		packages = ("bob.io.audio" "bob.learn.linear" "bob.learn.mlp" "bob.db.wine" "bob.db.mnist" "bob.db.atnt" "bob.ip.flandmark" "bob.ip.facedetect" "bob.ip.optflow.hornschunck" "bob.ip.optflow.liu");;
+	7)
+		packages = ("bob.learn.em" "bob.db.iris");;
+esac
+
+
+for pkg in "${packages[@]}"
+do
+	python update_feedstock.py $pkg
+done
diff --git a/conda/update_feedstock.py b/conda/update_feedstock.py
new file mode 100755
index 0000000000000000000000000000000000000000..e76f624e4f9c9f3617fbc432a427a56368f611bd
--- /dev/null
+++ b/conda/update_feedstock.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+
+import hashlib
+import urllib.request
+import requests
+import json
+try:
+    from packaging.version import parse
+except ImportError:
+    from pip._vendor.packaging.version import parse
+import re
+import tempfile
+import shutil
+import os
+import subprocess
+
+URL_PATTERN = 'https://pypi.python.org/pypi/{package}/json'
+
+
+def run_commands(*calls):
+  """runs the given commands."""
+  # get all calls
+  for call in calls:
+    if True or False:
+      print(' - ' + ' '.join(call))
+    if not False:
+      # execute call
+      if subprocess.call(call):
+        # call failed (has non-zero exit status)
+        raise ValueError("Command '%s' failed; stopping" % ' '.join(call))
+
+
+def get_version(package, url_pattern=URL_PATTERN):
+  """Return version of package on pypi.python.org using json."""
+  # reader = codecs.getreader("utf-8")
+  req = requests.get(url_pattern.format(package=package))
+  version = parse('0')
+  if req.status_code == requests.codes.ok:
+    # j = json.loads(req.text.encode(req.encoding))
+    j = json.loads(req.text)
+    if 'releases' in j:
+      releases = j['releases']
+      for release in releases:
+        ver = parse(release)
+        if not ver.is_prerelease:
+          version = max(version, ver)
+  return str(version)
+
+
+def get_remote_md5_sum(url, max_file_size=100 * 1024 * 1024):
+  remote = urllib.request.urlopen(url)
+  hash = hashlib.md5()
+
+  total_read = 0
+  while True:
+    data = remote.read(4096)
+    total_read += 4096
+
+    if not data or total_read > max_file_size:
+      break
+
+    hash.update(data)
+
+  return hash.hexdigest()
+
+
+def main(package):
+  stable_version = get_version(package)
+  print('latest stable version for {} is {}'.format(package, stable_version))
+  url = 'https://pypi.io/packages/source/{0}/{1}/{1}-{2}.zip'.format(package[0], package, stable_version)
+  try:
+    md5 = get_remote_md5_sum(url)
+  except Exception:
+      raise
+  temp_dir = tempfile.mkdtemp()
+  try:
+    print("\nClonning the feedstock")
+    feedstock = os.path.join(temp_dir, 'feedstock')
+    try:
+      run_commands(['git', 'clone', 'git@github.com:conda-forge/{}-feedstock.git'.format(package), feedstock])
+    except ValueError:
+      print("\nThe feedstock does not exist on conda-forge. Exiting ...")
+      raise
+    os.chdir(feedstock)
+    run_commands(['git', 'remote', 'add', 'bioidiap', 'git@github.com:bioidiap/{}-feedstock.git'.format(package)],
+                 ['git', 'fetch', '--all'],
+                 ['git', 'checkout', '-b', stable_version])
+    # update meta.yaml
+    with open('recipe/meta.yaml') as f:
+      doc = f.read()
+    if package == 'bob.math':
+      build_number = '200'
+    else:
+      build_number = '0'
+    doc = re.sub(r'\{\s?%\s?set\s?version\s?=\s?".*"\s?%\s?\}', '{% set version = "' + str(stable_version) + '" %}', doc, count=1)
+    doc = re.sub(r'\s+number\:\s?[0-9]+', '\n  number: ' + build_number, doc, count=1)
+    doc = re.sub(r'\{\s?%\s?set\s?build_number\s?=\s?"[0-9]+"\s?%\s?\}', '{% set build_number = "' + build_number + '" %}', doc, count=1)
+    doc = re.sub(r'\s+md5\:.*', '\n  md5: {}'.format(md5), doc, count=1)
+    doc = re.sub(r'\s+url\:.*', '\n  url: {}'.format(url.replace(stable_version, '{{ version }}')), doc, count=1)
+    doc = re.sub(r'\s+home\:.*', '\n  home: https://www.idiap.ch/software/bob/', doc, count=1)
+    with open('recipe/meta.yaml', 'w') as f:
+      f.write(doc)
+    run_commands(['conda-smithy', 'rerender'],
+                 ['git', '--no-pager', 'diff'],
+                 ['git', 'commit', '-am', 'Updating to version {}'.format(stable_version)],
+                 ['git', 'push', '--force', '--set-upstream', 'bioidiap', stable_version],
+                 ['firefox', 'https://github.com/conda-forge/{}-feedstock/compare/master...bioidiap:{}?expand=1'.format(package, stable_version)])
+    print('\nPlease create the pull request in the webpage that was openned.')
+  finally:
+    shutil.rmtree(temp_dir)
+
+
+if __name__ == '__main__':
+  import sys
+  main(*sys.argv[1:])