diff --git a/bob/extension/scripts/__init__.py b/bob/extension/scripts/__init__.py
index 91f14c01427d81eb0a8361ec4965962b6b83031d..58bb841d4f20aef1ff88f6ce03f83925d31fd991 100644
--- a/bob/extension/scripts/__init__.py
+++ b/bob/extension/scripts/__init__.py
@@ -1,4 +1,3 @@
-from .dependency_graph import main as dependency_graph
 from .main_cli import main as main_cli
 from . import click_helper
 
diff --git a/bob/extension/scripts/dependency_graph.py b/bob/extension/scripts/dependency_graph.py
deleted file mode 100644
index a1f09c0aebdebfc4453e48c65d0001c45f0ee16d..0000000000000000000000000000000000000000
--- a/bob/extension/scripts/dependency_graph.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!../bin/python
-
-"""
-This script will generate a dependency graph of the given bob package(s) using the external tool ``dot``.
-Packages can be either specified as a list of ``--packages`` or read from (several) ``--package-files``.
-The latter option is mostly useful to generate a dot graph for all Bob packages.
-
-The output is written to the given ``--output-file``, writing either the specified intermediate ``--dot-file``, or a temporary file.
-When the ``--plot-external-dependencies`` is selected, also external (Python-)dependencies will be plotted as well, in red ellipses.
-"""
-
-from __future__ import print_function
-import subprocess
-import pkg_resources
-import tempfile, os
-
-import argparse
-
-def main(command_line_options = None):
-  parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
-
-  parser.add_argument("--packages", '-p', nargs = '+', default = [], help = "Which packages do you want to have dependencies for?")
-  parser.add_argument("--package-files", '-P', nargs = '+', default = [], help = "Read packages from the given files (usually requirement?.txt files of bob).")
-  parser.add_argument("--dot-file", "-W", help = "If specified, the .dot file is written to the given file.")
-  parser.add_argument("--output-file", "-w", default="dependencies.png", help = "Specify the (.png) file to write.")
-  parser.add_argument("--limit-packages", '-l', nargs = '+', default = ['bob', 'facereclib', 'antispoofing'], help = "Limit packages read from --package-files to the given namespaces")
-  parser.add_argument("--plot-external-dependencies", '-X', action='store_true', help = "Include external dependencies into the plot?")
-  parser.add_argument("--rank-base-tools-same", '-R', action = 'store_true', help = "Set the rank of packages bob.extension, bob.core and bob.blitz at the same size")
-  parser.add_argument("--vertical", '-V', action = 'store_true', help = "Display the dot graph in vertical direction")
-  parser.add_argument("--verbose", '-v', action = 'store_true', help = "Print more information")
-
-  args = parser.parse_args(command_line_options)
-  args.limit_packages = tuple(args.limit_packages)
-
-
-  # collect packages
-  packages = args.packages[:]
-  for package_file in args.package_files:
-    for line in open(package_file):
-      splits = line.rstrip().split()
-      packages.extend([p for p in splits if p not in packages and p.startswith(args.limit_packages)])
-
-  # generate dependencies
-  dependencies = {}
-  cpp_dependencies = {}
-  has_parents = set()
-
-  # function to add dependencies of packages recursively
-  def _add_recursive(p):
-    # check if package already parsed
-    if p not in dependencies:
-      if args.verbose:
-        print("Checking %s" % p)
-      deps = pkg_resources.require(p)
-      dependencies[p] = [d.key for d in deps[1:]]
-      if args.plot_external_dependencies and p.startswith(args.limit_packages):
-        # also load the C++ dependencies, stored in the .version package
-        import importlib
-        lib = importlib.import_module(p)
-        try:
-          cpp_dependencies[p] = [dep for dep in lib.version.externals.keys() if not dep.startswith(args.limit_packages)]
-        except AttributeError:
-          cpp_dependencies[p] = []
-
-      for d in dependencies[p]:
-        has_parents.add(d)
-        _add_recursive(d)
-
-  for package in packages:
-    _add_recursive(package)
-
-  # prune dependencies
-  pruned_dependencies = {}
-  for package in dependencies:
-    indirect_dependencies = set(d for i in [dependencies[dep] for dep in dependencies[package] if dep in dependencies] for d in i)
-    pruned_dependencies[package] = [dep for dep in dependencies[package] if dep not in indirect_dependencies]
-
-  # split all dependencies that are from bob (i.e., that belong to the --limit-packages) or not
-  bob = set(package for package in pruned_dependencies if package.startswith(args.limit_packages))
-  non_bob = set(dep for package in bob for dep in pruned_dependencies[package] if not dep.startswith(args.limit_packages))
-  final = set(package for package in bob if package not in has_parents)
-
-  # also prune the C++ dependencies
-  if args.plot_external_dependencies:
-    pruned_cpp_dependencies = {}
-    for package in cpp_dependencies:
-      indirect_dependencies = set(d for i in [cpp_dependencies[dep] for dep in dependencies[package] if dep in dependencies and dep in cpp_dependencies] for d in i)
-      pruned_cpp_dependencies[package] = [dep for dep in cpp_dependencies[package] if dep not in indirect_dependencies]
-
-    cpp = set(dep for package in bob for dep in pruned_cpp_dependencies[package])
-
-
-  # function to return a name for the package that can serve as a dot variable
-  def _n(p):
-    return p.replace(".", "_").replace("-","_").replace("+","X")
-
-  # write dependency graph
-  dot_file = args.dot_file if args.dot_file is not None else tempfile.mkstemp(suffix='.dot')[1]
-  with open(dot_file, 'w') as f:
-    # open plot
-    f.write("digraph Bob {\n")
-    if not args.vertical:
-      f.write("\trankdir=LR;\n")
-    # write bob packages in squares
-    for package in bob:
-      f.write('\t%s [label="%s",shape=box,group=%s,style=filled,color=%s];\n' % (_n(package), package, "_".join(package.split('.')[:2]), 'green' if package in final else 'lightblue'))
-
-    # write non-bob packages in squares
-    if args.plot_external_dependencies:
-      for package in non_bob:
-        f.write('\t%s [label="%s",shape=box,color=red];\n' % (_n(package), package))
-      for package in cpp:
-        f.write('\t%s [label="%s",color=red];\n' % (_n(package), package))
-
-    # write dependencies
-    for package in bob:
-      for dep in pruned_dependencies[package]:
-        if dep in bob:
-          f.write('\t%s -> %s [color=blue];\n' % (_n(package), _n(dep)))
-        elif args.plot_external_dependencies:
-          f.write('\t%s -> %s [color=red,style=dashed];\n' % (_n(package), _n(dep)))
-
-      if args.plot_external_dependencies:
-        for dep in pruned_cpp_dependencies[package]:
-          f.write('\t%s -> %s [color=red,style=dashed];\n' % (_n(package), _n(dep)))
-
-    # rank base tools at the same level
-    if args.rank_base_tools_same:
-      f.write('\t{rank=same; bob_extension bob_core bob_blitz}\n')
-
-    f.write("}\n")
-
-  if args.verbose and args.dot_file is not None:
-    print("Wrote dot file %s" % dot_file)
-
-  # call dot
-  call = ["dot",  '-y', '-o', args.output_file, '-Tpng:cairo:gd', dot_file]
-  if args.verbose:
-    call[1:1] = ['-v']
-    print("Calling dot: '%s'" % " ".join(call))
-  subprocess.call(call)
-
-  if args.verbose:
-    print("\nWrote file %s" % args.output_file)
-
-  # clean-up
-  if args.dot_file is None:
-    os.remove(dot_file)
diff --git a/conda/meta.yaml b/conda/meta.yaml
index a0e88cf4ed0cd93f3caa949b6ffa710b3d7a7db2..9f027362565646adad313aed557032a6797555ba 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -6,8 +6,6 @@ package:
   version: {{ environ.get('BOB_PACKAGE_VERSION', '0.0.1') }}
 
 build:
-  entry_points:
-    - bob_dependecy_graph.py = bob.extension.scripts:dependency_graph
   number: {{ environ.get('BOB_BUILD_NUMBER', 0) }}
   run_exports:
     - {{ pin_subpackage(name) }}
@@ -34,7 +32,6 @@ test:
   imports:
     - {{ name }}
   commands:
-    - bob_dependecy_graph.py --help
     - bob -h
     - bob --help
     - bob config -h
diff --git a/setup.py b/setup.py
index ac552cc47513eb2ad9b4ede68240a21c75601e50..44bc6c873eb21c18c8f3fac67040f7addc723891 100644
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,6 @@ setup(
     entry_points={
         'console_scripts': [
             'bob = bob.extension.scripts:main_cli',
-            'bob_dependecy_graph.py = bob.extension.scripts:dependency_graph',
         ],
         'bob.cli': [
             'config = bob.extension.scripts.config:config',
diff --git a/version.txt b/version.txt
index 868d7b27226d928488858c586826bc859393fe0b..b728e80e369730cd460b950282f0c54b8b720be3 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-3.2.1b0
\ No newline at end of file
+4.0.0b0