diff --git a/doc/source/blender_run.py b/doc/source/blender_run.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5ffd7df40d01e81d04839ba0a668fd5d291832f
--- /dev/null
+++ b/doc/source/blender_run.py
@@ -0,0 +1,15 @@
+"""
+Run several blender instances if blender is installed
+"""
+import pkg_resources
+import glob
+import os
+
+blendercomand = 'blender'
+worldfile = pkg_resources.resource_filename(
+    'navipy', 'resources/forest_world.blend')
+for demofile in glob.iglob('**/blenddemo*.py', recursive=True):
+    command = '{} {} --background --python {}'.format(blendercomand,
+                                                      worldfile,
+                                                      demofile)
+    os.system(command)
diff --git a/doc/source/example/rendering/demo_render.py b/doc/source/example/rendering/blenddemo_beesampling.py
similarity index 93%
rename from doc/source/example/rendering/demo_render.py
rename to doc/source/example/rendering/blenddemo_beesampling.py
index 18124c94a523b02c9d4290b1714000d631163039..1d429e164610f229a6794464f352507dfe6c13c8 100644
--- a/doc/source/example/rendering/demo_render.py
+++ b/doc/source/example/rendering/blenddemo_beesampling.py
@@ -34,8 +34,8 @@ from navipy.rendering.bee_sampling import BeeSampling  # noqa: E402
 bee_samp = BeeSampling()
 # Create a list of point from which we want to render images
 # Careful three d meshing grow quickly.
-x = np.linspace(-25, 25, 201)
-y = np.linspace(-25, 25, 201)
+x = np.linspace(-5, 5, 3)
+y = np.linspace(-5, 5, 3)
 z = np.linspace(1.8, 1.8, 1)
 alpha_1 = np.array([0]) + np.pi / 2
 alpha_2 = np.array([0])
