diff --git a/conf/__init__.py b/model_server/base/__init__.py
similarity index 100%
rename from conf/__init__.py
rename to model_server/base/__init__.py
diff --git a/model_server/accessors.py b/model_server/base/accessors.py
similarity index 99%
rename from model_server/accessors.py
rename to model_server/base/accessors.py
index e634f2f07d7be338d9d7e6526021190001e2d839..712bbacf19296201775e1d7d49ef45b356ac1d1d 100644
--- a/model_server/accessors.py
+++ b/model_server/base/accessors.py
@@ -8,7 +8,7 @@ from skimage.io import imread
 import czifile
 import tifffile
 
-from model_server.process import is_mask
+from model_server.base.process import is_mask
 
 class GenericImageDataAccessor(ABC):
 
diff --git a/model_server/api.py b/model_server/base/api.py
similarity index 83%
rename from model_server/api.py
rename to model_server/base/api.py
index bc9a57fe79288c2f63ebf79e055bf5785be2f823..b73175d482b4d5f352f5ca7f8b87b8104d9dccb1 100644
--- a/model_server/api.py
+++ b/model_server/base/api.py
@@ -1,16 +1,14 @@
 from fastapi import FastAPI, HTTPException
 
-from model_server.models import DummyImageToImageModel
-from model_server.session import Session, InvalidPathError
-from model_server.validators import validate_workflow_inputs
-from model_server.workflows import infer_image_to_image
-from extensions.ilastik.workflows import infer_px_then_ob_model
+from model_server.base.models import DummyImageToImageModel
+from model_server.base.session import Session, InvalidPathError
+from model_server.base.validators import validate_workflow_inputs
+from model_server.base.workflows import infer_image_to_image
 
 app = FastAPI(debug=True)
 session = Session()
 
-import extensions.ilastik.router
-app.include_router(extensions.ilastik.router.router)
+app.include_router(model_server.extensions.ilastik.router.router)
 
 @app.on_event("startup")
 def startup():
diff --git a/model_server/batch.py b/model_server/base/batch.py
similarity index 100%
rename from model_server/batch.py
rename to model_server/base/batch.py
diff --git a/model_server/czi_util.py b/model_server/base/czi_util.py
similarity index 97%
rename from model_server/czi_util.py
rename to model_server/base/czi_util.py
index 4e97310ab247abbb2cc4e0f696105d40573cea6b..6c8c5db8c27eeefea2e4bad32122d34f306bf16e 100644
--- a/model_server/czi_util.py
+++ b/model_server/base/czi_util.py
@@ -5,7 +5,7 @@ import czifile
 import numpy as np
 import pandas as pd
 
-from model_server.accessors import InMemoryDataAccessor
+from model_server.base.accessors import InMemoryDataAccessor
 
 
 def dump_czi_subblock_table(czif: czifile.CziFile, where: Path):
diff --git a/model_server/models.py b/model_server/base/models.py
similarity index 95%
rename from model_server/models.py
rename to model_server/base/models.py
index 4285b49c4d8a55bb3b77135d9e578546ea851d4c..014957be8ada6bc059a9da7852e561a6ad4e63b0 100644
--- a/model_server/models.py
+++ b/model_server/base/models.py
@@ -1,10 +1,9 @@
 from abc import ABC, abstractmethod
 from math import floor
-import os
 
 import numpy as np
 
-from model_server.accessors import GenericImageDataAccessor, InMemoryDataAccessor
+from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor
 
 
 class Model(ABC):
diff --git a/model_server/process.py b/model_server/base/process.py
similarity index 100%
rename from model_server/process.py
rename to model_server/base/process.py
diff --git a/model_server/session.py b/model_server/base/session.py
similarity index 94%
rename from model_server/session.py
rename to model_server/base/session.py
index 061711a5654a4b80d95209a422461aa406abc7b1..1b91b12a570ebd807cc89bf0b4e3a78771a524c9 100644
--- a/model_server/session.py
+++ b/model_server/base/session.py
@@ -5,10 +5,9 @@ from pathlib import Path
 from time import strftime, localtime
 from typing import Dict
 
-import conf.defaults
-from model_server.models import Model
-from model_server.share import SharedImageDirectory
-from model_server.workflows import WorkflowRunRecord
+import model_server.conf.defaults
+from model_server.base.models import Model
+from model_server.base.workflows import WorkflowRunRecord
 
 def create_manifest_json():
     pass
@@ -51,13 +50,13 @@ class Session(object):
         :return: dictionary of session paths
         """
         if root is None:
-            root_path = Path(conf.defaults.root)
+            root_path = Path(model_server.conf.defaults.root)
         else:
             root_path = Path(root)
         sid = Session.create_session_id(root_path)
         paths = {'root': root_path}
         for pk in ['inbound_images', 'outbound_images', 'logs']:
-            pa = root_path / sid / conf.defaults.subdirectories[pk]
+            pa = root_path / sid / model_server.conf.defaults.subdirectories[pk]
             paths[pk] = pa
             try:
                 pa.mkdir(parents=True, exist_ok=True)
diff --git a/model_server/share.py b/model_server/base/share.py
similarity index 100%
rename from model_server/share.py
rename to model_server/base/share.py
diff --git a/model_server/util.py b/model_server/base/util.py
similarity index 97%
rename from model_server/util.py
rename to model_server/base/util.py
index a88d5e1d0f5b49644372b82c39887bcc28e08f42..0d35d3c4bf267c95bc8e9527db473407f75f9c1b 100644
--- a/model_server/util.py
+++ b/model_server/base/util.py
@@ -6,8 +6,8 @@ from typing import List
 
 import pandas as pd
 
-from model_server.accessors import InMemoryDataAccessor, write_accessor_data_to_file
-from model_server.models import Model
+from model_server.base.accessors import InMemoryDataAccessor, write_accessor_data_to_file
+from model_server.base.models import Model
 
 def autonumber_new_directory(where: str, prefix: str) -> str:
     """
