diff --git a/nipype/interfaces/cat12/preprocess.py b/nipype/interfaces/cat12/preprocess.py
index ebc436c674..7f20e3211c 100644
--- a/nipype/interfaces/cat12/preprocess.py
+++ b/nipype/interfaces/cat12/preprocess.py
@@ -9,6 +9,7 @@
     isdefined,
     File,
     Str,
+    ImageFile,
 )
 from nipype.interfaces.cat12.base import Cell
 
@@ -24,7 +25,7 @@
 
 class CAT12SegmentInputSpec(SPMCommandInputSpec):
     in_files = InputMultiPath(
-        ImageFileSPM(exists=True),
+        ImageFile(exists=True),
         field="data",
         desc="file to segment",
         mandatory=True,
@@ -112,9 +113,9 @@ class CAT12SegmentInputSpec(SPMCommandInputSpec):
         'rhe "Optimized Shooting - superlarge ventricles" option for "Spatial registration" is ! '
         "required Values: \nnone: 0;\nlight: 1;\nfull: 2;\ndefault: 1070."
     )
-    initial_segmentation = traits.Int(
-        0, field="extopts.spm_kamap", desc=_help_initial_seg, usedefault=True
-    )
+    # initial_segmentation = traits.Int(
+    #     0, field="extopts.spm_kamap", desc=_help_initial_seg, usedefault=True
+    # )
 
     _help_las = (
         "Additionally to WM-inhomogeneities, GM intensity can vary across different regions such as the motor"
@@ -226,7 +227,7 @@ class CAT12SegmentInputSpec(SPMCommandInputSpec):
         " are not available as batch dependencies objects. "
     )
     surface_and_thickness_estimation = traits.Int(
-        1, field="surface", desc=_help_surf, usedefault=True
+        1, field="output.surface", desc=_help_surf, usedefault=True
     )
     surface_measures = traits.Int(
         1,
@@ -239,26 +240,58 @@ class CAT12SegmentInputSpec(SPMCommandInputSpec):
     neuromorphometrics = traits.Bool(
         True,
         field="output.ROImenu.atlases.neuromorphometrics",
-        usedefault=True,
+        # usedefault=True,
         desc="Extract brain measures for Neuromorphometrics template",
+        xor=["noROI"]
     )
     lpba40 = traits.Bool(
         True,
         field="output.ROImenu.atlases.lpba40",
-        usedefault=True,
+        # usedefault=True,
         desc="Extract brain measures for LPBA40 template",
+        xor=["noROI"]
     )
     cobra = traits.Bool(
         True,
         field="output.ROImenu.atlases.hammers",
-        usedefault=True,
+        # usedefault=True,
         desc="Extract brain measures for COBRA template",
+        xor=["noROI"]
     )
     hammers = traits.Bool(
-        True,
+        False,
         field="output.ROImenu.atlases.cobra",
-        usedefault=True,
+        # usedefault=True,
         desc="Extract brain measures for Hammers template",
+        xor=["noROI"]
+    )
+    thalamus = traits.Bool(
+        True,
+        field="output.ROImenu.atlases.thalamus",
+        # usedefault=True,
+        desc="Extract brain measures for Thalamus template",
+        xor=["noROI"]
+    )
+    thalamic_nuclei = traits.Bool(
+        True,
+        field="output.ROImenu.atlases.thalamic_nuclei",
+        # usedefault=True,
+        desc="Extract brain measures for Thalamic Nuclei template",
+        xor=["noROI"]
+    )
+    suit = traits.Bool(
+        True,
+        field="output.ROImenu.atlases.suit",
+        # usedefault=True,
+        desc="Extract brain measures for Suit template",
+        xor=["noROI"]
+    )
+    ibsr = traits.Bool(
+        False,
+        field="output.ROImenu.atlases.ibsr",
+        # usedefault=True,
+        desc="Extract brain measures for IBSR template",
+        xor=["noROI"]
     )
     own_atlas = InputMultiPath(
         ImageFileSPM(exists=True),
@@ -266,6 +299,12 @@ class CAT12SegmentInputSpec(SPMCommandInputSpec):
         desc="Extract brain measures for a given template",
         mandatory=False,
         copyfile=False,
+        xor=["noROI"]
+    )
+    noROI = traits.Bool(
+        field="output.ROImenu.noROI",
+        desc="Select if no ROI analysis needed",
+        xor=["neuromorphometrics", "lpba40", "cobra", "hammers", "thalamus", "thalamic_nuclei", "suit", "ibsr"],
     )
 
     # Grey matter
@@ -520,6 +559,8 @@ def _format_arg(self, opt, spec, val):
         """Convert input to appropriate format for spm"""
         if opt == "in_files":
             if isinstance(val, list):
+                if '.nii.gz' in val[0]:
+                    return scans_for_fnames(val, keep4d=True)
                 return scans_for_fnames(val)
             else:
                 return scans_for_fname(val)
@@ -531,6 +572,8 @@ def _format_arg(self, opt, spec, val):
     def _list_outputs(self):
         outputs = self._outputs().get()
         f = self.inputs.in_files[0]
+        if '.nii.gz' in f:
+            f = f[:-3]
         pth, base, ext = split_filename(f)
 
         outputs["mri_images"] = [
@@ -554,22 +597,22 @@ def _list_outputs(self):
 
         if self.inputs.save_bias_corrected:
             outputs["bias_corrected_image"] = fname_presuffix(
-                f, prefix=os.path.join("mri", "wmi")
+                f, prefix=os.path.join("mri", "wm")
             )
 
-        outputs["surface_files"] = [
-            str(surf) for surf in Path(pth).glob("surf/*") if surf.is_file()
-        ]
-
-        for hemisphere in ["rh", "lh"]:
-            for suffix in ["central", "sphere"]:
-                outfield = f"{hemisphere}_{suffix}_surface"
-                outputs[outfield] = fname_presuffix(
-                    f,
-                    prefix=os.path.join("surf", f"{hemisphere}.{suffix}."),
-                    suffix=".gii",
-                    use_ext=False,
-                )
+        if self.inputs.surface_and_thickness_estimation:
+            outputs["surface_files"] = [
+                str(surf) for surf in Path(pth).glob("surf/*") if surf.is_file()
+            ]
+            for hemisphere in ["rh", "lh"]:
+                for suffix in ["central", "sphere"]:
+                    outfield = f"{hemisphere}_{suffix}_surface"
+                    outputs[outfield] = fname_presuffix(
+                        f,
+                        prefix=os.path.join("surf", f"{hemisphere}.{suffix}."),
+                        suffix=".gii",
+                        use_ext=False,
+                    )
 
         outputs["report_files"] = outputs["report_files"] = [
             str(report) for report in Path(pth).glob("report/*") if report.is_file()
@@ -582,13 +625,17 @@ def _list_outputs(self):
         outputs["label_files"] = [
             str(label) for label in Path(pth).glob("label/*") if label.is_file()
         ]
+        
+        if self.inputs.neuromorphometrics or self.inputs.lpba40 or self.inputs.cobra or self.inputs.hammers or self.inputs.thalamus or self.inputs.thalamic_nuclei or self.inputs.suit or self.inputs.ibsr:
+            outputs["label_roi"] = fname_presuffix(
+                f, prefix=os.path.join("label", "catROI_"), suffix=".xml", use_ext=False
+            )
 
-        outputs["label_rois"] = fname_presuffix(
-            f, prefix=os.path.join("label", "catROIs_"), suffix=".xml", use_ext=False
-        )
-        outputs["label_roi"] = fname_presuffix(
-            f, prefix=os.path.join("label", "catROI_"), suffix=".xml", use_ext=False
-        )
+        if self.inputs.surface_and_thickness_estimation:
+            outputs["label_rois"] = fname_presuffix(
+                f, prefix=os.path.join("label", "catROIs_"), suffix=".xml", use_ext=False
+            )
+            
 
         return outputs