diff --git a/compiled/cern/global/frontend.xml b/compiled/cern/global/frontend.xml
index 0e8bf5049a52c4a317a5bd879ceab9c87e064472..1221f7dd39805d85e4d9ee01d326f21784b8c80a 100644
--- a/compiled/cern/global/frontend.xml
+++ b/compiled/cern/global/frontend.xml
@@ -17,7 +17,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs)) &amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT,T2_CH_CERN",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -132,6 +132,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(6*3600)"/>
       <attr name="OSG_SINGULARITY_BINARY" glidein_publish="True" job_publish="True" parameter="True" type="string" value="/cvmfs/oasis.opensciencegrid.org/mis/apptainer/1.2.5/bin/apptainer"/>
    </attrs>
@@ -560,7 +561,7 @@
             <running_glideins_per_entry max="300" min="0" relative_to_queue="1.05"/>
             <running_glideins_total curb="3200" max="3500"/>
          </config>
-         <match match_expr='( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
+         <match match_expr='(glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
             <factory query_expr='(GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)'>
                <match_attrs>
                   <match_attr name="GLIDEIN_CMSSite" type="string"/>
diff --git a/compiled/cern/itb/frontend.xml b/compiled/cern/itb/frontend.xml
index 80457a260348ac9456d52be14197069a6ff2a1bd..77336560125cacc0ffed119747f59a73082377c5 100644
--- a/compiled/cern/itb/frontend.xml
+++ b/compiled/cern/itb/frontend.xml
@@ -17,7 +17,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs)) &amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -117,6 +117,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(6*3600)"/>
       <attr name="GLIDEIN_DEBUG_OUTPUT" glidein_publish="True" job_publish="True" parameter="True" type="string" value="True"/>
       <attr name="GLIDEIN_DEBUG_OPTIONS" glidein_publish="True" job_publish="True" parameter="True" type="string" value="userjob"/>
@@ -559,7 +560,7 @@
             <running_glideins_per_entry max="300" min="0" relative_to_queue="1.05"/>
             <running_glideins_total curb="3200" max="3500"/>
          </config>
-         <match match_expr='( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
+         <match match_expr='(glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
             <factory query_expr='(GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)'>
                <match_attrs>
                   <match_attr name="GLIDEIN_CMSSite" type="string"/>
diff --git a/compiled/cern/itbdev/frontend.xml b/compiled/cern/itbdev/frontend.xml
index cbeb9e7fdf2120a0d6e31c066a8b7c9135246c4a..32912d22f6e1661ea33b125605a42f99bdfcb9bf 100644
--- a/compiled/cern/itbdev/frontend.xml
+++ b/compiled/cern/itbdev/frontend.xml
@@ -16,7 +16,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs)) &amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -84,6 +84,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(6*3600)"/>
       <attr name="GLIDEIN_DEBUG_OUTPUT" glidein_publish="True" job_publish="True" parameter="True" type="string" value="True"/>
       <attr name="GLIDEIN_DEBUG_OPTIONS" glidein_publish="True" job_publish="True" parameter="True" type="string" value="userjob"/>
@@ -526,7 +527,7 @@
             <running_glideins_per_entry max="300" min="0" relative_to_queue="1.05"/>
             <running_glideins_total curb="3200" max="3500"/>
          </config>
-         <match match_expr='( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
+         <match match_expr='(glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
             <factory query_expr='(GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)'>
                <match_attrs>
                   <match_attr name="GLIDEIN_CMSSite" type="string"/>
diff --git a/compiled/cern/tier0/frontend.xml b/compiled/cern/tier0/frontend.xml
index 1f6d4e0defb81fc2d518ea9a39cd73c0c1f5122f..f5c9171752f1d893e8019aa77527621edb3e39c2 100644
--- a/compiled/cern/tier0/frontend.xml
+++ b/compiled/cern/tier0/frontend.xml
@@ -16,7 +16,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='True'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -128,6 +128,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDECLIENT_Rank" glidein_publish="True" job_publish="True" parameter="True" type="string" value="1"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(1*3600)"/>
       <attr name="GLIDEIN_Max_Walltime" glidein_publish="True" job_publish="True" parameter="True" type="int" value="2592000"/>
diff --git a/compiled/cern/volunteer/frontend.xml b/compiled/cern/volunteer/frontend.xml
index a0f919c81833e5b88e8911bf85356a3722f29c51..5e6498a23b0703f21dd163608d85f5762809fecb 100644
--- a/compiled/cern/volunteer/frontend.xml
+++ b/compiled/cern/volunteer/frontend.xml
@@ -16,7 +16,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs))&amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT,T0_CH_CERN",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
diff --git a/compiled/fnal/global/frontend.xml b/compiled/fnal/global/frontend.xml
index 9ac16a2d15b44a84832894f0879406dd25e256f9..24dfff60ce6fbbfe65060298b4053f194248114f 100644
--- a/compiled/fnal/global/frontend.xml
+++ b/compiled/fnal/global/frontend.xml
@@ -17,7 +17,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs)) &amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT,T2_CH_CERN",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -132,6 +132,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(6*3600)"/>
       <attr name="OSG_SINGULARITY_BINARY" glidein_publish="True" job_publish="True" parameter="True" type="string" value="/cvmfs/oasis.opensciencegrid.org/mis/apptainer/1.2.5/bin/apptainer"/>
    </attrs>
