diff --git a/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs b/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs
new file mode 100644
index 00000000..4f0defe3
--- /dev/null
+++ b/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs
@@ -0,0 +1,110 @@
+// Copyright (c) Alexandre Mutel. All rights reserved.
+// This file is licensed under the BSD-Clause 2 license.
+// See the license.txt file in the project root for more information.
+
+using System.Collections.Generic;
+using Textamina.Markdig.Syntax.Inlines;
+
+namespace Textamina.Markdig.Syntax
+{
+ ///
+ /// Extensions for visiting or
+ ///
+ public static class MarkdownObjectExtensions
+ {
+ ///
+ /// Iterates over the descendant elements for the specified markdown element, including and .
+ ///
+ /// The markdown object.
+ /// An iteration over the descendant elements
+ public static IEnumerable Descendants(this MarkdownObject markdownObject)
+ {
+ var block = markdownObject as ContainerBlock;
+ if (block != null)
+ {
+ foreach (var subBlock in block)
+ {
+ yield return subBlock;
+
+ foreach (var sub in subBlock.Descendants())
+ {
+ yield return sub;
+ }
+ }
+ }
+ else
+ {
+ var inline = markdownObject as ContainerInline;
+ if (inline != null)
+ {
+ var child = inline.FirstChild;
+ while (child != null)
+ {
+ var next = child.NextSibling;
+ yield return child;
+
+ foreach (var sub in child.Descendants())
+ {
+ yield return sub;
+ }
+
+ child = next;
+ }
+ }
+ }
+ }
+
+ ///
+ /// Iterates over the descendant elements for the specified markdown element and filters by the type {T}, including and .
+ ///
+ /// Type to use for filtering the descendants
+ /// The markdown object.
+ ///
+ /// An iteration over the descendant elements
+ ///
+ public static IEnumerable Descendants(this MarkdownObject markdownObject) where T : MarkdownObject
+ {
+ var block = markdownObject as ContainerBlock;
+ if (block != null)
+ {
+ foreach (var subBlock in block)
+ {
+ var subBlockT = subBlock as T;
+ if (subBlockT != null)
+ {
+ yield return subBlockT;
+ }
+
+ foreach (var sub in subBlock.Descendants())
+ {
+ yield return sub;
+ }
+ }
+ }
+ else if (typeof(Inline).IsAssignableFrom(typeof(T)))
+ {
+ var inline = markdownObject as ContainerInline;
+ if (inline != null)
+ {
+ var child = inline.FirstChild;
+ while (child != null)
+ {
+ var next = child.NextSibling;
+ var childT = child as T;
+ if (childT != null)
+ {
+ yield return childT;
+ }
+
+ foreach (var sub in child.Descendants())
+ {
+ yield return sub;
+ }
+
+ child = next;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file