diff --git a/nnpdfcpp/data/theory.db b/nnpdfcpp/data/theory.db
index ef273c399a6f8e70f058b0fc7bc1f6a2e77eb663..818407928f2edeb4dd48665456eebe6b4a91fd34 100644
Binary files a/nnpdfcpp/data/theory.db and b/nnpdfcpp/data/theory.db differ
diff --git a/nnpdfcpp/src/common/inc/common.h b/nnpdfcpp/src/common/inc/common.h
index a52a42a67e5d85695b641f4318a2b0e08f2b2f31..dfc252a0e325d047b849e47cc8a11d9d341f8398 100644
--- a/nnpdfcpp/src/common/inc/common.h
+++ b/nnpdfcpp/src/common/inc/common.h
@@ -45,7 +45,7 @@ enum basisType  {BASIS_UNDEF, BASIS_NN23, BASIS_NN23QED,
                  BASIS_EVOL, BASIS_EVOLQED,BASIS_EVOLS, BASIS_EVOLSQED,
                  BASIS_NN30, BASIS_NN30QED, BASIS_FLVR, BASIS_FLVRQED,
                  BASIS_NN30IC, BASIS_EVOLIC, BASIS_NN31IC, BASIS_LUX, BASIS_NN31ICQED,
-                 BASIS_NSR, BASIS_DISEVOL};
+                 BASIS_NSR, BASIS_DISEVOL, BASIS_PDF4LHC20};
 
 enum covType {COV_EXP = false, COV_T0 = true};
 enum filterType {DATA_UNFILTERED = false,DATA_FILTERED = true};
diff --git a/nnpdfcpp/src/common/src/nnpdfsettings.cc b/nnpdfcpp/src/common/src/nnpdfsettings.cc
index 1c4719304a3875240dbb083b9940031b85fc7a65..882800790fdddf932bcdda994b1ca799932d3648 100644
--- a/nnpdfcpp/src/common/src/nnpdfsettings.cc
+++ b/nnpdfcpp/src/common/src/nnpdfsettings.cc
@@ -20,9 +20,9 @@
 static const string minString[6]   = {"UNDEFINED", "GA", "NGA", "NGAFT","CMAES"};
 static const string stopString[6]  = {"UNDEFINED", "FIXEDLENGTH", "LOOKBACK"};
 static const string paramString[6] = {"UNDEFINED", "NN", "SLN", "SLNPP"};
-static const string basisString[18]= {"UNDEFINED", "NN23", "NN23QED","EVOL", "EVOLQED","EVOLS",
+static const string basisString[19]= {"UNDEFINED", "NN23", "NN23QED","EVOL", "EVOLQED","EVOLS",
                                       "EVOLSQED","NN30", "NN30QED","FLVR", "FLVRQED","NN30IC",
-                                      "EVOLIC","NN31IC","LUX", "NN31ICQED", "NSR", "DISEVOL"};
+                                      "EVOLIC","NN31IC","LUX", "NN31ICQED", "NSR", "DISEVOL","PDF4LHC20"};
 
 static const vector< vector<string> > basiselem = { {},
                                      {"sng","g","v","t3","ds","sp","sm"},           //NN23
@@ -41,7 +41,8 @@ static const vector< vector<string> > basiselem = { {},
                                      {"sng","g","v","v3","v8","t3","t8","cp"},      //LUX
                                      {"sng","g","v","v3","v8","t3","t8","cp","pht"},//NN31ICQED
                                      {"sng","g","v","v3","v8","t3","t8","cp"},      //NSR
-                                     {"sng","g","t8"} //DISEVOL (Isoscalar)
+				     {"sng","g","t8"},                              //DISEVOL (Isoscalar)
+				     {"sng","g","v","v3","t3","t8"}                 //PDF4LHC20
                                      };
 
 /* Convert string to enum */
@@ -103,8 +104,9 @@ basisType NNPDFSettings::getFitBasisType(string const& method)
   if (method.compare("NN31IC") == 0)  return BASIS_NN31IC;
   if (method.compare("LUX") == 0)     return BASIS_LUX;
   if (method.compare("NN31ICQED")==0) return BASIS_NN31ICQED;
-  if (method.compare("NSR")==0) return BASIS_NSR;
-  if (method.compare("DISEVOL")==0) return BASIS_DISEVOL;
+  if (method.compare("NSR")==0)       return BASIS_NSR;
+  if (method.compare("DISEVOL")==0)   return BASIS_DISEVOL;
+  if (method.compare("PDF4LHC20")==0) return BASIS_PDF4LHC20;
 
   cerr << "getFitBasisType Error: Invalid parametrization type: "<<method;
   exit(EXIT_FAILURE);
diff --git a/nnpdfcpp/src/nnfit/inc/fitbases.h b/nnpdfcpp/src/nnfit/inc/fitbases.h
index c457075a6b75411868bcff096fdefc8be304e167..8af64b71635d0dcedd4da5ab5210934581eb1718 100644
--- a/nnpdfcpp/src/nnfit/inc/fitbases.h
+++ b/nnpdfcpp/src/nnfit/inc/fitbases.h
@@ -114,6 +114,31 @@ protected:
   bool fQED;
 };
 
