diff --git a/grc/gen_bladerf_blocks.py b/grc/gen_bladerf_blocks.py
index 09f8c43f24f617a6cb52a731e6429f993ed50ec3..e63b34a59560fcf7122e01039739095f19cad5ff 100644
--- a/grc/gen_bladerf_blocks.py
+++ b/grc/gen_bladerf_blocks.py
@@ -136,10 +136,6 @@ inputs:
   id: pmic_in
   optional: true
   
-- domain: message
-  id: fire
-  optional: true
-  
 % if sourk == 'source':
 outputs:
 
diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc
index 11d4065223d51ff94497727a32a6c0e821824422..adca35f8e5fe27d4a50b25fa789de3edfd96374a 100644
--- a/lib/bladerf/bladerf_common.cc
+++ b/lib/bladerf/bladerf_common.cc
@@ -130,6 +130,30 @@ size_t num_streams(bladerf_channel_layout layout)
 #endif
 }
 
+bladerf_trigger_signal get_signal(const std::string & name)
+{
+    const std::vector<std::pair<std::string, bladerf_trigger_signal>> signals
+    {
+        {"J71_4",BLADERF_TRIGGER_J71_4},
+        {"J51_1",BLADERF_TRIGGER_J51_1},
+        {"MINI_EXP_1",BLADERF_TRIGGER_MINI_EXP_1},
+        {"USER_0",BLADERF_TRIGGER_USER_0},
+        {"USER_1",BLADERF_TRIGGER_USER_1},
+        {"USER_2",BLADERF_TRIGGER_USER_2},
+        {"USER_3",BLADERF_TRIGGER_USER_3},
+        {"USER_4",BLADERF_TRIGGER_USER_4},
+        {"USER_5",BLADERF_TRIGGER_USER_5},
+        {"USER_6",BLADERF_TRIGGER_USER_6},
+        {"USER_7",BLADERF_TRIGGER_USER_7},
+    };
+    for(const auto & s: signals)
+    {
+        if(s.first == name)
+            return s.second;
+    }
+    return BLADERF_TRIGGER_INVALID;
+}
+
 /******************************************************************************
  * Public methods
  ******************************************************************************/
@@ -296,13 +320,16 @@ void bladerf_common::init(dict_t const &dict, bladerf_direction direction)
             BLADERF_THROW_STATUS(status, "Failed to set bias-tee");
           }
       }
-  }
-
-
-
-
-
+      auto ch_trigger = ch_label("trigger");
+      if(dict.count(ch_trigger) && _get(dict, ch_trigger) == "True")
+      {
+         auto role = _get(dict, ch_label("trigger_role")) == "master"
+                 ? BLADERF_TRIGGER_ROLE_MASTER : BLADERF_TRIGGER_ROLE_SLAVE;
+         auto signal = get_signal(_get(dict, ch_label("trigger_signal")));
+         setup_trigger(ch,signal,role);
+      }
 
+  }
 
   /* Show some info about the device we've opened */
   print_device_info();
@@ -592,13 +619,14 @@ std::string bladerf_common::get_pmic_value(const std::string &reg_name)
 
 }
 
-void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal, bool master)
+void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal,
+                                                     bladerf_trigger_role role)
 {
     auto status = bladerf_trigger_init(_dev.get(), ch, signal, &_triggers[ch]);
     if (status != 0) {
       BLADERF_THROW_STATUS(status, "bladerf_trigger_init failed");
     }
-    _triggers[ch].role  = master ? BLADERF_TRIGGER_ROLE_MASTER : BLADERF_TRIGGER_ROLE_SLAVE;
+    _triggers[ch].role  = role;
     // Arm the triggering functionality
     status = bladerf_trigger_arm(_dev.get(), &_triggers[ch], true, 0, 0);
     if (status != 0) {
@@ -606,6 +634,17 @@ void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal si
     }
 }
 
+void bladerf_common::disable_triggers()
+{
+    for(auto & trigger: _triggers)
+    {
+        auto status = bladerf_trigger_arm(_dev.get(), &trigger.second, false, 0, 0);
+        if (status != 0) {
+            BLADERF_THROW_STATUS(status, "bladerf_trigger_arm failed");
+        }
+    }
+}
+
 void bladerf_common::fire_trigger()
 {
     for(auto & trigger: _triggers)
diff --git a/lib/bladerf/bladerf_common.h b/lib/bladerf/bladerf_common.h
index ac6878abf71d536f0cb6accf55ad9b3e78e159b3..816730ffb06e2c02ed29e909c685d36a78f6a75e 100644
--- a/lib/bladerf/bladerf_common.h
+++ b/lib/bladerf/bladerf_common.h
@@ -185,7 +185,10 @@ protected:
       return value;
   }
 
