diff --git a/core/misc/states.js b/core/misc/states.js
index 2b4f9a4..439a2d3 100644
--- a/core/misc/states.js
+++ b/core/misc/states.js
@@ -366,12 +366,8 @@
     if (this.state in states.Trigger.states) {
       this.element = $(this.selector);
 
-      // Only call the trigger initializer when it wasn't yet attached to this
-      // element. Otherwise we'd end up with duplicate events.
-      if (!this.element.data('trigger:' + this.state)) {
-        this.initialize();
-      }
+      this.initialize();
+    }
-    }
   };
 
   states.Trigger.prototype = {
@@ -393,9 +389,6 @@
           }
         }
       }
-
-      // Mark this trigger as initialized for this element.
-      this.element.data('trigger:' + this.state, true);
     },
 
     /**
@@ -408,7 +401,9 @@
       var oldValue = valueFn.call(this.element);
 
       // Attach the event callback.
-      this.element.on(event, $.proxy(function (e) {
+      // Detach possibly earlier attached event callback using event namespacing
+      // and attach a new event callback.
+      this.element.unbind(event + '.statesDefaultTrigger').bind(event + '.statesDefaultTrigger', $.proxy(function (e) {
         var value = valueFn.call(this.element, e);
         // Only trigger the event if the value has actually changed.
         if (oldValue !== value) {