@@ -560,7 +561,7 @@
             <running_glideins_per_entry max="300" min="0" relative_to_queue="1.05"/>
             <running_glideins_total curb="3200" max="3500"/>
          </config>
-         <match match_expr='( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
+         <match match_expr='(glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
             <factory query_expr='(GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)'>
                <match_attrs>
                   <match_attr name="GLIDEIN_CMSSite" type="string"/>
diff --git a/compiled/fnal/itb/frontend.xml b/compiled/fnal/itb/frontend.xml
index bfa7fe6c146aff12c67d250258085b1bb622dafd..b1292313a811fd7e962930bbfb02704e7f1c249d 100644
--- a/compiled/fnal/itb/frontend.xml
+++ b/compiled/fnal/itb/frontend.xml
@@ -17,7 +17,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='(stringListMember("CMS",GLIDEIN_Supported_VOs) || stringListMember("CMSGPU",GLIDEIN_Supported_VOs)) &amp;&amp; (GLIDEIN_Max_Walltime=!=UNDEFINED) &amp;&amp; (GLIDEIN_Retire_Time_Spread=!=UNDEFINED) &amp;&amp; (GLIDEIN_MaxMemMBs=!=UNDEFINED) &amp;&amp; (GLIDEIN_CMSSite=!=UNDEFINED) &amp;&amp; (!stringListsIntersect("T2_CH_CERN_AI,T2_CH_CERN_HLT",GLIDEIN_CMSSite))'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -117,6 +117,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(6*3600)"/>
       <attr name="GLIDEIN_DEBUG_OUTPUT" glidein_publish="True" job_publish="True" parameter="True" type="string" value="True"/>
       <attr name="GLIDEIN_DEBUG_OPTIONS" glidein_publish="True" job_publish="True" parameter="True" type="string" value="userjob"/>
@@ -559,7 +560,7 @@
             <running_glideins_per_entry max="300" min="0" relative_to_queue="1.05"/>
             <running_glideins_total curb="3200" max="3500"/>
          </config>
-         <match match_expr='( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
+         <match match_expr='(glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )' start_expr='ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )'>
             <factory query_expr='(GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)'>
                <match_attrs>
                   <match_attr name="GLIDEIN_CMSSite" type="string"/>
diff --git a/compiled/fnal/tier0/frontend.xml b/compiled/fnal/tier0/frontend.xml
index d05127e92917b2f41113950b8b89db4528c3ba29..49303bf3d5e9aedc7037e534004511f5138eabae 100644
--- a/compiled/fnal/tier0/frontend.xml
+++ b/compiled/fnal/tier0/frontend.xml
@@ -17,7 +17,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='True'>
          <match_attrs>
             <match_attr name="GLIDEIN_Job_Min_Time" type="int"/>
@@ -129,6 +129,7 @@
       <attr name="GLIDEIN_OVERLOAD_ENABLED" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="False"/>
       <attr name="PREFER_IPV4" glidein_publish="True" job_publish="False" parameter="False" type="expr" value="False"/>
       <attr name="CHIRP_DELAYED_UPDATE_MAX_ATTRS" glidein_publish="True" job_publish="True" parameter="True" type="int" value="200"/>
+      <attr name="CMS_MATCH_MICROARCH" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="(Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))"/>
       <attr name="GLIDECLIENT_Rank" glidein_publish="True" job_publish="True" parameter="True" type="string" value="1"/>
       <attr name="GLIDEIN_CLAIM_WORKLIFE_DYNAMIC" glidein_publish="True" job_publish="True" parameter="True" type="expr" value="cpus*(1*3600)"/>
       <attr name="GLIDEIN_Max_Walltime" glidein_publish="True" job_publish="True" parameter="True" type="int" value="2592000"/>
diff --git a/inventory/classes/common.yml b/inventory/classes/common.yml
index cf8405cf04fa97b17e1b068c8cb087a407ecf26c..34e26abdf3591a4700c2d08063fcbd6346d57660 100644
--- a/inventory/classes/common.yml
+++ b/inventory/classes/common.yml
@@ -333,10 +333,10 @@ parameters:
         max: 3500
       # If a) Site is UCSD or Caltech and any MINI or MINISIM OR b) Site==Wisconsin and only MINI data OR  c) Site==MIT and only a subset of MINI
       match_expr: >-