-  void setup_trigger(bladerf_channel ch, bladerf_trigger_signal, bool master);
+  void setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal,
+                     bladerf_trigger_role role);
+  void disable_triggers();
+
   void fire_trigger();
 
 
diff --git a/lib/bladerf/bladerf_sink_c.cc b/lib/bladerf/bladerf_sink_c.cc
index 1dbf3b5e89341c790457f2a8cba4de9f2863d685..d7b5634d431888bf3e80e8c1f4f731dbb3df65c0 100644
--- a/lib/bladerf/bladerf_sink_c.cc
+++ b/lib/bladerf/bladerf_sink_c.cc
@@ -177,7 +177,7 @@ bool bladerf_sink_c::start()
       }
     }
   }
-
+  fire_trigger();
   /* Allocate memory for conversions in work() */
   size_t alignment = volk_get_alignment();
 
@@ -213,7 +213,7 @@ bool bladerf_sink_c::stop()
       }
     }
   }
-
+  disable_triggers();
   /* Deallocate conversion memory */
   volk_free(_16icbuf);
   volk_free(_32fcbuf);
diff --git a/lib/bladerf/bladerf_source_c.cc b/lib/bladerf/bladerf_source_c.cc
index c140f7f907c9f28ca39618b83dde1402fcb6be1b..2ae1a751f513f48d4c57fed72a076583e1e00e69 100644
--- a/lib/bladerf/bladerf_source_c.cc
+++ b/lib/bladerf/bladerf_source_c.cc
@@ -241,12 +241,13 @@ bool bladerf_source_c::start()
   _32fcbuf = reinterpret_cast<gr_complex *>(volk_malloc(_samples_per_buffer*sizeof(gr_complex), alignment));
 
   _running = true;
-
+  fire_trigger();
   return true;
 }
 
 bool bladerf_source_c::stop()
 {
+  disable_triggers();
   int status;
 
   BLADERF_DEBUG("stopping source");
diff --git a/lib/bladerf/common_sync_block.h b/lib/bladerf/common_sync_block.h
index 780393a8022ae61b9bd87b9c8da4305185e8646a..6b4b98033e521fdbc6bbc53c20248f8aeb4498c5 100644
--- a/lib/bladerf/common_sync_block.h
+++ b/lib/bladerf/common_sync_block.h
@@ -14,7 +14,6 @@ public:
    void setup_blade_messaging()
    {
         message_port_register_in(pmt::mp("pmic_in"));
-        message_port_register_in(pmt::mp("fire"));
         message_port_register_out(pmt::mp("pmic_out"));
 
         set_msg_handler(pmt::mp("pmic_in"),[=](const pmt::pmt_t & msg)
@@ -25,10 +24,6 @@ public:
             message_port_pub(pmt::mp("pmic_out"), pair);
 
         });
-        set_msg_handler(pmt::mp("fire"),[=](const pmt::pmt_t & msg)
-        {
-            fire_trigger();
-        });
    }
 };
 
diff --git a/lib/common_hier_block.h b/lib/common_hier_block.h
index fdf0d5ef410465429cce86ab718e425c0c04ba8d..53f0121d4a656d3c7b534dcd1b22167575fa8115 100644
--- a/lib/common_hier_block.h
+++ b/lib/common_hier_block.h
@@ -12,7 +12,6 @@ public:
    }
    void setup_message_ports()
    {
-        message_port_register_hier_in(pmt::mp("fire"));
         message_port_register_hier_in(pmt::mp("pmic_in"));
         message_port_register_hier_out(pmt::mp("pmic_out"));
 
@@ -20,7 +19,6 @@ public:
    template<typename T>
    void setup_device_connects(T device)
    {
-   	msg_connect(self(), pmt::mp("fire"), device, pmt::mp("fire"));
         msg_connect(self(), pmt::mp("pmic_in"), device, pmt::mp("pmic_in"));
         msg_connect(device,pmt::mp("pmic_out"), self(), pmt::mp("pmic_out"));
    }