diff --git a/model_server/validators.py b/model_server/base/validators.py
similarity index 91%
rename from model_server/validators.py
rename to model_server/base/validators.py
index 56e251bc0bceee9c84d4254e746459d0bcf6c775..b4142b0f6ef99904d3bdb13fd7c5494e5df4fe18 100644
--- a/model_server/validators.py
+++ b/model_server/base/validators.py
@@ -1,6 +1,6 @@
 from fastapi import HTTPException
 
-from model_server.session import Session
+from model_server.base.session import Session
 
 session = Session()
 
diff --git a/model_server/workflows.py b/model_server/base/workflows.py
similarity index 92%
rename from model_server/workflows.py
rename to model_server/base/workflows.py
index c81d2afdc3e59e8153e1710524e286961ecd7746..e3eedb68d9ed2574180e47c1a16e65da5b50372e 100644
--- a/model_server/workflows.py
+++ b/model_server/base/workflows.py
@@ -5,8 +5,8 @@ from pathlib import Path
 from time import perf_counter
 from typing import Dict
 
-from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
-from model_server.models import Model
+from model_server.base.accessors import generate_file_accessor, write_accessor_data_to_file
+from model_server.base.models import Model
 
 from pydantic import BaseModel
 
diff --git a/extensions/__init__.py b/model_server/conf/__init__.py
similarity index 100%
rename from extensions/__init__.py
rename to model_server/conf/__init__.py
diff --git a/conf/defaults.py b/model_server/conf/defaults.py
similarity index 100%
rename from conf/defaults.py
rename to model_server/conf/defaults.py
diff --git a/conf/testing.py b/model_server/conf/testing.py
similarity index 100%
rename from conf/testing.py
rename to model_server/conf/testing.py
diff --git a/extensions/chaeo/__init__.py b/model_server/extensions/__init__.py
similarity index 100%
rename from extensions/chaeo/__init__.py
rename to model_server/extensions/__init__.py
diff --git a/extensions/chaeo/batch_jobs/__init__.py b/model_server/extensions/chaeo/__init__.py
similarity index 100%
rename from extensions/chaeo/batch_jobs/__init__.py
rename to model_server/extensions/chaeo/__init__.py
diff --git a/extensions/chaeo/accessors.py b/model_server/extensions/chaeo/accessors.py
similarity index 97%
rename from extensions/chaeo/accessors.py
rename to model_server/extensions/chaeo/accessors.py
index 82f726ba86fddf817583e349027a83b134d483e2..0e6cfdc07bba6479df9b738afa880612f0e244e8 100644
--- a/extensions/chaeo/accessors.py
+++ b/model_server/extensions/chaeo/accessors.py
@@ -2,7 +2,7 @@ from pathlib import Path
 
 import numpy as np
 
-from model_server.accessors import generate_file_accessor, InMemoryDataAccessor
+from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor
 
 class MonoPatchStack(InMemoryDataAccessor):
 
diff --git a/extensions/chaeo/annotators.py b/model_server/extensions/chaeo/annotators.py
similarity index 97%
rename from extensions/chaeo/annotators.py
rename to model_server/extensions/chaeo/annotators.py
index eb4996c30a1f23de8731a4e74ac4d0ba88ef5aa0..050123a496291668794c13553c23a31b3b559def 100644
--- a/extensions/chaeo/annotators.py
+++ b/model_server/extensions/chaeo/annotators.py
@@ -1,7 +1,7 @@
 import numpy as np
 from PIL import Image, ImageDraw, ImageFont
 
-from model_server.process import rescale
+from model_server.base.process import rescale
 
 def draw_boxes_on_2d_image(yx_img, boxes, **kwargs):
     pilimg = Image.fromarray(np.copy(yx_img))  # drawing modifies array in-place
diff --git a/extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py b/model_server/extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py
similarity index 85%
rename from extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py
rename to model_server/extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py
index 072f037e2590e13b4fa0a981e499c80cd48a1c6f..9e4e80168a9931dad12224d9ddc34ca2a7de2d17 100644
--- a/extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py
+++ b/model_server/extensions/chaeo/batch_jobs/20230805_kristineberg_PA.py
@@ -1,10 +1,10 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
-from model_server.accessors import CziImageFileAccessor, write_accessor_data_to_file, InMemoryDataAccessor
-from model_server.process import rescale
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.accessors import CziImageFileAccessor, write_accessor_data_to_file, InMemoryDataAccessor
+from model_server.base.process import rescale
 
 
 def export_single_channel_tif_from_multichannel_czi(input_file_path, output_folder_path, channel, **kwargs):
diff --git a/extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py b/model_server/extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py
similarity index 86%
rename from extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py
rename to model_server/extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py
index 3fbe1e081074af5a5f57e4de3bdb5528e690edf9..cfdd0531f4744822382cbe6df83a52e44aa3a9cd 100644
--- a/extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py
+++ b/model_server/extensions/chaeo/batch_jobs/20230807_kristineberg_spiked.py
@@ -1,8 +1,8 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 # TODO: support list-comp of single image sequence in multiple locations
 
diff --git a/extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py b/model_server/extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py
similarity index 92%
rename from extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py
rename to model_server/extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py
index 78c7f06ce358ad265dd0e8e12aec154a44b54d7c..e0929874f5fc1fc272fa7be9ff99e45da20b21b0 100644
--- a/extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231008_Bilbao_PA.py
@@ -2,9 +2,9 @@ from pathlib import Path
 
 import pandas as pd
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 def write_ecotaxa_tsv(patches_csv_path, where):
     # import patch output table
