diff --git a/Command/EntitySchemaCommand.php b/Command/EntitySchemaCommand.php
index 2e86adf347863fd6749dd4753a9c6b01de03c238..e290e0a5e9e1c903242cdd30c645bae9314231ae 100644
--- a/Command/EntitySchemaCommand.php
+++ b/Command/EntitySchemaCommand.php
@@ -8,6 +8,7 @@ namespace Irstea\PlantUmlBundle\Command;
 
 use Doctrine\ORM\EntityManagerInterface;
 use Doctrine\ORM\Mapping\ClassMetadata;
+use Irstea\PlantUmlBundle\Model\Filter\Whitelist;
 use Irstea\PlantUmlBundle\Model\Namespace_;
 use Irstea\PlantUmlBundle\Model\Orm\EntityVisitor;
 use Irstea\PlantUmlBundle\Writer\OutputWriter;
@@ -46,11 +47,13 @@ class EntitySchemaCommand extends ContainerAwareCommand
 
         $allMetadata = $factory->getAllMetadata();
 
+        $classes = array_map(
+            function(ClassMetadata $metadata) { return $metadata->getName(); },
+            $allMetadata
+        );
+
         $visitor = new EntityVisitor($allMetadata);
-        foreach($allMetadata as $metadata) {
-            /* @var $metadata ClassMetadata */
-            $visitor->visitClass($metadata->getName());
-        }
+        array_walk($classes, [$visitor, 'visitClass']);
 
         $writer = new OutputWriter($output);
         $writer->write("@startuml\n");
diff --git a/Model/ClassFilterInterface.php b/Model/ClassFilterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c8ac88b073d525f4739bf60f608cf3766966cb4
--- /dev/null
+++ b/Model/ClassFilterInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+
+namespace Irstea\PlantUmlBundle\Model;
+
+/**
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+interface ClassFilterInterface
+{
+    /**
+     * @param type $className
+     * @return bool
+     */
+    public function accept($className);
+}
diff --git a/Model/ClassVisitor.php b/Model/ClassVisitor.php
index f3017f588de2b748adad95f2b4bc3bbdc4704d0c..ae2e925a4d15e0913fbf27336b3105e834c1cdc0 100644
--- a/Model/ClassVisitor.php
+++ b/Model/ClassVisitor.php
@@ -28,9 +28,25 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface
      */
     protected $rootNamespace;
 
-    public function __construct()
+    /**
+     * @var ClassFilterInterface
+     */
+    protected $filter;
+
+    public function __construct(ClassFilterInterface $filter = null)
     {
         $this->rootNamespace = new RootNamespace();
+        $this->filter = $filter ?: Filter\AcceptAllFilter::instance();
+    }
+
+    /**
+     * @param \Irstea\PlantUmlBundle\Model\ClassFilterInterface $filter
+     * @return self
+     */
+    public function setClassFilter(ClassFilterInterface $filter)
+    {
+        $this->filter = $filter;
+        return $this;
     }
 
     public function visitClass($className)
@@ -39,6 +55,9 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface
         if (isset($this->nodes[$className])) {
             return $this->nodes[$className];
         }
+        if (!$this->filter->accept($className)) {
+            return $this->nodes[$className] = false;
+        }
 
         return $this->doVisitClass($className);
     }
@@ -104,7 +123,9 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface
     {
         foreach ($classNames as $className) {
             $target = $this->visitClass($className);
-            $namespace->addArrow(new $relationClass($source, $target));
+            if ($target) {
+                $namespace->addArrow(new $relationClass($source, $target));
+            }
         }
     }
 
diff --git a/Model/Filter/AcceptAllFilter.php b/Model/Filter/AcceptAllFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..287052de9556c791a80d93c087b0b0d0dedccd86
--- /dev/null
+++ b/Model/Filter/AcceptAllFilter.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+
+namespace Irstea\PlantUmlBundle\Model\Filter;
+
+use Irstea\PlantUmlBundle\Model\ClassFilterInterface;
+
+/**
+ * Description of AcceptAllFilter
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+class AcceptAllFilter implements ClassFilterInterface
+{
+    public function accept($className)
+    {
+        return true;
+    }
+
+    /**
+     * @var self
+     */
+    static private $instance;
+
+    /**
+     * @return self
+     */
+    static public function instance()
+    {
+        if (!static::$instance) {
+            static::$instance = new static();
+        }
+        return static::$instance;
+    }
+}
diff --git a/Model/Filter/Whitelist.php b/Model/Filter/Whitelist.php
new file mode 100644
index 0000000000000000000000000000000000000000..ecbd66381a5bb119778b987bd1c95a08aa6cdfca
--- /dev/null
+++ b/Model/Filter/Whitelist.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * © 2016 IRSTEA
+ * Guillaume Perréal <guillaume.perreal@irstea.fr>
+ * Tous droits réservés.
+ */
+
+namespace Irstea\PlantUmlBundle\Model\Filter;
+
+use Irstea\PlantUmlBundle\Model\ClassFilterInterface;
+
+/**
+ * Description of Whiltelist
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+class Whitelist implements ClassFilterInterface
+{
+    /**
+     * @var string[]
+     */
+    private $accepted;
+
+    public function __construct(array $classNames)
+    {
+        $this->accepted = array_fill_keys($classNames, true);
+    }
+
+    public function accept($className)
+    {
+        return isset($this->accepted[$className]);
+    }
+}
diff --git a/Model/Orm/EntityVisitor.php b/Model/Orm/EntityVisitor.php
index 9830995a04d1067ae39bd56550a4bc53dfa496e1..48342e1104d742281cd6348f137601c56879f9df 100644
--- a/Model/Orm/EntityVisitor.php
+++ b/Model/Orm/EntityVisitor.php
@@ -23,9 +23,9 @@ class EntityVisitor extends ClassVisitor
      */
     protected $metadata = [];
 
-    public function __construct(array $metadata)
+    public function __construct(array $metadata, \Irstea\PlantUmlBundle\Model\ClassFilterInterface $filter = null)
     {
-        parent::__construct();
+        parent::__construct($filter);
 
         foreach($metadata as $md) {
             /* @var $md ClassMetadata */