@@ -48,7 +48,7 @@ bee_samp.create_sampling_grid(
 world_dim = 50 * np.sqrt(2)
 bee_samp.world_dim = world_dim
 # set the number of sample for rendring in blender
-bee_samp.set_cycle_samples(samples=50)
+bee_samp.cycle_samples = 5
 # Rendering in a tmp folder
 with tempfile.TemporaryDirectory() as folder:
     bee_samp.render(folder + '/database.db')
diff --git a/doc/source/example/rendering/blenddemo_cyberbee.py b/doc/source/example/rendering/blenddemo_cyberbee.py
new file mode 100644
index 0000000000000000000000000000000000000000..19ab95ec9be6265d4df21c75b61dc90417c24e41
--- /dev/null
+++ b/doc/source/example/rendering/blenddemo_cyberbee.py
@@ -0,0 +1,76 @@
+import os
+proci = 0
+nproc = 1
+
+
+def activate_virtualenv(name):
+    """Activate given virtualenv.
+    Virtualenv home folder is given by environment variable ``WORKON_HOME`` or
+    ``~/Envs`.
+    """
+    if 'WORKON_HOME' in os.environ:
+        home = os.environ['WORKON_HOME']
+    else:
+        home = os.path.expanduser(os.path.join('~', 'Envs'))
+    filepath = os.path.join(home, name, 'bin', 'activate_this.py')
+    with open(filepath, 'r') as f:
+        exec(f.read(), dict(__file__=filepath))
+
+
+activate_virtualenv('toolbox-navigation')
+#
+# Import module in virtualenv
+#
+import numpy as np  # noqa: E402
+from matplotlib.colors import hsv_to_rgb, rgb_to_hsv  # noqa: E402
+import matplotlib.pyplot as plt  # noqa: E402
+from navipy.rendering.cyber_bee import Cyberbee  # noqa: E402
+
+# with tempfile.TemporaryDirectory() as folder:
+cyberbee = Cyberbee()
+cyberbee.cycle_samples = 50
+posorient = [0, 0, 1.8, np.pi / 2, 0, 0]
+scene = cyberbee.scene(posorient)
+
+
+f, axarr = plt.subplots(2, 1,  sharex=True)
+
+to_plot_im = scene[:, :, :3]
+to_plot_im -= to_plot_im.min()
+to_plot_im /= to_plot_im.max()
+to_plot_im = rgb_to_hsv(to_plot_im)
+to_plot_im[..., 2] = to_plot_im[..., 2] * 2
+to_plot_im = hsv_to_rgb(to_plot_im)
+
+to_plot_im = to_plot_im * 255
+to_plot_im = to_plot_im.astype(np.uint8)
+
+to_plot_dist = 1 / scene[:, :, 3]
+
+ax = axarr[0]
+ax.imshow(to_plot_im)
+ax.invert_yaxis()
+ax.set_aspect('equal')
+ax.get_xaxis().set_ticks([])
+ax.get_yaxis().set_ticks([])
+ax.set_ylabel('Elevation')
+ax.set_title('Panoramic view')
+
+ax = axarr[1]
+im = ax.imshow(to_plot_dist)
+ax.invert_yaxis()
+ax.set_aspect('equal')
+ax.get_xaxis().set_ticks([])
+ax.get_yaxis().set_ticks([])
+ax.set_xlabel('Azimuth')
+ax.set_ylabel('Elevation')
+ax.set_title('Nearness map')
+
+f.subplots_adjust(right=0.8)
+cbar_ax = f.add_axes([0.85, 0.15, 0.03, 0.3])
+cb = f.colorbar(im, cax=cbar_ax)
+cb.set_label('Nearness')
+cb.set_label('Nearness')
+
+f.show()
+f.savefig('CyberBeeView.svg')
diff --git a/doc/source/rendering.rst b/doc/source/rendering.rst
index f268dfe383bcdfdca25d7a3a4ab5a0be8ad29fdd..2d70aad8e62d546c5591648107a3e9345881eb21 100644
--- a/doc/source/rendering.rst
+++ b/doc/source/rendering.rst
@@ -1,53 +1,3 @@
 Rendering
 =========
-
-Need to introduce blender here
-
-
-Building your environment
--------------------------
-
-
-How to generate a database using blender
-----------------------------------------
-Regular sampling
-~~~~~~~~~~~~~~~~
-Blender comes with its own python installation. Thus, we need to tell blender to use our virtualenv where the navigation toolbox is installed. To do we need to import the os module
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 5-6
-
-then activate the environment:
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 12-26
-
-Now, blender can import all modules used by the navigation toolbox.
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 30-31
-
-With the toolbox at disposition we just need to configure the BeeSampling to render images on a regular 3D grid.
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 34
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 37-44
-
-If we want to use the distance to objects, we need to tell the BeeSampling what is the maximum distance to objects in the environment. Otherwise the distance can go until infinity, and since the image are compressed in the database, all distance to object will be equal to zero:
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 48-49
-
-Finally we can generate the database.
-
-.. literalinclude:: example/rendering/demo_render.py
-   :lines: 53-54
-
-How to test the script:
-~~~~~~~~~~~~~~~~~~~~~~~
->>> blender test.blend --background --python demo_test.py
-
-
-Cyberbee
---------
+.. automodule:: navipy.rendering
diff --git a/navipy/rendering/__init__.py b/navipy/rendering/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1c1a00c1e83e2dc84c7151f0217a895a0919b085 100644
--- a/navipy/rendering/__init__.py
+++ b/navipy/rendering/__init__.py
@@ -0,0 +1,53 @@
+"""
+Navipy & blender
+----------------
+What is blender?
+~~~~~~~~~~~~~~~~
+Explain blender
+
+Create a world
+~~~~~~~~~~~~~~
+Explain How to create env for navipy
+
+Using navipy in blender
+~~~~~~~~~~~~~~~~~~~~~~~
+Blender comes with its own python installation. Thus, we need to \
+tell blender to use our virtualenv where the navigation toolbox \
+is installed. To do we need to import the os module
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+    :lines: 5 - 6
+
+then activate the environment:
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+    :lines: 12 - 26
+
+Now, blender can import all modules used by the navigation toolbox.
+
+How to run python code with blender:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+>>> blender path/to/world.blend --background --python path/to/code.py
+
+How to generate a database using blender
+----------------------------------------
+.. automodule:: navipy.rendering.bee_sampling
+
+Custom sampling
+---------------
+.. automodule:: navipy.rendering.cyber_bee
+
+Rendering classes
+-----------------
+
+BeeSampling
+~~~~~~~~~~~
+.. autoclass:: navipy.rendering.bee_sampling.BeeSampling
+    :members:
+
+Cyberbee
+
+~~~~~~~~
+.. autoclass:: navipy.rendering.cyber_bee.Cyberbee
+    :members:
+"""
diff --git a/navipy/rendering/bee_sampling.py b/navipy/rendering/bee_sampling.py
index 817ae03ec11cb75bbb7208238190feb7800023d7..e74b13bbc0580ec89a6739a574bcbd16086be497 100644
--- a/navipy/rendering/bee_sampling.py
+++ b/navipy/rendering/bee_sampling.py
@@ -1,13 +1,41 @@
 """
-The beesampling class
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+   :lines: 30-31
+
+With the toolbox at disposition we just need to configure the \
+BeeSampling to render images on a regular 3D grid.
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+   :lines: 34
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+   :lines: 37-44
+
+If we want to use the distance to objects, we need to tell the \
+BeeSampling what is the maximum distance to objects in the environment.\
+ Otherwise the distance can go until infinity, and since the image are \
+compressed in the database, all distance to object will be equal to \
+zero:
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+   :lines: 48-49
+
+Finally we can generate the database.
+
+.. literalinclude:: example/rendering/blenddemo_beesampling.py
+   :lines: 53-54
 
-.. tothinkof: conditional bpy import to build doc from comments
 """
-import bpy
+import warnings
+try:
+    import bpy
+except ModuleNotFoundError:
+    warnings.warn(
+        'bpy could not be imported, ' +
+        'please run your python program in blender')
 import os
 import numpy as np
 import pandas as pd
-import warnings
 from navipy.rendering.cyber_bee import Cyberbee
 from navipy.database import DataBaseSave
 
@@ -20,6 +48,7 @@ images taken on a rectangular regular grid. For the database,
 the BeeSampling rely on DataBase
     It worth noting that the generated database can take a large
 harddrive space, as each image is composed of 4 channels of 180x360 pixels.
+
     """
 
     def __init__(self):
@@ -96,6 +125,7 @@ harddrive space, as each image is composed of 4 channels of 180x360 pixels.
         .. todo: create @property.setter
                         def grid_posorients(self,posorients)
                         (need a type check, and col check, and copy of df)
+
         """
         return self.__grid_posorients.copy()
 
@@ -106,6 +136,7 @@ harddrive space, as each image is composed of 4 channels of 180x360 pixels.
 
         .. todo: use @property.setter
                      def blacklist_indeces(self,indeces)
+
         """
         if not isinstance(indeces, list):
             raise TypeError('indeces must be a list')
diff --git a/navipy/rendering/cyber_bee.py b/navipy/rendering/cyber_bee.py
index 530a11b38698a1608a72c506c7e711aeed2ca974..303b826150df571a7571f2a1a510269e423fe8cf 100644
--- a/navipy/rendering/cyber_bee.py
+++ b/navipy/rendering/cyber_bee.py
@@ -1,15 +1,14 @@
 """
-    How to test the script:
-    -----------------------
-    >>> blender test.blend --background --python Cyberbee.py
+ BLA
 
-    :Author: Olivier Bertrand (olivier.bertrand@uni-bielefeld.de)
-    :Parent module: Scene_rendering
-
-    ..tothinkof for the doc bpy will raise an issue.
-                conditional import of bpy
 """
-import bpy
+import warnings
+try:
+    import bpy
+except ModuleNotFoundError:
+    warnings.warn(
+        'bpy could not be imported, ' +
+        'please run your python program in blender')
 import numpy as np
 import tempfile
 import os
@@ -389,20 +388,3 @@ class Cyberbee():
         image = self.image
         image[:, :, 3] = self.distance
         return image
-
-
-if __name__ == "__main__":
-    # Initiate the Cyberbee
-    mybee = Cyberbee()
-    frames_per_revolution = 5.0
-    step_size = 2 * np.pi / frames_per_revolution
-    posorients = np.zeros((frames_per_revolution, 6))
-    posorients[:, 0] = np.sin(np.arange(frames_per_revolution) * step_size) * 5
-    posorients[:, 1] = np.cos(np.arange(frames_per_revolution) * step_size) * 5
-    for frame_i, posorient in enumerate(posorients):
-        mybee.update(posorient)
-        # Test image
-        image = mybee.image
-        # Test distance
-        distance = mybee.distance
-    print('Cyberbee OK')
diff --git a/navipy/resources/forest_world.blend b/navipy/resources/forest_world.blend
new file mode 100644
index 0000000000000000000000000000000000000000..f91b08161a81a8a3312113f73b12c094587bf631
Binary files /dev/null and b/navipy/resources/forest_world.blend differ
diff --git a/setup.py b/setup.py
index 13f2fa40aa8105796bfed0d0a4d093d428f0e791..fc4bc61089dd458995bb0b1eb9a2aeb9807ebc47 100644
--- a/setup.py
+++ b/setup.py
@@ -31,7 +31,8 @@ setup_dict = {'name': 'navipy',
               'requires': ['numpy', 'pandas', 'matplotlib', 'scipy'],
               'install_requires': ["numpy", 'pandas', 'matplotlib', 'scipy',
                                    'sphinx_rtd_theme'],
-              'package_data': {'navipy': ['resources/database.db']},
+              'package_data': {'navipy': ['resources/database.db',
+                                          'resources/forest_world.blend']},
               'include_package_data': True, }
 
 setup(**setup_dict)