diff --git a/extensions/chaeo/batch_jobs/20231023_Porto_4ch.py b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_4ch.py
similarity index 82%
rename from extensions/chaeo/batch_jobs/20231023_Porto_4ch.py
rename to model_server/extensions/chaeo/batch_jobs/20231023_Porto_4ch.py
index f3962b11330fcf478e9815beafd56b486a9da3a9..a421c791082d5bc7440d2458742d6e6659377dfd 100644
--- a/extensions/chaeo/batch_jobs/20231023_Porto_4ch.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_4ch.py
@@ -2,12 +2,12 @@ from pathlib import Path
 
 import czifile
 
-from model_server.accessors import write_accessor_data_to_file
-from model_server.czi_util import get_accessor_from_multiposition_czi
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.ecotaxa import write_ecotaxa_tsv_chunked_subdirectories
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.accessors import write_accessor_data_to_file
+from model_server.base.czi_util import get_accessor_from_multiposition_czi
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.ecotaxa import write_ecotaxa_tsv_chunked_subdirectories
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 if __name__ == '__main__':
diff --git a/extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py
similarity index 84%
rename from extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py
rename to model_server/extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py
index ebfec6cea60bd3a92c0930593919ace67c576ef9..abc8eeecb27d640de21222a8b419dcb7f669bff1 100644
--- a/extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_EtOHfixed.py
@@ -1,9 +1,9 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.ecotaxa import write_ecotaxa_tsv
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.ecotaxa import write_ecotaxa_tsv
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 if __name__ == '__main__':
diff --git a/extensions/chaeo/batch_jobs/20231023_Porto_Live.py b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_Live.py
similarity index 84%
rename from extensions/chaeo/batch_jobs/20231023_Porto_Live.py
rename to model_server/extensions/chaeo/batch_jobs/20231023_Porto_Live.py
index 8a8c8b641586c5e6097a312f95e45d07dc92dd79..e458f7a362d4f7f85aee730e79b78318b556782b 100644
--- a/extensions/chaeo/batch_jobs/20231023_Porto_Live.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231023_Porto_Live.py
@@ -1,9 +1,9 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.ecotaxa import write_ecotaxa_tsv
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.ecotaxa import write_ecotaxa_tsv
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 if __name__ == '__main__':
diff --git a/extensions/chaeo/batch_jobs/20231026_Porto.py b/model_server/extensions/chaeo/batch_jobs/20231026_Porto.py
similarity index 84%
rename from extensions/chaeo/batch_jobs/20231026_Porto.py
rename to model_server/extensions/chaeo/batch_jobs/20231026_Porto.py
index 3e31a859be55825a4b59f1b4be47741ab8f67413..17b83355d9855d32182dc20c2b30c48523a40ecd 100644
--- a/extensions/chaeo/batch_jobs/20231026_Porto.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231026_Porto.py
@@ -1,9 +1,9 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.ecotaxa import write_ecotaxa_tsv
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.ecotaxa import write_ecotaxa_tsv
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 if __name__ == '__main__':
diff --git a/extensions/chaeo/batch_jobs/20231028_Porto_PA.py b/model_server/extensions/chaeo/batch_jobs/20231028_Porto_PA.py
similarity index 83%
rename from extensions/chaeo/batch_jobs/20231028_Porto_PA.py
rename to model_server/extensions/chaeo/batch_jobs/20231028_Porto_PA.py
index 7e02c856ed24e7cb9e727c12f02dcb3687cc8e22..4ae729d10601f0020cc4e85fdbff8ca2ffa9e785 100644
--- a/extensions/chaeo/batch_jobs/20231028_Porto_PA.py
+++ b/model_server/extensions/chaeo/batch_jobs/20231028_Porto_PA.py
@@ -1,9 +1,9 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.ecotaxa import write_ecotaxa_tsv_chunked_subdirectories
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.ecotaxa import write_ecotaxa_tsv_chunked_subdirectories
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 if __name__ == '__main__':
diff --git a/extensions/chaeo/conf/__init__.py b/model_server/extensions/chaeo/batch_jobs/__init__.py
similarity index 100%
rename from extensions/chaeo/conf/__init__.py
rename to model_server/extensions/chaeo/batch_jobs/__init__.py
diff --git a/extensions/chaeo/batch_jobs/coloring_book.py b/model_server/extensions/chaeo/batch_jobs/coloring_book.py
similarity index 86%
rename from extensions/chaeo/batch_jobs/coloring_book.py
rename to model_server/extensions/chaeo/batch_jobs/coloring_book.py
index 7e32ad74de366ffd1202b8d365d776315ab92b59..a3a9c5268a12cac204897d9ecd5dba4d8a648ad6 100644
--- a/extensions/chaeo/batch_jobs/coloring_book.py
+++ b/model_server/extensions/chaeo/batch_jobs/coloring_book.py
@@ -7,9 +7,9 @@ from skimage.measure import label, regionprops_table
 
 import tifffile
 
-from extensions.chaeo.accessors import MonoPatchStack
-from extensions.ilastik.models import IlastikPixelClassifierModel
-from model_server.accessors import write_accessor_data_to_file, InMemoryDataAccessor
+from model_server.extensions.chaeo.accessors import MonoPatchStack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.accessors import write_accessor_data_to_file, InMemoryDataAccessor
 
 if __name__ == '__main__':
     root = Path('c:/Users/rhodes/projects/proj0011-plankton-seg/exp0024')
diff --git a/extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py b/model_server/extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py
similarity index 82%
rename from extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py
rename to model_server/extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py
index 93a9cf6f868543d6bafa56b7ed6daa7dc0681550..efa8a8e7bc5fe0e3091276095d79a2bc4eda8211 100644
--- a/extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py
+++ b/model_server/extensions/chaeo/batch_jobs/proj0004-exp0038-fixed.py
@@ -1,8 +1,8 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.workflows import export_patches_from_multichannel_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.workflows import export_patches_from_multichannel_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 if __name__ == '__main__':
     where_czi = 'z:/rhodes/projects/proj0004-marine-photoactivation/data/exp0038/AutoMic/20230906-163415/Selection'