+/**
+ *  \class PDF4LHC20FitBasis
+ *  \brief PDF4LHC20 basis for fitting
+ */
+class PDF4LHC20FitBasis: public FitBasis
+{
+public:
+  PDF4LHC20FitBasis(NNPDFSettings const&);
+
+  // Σ, g, V, V3, T3, T8, γ
+
+  enum fitBasis {FIT_SNG, FIT_GLU, FIT_VAL, FIT_V3, FIT_T3, FIT_T8, FIT_GAM };
+
+  void BASIS2EVLN(real const* basis, real* evln) const;
+  void EVLN2BASIS(real const* evln, real* basis) const;
+
+  real ComputeSumRules(sumRule, int mem, PDFSet*, bool&) const;
+
+  // Preprocessing
+  void ComputeParam(PDFSet*, int mem, PreprocParam&, bool&) const;
+
+protected:
+  bool fQED;
+};
+
 /**
  *  \class DISEvolFitBasis
  *  \brief DIS Evol basis for fitting
@@ -298,4 +323,4 @@ public:
 
   // Preprocessing
   void ComputeParam(PDFSet*, int mem, PreprocParam&, bool&) const;
-};
\ No newline at end of file
+};
diff --git a/nnpdfcpp/src/nnfit/src/fitbases.cc b/nnpdfcpp/src/nnfit/src/fitbases.cc
index 8abcbc6d599e6d4d0fed865886d70bd3843927f1..623a519c90556dad0359f99c56cf70ccf561fc67 100644
--- a/nnpdfcpp/src/nnfit/src/fitbases.cc
+++ b/nnpdfcpp/src/nnfit/src/fitbases.cc
@@ -34,6 +34,7 @@ FitBasis* getFitBasis(NNPDFSettings const& settings, basisType btype, const int
       cout << Colour::FG_BLUE << "Selecting FitBasis: EVOL" << Colour::FG_DEFAULT << endl;
       break;
     }
+    
     case BASIS_DISEVOL:
     {
       fitbasis = new DISEvolFitBasis(settings);
@@ -100,6 +101,13 @@ FitBasis* getFitBasis(NNPDFSettings const& settings, basisType btype, const int
       break;
     }
 
+    case BASIS_PDF4LHC20:
+    {
+      fitbasis = new PDF4LHC20FitBasis(settings);
+      cout << Colour::FG_BLUE << "Selecting FitBasis: EVOL" << Colour::FG_DEFAULT << endl;
+      break;
+    }
+    
     default:
       cerr << Colour::FG_RED << "[getFitBasis] error: Invalid Fitting Basis" << Colour::FG_DEFAULT << endl;
       exit(-1);
@@ -599,6 +607,193 @@ real EvolFitBasis::ComputeSumRules(sumRule rule, int mem, PDFSet *pdf, bool &sta
   }
 }
 
+// ****************** PDF4LHC20 BASIS *************************
+
+
+/**
+ *  Evolution Fit Basis
+ **/
+PDF4LHC20FitBasis::PDF4LHC20FitBasis(NNPDFSettings const& nnset):
+FitBasis(nnset, "PDF4LHC20FitBasis", 6+nnset.IsQED()),
+fQED(nnset.IsQED())
+{
+  // PDF Names for plotting
+  fPDFNames[FIT_SNG] = "Singlet";
+  fPDFNames[FIT_GLU] = "Gluon";
+  fPDFNames[FIT_VAL] = "V";
+  fPDFNames[FIT_V3] = "V3";
+  fPDFNames[FIT_T3] = "T3";
+  fPDFNames[FIT_T8] = "T8";
+  if (fQED)
+    fPDFNames[FIT_GAM] = "Photon";
+
+  // Damping factor for arclengths
+  fArcDampFactor[FIT_SNG] = 1;
+  fArcDampFactor[FIT_GLU] = 1;
+  fArcDampFactor[FIT_VAL] = 0;
+  fArcDampFactor[FIT_V3] = 0;
+  fArcDampFactor[FIT_T3] = 1;
+  fArcDampFactor[FIT_T8] = 1;
+  if (fQED)
+    fArcDampFactor[FIT_GAM] = 1;
+
+}
+
+void PDF4LHC20FitBasis::ComputeParam(PDFSet* pdf, int mem, PreprocParam& param, bool &status) const
+{
+  // status
+  status = false;
+
+  // Clear old normalisations
+  for (int i=0; i<fNPDF; i++)
+  {
+    param.fPDFNorm[i] = 1.0;
+    param.fPDFAux[i] = 0.0;
+  }
+
+  // Normalisations pointer
+  real* norm = param.fPDFNorm;
+
+  // Quantum number sum rules
+  norm[FIT_VAL] = 3.0f/pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork); // Total valence
+  norm[FIT_V3] = 1.0f/pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork); // V3
+
+  // ************ QED dependent normalisations **************
+  if (fQED)
+  {
+    norm[FIT_GLU] = (1-pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork) - pdf->IntegratePDF(mem,FIT_GAM,fQ2,PDFSet::XFX,status,fGSLWork))
+    / pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork);
+  }
+  else
+  {
+    norm[FIT_GLU] = (1-pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork))/
+    pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork);
+  }
+
+  return;
+
+}
+
+/**
+ * @brief EvolFitBasis::BASIS2EVLN
+ * @param FIT
+ * @param EVLN
+ */
+void PDF4LHC20FitBasis::BASIS2EVLN(const real *FIT, real *EVLN) const
+{
+  if ( fQED )
+    EVLN[EVLN_GAM] = FIT[FIT_GAM];
+  else
+    EVLN[EVLN_GAM] = 0;
+
+  EVLN[EVLN_SNG]  = FIT[FIT_SNG]; //Singlet
+  EVLN[EVLN_GLU]  = FIT[FIT_GLU]; //Gluon
+  EVLN[EVLN_VAL]  = FIT[FIT_VAL]; //Valence
+  EVLN[EVLN_V3]   = FIT[FIT_V3];  //V3
+  EVLN[EVLN_V8]   = FIT[FIT_VAL]; //V8
+  EVLN[EVLN_V15]  = FIT[FIT_VAL]; //V15 = V
+  EVLN[EVLN_V24]  = FIT[FIT_VAL]; //V24 = V
+  EVLN[EVLN_V35]  = FIT[FIT_VAL]; //V35 = V
+  EVLN[EVLN_T3]   = FIT[FIT_T3];  //T3
+  EVLN[EVLN_T8]   = FIT[FIT_T8];  //T8
+  EVLN[EVLN_T15]  = FIT[FIT_SNG]; //T15 = S
+  EVLN[EVLN_T24]  = FIT[FIT_SNG]; //T24 = S
+  EVLN[EVLN_T35]  = FIT[FIT_SNG]; //T35 = S
+
+  return;
+}
+
+void PDF4LHC20FitBasis::EVLN2BASIS(const real *EVLN, real *FIT) const
+{
+  // Order in fitting basis
+  // S g V V3 V8 T3 T8 gam
+
+  // Order in Evln bassi
+  // γ, Σ, g, V, V3, V8, V15, V24, V35, T3, T8, T15, T24, T35
+
+  FIT[FIT_SNG]  = EVLN[EVLN_SNG]; //Singlet
+  FIT[FIT_GLU]  = EVLN[EVLN_GLU]; //gluon
+  FIT[FIT_VAL]  = EVLN[EVLN_VAL]; //valence
+  FIT[FIT_V3]   = EVLN[EVLN_V3]; // V3
+  FIT[FIT_T3]   = EVLN[EVLN_T3]; // T3
+  FIT[FIT_T8]   = EVLN[EVLN_T8]; // T8
+
+  if (fQED)
+    FIT[FIT_GAM] =  EVLN[0];  // photon
+
+  return;
+}
+
+real PDF4LHC20FitBasis::ComputeSumRules(sumRule rule, int mem, PDFSet *pdf, bool &status) const
+{
+  // status
+  status = false;
+
+  // sum rule calculations
+  switch (rule) {
+     case SUM_MSR:
+       {
+         real xsng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork);
+         real xglu = pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork);
+         real msr = xsng+xglu;
+         if (fQED)
+           {
+             real xgam = pdf->IntegratePDF(mem,FIT_GAM,fQ2,PDFSet::XFX,status,fGSLWork);
+             msr += xgam;
+           }
+         return msr;
+       }
+       break;
+     case SUM_UVL:
+       {
+         real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork);
+         real v3 = pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork);
+         return ( val + v3 )/2.0;
+       }
+       break;
+     case SUM_DVL:
+       {
+         real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork);
+         real v3 = pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork);
+         return ( val - v3 )/2.0;
+       }
+       break;
+     case SUM_SVL:
+       {
+         real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork);
+         return ( val - val )/3.0;
+       }
+        break;
+     case SUM_USM:
+       {
+         real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork);
+         real t3 = pdf->IntegratePDF(mem,FIT_T3,fQ2,PDFSet::XFX,status,fGSLWork);
+         real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork);
+         return ( 2.0*sng + 3.0*t3 + t8 )/6.0;
+       }
+       break;
+     case SUM_DSM:
+       {
+         real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork);
+         real t3 = pdf->IntegratePDF(mem,FIT_T3,fQ2,PDFSet::XFX,status,fGSLWork);
+         real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork);
+         return ( 2.0*sng - 3.0*t3 + t8 )/6.0;
+       }
+       break;
+     case SUM_SSM:
+       {
+         real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork);
+         real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork);
+         return ( sng - t8 )/3.0;
+       }
+       break;
+     default:
+       cerr << "PDF4LHC20FitBasis::ComputeSumRules error: unknown sum rule"<<endl;
+       exit(-1);
+       break;
+  }
+}
+
 // ******************** DIS EVOLUTION BASIS (ISOSCALAR CASE)*******
 
 
