diff --git a/_includes/callout-danger-async-methods.md b/_includes/callout-danger-async-methods.md
index 89d2e2cabb..ca35e0b775 100644
--- a/_includes/callout-danger-async-methods.md
+++ b/_includes/callout-danger-async-methods.md
@@ -1,7 +1,8 @@
-{% callout danger %}
+{% capture callout %}
#### Asynchronous methods and transitions
All API methods are **asynchronous** and start a **transition**. They return to the caller as soon as the transition is started but **before it ends**. In addition, a method call on a **transitioning component will be ignored**.
[See our JavaScript documentation for more information.]({{ site.baseurl }}/docs/{{ site.docs_version }}/getting-started/javascript/)
-{% endcallout %}
+{% endcapture %}
+{% include callout.html content=callout type="danger" %}
diff --git a/_includes/callout-info-mediaqueries-breakpoints.md b/_includes/callout-info-mediaqueries-breakpoints.md
index ddf2b37450..d3988ce1a3 100644
--- a/_includes/callout-info-mediaqueries-breakpoints.md
+++ b/_includes/callout-info-mediaqueries-breakpoints.md
@@ -1,3 +1,4 @@
-{% callout info %}
+{% capture callout %}
Note that since browsers do not currently support [range context queries](https://www.w3.org/TR/mediaqueries-4/#range-context), we work around the limitations of [`min-` and `max-` prefixes](https://www.w3.org/TR/mediaqueries-4/#mq-min-max) and viewports with fractional widths (which can occur under certain conditions on high-dpi devices, for instance) by using values with higher precision for these comparisons.
-{% endcallout %}
\ No newline at end of file
+{% endcapture %}
+{% include callout.html content=callout type="info" %}
diff --git a/_includes/callout-warning-color-assistive-technologies.md b/_includes/callout-warning-color-assistive-technologies.md
index adbc708f62..98214eb58d 100644
--- a/_includes/callout-warning-color-assistive-technologies.md
+++ b/_includes/callout-warning-color-assistive-technologies.md
@@ -1,5 +1,6 @@
-{% callout warning %}
+{% capture callout %}
##### Conveying meaning to assistive technologies
Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the `.sr-only` class.
-{% endcallout %}
+{% endcapture %}
+{% include callout.html content=callout type="warning" %}
diff --git a/_includes/callout.html b/_includes/callout.html
new file mode 100644
index 0000000000..8ee72de998
--- /dev/null
+++ b/_includes/callout.html
@@ -0,0 +1,5 @@
+{% comment %} allowed: info danger warning {% endcomment %}
+{% assign css_class = include.type | default: "info" %}
+
+ {{ include.content | markdownify }}
+
diff --git a/_plugins/callout.rb b/_plugins/callout.rb
deleted file mode 100644
index 58453ecb43..0000000000
--- a/_plugins/callout.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# Source: https://stackoverflow.com/questions/19169849/how-to-get-markdown-processed-content-in-jekyll-tag-plugin
-
-module Jekyll
- module Tags
- class CalloutTag < Liquid::Block
-
- def initialize(tag_name, type, tokens)
- super
- type.strip!
- if %w(info danger warning).include?(type)
- @type = type
- else
- puts "#{type} callout not supported. Defaulting to info"
- @type = "info"
- end
- end
-
- def render(context)
- site = context.registers[:site]
- converter = site.find_converter_instance(::Jekyll::Converters::Markdown)
- output = converter.convert(super(context))
- "