diff --git a/extensions/chaeo/examples/__init__.py b/model_server/extensions/chaeo/conf/__init__.py
similarity index 100%
rename from extensions/chaeo/examples/__init__.py
rename to model_server/extensions/chaeo/conf/__init__.py
diff --git a/extensions/chaeo/conf/testing.py b/model_server/extensions/chaeo/conf/testing.py
similarity index 100%
rename from extensions/chaeo/conf/testing.py
rename to model_server/extensions/chaeo/conf/testing.py
diff --git a/extensions/chaeo/ecotaxa.py b/model_server/extensions/chaeo/ecotaxa.py
similarity index 100%
rename from extensions/chaeo/ecotaxa.py
rename to model_server/extensions/chaeo/ecotaxa.py
diff --git a/extensions/chaeo/tests/__init__.py b/model_server/extensions/chaeo/examples/__init__.py
similarity index 100%
rename from extensions/chaeo/tests/__init__.py
rename to model_server/extensions/chaeo/examples/__init__.py
diff --git a/extensions/chaeo/examples/batch_obj_cla.py b/model_server/extensions/chaeo/examples/batch_obj_cla.py
similarity index 74%
rename from extensions/chaeo/examples/batch_obj_cla.py
rename to model_server/extensions/chaeo/examples/batch_obj_cla.py
index ec230d79587c70d748ac5777de21b1501ce51fd3..7471034f7091efec74c2cbf6230df385960d2ec9 100644
--- a/extensions/chaeo/examples/batch_obj_cla.py
+++ b/model_server/extensions/chaeo/examples/batch_obj_cla.py
@@ -1,10 +1,10 @@
 from pathlib import Path
 
-from conf.testing import output_path
-from model_server.util import autonumber_new_directory, get_matching_files, loop_workflow
-from extensions.chaeo.models import PatchStackObjectClassifier
-from extensions.chaeo.workflows import infer_object_map_from_zstack
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.conf.testing import output_path
+from model_server.base.util import autonumber_new_directory, get_matching_files, loop_workflow
+from model_server.extensions.chaeo.models import PatchStackObjectClassifier
+from model_server.extensions.chaeo.workflows import infer_object_map_from_zstack
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 
 
diff --git a/extensions/chaeo/examples/export_patch_focus_metrics.py b/model_server/extensions/chaeo/examples/export_patch_focus_metrics.py
similarity index 91%
rename from extensions/chaeo/examples/export_patch_focus_metrics.py
rename to model_server/extensions/chaeo/examples/export_patch_focus_metrics.py
index 31258117785c6d26ea0bc48f2110432d43467c62..7e1279948ea90b10463f19d50b0d8412e605d12c 100644
--- a/extensions/chaeo/examples/export_patch_focus_metrics.py
+++ b/model_server/extensions/chaeo/examples/export_patch_focus_metrics.py
@@ -3,15 +3,13 @@ import re
 from time import localtime, strftime
 from typing import Dict
 
-import numpy as np
 import pandas as pd
-from skimage.filters import gaussian, sobel
 
