diff --git a/bin/mem_test.cc b/bin/mem_test.cc
index 70c2965e1e07173563fa5b3f25a2675ce95363dd..2658594daea3baa1eb79092c9e56766e3ea72b58 100644
--- a/bin/mem_test.cc
+++ b/bin/mem_test.cc
@@ -31,34 +31,42 @@ int main(){
     p4(52.8751449585, -0.260020583868, -2.55171084404, 0.139569997787)
   };
 
+  vector<double> variations = {0.9, 1.0, 1.1};
+  vector<vector<double>> jet_variations;
+  for (unsigned int ijet=0; ijet<jets_p4.size(); ijet++) {
+    jet_variations.push_back(variations);
+  }
   //create a MET
   TLorentzVector lv_met;
   lv_met.SetPtEtaPhiM(92.1731872559,0., -1.08158898354, 0.);
-  for (int i=0; i<2; i++) {
-    auto res = mem.GetOutput(
-      leps_p4,
-      {-1},
-      jets_p4,
-      {
-        0.0429882630706,
-        0.990463197231,
-        0.899696052074,
-        0.979629218578,
-        0.437245458364,
-        0.996093869209,
-        0.212953850627
-      },
-      {  
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-      },
-      lv_met
-    );
-    std::cout << "mem=" << res.p << std::endl;
+  auto res = mem.GetOutput(
+    leps_p4,
+    {-1},
+    jets_p4,
+    //CSV
+    {
+      0.0429882630706,
+      0.990463197231,
+      0.899696052074,
+      0.979629218578,
+      0.437245458364,
+      0.996093869209,
+      0.212953850627
+    },
+    {  
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+    },
+    jet_variations,
+    lv_met
+  );
+  std::cout << "mem=" << res.p << std::endl;
+  for (unsigned int ivar=0; ivar < res.p_variated.size(); ivar++) {
+    std::cout << "mem var " << ivar << " = " << res.p_variated.at(ivar) << std::endl;
   }
 }
diff --git a/bin/mem_test_dl.cc b/bin/mem_test_dl.cc
index 5fe06e05f2123796bdb44c91be69bc1e8a8e0015..5535da7ad043709569b162c07be8d78004d65994 100644
--- a/bin/mem_test_dl.cc
+++ b/bin/mem_test_dl.cc
@@ -58,6 +58,12 @@ int main(){
         0.015261447988450527
     )
   };
+  
+  vector<double> variations = {0.9, 1.0, 1.1};
+  vector<vector<double>> jet_variations;
+  for (unsigned int ijet=0; ijet<jets_p4.size(); ijet++) {
+    jet_variations.push_back(variations);
+  }
 
   //create a MET
   TLorentzVector lv_met;
@@ -67,25 +73,28 @@ int main(){
       0.9771100282669067,
       0.0
   );
-  for (int i=0; i<2; i++) {
-    auto res = mem.GetOutput(
-      leps_p4,
-      {-1, 1},
-      jets_p4,
-      {
-        0.0429882630706,
-        0.990463197231,
-        0.899696052074,
-        0.979629218578,
-      },
-      {  
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-        MEMClassifier::JetType::RESOLVED,
-      },
-      lv_met
-    );
-    std::cout << "mem=" << res.p << std::endl;
+  auto res = mem.GetOutput(
+    leps_p4,
+    {-1, 1},
+    jets_p4,
+    {
+      0.0429882630706,
+      0.990463197231,
+      0.899696052074,
+      0.979629218578,
+    },
+    {  
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+      MEMClassifier::JetType::RESOLVED,
+    },
+    jet_variations,
+    lv_met
+  );
+  std::cout << "mem=" << res.p << std::endl;
+  for (unsigned int ivar=0; ivar < res.p_variated.size(); ivar++) {
+    std::cout << "mem var " << ivar << " = " << res.p_variated.at(ivar) << std::endl;
   }
+  
 }
diff --git a/data/transfer.root b/data/transfer.root
index da2059864c64a5460e6f71c88f671fe8d0716e9a..f119ce8b6f6c1482d1fb33039ff085fec5be2763 100644
Binary files a/data/transfer.root and b/data/transfer.root differ
diff --git a/interface/MEMClassifier.h b/interface/MEMClassifier.h
index edbeb613fe2e9ebf75568e8b889fb9f9bfdf7822..4b2c5076c6ad3d0cfce7adaab35be52a7339a53f 100644
--- a/interface/MEMClassifier.h
+++ b/interface/MEMClassifier.h
@@ -27,6 +27,8 @@ public:
     //Number of permutations per hypothesis
     double n_perm_sig;
     double n_perm_bkg;
+
+    vector<double> p_variated;
 };
 
 class MEMClassifier {
@@ -76,6 +78,7 @@ public:
         const std::vector<TLorentzVector>& selectedJetP4,
         const std::vector<double>& selectedJetCSV,
         const std::vector<JetType>& selectedJetType,
+        const std::vector<vector<double>>& selectedJetVariation,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
         TLorentzVector& metP4,
@@ -89,6 +92,7 @@ public:
         const std::vector<TLorentzVector>& selectedJetP4,
         const std::vector<double>& selectedJetCSV,
         const std::vector<JetType>& selectedJetType,
+        const std::vector<vector<double>>& selectedJetVariation,
         TLorentzVector& metP4
     );
 
@@ -99,6 +103,7 @@ public:
         const std::vector<TLorentzVector>& selectedJetP4,
         const std::vector<double>& selectedJetCSV,
         const std::vector<JetType>& selectedJetType,
+        const std::vector<vector<double>>& selectedJetVariation,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
         TLorentzVector& metP4,
