diff --git a/js/src/dropdown/dropdown.js b/js/src/dropdown/dropdown.js
index d3797b65c859caa1cb639215e4790f1d0c4d33a5..b8403568929b80c42b9856692e9fc8d9e6574d49 100644
--- a/js/src/dropdown/dropdown.js
+++ b/js/src/dropdown/dropdown.js
@@ -135,7 +135,6 @@ class Dropdown {
       return
     }
 
-    const parent = Dropdown.getParentFromElement(this._element)
     const isActive = this._menu.classList.contains(ClassName.SHOW)
 
     Dropdown.clearMenus()
@@ -144,9 +143,19 @@ class Dropdown {
       return
     }
 
+    this.show()
+  }
+
+  show() {
+    if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || this._menu.classList.contains(ClassName.SHOW)) {
+      return
+    }
+
+    const parent = Dropdown.getParentFromElement(this._element)
     const relatedTarget = {
       relatedTarget: this._element
     }
+
     const showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget)
 
     if (showEvent.defaultPrevented) {
@@ -200,27 +209,6 @@ class Dropdown {
     EventHandler.trigger(parent, Event.SHOWN, relatedTarget)
   }
 
-  show() {
-    if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || this._menu.classList.contains(ClassName.SHOW)) {
-      return
-    }
-
-    const parent = Dropdown.getParentFromElement(this._element)
-    const relatedTarget = {
-      relatedTarget: this._element
-    }
-
-    const showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget)
-
-    if (showEvent.defaultPrevented) {
-      return
-    }
-
-    Manipulator.toggleClass(this._menu, ClassName.SHOW)
-    Manipulator.toggleClass(parent, ClassName.SHOW)
-    EventHandler.trigger(parent, Event.SHOWN, relatedTarget)
-  }
-
   hide() {
     if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || !this._menu.classList.contains(ClassName.SHOW)) {
       return
@@ -237,6 +225,10 @@ class Dropdown {
       return
     }
 
+    if (this._popper) {
+      this._popper.destroy()
+    }
+
     Manipulator.toggleClass(this._menu, ClassName.SHOW)
     Manipulator.toggleClass(parent, ClassName.SHOW)
     EventHandler.trigger(parent, Event.HIDDEN, relatedTarget)
diff --git a/js/src/dropdown/dropdown.spec.js b/js/src/dropdown/dropdown.spec.js
index b025ed42327214dc861deea51b9a741f530a2b51..46374453c15cca5a162b68b91f7efea185572f05 100644
--- a/js/src/dropdown/dropdown.spec.js
+++ b/js/src/dropdown/dropdown.spec.js
@@ -174,7 +174,6 @@ describe('Dropdown', () => {
         expect(firstDropdownEl.classList.contains('show')).toEqual(true)
         spyOn(dropdown1._popper, 'destroy')
         dropdown2.toggle()
-        done()
       })
 
       secondDropdownEl.addEventListener('shown.bs.dropdown', () => {
@@ -679,6 +678,33 @@ describe('Dropdown', () => {
       dropdown.hide()
     })
 
+    it('should hide a dropdown and destroy popper', done => {
+      fixtureEl.innerHTML = [
+        '<div class="dropdown">',
+        '  <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>',
+        '  <div class="dropdown-menu">',
+        '    <a class="dropdown-item" href="#">Secondary link</a>',
+        '  </div>',
+        '</div>'
+      ].join('')
+
+      const btnDropdown = fixtureEl.querySelector('[data-toggle="dropdown"]')
+      const dropdownEl = fixtureEl.querySelector('.dropdown')
+      const dropdown = new Dropdown(btnDropdown)
+
+      dropdownEl.addEventListener('shown.bs.dropdown', () => {
+        spyOn(dropdown._popper, 'destroy')
+        dropdown.hide()
+      })
+
+      dropdownEl.addEventListener('hidden.bs.dropdown', () => {
+        expect(dropdown._popper.destroy).toHaveBeenCalled()
+        done()
+      })
+
+      dropdown.show()
+    })
+
     it('should not hide a dropdown if the element is disabled', done => {
       fixtureEl.innerHTML = [
         '<div class="dropdown">',