diff --git a/Trigger/TrigAccel/TrigAccelEvent/TrigAccelEvent/TrigITkAccelEDM.h b/Trigger/TrigAccel/TrigAccelEvent/TrigAccelEvent/TrigITkAccelEDM.h
index a97a6a40bffea9378f1ba6fdd20d15dbff21b3f4..9b2e569e49a7c684ee0249339c2ab7b51a77cc53 100644
--- a/Trigger/TrigAccel/TrigAccelEvent/TrigAccelEvent/TrigITkAccelEDM.h
+++ b/Trigger/TrigAccel/TrigAccelEvent/TrigAccelEvent/TrigITkAccelEDM.h
@@ -18,7 +18,7 @@ namespace ITk {
   static constexpr unsigned int MAX_NUMBER_SCT_MODULES       = 24600;
   static constexpr unsigned int MAX_NUMBER_SPACEPOINTS       = 300000;
   static constexpr unsigned int MAX_PHI_SLICES               = 100;
-  static constexpr unsigned int MAX_NUMBER_OUTPUT_SEEDS      = 500000;
+  static constexpr unsigned int MAX_NUMBER_OUTPUT_SEEDS      = 100000;
   
   typedef struct SiliconLayer {
   public:
@@ -92,7 +92,6 @@ namespace ITk {
     int m_nSeeds;
     int m_nMiddleSps;
     int m_nI, m_nO;
-    int m_nCandidates;
     int m_nErrors;
     int m_innerIndex[MAX_NUMBER_OUTPUT_SEEDS];
     int m_middleIndex[MAX_NUMBER_OUTPUT_SEEDS];
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletCountingKernelCuda_ITk.cuh b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletCountingKernelCuda_ITk.cuh
index 31347eed3bd7e84cde013d96e50ecb5d2092c8ab..c7fd6e4f81919f4446def34a828e9f61b99774dd 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletCountingKernelCuda_ITk.cuh
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletCountingKernelCuda_ITk.cuh
@@ -46,8 +46,10 @@ __global__ static void doubletCountingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 	const float zPlus  = dSettings->m_zedPlus  + zTolerance; 
 	const float maxTheta = 2*atan(exp(-maxEta));
 	const float maxCtg = cos(maxTheta)/sin(maxTheta);
-	const float minOuterZ = dSettings->m_zedMinus - maxOuterRadius*maxCtg - zTolerance; 
-	const float maxOuterZ = dSettings->m_zedPlus + maxOuterRadius*maxCtg + zTolerance; 
+	const float minZ0     = dSettings->m_zedMinus;
+	const float maxZ0     = dSettings->m_zedPlus;
+	const float minOuterZ = minZ0 - maxOuterRadius*maxCtg - zTolerance; 
+	const float maxOuterZ = maxZ0 + maxOuterRadius*maxCtg + zTolerance;
 
 	const double ptCoeff = 0.29997*dSettings->m_magFieldZ/2.0;// ~0.3*B/2 - assumes nominal field of 2*T
 	const float tripletPtMin = dSettings->m_tripletPtMin; // Retrieve from settings
@@ -62,6 +64,8 @@ __global__ static void doubletCountingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 		float zm = dSpacepoints->m_z[spmIdx];
 		float rm = dSpacepoints->m_r[spmIdx];
 
+		if (!canBeMiddleSpacePoint(rm, zm)) continue;
+
 		if(threadIdx.y ==0) {
 			nInner[threadIdx.x] = 0;
 			nOuter[threadIdx.x] = 0; 
@@ -88,11 +92,10 @@ __global__ static void doubletCountingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 				if(next_spEnd == next_spBegin) continue;//no spacepoints in this layer
 
 				const TrigAccel::ITk::SILICON_LAYER& layerGeo =  dDetModel->m_layers[nextLayerIdx];
+
 				bool isBarrel = (layerGeo.m_type == 0);
 
-				
 				float refCoord = layerGeo.m_refCoord;
-				
 				if(isBarrel && std::abs(refCoord-rm)>maxDoubletLength) continue;
 
 				//boundaries for nextLayer
@@ -139,6 +142,9 @@ __global__ static void doubletCountingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 					if(std::abs(tau)>maxCtg) continue;
 
 					// Cut on Z
+					float z0 = zsp - rsp*tau;
+					if(z0 < minZ0 || z0 > maxZ0) continue;
+
 					float outZ = zsp + (maxOuterRadius-rsp)*tau; 
 					if(outZ < minOuterZ || outZ > maxOuterZ) continue;
 
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletHelperFunctionsCuda_ITk.cuh b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletHelperFunctionsCuda_ITk.cuh
index e8cc2308d67714a2faac4261018360d259e8b0d0..25e8ca00f21c8735b1889a00fac5bdd95501e078 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletHelperFunctionsCuda_ITk.cuh
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletHelperFunctionsCuda_ITk.cuh
@@ -30,4 +30,18 @@ __device__ static float getMaxDeltaLEta (float eta) {
   else return eta*eta*eta*eta*1.7582417 + eta*eta*-129.67033 + 3324.61538;
 }
 
+
+__device__ static float canBeMiddleSpacePoint (float r, float z) {
+  float z_abs = std::abs(z);
+
+  // Barrel
+  if ((r < 90.)  && (z_abs < 245.)) return false; // volume 80
+  if ((r > 200.) && (z_abs < 245.)) return false; // volume 83
+  if ((r > 250.) && (z_abs < 350.)) return false; // volume 84
+  if (r > 290.) return false; // volume 84
+  // End Cap
+  if (z_abs > 2600.) return false;
+  return true;
+}
+
 #endif
\ No newline at end of file
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMakingKernelCuda_ITk.cuh b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMakingKernelCuda_ITk.cuh
index 715d0ad8c60a68d306d7d45c7d7c312001669aa3..c0a3fdfb9ba1083daabab975cded93a0f4d6caf8 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMakingKernelCuda_ITk.cuh
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMakingKernelCuda_ITk.cuh
@@ -49,8 +49,10 @@ __global__ static void doubletMakingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SETTI
 	const float zPlus  = dSettings->m_zedPlus  + zTolerance; 
 	const float maxTheta = 2*atan(exp(-maxEta));
 	const float maxCtg = cos(maxTheta)/sin(maxTheta);
-	const float minOuterZ = dSettings->m_zedMinus - maxOuterRadius*maxCtg - zTolerance; 
-	const float maxOuterZ = dSettings->m_zedPlus + maxOuterRadius*maxCtg + zTolerance; 
+	const float minZ0     = dSettings->m_zedMinus;
+	const float maxZ0     = dSettings->m_zedPlus;
+	const float minOuterZ = minZ0 - maxOuterRadius*maxCtg - zTolerance; 
+	const float maxOuterZ = maxZ0 + maxOuterRadius*maxCtg + zTolerance;
 
 	const double ptCoeff = 0.29997*dSettings->m_magFieldZ/2.0;// ~0.3*B/2 - assumes nominal field of 2*T
 	const float tripletPtMin = dSettings->m_tripletPtMin; // Retrieve from settings
@@ -89,6 +91,8 @@ __global__ static void doubletMakingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SETTI
 		float zm = dSpacepoints->m_z[spmIdx];
 		float rm = dSpacepoints->m_r[spmIdx];
 
+		if (!canBeMiddleSpacePoint(rm, zm)) continue;
+
 		//2. loop over other phi-bins / layers
 
 		for(int deltaPhiIdx=-1;deltaPhiIdx<=1;deltaPhiIdx++) {
@@ -108,8 +112,8 @@ __global__ static void doubletMakingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SETTI
 
 				const TrigAccel::ITk::SILICON_LAYER& layerGeo =  dDetModel->m_layers[nextLayerIdx];
 				bool isBarrel = (layerGeo.m_type == 0);
+
 				float refCoord = layerGeo.m_refCoord;
-				
 				if(isBarrel && std::abs(refCoord-rm)>maxDoubletLength) continue;
 
 				//boundaries for nextLayer
@@ -156,6 +160,9 @@ __global__ static void doubletMakingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SETTI
 					if(std::abs(tau)>maxCtg) continue;
 
 					// Cut on Z
+					float z0 = zsp - rsp*tau;
+					if(z0 < minZ0 || z0 > maxZ0) continue;
+
 					float outZ = zsp + (maxOuterRadius-rsp)*tau; 
 					if(outZ < minOuterZ || outZ > maxOuterZ) continue;
 
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMatchingKernelCuda_ITk.cuh b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMatchingKernelCuda_ITk.cuh
index 8c803fd3068ba66467736a114d7d97cc00810db9..68fc24c66a10c77c54841c2c3e3d4030ab995ad8 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMatchingKernelCuda_ITk.cuh
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/DoubletMatchingKernelCuda_ITk.cuh
@@ -8,6 +8,7 @@
 
 #include <cuda_runtime.h>
 #include "SeedMakingDataStructures_ITk.h"
+#include "DoubletHelperFunctionsCuda_ITk.cuh"
 
 
 __global__ static void doubletMatchingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SETTINGS* dSettings, 
@@ -25,6 +26,7 @@ __global__ static void doubletMatchingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 
 	__shared__ int spmIdx;
 	__shared__ float rm;
+	__shared__ float zm;
 
 	__shared__ float covZ;
 	__shared__ float covR;
@@ -91,6 +93,7 @@ __global__ static void doubletMatchingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 			outerStart = d_Storage->m_outerStart[itemIdx];
 
 			rm = dSpacepoints->m_r[spmIdx];
+			zm = dSpacepoints->m_z[spmIdx];
 			covZ = dSpacepoints->m_covZ[spmIdx];
 			covR = dSpacepoints->m_covR[spmIdx];
 		
@@ -100,7 +103,9 @@ __global__ static void doubletMatchingKernel_ITk(TrigAccel::ITk::SEED_FINDER_SET
 			cosA = x0/rm;
 			sinA = y0/rm;
 		}
-		__syncthreads();    
+		__syncthreads();
+
+		if (!canBeMiddleSpacePoint(rm, zm)) continue;    
 
 		
 		for(int innerIdx = threadIdx.x; innerIdx<nInner;innerIdx+=blockDim.x) {
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingDataStructures_ITk.h b/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingDataStructures_ITk.h
index 57520fcb5e88cc6e5dc127162b084968572eb8ef..94e88de1492bf0bc27a986c8c94e17ae7f9101c3 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingDataStructures_ITk.h
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingDataStructures_ITk.h
@@ -8,7 +8,7 @@
 #include "CommonStructures.h"
 
 static constexpr unsigned int MAX_MIDDLE_SP_ITk         = 300000;
-static constexpr unsigned int MAX_DOUBLET_ITk           = 50000000;
+static constexpr unsigned int MAX_DOUBLET_ITk           = 25000000;
 static constexpr unsigned int NUM_MIDDLE_THREADS_ITk        = 32;
 static constexpr unsigned int OUTER_THREADS_MULTIPLIER_ITk  = 4; // i.e thread block is 32 x 4*192/32
 static constexpr unsigned int MAX_NUMBER_DOUBLETS_ITk       = 1500;
diff --git a/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingWorkCuda_ITk.cu b/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingWorkCuda_ITk.cu
index f654ec73e45311babb8826753d1ed2b09ce23f3d..03645ebb4ce3ebef922de88a2740d005433e045d 100644
--- a/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingWorkCuda_ITk.cu
+++ b/Trigger/TrigAccel/TrigInDetCUDA/src/SeedMakingWorkCuda_ITk.cu
@@ -151,7 +151,6 @@ bool SeedMakingWorkCudaITk::run() {
   pOutput->m_nSeeds = 0;		
   pOutput->m_nI = 0;
   pOutput->m_nO = 0;
-  pOutput->m_nCandidates = 0;
 
   cudaMemcpyAsync(p.h_outputseeds, p.d_outputseeds, sizeof(TrigAccel::ITk::OUTPUT_SEED_STORAGE), cudaMemcpyDeviceToHost, p.m_stream);
 
@@ -297,7 +296,6 @@ bool SeedMakingWorkCudaManagedITk::run() {
   pOutput->m_nSeeds = 0;		
   pOutput->m_nI = 0;
   pOutput->m_nO = 0;
-  pOutput->m_nCandidates = 0;
 
 
   checkError();