diff --git a/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py b/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
index 16a03362da41b1d1ac31f2bae2b4bc4198d6c2f9..2fee54bc06427cc099af900c894bb6d015e753a4 100644
--- a/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
+++ b/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
@@ -7,8 +7,8 @@ import pandas as pd
 import uuid
 
 from extensions.chaeo.util import autonumber_new_file
-from extensions.ilastik.models import IlastikObjectClassifierModel
-from model_server.accessors import generate_file_accessor
+from extensions.ilastik.models import IlastikObjectClassifierFromSegmentationModel
+from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
 
 def get_dataset_info(h5, lane=0):
     lns = f'{lane:04d}'
@@ -145,13 +145,17 @@ if __name__ == '__main__':
     template_ilp = root / 'exp0014/template_obj.ilp'
     where_patch_stack = root / 'exp0009/output/labeled_patches-20231016-0002'
 
-    new_ilp = generate_ilastik_object_classifier(
-        template_ilp,
-        where_patch_stack,
-    )
+    # new_ilp = generate_ilastik_object_classifier(
+    #     template_ilp,
+    #     where_patch_stack,
+    # )
 
-    train_zstack = generate_file_accessor(where_patch_stack / 'zstack_train_raw.tif')
-    mod = IlastikObjectClassifierModel({'project_file': new_ilp})
+    train_zstack_raw = generate_file_accessor(where_patch_stack / 'zstack_train_raw.tif')
+    train_zstack_mask = generate_file_accessor(where_patch_stack / 'zstack_train_mask.tif')
 
+    new_ilp = root / 'exp0014/test_obj_from_seg.ilp'
+    mod = IlastikObjectClassifierFromSegmentationModel({'project_file': new_ilp})
 
+    result = mod.infer(train_zstack_raw, train_zstack_mask)
+    write_accessor_data_to_file(where_patch_stack / 'result.tif', result)
     print(mod.project_file_abspath)
\ No newline at end of file
diff --git a/extensions/ilastik/models.py b/extensions/ilastik/models.py
index 47c81abb9151da76dfd21b0d6cf3356031a983ef..fb7ea566e0d1f773e3d64c47275b643ab1cfb875 100644
--- a/extensions/ilastik/models.py
+++ b/extensions/ilastik/models.py
@@ -77,13 +77,13 @@ class IlastikPixelClassifierModel(IlastikImageToImageModel):
         )
         return InMemoryDataAccessor(data=yxcz), {'success': True}
 
-class IlastikObjectClassifierModel(IlastikImageToImageModel):
-    model_id = 'ilastik_object_classification'
+class IlastikObjectClassifierFromPixelPredictionsModel(IlastikImageToImageModel):
+    model_id = 'ilastik_object_classification_from_pixel_predictions'
 
     @staticmethod
     def get_workflow():
-        from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflow
-        return ObjectClassificationWorkflow
+        from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflowPrediction
+        return ObjectClassificationWorkflowPrediction
 
     def infer(self, input_img: GenericImageDataAccessor, pxmap_img: GenericImageDataAccessor) -> (np.ndarray, dict):
         tagged_input_data = vigra.taggedView(input_img.data, 'yxcz')
@@ -106,3 +106,35 @@ class IlastikObjectClassifierModel(IlastikImageToImageModel):
             [0, 1, 2, 3]
         )
         return InMemoryDataAccessor(data=yxcz), {'success': True}
+
+
+class IlastikObjectClassifierFromSegmentationModel(IlastikImageToImageModel):
+    model_id = 'ilastik_object_classification_from_segmentation'
+
+    @staticmethod
+    def get_workflow():
+        from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflowBinary
+        return ObjectClassificationWorkflowBinary
+
+    def infer(self, input_img: GenericImageDataAccessor, segmentation_img: GenericImageDataAccessor) -> (np.ndarray, dict):
+        assert segmentation_img.is_mask()
+        tagged_input_data = vigra.taggedView(input_img.data, 'yxcz')
+        tagged_seg_data = vigra.taggedView(segmentation_img.data, 'yxcz')
+
+        dsi = [
+            {
+                'Raw Data': self.PreloadedArrayDatasetInfo(preloaded_array=tagged_input_data),
+                'Segmentation Image': self.PreloadedArrayDatasetInfo(preloaded_array=tagged_seg_data),
+            }
+        ]
+
+        obmaps = self.shell.workflow.batchProcessingApplet.run_export(dsi, export_to_array=True) # [z x h x w x n]
+
+        assert (len(obmaps) == 1, 'ilastik generated more than one object map')
+
+        yxcz = np.moveaxis(
+            obmaps[0],
+            [1, 2, 3, 0],
+            [0, 1, 2, 3]
+        )
+        return InMemoryDataAccessor(data=yxcz), {'success': True}
diff --git a/extensions/ilastik/router.py b/extensions/ilastik/router.py
index 155d8fa057e22c6709fa683b39c9d6c396ebc90b..3287dc474e63caa00c34b66d01abd41493fe9cda 100644
--- a/extensions/ilastik/router.py
+++ b/extensions/ilastik/router.py
@@ -3,7 +3,7 @@ from fastapi import APIRouter, HTTPException
 from model_server.session import Session
 from model_server.validators import  validate_workflow_inputs
 
