diff --git a/Resample/Processed/Slicer.cpp b/Resample/Processed/Slicer.cpp
index d5cf65a21e356dcdd1fb517e54de429227ddd032..2ce4993b1602b9c1b00920c29566cf98d1a2e21c 100644
--- a/Resample/Processed/Slicer.cpp
+++ b/Resample/Processed/Slicer.cpp
@@ -75,8 +75,8 @@ IFormFactor* doSlice(const IFormFactor* ff, double dz_bottom, double dz_top)
                                        f->height() - dz_bottom - dz_top);
     }
     if (const auto* f = dynamic_cast<const HorizontalCylinder*>(ff)) {
-        return new HorizontalCylinder(f->radius(), f->length(), -f->radius() + dz_bottom,
-                                      f->radius() - dz_top);
+        return new HorizontalCylinder(f->radius(), f->length(), f->slice_bottom() + dz_bottom,
+                                      f->slice_top() - dz_top);
     }
     if (const auto* f = dynamic_cast<const Sphere*>(ff)) {
         return new TruncatedSphere(f->radius(), f->height() - dz_bottom, dz_top);
diff --git a/Sample/HardParticle/HorizontalCylinder.cpp b/Sample/HardParticle/HorizontalCylinder.cpp
index e32bd325dc9cd745f29065704fee75260352c017..84336e78ac390f9ab4ba6b0b97f4ff21fddb9f50 100644
--- a/Sample/HardParticle/HorizontalCylinder.cpp
+++ b/Sample/HardParticle/HorizontalCylinder.cpp
@@ -57,14 +57,14 @@ complex_t HorizontalCylinder::formfactor(C3 q) const
         radial_part = M_TWOPI * R * R * Math::Bessel::J1c(qR) * exp_I(q.z() * R);
 
     else
-        radial_part =
-            2.
-            * ComplexIntegrator().integrate(
-                [=](double z) {
-                    double y = sqrt(R * R - z * z);
-                    return y * Math::sinc(q.y() * y) * exp_I(q.z() * (z - m_slice_bottom));
-                },
-                m_slice_bottom, m_slice_top);
+        // integration variable substituted as z = R * sin(t)
+        radial_part = 2. * pow(R, 2) * exp_I(q.z() * (-m_slice_bottom))
+                      * ComplexIntegrator().integrate(
+                          [=](double t) {
+                              return pow(cos(t), 2) * Math::sinc(q.y() * R * cos(t))
+                                     * exp_I(q.z() * R * sin(t));
+                          },
+                          asin(m_slice_bottom / R), asin(m_slice_top / R));
 
     return radial_part * axial_part;
 }
diff --git a/Tests/Py/Functional/auto_slicing.py b/Tests/Py/Functional/auto_slicing.py
index e1e5380be0d6f536e6750c8cb7eae0f18717f44f..beddf2299400965b4e2adb6bc6277d765c2cfbe2 100644
--- a/Tests/Py/Functional/auto_slicing.py
+++ b/Tests/Py/Functional/auto_slicing.py
@@ -41,20 +41,20 @@ def get_sample(particle, sliced):
 
 class SlicedSpheresTest(unittest.TestCase):
 
-    def runPlainFF(self, ff):
+    def runPlainFF(self, ff, eps = 1e-14):
         particle = ba.Particle(matParticle, ff)
         diff = infrastruct.diff_MiniGISAS(get_sample(particle, False),
                                           get_sample(particle, True))
-        self.assertLess(diff, 1e-9)
+        self.assertLess(diff, eps)
 
     def testSlicingPlainFF(self):
         self.runPlainFF(ba.Cone(8., 9., 80*ba.deg))
         self.runPlainFF(ba.Cylinder(3., 9.))
         self.runPlainFF(ba.EllipsoidalCylinder(3., 4., 9.))
         # self.runPlainFF(ba.HemiEllipsoid(7., 8., 9.)) # yet unsupported
-        self.runPlainFF(ba.HorizontalCylinder(5., 19.)) # TODO restore tol=1e-13
-        #self.runPlainFF(ba.HorizontalCylinder(5., 19., -4., 4.)) TODO wrong!
-        #self.runPlainFF(ba.HorizontalCylinder(6., 19., -3., 3.))
+        self.runPlainFF(ba.HorizontalCylinder(5., 19.), 5e-12)
+        self.runPlainFF(ba.HorizontalCylinder(5., 19., -4., 4.), 5e-12)
+        self.runPlainFF(ba.HorizontalCylinder(6., 19., -3., 3.), 5e-12)
         self.runPlainFF(ba.Sphere(5.))
         self.runPlainFF(ba.Spheroid(4., 4.))
         self.runPlainFF(ba.TruncatedSphere(7., 9., 1.))