diff --git a/grc/gen_bladerf_blocks.py b/grc/gen_bladerf_blocks.py
index 749cb7b0d45af6aa1b1f71a2f245acd5e7f51728..e9f59572087145a7945b43243eb170741160bc38 100644
--- a/grc/gen_bladerf_blocks.py
+++ b/grc/gen_bladerf_blocks.py
@@ -149,6 +149,14 @@ parameters:
   option_labels: ['Disabled', 'Bypassed'] 
   hide: part
   
+- id: dc_calibration
+  label: 'DC calibration'
+  category: x40/x115
+  dtype: enum
+  default: 'LPF_TUNING'
+  options: ['LPF_TUNING', 'TX_LPF', 'RX_LPF', 'RXVGA2']
+  hide: part
+  
 
   
 
@@ -207,6 +215,7 @@ templates:
              + ",tamer=" + '${'$'}{tamer}'
              + ",sampling=" + '${'$'}{sampling}'
              + ",lpf_mode="+'${'$'}{lpf_mode}'
+             + ",dc_calibration="+'${'$'}{dc_calibration}'
              + ",trigger0="+'${'$'}{trigger0}'
              + ",trigger_role0="+'${'$'}{trigger_role0}'
              + ",trigger_signal0="+'${'$'}{trigger_signal0}'
diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc
index 37c4c9653d25dd7a3b91773716ec20951b5f076f..cfad5ee1fbe1043efba5f5297ccd5de911dbc8ac 100644
--- a/lib/bladerf/bladerf_common.cc
+++ b/lib/bladerf/bladerf_common.cc
@@ -130,9 +130,21 @@ size_t num_streams(bladerf_channel_layout layout)
 #endif
 }
 
+template<typename T>
+T get_enum_value(const std::vector<std::pair<std::string, T>> & values,
+                 const std::string& name)
+{
+    for(const auto & v: values)
+    {
+        if(v.first == name)
+            return v.second;
+    }
+    return T(-1);
+}
+
 bladerf_trigger_signal get_signal(const std::string & name)
 {
-    const std::vector<std::pair<std::string, bladerf_trigger_signal>> signals
+    return get_enum_value<bladerf_trigger_signal>(
     {
         {"J71_4",BLADERF_TRIGGER_J71_4},
         {"J51_1",BLADERF_TRIGGER_J51_1},
@@ -145,15 +157,21 @@ bladerf_trigger_signal get_signal(const std::string & name)
         {"USER_5",BLADERF_TRIGGER_USER_5},
         {"USER_6",BLADERF_TRIGGER_USER_6},
         {"USER_7",BLADERF_TRIGGER_USER_7},
-    };
-    for(const auto & s: signals)
+    }, name);
+}
+
+bladerf_cal_module get_calibrate_module(const std::string & module)
+{
+    return get_enum_value<bladerf_cal_module>(
     {
-        if(s.first == name)
-            return s.second;
-    }
-    return BLADERF_TRIGGER_INVALID;
+        {"LPF_TUNING",BLADERF_DC_CAL_LPF_TUNING},
+        {"TX_LPF",BLADERF_DC_CAL_TX_LPF},
+        {"RX_LP",BLADERF_DC_CAL_RX_LPF},
+        {"RXVGA2",BLADERF_DC_CAL_RXVGA2},
+    },module);
 }
 
+
 /******************************************************************************
  * Public methods
  ******************************************************************************/
@@ -428,6 +446,15 @@ void bladerf_common::init_bladerf1(const dict_t &dict, bladerf_direction directi
         }
     }
 
+    if (dict.count("dc_calibration")) {
+        bladerf_cal_module module = get_calibrate_module( _get(dict, "dc_calibration"));
+        auto status = bladerf_calibrate_dc(_dev.get(), module);
+        if(status != 0)
+        {
+            BLADERF_THROW_STATUS(status, "Failed to calibrate");
+        }
+    }
+
     bladerf_channel ch = (direction == BLADERF_RX) ? BLADERF_CHANNEL_RX(0)
                                                    : BLADERF_CHANNEL_TX(0);
     if (dict.count("lpf_mode")) {