diff --git a/nnpdfcpp/src/validphys/src/plotdata.cc b/nnpdfcpp/src/validphys/src/plotdata.cc
index d92f3dc382fb3fcd3a055c3ed9c832f29b41ee37..aac6c2098e921bd37d0bd0edf2a8d8a24a765da2 100644
--- a/nnpdfcpp/src/validphys/src/plotdata.cc
+++ b/nnpdfcpp/src/validphys/src/plotdata.cc
@@ -710,6 +710,9 @@ void PlotData::AddPreprocPlots(int i, LHAPDFSet *pdf)
   real (*evolf[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fV8,&fT3,&fT8,&fphoton};
   string evol[] = {"Singlet","Gluon","Valence","V3","V8","T3","T8","Photon"};
 
+  real (*pdf4lhc20f[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fT3,&fT8,&fphoton};
+  string pdf4lhc20[] = {"Singlet","Gluon","Valence","V3","T3","T8","Photon"};
+
   real (*evolsf[])(real*) = {&fsinglet,&fgluon,&fV,&fV8,&fT3,&fT8,&fDelta,&fphoton};
   string evols[] = {"Singlet","Gluon","Valence","V8","T3","T8","#Delta_{s}","Photon"};
 
@@ -2511,6 +2514,7 @@ void PlotData::AddCTEstimators(vector<LHAPDFSet*> pdf,vector<ExperimentResult *>
 
   real (*nn23f[])(real*) = {&fsinglet,&fgluon,&fV,&fT3,&fDelta,&fsplus,&fsminus,&fphoton};
   real (*evolf[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fV8,&fT3,&fT8,&fphoton};
+  real (*pdf4lhc20f[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fT3,&fT8,&fphoton};
   real (*evolsf[])(real*) = {&fsinglet,&fgluon,&fV,&fV8,&fT3,&fT8,&fDelta,&fphoton};
   real (*flvrf[])(real*) = {&fgluon,&fup,&fubar,&fdown,&fdbar,&fstrange,&fsbar};
   real (*nn30icf[])(real*) = {&fsinglet,&fgluon,&fV,&fT3,&fDelta,&fsplus,&fsminus,&fcplus,&fcminus,&fphoton};
@@ -2524,6 +2528,8 @@ void PlotData::AddCTEstimators(vector<LHAPDFSet*> pdf,vector<ExperimentResult *>
     for (int t = 0; t < nfl; t++) functions[t] = nn23f[t];
   else if (setbasis == BASIS_EVOL || setbasis == BASIS_EVOLQED)
     for (int t = 0; t < nfl; t++) functions[t] = evolf[t];
+  else if (setbasis == BASIS_PDF4LHC20)
+    for (int t = 0; t < nfl; t++) functions[t] = pdf4lhc20f[t];
   else if (setbasis == BASIS_EVOLS || setbasis == BASIS_EVOLSQED)
     for (int t = 0; t < nfl; t++) functions[t] = evolsf[t];
   else if (setbasis == BASIS_FLVR || setbasis == BASIS_FLVRQED)
diff --git a/validphys2/src/validphys/pdfbases.py b/validphys2/src/validphys/pdfbases.py
index 5c4b6cedaac6e51e1cae3ad8535bfe3414a1f99e..0b73fdbbca530745d37e3609c045a5deca54b021 100644
--- a/validphys2/src/validphys/pdfbases.py
+++ b/validphys2/src/validphys/pdfbases.py
@@ -500,6 +500,25 @@ evolution = LinearBasis.from_mapping({
 
 EVOL = evolution
 
+PDF4LHC20 = LinearBasis.from_mapping({
+        r'\Sigma': {
+            'u': 1, 'ubar': 1, 'd': 1, 'dbar': 1, 's': 1, 'sbar': 1,
+            'c': 1, 'cbar': 1, 'b': 1, 'bbar': 1, 't': 1, 'tbar': 1},
+        'g': {'g': 1},
+
+        'V': {
+            'u': 1, 'ubar': -1, 'd': 1, 'dbar': -1, 's': 1, 'sbar': -1,
+            'c': 1, 'cbar': -1, 'b': 1, 'bbar': -1, 't': 1, 'tbar': -1},
+
+        'V3': {'u': 1, 'ubar': -1, 'd': -1, 'dbar': 1},
+
+        'T3': {'u': 1, 'ubar': 1, 'd': -1, 'dbar': -1},
+        'T8': {'u': 1, 'ubar': 1, 'd': 1, 'dbar': 1, 's': -2, 'sbar': -2},
+    },
+    aliases = {'gluon':'g', 'singlet': r'\Sigma', 'sng': r'\Sigma', 'sigma': r'\Sigma',
+               'v': 'V', 'v3': 'V3', 't3': 'T3', 't8': 'T8'},
+    default_elements=(r'\Sigma', 'gluon', 'V', 'V3', 'T3', 'T8',  ))
+
 NN31IC = LinearBasis.from_mapping(
     {
         r'\Sigma': {
@@ -618,6 +637,16 @@ def fitbasis_to_NN31IC(flav_info, fitbasis):
         cp = {'sng': 0.25, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': -0.25, 'g': 0 }
         g = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 1 }
 
+    elif fitbasis == 'PDF4LHC20':
+        sng = {'sng': 1, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 }
+        v = {'sng': 0, 'v': 1, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 }
+        v3 = {'sng': 0, 'v': 0, 'v3': 1, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 }
+        v8 = {'sng': 0, 'v': 1, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 }
+        t3 = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 1, 't8': 0, 't15': 0, 'g': 0 }
+        t8 = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 1, 't15': 0, 'g': 0 }
+        cp = {'sng': 0.25, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': -0.25, 'g': 0 }
+        g = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 1 }
+
     flist = [sng, g, v, v3, v8, t3, t8, cp]
 
     evol_basis = False