-from extensions.ilastik.models import IlastikImageToImageModel, IlastikPixelClassifierModel, IlastikObjectClassifierModel
+from extensions.ilastik.models import IlastikImageToImageModel, IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel
 from model_server.models import ParameterExpectedError
 from extensions.ilastik.workflows import infer_px_then_ob_model
 
@@ -46,7 +46,7 @@ def load_ilastik_pixel_classification_model(project_file: str, duplicate: bool =
 
 @router.put('/object_classification/load/')
 def load_ilastik_object_classification_model(project_file: str, duplicate: bool = True) -> dict:
-    return load_ilastik_model(IlastikObjectClassifierModel, project_file, duplicate=duplicate)
+    return load_ilastik_model(IlastikObjectClassifierFromPixelPredictionsModel, project_file, duplicate=duplicate)
 
 @router.put('/pixel_then_object_classification/infer')
 def infer_px_then_ob_maps(px_model_id: str, ob_model_id: str, input_filename: str, channel: int = None) -> dict:
diff --git a/extensions/ilastik/tests/test_ilastik.py b/extensions/ilastik/tests/test_ilastik.py
index 555d8286c46121e409dab94fa31d2c75ac5b9a37..217b00c9feb0a1f3a0f833c6d9242477680ead27 100644
--- a/extensions/ilastik/tests/test_ilastik.py
+++ b/extensions/ilastik/tests/test_ilastik.py
@@ -5,7 +5,7 @@ import numpy as np
 
 import conf.testing
 from model_server.accessors import CziImageFileAccessor, InMemoryDataAccessor, write_accessor_data_to_file
-from extensions.ilastik.models import IlastikObjectClassifierModel, IlastikPixelClassifierModel
+from extensions.ilastik.models import IlastikObjectClassifierFromPixelPredictionsModel, IlastikPixelClassifierModel
 from model_server.workflows import infer_image_to_image
 from tests.test_api import TestServerBaseClass
 
@@ -83,7 +83,7 @@ class TestIlastikPixelClassification(unittest.TestCase):
     def test_run_object_classifier(self):
         self.test_run_pixel_classifier()
         fp = conf.testing.czifile['path']
-        model = IlastikObjectClassifierModel(
+        model = IlastikObjectClassifierFromPixelPredictionsModel(
             {'project_file': conf.testing.ilastik['object_classifier']}
         )
         objmap, _ = model.infer(self.mono_image, self.pxmap)
@@ -167,7 +167,7 @@ class TestIlastikOverApi(TestServerBaseClass):
         resp_list = requests.get(self.uri + 'models')
         self.assertEqual(resp_list.status_code, 200)
         rj = resp_list.json()
-        self.assertEqual(rj[model_id]['class'], 'IlastikObjectClassifierModel')
+        self.assertEqual(rj[model_id]['class'], 'IlastikObjectClassifierFromPixelPredictionsModel')
         return model_id
 
     def test_ilastik_infer_pixel_probability(self):
@@ -199,3 +199,5 @@ class TestIlastikOverApi(TestServerBaseClass):
             }
         )
         self.assertEqual(resp_infer.status_code, 200, resp_infer.content.decode())
+
+    # TODO: test IlastikObjectClassifierFromSegmentationModel when a test model is complete
\ No newline at end of file
diff --git a/extensions/ilastik/workflows.py b/extensions/ilastik/workflows.py
index 45763ad7415600e6b6dc441c33dee4c0cc8dc647..1f622b676d30f8df6b019974fd4a22c3758a4f07 100644
--- a/extensions/ilastik/workflows.py
+++ b/extensions/ilastik/workflows.py
@@ -4,7 +4,7 @@ Implementation of image analysis work behind API endpoints, without knowledge of
 from pathlib import Path
 from typing import Dict
 
-from extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierModel
+from extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel
 from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
 from model_server.workflows import Timer
 
@@ -23,7 +23,7 @@ class WorkflowRunRecord(BaseModel):
 def infer_px_then_ob_model(
         fpi: Path,
         px_model: IlastikPixelClassifierModel,
-        ob_model: IlastikObjectClassifierModel,
+        ob_model: IlastikObjectClassifierFromPixelPredictionsModel,
         where_output: Path,
         **kwargs
 ) -> WorkflowRunRecord:
@@ -38,7 +38,7 @@ def infer_px_then_ob_model(
     :return:
     """
     assert isinstance(px_model, IlastikPixelClassifierModel)
-    assert isinstance(ob_model, IlastikObjectClassifierModel)
+    assert isinstance(ob_model, IlastikObjectClassifierFromPixelPredictionsModel)
 
     ti = Timer()
     ch = kwargs.get('channel')