-        ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_UCSD", "T2_US_Caltech"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_Wisconsin"] and "MINIAODSIM" not in job["DESIRED_CMSDataset"] ) or ( glidein["attrs"].get("GLIDEIN_CMSSite") in ["T2_US_MIT"] and ( "UL2016" in job["DESIRED_CMSDataset"] or "UL2017" in job["DESIRED_CMSDataset"]))
+        (glidein["attrs"].get("GLIDEIN_Country") in job["DESIRED_Overflow_Region"].split(",")) and ( glidein["attrs"].get("GLIDEIN_CMSSite") not in ["T2_US_Wisconsin", "T2_US_MIT"] or "MINIAODSIM" not in job["DESIRED_CMSDataset"] )
       # Same idea,  UCSD and Caltech can get jobs looking for any  MINIAOD and MINIAODSIM,  Wisconsin can only get jobs looking for MINIAOD and MIT only gets jobs looking for a subset of MINIAOD
       start_expr: >-
-        ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ( GLIDEIN_CMSSite=?="T2_US_Wisconsin"  &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset) ) || ( GLIDEIN_CMSSite=?="T2_US_MIT"  &amp;&amp; regexp("/*/Run201[6,7].*/MINIAOD/.*UL201[6,7].*", DESIRED_CMSDataset) ) ) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )
+        ifthenelse(CMS_ALLOW_OVERFLOW isnt undefined,CMS_ALLOW_OVERFLOW=?="True", undefined) &amp;&amp; (CRAB_UserRole=!="production") &amp;&amp; ifthenelse(DESIRED_Overflow_Region isnt undefined, stringListMember(GLIDEIN_Country,DESIRED_Overflow_Region),undefined) &amp;&amp;( ((GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech") &amp;&amp; (regexp("/*/RunIISummer(19|20)UL(16|17|18).*/MINIAODSIM", DESIRED_CMSDataset) || regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset))) || ((GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; regexp("/*/Run201[6,7,8].*/MINIAOD/.*UL201[6,7,8].*", DESIRED_CMSDataset)) &amp;&amp; ( isUndefined(RequestGPUs) || RequestGPUs =?= 0 )
       factory_query_expr: >-
         (GLIDEIN_CMSSite=?="T2_US_UCSD" || GLIDEIN_CMSSite=?="T2_US_Caltech" || GLIDEIN_CMSSite=?="T2_US_Wisconsin" || GLIDEIN_CMSSite=?="T2_US_MIT") &amp;&amp; stringListMember("CMS",GLIDEIN_Supported_VOs) &amp;&amp; !ifthenelse(CMS_Local_Entry isnt undefined, CMS_Local_Entry, False)
       job_query_expr: >-
diff --git a/inventory/classes/defaults.yml b/inventory/classes/defaults.yml
index eefe608f5a47beed4a0cb76796b09c6e192ae8c9..5b6f81efcb8bbfe025eca37c07bf6d1e5ca0f214 100644
--- a/inventory/classes/defaults.yml
+++ b/inventory/classes/defaults.yml
@@ -88,6 +88,13 @@ parameters:
       parameter: true
       type: int
       value: "200"
+    - name: CMS_MATCH_MICROARCH
+      glidein_publish: true
+      job_publish: true
+      parameter: true
+      type: expr
+      value: >-
+        (Microarch is undefined || REQUIRED_MINIMUM_MICROARCH is undefined || REQUIRED_MINIMUM_MICROARCH&lt;=int(substr(split(Microarch,"-")[1],1)))
   extra_files:
     - absfname: ${validation_repo_path}/set_singularity_binds.sh
       after_entry: False
diff --git a/templates/frontend.xml b/templates/frontend.xml
index 8f73c0f28ee0b51f8cf93879e0add902933d9159..461cecedee8032e2f80e5b692248499bec77ec05 100644
--- a/templates/frontend.xml
+++ b/templates/frontend.xml
@@ -21,7 +21,7 @@
          <process_log backup_count="5" compression="" extension="debug" max_days="7.0" max_mbytes="100.0" min_days="3.0" msg_types="DEBUG"/>
       </process_logs>
    </log_retention>
-   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True)'>
+   <match match_expr='__import__("CMSGlobalMatcher").match(job, glidein)' start_expr='ifthenelse(GLIDEIN_REQUIRED_OS=?="any", (HAS_SINGULARITY=?=true &amp;&amp; GLIDEIN_PS_HAS_SINGULARITY=!=false),( isUndefined(REQUIRED_OS) || REQUIRED_OS=?="any" || REQUIRED_OS=?=GLIDEIN_REQUIRED_OS )) &amp;&amp; ifthenelse(MaxWallTimeMins=!=UNDEFINED,(MaxWallTimeMins*60)&lt;(GLIDEIN_ToDie-MyCurrentTime),(16*3600)&lt;(GLIDEIN_ToDie-MyCurrentTime)) &amp;&amp; ((DynamicSlot =!= true) || (RequestCpus=?=Cpus)) &amp;&amp; ifthenelse(SlotType=?="Static", RequestCpus &lt;= Cpus, True) &amp;&amp; CMS_MATCH_MICROARCH'>
       <factory query_expr='{{ i.global_factory_expr }}'>
          <match_attrs>
             {% for attr in i.global_factory_expr_match_attrs %}