-from extensions.ilastik.models import IlastikPixelClassifierModel
-from extensions.chaeo.products import export_3d_patches_with_focus_metrics, export_patches_from_zstack
-from extensions.chaeo.zmask import build_zmask_from_object_mask
-from model_server.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
-from model_server.workflows import Timer
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.extensions.chaeo.products import export_3d_patches_with_focus_metrics, export_patches_from_zstack
+from model_server.extensions.chaeo.zmask import build_zmask_from_object_mask
+from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
+from model_server.base.workflows import Timer
 
 
 def export_patch_focus_metrics_from_multichannel_zstack(
diff --git a/extensions/chaeo/examples/label_patches.py b/model_server/extensions/chaeo/examples/label_patches.py
similarity index 81%
rename from extensions/chaeo/examples/label_patches.py
rename to model_server/extensions/chaeo/examples/label_patches.py
index b84b1690202a039e0cbdd91733c75b9069c2b619..54b242eea0e7b0c25eb2ea8f09b249f65fb94100 100644
--- a/extensions/chaeo/examples/label_patches.py
+++ b/model_server/extensions/chaeo/examples/label_patches.py
@@ -1,7 +1,7 @@
 from pathlib import Path
 
-from model_server.util import autonumber_new_directory
-from extensions.chaeo.workflows import transfer_ecotaxa_labels_to_patch_stacks
+from model_server.base.util import autonumber_new_directory
+from model_server.extensions.chaeo.workflows import transfer_ecotaxa_labels_to_patch_stacks
 
 if __name__ == '__main__':
     root = Path('c:/Users/rhodes/projects/proj0011-plankton-seg/exp0009/output')
diff --git a/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py b/model_server/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
similarity index 93%
rename from extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
rename to model_server/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
index b6b2941b2f091d71b0ebc22f1d21ac7164de0e01..ae30674583dee43e234688ffc985da0049e939fd 100644
--- a/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
+++ b/model_server/extensions/chaeo/examples/transfer_labels_to_ilastik_object_classifier.py
@@ -3,9 +3,9 @@ import numpy as np
 import pandas as pd
 import skimage
 
-from extensions.chaeo.accessors import MonoPatchStackFromFile
-from extensions.chaeo.models import generate_ilastik_object_classifier, PatchStackObjectClassifier
-from model_server.accessors import GenericImageDataAccessor, write_accessor_data_to_file
+from model_server.extensions.chaeo.accessors import MonoPatchStackFromFile
+from model_server.extensions.chaeo.models import generate_ilastik_object_classifier, PatchStackObjectClassifier
+from model_server.base.accessors import GenericImageDataAccessor, write_accessor_data_to_file
 
 
 def compare_object_maps(truth: GenericImageDataAccessor, inferred: GenericImageDataAccessor) -> pd.DataFrame:
diff --git a/extensions/chaeo/h5util.py b/model_server/extensions/chaeo/h5util.py
similarity index 100%
rename from extensions/chaeo/h5util.py
rename to model_server/extensions/chaeo/h5util.py
diff --git a/extensions/chaeo/models.py b/model_server/extensions/chaeo/models.py
similarity index 96%
rename from extensions/chaeo/models.py
rename to model_server/extensions/chaeo/models.py
index d488a699eb70c7ce17220c9dc2c3133ea6c0803a..7f8c08bdcd490f8d7803583c3fe4b87c6e2d221d 100644
--- a/extensions/chaeo/models.py
+++ b/model_server/extensions/chaeo/models.py
@@ -6,8 +6,8 @@ import numpy as np
 import skimage
 import vigra
 
-from extensions.chaeo.accessors import MonoPatchStack, MonoPatchStackFromFile
-from extensions.ilastik.models import IlastikObjectClassifierFromSegmentationModel
+from model_server.extensions.chaeo.accessors import MonoPatchStack, MonoPatchStackFromFile
+from model_server.extensions.ilastik.models import IlastikObjectClassifierFromSegmentationModel
 
 
 class PatchStackObjectClassifier(IlastikObjectClassifierFromSegmentationModel):
diff --git a/extensions/chaeo/process.py b/model_server/extensions/chaeo/process.py
similarity index 97%
rename from extensions/chaeo/process.py
rename to model_server/extensions/chaeo/process.py
index 884cc3feda2703b1848e0cf86ae995d3144dc973..e41578eee35f7849e7d714326c59ca68e34042b0 100644
--- a/extensions/chaeo/process.py
+++ b/model_server/extensions/chaeo/process.py
@@ -1,7 +1,7 @@
 import numpy as np
 import skimage
 
-from model_server.process import is_mask
+from model_server.base.process import is_mask
 
 def mask_largest_object(
         img: np.ndarray,
diff --git a/extensions/chaeo/products.py b/model_server/extensions/chaeo/products.py
similarity index 97%
rename from extensions/chaeo/products.py
rename to model_server/extensions/chaeo/products.py
index 0f1ac9765728c182914d59b17d87ae6598a5271c..b1b1dc1f0fd92af2d8d4789457788c46ec513370 100644
--- a/extensions/chaeo/products.py
+++ b/model_server/extensions/chaeo/products.py
@@ -9,10 +9,10 @@ from skimage.io import imsave
 from skimage.measure import find_contours, shannon_entropy
 from tifffile import imwrite
 
-from extensions.chaeo.accessors import MonoPatchStack, Multichannel3dPatchStack
-from extensions.chaeo.annotators import draw_box_on_patch, draw_contours_on_patch
-from model_server.accessors import GenericImageDataAccessor, InMemoryDataAccessor
-from model_server.process import pad, rescale, resample_to_8bit
+from model_server.extensions.chaeo.accessors import MonoPatchStack, Multichannel3dPatchStack
+from model_server.extensions.chaeo.annotators import draw_box_on_patch, draw_contours_on_patch
+from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor
+from model_server.base.process import pad, rescale, resample_to_8bit
 
 def _make_rgb(zs):
     h, w, c, nz = zs.shape
diff --git a/extensions/chaeo/router.py b/model_server/extensions/chaeo/router.py
similarity index 82%
rename from extensions/chaeo/router.py
rename to model_server/extensions/chaeo/router.py
index 208aa7b9ff3e0a79b4bcdfa7d3742cd7bfa5c3e1..decf71c6852b41fe2295776f14ba43d2ca4559b8 100644
--- a/extensions/chaeo/router.py
+++ b/model_server/extensions/chaeo/router.py
@@ -1,8 +1,8 @@
-from fastapi import APIRouter, HTTPException
+from fastapi import APIRouter
 
-from extensions.chaeo.workflows import infer_object_map_from_zstack
-from model_server.session import Session
-from model_server.validators import validate_workflow_inputs
+from model_server.extensions.chaeo.workflows import infer_object_map_from_zstack
+from model_server.base.session import Session
+from model_server.base.validators import validate_workflow_inputs
 
 router = APIRouter(
     prefix='/chaeo',
diff --git a/extensions/ilastik/__init__.py b/model_server/extensions/chaeo/tests/__init__.py
similarity index 100%
rename from extensions/ilastik/__init__.py
rename to model_server/extensions/chaeo/tests/__init__.py
diff --git a/extensions/chaeo/tests/test_accessors.py b/model_server/extensions/chaeo/tests/test_accessors.py
similarity index 90%
rename from extensions/chaeo/tests/test_accessors.py
rename to model_server/extensions/chaeo/tests/test_accessors.py
index c2194581a7e41aba1269b3eeb3368b434bc4d718..d7986879407e8114ec218be125e71033acf34f09 100644
--- a/extensions/chaeo/tests/test_accessors.py
+++ b/model_server/extensions/chaeo/tests/test_accessors.py
@@ -2,8 +2,8 @@ import unittest
 
 import numpy as np
 
-from conf.testing import monozstackmask
-from extensions.chaeo.accessors import MonoPatchStack, MonoPatchStackFromFile, Multichannel3dPatchStack
+from model_server.conf.testing import monozstackmask
+from model_server.extensions.chaeo.accessors import MonoPatchStack, MonoPatchStackFromFile, Multichannel3dPatchStack
 
 
 
@@ -41,7 +41,7 @@ class TestCziImageFileAccess(unittest.TestCase):
         self.assertEqual(acc.fpath, monozstackmask['path'])
 
     def test_raises_filenotfound(self):
-        from extensions.chaeo.accessors import FileNotFoundError
+        from model_server.extensions.chaeo.accessors import FileNotFoundError
         with self.assertRaises(FileNotFoundError):
             acc = MonoPatchStackFromFile('c:/fake/file/name.tif')
 
diff --git a/extensions/chaeo/tests/test_process.py b/model_server/extensions/chaeo/tests/test_process.py
similarity index 93%
rename from extensions/chaeo/tests/test_process.py
rename to model_server/extensions/chaeo/tests/test_process.py
index ad590274520e77ba45d1d377c0da25b935078920..79e6883c5f7099869b9b9901474c5c4cb833d158 100644
--- a/extensions/chaeo/tests/test_process.py
+++ b/model_server/extensions/chaeo/tests/test_process.py
@@ -2,7 +2,7 @@ import unittest
 
 import numpy as np
 
-from extensions.chaeo.process import mask_largest_object
+from model_server.extensions.chaeo.process import mask_largest_object
 
 class TestMaskLargestObject(unittest.TestCase):
     def test_mask_largest_touching_object(self):
diff --git a/extensions/chaeo/tests/test_zstack.py b/model_server/extensions/chaeo/tests/test_zstack.py
similarity index 90%
rename from extensions/chaeo/tests/test_zstack.py
rename to model_server/extensions/chaeo/tests/test_zstack.py
index 53cdac09349611a2e801d2a7d96e5a13056da5d6..5a8d62ab0da97eaccb7d05083c78b3df9d9a61d1 100644
--- a/extensions/chaeo/tests/test_zstack.py
+++ b/model_server/extensions/chaeo/tests/test_zstack.py
@@ -2,13 +2,13 @@ import unittest
 
 import numpy as np
 
-from conf.testing import output_path
+from model_server.conf.testing import output_path
 
-from extensions.chaeo.conf.testing import multichannel_zstack, pixel_classifier, pipeline_params
-from extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack
-from extensions.chaeo.zmask import build_zmask_from_object_mask
-from model_server.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
-from extensions.ilastik.models import IlastikPixelClassifierModel
+from model_server.extensions.chaeo.conf.testing import multichannel_zstack, pixel_classifier, pipeline_params
+from model_server.extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack
+from model_server.extensions.chaeo.zmask import build_zmask_from_object_mask
+from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
 
 class TestZStackDerivedDataProducts(unittest.TestCase):
 
@@ -110,7 +110,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase):
             mask_type='boxes',
         )
 
-        from extensions.chaeo.zmask import project_stack_from_focal_points
+        from model_server.extensions.chaeo.zmask import project_stack_from_focal_points
 
         dff = df[df['keeper']]
 
diff --git a/extensions/chaeo/workflows.py b/model_server/extensions/chaeo/workflows.py
similarity index 94%
rename from extensions/chaeo/workflows.py
rename to model_server/extensions/chaeo/workflows.py
index 6adf7a077395f331061754b3061a2f4a2c8af210..c7995acd2e56d13fe62cf4e0d9b90c2312456b81 100644
--- a/extensions/chaeo/workflows.py
+++ b/model_server/extensions/chaeo/workflows.py
@@ -4,22 +4,21 @@ from uuid import uuid4
 
 import numpy as np
 import pandas as pd
-from skimage.measure import label, regionprops_table
+from skimage.measure import label
 from skimage.morphology import dilation
 from sklearn.model_selection import train_test_split
 
-from extensions.chaeo.accessors import MonoPatchStack
-from extensions.chaeo.annotators import draw_boxes_on_3d_image
-from extensions.chaeo.models import PatchStackObjectClassifier
-from extensions.chaeo.process import mask_largest_object
-from extensions.chaeo.products import export_patches_from_zstack, export_patch_masks_from_zstack, export_multichannel_patches_from_zstack, get_patches_from_zmask_meta, get_patch_masks_from_zmask_meta
-from extensions.chaeo.zmask import build_zmask_from_object_mask, project_stack_from_focal_points
-from extensions.ilastik.models import IlastikPixelClassifierModel
-
-from model_server.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
-from model_server.models import Model
-from model_server.process import rescale
-from model_server.workflows import Timer
+from model_server.extensions.chaeo.annotators import draw_boxes_on_3d_image
+from model_server.extensions.chaeo.models import PatchStackObjectClassifier
+from model_server.extensions.chaeo.process import mask_largest_object
+from model_server.extensions.chaeo.products import export_patches_from_zstack, export_patch_masks_from_zstack, export_multichannel_patches_from_zstack, get_patches_from_zmask_meta, get_patch_masks_from_zmask_meta
+from model_server.extensions.chaeo.zmask import build_zmask_from_object_mask, project_stack_from_focal_points
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel
+
+from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file
+from model_server import Model
+from model_server.base.process import rescale
+from model_server.base.workflows import Timer
 
 def get_zmask_meta(
     input_file_path: str,
diff --git a/extensions/chaeo/zmask.py b/model_server/extensions/chaeo/zmask.py
similarity index 99%
rename from extensions/chaeo/zmask.py
rename to model_server/extensions/chaeo/zmask.py
index e9967e70630820d876d49a0b21a2bbe39d2cf082..1f74b5632d96eeb80f4def92f3b81d111b7060df 100644
--- a/extensions/chaeo/zmask.py
+++ b/model_server/extensions/chaeo/zmask.py
@@ -5,7 +5,7 @@ from skimage.measure import find_contours, label, regionprops_table
 from sklearn.preprocessing import PolynomialFeatures
 from sklearn.linear_model import LinearRegression
 
-from model_server.accessors import GenericImageDataAccessor
+from model_server.base.accessors import GenericImageDataAccessor
 
 def build_zmask_from_object_mask(
         obmask: GenericImageDataAccessor,
diff --git a/extensions/ilastik/examples/__init__.py b/model_server/extensions/ilastik/__init__.py
similarity index 100%
rename from extensions/ilastik/examples/__init__.py
rename to model_server/extensions/ilastik/__init__.py
diff --git a/extensions/ilastik/conf.py b/model_server/extensions/ilastik/conf.py
similarity index 100%
rename from extensions/ilastik/conf.py
rename to model_server/extensions/ilastik/conf.py
diff --git a/extensions/ilastik/tests/__init__.py b/model_server/extensions/ilastik/examples/__init__.py
similarity index 100%
rename from extensions/ilastik/tests/__init__.py
rename to model_server/extensions/ilastik/examples/__init__.py
diff --git a/extensions/ilastik/examples/ilastik3d.py b/model_server/extensions/ilastik/examples/ilastik3d.py
similarity index 100%
rename from extensions/ilastik/examples/ilastik3d.py
rename to model_server/extensions/ilastik/examples/ilastik3d.py
diff --git a/extensions/ilastik/models.py b/model_server/extensions/ilastik/models.py
similarity index 94%
rename from extensions/ilastik/models.py
rename to model_server/extensions/ilastik/models.py
index 1413456f633d188ad646376605749861ba904066..6b55c4cdd14e11335b479ea5f8c6551c0c7c92e1 100644
--- a/extensions/ilastik/models.py
+++ b/model_server/extensions/ilastik/models.py
@@ -4,9 +4,9 @@ from pathlib import Path
 import numpy as np
 import vigra
 
-import extensions.ilastik.conf
-from model_server.accessors import GenericImageDataAccessor, InMemoryDataAccessor
-from model_server.models import ImageToImageModel, ParameterExpectedError
+import model_server.extensions.ilastik.conf
+from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor
+from model_server.base.models import ImageToImageModel, ParameterExpectedError
 
 
 class IlastikImageToImageModel(ImageToImageModel):
@@ -17,7 +17,7 @@ class IlastikImageToImageModel(ImageToImageModel):
         if self.project_file.is_absolute():
             pap = self.project_file
         else:
-            pap = extensions.ilastik.conf.paths['project_files'] / self.project_file
+            pap = model_server.extensions.ilastik.conf.paths['project_files'] / self.project_file
         self.project_file_abspath = pap
         if not pap.exists():
             raise FileNotFoundError(f'Project file does not exist: {pap}')
diff --git a/extensions/ilastik/router.py b/model_server/extensions/ilastik/router.py
similarity index 89%
rename from extensions/ilastik/router.py
rename to model_server/extensions/ilastik/router.py
index 14ec32587349f33476bc62f7e37ba6d31e49445d..074e4f1441d8ddde1d583cc2a0ab6e6d82250341 100644
--- a/extensions/ilastik/router.py
+++ b/model_server/extensions/ilastik/router.py
@@ -1,11 +1,11 @@
 from fastapi import APIRouter, HTTPException
 
-from model_server.session import Session
-from model_server.validators import  validate_workflow_inputs
+from model_server.base.session import Session
+from model_server.base.validators import  validate_workflow_inputs
 
-from extensions.ilastik import models as ilm
-from model_server.models import ParameterExpectedError
-from extensions.ilastik.workflows import infer_px_then_ob_model
+from model_server.extensions.ilastik import models as ilm
+from model_server import ParameterExpectedError
+from model_server.extensions.ilastik.workflows import infer_px_then_ob_model
 
 router = APIRouter(
     prefix='/ilastik',
diff --git a/model_server/extensions/ilastik/tests/__init__.py b/model_server/extensions/ilastik/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/extensions/ilastik/tests/test_ilastik.py b/model_server/extensions/ilastik/tests/test_ilastik.py
similarity index 96%
rename from extensions/ilastik/tests/test_ilastik.py
rename to model_server/extensions/ilastik/tests/test_ilastik.py
index 79cbe3b49630468c8c97558e22923cd522b26cf3..d9e8c429a5f65805ca8bb2edacee035db5ff4b43 100644
--- a/extensions/ilastik/tests/test_ilastik.py
+++ b/model_server/extensions/ilastik/tests/test_ilastik.py
@@ -4,10 +4,10 @@ import unittest
 
 import numpy as np
 
-from conf.testing import czifile, ilastik_classifiers, output_path
-from model_server.accessors import CziImageFileAccessor, InMemoryDataAccessor, write_accessor_data_to_file
-from extensions.ilastik import models as ilm
-from model_server.workflows import infer_image_to_image
+from model_server.conf.testing import czifile, ilastik_classifiers, output_path
+from model_server.base.accessors import CziImageFileAccessor, InMemoryDataAccessor, write_accessor_data_to_file
+from model_server.extensions.ilastik import models as ilm
+from model_server.base.workflows import infer_image_to_image
 from tests.test_api import TestServerBaseClass
 
 class TestIlastikPixelClassification(unittest.TestCase):
diff --git a/extensions/ilastik/validators.py b/model_server/extensions/ilastik/validators.py
similarity index 55%
rename from extensions/ilastik/validators.py
rename to model_server/extensions/ilastik/validators.py
index d82e24a8f3ccbc03afa82536f7c04b6729ca918a..28d92c15b79bf923b1cb4098bfc688e47d7b3896 100644
--- a/extensions/ilastik/validators.py
+++ b/model_server/extensions/ilastik/validators.py
@@ -1,4 +1,4 @@
-from model_server.accessors import GenericImageDataAccessor
+from model_server.base.accessors import GenericImageDataAccessor
 
 def is_object_map(img: GenericImageDataAccessor):
     # TODO: implement
diff --git a/extensions/ilastik/workflows.py b/model_server/extensions/ilastik/workflows.py
similarity index 89%
rename from extensions/ilastik/workflows.py
rename to model_server/extensions/ilastik/workflows.py
index 1f622b676d30f8df6b019974fd4a22c3758a4f07..aed4b8f24e47e995c8dc9ed4377a305cc355dbc7 100644
--- a/extensions/ilastik/workflows.py
+++ b/model_server/extensions/ilastik/workflows.py
@@ -4,9 +4,9 @@ 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, IlastikObjectClassifierFromPixelPredictionsModel
-from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
-from model_server.workflows import Timer
+from model_server.extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel
+from model_server.base.accessors import generate_file_accessor, write_accessor_data_to_file
+from model_server.base.workflows import Timer
 
 from pydantic import BaseModel
 
diff --git a/model_server/scripts/__init__.py b/model_server/scripts/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/run_server.py b/model_server/scripts/run_server.py
similarity index 96%
rename from scripts/run_server.py
rename to model_server/scripts/run_server.py
index 222e8fd0a35fa75734e9b0d851b11eb063a5a08f..b278252bfb9c82a54ea69b491e4893d4471cf510 100644
--- a/scripts/run_server.py
+++ b/model_server/scripts/run_server.py
@@ -4,7 +4,7 @@ import requests
 import uvicorn
 import webbrowser
 
-from conf.defaults import server_conf
+from model_server.conf.defaults import server_conf
 
 def parse_args():
     parser = argparse.ArgumentParser(
diff --git a/tests/test_api.py b/tests/test_api.py
index e6c0f7997ea1a6396d30530d964f40cb7213fbe6..46bfbe235e24615081aad39ebca2b67079a32de4 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -3,8 +3,8 @@ from pathlib import Path
 import requests
 import unittest
 
-from conf.testing import czifile
-from model_server.models import DummyImageToImageModel
+from model_server.conf.testing import czifile
+
 
 class TestServerBaseClass(unittest.TestCase):
     def setUp(self) -> None:
@@ -14,7 +14,7 @@ class TestServerBaseClass(unittest.TestCase):
 
         self.server_process = Process(
             target=uvicorn.run,
-            args=('model_server.api:app', ),
+            args=('base.api:app', ),
             kwargs={'host': host, 'port': port, 'log_level': 'debug'},
             daemon=True
         )
@@ -48,12 +48,12 @@ class TestApiFromAutomatedClient(TestServerBaseClass):
         self.assertEqual(resp.json()['params']['par2'], None, resp.json())
 
     def test_default_session_paths(self):
-        import conf.defaults
+        import model_server.conf.defaults
         resp = requests.get(self.uri + 'paths')
-        conf_root = conf.defaults.root
+        conf_root = model_server.conf.defaults.root
         for p in ['inbound_images', 'outbound_images', 'logs']:
             self.assertTrue(resp.json()[p].startswith(conf_root.__str__()))
-            suffix = Path(conf.defaults.subdirectories[p]).__str__()
+            suffix = Path(model_server.conf.defaults.subdirectories[p]).__str__()
             self.assertTrue(resp.json()[p].endswith(suffix))
 
     def test_list_empty_loaded_models(self):
diff --git a/tests/test_model.py b/tests/test_model.py
index 661aeadf93825afc430e55f56326def0fe3f43b0..1938e80c26f32e0ffccd00a8dd6f8b028d692dd2 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -1,7 +1,7 @@
 import unittest
-from conf.testing import czifile
-from model_server.accessors import CziImageFileAccessor
-from model_server.models import DummyImageToImageModel, CouldNotLoadModelError
+from model_server.conf.testing import czifile
+from model_server.base.accessors import CziImageFileAccessor
+from model_server.base.models import DummyImageToImageModel, CouldNotLoadModelError
 
 class TestCziImageFileAccess(unittest.TestCase):
     def setUp(self) -> None:
diff --git a/tests/test_process.py b/tests/test_process.py
index bef8426e5fbd60bf9c10d04c381be2207c1620b4..6908e9d7c1b779065d4de226b7a203979570fb9a 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -2,7 +2,7 @@ import unittest
 
 import numpy as np
 
-from model_server.process import pad
+from model_server.base.process import pad
 
 class TestProcessingUtilityMethods(unittest.TestCase):
     def setUp(self) -> None:
diff --git a/tests/test_session.py b/tests/test_session.py
index e3c9319205e183e1a3e1d9335a759e4bab42e3a9..dd143d5f48e6eec0057fca012a7e8e555139e016 100644
--- a/tests/test_session.py
+++ b/tests/test_session.py
@@ -1,7 +1,7 @@
 import pathlib
 import unittest
-from model_server.models import DummyImageToImageModel
-from model_server.session import Session
+from model_server.base.models import DummyImageToImageModel
+from model_server.base.session import Session
 
 class TestGetSessionObject(unittest.TestCase):
     def setUp(self) -> None:
@@ -16,7 +16,7 @@ class TestGetSessionObject(unittest.TestCase):
         self.assertTrue(exists(sesh.manifest_json), 'Session did not create a manifest JSON file in the correct place')
 
     def test_changing_session_root_creates_new_directory(self):
-        from conf.defaults import root
+        from model_server.conf.defaults import root
         from shutil import rmtree
 
         sesh = Session()
@@ -46,7 +46,7 @@ class TestGetSessionObject(unittest.TestCase):
 
     def test_session_records_workflow(self):
         import json
-        from model_server.workflows import WorkflowRunRecord
+        from model_server.base.workflows import WorkflowRunRecord
         sesh = Session()
         di = WorkflowRunRecord(
             model_id='test_model',
diff --git a/tests/test_workflow.py b/tests/test_workflow.py
index 2cab499d04c222651894d9064c1f7f990050d626..3c7c02a61d6d73fdfa2167c8d973af35c069a366 100644
--- a/tests/test_workflow.py
+++ b/tests/test_workflow.py
@@ -1,8 +1,8 @@
 import unittest
 
-from conf.testing import czifile, output_path
-from model_server.models import DummyImageToImageModel
-from model_server.workflows import infer_image_to_image
+from model_server.conf.testing import czifile, output_path
+from model_server.base.models import DummyImageToImageModel
+from model_server.base.workflows import infer_image_to_image
 
 
 class TestGetSessionObject(unittest.TestCase):