@@ -112,6 +117,7 @@ public:
         const std::vector<TLorentzVector>& selectedJetP4,
         const std::vector<double>& selectedJetCSV,
         const std::vector<JetType>& selectedJetType,
+        const std::vector<vector<double>>& selectedJetVariation,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
         TLorentzVector& metP4,
@@ -125,6 +131,7 @@ public:
         const std::vector<TLorentzVector>& selectedJetP4,
         const std::vector<double>& selectedJetCSV,
         const std::vector<JetType>& selectedJetType,
+        const std::vector<vector<double>>& selectedJetVariation,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
         TLorentzVector& metP4,
diff --git a/src/MEMClassifier.cc b/src/MEMClassifier.cc
index d06629c5797db161f0d63afcc45579b9213036b2..06ef796a03ddfdcdff15ec2619d566cda73ccfc3 100644
--- a/src/MEMClassifier.cc
+++ b/src/MEMClassifier.cc
@@ -9,6 +9,7 @@ void MEMClassifier::setup_mem(
     const std::vector<TLorentzVector>& selectedJetP4,
     const std::vector<double>& selectedJetCSV,
     const std::vector<JetType>& selectedJetType,
+    const std::vector<vector<double>>& selectedJetVariation,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
     TLorentzVector& metP4,
@@ -34,6 +35,7 @@ void MEMClassifier::setup_mem(
                        selectedJetP4,
                        selectedJetCSV,
                        selectedJetType,
+                       selectedJetVariation,
                        looseSelectedJetP4,
                        looseSelectedJetCSV,
                        metP4,
@@ -47,6 +49,7 @@ void MEMClassifier::setup_mem(
                                selectedJetP4,
                                selectedJetCSV,
                                selectedJetType,
+                               selectedJetVariation,
                                looseSelectedJetP4,
                                looseSelectedJetCSV,
                                metP4,
@@ -72,6 +75,7 @@ void MEMClassifier::setup_mem_impl(
     const std::vector<TLorentzVector>& selectedJetP4,
     const std::vector<double>& selectedJetCSV,
     const std::vector<JetType>& selectedJetType,
+    const std::vector<vector<double>>& selectedJetVariation,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
     TLorentzVector& metP4,
@@ -115,6 +119,12 @@ void MEMClassifier::setup_mem_impl(
                                selectedJetCSV.at(ij),
                                false
                            );
+        if (selectedJetVariation.size() > 0) {
+            for (unsigned int ivar=0; ivar < selectedJetVariation.at(ij).size(); ivar++) {
+                jet->p4_variations.push_back(selectedJetVariation.at(ij).at(ivar));
+            }
+        }
+
         if (is_btagged) {
             tagged.push_back(jet);
         } else {
@@ -146,6 +156,7 @@ void MEMClassifier::setup_mem_sl_2w2h2t_sj(
     const std::vector<TLorentzVector>& selectedJetP4,
     const std::vector<double>& selectedJetCSV,
     const std::vector<JetType>& selectedJetType,
+    const std::vector<vector<double>>& selectedJetVariation,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
     TLorentzVector& metP4,
@@ -247,6 +258,7 @@ MEMResult MEMClassifier::GetOutput(
     const std::vector<TLorentzVector>& selectedJetP4,
     const std::vector<double>& selectedJetCSV,
     const std::vector<JetType>& selectedJetType,
+    const std::vector<vector<double>>& selectedJetVariation,
     TLorentzVector& metP4
 ) {
     const int nleps = selectedLeptonP4.size();
@@ -280,6 +292,7 @@ MEMResult MEMClassifier::GetOutput(
         selectedJetP4,
         selectedJetCSV,
         selectedJetType,
+        selectedJetVariation,
         {},
         {},
         metP4
@@ -294,6 +307,7 @@ MEMResult MEMClassifier::GetOutput(
     const std::vector<TLorentzVector>& selectedJetP4,
     const std::vector<double>& selectedJetCSV,
     const std::vector<JetType>& selectedJetType,
+    const std::vector<vector<double>>& selectedJetVariation,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
     TLorentzVector& metP4,
@@ -317,6 +331,7 @@ MEMResult MEMClassifier::GetOutput(
         selectedJetP4,
         selectedJetCSV,
         selectedJetType,
+        selectedJetVariation,
         looseSelectedJetP4,
         looseSelectedJetCSV,
         metP4, objs, res
@@ -362,6 +377,13 @@ MEMResult MEMClassifier::GetOutput(
     res.n_perm_sig = res_sig.num_perm;
     res.n_perm_bkg = res_bkg.num_perm;
     res.p = res.p_sig / (res.p_sig + mem_weight*res.p_bkg);
+    
+    if (selectedJetVariation.size() > 0) {
+        const auto num_var = selectedJetVariation.at(1).size();
+        for (unsigned int nvar = 0; nvar < num_var; nvar++) {
+            res.p_variated.push_back(res_sig.variated.at(nvar) / (res_sig.variated.at(nvar) + mem_weight * res_bkg.variated.at(nvar)));
+        }
+    }
     return res;
 }
 
@@ -446,6 +468,7 @@ MEMClassifier::MEMClassifier(int verbosity, const char* _btag_prefix) : btag_pre
     cfg.perm_pruning.push_back(MEM::Permutations::BTagged);
     cfg.perm_pruning.push_back(MEM::Permutations::QUntagged);
     cfg.perm_pruning.push_back(MEM::Permutations::QQbarBBbarSymmetry);
+    cfg.num_jet_variations = 100;
 
     integrand = new MEM::Integrand(
         verbosity,