Repository: mehta-lab/recOrder (language: python)

Issue:
Test MM Core calls with mocks
Our test coverage has been declining. This is an initial attempt to address this problem by using simple mock-up objects to unit-test methods that make calls to Micro-Manger APIs.

On a side note, it may be beneficial if we isolated all outbound calls via `pycromanager` and aggregate them in the `io.core_functions` module.

Starting to address #156.


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index 0f642fc5..a12a5db3 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 [![Python package index](https://img.shields.io/pypi/v/recOrder-napari.svg)](https://pypi.org/project/recOrder-napari)
 [![Development Status](https://img.shields.io/pypi/status/napari.svg)](https://en.wikipedia.org/wiki/Software_release_life_cycle#Alpha)
 
-This package provides a napari plugin and a command line interface for quantitative label-free microscopy.
+This package provides a napari plugin for quantitative label-free microscopy.
 
 In this repository you will find python tools and a napari plugin that allow the user to calibrate microscope hardware, acquire multi-modal data, reconstruct density and anisotropy, and visualize the results.
 
diff --git a/docs/README.md b/docs/README.md
index 3b8d6fd1..4e376a8a 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -2,11 +2,7 @@
 
 **I would like to install `recOrder` on my microscope:** start with the [microscope installation guide](./microscope-installation-guide.md).
 
-**I would like to use `recOrder` to analyze data:** start with the [software installation guide](./software-installation-guide.md).
-
-**I would like to use `recOrder` on the command line:** [install `recOrder`](./software-installation-guide.md) then use the [command line guide](./command-line-guide.md).
-
-**I would like to watch an experienced user introduce `recOrder`**: [watch the tutorial](https://drive.google.com/file/d/1tHLHZ_uUnddb3jzXnQUjUiynSDS8XIy2/view?usp=sharing). 
+**(outdated) I would like to watch an experienced user introduce `recOrder`**: [watch the tutorial](https://drive.google.com/file/d/1tHLHZ_uUnddb3jzXnQUjUiynSDS8XIy2/view?usp=sharing). 
 
 **I would like to set up a development environment and test `recOrder`**: start with the [development guide](./development-guide.md)
 
diff --git a/docs/command-line-guide.md b/docs/command-line-guide.md
deleted file mode 100644
index 41315f63..00000000
--- a/docs/command-line-guide.md
+++ /dev/null
@@ -1,211 +0,0 @@
-# Command Line Guide
-
-This command-line interface command allows the user to move through quantitative reconstruction of phase and birefringence through a user-defined config file.  The user should copy one of the example config files from `/examples/example_configs/`.
-
-## Using the command
-
-The main command for reconstruction is `recOrder.reconstruct` with the following flags:
-
-```
-recOrder.reconstruct
-
---config (str) [REQUIRED] path to the config.yml file created by the user.  All of the commands below can be specified within the config file.  
-
-Any of these optional commands will override the corresponding fields that the user may have defined or omitted in the config file.
-
---method (str) [optional with config] Method of reconstruction: PhaseFromBF, QLIPP
---mode (str) [optional with config] Mode of reconstruction: 2D or 3D
---data_dir (str) [optional with config] path to raw data folder (root zarr path or folder containing micromanager tif files)
---save_dir (str) [optional with config] path to the directory in which the processed data will be saved
---name (str) [optional] name of the zarr store root folder to be saved in the save_dir.  If not specified, it will use the name of the raw data.
---overwrite (bool) True/False: whether or not to overwrite any existing processed zarr data store under the <save_dir>/<name>.zarr 
-```
-
-At any time you can type the `recOrder.help` command in order to display the available CLI commands:
-
-![Screen Shot 2022-02-15 at 10 05 07 AM](https://user-images.githubusercontent.com/56048121/154122180-b6509882-d404-4f42-92c4-b66124a57cec.png)
-
-
-## Config Specification
-
-### Dataset Config Specification
-```
-dataset:
-  method: 'QLIPP'
-  # Reconstruction Method 'QLIPP', or 'PhaseFromBF'.
-
-  mode: '2D'
-  # Mode for reconstruction, '2D' or '3D'
-
-  data_dir: '/path/to/raw/data'
-  # (str) path to the raw data directory (folder which holds .tif files) or the root .zarr file
-
-  save_dir: '/path/to/save/directory'
-  # (str) path to the directory in which the data will be saved
-
-  data_type [optional]: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'. If not specified the data reader will infer the 
-  datatype
-
-  data_save_name: 'Test_Data'
-  # (str) Name of the zarr dataset that will be written.
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  #   'all'
-  #   !!python/tuple [0, N] for pos 0 through N
-  #   [0, 1, 5] for pos 0, 1, and 5
-  #   [!!python/tuple [0, 15], [19, 25]] for pos 0 through 15, 19, and 25
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  #   'all'
-  #   !!python/tuple [0, N] for pos 0 through N
-  #   [0, 1, 5] for pos 0, 1, and 5
-  #   [!!python/tuple [0, 15], [19, 25]] for timepoints 0 through 15, 19, and 25
-
-  background [optional, required if background_correction is not 'None']: './pytest_temp/pipeline_test/2021_06_11_recOrder_pytest_20x_04NA/BG'
-  # (str) Background folder within the experiment folder
-
-  calibration_metadata [required for QLIPP pipeline]: './pytest_temp/pipeline_test/2021_06_11_recOrder_pytest_20x_04NA/calib_metadata.txt'
-  # (str) path to the qlipp calibration metadata file
-```
-
-### Processing
-
-This is the section that allows the user to define the output of the reconstruction.
-
-```
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase2D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'. 'S0', 'S1', 'S2', 'S3'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 40
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-  phase_denoiser_2D: 'Tikhonov'
-    # (str) Options of denoiser for 2D phase reconstruction
-    ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 2D Tikhonov parameter ####
-  # if noise is higher raise the regularization parameter an order of magnitude to see if the recon is better
-
-  Tik_reg_abs_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D absorption
-  ##   1.0e-3 should work generally when noise is low
-
-  Tik_reg_ph_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D phase
-  ##   1.0e-3 should work generally when noise is low
-
-  rho_2D: 1
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1 is generally good, no need to tune
-
-  itr_2D: 50
-  # (int) Number of iterations for 2D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_abs_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D absorption
-  ##   1e-4 is generally good
-
-  TV_reg_ph_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D phase
-  ##   1e-4 is generally good
-
-  # -------- 3D ---------
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
-```
-
-# recOrder Data Conversion
-
-This section will allow the user to convert micromanager ome-tif data to ome-zarr data.  OME-zarr format is useful for compression storage and increases the efficiency of reconstruction with access to lazy loading of the data.
-
-## Using the command
-
-The main command for reconstruction is `recOrder.convert` with the following flags:
-
-```
-recOrder.convert
-
---input [required] (str) path to folder containing micromanager tif files
---output [required] (str) full path to save the ome-zarr data, i.e. /path/to/Data.zarr
---data_type [optional] (str) micromananger data-type: ometiff, singlepagetiff
---replace_pos_names [optional] (bool) True/False whether to replace zarr position names with ones in the user-defined position list in micro-manager metadata. Default is False
---format_hcs [optional] (bool) if a tiled micromanager dataset, format in ome-zarr HCS format (creates a tiled layout of the positions from metadata). Default is False.
-
-```
-
-
-
-
-
-
diff --git a/docs/development-guide.md b/docs/development-guide.md
index c45d9bda..4528e49f 100644
--- a/docs/development-guide.md
+++ b/docs/development-guide.md
@@ -76,11 +76,11 @@ Although many of `recOrder`'s tests are automated, many features require manual
 
 We use `QT Creator` for large parts of `recOrder`'s GUI. To modify the GUI, install `QT Creator` from [its website](https://www.qt.io/product/development-tools) or with `brew install --cask qt-creator`
 
-Open `/recOrder/recOrder/plugin/qtdesigner/recOrder_ui.ui` in `QT Creator` and make your changes. 
+Open `/recOrder/recOrder/plugin/gui.ui` in `QT Creator` and make your changes. 
 
 Finally, convert the `.ui` to a `.py` file with 
 ```sh
-pyuic5 -x recOrder_ui.ui -o recOrder_ui.py
+pyuic5 -x gui.ui -o gui.py
 ```
 Note: `pyuic5` is installed alongside `PyQt5`, so you can expect to find it installed in your `recOrder` conda environement. 
 
diff --git a/docs/napari-plugin-guide.md b/docs/napari-plugin-guide.md
index acbd9c71..09ab8772 100644
--- a/docs/napari-plugin-guide.md
+++ b/docs/napari-plugin-guide.md
@@ -201,15 +201,3 @@ Examples of Acquiring 2D birefringence data (Kidney Tissue) with this snap metho
 ![](https://github.com/mehta-lab/recOrder/blob/main/docs/images/acq_finished.png)
 
 ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
-
-
-# recOrder Offline Reconstruction.
-
-To use recOrder's offline reconstruction module you will need to switch to the offline mode by clicking the "Switch to Offline" button at the very top.  If you have just opened the plugin then it will start out in the offline mode.  The offline mode is pictured below:
-
-![](https://github.com/mehta-lab/recOrder/blob/main/docs/images/recOrder_offline.png)
-
-This plugin mimics the command line interface reconstruct functionality, but allows the user to enter in the configuration parameters in the GUI itself.  The user is also able to save these parameters to a new config file or load parameters into the app from an existing config file.  
-
-As the data is being reconstructed, it will output the positions as different layers into napari.  This allows the user to see that data as it is being reconstructed and allows for quick interpretation of results.  Please see the workflow tutorial video in the tutorials section
-
diff --git a/examples/example_configs/config_example_phase_from_bf.yml b/examples/example_configs/config_example_phase_from_bf.yml
deleted file mode 100644
index 79f282e5..00000000
--- a/examples/example_configs/config_example_phase_from_bf.yml
+++ /dev/null
@@ -1,130 +0,0 @@
-dataset:
-  method: 'PhaseFromBF'
-  # QLIPP or PhaseFromBF
-
-  mode: '2D'
-  # Mode for reconstruction, '2D' or '3D'
-
-  data_dir: '/path/to/raw/data'
-  # (str) path to the raw data directory (folder which holds .tif files) or the root .zarr file
-
-  save_dir: '/path/to/save/directory'
-  # (str) path to the directory in which the data will be saved
-
-  data_save_name: 'Test_Data'
-  # (str) Name of the zarr dataset that will be written.
-
-  positions: 'all'
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   [!!python/tuple [0, N]] for pos 0 through N
-  ##   [0, 1, 5] for pos 0, 1, and 5
-  ##   [!!python/tuple [0, 15], [19, 25]] for pos 0 through 15, 19, and 25
-
-  timepoints: 'all'
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   [!!python/tuple [0, N]] for timepoint 0 through N
-  ##   [0, 1, 5] for pos 0, 1, and 5
-  ##   [!!python/tuple [0, 15], [19, 25]] for timepoints 0 through 15, 19, and 25
-
-processing:
-  output_channels: ['Phase2D', 'DAPI', 'GFP'] # or 'Phase3D'
-
-  brightfield_channel_index: 0
-
-  # index corresponding to the brightfield channel in the data (typically the order in which it was acquired)
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 40
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-  phase_denoiser_2D: 'Tikhonov'
-    # (str) Options of denoiser for 2D phase reconstruction
-    ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 2D Tikhonov parameter ####
-  # if noise is higher raise the regularization parameter an order of magnitude to see if the recon is better
-
-  Tik_reg_abs_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D absorption
-  ##   1.0e-3 should work generally when noise is low
-
-  Tik_reg_ph_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D phase
-  ##   1.0e-3 should work generally when noise is low
-
-  rho_2D: 1
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1 is generally good, no need to tune
-
-  itr_2D: 50
-  # (int) Number of iterations for 2D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_abs_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D absorption
-  ##   1e-4 is generally good
-
-  TV_reg_ph_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D phase
-  ##   1e-4 is generally good
-
-  # -------- 3D ---------
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/examples/example_configs/config_example_qlipp.yml b/examples/example_configs/config_example_qlipp.yml
deleted file mode 100644
index 492537a1..00000000
--- a/examples/example_configs/config_example_qlipp.yml
+++ /dev/null
@@ -1,151 +0,0 @@
-dataset:
-  method: 'QLIPP'
-  # Reconstruction Method 'QLIPP' or 'PhaseFromBF'
-
-  mode: '2D'
-  # Mode for reconstruction, '2D' or '3D'
-
-  data_dir: '/path/to/raw/data'
-  # (str) path to the raw data directory (folder which holds .tif files) or the root .zarr file
-
-  save_dir: '/path/to/save/directory'
-  # (str) path to the directory in which the data will be saved
-
-  data_save_name: 'Test_Data'
-  # (str) Name of the zarr dataset that will be written.
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   [!!python/tuple [0, N]] for pos 0 through N
-  ##   [0, 1, 5] for pos 0, 1, and 5
-  ##   [!!python/tuple [0, 15], [19, 25]] for pos 0 through 15, 19, and 25
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   [!!python/tuple [0, N]] for timepoint 0 through N
-  ##   [0, 1, 5] for pos 0, 1, and 5
-  ##   [!!python/tuple [0, 15], [19, 25]] for timepoints 0 through 15, 19, and 25
-
-  background: './pytest_temp/pipeline_test/2022_08_04_recOrder_pytest_20x_04NA/BG'
-  # (str) Background folder within the experiment folder
-
-  calibration_metadata: './pytest_temp/pipeline_test/2022_08_04_recOrder_pytest_20x_04NA/calibration_metadata.txt'
-  # (str) path to the qlipp calibration metadata file
-
-pre_processing:
-  denoise:
-    use: False
-    channels: ['S0', 'S1', 'S2', 'S3'] # Choose which channels to denoise: S0, S1, S2, S3 or BF
-    threshold: [0.1, 0.1, 0.1, 0.1] # Must match length of channels
-    level: [1, 1, 1, 1] # must match length of channels
-
-
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase2D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'. 'S0', 'S1', 'S2', 'S3'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 40
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-  phase_denoiser_2D: 'Tikhonov'
-    # (str) Options of denoiser for 2D phase reconstruction
-    ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 2D Tikhonov parameter ####
-  # if noise is higher raise the regularization parameter an order of magnitude to see if the recon is better
-
-  Tik_reg_abs_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D absorption
-  ##   1.0e-3 should work generally when noise is low
-
-  Tik_reg_ph_2D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 2D phase
-  ##   1.0e-3 should work generally when noise is low
-
-  rho_2D: 1
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1 is generally good, no need to tune
-
-  itr_2D: 50
-  # (int) Number of iterations for 2D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_abs_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D absorption
-  ##   1e-4 is generally good
-
-  TV_reg_ph_2D: 1.0e-4
-  # (float) TV regularization parameter for 2D phase
-  ##   1e-4 is generally good
-
-  # -------- 3D ---------
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/__init__.py b/recOrder/__init__.py
index f9ca19c7..e69de29b 100644
--- a/recOrder/__init__.py
+++ b/recOrder/__init__.py
@@ -1,4 +0,0 @@
-# todo: format overall init
-
-# from .plugin.widget.napari_plugin_entry_point import napari_experimental_provide_dock_widget
-# name = "recOrder"
diff --git a/recOrder/acq/__init__.py b/recOrder/acq/__init__.py
index 245a0ef7..e69de29b 100644
--- a/recOrder/acq/__init__.py
+++ b/recOrder/acq/__init__.py
@@ -1,2 +0,0 @@
-# acquisition
-name = "acq"
diff --git a/recOrder/acq/acq_functions.py b/recOrder/acq/acq_functions.py
index 80219ca3..7b97aee2 100644
--- a/recOrder/acq/acq_functions.py
+++ b/recOrder/acq/acq_functions.py
@@ -1,7 +1,6 @@
 import numpy as np
 import json
 import os
-from recOrder.io.core_functions import set_lc_state, snap_and_get_image
 from waveorder.io.reader import WaveorderReader
 import time
 import glob
@@ -153,87 +152,3 @@ def acquire_from_settings(mm, settings, grab_images=True):
         )
 
         return reader.get_array(0)
-
-
-def acquire_2D(mm, mmc, scheme, snap_manager=None):
-    """
-    Acquire a 2D stack with pycromanager (data transfer over ZMQ) given the acquisition scheme.
-
-    Parameters
-    ----------
-    mm:             (object) MM studio object
-    mmc:            (object) MM Core object
-    scheme:         (str) '5-state' or '4-State'
-    snap_manager:   (object) MM Snap Live Window object
-
-    Returns
-    -------
-    image_stack:    (nd-array) nd-array of size (4, Y, X) or (5, Y, X)
-
-    """
-
-    if not snap_manager:
-        snap_manager = mm.getSnapLiveManager()
-
-    set_lc_state(mmc, "State0")
-    state0 = snap_and_get_image(snap_manager)
-
-    set_lc_state(mmc, "State1")
-    state1 = snap_and_get_image(snap_manager)
-
-    set_lc_state(mmc, "State2")
-    state2 = snap_and_get_image(snap_manager)
-
-    set_lc_state(mmc, "State3")
-    state3 = snap_and_get_image(snap_manager)
-
-    if scheme == "5-State":
-        set_lc_state(mmc, "State4")
-        state4 = snap_and_get_image(snap_manager)
-        return np.asarray([state0, state1, state2, state3, state4])
-
-    else:
-        return np.asarray([state0, state1, state2, state3])
-
-
-def acquire_3D(mm, mmc, scheme, z_start, z_end, z_step, snap_manager=None):
-    """
-    Acquire a 3D stack with pycromanager (data transfer over ZMQ) given the acquisition scheme.
-
-    Parameters
-    ----------
-    mm:             (object) MM studio object
-    mmc:            (object) MM Core object
-    scheme:         (str) '5-state' or '4-State'
-    z_start:        (float) relative z-start location [um]
-    z_end:          (float) relative z-end location [um]
-    z_step:         (float) z-step [um]
-    snap_manager:   (object) MM Snap Live Window object
-
-    Returns
-    -------
-    image_stack:    (nd-array) nd-array of size (Z, 4, Y, X) or (Z, 5, Y, X)
-
-    """
-
-    if not snap_manager:
-        snap_manager = mm.getSnapLiveManager()
-
-    stage = mmc.getFocusDevice()
-    current_z = mmc.getPosition(stage)
-    n_channels = 4 if scheme == "4-State" else 5
-    stack = []
-    for c in range(n_channels):
-        set_lc_state(mmc, f"State{c}")
-        z_stack = []
-        for z in np.arange(
-            current_z + z_start, current_z + z_end + z_step, z_step
-        ):
-            mmc.setPosition(stage, z)
-            z_stack.append(snap_and_get_image(snap_manager))
-
-        stack.append(z_stack)
-
-    mmc.setPosition(stage, current_z)
-
-    return np.asarray(stack)
diff --git a/recOrder/plugin/workers/acquisition_workers.py b/recOrder/acq/acquisition_workers.py
similarity index 99%
rename from recOrder/plugin/workers/acquisition_workers.py
rename to recOrder/acq/acquisition_workers.py
index 0dcb585f..e4fb8181 100644
--- a/recOrder/plugin/workers/acquisition_workers.py
+++ b/recOrder/acq/acquisition_workers.py
@@ -11,7 +11,7 @@
     acquire_from_settings,
 )
 from recOrder.io.utils import load_bg, extract_reconstruction_parameters
-from recOrder.compute import QLIPPBirefringenceCompute
+from recOrder.compute.qlipp_compute import QLIPPBirefringenceCompute
 from recOrder.io.zarr_converter import ZarrConverter
 from recOrder.io.metadata_reader import MetadataReader, get_last_metadata_file
 from recOrder.io.utils import ram_message, rec_bkg_to_wo_bkg
@@ -36,7 +36,6 @@ class PolarizationAcquisitionSignals(WorkerBaseSignals):
     phase_image_emitter = Signal(object)
     bire_image_emitter = Signal(object)
     phase_reconstructor_emitter = Signal(object)
-    meta_emitter = Signal(dict)
     aborted = Signal()
 
 
@@ -47,7 +46,6 @@ class BFAcquisitionSignals(WorkerBaseSignals):
 
     phase_image_emitter = Signal(object)
     phase_reconstructor_emitter = Signal(object)
-    meta_emitter = Signal(dict)
     aborted = Signal()
 
 
@@ -194,7 +192,6 @@ def work(self):
 
         # Emit the images and let thread know function is finished
         self.phase_image_emitter.emit(phase)
-        self.meta_emitter.emit(meta)
 
     def _reconstruct(self, stack):
         """
@@ -666,7 +663,6 @@ def work(self):
         # Emit the images and let thread know function is finished
         self.bire_image_emitter.emit(birefringence)
         self.phase_image_emitter.emit(phase)
-        self.meta_emitter.emit(meta)
 
     def _check_exposure(self) -> None:
         """
diff --git a/recOrder/calib/Calibration.py b/recOrder/calib/Calibration.py
index 7490e831..110b24c0 100644
--- a/recOrder/calib/Calibration.py
+++ b/recOrder/calib/Calibration.py
@@ -140,7 +140,6 @@ def __init__(
         self.wavelength = None
         self.lc_bound = None
         self.I_Black = None
-        self.ROI = None
         self.ratio = 1.793
         self.print_details = print_details
         self.calib_scheme = "4-State"
@@ -817,82 +816,6 @@ def close_shutter_and_calc_blacklevel(self):
         blacklevel = np.mean(avgs)
         self.I_Black = blacklevel
 
-    def get_full_roi(self):
-        # Get Image Parameters
-        self.mmc.snapImage()
-        self.mmc.getImage()
-        self.height, self.width = (
-            self.mmc.getImageHeight(),
-            self.mmc.getImageWidth(),
-        )
-        self.ROI = (0, 0, self.width, self.height)
-
-    def check_and_get_roi(self):
-
-        windows = self.mm.displays().getAllImageWindows()
-        size = windows.size()
-
-        boxes = []
-        for i in range(size):
-            win = windows.get(i).toFront()
-            time.sleep(0.05)
-            roi = (
-                self.mm.displays()
-                .getActiveDataViewer()
-                .getImagePlus()
-                .getRoi()
-            )
-            if roi != None:
-                boxes.append(roi)
-
-        if len(boxes) == 0:
-            raise ValueError(
-                "No ROI Bounding Box Found, Please Draw Bounding Box on the Preview (live) Window"
-            )
-
-        if len(boxes) > 1:
-            raise ValueError(
-                "More than one Bounding Box Found, Please Remove any box not on the preview (live) window"
-            )
-
-        if len(boxes) == 1:
-            rect = boxes[0].getBounds()
-            return rect
-
-    def display_and_check_ROI(self, rect):
-
-        img = snap_image(self.mmc)
-
-        print("Will Calibrate Using this ROI:")
-        fig, ax = plt.subplots()
-
-        ax.imshow(np.reshape(img, (self.height, self.width)), "gray")
-        box = patches.Rectangle(
-            (rect.x, rect.y),
-            rect.width,
-            rect.height,
-            linewidth=2,
-            edgecolor="r",
-            facecolor="none",
-        )
-        ax.add_patch(box)
-        plt.show()
-
-        cont = input(
-            "Would You Like to Calibrate Using this ROI? (Yes/No): \t"
-        )
-
-        if cont in ["Yes", "Y", "yes", "ye", "y", ""]:
-            return True
-
-        if cont in ["No", "N", "no", "n"]:
-            return False
-
-        else:
-            raise ValueError(
-                "Did not understand your answer, please check spelling"
-            )
-
     def calculate_extinction(
         self, swing, black_level, intensity_extinction, intensity_elliptical
     ):
@@ -961,8 +884,7 @@ def write_metadata(self, notes=None):
                 "Retardance to voltage interpolation method": self.calib.interp_method,
                 "LC control mode": self.mode,
                 "Black level": np.round(self.I_Black, 2),
-                "Extinction ratio": self.extinction_ratio,
-                "ROI (x, y, width, height)": self.ROI,
+                "Extinction ratio": self.extinction_ratio
             },
             "Notes": notes,
         }
diff --git a/recOrder/calib/__init__.py b/recOrder/calib/__init__.py
index 578b7916..e69de29b 100644
--- a/recOrder/calib/__init__.py
+++ b/recOrder/calib/__init__.py
@@ -1,2 +0,0 @@
-# calibration of polarization states and other parameters
-name = "calib"
diff --git a/recOrder/plugin/workers/calibration_workers.py b/recOrder/calib/calibration_workers.py
similarity index 96%
rename from recOrder/plugin/workers/calibration_workers.py
rename to recOrder/calib/calibration_workers.py
index 6183729a..7eb08951 100644
--- a/recOrder/plugin/workers/calibration_workers.py
+++ b/recOrder/calib/calibration_workers.py
@@ -119,20 +119,9 @@ def work(self):
         self.plot_sequence_emit.emit("Coarse")
         self.calib.intensity_emitter = self.intensity_update
         self.calib.plot_sequence_emitter = self.plot_sequence_emit
-        self.calib.get_full_roi()
         self.progress_update.emit((1, "Calculating Blacklevel..."))
         self._check_abort()
 
-        # Check if change of ROI is needed
-        if self.calib_window.use_cropped_roi:
-            rect = self.calib.check_and_get_roi()
-            self.calib_window.mmc.setROI(
-                rect.x, rect.y, rect.width, rect.height
-            )
-            self.calib.ROI = (rect.x, rect.y, rect.width, rect.height)
-
-        self._check_abort()
-
         logging.info("Calculating Black Level ...")
         logging.debug("Calculating Black Level ...")
         self.calib.close_shutter_and_calc_blacklevel()
@@ -162,12 +151,6 @@ def work(self):
         # Reset shutter autoshutter
         self.calib.reset_shutter()
 
-        # Return ROI to full FOV
-        if self.calib_window.use_cropped_roi:
-            self.calib_window.mmc.clearROI()
-
-        self._check_abort()
-
         # Calculate Extinction
         extinction_ratio = self.calib.calculate_extinction(
             self.calib.swing,
diff --git a/recOrder/compute/__init__.py b/recOrder/compute/__init__.py
index d4cc5512..e69de29b 100644
--- a/recOrder/compute/__init__.py
+++ b/recOrder/compute/__init__.py
@@ -1,1 +0,0 @@
-from .qlipp_compute import *
diff --git a/recOrder/io/__init__.py b/recOrder/io/__init__.py
index 58c8e239..e69de29b 100644
--- a/recOrder/io/__init__.py
+++ b/recOrder/io/__init__.py
@@ -1,4 +0,0 @@
-from .utils import *
-from .config_reader import ConfigReader
-from ._reader import napari_get_reader
-from .metadata_reader import MetadataReader
diff --git a/recOrder/io/config_reader.py b/recOrder/io/config_reader.py
deleted file mode 100644
index 0744f94c..00000000
--- a/recOrder/io/config_reader.py
+++ /dev/null
@@ -1,322 +0,0 @@
-import yaml
-import pathlib
-import os
-import warnings
-
-DATASET = {
-    "method": None,
-    "mode": None,
-    "data_dir": None,
-    "save_dir": None,
-    "data_type": "zarr",
-    "data_save_name": None,
-    "positions": "all",
-    "timepoints": "all",
-    "background": None,
-    "background_ROI": None,
-    "calibration_metadata": None,
-}
-
-PROCESSING = {
-    "output_channels": None,
-    "qlipp_birefringence_only": False,
-    "background_correction": "None",
-    "use_gpu": False,
-    "gpu_id": 0,
-    "wavelength": None,
-    "pixel_size": None,
-    "magnification": None,
-    "NA_objective": None,
-    "NA_condenser": None,
-    "n_objective_media": 1.003,
-    "brightfield_channel_index": 0,
-    "z_step": None,
-    "focus_zidx": None,
-    "reg": 1e-4,
-    "phase_denoiser_2D": "Tikhonov",
-    "Tik_reg_abs_2D": 1e-4,
-    "Tik_reg_ph_2D": 1e-4,
-    "rho_2D": 1,
-    "itr_2D": 50,
-    "TV_reg_abs_2D": 1e-4,
-    "TV_reg_ph_2D": 1e-4,
-    "phase_denoiser_3D": "Tikhonov",
-    "rho_3D": 1e-3,
-    "itr_3D": 50,
-    "Tik_reg_ph_3D": 1e-4,
-    "TV_reg_ph_3D": 5e-5,
-    "pad_z": 0,
-}
-
-
-class ConfigReader:
-    """
-    Config Reader handles all of the requirements necessary for running the pipeline.  Default values
-    are used for those that do not need to be specified.  CLI will always overried config
-
-    """
-
-    def __init__(
-        self,
-        cfg_path=None,
-        data_dir=None,
-        save_dir=None,
-        method=None,
-        mode=None,
-        name=None,
-        immutable=True,
-    ):
-
-        self.immutable = immutable
-
-        if data_dir is not None:
-            setattr(self, "data_dir", data_dir)
-        if save_dir is not None:
-            setattr(self, "save_dir", save_dir)
-        if method is not None:
-            setattr(self, "method", method)
-        if mode is not None:
-            setattr(self, "mode", mode)
-        if name is not None:
-            setattr(self, "data_save_name", name)
-
-        # initialize defaults
-        for key, value in DATASET.items():
-            if hasattr(self, key):
-                continue
-            else:
-                setattr(self, key, value)
-
-        for key, value in PROCESSING.items():
-            setattr(self, key, value)
-
-        # parse config
-        if cfg_path:
-            # self.allow_yaml_tuple()
-            self.read_config(cfg_path, data_dir, save_dir, method, mode, name)
-
-        # Create yaml dict to save in save_dir
-        setattr(self, "yaml_dict", self._create_yaml_dict())
-        # self._save_yaml()
-
-    # Override set attribute function to disallow changes after init
-    def __setattr__(self, name, value):
-        if hasattr(self, name) and self.immutable:
-            raise AttributeError("Attempting to change immutable object")
-        else:
-            super().__setattr__(name, value)
-
-    def _check_assertions(self, data_dir, save_dir, method, mode, name):
-
-        # assert main fields of config
-        assert (
-            "dataset" in self.config
-        ), "dataset is a required field in the config yaml file"
-        assert (
-            "processing" in self.config
-        ), "processing is a required field in the config yaml file"
-
-        if not method:
-            assert (
-                "method" in self.config["dataset"]
-            ), "Please provide method in config file or CLI argument"
-        if not mode:
-            assert (
-                "mode" in self.config["dataset"]
-            ), "Please provide mode in config file or CLI argument"
-        if not data_dir:
-            assert (
-                "data_dir" in self.config["dataset"]
-            ), "Please provide data_dir in config file or CLI argument"
-        if not save_dir:
-            assert (
-                "save_dir" in self.config["dataset"]
-            ), "Please provide save_dir in config file or CLI argument"
-
-        if self.config["dataset"]["positions"] != "all" and not isinstance(
-            self.config["dataset"]["positions"], int
-        ):
-            assert isinstance(
-                self.config["dataset"]["positions"], list
-            ), 'if not single integer value or "all", positions must be list (nested lists/tuples allowed)'
-        if self.config["dataset"]["timepoints"] != "all" and not isinstance(
-            self.config["dataset"]["timepoints"], int
-        ):
-            assert isinstance(
-                self.config["dataset"]["timepoints"], list
-            ), 'if not single integer value or "all", timepoints must be list (nested lists/tuples allowed)'
-
-        for key, value in PROCESSING.items():
-            if key == "output_channels":
-                if (
-                    "Phase3D" in self.config["processing"][key]
-                    or "Phase2D" in self.config["processing"][key]
-                ):
-                    assert (
-                        "wavelength" in self.config["processing"]
-                    ), "wavelength required for phase reconstruction"
-                    assert (
-                        "pixel_size" in self.config["processing"]
-                    ), "pixel_size required for phase reconstruction"
-                    assert (
-                        "magnification" in self.config["processing"]
-                    ), "magnification required for phase reconstruction"
-                    assert (
-                        "NA_objective" in self.config["processing"]
-                    ), "NA_objective required for phase reconstruction"
-                    assert (
-                        "NA_condenser" in self.config["processing"]
-                    ), "NA_condenser required for phase reconstruction"
-
-                if (
-                    "Phase3D" in self.config["processing"][key]
-                    and "Phase2D" in self.config["processing"][key]
-                ):
-                    raise KeyError(
-                        f"Both Phase3D and Phase2D cannot be specified in {key}.  Please compute separately"
-                    )
-
-                if (
-                    "Phase3D" in self.config["processing"][key]
-                    and self.config["dataset"]["mode"] == "2D"
-                ):
-                    raise KeyError(
-                        f"Specified mode is 2D and Phase3D was specified for reconstruction. "
-                        "Only 2D reconstructions can be performed in 2D mode"
-                    )
-
-                if (
-                    "Phase2D" in self.config["processing"][key]
-                    and self.config["dataset"]["mode"] == "3D"
-                ):
-                    raise KeyError(
-                        f"Specified mode is 3D and Phase2D was specified for reconstruction. "
-                        "Only 3D reconstructions can be performed in 3D mode"
-                    )
-
-            elif (
-                key == "background_correction"
-                and self.config["dataset"]["method"] == "QLIPP"
-            ):
-                mode = self.config["processing"][key]
-                if (
-                    mode == "None"
-                    or mode == "local_fit"
-                    or mode == "local_fit+"
-                ):
-                    pass
-                else:
-                    assert (
-                        self.config["dataset"]["background"] is not None
-                    ), "path to background data must be specified for this background correction method"
-
-    def save_yaml(self, dir_=None, name=None):
-        self.immutable = False
-        self.yaml_dict = self._create_yaml_dict()
-        self.immutable = True
-
-        dir_ = self.save_dir if dir_ is None else dir_
-        name = f"config_{self.data_save_name}.yml" if name is None else name
-        if not name.endswith(".yml"):
-            name += ".yml"
-        if not os.path.exists(dir_):
-            os.mkdir(dir_)
-        with open(os.path.join(dir_, name), "w") as file:
-            yaml.dump(self.yaml_dict, file)
-        file.close()
-
-    def _create_yaml_dict(self):
-
-        yaml_dict = {"dataset": {}, "processing": {}}
-
-        for key, value in DATASET.items():
-            yaml_dict["dataset"][key] = getattr(self, key)
-
-        for key, value in PROCESSING.items():
-            yaml_dict["processing"][key] = getattr(self, key)
-
-        return yaml_dict
-
-    def _use_default_name(self):
-        path = pathlib.PurePath(self.data_dir)
-        super().__setattr__("data_save_name", path.name)
-
-    def _parse_dataset(self):
-        for key, value in self.config["dataset"].items():
-            if key in DATASET.keys():
-
-                # This section will prioritize the command line arguments over the
-                # config arguments (data_dir, save_dir, data_save_name)
-                if key == "name" and self.data_save_name:
-                    continue
-                elif key == "data_dir" and self.data_dir:
-                    continue
-                elif key == "save_dir" and self.save_dir:
-                    continue
-                elif key == "mode" and self.mode:
-                    continue
-                elif key == "method" and self.method:
-                    continue
-
-                # this section appends the rest of the dataset parameters specified
-                elif key == "positions" or key == "timepoints":
-                    if isinstance(value, str):
-                        if value == "all":
-                            super().__setattr__(key, [value])
-                        else:
-                            raise KeyError(
-                                f'{key} value {value} not understood,\
-                                       please specify a list or "all"'
-                            )
-                    elif isinstance(value, int):
-                        super().__setattr__(key, [value])
-                    elif isinstance(value, tuple):
-                        if len(value) == 2:
-                            super().__setattr__(key, value)
-                        else:
-                            raise KeyError(
-                                f"{key} value {value} is not a tuple with length of 2"
-                            )
-                    elif isinstance(value, list):
-                        super().__setattr__(key, value)
-                    else:
-                        raise KeyError(
-                            f'{key} value {value} format not understood. \
-                                       Must be list with nested tuple or list or "all"'
-                        )
-                else:
-                    super().__setattr__(key, value)
-
-            else:
-                warnings.warn(
-                    f"yaml DATASET config field {key} is not recognized"
-                )
-
-    def _parse_processing(self):
-        for key, value in self.config["processing"].items():
-            if key in PROCESSING.keys():
-                super().__setattr__(key, value)
-            else:
-                warnings.warn(
-                    f"yaml PROCESSING config field {key} is not recognized"
-                )
-
-        if (
-            "Phase3D" not in self.output_channels
-            and "Phase2D" not in self.output_channels
-        ):
-            super().__setattr__("qlipp_birefringence_only", True)
-
-    def read_config(self, cfg_path, data_dir, save_dir, method, mode, name):
-
-        if isinstance(cfg_path, str):
-            self.config = yaml.full_load(open(cfg_path))
-        if isinstance(cfg_path, dict):
-            self.config = cfg_path
-
-        self._check_assertions(data_dir, save_dir, method, mode, name)
-        self._parse_dataset()
-        self._parse_processing()
-
-        if not self.data_save_name:
-            self._use_default_name()
diff --git a/recOrder/io/core_functions.py b/recOrder/io/core_functions.py
index 2c12529b..617d6464 100644
--- a/recOrder/io/core_functions.py
+++ b/recOrder/io/core_functions.py
@@ -3,28 +3,6 @@
 from contextlib import contextmanager
 
 
-def snap_image(mmc):
-    """
-    Snap and return an image through pycromanager ZMQ
-
-    Parameters
-    ----------
-    mmc:        (object) MM core object
-
-    Returns
-    -------
-    image:      (array) 1D-Array of length Y * X
-
-    """
-
-    mmc.snapImage()
-    time.sleep(
-        0.3
-    )  # sleep after snap to make sure the image we grab is the correct one
-
-    return mmc.getImage()
-
-
 @contextmanager
 def suspend_live_sm(snap_manager):
     """Context manager that suspends/unsuspends MM live mode for `SnapLiveManager`.
diff --git a/recOrder/io/metadata_reader.py b/recOrder/io/metadata_reader.py
index 65fce0b0..b3f8faef 100644
--- a/recOrder/io/metadata_reader.py
+++ b/recOrder/io/metadata_reader.py
@@ -48,7 +48,6 @@ def __init__(self, path: str):
         self.Wavelength = self.get_summary_calibration_attr("Wavelength (nm)")
         self.Black_level = self.get_black_level()
         self.Extinction_ratio = self.get_extinction_ratio()
-        self.ROI = tuple(self.get_roi())  # JSON does not preserve tuples
         self.Channel_names = self.get_channel_names()
         self.LCA_retardance = self.get_lc_retardance("LCA")
         self.LCB_retardance = self.get_lc_retardance("LCB")
@@ -183,17 +182,6 @@ def get_extinction_ratio(self):
             val = self.json_metadata["Summary"]["Extinction Ratio"]
         return val
 
-    def get_roi(self):
-        try:
-            val = self.json_metadata["Calibration"][
-                "ROI (x, y, width, height)"
-            ]
-        except KeyError:
-            val = self.json_metadata["Summary"][
-                "ROI Used (x, y, width, height)"
-            ]
-        return val
-
     def get_channel_names(self):
         try:
             val = self.json_metadata["Calibration"]["Channel names"]
diff --git a/recOrder/napari.yaml b/recOrder/napari.yaml
index b9bb9699..6a50dd08 100644
--- a/recOrder/napari.yaml
+++ b/recOrder/napari.yaml
@@ -4,7 +4,7 @@ contributions:
   commands:
   - id: recOrder-napari.MainWidget
     title: Create Main Widget
-    python_name: recOrder.plugin.widget.napari_plugin_entry_point:MainWidget
+    python_name: recOrder.plugin.main_widget:MainWidget
   - id: recOrder-napari.get_reader
     title: Read ome-zarr and ome-tif files
     python_name: recOrder.io._reader:napari_get_reader
diff --git a/recOrder/pipelines/__init__.py b/recOrder/pipelines/__init__.py
deleted file mode 100644
index 0777f91e..00000000
--- a/recOrder/pipelines/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .pipeline_manager import PipelineManager
-from .qlipp_pipeline import *
diff --git a/recOrder/pipelines/base.py b/recOrder/pipelines/base.py
deleted file mode 100644
index 38d89d99..00000000
--- a/recOrder/pipelines/base.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class PipelineInterface(ABC):
-    """
-    An interface for all pipeline classes
-
-    """
-
-    @abstractmethod
-    def reconstruct_stokes_volume(self, data):
-        pass
-
-    @abstractmethod
-    def deconvolve_volume(self, stokes):
-        pass
-
-    @abstractmethod
-    def reconstruct_birefringence_volume(self, stokes):
-        pass
-
-    @abstractmethod
-    def write_data(
-        self, p, t, pt_data, stokes, birefringence, deconvolve2D, deconvolve3D
-    ):
-        pass
diff --git a/recOrder/pipelines/phase_from_bf_pipeline.py b/recOrder/pipelines/phase_from_bf_pipeline.py
deleted file mode 100644
index 9124bb37..00000000
--- a/recOrder/pipelines/phase_from_bf_pipeline.py
+++ /dev/null
@@ -1,202 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from waveorder.io.reader import WaveorderReader
-from waveorder.io.writer import WaveorderWriter
-from recOrder.io.utils import MockEmitter
-from recOrder.compute.qlipp_compute import (
-    reconstruct_phase2D,
-    reconstruct_phase3D,
-    initialize_reconstructor,
-)
-import numpy as np
-from recOrder.pipelines.base import PipelineInterface
-
-
-class PhaseFromBF(PipelineInterface):
-    def __init__(
-        self,
-        config: ConfigReader,
-        data: WaveorderReader,
-        writer: WaveorderWriter,
-        num_t: int,
-        emitter=MockEmitter(),
-    ):
-
-        # Dataset Parameters
-        self.config = config
-        self.data = data
-        self.writer = writer
-
-        # Emitter
-        self.dimension_emitter = emitter
-
-        # Dimension Parameters
-        self.t = num_t
-        self.output_channels = self.config.output_channels
-        self._check_output_channels(self.output_channels)
-        self.mode = "2D" if "Phase2D" in self.output_channels else "3D"
-        self.bf_chan_idx = self.config.brightfield_channel_index
-
-        self.slices = self.data.slices
-        self.focus_slice = None
-
-        if self.mode == "2D":
-            self.slices = 1
-            self.focus_slice = self.config.focus_zidx
-
-        # Set image dimensions / writer parameters
-        self.img_dim = (self.data.height, self.data.width, self.data.slices)
-        self.data_shape = (
-            self.t,
-            len(self.output_channels),
-            self.slices,
-            self.img_dim[0],
-            self.img_dim[1],
-        )
-        self.chunk_size = (1, 1, 1, self.data_shape[-2], self.data_shape[-1])
-
-        # Initialize Reconstructor
-        self.reconstructor = initialize_reconstructor(
-            pipeline="PhaseFromBF",
-            image_dim=(self.img_dim[0], self.img_dim[1]),
-            wavelength_nm=self.config.wavelength,
-            NA_obj=self.config.NA_objective,
-            NA_illu=self.config.NA_condenser,
-            n_obj_media=self.config.n_objective_media,
-            mag=self.config.magnification,
-            n_slices=self.data.slices,
-            z_step_um=self.data.z_step_size,
-            pad_z=self.config.pad_z,
-            pixel_size_um=self.config.pixel_size,
-            mode=self.mode,
-            use_gpu=self.config.use_gpu,
-            gpu_id=self.config.gpu_id,
-        )
-
-    def _check_output_channels(self, output_channels):
-        """
-        Function to make sure that the correct output channels are specified.
-        Does not allow for both 2D and 3D simultaneous reconstruction due to saving formats.
-
-        Parameters
-        ----------
-        output_channels:        (list) List of str output channels
-
-        Returns
-        -------
-
-        """
-
-        for channel in output_channels:
-            if "Phase3D" in channel:
-                continue
-            elif "Phase2D" in channel:
-                continue
-            elif "Phase3D" in channel and "Phase2D" in channel:
-                raise KeyError(
-                    "Simultaneous 2D and 3D phase reconstruction not supported"
-                )
-            else:
-                continue
-
-    def reconstruct_stokes_volume(self, data):
-        """
-        dummy function that reshapes the data to the traditional "stokes volume" output.
-        Used by the pipeline_manager and feeds into phase reconstruction
-
-        Parameters
-        ----------
-        data:           (nd-array) raw data of dimensions (C, Z, Y, X)
-
-        Returns
-        -------
-        data:           (nd-array) brightfield data of dimensions (Y, X, Z)
-
-        """
-        # return np.transpose(data[self.bf_chan_idx], (-2, -1, -3))
-        return data[self.bf_chan_idx]
-
-    def reconstruct_birefringence_volume(self, data):
-        """
-        dummy function to skip in pipeline_manager.
-        No birefringence compute occuring in this pipeline
-
-        """
-
-        return data
-
-    def deconvolve_volume(self, bf_data):
-        """
-        This method reconstructs a phase volume or 2D phase image given stokes stack
-
-        Parameters
-        ----------
-        bf_data:             (nd-array) Brightfield stack of (Y, X, Z)
-
-        Returns
-        -------
-        phase3D:            (nd-array) 3D phase stack of (Z, Y, X)
-
-        or
-
-        phase2D:            (nd-array) 2D phase image of (Y, X)
-
-        """
-        phase2D = None
-        phase3D = None
-
-        if "Phase3D" in self.output_channels:
-            phase3D = reconstruct_phase3D(
-                bf_data,
-                self.reconstructor,
-                method=self.config.phase_denoiser_3D,
-                reg_re=self.config.Tik_reg_ph_3D,
-                rho=self.config.rho_3D,
-                lambda_re=self.config.TV_reg_ph_3D,
-                itr=self.config.itr_3D,
-            )
-
-        if "Phase2D" in self.output_channels:
-            phase2D = reconstruct_phase2D(
-                bf_data,
-                self.reconstructor,
-                method=self.config.phase_denoiser_2D,
-                reg_p=self.config.Tik_reg_ph_2D,
-                rho=self.config.rho_2D,
-                lambda_p=self.config.TV_reg_ph_2D,
-                itr=self.config.itr_2D,
-            )
-
-        return phase2D, phase3D
-
-    def write_data(
-        self, p, t, pt_data, stokes, birefringence, phase2D, phase3D
-    ):
-        """
-        This function will iteratively write the data into its proper position, time, channel, z index.
-        Dimensions differ between data type to make compute easier with waveOrder backend.
-
-        Parameters
-        ----------
-        p:                  (int) Index of the p position to write
-        t:                  (int) Index of the t position to write
-        pt_data:            (nd-array) raw data nd-array at p,t index with dimensions (C, Z, Y, X)
-        stokes:             (nd-array) None or nd-array w/ dimensions (Z, C, Y, X)
-        birefringence:      (nd-array) None or nd-array w/ dimensions (C, Z, Y, X)
-        phase2D:            (nd-array) None or nd-array w/ dimensions (Y, X)
-        phase3D:            (nd-array) None or nd-array w/ dimensions (Z, Y, X)
-
-        Returns
-        -------
-        Writes a zarr array to to given save directory.
-
-        """
-        z = 0 if self.mode == "2D" else None
-        slice_ = self.focus_slice if self.mode == "2D" else slice(None)
-
-        for chan in range(len(self.output_channels)):
-            if "Phase3D" in self.output_channels[chan]:
-                self.writer.write(phase3D, p=p, t=t, c=chan, z=z)
-            elif "Phase2D" in self.output_channels[chan]:
-                self.writer.write(phase2D, p=p, t=t, c=chan, z=z)
-
-            self.dimension_emitter.emit((p, t, chan))
diff --git a/recOrder/pipelines/pipeline_manager.py b/recOrder/pipelines/pipeline_manager.py
deleted file mode 100644
index bd9ff77e..00000000
--- a/recOrder/pipelines/pipeline_manager.py
+++ /dev/null
@@ -1,296 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from waveorder.io.reader import WaveorderReader, ZarrReader
-from waveorder.io.writer import WaveorderWriter
-import time
-import os
-import logging
-import shutil
-from napari.utils.notifications import show_warning
-from recOrder.io.utils import MockEmitter, ram_message
-from recOrder.pipelines.qlipp_pipeline import QLIPP
-from recOrder.pipelines.phase_from_bf_pipeline import PhaseFromBF
-
-
-class PipelineManager:
-    """
-    This will pull the necessary pipeline based off the config and run through the pipeline.
-    Managed pipelines must conform to pipeline ABC.
-
-    """
-
-    def __init__(
-        self,
-        config: ConfigReader,
-        overwrite: bool = False,
-        emitter=MockEmitter(),
-    ):
-        self._check_ram()
-
-        start = time.time()
-        print("Reading Data...")
-        data = WaveorderReader(config.data_dir, extract_data=True)
-        end = time.time()
-        print(f"Finished Reading Data ({(end - start) / 60 :0.1f} min)")
-
-        self.config = config
-        self.data = data
-        self.use_hcs = (
-            True if isinstance(self.data.reader, ZarrReader) else False
-        )
-
-        self._gen_coord_set()
-
-        # This section creates the HCS metadata that exists from the raw data zarr store and updates
-        # if it you are only doing a subset of positions.  Allows for consistent format between
-        # raw data and processed data
-        if self.use_hcs:
-            self.hcs_meta = self.data.reader.hcs_meta
-            self.hcs_meta = self._update_hcs_meta_from_config(self.hcs_meta)
-        else:
-            self.hcs_meta = None
-
-        # Delete previous data if overwrite is true, helpful for making quick config changes since the writer
-        # doesn't by default allow you to overwrite data
-        if overwrite:
-            path = os.path.join(
-                self.config.save_dir, self.config.data_save_name
-            )
-            path = path + ".zarr" if not path.endswith(".zarr") else path
-            if os.path.exists(path):
-                shutil.rmtree(path)
-
-        # Writer Parameters
-        self.writer = WaveorderWriter(
-            self.config.save_dir,
-            hcs=self.use_hcs,
-            hcs_meta=self.hcs_meta,
-            verbose=False,
-        )
-        self.writer.create_zarr_root(self.config.data_save_name)
-
-        # Pipeline Initiation
-        if self.config.method == "QLIPP":
-            self.pipeline = QLIPP(
-                self.config,
-                self.data,
-                self.writer,
-                self.config.mode,
-                self.num_t,
-                emitter=emitter,
-            )
-
-        elif self.config.method == "PhaseFromBF":
-            self.pipeline = PhaseFromBF(
-                self.config,
-                self.data,
-                self.writer,
-                self.num_t,
-                emitter=emitter,
-            )
-
-        else:
-            raise NotImplementedError(
-                f"Method {self.config.method} is not currently implemented "
-                "please specify one of the following: QLIPP or PhaseFromBF"
-            )
-
-    def _check_ram(self):
-        """
-        Show a warning if RAM < 32 GB.
-        """
-        is_warning, msg = ram_message()
-        if is_warning:
-            logging.warning(msg)
-            show_warning(msg)
-        else:
-            logging.info(msg)
-
-    def _update_hcs_meta_from_config(self, hcs_meta):
-        """
-        If HCS metadata was found in raw data, make sure that it is consistent
-        with the data being requested for reconstruction
-
-        Parameters
-        ----------
-        hcs_meta:       (dict) HCS metadata as needed by the writer
-
-        Returns
-        -------
-        new_meta:       (dict) HCS metadata corresponding to config parameters (or unchanged)
-
-        """
-
-        # make a list of empty wells the size of the # of positions
-        wells_new = [None] * (max(self.p_indices) + 1)
-        well_meta_new = [None] * (max(self.p_indices) + 1)
-
-        meta_new = hcs_meta.copy()
-        for idx, p in enumerate(self.p_indices):
-
-            # for every position, grab it from the original HCS metadata and place it into new list
-            well_meta = meta_new["well"]
-            well_meta_new[idx] = well_meta[p]
-
-            wells = meta_new["plate"]["wells"]
-            wells_new[idx] = wells[p]
-
-        # Filter out any blank entries
-        wells_new = list(filter(None, wells_new))
-        well_meta_new = list(filter(None, well_meta_new))
-
-        # based on new well metadata, grab the rows/columns names
-        rows_new = []
-        cols_new = []
-        for well in wells_new:
-            split = well["path"].split("/")
-            if not {"name": split[0]} in rows_new:
-                rows_new.append({"name": split[0]})
-
-            if not {"name": split[1]} in cols_new:
-                cols_new.append({"name": split[1]})
-
-        # Group all of the metadata together in one dictionary
-        meta_new["plate"]["rows"] = rows_new
-        meta_new["plate"]["columns"] = cols_new
-        meta_new["plate"]["wells"] = wells_new
-        meta_new["well"] = well_meta_new
-
-        return meta_new
-
-    def _gen_coord_set(self):
-        """
-        Function creates a set of all position, time values to loop through for reconstruction
-
-        Returns
-        -------
-
-        """
-
-        # keep track of the order in which the p_indices come in for use later in the writer
-        self.indices_map = dict()
-        self.pt_set = set()
-        p_indices = set()
-        t_indices = set()
-
-        # run through the different possible config specifications (ranges, single entries, 'all', etc.)
-        cnt = 0
-        for p_entry in self.config.positions:
-            if p_entry == "all":
-                for p in range(self.data.get_num_positions()):
-                    p_indices.add(p)
-                    self.indices_map[p] = cnt
-                    cnt += 1
-                break
-            elif isinstance(p_entry, int):
-                p_indices.add(p_entry)
-                self.indices_map[p_entry] = cnt
-                cnt += 1
-            elif isinstance(p_entry, list):
-                for p in p_entry:
-                    p_indices.add(p)
-                    self.indices_map[p_entry] = cnt
-                    cnt += 1
-            elif isinstance(p_entry, tuple):
-                for p in range(p_entry[0], p_entry[1]):
-                    p_indices.add(p)
-                    self.indices_map[p] = cnt
-                    cnt += 1
-            else:
-                raise ValueError(
-                    f"Did not understand entry {p_entry} in config specified positions"
-                )
-
-        # run through the different possible config specifications (ranges, single entries, 'all', etc.)
-        for t_entry in self.config.timepoints:
-            if t_entry == "all":
-                for t in range(self.data.frames):
-                    t_indices.add(t)
-                break
-            elif isinstance(t_entry, int):
-                t_indices.add(t_entry)
-            elif isinstance(t_entry, list):
-                for t in t_entry:
-                    t_indices.add(t)
-            elif isinstance(t_entry, tuple):
-                for t in range(t_entry[0], t_entry[1]):
-                    t_indices.add(t)
-            else:
-                raise ValueError(
-                    f"Did not understand entry {t_entry} in config specified positions"
-                )
-
-        self.num_t = len(t_indices)
-        self.num_p = len(p_indices)
-        self.p_indices = p_indices
-
-        # create set of all possible pos, time indices
-        for pos in p_indices:
-            for time_point in t_indices:
-                self.pt_set.add((pos, time_point))
-
-    def try_init_array(self, pt):
-        try:
-
-            # If not doing the full position, we still want semantic information on which positions
-            # were reconstructed, so append the filename to the position (which would have otherwise been arbitrary)
-            if not self.hcs_meta:
-                name = f"Pos_{pt[0]:03d}"
-            else:
-                name = None
-
-            self.pipeline.writer.init_array(
-                self.indices_map[pt[0]],
-                self.pipeline.data_shape,
-                self.pipeline.chunk_size,
-                self.pipeline.output_channels,
-                position_name=name,
-            )
-
-        # assumes array exists already if there is an error thrown
-        except:
-            pass
-
-    # TODO: use arbol print statements
-    # TODO: Refactor Birefringence to Anisotropy
-    def run(self):
-
-        print(f"Beginning Reconstruction...")
-
-        for pt in sorted(self.pt_set):
-            start_time = time.time()
-
-            self.try_init_array(pt)
-
-            pt_data = self.data.get_zarr(pt[0])[pt[1]]  # (C, Z, Y, X) virtual
-
-            # will return pt_data if the pipeline does not compute stokes
-            stokes = self.pipeline.reconstruct_stokes_volume(pt_data)
-
-            # will return None if the pipeline doesn't support birefringence reconstruction
-            birefringence = self.pipeline.reconstruct_birefringence_volume(
-                stokes
-            )
-
-            # will return phase volumes
-            deconvolve2D, deconvolve3D = self.pipeline.deconvolve_volume(
-                stokes
-            )
-
-            self.pipeline.write_data(
-                self.indices_map[pt[0]],
-                pt[1],
-                pt_data,
-                stokes,
-                birefringence,
-                deconvolve2D,
-                deconvolve3D,
-            )
-
-            end_time = time.time()
-            print(
-                f"Finishing Reconstructing P = {pt[0]}, T = {pt[1]} ({(end_time-start_time)/60:0.2f}) min"
-            )
-
-            existing_meta = self.writer.store.attrs.asdict().copy()
-            existing_meta["Config"] = self.config.yaml_dict
-            self.writer.store.attrs.put(existing_meta)
diff --git a/recOrder/pipelines/qlipp_pipeline.py b/recOrder/pipelines/qlipp_pipeline.py
deleted file mode 100644
index b3f5dd97..00000000
--- a/recOrder/pipelines/qlipp_pipeline.py
+++ /dev/null
@@ -1,396 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from waveorder.io.reader import WaveorderReader
-from waveorder.io.writer import WaveorderWriter
-from recOrder.io import MetadataReader
-from recOrder.io.utils import load_bg, MockEmitter, rec_bkg_to_wo_bkg
-from recOrder.compute.qlipp_compute import (
-    reconstruct_qlipp_birefringence,
-    reconstruct_qlipp_stokes,
-    reconstruct_phase2D,
-    reconstruct_phase3D,
-    initialize_reconstructor,
-)
-import numpy as np
-from recOrder.pipelines.base import PipelineInterface
-
-
-class QLIPP(PipelineInterface):
-
-    """
-    This class contains methods to reconstruct an entire QLIPP dataset
-    """
-
-    def __init__(
-        self,
-        config: ConfigReader,
-        data: WaveorderReader,
-        writer: WaveorderWriter,
-        mode: str,
-        num_t: int,
-        emitter=MockEmitter(),
-    ):
-        """
-        Parameters
-        ----------
-        config:     (Object) initialized ConfigReader object
-        data:       (Object) initialized WaveorderReader object (data should be extracted already)
-        writer:     (Object) initialiazed WaveorderWriter object
-        mode:       (str) mode of operation, can be '2D', '3D', or 'stokes'
-        num_t:      (int) number of timepoints being analyzed
-        """
-
-        # Dataset Parameters
-        self.config = config
-        self.data = data
-        self.writer = writer
-        self.mode = mode
-
-        # Emitter
-        self.dimension_emitter = emitter
-
-        # Dimension Parameters
-        self.t = num_t
-        self.output_channels = self.config.output_channels
-        self._check_output_channels(self.output_channels)
-
-        if self.data.channels < 4:
-            raise ValueError(
-                f"Number of Channels is {data.channels}, cannot be less than 4"
-            )
-
-        self.slices = self.data.slices
-        self.focus_slice = None
-        if self.mode == "2D":
-            self.slices = 1
-            self.focus_slice = self.config.focus_zidx
-
-        self.img_dim = (self.data.height, self.data.width, self.data.slices)
-
-        # Metadata
-        self.chan_names = self.data.channel_names
-        self.bg_path = (
-            self.config.background if self.config.background else None
-        )
-        if self.config.calibration_metadata:
-            self.calib_meta = MetadataReader(self.config.calibration_metadata)
-            self.calib_scheme = self.calib_meta.Calibration_scheme
-            self.bg_roi = self.calib_meta.ROI  # TODO: remove for 1.0.0
-        else:
-            self.calib_meta = None
-            self.calib_scheme = "4-State"
-            self.bg_roi = None  # TODO: remove for 1.0.0
-
-        # identify the image indicies corresponding to each polarization orientation
-        (
-            self.s0_idx,
-            self.s1_idx,
-            self.s2_idx,
-            self.s3_idx,
-            self.s4_idx,
-        ) = self.parse_channel_idx(self.data.channel_names)
-
-        # Writer Parameters
-        self.data_shape = (
-            self.t,
-            len(self.output_channels),
-            self.slices,
-            self.img_dim[0],
-            self.img_dim[1],
-        )
-        self.chunk_size = (1, 1, 1, self.data_shape[-2], self.data_shape[-1])
-
-        wo_background_correction = rec_bkg_to_wo_bkg(
-            self.config.background_correction
-        )
-
-        # Initialize Reconstructor
-        if self.no_phase:
-            self.reconstructor = initialize_reconstructor(
-                pipeline="birefringence",
-                image_dim=(self.img_dim[0], self.img_dim[1]),
-                wavelength_nm=self.config.wavelength,
-                swing=self.calib_meta.Swing,
-                calibration_scheme=self.calib_scheme,
-                n_slices=self.data.slices,
-                pad_z=self.config.pad_z,
-                bg_correction=wo_background_correction,
-                mode=self.mode,
-                use_gpu=self.config.use_gpu,
-                gpu_id=self.config.gpu_id,
-            )
-
-        else:
-            self.reconstructor = initialize_reconstructor(
-                pipeline="QLIPP",
-                image_dim=(self.img_dim[0], self.img_dim[1]),
-                wavelength_nm=self.config.wavelength,
-                swing=self.calib_meta.Swing,
-                calibration_scheme=self.calib_scheme,
-                NA_obj=self.config.NA_objective,
-                NA_illu=self.config.NA_condenser,
-                n_obj_media=self.config.n_objective_media,
-                mag=self.config.magnification,
-                n_slices=self.data.slices,
-                z_step_um=self.data.z_step_size,
-                pad_z=self.config.pad_z,
-                pixel_size_um=self.config.pixel_size,
-                bg_correction=wo_background_correction,
-                mode=self.mode,
-                use_gpu=self.config.use_gpu,
-                gpu_id=self.config.gpu_id,
-            )
-
-        # Prepare background corrections for waveorder
-        if self.config.background_correction in ["global", "local_fit+"]:
-            bg_data = load_bg(
-                self.bg_path, self.img_dim[0], self.img_dim[1], self.bg_roi
-            )  # TODO: remove ROI for 1.0.0
-            self.bg_stokes = self.reconstructor.Stokes_recon(bg_data)
-            self.bg_stokes = self.reconstructor.Stokes_transform(
-                self.bg_stokes
-            )
-        elif self.config.background_correction == "local_fit":
-            self.bg_stokes = np.zeros((5, self.img_dim[0], self.img_dim[1]))
-            self.bg_stokes[
-                0, ...
-            ] = 1  # Set background to "identity" Stokes parameters.
-        else:
-            self.bg_stokes = None
-
-    def _check_output_channels(self, output_channels):
-        self.no_birefringence = True
-        self.no_phase = True
-        for channel in output_channels:
-            if (
-                "Retardance" in channel
-                or "Orientation" in channel
-                or "Brightfield" in channel
-            ):
-                self.no_birefringence = False
-            if "Phase3D" in channel or "Phase2D" in channel:
-                self.no_phase = False
-            else:
-                continue
-
-    def reconstruct_stokes_volume(self, data):
-        """
-        This method reconstructs a stokes volume from raw data
-
-        Parameters
-        ----------
-        data:           (nd-array) raw data volume at certain position, time.
-                                  dimensions must be (C, Z, Y, X)
-
-        Returns
-        -------
-        stokes:         (nd-array) stokes volume of dimensions (C, Z, Y, X) w/ C=5
-                                    where C is the stokes channels (S0..S3 + DOP)
-
-        """
-
-        if self.calib_scheme == "4-State":
-            LF_array = np.zeros(
-                [4, self.data.slices, self.data.height, self.data.width]
-            )
-
-            LF_array[0] = data[self.s0_idx]
-            LF_array[1] = data[self.s1_idx]
-            LF_array[2] = data[self.s2_idx]
-            LF_array[3] = data[self.s3_idx]
-
-        elif self.calib_scheme == "5-State":
-            LF_array = np.zeros(
-                [5, self.data.slices, self.data.height, self.data.width]
-            )
-            LF_array[0] = data[self.s0_idx]
-            LF_array[1] = data[self.s1_idx]
-            LF_array[2] = data[self.s2_idx]
-            LF_array[3] = data[self.s3_idx]
-            LF_array[4] = data[self.s4_idx]
-
-        else:
-            raise NotImplementedError(
-                f"calibration scheme {self.calib_scheme} not implemented"
-            )
-
-        stokes = reconstruct_qlipp_stokes(
-            LF_array, self.reconstructor, self.bg_stokes
-        )
-
-        return stokes
-
-    def deconvolve_volume(self, stokes):
-        """
-        This method reconstructs a phase volume or 2D phase image given stokes stack
-
-        Parameters
-        ----------
-        stokes:             (nd-array) stokes stack of (C, Y, X, Z) where C = stokes channel
-
-        Returns
-        -------
-        phase3D:            (nd-array) 3D phase stack of (Z, Y, X)
-
-        or
-
-        phase2D:            (nd-array) 2D phase image of (Y, X)
-
-        """
-        phase2D = None
-        phase3D = None
-
-        if "Phase3D" in self.output_channels:
-            phase3D = reconstruct_phase3D(
-                stokes[0],
-                self.reconstructor,
-                method=self.config.phase_denoiser_3D,
-                reg_re=self.config.Tik_reg_ph_3D,
-                rho=self.config.rho_3D,
-                lambda_re=self.config.TV_reg_ph_3D,
-                itr=self.config.itr_3D,
-            )
-
-        if "Phase2D" in self.output_channels:
-            phase2D = reconstruct_phase2D(
-                stokes[0],
-                self.reconstructor,
-                method=self.config.phase_denoiser_2D,
-                reg_p=self.config.Tik_reg_ph_2D,
-                rho=self.config.rho_2D,
-                lambda_p=self.config.TV_reg_ph_2D,
-                itr=self.config.itr_2D,
-            )
-
-        return phase2D, phase3D
-
-    def reconstruct_birefringence_volume(self, stokes):
-        """
-        This method reconstructs birefringence (Ret, Ori, BF, Pol)
-        for given stokes
-
-        Parameters
-        ----------
-        stokes:             (nd-array) stokes stack of (C, Y, X, Z) or (C, Y, X) where C = stokes channel
-
-        Returns
-        -------
-        birefringence:       (nd-array) birefringence stack of (C, Z, Y, X) or (C, Y, X)
-                                        where C = Retardance, Orientation, BF, Polarization
-
-        """
-
-        if self.no_birefringence:
-            return None
-        else:
-            return reconstruct_qlipp_birefringence(
-                stokes[
-                    :,
-                    slice(None) if self.slices != 1 else self.focus_slice,
-                    :,
-                    :,
-                ],
-                self.reconstructor,
-            )
-
-    def write_data(
-        self, p, t, pt_data, stokes, birefringence, phase2D, phase3D
-    ):
-        """
-        This function will iteratively write the data into its proper position, time, channel, z index.
-        Dimensions differ between data type to make compute easier with waveOrder backend.
-
-        Parameters
-        ----------
-        p:                  (int) Index of the p position to write
-        t:                  (int) Index of the t position to write
-        pt_data:            (nd-array) raw data nd-array at p,t index with dimensions (C, Z, Y, X)
-        stokes:             (nd-array) None or nd-array w/ dimensions (Z, C, Y, X)
-        birefringence:      (nd-array) None or nd-array w/ dimensions (C, Z, Y, X)
-        phase2D:            (nd-array) None or nd-array w/ dimensions (Y, X)
-        phase3D:            (nd-array) None or nd-array w/ dimensions (Z, Y, X)
-
-        Returns
-        -------
-        Writes a zarr array to to given save directory.
-
-        """
-
-        z = 0 if self.mode == "2D" else None
-        slice_ = self.focus_slice if self.mode == "2D" else slice(None)
-        # stokes = np.transpose(stokes, (-1, -4, -3, -2)) if len(stokes.shape) == 4 else stokes
-
-        for chan in range(len(self.output_channels)):
-            if "Retardance" in self.output_channels[chan]:
-                ret = birefringence[0] / (2 * np.pi) * self.config.wavelength
-                self.writer.write(ret, p=p, t=t, c=chan, z=z)
-            elif "Orientation" in self.output_channels[chan]:
-                self.writer.write(birefringence[1], p=p, t=t, c=chan, z=z)
-            elif "Brightfield" in self.output_channels[chan]:
-                self.writer.write(birefringence[2], p=p, t=t, c=chan, z=z)
-            elif "Phase3D" in self.output_channels[chan]:
-                self.writer.write(phase3D, p=p, t=t, c=chan, z=z)
-            elif "Phase2D" in self.output_channels[chan]:
-                self.writer.write(phase2D, p=p, t=t, c=chan, z=z)
-            elif "S0" in self.output_channels[chan]:
-                self.writer.write(
-                    stokes[0, slice_, :, :], p=p, t=t, c=chan, z=z
-                )
-            elif "S1" in self.output_channels[chan]:
-                self.writer.write(
-                    stokes[1, slice_, :, :], p=p, t=t, c=chan, z=z
-                )
-            elif "S2" in self.output_channels[chan]:
-                self.writer.write(
-                    stokes[2, slice_, :, :], p=p, t=t, c=chan, z=z
-                )
-            elif "S3" in self.output_channels[chan]:
-                self.writer.write(
-                    stokes[3, slice_, :, :], p=p, t=t, c=chan, z=z
-                )
-
-            self.dimension_emitter.emit((p, t, chan))
-
-    def parse_channel_idx(self, channel_list):
-        """
-        Parses the metadata to find which channel each state resides in.  Useful if the acquisition
-        does not have the pol states adjacent to one another.
-
-        Parameters
-        ----------
-        channel_list:       (list) List of strings corresponding to the channel names
-
-        Returns
-        -------
-        s0_idx, s1_idx, s2_idx, s3_idx, s4_idx :      (int) Index corresponding to where each state
-                                                                        sits in the channel order
-
-        """
-        s0_idx = None
-        s1_idx = None
-        s2_idx = None
-        s3_idx = None
-        s4_idx = None
-        if (
-            "PolScope_Plugin_Version"
-            in self.calib_meta.json_metadata["Summary"]
-        ):
-            open_pol = True
-        else:
-            open_pol = False
-
-        for channel in range(len(channel_list)):
-            if "State0" in channel_list[channel]:
-                s0_idx = channel
-            elif "State1" in channel_list[channel]:
-                s1_idx = channel
-            elif "State2" in channel_list[channel]:
-                s2_idx = channel
-            elif "State3" in channel_list[channel]:
-                s3_idx = channel
-            elif "State4" in channel_list[channel]:
-                s4_idx = channel
-
-        if open_pol:
-            s1_idx, s2_idx, s3_idx, s4_idx = s4_idx, s3_idx, s1_idx, s2_idx
-
-        return s0_idx, s1_idx, s2_idx, s3_idx, s4_idx
diff --git a/recOrder/plugin/__init__.py b/recOrder/plugin/__init__.py
index bd7e37d3..e69de29b 100644
--- a/recOrder/plugin/__init__.py
+++ b/recOrder/plugin/__init__.py
@@ -1,2 +0,0 @@
-# data viewers that depend on napari
-name = "plugin"
diff --git a/recOrder/plugin/config_offline_default.yml b/recOrder/plugin/config_offline_default.yml
deleted file mode 100644
index 2feaf87d..00000000
--- a/recOrder/plugin/config_offline_default.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-dataset:
-  background: ''
-  background_ROI: null
-  calibration_metadata: ''
-  data_dir: ''
-  data_save_name: ''
-  data_type: zarr
-  method: QLIPP
-  mode: 3D
-  positions:
-  - all
-  save_dir: ''
-  timepoints:
-  - all
-processing:
-  NA_condenser: 0.5
-  NA_objective: 1.3
-  TV_reg_abs_2D: 0.0001
-  TV_reg_ph_2D: 0.0001
-  TV_reg_ph_3D: 5.0e-05
-  Tik_reg_abs_2D: 0.0001
-  Tik_reg_ph_2D: 0.0001
-  Tik_reg_ph_3D: 0.0001
-  background_correction: None
-  brightfield_channel_index: 0
-  focus_zidx: null
-  gpu_id: 0
-  itr_2D: 50
-  itr_3D: 50
-  magnification: 60.0
-  n_objective_media: 1.3
-  output_channels:
-  - ''
-  pad_z: 0
-  phase_denoiser_2D: Tikhonov
-  phase_denoiser_3D: Tikhonov
-  pixel_size: 6.9
-  qlipp_birefringence_only: false
-  reg: 0.0001
-  rho_2D: 1
-  rho_3D: 0.001
-  use_gpu: false
-  wavelength: 532
diff --git a/recOrder/plugin/qtdesigner/recOrder_ui.py b/recOrder/plugin/gui.py
similarity index 72%
rename from recOrder/plugin/qtdesigner/recOrder_ui.py
rename to recOrder/plugin/gui.py
index 3716932f..73a0f6c3 100644
--- a/recOrder/plugin/qtdesigner/recOrder_ui.py
+++ b/recOrder/plugin/gui.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'recOrder_ui.ui'
+# Form implementation generated from reading ui file 'gui.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.7
 #
@@ -34,43 +34,32 @@ def setupUi(self, Form):
         self.gridLayout_22 = QtWidgets.QGridLayout(self.recon_status)
         self.gridLayout_22.setContentsMargins(-1, 25, -1, -1)
         self.gridLayout_22.setObjectName("gridLayout_22")
-        self.qbutton_gui_mode = QtWidgets.QPushButton(self.recon_status)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.qbutton_gui_mode.sizePolicy().hasHeightForWidth())
-        self.qbutton_gui_mode.setSizePolicy(sizePolicy)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.qbutton_gui_mode.setFont(font)
-        self.qbutton_gui_mode.setObjectName("qbutton_gui_mode")
-        self.gridLayout_22.addWidget(self.qbutton_gui_mode, 1, 2, 1, 1)
-        self.label_gui_mode = QtWidgets.QLabel(self.recon_status)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+        self.le_mm_status = QtWidgets.QLineEdit(self.recon_status)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_gui_mode.sizePolicy().hasHeightForWidth())
-        self.label_gui_mode.setSizePolicy(sizePolicy)
+        sizePolicy.setHeightForWidth(self.le_mm_status.sizePolicy().hasHeightForWidth())
+        self.le_mm_status.setSizePolicy(sizePolicy)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
-        self.label_gui_mode.setFont(font)
-        self.label_gui_mode.setObjectName("label_gui_mode")
-        self.gridLayout_22.addWidget(self.label_gui_mode, 1, 0, 1, 1)
-        self.le_gui_mode = QtWidgets.QLineEdit(self.recon_status)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        self.le_mm_status.setFont(font)
+        self.le_mm_status.setAlignment(QtCore.Qt.AlignCenter)
+        self.le_mm_status.setReadOnly(True)
+        self.le_mm_status.setObjectName("le_mm_status")
+        self.gridLayout_22.addWidget(self.le_mm_status, 0, 1, 1, 1)
+        self.qbutton_connect_to_mm = QtWidgets.QPushButton(self.recon_status)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_gui_mode.sizePolicy().hasHeightForWidth())
-        self.le_gui_mode.setSizePolicy(sizePolicy)
+        sizePolicy.setHeightForWidth(self.qbutton_connect_to_mm.sizePolicy().hasHeightForWidth())
+        self.qbutton_connect_to_mm.setSizePolicy(sizePolicy)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
-        self.le_gui_mode.setFont(font)
-        self.le_gui_mode.setReadOnly(True)
-        self.le_gui_mode.setObjectName("le_gui_mode")
-        self.gridLayout_22.addWidget(self.le_gui_mode, 1, 1, 1, 1)
+        self.qbutton_connect_to_mm.setFont(font)
+        self.qbutton_connect_to_mm.setObjectName("qbutton_connect_to_mm")
+        self.gridLayout_22.addWidget(self.qbutton_connect_to_mm, 0, 0, 1, 1)
         self.gridLayout_7.addWidget(self.recon_status, 1, 0, 1, 1, QtCore.Qt.AlignTop)
         self.tabWidget = QtWidgets.QTabWidget(Form)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
@@ -110,7 +99,7 @@ def setupUi(self, Form):
         self.scrollArea.setWidgetResizable(True)
         self.scrollArea.setObjectName("scrollArea")
         self.scrollAreaWidgetContents = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 590, 1111))
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 590, 1032))
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -121,191 +110,6 @@ def setupUi(self, Form):
         self.gridLayout.setContentsMargins(4, 4, 4, 4)
         self.gridLayout.setVerticalSpacing(20)
         self.gridLayout.setObjectName("gridLayout")
-        self.calib_params = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
-        font = QtGui.QFont()
-        font.setBold(True)
-        font.setItalic(False)
-        self.calib_params.setFont(font)
-        self.calib_params.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
-        self.calib_params.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
-        self.calib_params.setCheckable(False)
-        self.calib_params.setObjectName("calib_params")
-        self.gridLayout_2 = QtWidgets.QGridLayout(self.calib_params)
-        self.gridLayout_2.setContentsMargins(-1, 12, -1, -1)
-        self.gridLayout_2.setVerticalSpacing(6)
-        self.gridLayout_2.setObjectName("gridLayout_2")
-        self.cb_lcb = QtWidgets.QComboBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_lcb.setFont(font)
-        self.cb_lcb.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_lcb.setObjectName("cb_lcb")
-        self.cb_lcb.addItem("")
-        self.gridLayout_2.addWidget(self.cb_lcb, 5, 4, 1, 1)
-        self.le_directory = QtWidgets.QLineEdit(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_directory.setFont(font)
-        self.le_directory.setText("")
-        self.le_directory.setObjectName("le_directory")
-        self.gridLayout_2.addWidget(self.le_directory, 0, 2, 1, 1)
-        self.cb_calib_scheme = QtWidgets.QComboBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_calib_scheme.setFont(font)
-        self.cb_calib_scheme.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_calib_scheme.setObjectName("cb_calib_scheme")
-        self.cb_calib_scheme.addItem("")
-        self.cb_calib_scheme.addItem("")
-        self.gridLayout_2.addWidget(self.cb_calib_scheme, 4, 2, 1, 1)
-        self.label_dir = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_dir.setFont(font)
-        self.label_dir.setObjectName("label_dir")
-        self.gridLayout_2.addWidget(self.label_dir, 0, 0, 1, 1)
-        self.label_wavelength = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_wavelength.setFont(font)
-        self.label_wavelength.setObjectName("label_wavelength")
-        self.gridLayout_2.addWidget(self.label_wavelength, 3, 0, 1, 1)
-        self.le_wavelength = QtWidgets.QLineEdit(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_wavelength.setFont(font)
-        self.le_wavelength.setObjectName("le_wavelength")
-        self.gridLayout_2.addWidget(self.le_wavelength, 3, 2, 1, 1)
-        self.le_swing = QtWidgets.QLineEdit(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_swing.setFont(font)
-        self.le_swing.setObjectName("le_swing")
-        self.gridLayout_2.addWidget(self.le_swing, 2, 2, 1, 1)
-        self.qbutton_browse = QtWidgets.QPushButton(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.qbutton_browse.setFont(font)
-        self.qbutton_browse.setAutoFillBackground(False)
-        self.qbutton_browse.setCheckable(False)
-        self.qbutton_browse.setDefault(False)
-        self.qbutton_browse.setObjectName("qbutton_browse")
-        self.gridLayout_2.addWidget(self.qbutton_browse, 0, 3, 1, 1)
-        self.label_scheme = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_scheme.setFont(font)
-        self.label_scheme.setObjectName("label_scheme")
-        self.gridLayout_2.addWidget(self.label_scheme, 4, 0, 1, 1)
-        self.label_swing = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_swing.setFont(font)
-        self.label_swing.setObjectName("label_swing")
-        self.gridLayout_2.addWidget(self.label_swing, 2, 0, 1, 1)
-        self.chb_use_roi = QtWidgets.QCheckBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.chb_use_roi.setFont(font)
-        self.chb_use_roi.setObjectName("chb_use_roi")
-        self.gridLayout_2.addWidget(self.chb_use_roi, 7, 0, 1, 3)
-        self.label_lca = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_lca.setFont(font)
-        self.label_lca.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_lca.setObjectName("label_lca")
-        self.gridLayout_2.addWidget(self.label_lca, 4, 3, 1, 1)
-        self.cb_lca = QtWidgets.QComboBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_lca.setFont(font)
-        self.cb_lca.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_lca.setObjectName("cb_lca")
-        self.cb_lca.addItem("")
-        self.gridLayout_2.addWidget(self.cb_lca, 5, 3, 1, 1)
-        self.label_lcb = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_lcb.setFont(font)
-        self.label_lcb.setAlignment(QtCore.Qt.AlignCenter)
-        self.label_lcb.setObjectName("label_lcb")
-        self.gridLayout_2.addWidget(self.label_lcb, 4, 4, 1, 1)
-        self.label_calib_mode = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_calib_mode.setFont(font)
-        self.label_calib_mode.setObjectName("label_calib_mode")
-        self.gridLayout_2.addWidget(self.label_calib_mode, 5, 0, 1, 1)
-        self.cb_calib_mode = QtWidgets.QComboBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        font.setKerning(True)
-        self.cb_calib_mode.setFont(font)
-        self.cb_calib_mode.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_calib_mode.setObjectName("cb_calib_mode")
-        self.cb_calib_mode.addItem("")
-        self.cb_calib_mode.addItem("")
-        self.gridLayout_2.addWidget(self.cb_calib_mode, 5, 2, 1, 1)
-        self.label_cfg_group = QtWidgets.QLabel(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_cfg_group.setFont(font)
-        self.label_cfg_group.setObjectName("label_cfg_group")
-        self.gridLayout_2.addWidget(self.label_cfg_group, 6, 0, 1, 1)
-        self.cb_config_group = QtWidgets.QComboBox(self.calib_params)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_config_group.setFont(font)
-        self.cb_config_group.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_config_group.setObjectName("cb_config_group")
-        self.gridLayout_2.addWidget(self.cb_config_group, 6, 2, 1, 1)
-        self.gridLayout.addWidget(self.calib_params, 3, 0, 1, 1)
-        self.connect_to_micromanager = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
-        font = QtGui.QFont()
-        font.setBold(True)
-        font.setItalic(False)
-        self.connect_to_micromanager.setFont(font)
-        self.connect_to_micromanager.setTitle("")
-        self.connect_to_micromanager.setObjectName("connect_to_micromanager")
-        self.gridLayout_14 = QtWidgets.QGridLayout(self.connect_to_micromanager)
-        self.gridLayout_14.setContentsMargins(-1, 12, -1, -1)
-        self.gridLayout_14.setVerticalSpacing(20)
-        self.gridLayout_14.setObjectName("gridLayout_14")
-        self.le_mm_status = QtWidgets.QLineEdit(self.connect_to_micromanager)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_mm_status.setFont(font)
-        self.le_mm_status.setText("")
-        self.le_mm_status.setObjectName("le_mm_status")
-        self.gridLayout_14.addWidget(self.le_mm_status, 0, 1, 1, 1)
-        self.qbutton_mm_connect = QtWidgets.QPushButton(self.connect_to_micromanager)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.qbutton_mm_connect.setFont(font)
-        self.qbutton_mm_connect.setObjectName("qbutton_mm_connect")
-        self.gridLayout_14.addWidget(self.qbutton_mm_connect, 0, 0, 1, 1)
-        self.gridLayout.addWidget(self.connect_to_micromanager, 0, 0, 3, 1)
         self.run_calib = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
         font = QtGui.QFont()
         font.setBold(True)
@@ -405,7 +209,156 @@ def setupUi(self, Form):
         self.tb_calib_assessment.setFont(font)
         self.tb_calib_assessment.setObjectName("tb_calib_assessment")
         self.gridLayout_12.addWidget(self.tb_calib_assessment, 8, 1, 1, 1)
-        self.gridLayout.addWidget(self.run_calib, 4, 0, 1, 1)
+        self.gridLayout.addWidget(self.run_calib, 1, 0, 1, 1)
+        self.calib_params = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setItalic(False)
+        self.calib_params.setFont(font)
+        self.calib_params.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
+        self.calib_params.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.calib_params.setCheckable(False)
+        self.calib_params.setObjectName("calib_params")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.calib_params)
+        self.gridLayout_2.setContentsMargins(-1, 12, -1, -1)
+        self.gridLayout_2.setVerticalSpacing(6)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.label_wavelength = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_wavelength.setFont(font)
+        self.label_wavelength.setObjectName("label_wavelength")
+        self.gridLayout_2.addWidget(self.label_wavelength, 3, 0, 1, 1)
+        self.label_dir = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_dir.setFont(font)
+        self.label_dir.setObjectName("label_dir")
+        self.gridLayout_2.addWidget(self.label_dir, 0, 0, 1, 1)
+        self.cb_lca = QtWidgets.QComboBox(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_lca.setFont(font)
+        self.cb_lca.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_lca.setObjectName("cb_lca")
+        self.cb_lca.addItem("")
+        self.gridLayout_2.addWidget(self.cb_lca, 5, 2, 1, 1)
+        self.cb_calib_scheme = QtWidgets.QComboBox(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_calib_scheme.setFont(font)
+        self.cb_calib_scheme.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_calib_scheme.setObjectName("cb_calib_scheme")
+        self.cb_calib_scheme.addItem("")
+        self.cb_calib_scheme.addItem("")
+        self.gridLayout_2.addWidget(self.cb_calib_scheme, 4, 1, 1, 1)
+        self.cb_lcb = QtWidgets.QComboBox(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_lcb.setFont(font)
+        self.cb_lcb.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_lcb.setObjectName("cb_lcb")
+        self.cb_lcb.addItem("")
+        self.gridLayout_2.addWidget(self.cb_lcb, 5, 3, 1, 1)
+        self.label_lca = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_lca.setFont(font)
+        self.label_lca.setAlignment(QtCore.Qt.AlignCenter)
+        self.label_lca.setObjectName("label_lca")
+        self.gridLayout_2.addWidget(self.label_lca, 4, 2, 1, 1)
+        self.le_swing = QtWidgets.QLineEdit(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.le_swing.setFont(font)
+        self.le_swing.setObjectName("le_swing")
+        self.gridLayout_2.addWidget(self.le_swing, 2, 1, 1, 1)
+        self.le_directory = QtWidgets.QLineEdit(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.le_directory.setFont(font)
+        self.le_directory.setText("")
+        self.le_directory.setObjectName("le_directory")
+        self.gridLayout_2.addWidget(self.le_directory, 0, 1, 1, 1)
+        self.le_wavelength = QtWidgets.QLineEdit(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.le_wavelength.setFont(font)
+        self.le_wavelength.setObjectName("le_wavelength")
+        self.gridLayout_2.addWidget(self.le_wavelength, 3, 1, 1, 1)
+        self.label_lcb = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_lcb.setFont(font)
+        self.label_lcb.setAlignment(QtCore.Qt.AlignCenter)
+        self.label_lcb.setObjectName("label_lcb")
+        self.gridLayout_2.addWidget(self.label_lcb, 4, 3, 1, 1)
+        self.label_swing = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_swing.setFont(font)
+        self.label_swing.setObjectName("label_swing")
+        self.gridLayout_2.addWidget(self.label_swing, 2, 0, 1, 1)
+        self.label_calib_mode = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_calib_mode.setFont(font)
+        self.label_calib_mode.setObjectName("label_calib_mode")
+        self.gridLayout_2.addWidget(self.label_calib_mode, 5, 0, 1, 1)
+        self.label_cfg_group = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_cfg_group.setFont(font)
+        self.label_cfg_group.setObjectName("label_cfg_group")
+        self.gridLayout_2.addWidget(self.label_cfg_group, 6, 0, 1, 1)
+        self.label_scheme = QtWidgets.QLabel(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_scheme.setFont(font)
+        self.label_scheme.setObjectName("label_scheme")
+        self.gridLayout_2.addWidget(self.label_scheme, 4, 0, 1, 1)
+        self.cb_config_group = QtWidgets.QComboBox(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_config_group.setFont(font)
+        self.cb_config_group.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_config_group.setObjectName("cb_config_group")
+        self.gridLayout_2.addWidget(self.cb_config_group, 6, 1, 1, 1)
+        self.cb_calib_mode = QtWidgets.QComboBox(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        font.setKerning(True)
+        self.cb_calib_mode.setFont(font)
+        self.cb_calib_mode.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_calib_mode.setObjectName("cb_calib_mode")
+        self.gridLayout_2.addWidget(self.cb_calib_mode, 5, 1, 1, 1)
+        self.qbutton_browse = QtWidgets.QPushButton(self.calib_params)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.qbutton_browse.setFont(font)
+        self.qbutton_browse.setAutoFillBackground(False)
+        self.qbutton_browse.setCheckable(False)
+        self.qbutton_browse.setDefault(False)
+        self.qbutton_browse.setObjectName("qbutton_browse")
+        self.gridLayout_2.addWidget(self.qbutton_browse, 0, 2, 1, 1)
+        self.gridLayout.addWidget(self.calib_params, 0, 0, 1, 1)
         self.tabWidget_2 = QtWidgets.QTabWidget(self.scrollAreaWidgetContents)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
         sizePolicy.setHorizontalStretch(0)
@@ -506,7 +459,7 @@ def setupUi(self, Form):
         self.label_note.setObjectName("label_note")
         self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_note)
         self.tabWidget_2.addTab(self.tab_notes, "")
-        self.gridLayout.addWidget(self.tabWidget_2, 6, 0, 1, 1, QtCore.Qt.AlignTop)
+        self.gridLayout.addWidget(self.tabWidget_2, 3, 0, 1, 1, QtCore.Qt.AlignTop)
         self.capture_background = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
         font = QtGui.QFont()
         font.setBold(True)
@@ -552,7 +505,7 @@ def setupUi(self, Form):
         self.label_n_avg.setFont(font)
         self.label_n_avg.setObjectName("label_n_avg")
         self.gridLayout_3.addWidget(self.label_n_avg, 1, 0, 1, 1)
-        self.gridLayout.addWidget(self.capture_background, 5, 0, 1, 1)
+        self.gridLayout.addWidget(self.capture_background, 2, 0, 1, 1)
         self.scrollArea.setWidget(self.scrollAreaWidgetContents)
         self.gridLayout_5.addWidget(self.scrollArea, 0, 0, 1, 1)
         self.tabWidget.addTab(self.Calibration, "")
@@ -604,6 +557,13 @@ def setupUi(self, Form):
         self.gridLayout_13.setContentsMargins(-1, 12, -1, -1)
         self.gridLayout_13.setVerticalSpacing(6)
         self.gridLayout_13.setObjectName("gridLayout_13")
+        self.qbutton_acq_birefringence = QtWidgets.QPushButton(self.acquire)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.qbutton_acq_birefringence.setFont(font)
+        self.qbutton_acq_birefringence.setObjectName("qbutton_acq_birefringence")
+        self.gridLayout_13.addWidget(self.qbutton_acq_birefringence, 2, 0, 1, 1)
         self.qbutton_acq_phase = QtWidgets.QPushButton(self.acquire)
         font = QtGui.QFont()
         font.setBold(False)
@@ -618,28 +578,106 @@ def setupUi(self, Form):
         self.qbutton_acq_birefringence_phase.setFont(font)
         self.qbutton_acq_birefringence_phase.setObjectName("qbutton_acq_birefringence_phase")
         self.gridLayout_13.addWidget(self.qbutton_acq_birefringence_phase, 2, 2, 1, 1)
-        self.qbutton_acq_birefringence = QtWidgets.QPushButton(self.acquire)
+        self.qbutton_stop_acq = QtWidgets.QPushButton(self.acquire)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
-        self.qbutton_acq_birefringence.setFont(font)
-        self.qbutton_acq_birefringence.setObjectName("qbutton_acq_birefringence")
-        self.gridLayout_13.addWidget(self.qbutton_acq_birefringence, 2, 0, 1, 1)
-        self.qbutton_listen = QtWidgets.QPushButton(self.acquire)
+        self.qbutton_stop_acq.setFont(font)
+        self.qbutton_stop_acq.setObjectName("qbutton_stop_acq")
+        self.gridLayout_13.addWidget(self.qbutton_stop_acq, 3, 0, 1, 3)
+        self.gridLayout_15.addWidget(self.acquire, 0, 0, 1, 2)
+        self.acq_settings = QtWidgets.QGroupBox(self.scrollAreaWidgetContents_4)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.acq_settings.sizePolicy().hasHeightForWidth())
+        self.acq_settings.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setItalic(False)
+        self.acq_settings.setFont(font)
+        self.acq_settings.setFocusPolicy(QtCore.Qt.TabFocus)
+        self.acq_settings.setFlat(False)
+        self.acq_settings.setObjectName("acq_settings")
+        self.gridLayout_8 = QtWidgets.QGridLayout(self.acq_settings)
+        self.gridLayout_8.setContentsMargins(-1, 12, -1, -1)
+        self.gridLayout_8.setVerticalSpacing(6)
+        self.gridLayout_8.setObjectName("gridLayout_8")
+        self.label_zstart = QtWidgets.QLabel(self.acq_settings)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
-        self.qbutton_listen.setFont(font)
-        self.qbutton_listen.setObjectName("qbutton_listen")
-        self.gridLayout_13.addWidget(self.qbutton_listen, 3, 0, 1, 3)
-        self.qbutton_stop_acq = QtWidgets.QPushButton(self.acquire)
+        self.label_zstart.setFont(font)
+        self.label_zstart.setObjectName("label_zstart")
+        self.gridLayout_8.addWidget(self.label_zstart, 1, 0, 1, 1)
+        self.label_zend = QtWidgets.QLabel(self.acq_settings)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
-        self.qbutton_stop_acq.setFont(font)
-        self.qbutton_stop_acq.setObjectName("qbutton_stop_acq")
-        self.gridLayout_13.addWidget(self.qbutton_stop_acq, 4, 0, 1, 3)
-        self.gridLayout_15.addWidget(self.acquire, 0, 0, 1, 2)
+        self.label_zend.setFont(font)
+        self.label_zend.setObjectName("label_zend")
+        self.gridLayout_8.addWidget(self.label_zend, 1, 1, 1, 1)
+        self.label_zstep = QtWidgets.QLabel(self.acq_settings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_zstep.setFont(font)
+        self.label_zstep.setObjectName("label_zstep")
+        self.gridLayout_8.addWidget(self.label_zstep, 1, 2, 1, 1)
+        self.label_birefringence = QtWidgets.QLabel(self.acq_settings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_birefringence.setFont(font)
+        self.label_birefringence.setObjectName("label_birefringence")
+        self.gridLayout_8.addWidget(self.label_birefringence, 3, 0, 1, 1)
+        self.le_zstart = QtWidgets.QLineEdit(self.acq_settings)
+        self.le_zstart.setObjectName("le_zstart")
+        self.gridLayout_8.addWidget(self.le_zstart, 2, 0, 1, 1)
+        self.cb_phase = QtWidgets.QComboBox(self.acq_settings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_phase.setFont(font)
+        self.cb_phase.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_phase.setObjectName("cb_phase")
+        self.cb_phase.addItem("")
+        self.cb_phase.addItem("")
+        self.gridLayout_8.addWidget(self.cb_phase, 4, 1, 1, 1)
+        self.le_zstep = QtWidgets.QLineEdit(self.acq_settings)
+        self.le_zstep.setObjectName("le_zstep")
+        self.gridLayout_8.addWidget(self.le_zstep, 2, 2, 1, 1)
+        self.chb_phase_from_bf = QtWidgets.QCheckBox(self.acq_settings)
+        self.chb_phase_from_bf.setObjectName("chb_phase_from_bf")
+        self.gridLayout_8.addWidget(self.chb_phase_from_bf, 4, 2, 1, 1)
+        self.label_phase = QtWidgets.QLabel(self.acq_settings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.label_phase.setFont(font)
+        self.label_phase.setObjectName("label_phase")
+        self.gridLayout_8.addWidget(self.label_phase, 4, 0, 1, 1)
+        self.cb_acq_channel = QtWidgets.QComboBox(self.acq_settings)
+        self.cb_acq_channel.setCurrentText("")
+        self.cb_acq_channel.setObjectName("cb_acq_channel")
+        self.gridLayout_8.addWidget(self.cb_acq_channel, 5, 1, 1, 1)
+        self.cb_birefringence = QtWidgets.QComboBox(self.acq_settings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.cb_birefringence.setFont(font)
+        self.cb_birefringence.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.cb_birefringence.setObjectName("cb_birefringence")
+        self.cb_birefringence.addItem("")
+        self.cb_birefringence.addItem("")
+        self.gridLayout_8.addWidget(self.cb_birefringence, 3, 1, 1, 1)
+        self.labe_acq_channel = QtWidgets.QLabel(self.acq_settings)
+        self.labe_acq_channel.setObjectName("labe_acq_channel")
+        self.gridLayout_8.addWidget(self.labe_acq_channel, 5, 0, 1, 1)
+        self.le_zend = QtWidgets.QLineEdit(self.acq_settings)
+        self.le_zend.setObjectName("le_zend")
+        self.gridLayout_8.addWidget(self.le_zend, 2, 1, 1, 1)
+        self.gridLayout_15.addWidget(self.acq_settings, 1, 0, 1, 1)
         self.ReconSettings = QtWidgets.QGroupBox(self.scrollAreaWidgetContents_4)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
@@ -656,67 +694,37 @@ def setupUi(self, Form):
         self.gridLayout_9.setContentsMargins(-1, 12, -1, -1)
         self.gridLayout_9.setVerticalSpacing(6)
         self.gridLayout_9.setObjectName("gridLayout_9")
-        self.tabWidget_3 = QtWidgets.QTabWidget(self.ReconSettings)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.tabWidget_3.sizePolicy().hasHeightForWidth())
-        self.tabWidget_3.setSizePolicy(sizePolicy)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.tabWidget_3.setFont(font)
-        self.tabWidget_3.setObjectName("tabWidget_3")
-        self.General = QtWidgets.QWidget()
-        self.General.setObjectName("General")
-        self.gridLayout_10 = QtWidgets.QGridLayout(self.General)
-        self.gridLayout_10.setContentsMargins(4, 15, 4, 4)
-        self.gridLayout_10.setVerticalSpacing(20)
-        self.gridLayout_10.setObjectName("gridLayout_10")
-        self.groupBox = QtWidgets.QGroupBox(self.General)
-        self.groupBox.setTitle("")
-        self.groupBox.setFlat(False)
-        self.groupBox.setObjectName("groupBox")
-        self.gridLayout_20 = QtWidgets.QGridLayout(self.groupBox)
-        self.gridLayout_20.setVerticalSpacing(6)
-        self.gridLayout_20.setObjectName("gridLayout_20")
-        self.label_data_save_name = QtWidgets.QLabel(self.groupBox)
-        self.label_data_save_name.setObjectName("label_data_save_name")
-        self.gridLayout_20.addWidget(self.label_data_save_name, 2, 0, 1, 1)
-        self.qbutton_browse_bg_path = QtWidgets.QPushButton(self.groupBox)
-        self.qbutton_browse_bg_path.setObjectName("qbutton_browse_bg_path")
-        self.gridLayout_20.addWidget(self.qbutton_browse_bg_path, 5, 2, 1, 1)
-        self.qbutton_browse_calib_meta = QtWidgets.QPushButton(self.groupBox)
-        self.qbutton_browse_calib_meta.setObjectName("qbutton_browse_calib_meta")
-        self.gridLayout_20.addWidget(self.qbutton_browse_calib_meta, 3, 2, 1, 1)
-        self.label_save_dir = QtWidgets.QLabel(self.groupBox)
+        self.label_save_dir = QtWidgets.QLabel(self.ReconSettings)
         font = QtGui.QFont()
         font.setBold(False)
         font.setItalic(False)
         self.label_save_dir.setFont(font)
         self.label_save_dir.setObjectName("label_save_dir")
-        self.gridLayout_20.addWidget(self.label_save_dir, 1, 0, 1, 1)
-        self.label_n_media = QtWidgets.QLabel(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
+        self.gridLayout_9.addWidget(self.label_save_dir, 0, 0, 1, 1)
+        self.le_gpu_id = QtWidgets.QLineEdit(self.ReconSettings)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_n_media.sizePolicy().hasHeightForWidth())
-        self.label_n_media.setSizePolicy(sizePolicy)
-        self.label_n_media.setObjectName("label_n_media")
-        self.gridLayout_20.addWidget(self.label_n_media, 11, 0, 1, 1)
-        self.le_save_dir = QtWidgets.QLineEdit(self.groupBox)
-        self.le_save_dir.setPlaceholderText("")
-        self.le_save_dir.setObjectName("le_save_dir")
-        self.gridLayout_20.addWidget(self.le_save_dir, 1, 1, 1, 1)
-        self.label_recon_wavelength = QtWidgets.QLabel(self.groupBox)
+        sizePolicy.setHeightForWidth(self.le_gpu_id.sizePolicy().hasHeightForWidth())
+        self.le_gpu_id.setSizePolicy(sizePolicy)
+        self.le_gpu_id.setObjectName("le_gpu_id")
+        self.gridLayout_9.addWidget(self.le_gpu_id, 4, 1, 1, 1)
+        self.qbutton_browse_save_dir = QtWidgets.QPushButton(self.ReconSettings)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setItalic(False)
+        self.qbutton_browse_save_dir.setFont(font)
+        self.qbutton_browse_save_dir.setObjectName("qbutton_browse_save_dir")
+        self.gridLayout_9.addWidget(self.qbutton_browse_save_dir, 0, 2, 1, 1)
+        self.label_mag = QtWidgets.QLabel(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_recon_wavelength.sizePolicy().hasHeightForWidth())
-        self.label_recon_wavelength.setSizePolicy(sizePolicy)
-        self.label_recon_wavelength.setObjectName("label_recon_wavelength")
-        self.gridLayout_20.addWidget(self.label_recon_wavelength, 7, 0, 1, 1)
-        self.le_ps = QtWidgets.QLineEdit(self.groupBox)
+        sizePolicy.setHeightForWidth(self.label_mag.sizePolicy().hasHeightForWidth())
+        self.label_mag.setSizePolicy(sizePolicy)
+        self.label_mag.setObjectName("label_mag")
+        self.gridLayout_9.addWidget(self.label_mag, 10, 0, 1, 1)
+        self.le_ps = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -724,126 +732,103 @@ def setupUi(self, Form):
         self.le_ps.setSizePolicy(sizePolicy)
         self.le_ps.setText("")
         self.le_ps.setObjectName("le_ps")
-        self.gridLayout_20.addWidget(self.le_ps, 10, 1, 1, 1)
-        self.le_bg_path = QtWidgets.QLineEdit(self.groupBox)
-        self.le_bg_path.setPlaceholderText("")
-        self.le_bg_path.setObjectName("le_bg_path")
-        self.gridLayout_20.addWidget(self.le_bg_path, 5, 1, 1, 1)
-        self.le_recon_wavelength = QtWidgets.QLineEdit(self.groupBox)
+        self.gridLayout_9.addWidget(self.le_ps, 8, 1, 1, 1)
+        self.label_gpu_id = QtWidgets.QLabel(self.ReconSettings)
+        self.label_gpu_id.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+        self.label_gpu_id.setObjectName("label_gpu_id")
+        self.gridLayout_9.addWidget(self.label_gpu_id, 4, 0, 1, 1)
+        self.chb_use_gpu = QtWidgets.QCheckBox(self.ReconSettings)
+        self.chb_use_gpu.setObjectName("chb_use_gpu")
+        self.gridLayout_9.addWidget(self.chb_use_gpu, 4, 2, 1, 1)
+        self.label_obj_na = QtWidgets.QLabel(self.ReconSettings)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label_obj_na.sizePolicy().hasHeightForWidth())
+        self.label_obj_na.setSizePolicy(sizePolicy)
+        self.label_obj_na.setObjectName("label_obj_na")
+        self.gridLayout_9.addWidget(self.label_obj_na, 6, 0, 1, 1)
+        self.label_data_save_name = QtWidgets.QLabel(self.ReconSettings)
+        self.label_data_save_name.setObjectName("label_data_save_name")
+        self.gridLayout_9.addWidget(self.label_data_save_name, 1, 0, 1, 1)
+        self.label_bg_path = QtWidgets.QLabel(self.ReconSettings)
+        self.label_bg_path.setObjectName("label_bg_path")
+        self.gridLayout_9.addWidget(self.label_bg_path, 3, 0, 1, 1)
+        self.qbutton_browse_bg_path = QtWidgets.QPushButton(self.ReconSettings)
+        self.qbutton_browse_bg_path.setObjectName("qbutton_browse_bg_path")
+        self.gridLayout_9.addWidget(self.qbutton_browse_bg_path, 3, 2, 1, 1)
+        self.le_recon_wavelength = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.le_recon_wavelength.sizePolicy().hasHeightForWidth())
         self.le_recon_wavelength.setSizePolicy(sizePolicy)
         self.le_recon_wavelength.setObjectName("le_recon_wavelength")
-        self.gridLayout_20.addWidget(self.le_recon_wavelength, 7, 1, 1, 1)
-        self.chb_use_gpu = QtWidgets.QCheckBox(self.groupBox)
-        self.chb_use_gpu.setObjectName("chb_use_gpu")
-        self.gridLayout_20.addWidget(self.chb_use_gpu, 6, 2, 1, 1)
-        self.le_n_media = QtWidgets.QLineEdit(self.groupBox)
+        self.gridLayout_9.addWidget(self.le_recon_wavelength, 5, 1, 1, 1)
+        self.le_mag = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_n_media.sizePolicy().hasHeightForWidth())
-        self.le_n_media.setSizePolicy(sizePolicy)
-        self.le_n_media.setObjectName("le_n_media")
-        self.gridLayout_20.addWidget(self.le_n_media, 11, 1, 1, 1)
-        self.qbutton_browse_save_dir = QtWidgets.QPushButton(self.groupBox)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.qbutton_browse_save_dir.setFont(font)
-        self.qbutton_browse_save_dir.setObjectName("qbutton_browse_save_dir")
-        self.gridLayout_20.addWidget(self.qbutton_browse_save_dir, 1, 2, 1, 1)
-        self.qbutton_load_default_config = QtWidgets.QPushButton(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHeightForWidth(self.le_mag.sizePolicy().hasHeightForWidth())
+        self.le_mag.setSizePolicy(sizePolicy)
+        self.le_mag.setObjectName("le_mag")
+        self.gridLayout_9.addWidget(self.le_mag, 10, 1, 1, 1)
+        self.label_recon_wavelength = QtWidgets.QLabel(self.ReconSettings)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.qbutton_load_default_config.sizePolicy().hasHeightForWidth())
-        self.qbutton_load_default_config.setSizePolicy(sizePolicy)
-        self.qbutton_load_default_config.setObjectName("qbutton_load_default_config")
-        self.gridLayout_20.addWidget(self.qbutton_load_default_config, 13, 0, 1, 3)
-        self.le_data_dir = QtWidgets.QLineEdit(self.groupBox)
-        self.le_data_dir.setPlaceholderText("")
-        self.le_data_dir.setObjectName("le_data_dir")
-        self.gridLayout_20.addWidget(self.le_data_dir, 0, 1, 1, 1)
-        self.le_obj_na = QtWidgets.QLineEdit(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHeightForWidth(self.label_recon_wavelength.sizePolicy().hasHeightForWidth())
+        self.label_recon_wavelength.setSizePolicy(sizePolicy)
+        self.label_recon_wavelength.setObjectName("label_recon_wavelength")
+        self.gridLayout_9.addWidget(self.label_recon_wavelength, 5, 0, 1, 1)
+        self.label_n_media = QtWidgets.QLabel(self.ReconSettings)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_obj_na.sizePolicy().hasHeightForWidth())
-        self.le_obj_na.setSizePolicy(sizePolicy)
-        self.le_obj_na.setObjectName("le_obj_na")
-        self.gridLayout_20.addWidget(self.le_obj_na, 8, 1, 1, 1)
-        self.le_cond_na = QtWidgets.QLineEdit(self.groupBox)
+        sizePolicy.setHeightForWidth(self.label_n_media.sizePolicy().hasHeightForWidth())
+        self.label_n_media.setSizePolicy(sizePolicy)
+        self.label_n_media.setObjectName("label_n_media")
+        self.gridLayout_9.addWidget(self.label_n_media, 9, 0, 1, 1)
+        self.le_n_media = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_cond_na.sizePolicy().hasHeightForWidth())
-        self.le_cond_na.setSizePolicy(sizePolicy)
-        self.le_cond_na.setObjectName("le_cond_na")
-        self.gridLayout_20.addWidget(self.le_cond_na, 9, 1, 1, 1)
-        self.label_data_dir = QtWidgets.QLabel(self.groupBox)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_data_dir.setFont(font)
-        self.label_data_dir.setObjectName("label_data_dir")
-        self.gridLayout_20.addWidget(self.label_data_dir, 0, 0, 1, 1)
-        self.label_bg_method = QtWidgets.QLabel(self.groupBox)
+        sizePolicy.setHeightForWidth(self.le_n_media.sizePolicy().hasHeightForWidth())
+        self.le_n_media.setSizePolicy(sizePolicy)
+        self.le_n_media.setObjectName("le_n_media")
+        self.gridLayout_9.addWidget(self.le_n_media, 9, 1, 1, 1)
+        self.label_bg_method = QtWidgets.QLabel(self.ReconSettings)
         self.label_bg_method.setObjectName("label_bg_method")
-        self.gridLayout_20.addWidget(self.label_bg_method, 4, 0, 1, 1)
-        self.label_cond_na = QtWidgets.QLabel(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_cond_na.sizePolicy().hasHeightForWidth())
-        self.label_cond_na.setSizePolicy(sizePolicy)
-        self.label_cond_na.setObjectName("label_cond_na")
-        self.gridLayout_20.addWidget(self.label_cond_na, 9, 0, 1, 1)
-        self.label_obj_na = QtWidgets.QLabel(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_obj_na.sizePolicy().hasHeightForWidth())
-        self.label_obj_na.setSizePolicy(sizePolicy)
-        self.label_obj_na.setObjectName("label_obj_na")
-        self.gridLayout_20.addWidget(self.label_obj_na, 8, 0, 1, 1)
-        self.label_calib_meta = QtWidgets.QLabel(self.groupBox)
-        self.label_calib_meta.setObjectName("label_calib_meta")
-        self.gridLayout_20.addWidget(self.label_calib_meta, 3, 0, 1, 1)
-        self.le_gpu_id = QtWidgets.QLineEdit(self.groupBox)
+        self.gridLayout_9.addWidget(self.label_bg_method, 2, 0, 1, 1)
+        self.le_obj_na = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_gpu_id.sizePolicy().hasHeightForWidth())
-        self.le_gpu_id.setSizePolicy(sizePolicy)
-        self.le_gpu_id.setObjectName("le_gpu_id")
-        self.gridLayout_20.addWidget(self.le_gpu_id, 6, 1, 1, 1)
-        self.label_ps = QtWidgets.QLabel(self.groupBox)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.le_obj_na.sizePolicy().hasHeightForWidth())
+        self.le_obj_na.setSizePolicy(sizePolicy)
+        self.le_obj_na.setObjectName("le_obj_na")
+        self.gridLayout_9.addWidget(self.le_obj_na, 6, 1, 1, 1)
+        self.label_cond_na = QtWidgets.QLabel(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_ps.sizePolicy().hasHeightForWidth())
-        self.label_ps.setSizePolicy(sizePolicy)
-        self.label_ps.setObjectName("label_ps")
-        self.gridLayout_20.addWidget(self.label_ps, 10, 0, 1, 1)
-        self.qbutton_save_config = QtWidgets.QPushButton(self.groupBox)
+        sizePolicy.setHeightForWidth(self.label_cond_na.sizePolicy().hasHeightForWidth())
+        self.label_cond_na.setSizePolicy(sizePolicy)
+        self.label_cond_na.setObjectName("label_cond_na")
+        self.gridLayout_9.addWidget(self.label_cond_na, 7, 0, 1, 1)
+        self.le_cond_na = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.qbutton_save_config.sizePolicy().hasHeightForWidth())
-        self.qbutton_save_config.setSizePolicy(sizePolicy)
-        self.qbutton_save_config.setObjectName("qbutton_save_config")
-        self.gridLayout_20.addWidget(self.qbutton_save_config, 15, 0, 1, 3)
-        self.label_gpu_id = QtWidgets.QLabel(self.groupBox)
-        self.label_gpu_id.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
-        self.label_gpu_id.setObjectName("label_gpu_id")
-        self.gridLayout_20.addWidget(self.label_gpu_id, 6, 0, 1, 1)
-        self.label_bg_path = QtWidgets.QLabel(self.groupBox)
-        self.label_bg_path.setObjectName("label_bg_path")
-        self.gridLayout_20.addWidget(self.label_bg_path, 5, 0, 1, 1)
-        self.le_data_save_name = QtWidgets.QLineEdit(self.groupBox)
+        sizePolicy.setHeightForWidth(self.le_cond_na.sizePolicy().hasHeightForWidth())
+        self.le_cond_na.setSizePolicy(sizePolicy)
+        self.le_cond_na.setObjectName("le_cond_na")
+        self.gridLayout_9.addWidget(self.le_cond_na, 7, 1, 1, 1)
+        self.le_save_dir = QtWidgets.QLineEdit(self.ReconSettings)
+        self.le_save_dir.setPlaceholderText("")
+        self.le_save_dir.setObjectName("le_save_dir")
+        self.gridLayout_9.addWidget(self.le_save_dir, 0, 1, 1, 1)
+        self.le_data_save_name = QtWidgets.QLineEdit(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -851,313 +836,85 @@ def setupUi(self, Form):
         self.le_data_save_name.setSizePolicy(sizePolicy)
         self.le_data_save_name.setText("")
         self.le_data_save_name.setObjectName("le_data_save_name")
-        self.gridLayout_20.addWidget(self.le_data_save_name, 2, 1, 1, 1)
-        self.qbutton_browse_data_dir = QtWidgets.QPushButton(self.groupBox)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.qbutton_browse_data_dir.setFont(font)
-        self.qbutton_browse_data_dir.setObjectName("qbutton_browse_data_dir")
-        self.gridLayout_20.addWidget(self.qbutton_browse_data_dir, 0, 2, 1, 1)
-        self.le_calibration_metadata = QtWidgets.QLineEdit(self.groupBox)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_calibration_metadata.setFont(font)
-        self.le_calibration_metadata.setInputMask("")
-        self.le_calibration_metadata.setObjectName("le_calibration_metadata")
-        self.gridLayout_20.addWidget(self.le_calibration_metadata, 3, 1, 1, 1)
-        self.qbutton_load_config = QtWidgets.QPushButton(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.qbutton_load_config.sizePolicy().hasHeightForWidth())
-        self.qbutton_load_config.setSizePolicy(sizePolicy)
-        self.qbutton_load_config.setObjectName("qbutton_load_config")
-        self.gridLayout_20.addWidget(self.qbutton_load_config, 14, 0, 1, 3)
-        self.cb_bg_method = QtWidgets.QComboBox(self.groupBox)
+        self.gridLayout_9.addWidget(self.le_data_save_name, 1, 1, 1, 1)
+        self.cb_bg_method = QtWidgets.QComboBox(self.ReconSettings)
         self.cb_bg_method.setFocusPolicy(QtCore.Qt.StrongFocus)
         self.cb_bg_method.setObjectName("cb_bg_method")
         self.cb_bg_method.addItem("")
         self.cb_bg_method.addItem("")
         self.cb_bg_method.addItem("")
-        self.gridLayout_20.addWidget(self.cb_bg_method, 4, 1, 1, 1)
-        self.label_mag = QtWidgets.QLabel(self.groupBox)
+        self.gridLayout_9.addWidget(self.cb_bg_method, 2, 1, 1, 1)
+        self.label_ps = QtWidgets.QLabel(self.ReconSettings)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_mag.sizePolicy().hasHeightForWidth())
-        self.label_mag.setSizePolicy(sizePolicy)
-        self.label_mag.setObjectName("label_mag")
-        self.gridLayout_20.addWidget(self.label_mag, 12, 0, 1, 1)
-        self.le_mag = QtWidgets.QLineEdit(self.groupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_mag.sizePolicy().hasHeightForWidth())
-        self.le_mag.setSizePolicy(sizePolicy)
-        self.le_mag.setObjectName("le_mag")
-        self.gridLayout_20.addWidget(self.le_mag, 12, 1, 1, 1)
-        self.gridLayout_10.addWidget(self.groupBox, 0, 0, 1, 1)
-        self.tabWidget_3.addTab(self.General, "")
-        self.Processing = QtWidgets.QWidget()
-        self.Processing.setObjectName("Processing")
-        self.gridLayout_16 = QtWidgets.QGridLayout(self.Processing)
-        self.gridLayout_16.setVerticalSpacing(20)
-        self.gridLayout_16.setObjectName("gridLayout_16")
-        self.spacer = QtWidgets.QLabel(self.Processing)
-        self.spacer.setText("")
-        self.spacer.setObjectName("spacer")
-        self.gridLayout_16.addWidget(self.spacer, 2, 0, 1, 2)
-        self.phase = QtWidgets.QGroupBox(self.Processing)
+        sizePolicy.setHeightForWidth(self.label_ps.sizePolicy().hasHeightForWidth())
+        self.label_ps.setSizePolicy(sizePolicy)
+        self.label_ps.setObjectName("label_ps")
+        self.gridLayout_9.addWidget(self.label_ps, 8, 0, 1, 1)
+        self.le_bg_path = QtWidgets.QLineEdit(self.ReconSettings)
+        self.le_bg_path.setPlaceholderText("")
+        self.le_bg_path.setObjectName("le_bg_path")
+        self.gridLayout_9.addWidget(self.le_bg_path, 3, 1, 1, 1)
+        self.gridLayout_15.addWidget(self.ReconSettings, 2, 0, 1, 1)
+        self.phase = QtWidgets.QGroupBox(self.scrollAreaWidgetContents_4)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.phase.sizePolicy().hasHeightForWidth())
         self.phase.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setItalic(False)
+        self.phase.setFont(font)
         self.phase.setObjectName("phase")
         self.gridLayout_23 = QtWidgets.QGridLayout(self.phase)
         self.gridLayout_23.setContentsMargins(-1, 12, -1, -1)
         self.gridLayout_23.setVerticalSpacing(6)
         self.gridLayout_23.setObjectName("gridLayout_23")
+        self.label_phase_regularizer = QtWidgets.QLabel(self.phase)
+        self.label_phase_regularizer.setObjectName("label_phase_regularizer")
+        self.gridLayout_23.addWidget(self.label_phase_regularizer, 1, 0, 1, 1)
+        self.label_phase_rho = QtWidgets.QLabel(self.phase)
+        self.label_phase_rho.setObjectName("label_phase_rho")
+        self.gridLayout_23.addWidget(self.label_phase_rho, 3, 0, 1, 1)
         self.le_phase_strength = QtWidgets.QLineEdit(self.phase)
         self.le_phase_strength.setObjectName("le_phase_strength")
-        self.gridLayout_23.addWidget(self.le_phase_strength, 1, 1, 1, 1)
+        self.gridLayout_23.addWidget(self.le_phase_strength, 2, 1, 1, 1)
         self.le_itr = QtWidgets.QLineEdit(self.phase)
         self.le_itr.setObjectName("le_itr")
-        self.gridLayout_23.addWidget(self.le_itr, 3, 1, 1, 1)
-        self.label_phase_strength = QtWidgets.QLabel(self.phase)
-        self.label_phase_strength.setObjectName("label_phase_strength")
-        self.gridLayout_23.addWidget(self.label_phase_strength, 1, 0, 1, 1)
+        self.gridLayout_23.addWidget(self.le_itr, 4, 1, 1, 1)
         self.cb_phase_denoiser = QtWidgets.QComboBox(self.phase)
         self.cb_phase_denoiser.setObjectName("cb_phase_denoiser")
         self.cb_phase_denoiser.addItem("")
         self.cb_phase_denoiser.addItem("")
-        self.gridLayout_23.addWidget(self.cb_phase_denoiser, 0, 1, 1, 1)
-        self.label_itr = QtWidgets.QLabel(self.phase)
-        self.label_itr.setObjectName("label_itr")
-        self.gridLayout_23.addWidget(self.label_itr, 3, 0, 1, 1)
+        self.gridLayout_23.addWidget(self.cb_phase_denoiser, 1, 1, 1, 1)
         self.le_rho = QtWidgets.QLineEdit(self.phase)
         self.le_rho.setObjectName("le_rho")
-        self.gridLayout_23.addWidget(self.le_rho, 2, 1, 1, 1)
-        self.label_phase_regularizer = QtWidgets.QLabel(self.phase)
-        self.label_phase_regularizer.setObjectName("label_phase_regularizer")
-        self.gridLayout_23.addWidget(self.label_phase_regularizer, 0, 0, 1, 1)
-        self.label_phase_rho = QtWidgets.QLabel(self.phase)
-        self.label_phase_rho.setObjectName("label_phase_rho")
-        self.gridLayout_23.addWidget(self.label_phase_rho, 2, 0, 1, 1)
-        self.gridLayout_16.addWidget(self.phase, 1, 0, 1, 1)
-        self.groupBox_2 = QtWidgets.QGroupBox(self.Processing)
-        self.groupBox_2.setEnabled(True)
-        self.groupBox_2.setTitle("")
-        self.groupBox_2.setFlat(False)
-        self.groupBox_2.setObjectName("groupBox_2")
-        self.gridLayout_26 = QtWidgets.QGridLayout(self.groupBox_2)
-        self.gridLayout_26.setVerticalSpacing(6)
-        self.gridLayout_26.setObjectName("gridLayout_26")
-        self.label_timepoints = QtWidgets.QLabel(self.groupBox_2)
-        self.label_timepoints.setObjectName("label_timepoints")
-        self.gridLayout_26.addWidget(self.label_timepoints, 3, 0, 1, 1)
-        self.label_focus_zidx = QtWidgets.QLabel(self.groupBox_2)
-        self.label_focus_zidx.setObjectName("label_focus_zidx")
-        self.gridLayout_26.addWidget(self.label_focus_zidx, 4, 0, 1, 1)
-        self.label_pipeline = QtWidgets.QLabel(self.groupBox_2)
-        self.label_pipeline.setObjectName("label_pipeline")
-        self.gridLayout_26.addWidget(self.label_pipeline, 0, 0, 1, 1)
-        self.cb_method = QtWidgets.QComboBox(self.groupBox_2)
-        self.cb_method.setObjectName("cb_method")
-        self.cb_method.addItem("")
-        self.cb_method.addItem("")
-        self.gridLayout_26.addWidget(self.cb_method, 0, 1, 1, 1)
-        self.le_output_channels = QtWidgets.QLineEdit(self.groupBox_2)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.le_output_channels.sizePolicy().hasHeightForWidth())
-        self.le_output_channels.setSizePolicy(sizePolicy)
-        self.le_output_channels.setMinimumSize(QtCore.QSize(30, 0))
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.le_output_channels.setFont(font)
-        self.le_output_channels.setText("")
-        self.le_output_channels.setPlaceholderText("")
-        self.le_output_channels.setObjectName("le_output_channels")
-        self.gridLayout_26.addWidget(self.le_output_channels, 7, 1, 1, 2)
-        self.le_focus_zidx = QtWidgets.QLineEdit(self.groupBox_2)
-        self.le_focus_zidx.setText("")
-        self.le_focus_zidx.setObjectName("le_focus_zidx")
-        self.gridLayout_26.addWidget(self.le_focus_zidx, 4, 1, 1, 1)
-        self.label_mode = QtWidgets.QLabel(self.groupBox_2)
-        self.label_mode.setObjectName("label_mode")
-        self.gridLayout_26.addWidget(self.label_mode, 1, 0, 1, 1)
-        self.cb_mode = QtWidgets.QComboBox(self.groupBox_2)
-        self.cb_mode.setObjectName("cb_mode")
-        self.cb_mode.addItem("")
-        self.cb_mode.addItem("")
-        self.gridLayout_26.addWidget(self.cb_mode, 1, 1, 1, 1)
-        self.label_bf_chan = QtWidgets.QLabel(self.groupBox_2)
-        self.label_bf_chan.setObjectName("label_bf_chan")
-        self.gridLayout_26.addWidget(self.label_bf_chan, 6, 0, 1, 1)
-        self.le_positions = QtWidgets.QLineEdit(self.groupBox_2)
-        self.le_positions.setObjectName("le_positions")
-        self.gridLayout_26.addWidget(self.le_positions, 2, 1, 1, 1)
-        self.le_timepoints = QtWidgets.QLineEdit(self.groupBox_2)
-        self.le_timepoints.setObjectName("le_timepoints")
-        self.gridLayout_26.addWidget(self.le_timepoints, 3, 1, 1, 1)
-        self.le_bf_chan = QtWidgets.QLineEdit(self.groupBox_2)
-        self.le_bf_chan.setObjectName("le_bf_chan")
-        self.gridLayout_26.addWidget(self.le_bf_chan, 6, 1, 1, 1)
-        self.label_output_channels = QtWidgets.QLabel(self.groupBox_2)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_output_channels.sizePolicy().hasHeightForWidth())
-        self.label_output_channels.setSizePolicy(sizePolicy)
-        self.label_output_channels.setObjectName("label_output_channels")
-        self.gridLayout_26.addWidget(self.label_output_channels, 7, 0, 1, 1)
-        self.label_chan_desc = QtWidgets.QLabel(self.groupBox_2)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.label_chan_desc.sizePolicy().hasHeightForWidth())
-        self.label_chan_desc.setSizePolicy(sizePolicy)
-        font = QtGui.QFont()
-        font.setPointSize(10)
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_chan_desc.setFont(font)
-        self.label_chan_desc.setWordWrap(True)
-        self.label_chan_desc.setObjectName("label_chan_desc")
-        self.gridLayout_26.addWidget(self.label_chan_desc, 8, 1, 1, 2)
-        self.label_positions = QtWidgets.QLabel(self.groupBox_2)
-        self.label_positions.setObjectName("label_positions")
-        self.gridLayout_26.addWidget(self.label_positions, 2, 0, 1, 1)
-        self.label_pad_z = QtWidgets.QLabel(self.groupBox_2)
+        self.gridLayout_23.addWidget(self.le_rho, 3, 1, 1, 1)
+        self.label_itr = QtWidgets.QLabel(self.phase)
+        self.label_itr.setObjectName("label_itr")
+        self.gridLayout_23.addWidget(self.label_itr, 4, 0, 1, 1)
+        self.label_phase_strength = QtWidgets.QLabel(self.phase)
+        self.label_phase_strength.setObjectName("label_phase_strength")
+        self.gridLayout_23.addWidget(self.label_phase_strength, 2, 0, 1, 1)
+        self.label_pad_z = QtWidgets.QLabel(self.phase)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.label_pad_z.sizePolicy().hasHeightForWidth())
         self.label_pad_z.setSizePolicy(sizePolicy)
         self.label_pad_z.setObjectName("label_pad_z")
-        self.gridLayout_26.addWidget(self.label_pad_z, 5, 0, 1, 1)
-        self.le_pad_z = QtWidgets.QLineEdit(self.groupBox_2)
+        self.gridLayout_23.addWidget(self.label_pad_z, 0, 0, 1, 1)
+        self.le_pad_z = QtWidgets.QLineEdit(self.phase)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.le_pad_z.sizePolicy().hasHeightForWidth())
         self.le_pad_z.setSizePolicy(sizePolicy)
         self.le_pad_z.setObjectName("le_pad_z")
-        self.gridLayout_26.addWidget(self.le_pad_z, 5, 1, 1, 1)
-        self.gridLayout_16.addWidget(self.groupBox_2, 0, 0, 1, 2)
-        self.tabWidget_3.addTab(self.Processing, "")
-        self.gridLayout_9.addWidget(self.tabWidget_3, 3, 0, 1, 4)
-        self.qbutton_reconstruct = QtWidgets.QPushButton(self.ReconSettings)
-        self.qbutton_reconstruct.setObjectName("qbutton_reconstruct")
-        self.gridLayout_9.addWidget(self.qbutton_reconstruct, 5, 0, 1, 4)
-        self.qbutton_stop_reconstruct = QtWidgets.QPushButton(self.ReconSettings)
-        self.qbutton_stop_reconstruct.setObjectName("qbutton_stop_reconstruct")
-        self.gridLayout_9.addWidget(self.qbutton_stop_reconstruct, 6, 0, 1, 4)
-        self.chb_pause_updates = QtWidgets.QCheckBox(self.ReconSettings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.chb_pause_updates.setFont(font)
-        self.chb_pause_updates.setObjectName("chb_pause_updates")
-        self.gridLayout_9.addWidget(self.chb_pause_updates, 1, 0, 1, 1)
-        self.gridLayout_15.addWidget(self.ReconSettings, 4, 0, 2, 2)
-        self.acq_settings = QtWidgets.QGroupBox(self.scrollAreaWidgetContents_4)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.acq_settings.sizePolicy().hasHeightForWidth())
-        self.acq_settings.setSizePolicy(sizePolicy)
-        font = QtGui.QFont()
-        font.setBold(True)
-        font.setItalic(False)
-        self.acq_settings.setFont(font)
-        self.acq_settings.setFocusPolicy(QtCore.Qt.TabFocus)
-        self.acq_settings.setFlat(False)
-        self.acq_settings.setObjectName("acq_settings")
-        self.gridLayout_8 = QtWidgets.QGridLayout(self.acq_settings)
-        self.gridLayout_8.setContentsMargins(-1, 12, -1, -1)
-        self.gridLayout_8.setVerticalSpacing(6)
-        self.gridLayout_8.setObjectName("gridLayout_8")
-        self.label_zstart = QtWidgets.QLabel(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_zstart.setFont(font)
-        self.label_zstart.setObjectName("label_zstart")
-        self.gridLayout_8.addWidget(self.label_zstart, 1, 0, 1, 1)
-        self.label_zend = QtWidgets.QLabel(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_zend.setFont(font)
-        self.label_zend.setObjectName("label_zend")
-        self.gridLayout_8.addWidget(self.label_zend, 1, 1, 1, 1)
-        self.label_zstep = QtWidgets.QLabel(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_zstep.setFont(font)
-        self.label_zstep.setObjectName("label_zstep")
-        self.gridLayout_8.addWidget(self.label_zstep, 1, 2, 1, 1)
-        self.label_birefringence = QtWidgets.QLabel(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_birefringence.setFont(font)
-        self.label_birefringence.setObjectName("label_birefringence")
-        self.gridLayout_8.addWidget(self.label_birefringence, 3, 0, 1, 1)
-        self.le_zstart = QtWidgets.QLineEdit(self.acq_settings)
-        self.le_zstart.setObjectName("le_zstart")
-        self.gridLayout_8.addWidget(self.le_zstart, 2, 0, 1, 1)
-        self.cb_phase = QtWidgets.QComboBox(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_phase.setFont(font)
-        self.cb_phase.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_phase.setObjectName("cb_phase")
-        self.cb_phase.addItem("")
-        self.cb_phase.addItem("")
-        self.gridLayout_8.addWidget(self.cb_phase, 4, 1, 1, 1)
-        self.le_zstep = QtWidgets.QLineEdit(self.acq_settings)
-        self.le_zstep.setObjectName("le_zstep")
-        self.gridLayout_8.addWidget(self.le_zstep, 2, 2, 1, 1)
-        self.chb_phase_from_bf = QtWidgets.QCheckBox(self.acq_settings)
-        self.chb_phase_from_bf.setObjectName("chb_phase_from_bf")
-        self.gridLayout_8.addWidget(self.chb_phase_from_bf, 4, 2, 1, 1)
-        self.label_phase = QtWidgets.QLabel(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.label_phase.setFont(font)
-        self.label_phase.setObjectName("label_phase")
-        self.gridLayout_8.addWidget(self.label_phase, 4, 0, 1, 1)
-        self.cb_acq_channel = QtWidgets.QComboBox(self.acq_settings)
-        self.cb_acq_channel.setCurrentText("")
-        self.cb_acq_channel.setObjectName("cb_acq_channel")
-        self.gridLayout_8.addWidget(self.cb_acq_channel, 5, 1, 1, 1)
-        self.cb_birefringence = QtWidgets.QComboBox(self.acq_settings)
-        font = QtGui.QFont()
-        font.setBold(False)
-        font.setItalic(False)
-        self.cb_birefringence.setFont(font)
-        self.cb_birefringence.setFocusPolicy(QtCore.Qt.StrongFocus)
-        self.cb_birefringence.setObjectName("cb_birefringence")
-        self.cb_birefringence.addItem("")
-        self.cb_birefringence.addItem("")
-        self.gridLayout_8.addWidget(self.cb_birefringence, 3, 1, 1, 1)
-        self.labe_acq_channel = QtWidgets.QLabel(self.acq_settings)
-        self.labe_acq_channel.setObjectName("labe_acq_channel")
-        self.gridLayout_8.addWidget(self.labe_acq_channel, 5, 0, 1, 1)
-        self.le_zend = QtWidgets.QLineEdit(self.acq_settings)
-        self.le_zend.setObjectName("le_zend")
-        self.gridLayout_8.addWidget(self.le_zend, 2, 1, 1, 1)
-        self.gridLayout_15.addWidget(self.acq_settings, 1, 0, 1, 1)
+        self.gridLayout_23.addWidget(self.le_pad_z, 0, 1, 1, 1)
+        self.gridLayout_15.addWidget(self.phase, 3, 0, 1, 1)
         self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_4)
         self.gridLayout_6.addWidget(self.scrollArea_4, 4, 0, 1, 1)
         self.tabWidget.addTab(self.Acquisition, "")
@@ -1378,17 +1135,13 @@ def setupUi(self, Form):
         self.gridLayout_7.addWidget(self.label_logo, 0, 0, 1, 1)
 
         self.retranslateUi(Form)
-        self.tabWidget.setCurrentIndex(1)
+        self.tabWidget.setCurrentIndex(0)
         self.tabWidget_2.setCurrentIndex(2)
         self.cb_loglevel.setCurrentIndex(0)
-        self.tabWidget_3.setCurrentIndex(1)
         QtCore.QMetaObject.connectSlotsByName(Form)
-        Form.setTabOrder(self.le_gui_mode, self.qbutton_gui_mode)
-        Form.setTabOrder(self.qbutton_gui_mode, self.tabWidget)
+        Form.setTabOrder(self.le_mm_status, self.tabWidget)
         Form.setTabOrder(self.tabWidget, self.scrollArea)
-        Form.setTabOrder(self.scrollArea, self.qbutton_mm_connect)
-        Form.setTabOrder(self.qbutton_mm_connect, self.le_mm_status)
-        Form.setTabOrder(self.le_mm_status, self.le_directory)
+        Form.setTabOrder(self.scrollArea, self.le_directory)
         Form.setTabOrder(self.le_directory, self.qbutton_browse)
         Form.setTabOrder(self.qbutton_browse, self.le_swing)
         Form.setTabOrder(self.le_swing, self.le_wavelength)
@@ -1397,8 +1150,7 @@ def setupUi(self, Form):
         Form.setTabOrder(self.cb_calib_mode, self.cb_lca)
         Form.setTabOrder(self.cb_lca, self.cb_lcb)
         Form.setTabOrder(self.cb_lcb, self.cb_config_group)
-        Form.setTabOrder(self.cb_config_group, self.chb_use_roi)
-        Form.setTabOrder(self.chb_use_roi, self.qbutton_calibrate)
+        Form.setTabOrder(self.cb_config_group, self.qbutton_calibrate)
         Form.setTabOrder(self.qbutton_calibrate, self.qbutton_load_calib)
         Form.setTabOrder(self.qbutton_load_calib, self.qbutton_calc_extinction)
         Form.setTabOrder(self.qbutton_calc_extinction, self.qbutton_stop_calib)
@@ -1415,8 +1167,7 @@ def setupUi(self, Form):
         Form.setTabOrder(self.scrollArea_4, self.qbutton_acq_birefringence)
         Form.setTabOrder(self.qbutton_acq_birefringence, self.qbutton_acq_phase)
         Form.setTabOrder(self.qbutton_acq_phase, self.qbutton_acq_birefringence_phase)
-        Form.setTabOrder(self.qbutton_acq_birefringence_phase, self.qbutton_listen)
-        Form.setTabOrder(self.qbutton_listen, self.qbutton_stop_acq)
+        Form.setTabOrder(self.qbutton_acq_birefringence_phase, self.qbutton_stop_acq)
         Form.setTabOrder(self.qbutton_stop_acq, self.acq_settings)
         Form.setTabOrder(self.acq_settings, self.le_zstart)
         Form.setTabOrder(self.le_zstart, self.le_zend)
@@ -1426,45 +1177,12 @@ def setupUi(self, Form):
         Form.setTabOrder(self.cb_phase, self.chb_phase_from_bf)
         Form.setTabOrder(self.chb_phase_from_bf, self.cb_acq_channel)
         Form.setTabOrder(self.cb_acq_channel, self.le_overlay_slice)
-        Form.setTabOrder(self.le_overlay_slice, self.chb_pause_updates)
-        Form.setTabOrder(self.chb_pause_updates, self.tabWidget_3)
-        Form.setTabOrder(self.tabWidget_3, self.le_data_dir)
-        Form.setTabOrder(self.le_data_dir, self.qbutton_browse_data_dir)
-        Form.setTabOrder(self.qbutton_browse_data_dir, self.le_save_dir)
-        Form.setTabOrder(self.le_save_dir, self.qbutton_browse_save_dir)
-        Form.setTabOrder(self.qbutton_browse_save_dir, self.le_data_save_name)
-        Form.setTabOrder(self.le_data_save_name, self.le_calibration_metadata)
-        Form.setTabOrder(self.le_calibration_metadata, self.qbutton_browse_calib_meta)
-        Form.setTabOrder(self.qbutton_browse_calib_meta, self.cb_bg_method)
-        Form.setTabOrder(self.cb_bg_method, self.le_bg_path)
-        Form.setTabOrder(self.le_bg_path, self.qbutton_browse_bg_path)
-        Form.setTabOrder(self.qbutton_browse_bg_path, self.le_gpu_id)
-        Form.setTabOrder(self.le_gpu_id, self.chb_use_gpu)
-        Form.setTabOrder(self.chb_use_gpu, self.le_recon_wavelength)
-        Form.setTabOrder(self.le_recon_wavelength, self.le_obj_na)
-        Form.setTabOrder(self.le_obj_na, self.le_cond_na)
-        Form.setTabOrder(self.le_cond_na, self.le_ps)
-        Form.setTabOrder(self.le_ps, self.le_n_media)
-        Form.setTabOrder(self.le_n_media, self.le_mag)
-        Form.setTabOrder(self.le_mag, self.qbutton_load_default_config)
-        Form.setTabOrder(self.qbutton_load_default_config, self.qbutton_load_config)
-        Form.setTabOrder(self.qbutton_load_config, self.qbutton_save_config)
-        Form.setTabOrder(self.qbutton_save_config, self.le_notes_field)
-        Form.setTabOrder(self.le_notes_field, self.cb_method)
-        Form.setTabOrder(self.cb_method, self.cb_mode)
-        Form.setTabOrder(self.cb_mode, self.le_positions)
-        Form.setTabOrder(self.le_positions, self.le_timepoints)
-        Form.setTabOrder(self.le_timepoints, self.le_focus_zidx)
-        Form.setTabOrder(self.le_focus_zidx, self.le_pad_z)
-        Form.setTabOrder(self.le_pad_z, self.le_bf_chan)
-        Form.setTabOrder(self.le_bf_chan, self.le_output_channels)
-        Form.setTabOrder(self.le_output_channels, self.cb_phase_denoiser)
+        Form.setTabOrder(self.le_overlay_slice, self.le_notes_field)
+        Form.setTabOrder(self.le_notes_field, self.cb_phase_denoiser)
         Form.setTabOrder(self.cb_phase_denoiser, self.le_phase_strength)
         Form.setTabOrder(self.le_phase_strength, self.le_rho)
         Form.setTabOrder(self.le_rho, self.le_itr)
-        Form.setTabOrder(self.le_itr, self.qbutton_reconstruct)
-        Form.setTabOrder(self.qbutton_reconstruct, self.qbutton_stop_reconstruct)
-        Form.setTabOrder(self.qbutton_stop_reconstruct, self.le_sat_min)
+        Form.setTabOrder(self.le_itr, self.le_sat_min)
         Form.setTabOrder(self.le_sat_min, self.le_sat_max)
         Form.setTabOrder(self.le_sat_max, self.qbutton_push_note)
         Form.setTabOrder(self.qbutton_push_note, self.cb_hue)
@@ -1482,31 +1200,9 @@ def setupUi(self, Form):
     def retranslateUi(self, Form):
         _translate = QtCore.QCoreApplication.translate
         Form.setWindowTitle(_translate("Form", "Form"))
-        self.recon_status.setTitle(_translate("Form", "recOrder Status"))
-        self.qbutton_gui_mode.setText(_translate("Form", "Switch to Online"))
-        self.label_gui_mode.setText(_translate("Form", "Mode"))
-        self.le_gui_mode.setText(_translate("Form", "Offline"))
-        self.calib_params.setTitle(_translate("Form", "Calibration Parameters"))
-        self.cb_lcb.setItemText(0, _translate("Form", "-"))
-        self.le_directory.setPlaceholderText(_translate("Form", "/path/to/directory"))
-        self.cb_calib_scheme.setItemText(0, _translate("Form", "4-State (Ext, 0, 60, 120)"))
-        self.cb_calib_scheme.setItemText(1, _translate("Form", "5-State (Ext, 0, 45, 90, 135)"))
-        self.label_dir.setText(_translate("Form", "Directory"))
-        self.label_wavelength.setText(_translate("Form", "Wavelength"))
-        self.le_wavelength.setText(_translate("Form", "532"))
-        self.le_swing.setText(_translate("Form", "0.1"))
-        self.qbutton_browse.setText(_translate("Form", "Browse"))
-        self.label_scheme.setText(_translate("Form", "Illumination Scheme"))
-        self.label_swing.setText(_translate("Form", "Swing"))
-        self.chb_use_roi.setText(_translate("Form", "Use Cropped ROI"))
-        self.label_lca.setText(_translate("Form", "LC-A"))
-        self.cb_lca.setItemText(0, _translate("Form", "-"))
-        self.label_lcb.setText(_translate("Form", "LC-B"))
-        self.label_calib_mode.setText(_translate("Form", "Calibration Mode"))
-        self.cb_calib_mode.setItemText(0, _translate("Form", "Retardance"))
-        self.cb_calib_mode.setItemText(1, _translate("Form", "Voltage"))
-        self.label_cfg_group.setText(_translate("Form", "Config Group"))
-        self.qbutton_mm_connect.setText(_translate("Form", "Connect to MM"))
+        self.recon_status.setTitle(_translate("Form", "MM Connection Status"))
+        self.le_mm_status.setText(_translate("Form", "Disconnected"))
+        self.qbutton_connect_to_mm.setText(_translate("Form", "Connect to MM"))
         self.run_calib.setTitle(_translate("Form", "Run Calibration"))
         self.labell_calib_assessment.setText(_translate("Form", "Calibration Assessment"))
         self.label_progress.setText(_translate("Form", "Progress"))
@@ -1515,6 +1211,23 @@ def retranslateUi(self, Form):
         self.qbutton_calc_extinction.setText(_translate("Form", "Calculate Extinction"))
         self.qbutton_stop_calib.setText(_translate("Form", "STOP"))
         self.qbutton_load_calib.setText(_translate("Form", "Load Calibration"))
+        self.calib_params.setTitle(_translate("Form", "Calibration Parameters"))
+        self.label_wavelength.setText(_translate("Form", "Wavelength"))
+        self.label_dir.setText(_translate("Form", "Directory"))
+        self.cb_lca.setItemText(0, _translate("Form", "-"))
+        self.cb_calib_scheme.setItemText(0, _translate("Form", "4-State (Ext, 0, 60, 120)"))
+        self.cb_calib_scheme.setItemText(1, _translate("Form", "5-State (Ext, 0, 45, 90, 135)"))
+        self.cb_lcb.setItemText(0, _translate("Form", "-"))
+        self.label_lca.setText(_translate("Form", "LC-A"))
+        self.le_swing.setText(_translate("Form", "0.1"))
+        self.le_directory.setPlaceholderText(_translate("Form", "/path/to/directory"))
+        self.le_wavelength.setText(_translate("Form", "532"))
+        self.label_lcb.setText(_translate("Form", "LC-B"))
+        self.label_swing.setText(_translate("Form", "Swing"))
+        self.label_calib_mode.setText(_translate("Form", "Calibration Mode"))
+        self.label_cfg_group.setText(_translate("Form", "Config Group"))
+        self.label_scheme.setText(_translate("Form", "Illumination Scheme"))
+        self.qbutton_browse.setText(_translate("Form", "Browse"))
         self.label_inten_plot.setText(_translate("Form", "Intensity Plot"))
         self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_plot), _translate("Form", "Plot"))
         self.label_loglevel.setText(_translate("Form", "Log Level"))
@@ -1533,89 +1246,59 @@ def retranslateUi(self, Form):
         self.label_n_avg.setText(_translate("Form", "Number of Images to Average"))
         self.tabWidget.setTabText(self.tabWidget.indexOf(self.Calibration), _translate("Form", "LC Calibration"))
         self.acquire.setTitle(_translate("Form", "Acquire"))
+        self.qbutton_acq_birefringence.setText(_translate("Form", "Acquire Birefringence"))
         self.qbutton_acq_phase.setText(_translate("Form", "Acquire Phase"))
         self.qbutton_acq_birefringence_phase.setText(_translate("Form", "Acquire Birefringence + Phase"))
-        self.qbutton_acq_birefringence.setText(_translate("Form", "Acquire Birefringence"))
-        self.qbutton_listen.setText(_translate("Form", "Listen For Data"))
         self.qbutton_stop_acq.setText(_translate("Form", "STOP"))
-        self.ReconSettings.setTitle(_translate("Form", "Reconstruction Settings"))
+        self.acq_settings.setTitle(_translate("Form", "Acquisition Settings"))
+        self.label_zstart.setText(_translate("Form", "Z Start (um)"))
+        self.label_zend.setText(_translate("Form", "Z End (um)"))
+        self.label_zstep.setText(_translate("Form", "Z Step (um)"))
+        self.label_birefringence.setText(_translate("Form", "Birefringence"))
+        self.cb_phase.setItemText(0, _translate("Form", "2D"))
+        self.cb_phase.setItemText(1, _translate("Form", "3D"))
+        self.chb_phase_from_bf.setText(_translate("Form", "Phase From BF"))
+        self.label_phase.setText(_translate("Form", "Phase"))
+        self.cb_birefringence.setItemText(0, _translate("Form", "2D"))
+        self.cb_birefringence.setItemText(1, _translate("Form", "3D"))
+        self.labe_acq_channel.setText(_translate("Form", "Acq Channel (BF Only)"))
+        self.ReconSettings.setTitle(_translate("Form", "General Reconstruction Settings"))
+        self.label_save_dir.setText(_translate("Form", "Save Directory"))
+        self.le_gpu_id.setText(_translate("Form", "0"))
+        self.le_gpu_id.setPlaceholderText(_translate("Form", "Optional"))
+        self.qbutton_browse_save_dir.setText(_translate("Form", "Browse"))
+        self.label_mag.setText(_translate("Form", "Magnification"))
+        self.label_gpu_id.setText(_translate("Form", "GPU ID"))
+        self.chb_use_gpu.setText(_translate("Form", "Use GPU"))
+        self.label_obj_na.setText(_translate("Form", "Objective NA"))
         self.label_data_save_name.setText(_translate("Form", "Save Name"))
+        self.label_bg_path.setText(_translate("Form", "Background Path"))
         self.qbutton_browse_bg_path.setText(_translate("Form", "Browse"))
-        self.qbutton_browse_calib_meta.setText(_translate("Form", "Browse"))
-        self.label_save_dir.setText(_translate("Form", "Save Directory"))
-        self.label_n_media.setText(_translate("Form", "RI of Obj. Media"))
-        self.label_recon_wavelength.setText(_translate("Form", "Wavelength (nm)"))
         self.le_recon_wavelength.setPlaceholderText(_translate("Form", "list: 530, 645 or single value: 532"))
-        self.chb_use_gpu.setText(_translate("Form", "Use GPU"))
+        self.label_recon_wavelength.setText(_translate("Form", "Wavelength (nm)"))
+        self.label_n_media.setText(_translate("Form", "RI of Obj. Media"))
         self.le_n_media.setText(_translate("Form", "1.003"))
-        self.qbutton_browse_save_dir.setText(_translate("Form", "Browse"))
-        self.qbutton_load_default_config.setText(_translate("Form", "Load Default Config"))
-        self.label_data_dir.setText(_translate("Form", "Data Directory"))
         self.label_bg_method.setText(_translate("Form", "BG Correction"))
         self.label_cond_na.setText(_translate("Form", "Condenser NA"))
-        self.label_obj_na.setText(_translate("Form", "Objective NA"))
-        self.label_calib_meta.setText(_translate("Form", "Calibration Metadata"))
-        self.le_gpu_id.setText(_translate("Form", "0"))
-        self.le_gpu_id.setPlaceholderText(_translate("Form", "Optional"))
-        self.label_ps.setText(_translate("Form", "Camera Pixel Size (um)"))
-        self.qbutton_save_config.setText(_translate("Form", "Save Config to File"))
-        self.label_gpu_id.setText(_translate("Form", "GPU ID"))
-        self.label_bg_path.setText(_translate("Form", "Background Path"))
         self.le_data_save_name.setPlaceholderText(_translate("Form", "Optional"))
-        self.qbutton_browse_data_dir.setText(_translate("Form", "Browse"))
-        self.le_calibration_metadata.setPlaceholderText(_translate("Form", "Optional"))
-        self.qbutton_load_config.setText(_translate("Form", "Load Config From File"))
         self.cb_bg_method.setItemText(0, _translate("Form", "None"))
         self.cb_bg_method.setItemText(1, _translate("Form", "Global"))
         self.cb_bg_method.setItemText(2, _translate("Form", "Local Fit"))
-        self.label_mag.setText(_translate("Form", "Magnification"))
-        self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.General), _translate("Form", "General"))
-        self.phase.setTitle(_translate("Form", "Phase Regularization"))
+        self.label_ps.setText(_translate("Form", "Camera Pixel Size (um)"))
+        self.phase.setTitle(_translate("Form", "Phase Reconstruction Settings"))
+        self.label_phase_regularizer.setText(_translate("Form", "Regularizer"))
+        self.label_phase_rho.setText(_translate("Form", "Rho"))
         self.le_phase_strength.setText(_translate("Form", ".0001"))
         self.le_itr.setText(_translate("Form", "50"))
         self.le_itr.setPlaceholderText(_translate("Form", "TV Only"))
-        self.label_phase_strength.setText(_translate("Form", "Strength"))
         self.cb_phase_denoiser.setItemText(0, _translate("Form", "Tikhonov"))
         self.cb_phase_denoiser.setItemText(1, _translate("Form", "TV"))
-        self.label_itr.setText(_translate("Form", "Iterations"))
         self.le_rho.setText(_translate("Form", "0.001"))
         self.le_rho.setPlaceholderText(_translate("Form", "TV Only"))
-        self.label_phase_regularizer.setText(_translate("Form", "Regularizer"))
-        self.label_phase_rho.setText(_translate("Form", "Rho"))
-        self.label_timepoints.setText(_translate("Form", "Timepoints"))
-        self.label_focus_zidx.setText(_translate("Form", "Focused z-index"))
-        self.label_pipeline.setText(_translate("Form", "Pipeline"))
-        self.cb_method.setItemText(0, _translate("Form", "QLIPP"))
-        self.cb_method.setItemText(1, _translate("Form", "PhaseFromBF"))
-        self.le_focus_zidx.setPlaceholderText(_translate("Form", "Required for 2D Phase"))
-        self.label_mode.setText(_translate("Form", "Mode"))
-        self.cb_mode.setItemText(0, _translate("Form", "3D"))
-        self.cb_mode.setItemText(1, _translate("Form", "2D"))
-        self.label_bf_chan.setText(_translate("Form", "Brightfield Channel Index"))
-        self.le_positions.setPlaceholderText(_translate("Form", "all or 1, 2, or (0, 10) for a range"))
-        self.le_timepoints.setPlaceholderText(_translate("Form", "all or 1, 2, or (0, 10) for a range"))
-        self.le_bf_chan.setPlaceholderText(_translate("Form", "list: 0, 1, 2 or single value: 0"))
-        self.label_output_channels.setText(_translate("Form", "Output Channels"))
-        self.label_chan_desc.setText(_translate("Form", "Retardance, Orientation, BF, Phase3D, Phase2D,  S0, S1, S2, S3"))
-        self.label_positions.setText(_translate("Form", "Positions"))
+        self.label_itr.setText(_translate("Form", "Iterations"))
+        self.label_phase_strength.setText(_translate("Form", "Strength"))
         self.label_pad_z.setText(_translate("Form", "Z Padding"))
         self.le_pad_z.setText(_translate("Form", "0"))
-        self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.Processing), _translate("Form", "Processing"))
-        self.qbutton_reconstruct.setText(_translate("Form", "Reconstruct"))
-        self.qbutton_stop_reconstruct.setText(_translate("Form", "STOP"))
-        self.chb_pause_updates.setText(_translate("Form", "Pause Updates"))
-        self.acq_settings.setTitle(_translate("Form", "Acquisition Settings"))
-        self.label_zstart.setText(_translate("Form", "Z Start (um)"))
-        self.label_zend.setText(_translate("Form", "Z End (um)"))
-        self.label_zstep.setText(_translate("Form", "Z Step (um)"))
-        self.label_birefringence.setText(_translate("Form", "Birefringence"))
-        self.cb_phase.setItemText(0, _translate("Form", "2D"))
-        self.cb_phase.setItemText(1, _translate("Form", "3D"))
-        self.chb_phase_from_bf.setText(_translate("Form", "Phase From BF"))
-        self.label_phase.setText(_translate("Form", "Phase"))
-        self.cb_birefringence.setItemText(0, _translate("Form", "2D"))
-        self.cb_birefringence.setItemText(1, _translate("Form", "3D"))
-        self.labe_acq_channel.setText(_translate("Form", "Acq Channel (BF Only)"))
         self.tabWidget.setTabText(self.tabWidget.indexOf(self.Acquisition), _translate("Form", "Acquisition / Reconstruction"))
         self.DisplayOptions.setTitle(_translate("Form", "Display Options"))
         self.le_sat_max.setText(_translate("Form", "80"))
diff --git a/recOrder/plugin/qtdesigner/recOrder_ui.ui b/recOrder/plugin/gui.ui
similarity index 62%
rename from recOrder/plugin/qtdesigner/recOrder_ui.ui
rename to recOrder/plugin/gui.ui
index d7c63586..a793d4be 100644
--- a/recOrder/plugin/qtdesigner/recOrder_ui.ui
+++ b/recOrder/plugin/gui.ui
@@ -41,16 +41,16 @@
       </font>
      </property>
      <property name="title">
-      <string>recOrder Status</string>
+      <string>MM Connection Status</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_22">
       <property name="topMargin">
        <number>25</number>
       </property>
-      <item row="1" column="2">
-       <widget class="QPushButton" name="qbutton_gui_mode">
+      <item row="0" column="1">
+       <widget class="QLineEdit" name="le_mm_status">
         <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
@@ -62,33 +62,20 @@
          </font>
         </property>
         <property name="text">
-         <string>Switch to Online</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_gui_mode">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
+         <string>Disconnected</string>
         </property>
-        <property name="font">
-         <font>
-          <italic>false</italic>
-          <bold>false</bold>
-         </font>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
         </property>
-        <property name="text">
-         <string>Mode</string>
+        <property name="readOnly">
+         <bool>true</bool>
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="le_gui_mode">
+      <item row="0" column="0">
+       <widget class="QPushButton" name="qbutton_connect_to_mm">
         <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
@@ -100,10 +87,7 @@
          </font>
         </property>
         <property name="text">
-         <string>Offline</string>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
+         <string>Connect to MM</string>
         </property>
        </widget>
       </item>
@@ -140,7 +124,7 @@
       <enum>QTabWidget::North</enum>
      </property>
      <property name="currentIndex">
-      <number>1</number>
+      <number>0</number>
      </property>
      <property name="elideMode">
       <enum>Qt::ElideMiddle</enum>
@@ -203,7 +187,7 @@
             <x>0</x>
             <y>0</y>
             <width>590</width>
-            <height>1111</height>
+            <height>1032</height>
            </rect>
           </property>
           <property name="sizePolicy">
@@ -228,53 +212,39 @@
            <property name="verticalSpacing">
             <number>20</number>
            </property>
-           <item row="3" column="0">
-            <widget class="QGroupBox" name="calib_params">
+           <item row="1" column="0">
+            <widget class="QGroupBox" name="run_calib">
              <property name="font">
               <font>
                <italic>false</italic>
                <bold>true</bold>
               </font>
              </property>
-             <property name="contextMenuPolicy">
-              <enum>Qt::DefaultContextMenu</enum>
-             </property>
              <property name="title">
-              <string>Calibration Parameters</string>
-             </property>
-             <property name="alignment">
-              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-             </property>
-             <property name="checkable">
-              <bool>false</bool>
+              <string>Run Calibration</string>
              </property>
-             <layout class="QGridLayout" name="gridLayout_2">
+             <layout class="QGridLayout" name="gridLayout_12">
               <property name="topMargin">
                <number>12</number>
               </property>
               <property name="verticalSpacing">
                <number>6</number>
               </property>
-              <item row="5" column="4">
-               <widget class="QComboBox" name="cb_lcb">
+              <item row="8" column="0">
+               <widget class="QLabel" name="labell_calib_assessment">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="focusPolicy">
-                 <enum>Qt::StrongFocus</enum>
+                <property name="text">
+                 <string>Calibration Assessment</string>
                 </property>
-                <item>
-                 <property name="text">
-                  <string>-</string>
-                 </property>
-                </item>
                </widget>
               </item>
-              <item row="0" column="2">
-               <widget class="QLineEdit" name="le_directory">
+              <item row="4" column="0">
+               <widget class="QLabel" name="label_progress">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -282,38 +252,37 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string/>
-                </property>
-                <property name="placeholderText">
-                 <string>/path/to/directory</string>
+                 <string>Progress</string>
                 </property>
                </widget>
               </item>
-              <item row="4" column="2">
-               <widget class="QComboBox" name="cb_calib_scheme">
+              <item row="6" column="0">
+               <widget class="QLabel" name="label_extinction">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="focusPolicy">
-                 <enum>Qt::StrongFocus</enum>
+                <property name="text">
+                 <string>Extinction</string>
                 </property>
-                <item>
-                 <property name="text">
-                  <string>4-State (Ext, 0, 60, 120)</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>5-State (Ext, 0, 45, 90, 135)</string>
-                 </property>
-                </item>
                </widget>
               </item>
-              <item row="0" column="0">
-               <widget class="QLabel" name="label_dir">
+              <item row="0" column="0" colspan="2">
+               <widget class="QPushButton" name="qbutton_calibrate">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -321,25 +290,28 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Directory</string>
+                 <string>Run Calibration</string>
+                </property>
+                <property name="autoDefault">
+                 <bool>false</bool>
                 </property>
                </widget>
               </item>
-              <item row="3" column="0">
-               <widget class="QLabel" name="label_wavelength">
+              <item row="5" column="0" colspan="2">
+               <widget class="QProgressBar" name="progress_bar">
                 <property name="font">
                  <font>
                   <italic>false</italic>
-                  <bold>false</bold>
+                  <bold>true</bold>
                  </font>
                 </property>
-                <property name="text">
-                 <string>Wavelength</string>
+                <property name="value">
+                 <number>0</number>
                 </property>
                </widget>
               </item>
-              <item row="3" column="2">
-               <widget class="QLineEdit" name="le_wavelength">
+              <item row="2" column="0" colspan="2">
+               <widget class="QPushButton" name="qbutton_calc_extinction">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -347,47 +319,45 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>532</string>
+                 <string>Calculate Extinction</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="2">
-               <widget class="QLineEdit" name="le_swing">
+              <item row="6" column="1">
+               <widget class="QLineEdit" name="le_extinction">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="font">
                  <font>
+                  <pointsize>13</pointsize>
                   <italic>false</italic>
-                  <bold>false</bold>
+                  <bold>true</bold>
                  </font>
                 </property>
-                <property name="text">
-                 <string>0.1</string>
+                <property name="readOnly">
+                 <bool>true</bool>
                 </property>
                </widget>
               </item>
-              <item row="0" column="3">
-               <widget class="QPushButton" name="qbutton_browse">
+              <item row="3" column="0" colspan="2">
+               <widget class="QPushButton" name="qbutton_stop_calib">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="autoFillBackground">
-                 <bool>false</bool>
-                </property>
                 <property name="text">
-                 <string>Browse</string>
-                </property>
-                <property name="checkable">
-                 <bool>false</bool>
-                </property>
-                <property name="default">
-                 <bool>false</bool>
+                 <string>STOP</string>
                 </property>
                </widget>
               </item>
-              <item row="4" column="0">
-               <widget class="QLabel" name="label_scheme">
+              <item row="1" column="0" colspan="2">
+               <widget class="QPushButton" name="qbutton_load_calib">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -395,25 +365,52 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Illumination Scheme</string>
+                 <string>Load Calibration</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="0">
-               <widget class="QLabel" name="label_swing">
+              <item row="8" column="1">
+               <widget class="QTextBrowser" name="tb_calib_assessment">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="text">
-                 <string>Swing</string>
-                </property>
                </widget>
               </item>
-              <item row="7" column="0" colspan="3">
-               <widget class="QCheckBox" name="chb_use_roi">
+             </layout>
+            </widget>
+           </item>
+           <item row="0" column="0">
+            <widget class="QGroupBox" name="calib_params">
+             <property name="font">
+              <font>
+               <italic>false</italic>
+               <bold>true</bold>
+              </font>
+             </property>
+             <property name="contextMenuPolicy">
+              <enum>Qt::DefaultContextMenu</enum>
+             </property>
+             <property name="title">
+              <string>Calibration Parameters</string>
+             </property>
+             <property name="alignment">
+              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+             </property>
+             <property name="checkable">
+              <bool>false</bool>
+             </property>
+             <layout class="QGridLayout" name="gridLayout_2">
+              <property name="topMargin">
+               <number>12</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>6</number>
+              </property>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_wavelength">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -421,12 +418,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Use Cropped ROI</string>
+                 <string>Wavelength</string>
                 </property>
                </widget>
               </item>
-              <item row="4" column="3">
-               <widget class="QLabel" name="label_lca">
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_dir">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -434,14 +431,11 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>LC-A</string>
-                </property>
-                <property name="alignment">
-                 <set>Qt::AlignCenter</set>
+                 <string>Directory</string>
                 </property>
                </widget>
               </item>
-              <item row="5" column="3">
+              <item row="5" column="2">
                <widget class="QComboBox" name="cb_lca">
                 <property name="font">
                  <font>
@@ -459,42 +453,12 @@
                 </item>
                </widget>
               </item>
-              <item row="4" column="4">
-               <widget class="QLabel" name="label_lcb">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>LC-B</string>
-                </property>
-                <property name="alignment">
-                 <set>Qt::AlignCenter</set>
-                </property>
-               </widget>
-              </item>
-              <item row="5" column="0">
-               <widget class="QLabel" name="label_calib_mode">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Calibration Mode</string>
-                </property>
-               </widget>
-              </item>
-              <item row="5" column="2">
-               <widget class="QComboBox" name="cb_calib_mode">
+              <item row="4" column="1">
+               <widget class="QComboBox" name="cb_calib_scheme">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
-                  <kerning>true</kerning>
                  </font>
                 </property>
                 <property name="focusPolicy">
@@ -502,65 +466,52 @@
                 </property>
                 <item>
                  <property name="text">
-                  <string>Retardance</string>
+                  <string>4-State (Ext, 0, 60, 120)</string>
                  </property>
                 </item>
                 <item>
                  <property name="text">
-                  <string>Voltage</string>
+                  <string>5-State (Ext, 0, 45, 90, 135)</string>
                  </property>
                 </item>
                </widget>
               </item>
-              <item row="6" column="0">
-               <widget class="QLabel" name="label_cfg_group">
+              <item row="5" column="3">
+               <widget class="QComboBox" name="cb_lcb">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="text">
-                 <string>Config Group</string>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
                 </property>
+                <item>
+                 <property name="text">
+                  <string>-</string>
+                 </property>
+                </item>
                </widget>
               </item>
-              <item row="6" column="2">
-               <widget class="QComboBox" name="cb_config_group">
+              <item row="4" column="2">
+               <widget class="QLabel" name="label_lca">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
-                <property name="focusPolicy">
-                 <enum>Qt::StrongFocus</enum>
+                <property name="text">
+                 <string>LC-A</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
                 </property>
                </widget>
               </item>
-             </layout>
-            </widget>
-           </item>
-           <item row="0" column="0" rowspan="3">
-            <widget class="QGroupBox" name="connect_to_micromanager">
-             <property name="font">
-              <font>
-               <italic>false</italic>
-               <bold>true</bold>
-              </font>
-             </property>
-             <property name="title">
-              <string/>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_14">
-              <property name="topMargin">
-               <number>12</number>
-              </property>
-              <property name="verticalSpacing">
-               <number>20</number>
-              </property>
-              <item row="0" column="1">
-               <widget class="QLineEdit" name="le_mm_status">
+              <item row="2" column="1">
+               <widget class="QLineEdit" name="le_swing">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -568,12 +519,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string/>
+                 <string>0.1</string>
                 </property>
                </widget>
               </item>
-              <item row="0" column="0">
-               <widget class="QPushButton" name="qbutton_mm_connect">
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="le_directory">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -581,33 +532,15 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Connect to MM</string>
+                 <string/>
+                </property>
+                <property name="placeholderText">
+                 <string>/path/to/directory</string>
                 </property>
                </widget>
               </item>
-             </layout>
-            </widget>
-           </item>
-           <item row="4" column="0">
-            <widget class="QGroupBox" name="run_calib">
-             <property name="font">
-              <font>
-               <italic>false</italic>
-               <bold>true</bold>
-              </font>
-             </property>
-             <property name="title">
-              <string>Run Calibration</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_12">
-              <property name="topMargin">
-               <number>12</number>
-              </property>
-              <property name="verticalSpacing">
-               <number>6</number>
-              </property>
-              <item row="8" column="0">
-               <widget class="QLabel" name="labell_calib_assessment">
+              <item row="3" column="1">
+               <widget class="QLineEdit" name="le_wavelength">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -615,12 +548,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Calibration Assessment</string>
+                 <string>532</string>
                 </property>
                </widget>
               </item>
-              <item row="4" column="0">
-               <widget class="QLabel" name="label_progress">
+              <item row="4" column="3">
+               <widget class="QLabel" name="label_lcb">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -628,18 +561,15 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Progress</string>
+                 <string>LC-B</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
                 </property>
                </widget>
               </item>
-              <item row="6" column="0">
-               <widget class="QLabel" name="label_extinction">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_swing">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -647,18 +577,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Extinction</string>
+                 <string>Swing</string>
                 </property>
                </widget>
               </item>
-              <item row="0" column="0" colspan="2">
-               <widget class="QPushButton" name="qbutton_calibrate">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
+              <item row="5" column="0">
+               <widget class="QLabel" name="label_calib_mode">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -666,28 +590,25 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Run Calibration</string>
-                </property>
-                <property name="autoDefault">
-                 <bool>false</bool>
+                 <string>Calibration Mode</string>
                 </property>
                </widget>
               </item>
-              <item row="5" column="0" colspan="2">
-               <widget class="QProgressBar" name="progress_bar">
+              <item row="6" column="0">
+               <widget class="QLabel" name="label_cfg_group">
                 <property name="font">
                  <font>
                   <italic>false</italic>
-                  <bold>true</bold>
+                  <bold>false</bold>
                  </font>
                 </property>
-                <property name="value">
-                 <number>0</number>
+                <property name="text">
+                 <string>Config Group</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="0" colspan="2">
-               <widget class="QPushButton" name="qbutton_calc_extinction">
+              <item row="4" column="0">
+               <widget class="QLabel" name="label_scheme">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -695,70 +616,63 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Calculate Extinction</string>
+                 <string>Illumination Scheme</string>
                 </property>
                </widget>
               </item>
               <item row="6" column="1">
-               <widget class="QLineEdit" name="le_extinction">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
+               <widget class="QComboBox" name="cb_config_group">
                 <property name="font">
                  <font>
-                  <pointsize>13</pointsize>
                   <italic>false</italic>
-                  <bold>true</bold>
+                  <bold>false</bold>
                  </font>
                 </property>
-                <property name="readOnly">
-                 <bool>true</bool>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
                 </property>
                </widget>
               </item>
-              <item row="3" column="0" colspan="2">
-               <widget class="QPushButton" name="qbutton_stop_calib">
+              <item row="5" column="1">
+               <widget class="QComboBox" name="cb_calib_mode">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
+                  <kerning>true</kerning>
                  </font>
                 </property>
-                <property name="text">
-                 <string>STOP</string>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
                 </property>
                </widget>
               </item>
-              <item row="1" column="0" colspan="2">
-               <widget class="QPushButton" name="qbutton_load_calib">
+              <item row="0" column="2">
+               <widget class="QPushButton" name="qbutton_browse">
                 <property name="font">
                  <font>
                   <italic>false</italic>
                   <bold>false</bold>
                  </font>
                 </property>
+                <property name="autoFillBackground">
+                 <bool>false</bool>
+                </property>
                 <property name="text">
-                 <string>Load Calibration</string>
+                 <string>Browse</string>
                 </property>
-               </widget>
-              </item>
-              <item row="8" column="1">
-               <widget class="QTextBrowser" name="tb_calib_assessment">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
+                <property name="checkable">
+                 <bool>false</bool>
+                </property>
+                <property name="default">
+                 <bool>false</bool>
                 </property>
                </widget>
               </item>
              </layout>
             </widget>
            </item>
-           <item row="6" column="0" alignment="Qt::AlignTop">
+           <item row="3" column="0" alignment="Qt::AlignTop">
             <widget class="QTabWidget" name="tabWidget_2">
              <property name="sizePolicy">
               <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
@@ -953,7 +867,7 @@
              </widget>
             </widget>
            </item>
-           <item row="5" column="0">
+           <item row="2" column="0">
             <widget class="QGroupBox" name="capture_background">
              <property name="font">
               <font>
@@ -1140,8 +1054,8 @@
               <property name="verticalSpacing">
                <number>6</number>
               </property>
-              <item row="2" column="1">
-               <widget class="QPushButton" name="qbutton_acq_phase">
+              <item row="2" column="0">
+               <widget class="QPushButton" name="qbutton_acq_birefringence">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -1149,12 +1063,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Acquire Phase</string>
+                 <string>Acquire Birefringence</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="2">
-               <widget class="QPushButton" name="qbutton_acq_birefringence_phase">
+              <item row="2" column="1">
+               <widget class="QPushButton" name="qbutton_acq_phase">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -1162,12 +1076,12 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Acquire Birefringence + Phase</string>
+                 <string>Acquire Phase</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="0">
-               <widget class="QPushButton" name="qbutton_acq_birefringence">
+              <item row="2" column="2">
+               <widget class="QPushButton" name="qbutton_acq_birefringence_phase">
                 <property name="font">
                  <font>
                   <italic>false</italic>
@@ -1175,24 +1089,11 @@
                  </font>
                 </property>
                 <property name="text">
-                 <string>Acquire Birefringence</string>
+                 <string>Acquire Birefringence + Phase</string>
                 </property>
                </widget>
               </item>
               <item row="3" column="0" colspan="3">
-               <widget class="QPushButton" name="qbutton_listen">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Listen For Data</string>
-                </property>
-               </widget>
-              </item>
-              <item row="4" column="0" colspan="3">
                <widget class="QPushButton" name="qbutton_stop_acq">
                 <property name="font">
                  <font>
@@ -1208,8 +1109,8 @@
              </layout>
             </widget>
            </item>
-           <item row="4" column="0" rowspan="2" colspan="2">
-            <widget class="QGroupBox" name="ReconSettings">
+           <item row="1" column="0">
+            <widget class="QGroupBox" name="acq_settings">
              <property name="sizePolicy">
               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
                <horstretch>0</horstretch>
@@ -1222,813 +1123,486 @@
                <bold>true</bold>
               </font>
              </property>
+             <property name="focusPolicy">
+              <enum>Qt::TabFocus</enum>
+             </property>
              <property name="title">
-              <string>Reconstruction Settings</string>
+              <string>Acquisition Settings</string>
              </property>
-             <property name="alignment">
-              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+             <property name="flat">
+              <bool>false</bool>
              </property>
-             <layout class="QGridLayout" name="gridLayout_9">
+             <layout class="QGridLayout" name="gridLayout_8">
               <property name="topMargin">
                <number>12</number>
               </property>
               <property name="verticalSpacing">
                <number>6</number>
               </property>
-              <item row="3" column="0" colspan="4">
-               <widget class="QTabWidget" name="tabWidget_3">
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_zstart">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Z Start (um)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLabel" name="label_zend">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Z End (um)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="2">
+               <widget class="QLabel" name="label_zstep">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Z Step (um)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_birefringence">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Birefringence</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLineEdit" name="le_zstart"/>
+              </item>
+              <item row="4" column="1">
+               <widget class="QComboBox" name="cb_phase">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <item>
+                 <property name="text">
+                  <string>2D</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>3D</string>
+                 </property>
+                </item>
+               </widget>
+              </item>
+              <item row="2" column="2">
+               <widget class="QLineEdit" name="le_zstep"/>
+              </item>
+              <item row="4" column="2">
+               <widget class="QCheckBox" name="chb_phase_from_bf">
+                <property name="text">
+                 <string>Phase From BF</string>
+                </property>
+               </widget>
+              </item>
+              <item row="4" column="0">
+               <widget class="QLabel" name="label_phase">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Phase</string>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="1">
+               <widget class="QComboBox" name="cb_acq_channel">
+                <property name="currentText">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <widget class="QComboBox" name="cb_birefringence">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <item>
+                 <property name="text">
+                  <string>2D</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>3D</string>
+                 </property>
+                </item>
+               </widget>
+              </item>
+              <item row="5" column="0">
+               <widget class="QLabel" name="labe_acq_channel">
+                <property name="text">
+                 <string>Acq Channel (BF Only)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <widget class="QLineEdit" name="le_zend"/>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item row="2" column="0">
+            <widget class="QGroupBox" name="ReconSettings">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="font">
+              <font>
+               <italic>false</italic>
+               <bold>true</bold>
+              </font>
+             </property>
+             <property name="title">
+              <string>General Reconstruction Settings</string>
+             </property>
+             <property name="alignment">
+              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+             </property>
+             <layout class="QGridLayout" name="gridLayout_9">
+              <property name="topMargin">
+               <number>12</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>6</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_save_dir">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Save Directory</string>
+                </property>
+               </widget>
+              </item>
+              <item row="4" column="1">
+               <widget class="QLineEdit" name="le_gpu_id">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>0</string>
+                </property>
+                <property name="placeholderText">
+                 <string>Optional</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="2">
+               <widget class="QPushButton" name="qbutton_browse_save_dir">
+                <property name="font">
+                 <font>
+                  <italic>false</italic>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Browse</string>
+                </property>
+               </widget>
+              </item>
+              <item row="10" column="0">
+               <widget class="QLabel" name="label_mag">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Magnification</string>
+                </property>
+               </widget>
+              </item>
+              <item row="8" column="1">
+               <widget class="QLineEdit" name="le_ps">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="4" column="0">
+               <widget class="QLabel" name="label_gpu_id">
+                <property name="text">
+                 <string>GPU ID</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="4" column="2">
+               <widget class="QCheckBox" name="chb_use_gpu">
+                <property name="text">
+                 <string>Use GPU</string>
+                </property>
+               </widget>
+              </item>
+              <item row="6" column="0">
+               <widget class="QLabel" name="label_obj_na">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Objective NA</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_data_save_name">
+                <property name="text">
+                 <string>Save Name</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_bg_path">
+                <property name="text">
+                 <string>Background Path</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="2">
+               <widget class="QPushButton" name="qbutton_browse_bg_path">
+                <property name="text">
+                 <string>Browse</string>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="1">
+               <widget class="QLineEdit" name="le_recon_wavelength">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="placeholderText">
+                 <string>list: 530, 645 or single value: 532</string>
+                </property>
+               </widget>
+              </item>
+              <item row="10" column="1">
+               <widget class="QLineEdit" name="le_mag">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="0">
+               <widget class="QLabel" name="label_recon_wavelength">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Wavelength (nm)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="9" column="0">
+               <widget class="QLabel" name="label_n_media">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>RI of Obj. Media</string>
+                </property>
+               </widget>
+              </item>
+              <item row="9" column="1">
+               <widget class="QLineEdit" name="le_n_media">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>1.003</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_bg_method">
+                <property name="text">
+                 <string>BG Correction</string>
+                </property>
+               </widget>
+              </item>
+              <item row="6" column="1">
+               <widget class="QLineEdit" name="le_obj_na">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+               </widget>
+              </item>
+              <item row="7" column="0">
+               <widget class="QLabel" name="label_cond_na">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Condenser NA</string>
+                </property>
+               </widget>
+              </item>
+              <item row="7" column="1">
+               <widget class="QLineEdit" name="le_cond_na">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="le_save_dir">
+                <property name="placeholderText">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLineEdit" name="le_data_save_name">
                 <property name="sizePolicy">
-                 <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
                   <horstretch>0</horstretch>
                   <verstretch>0</verstretch>
                  </sizepolicy>
                 </property>
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
+                <property name="text">
+                 <string/>
                 </property>
-                <property name="currentIndex">
-                 <number>0</number>
+                <property name="placeholderText">
+                 <string>Optional</string>
                 </property>
-                <widget class="QWidget" name="General">
-                 <attribute name="title">
-                  <string>General</string>
-                 </attribute>
-                 <layout class="QGridLayout" name="gridLayout_10">
-                  <property name="leftMargin">
-                   <number>4</number>
-                  </property>
-                  <property name="topMargin">
-                   <number>15</number>
-                  </property>
-                  <property name="rightMargin">
-                   <number>4</number>
-                  </property>
-                  <property name="bottomMargin">
-                   <number>4</number>
-                  </property>
-                  <property name="verticalSpacing">
-                   <number>20</number>
-                  </property>
-                  <item row="0" column="0">
-                   <widget class="QGroupBox" name="groupBox">
-                    <property name="title">
-                     <string/>
-                    </property>
-                    <property name="flat">
-                     <bool>false</bool>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout_20">
-                     <property name="verticalSpacing">
-                      <number>6</number>
-                     </property>
-                     <item row="2" column="0">
-                      <widget class="QLabel" name="label_data_save_name">
-                       <property name="text">
-                        <string>Save Name</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="5" column="2">
-                      <widget class="QPushButton" name="qbutton_browse_bg_path">
-                       <property name="text">
-                        <string>Browse</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="2">
-                      <widget class="QPushButton" name="qbutton_browse_calib_meta">
-                       <property name="text">
-                        <string>Browse</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="0">
-                      <widget class="QLabel" name="label_save_dir">
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string>Save Directory</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="11" column="0">
-                      <widget class="QLabel" name="label_n_media">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>RI of Obj. Media</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="1">
-                      <widget class="QLineEdit" name="le_save_dir">
-                       <property name="placeholderText">
-                        <string/>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="7" column="0">
-                      <widget class="QLabel" name="label_recon_wavelength">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Wavelength (nm)</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="10" column="1">
-                      <widget class="QLineEdit" name="le_ps">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string/>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="5" column="1">
-                      <widget class="QLineEdit" name="le_bg_path">
-                       <property name="placeholderText">
-                        <string/>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="7" column="1">
-                      <widget class="QLineEdit" name="le_recon_wavelength">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="placeholderText">
-                        <string>list: 530, 645 or single value: 532</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="6" column="2">
-                      <widget class="QCheckBox" name="chb_use_gpu">
-                       <property name="text">
-                        <string>Use GPU</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="11" column="1">
-                      <widget class="QLineEdit" name="le_n_media">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>1.003</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="2">
-                      <widget class="QPushButton" name="qbutton_browse_save_dir">
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string>Browse</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="13" column="0" colspan="3">
-                      <widget class="QPushButton" name="qbutton_load_default_config">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Load Default Config</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QLineEdit" name="le_data_dir">
-                       <property name="placeholderText">
-                        <string/>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="8" column="1">
-                      <widget class="QLineEdit" name="le_obj_na">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="9" column="1">
-                      <widget class="QLineEdit" name="le_cond_na">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="0">
-                      <widget class="QLabel" name="label_data_dir">
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string>Data Directory</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="4" column="0">
-                      <widget class="QLabel" name="label_bg_method">
-                       <property name="text">
-                        <string>BG Correction</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="9" column="0">
-                      <widget class="QLabel" name="label_cond_na">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Condenser NA</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="8" column="0">
-                      <widget class="QLabel" name="label_obj_na">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Objective NA</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="0">
-                      <widget class="QLabel" name="label_calib_meta">
-                       <property name="text">
-                        <string>Calibration Metadata</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="6" column="1">
-                      <widget class="QLineEdit" name="le_gpu_id">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>0</string>
-                       </property>
-                       <property name="placeholderText">
-                        <string>Optional</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="10" column="0">
-                      <widget class="QLabel" name="label_ps">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Camera Pixel Size (um)</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="15" column="0" colspan="3">
-                      <widget class="QPushButton" name="qbutton_save_config">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Save Config to File</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="6" column="0">
-                      <widget class="QLabel" name="label_gpu_id">
-                       <property name="text">
-                        <string>GPU ID</string>
-                       </property>
-                       <property name="alignment">
-                        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="5" column="0">
-                      <widget class="QLabel" name="label_bg_path">
-                       <property name="text">
-                        <string>Background Path</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QLineEdit" name="le_data_save_name">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string/>
-                       </property>
-                       <property name="placeholderText">
-                        <string>Optional</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="2">
-                      <widget class="QPushButton" name="qbutton_browse_data_dir">
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string>Browse</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="1">
-                      <widget class="QLineEdit" name="le_calibration_metadata">
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="inputMask">
-                        <string/>
-                       </property>
-                       <property name="placeholderText">
-                        <string>Optional</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="14" column="0" colspan="3">
-                      <widget class="QPushButton" name="qbutton_load_config">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Load Config From File</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="4" column="1">
-                      <widget class="QComboBox" name="cb_bg_method">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <item>
-                        <property name="text">
-                         <string>None</string>
-                        </property>
-                       </item>
-                       <item>
-                        <property name="text">
-                         <string>Global</string>
-                        </property>
-                       </item>
-                       <item>
-                        <property name="text">
-                         <string>Local Fit</string>
-                        </property>
-                       </item>
-                      </widget>
-                     </item>
-                     <item row="12" column="0">
-                      <widget class="QLabel" name="label_mag">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Magnification</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="12" column="1">
-                      <widget class="QLineEdit" name="le_mag">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-                <widget class="QWidget" name="Processing">
-                 <attribute name="title">
-                  <string>Processing</string>
-                 </attribute>
-                 <layout class="QGridLayout" name="gridLayout_16">
-                  <property name="verticalSpacing">
-                   <number>20</number>
-                  </property>
-                  <item row="2" column="0" colspan="2">
-                   <widget class="QLabel" name="spacer">
-                    <property name="text">
-                     <string/>
-                    </property>
-                   </widget>
-                  </item>
-                  <item row="1" column="0">
-                   <widget class="QGroupBox" name="phase">
-                    <property name="sizePolicy">
-                     <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-                      <horstretch>0</horstretch>
-                      <verstretch>0</verstretch>
-                     </sizepolicy>
-                    </property>
-                    <property name="title">
-                     <string>Phase Regularization</string>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout_23">
-                     <property name="topMargin">
-                      <number>12</number>
-                     </property>
-                     <property name="verticalSpacing">
-                      <number>6</number>
-                     </property>
-                     <item row="1" column="1">
-                      <widget class="QLineEdit" name="le_phase_strength">
-                       <property name="text">
-                        <string>.0001</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="1">
-                      <widget class="QLineEdit" name="le_itr">
-                       <property name="text">
-                        <string>50</string>
-                       </property>
-                       <property name="placeholderText">
-                        <string>TV Only</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="0">
-                      <widget class="QLabel" name="label_phase_strength">
-                       <property name="text">
-                        <string>Strength</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QComboBox" name="cb_phase_denoiser">
-                       <item>
-                        <property name="text">
-                         <string>Tikhonov</string>
-                        </property>
-                       </item>
-                       <item>
-                        <property name="text">
-                         <string>TV</string>
-                        </property>
-                       </item>
-                      </widget>
-                     </item>
-                     <item row="3" column="0">
-                      <widget class="QLabel" name="label_itr">
-                       <property name="text">
-                        <string>Iterations</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QLineEdit" name="le_rho">
-                       <property name="text">
-                        <string>0.001</string>
-                       </property>
-                       <property name="placeholderText">
-                        <string>TV Only</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="0">
-                      <widget class="QLabel" name="label_phase_regularizer">
-                       <property name="text">
-                        <string>Regularizer</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="0">
-                      <widget class="QLabel" name="label_phase_rho">
-                       <property name="text">
-                        <string>Rho</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </item>
-                  <item row="0" column="0" colspan="2">
-                   <widget class="QGroupBox" name="groupBox_2">
-                    <property name="enabled">
-                     <bool>true</bool>
-                    </property>
-                    <property name="title">
-                     <string/>
-                    </property>
-                    <property name="flat">
-                     <bool>false</bool>
-                    </property>
-                    <layout class="QGridLayout" name="gridLayout_26">
-                     <property name="verticalSpacing">
-                      <number>6</number>
-                     </property>
-                     <item row="3" column="0">
-                      <widget class="QLabel" name="label_timepoints">
-                       <property name="text">
-                        <string>Timepoints</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="4" column="0">
-                      <widget class="QLabel" name="label_focus_zidx">
-                       <property name="text">
-                        <string>Focused z-index</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="0">
-                      <widget class="QLabel" name="label_pipeline">
-                       <property name="text">
-                        <string>Pipeline</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="0" column="1">
-                      <widget class="QComboBox" name="cb_method">
-                       <item>
-                        <property name="text">
-                         <string>QLIPP</string>
-                        </property>
-                       </item>
-                       <item>
-                        <property name="text">
-                         <string>PhaseFromBF</string>
-                        </property>
-                       </item>
-                      </widget>
-                     </item>
-                     <item row="7" column="1" colspan="2">
-                      <widget class="QLineEdit" name="le_output_channels">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="minimumSize">
-                        <size>
-                         <width>30</width>
-                         <height>0</height>
-                        </size>
-                       </property>
-                       <property name="font">
-                        <font>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string/>
-                       </property>
-                       <property name="placeholderText">
-                        <string/>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="4" column="1">
-                      <widget class="QLineEdit" name="le_focus_zidx">
-                       <property name="text">
-                        <string/>
-                       </property>
-                       <property name="placeholderText">
-                        <string>Required for 2D Phase</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="0">
-                      <widget class="QLabel" name="label_mode">
-                       <property name="text">
-                        <string>Mode</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="1" column="1">
-                      <widget class="QComboBox" name="cb_mode">
-                       <item>
-                        <property name="text">
-                         <string>3D</string>
-                        </property>
-                       </item>
-                       <item>
-                        <property name="text">
-                         <string>2D</string>
-                        </property>
-                       </item>
-                      </widget>
-                     </item>
-                     <item row="6" column="0">
-                      <widget class="QLabel" name="label_bf_chan">
-                       <property name="text">
-                        <string>Brightfield Channel Index</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="1">
-                      <widget class="QLineEdit" name="le_positions">
-                       <property name="placeholderText">
-                        <string>all or 1, 2, or (0, 10) for a range</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="3" column="1">
-                      <widget class="QLineEdit" name="le_timepoints">
-                       <property name="placeholderText">
-                        <string>all or 1, 2, or (0, 10) for a range</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="6" column="1">
-                      <widget class="QLineEdit" name="le_bf_chan">
-                       <property name="placeholderText">
-                        <string>list: 0, 1, 2 or single value: 0</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="7" column="0">
-                      <widget class="QLabel" name="label_output_channels">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Output Channels</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="8" column="1" colspan="2">
-                      <widget class="QLabel" name="label_chan_desc">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="font">
-                        <font>
-                         <pointsize>10</pointsize>
-                         <italic>false</italic>
-                         <bold>false</bold>
-                        </font>
-                       </property>
-                       <property name="text">
-                        <string>Retardance, Orientation, BF, Phase3D, Phase2D,  S0, S1, S2, S3</string>
-                       </property>
-                       <property name="wordWrap">
-                        <bool>true</bool>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="2" column="0">
-                      <widget class="QLabel" name="label_positions">
-                       <property name="text">
-                        <string>Positions</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="5" column="0">
-                      <widget class="QLabel" name="label_pad_z">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>Z Padding</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item row="5" column="1">
-                      <widget class="QLineEdit" name="le_pad_z">
-                       <property name="sizePolicy">
-                        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                         <horstretch>0</horstretch>
-                         <verstretch>0</verstretch>
-                        </sizepolicy>
-                       </property>
-                       <property name="text">
-                        <string>0</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
                </widget>
               </item>
-              <item row="5" column="0" colspan="4">
-               <widget class="QPushButton" name="qbutton_reconstruct">
-                <property name="text">
-                 <string>Reconstruct</string>
+              <item row="2" column="1">
+               <widget class="QComboBox" name="cb_bg_method">
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
                 </property>
+                <item>
+                 <property name="text">
+                  <string>None</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Global</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Local Fit</string>
+                 </property>
+                </item>
                </widget>
               </item>
-              <item row="6" column="0" colspan="4">
-               <widget class="QPushButton" name="qbutton_stop_reconstruct">
+              <item row="8" column="0">
+               <widget class="QLabel" name="label_ps">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="text">
-                 <string>STOP</string>
+                 <string>Camera Pixel Size (um)</string>
                 </property>
                </widget>
               </item>
-              <item row="1" column="0">
-               <widget class="QCheckBox" name="chb_pause_updates">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Pause Updates</string>
+              <item row="3" column="1">
+               <widget class="QLineEdit" name="le_bg_path">
+                <property name="placeholderText">
+                 <string/>
                 </property>
                </widget>
               </item>
              </layout>
             </widget>
            </item>
-           <item row="1" column="0">
-            <widget class="QGroupBox" name="acq_settings">
+           <item row="3" column="0">
+            <widget class="QGroupBox" name="phase">
              <property name="sizePolicy">
-              <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
                <horstretch>0</horstretch>
                <verstretch>0</verstretch>
               </sizepolicy>
@@ -2039,16 +1613,10 @@
                <bold>true</bold>
               </font>
              </property>
-             <property name="focusPolicy">
-              <enum>Qt::TabFocus</enum>
-             </property>
              <property name="title">
-              <string>Acquisition Settings</string>
-             </property>
-             <property name="flat">
-              <bool>false</bool>
+              <string>Phase Reconstruction Settings</string>
              </property>
-             <layout class="QGridLayout" name="gridLayout_8">
+             <layout class="QGridLayout" name="gridLayout_23">
               <property name="topMargin">
                <number>12</number>
               </property>
@@ -2056,146 +1624,100 @@
                <number>6</number>
               </property>
               <item row="1" column="0">
-               <widget class="QLabel" name="label_zstart">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
+               <widget class="QLabel" name="label_phase_regularizer">
                 <property name="text">
-                 <string>Z Start (um)</string>
+                 <string>Regularizer</string>
                 </property>
                </widget>
               </item>
-              <item row="1" column="1">
-               <widget class="QLabel" name="label_zend">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_phase_rho">
                 <property name="text">
-                 <string>Z End (um)</string>
+                 <string>Rho</string>
                 </property>
                </widget>
               </item>
-              <item row="1" column="2">
-               <widget class="QLabel" name="label_zstep">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
+              <item row="2" column="1">
+               <widget class="QLineEdit" name="le_phase_strength">
                 <property name="text">
-                 <string>Z Step (um)</string>
+                 <string>.0001</string>
                 </property>
                </widget>
               </item>
-              <item row="3" column="0">
-               <widget class="QLabel" name="label_birefringence">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
+              <item row="4" column="1">
+               <widget class="QLineEdit" name="le_itr">
                 <property name="text">
-                 <string>Birefringence</string>
+                 <string>50</string>
+                </property>
+                <property name="placeholderText">
+                 <string>TV Only</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="0">
-               <widget class="QLineEdit" name="le_zstart"/>
-              </item>
-              <item row="4" column="1">
-               <widget class="QComboBox" name="cb_phase">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
-                <property name="focusPolicy">
-                 <enum>Qt::StrongFocus</enum>
-                </property>
+              <item row="1" column="1">
+               <widget class="QComboBox" name="cb_phase_denoiser">
                 <item>
                  <property name="text">
-                  <string>2D</string>
+                  <string>Tikhonov</string>
                  </property>
                 </item>
                 <item>
                  <property name="text">
-                  <string>3D</string>
+                  <string>TV</string>
                  </property>
                 </item>
                </widget>
               </item>
-              <item row="2" column="2">
-               <widget class="QLineEdit" name="le_zstep"/>
-              </item>
-              <item row="4" column="2">
-               <widget class="QCheckBox" name="chb_phase_from_bf">
+              <item row="3" column="1">
+               <widget class="QLineEdit" name="le_rho">
                 <property name="text">
-                 <string>Phase From BF</string>
+                 <string>0.001</string>
+                </property>
+                <property name="placeholderText">
+                 <string>TV Only</string>
                 </property>
                </widget>
               </item>
               <item row="4" column="0">
-               <widget class="QLabel" name="label_phase">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
-                </property>
+               <widget class="QLabel" name="label_itr">
                 <property name="text">
-                 <string>Phase</string>
+                 <string>Iterations</string>
                 </property>
                </widget>
               </item>
-              <item row="5" column="1">
-               <widget class="QComboBox" name="cb_acq_channel">
-                <property name="currentText">
-                 <string/>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_phase_strength">
+                <property name="text">
+                 <string>Strength</string>
                 </property>
                </widget>
               </item>
-              <item row="3" column="1">
-               <widget class="QComboBox" name="cb_birefringence">
-                <property name="font">
-                 <font>
-                  <italic>false</italic>
-                  <bold>false</bold>
-                 </font>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_pad_z">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
                 </property>
-                <property name="focusPolicy">
-                 <enum>Qt::StrongFocus</enum>
+                <property name="text">
+                 <string>Z Padding</string>
                 </property>
-                <item>
-                 <property name="text">
-                  <string>2D</string>
-                 </property>
-                </item>
-                <item>
-                 <property name="text">
-                  <string>3D</string>
-                 </property>
-                </item>
                </widget>
               </item>
-              <item row="5" column="0">
-               <widget class="QLabel" name="labe_acq_channel">
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="le_pad_z">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="text">
-                 <string>Acq Channel (BF Only)</string>
+                 <string>0</string>
                 </property>
                </widget>
               </item>
-              <item row="2" column="1">
-               <widget class="QLineEdit" name="le_zend"/>
-              </item>
              </layout>
             </widget>
            </item>
@@ -2599,12 +2121,9 @@
   </customwidget>
  </customwidgets>
  <tabstops>
-  <tabstop>le_gui_mode</tabstop>
-  <tabstop>qbutton_gui_mode</tabstop>
+  <tabstop>le_mm_status</tabstop>
   <tabstop>tabWidget</tabstop>
   <tabstop>scrollArea</tabstop>
-  <tabstop>qbutton_mm_connect</tabstop>
-  <tabstop>le_mm_status</tabstop>
   <tabstop>le_directory</tabstop>
   <tabstop>qbutton_browse</tabstop>
   <tabstop>le_swing</tabstop>
@@ -2614,7 +2133,6 @@
   <tabstop>cb_lca</tabstop>
   <tabstop>cb_lcb</tabstop>
   <tabstop>cb_config_group</tabstop>
-  <tabstop>chb_use_roi</tabstop>
   <tabstop>qbutton_calibrate</tabstop>
   <tabstop>qbutton_load_calib</tabstop>
   <tabstop>qbutton_calc_extinction</tabstop>
@@ -2632,7 +2150,6 @@
   <tabstop>qbutton_acq_birefringence</tabstop>
   <tabstop>qbutton_acq_phase</tabstop>
   <tabstop>qbutton_acq_birefringence_phase</tabstop>
-  <tabstop>qbutton_listen</tabstop>
   <tabstop>qbutton_stop_acq</tabstop>
   <tabstop>acq_settings</tabstop>
   <tabstop>le_zstart</tabstop>
@@ -2643,44 +2160,11 @@
   <tabstop>chb_phase_from_bf</tabstop>
   <tabstop>cb_acq_channel</tabstop>
   <tabstop>le_overlay_slice</tabstop>
-  <tabstop>chb_pause_updates</tabstop>
-  <tabstop>tabWidget_3</tabstop>
-  <tabstop>le_data_dir</tabstop>
-  <tabstop>qbutton_browse_data_dir</tabstop>
-  <tabstop>le_save_dir</tabstop>
-  <tabstop>qbutton_browse_save_dir</tabstop>
-  <tabstop>le_data_save_name</tabstop>
-  <tabstop>le_calibration_metadata</tabstop>
-  <tabstop>qbutton_browse_calib_meta</tabstop>
-  <tabstop>cb_bg_method</tabstop>
-  <tabstop>le_bg_path</tabstop>
-  <tabstop>qbutton_browse_bg_path</tabstop>
-  <tabstop>le_gpu_id</tabstop>
-  <tabstop>chb_use_gpu</tabstop>
-  <tabstop>le_recon_wavelength</tabstop>
-  <tabstop>le_obj_na</tabstop>
-  <tabstop>le_cond_na</tabstop>
-  <tabstop>le_ps</tabstop>
-  <tabstop>le_n_media</tabstop>
-  <tabstop>le_mag</tabstop>
-  <tabstop>qbutton_load_default_config</tabstop>
-  <tabstop>qbutton_load_config</tabstop>
-  <tabstop>qbutton_save_config</tabstop>
   <tabstop>le_notes_field</tabstop>
-  <tabstop>cb_method</tabstop>
-  <tabstop>cb_mode</tabstop>
-  <tabstop>le_positions</tabstop>
-  <tabstop>le_timepoints</tabstop>
-  <tabstop>le_focus_zidx</tabstop>
-  <tabstop>le_pad_z</tabstop>
-  <tabstop>le_bf_chan</tabstop>
-  <tabstop>le_output_channels</tabstop>
   <tabstop>cb_phase_denoiser</tabstop>
   <tabstop>le_phase_strength</tabstop>
   <tabstop>le_rho</tabstop>
   <tabstop>le_itr</tabstop>
-  <tabstop>qbutton_reconstruct</tabstop>
-  <tabstop>qbutton_stop_reconstruct</tabstop>
   <tabstop>le_sat_min</tabstop>
   <tabstop>le_sat_max</tabstop>
   <tabstop>qbutton_push_note</tabstop>
diff --git a/recOrder/plugin/widget/main_widget.py b/recOrder/plugin/main_widget.py
similarity index 51%
rename from recOrder/plugin/widget/main_widget.py
rename to recOrder/plugin/main_widget.py
index 9f681307..7ed2670f 100644
--- a/recOrder/plugin/widget/main_widget.py
+++ b/recOrder/plugin/main_widget.py
@@ -5,22 +5,19 @@
 from qtpy.QtGui import QPixmap, QColor
 from superqt import QDoubleRangeSlider, QRangeSlider
 from recOrder.calib import Calibration
-from recOrder.plugin.workers.calibration_workers import (
+from recOrder.calib.calibration_workers import (
     CalibrationWorker,
     BackgroundCaptureWorker,
     load_calibration,
 )
-from recOrder.plugin.workers.acquisition_workers import (
+from recOrder.acq.acquisition_workers import (
     PolarizationAcquisitionWorker,
-    ListeningWorker,
     BFAcquisitionWorker,
 )
-from recOrder.plugin.workers.reconstruction_workers import ReconstructionWorker
-from recOrder.plugin.qtdesigner import recOrder_ui
+from recOrder.plugin import gui
 from recOrder.io.core_functions import set_lc_state, snap_and_average
-from recOrder.io.metadata_reader import MetadataReader, get_last_metadata_file
-from recOrder.io.utils import load_bg, ret_ori_overlay, generic_hsv_overlay
-from recOrder.io.config_reader import ConfigReader, PROCESSING
+from recOrder.io.metadata_reader import MetadataReader
+from recOrder.io.utils import ret_ori_overlay
 from waveorder.io.reader import WaveorderReader
 from pathlib import Path, PurePath
 from napari import Viewer
@@ -32,58 +29,40 @@
 from os.path import dirname
 import json
 import logging
-import pathlib
 import textwrap
 
 
 class MainWidget(QWidget):
     """
     This is the main recOrder widget that houses all of the GUI components of recOrder.
-    The GUI is designed in QT Designer in /recOrder/plugin/widget/qt_designer and converted to a python file
+    The GUI is designed in QT Designer in /recOrder/plugin/gui.ui and converted to a python file
     with the pyuic5 command.
     """
 
     # Initialize Custom Signals
-    mm_status_changed = Signal(bool)
-    intensity_changed = Signal(float)
     log_changed = Signal(str)
 
     def __init__(self, napari_viewer: Viewer):
         super().__init__()
         self.viewer = napari_viewer
 
-        # Setup GUI Elements
-        self.ui = recOrder_ui.Ui_Form()
+        # Setup GUI elements
+        self.ui = gui.Ui_Form()
         self.ui.setupUi(self)
-        self._promote_slider_init()
 
-        # Setup Connections between elements
-        # Connect to MicroManager
-        # I'm disconnecting and hiding this button for 0.2.0, TODO: reinstate for 1.0.0
-        # In 1.0.0 we'll only have a single "Switch to Online/Offline" button in the "Calibration tab"
+        # Disable buttons until connected to MM
+        self._set_buttons_enabled(False)
 
-        # self.ui.qbutton_mm_connect.clicked[bool].connect(self.connect_to_mm)
-        self.ui.qbutton_mm_connect.hide()
+        # Set up overlay sliders (Commenting for 0.3.0. Consider debugging or deleting for 1.0.0.)
+        # self._promote_slider_init()
 
-        # Calibration Tab
-
-        # Remove QT creator calibration mode items
-        self.ui.cb_calib_mode.removeItem(0)
-        self.ui.cb_calib_mode.removeItem(0)
-
-        # Populate calibration modes from docstring
-        cal_docs = NumpyDocString(
-            Calibration.QLIPP_Calibration.__init__.__doc__
+        ## Connect GUI elements to functions
+        # Top bar
+        self.ui.qbutton_connect_to_mm.clicked[bool].connect(
+            self.toggle_mm_connection
         )
-        mode_docs = " ".join(cal_docs["Parameters"][3].desc).split("* ")[1:]
-        for i, mode_doc in enumerate(mode_docs):
-            mode_name, mode_tooltip = mode_doc.split(": ")
-            wrapped_tooltip = "\n".join(textwrap.wrap(mode_tooltip, width=70))
-            self.ui.cb_calib_mode.addItem(mode_name)
-            self.ui.cb_calib_mode.setItemData(
-                i, wrapped_tooltip, Qt.ToolTipRole
-            )
 
+        # Calibration tab
         self.ui.qbutton_browse.clicked[bool].connect(self.browse_dir_path)
         self.ui.le_directory.editingFinished.connect(self.enter_dir_path)
         self.ui.le_directory.setText(str(Path.cwd()))
@@ -104,9 +83,6 @@ def __init__(self, napari_viewer: Viewer):
         )
         self.ui.cb_lca.currentIndexChanged[int].connect(self.enter_dac_lca)
         self.ui.cb_lcb.currentIndexChanged[int].connect(self.enter_dac_lcb)
-        self.ui.chb_use_roi.stateChanged[int].connect(
-            self.enter_use_cropped_roi
-        )
         self.ui.qbutton_calibrate.clicked[bool].connect(self.run_calibration)
         self.ui.qbutton_load_calib.clicked[bool].connect(self.load_calibration)
         self.ui.qbutton_calc_extinction.clicked[bool].connect(
@@ -116,47 +92,41 @@ def __init__(self, napari_viewer: Viewer):
             self.enter_config_group
         )
 
-        # Capture Background
         self.ui.le_bg_folder.editingFinished.connect(self.enter_bg_folder_name)
         self.ui.le_n_avg.editingFinished.connect(self.enter_n_avg)
         self.ui.qbutton_capture_bg.clicked[bool].connect(self.capture_bg)
 
-        # Advanced
+        # Advanced tab
         self.ui.cb_loglevel.currentIndexChanged[int].connect(
             self.enter_log_level
         )
         self.ui.qbutton_push_note.clicked[bool].connect(self.push_note)
 
-        # Acquisition Tab
-        self.ui.qbutton_gui_mode.clicked[bool].connect(self.change_gui_mode)
+        # Acquisition tab
         self.ui.qbutton_browse_save_dir.clicked[bool].connect(
             self.browse_save_path
         )
         self.ui.le_save_dir.editingFinished.connect(self.enter_save_path)
         self.ui.le_save_dir.setText(str(Path.cwd()))
         self.ui.le_data_save_name.editingFinished.connect(self.enter_save_name)
-        self.ui.qbutton_listen.clicked[bool].connect(
-            self.listen_and_reconstruct
-        )
 
         self.ui.le_zstart.editingFinished.connect(self.enter_zstart)
-        self.ui.le_zstart.setText("-1")
+        self.ui.le_zstart.setText("-10")
         self.enter_zstart()
 
         self.ui.le_zend.editingFinished.connect(self.enter_zend)
-        self.ui.le_zend.setText("1")
+        self.ui.le_zend.setText("10")
         self.enter_zend()
 
         self.ui.le_zstep.editingFinished.connect(self.enter_zstep)
-        self.ui.le_zstep.setText("0.25")
+        self.ui.le_zstep.setText("1")
         self.enter_zstep()
 
         self.ui.chb_use_gpu.stateChanged[int].connect(self.enter_use_gpu)
         self.ui.le_gpu_id.editingFinished.connect(self.enter_gpu_id)
 
-        self.ui.le_recon_wavelength.setText(
-            "532"
-        )  # This parameter seems to be wired differently than others...investigate later
+        # This parameter seems to be wired differently than others...investigate later
+        self.ui.le_recon_wavelength.setText("532")
 
         self.ui.le_obj_na.editingFinished.connect(self.enter_obj_na)
         self.ui.le_obj_na.setText("1.3")
@@ -179,30 +149,11 @@ def __init__(self, napari_viewer: Viewer):
         self.enter_n_media()
 
         self.ui.le_pad_z.editingFinished.connect(self.enter_pad_z)
-        self.ui.chb_pause_updates.stateChanged[int].connect(
-            self.enter_pause_updates
-        )
         self.ui.cb_birefringence.currentIndexChanged[int].connect(
             self.enter_birefringence_dim
         )
         self.ui.cb_phase.currentIndexChanged[int].connect(self.enter_phase_dim)
 
-        # Populate background correction GUI element
-        for i in range(3):
-            self.ui.cb_bg_method.removeItem(0)
-        bg_options = ["None", "Measured", "Estimated", "Measured + Estimated"]
-        tooltips = [
-            "No background correction.",
-            'Correct sample images with a background image acquired at an empty field of view, loaded from "Background Path".',
-            "Estimate sample background by fitting a 2D surface to the sample images. Works well when structures are spatially distributed across the field of view and a clear background is unavailable.",
-            'Apply "Measured" background correction and then "Estimated" background correction. Use to remove residual background after the sample retardance is corrected with measured background.',
-        ]
-        for i, bg_option in enumerate(bg_options):
-            wrapped_tooltip = "\n".join(textwrap.wrap(tooltips[i], width=70))
-            self.ui.cb_bg_method.addItem(bg_option)
-            self.ui.cb_bg_method.setItemData(
-                i, wrapped_tooltip, Qt.ToolTipRole
-            )
         self.ui.cb_bg_method.currentIndexChanged[int].connect(
             self.enter_bg_correction
         )
@@ -218,76 +169,57 @@ def __init__(self, napari_viewer: Viewer):
         self.ui.qbutton_acq_birefringence_phase.clicked[bool].connect(
             self.acq_birefringence_phase
         )
-        self.ui.cb_colormap.currentIndexChanged[int].connect(
-            self.enter_colormap
-        )
-        self.ui.chb_display_volume.stateChanged[int].connect(
-            self.enter_use_full_volume
-        )
-        self.ui.le_overlay_slice.editingFinished.connect(
-            self.enter_display_slice
-        )
-        self.ui.slider_value.sliderMoved[tuple].connect(
-            self.handle_val_slider_move
-        )
-        self.ui.slider_saturation.sliderMoved[tuple].connect(
-            self.handle_sat_slider_move
-        )
-
-        # Display Tab
-        self.viewer.layers.events.inserted.connect(
-            self._add_layer_to_display_boxes
-        )
-        self.viewer.layers.events.removed.connect(
-            self._remove_layer_from_display_boxes
-        )
-        self.ui.qbutton_create_overlay.clicked[bool].connect(
-            self.create_overlay
-        )
-        self.ui.cb_saturation.currentIndexChanged[int].connect(
-            self.update_sat_scale
-        )
-        self.ui.cb_value.currentIndexChanged[int].connect(
-            self.update_value_scale
-        )
-        self.ui.le_sat_max.editingFinished.connect(self.enter_sat_max)
-        self.ui.le_sat_min.editingFinished.connect(self.enter_sat_min)
-        self.ui.le_val_max.editingFinished.connect(self.enter_val_max)
-        self.ui.le_val_min.editingFinished.connect(self.enter_val_min)
-
-        # Reconstruction
-        self.ui.qbutton_browse_data_dir.clicked[bool].connect(
-            self.browse_data_dir
-        )
-        self.ui.qbutton_browse_calib_meta.clicked[bool].connect(
-            self.browse_calib_meta
-        )
-        self.ui.qbutton_load_config.clicked[bool].connect(self.load_config)
-        self.ui.qbutton_save_config.clicked[bool].connect(self.save_config)
-        self.ui.qbutton_load_default_config.clicked[bool].connect(
-            self.load_default_config
-        )
-        self.ui.cb_method.currentIndexChanged[int].connect(self.enter_method)
-        self.ui.cb_mode.currentIndexChanged[int].connect(self.enter_mode)
-        self.ui.le_calibration_metadata.editingFinished.connect(
-            self.enter_calib_meta
-        )
-        self.ui.qbutton_reconstruct.clicked[bool].connect(self.reconstruct)
+        # Commenting for 0.3.0. Consider debugging or deleting for 1.0.0.
+        # self.ui.cb_colormap.currentIndexChanged[int].connect(
+        #     self.enter_colormap
+        # )
+        # self.ui.chb_display_volume.stateChanged[int].connect(
+        #     self.enter_use_full_volume
+        # )
+        # self.ui.le_overlay_slice.editingFinished.connect(
+        #     self.enter_display_slice
+        # )
+        # self.ui.slider_value.sliderMoved[tuple].connect(
+        #     self.handle_val_slider_move
+        # )
+        # self.ui.slider_saturation.sliderMoved[tuple].connect(
+        #     self.handle_sat_slider_move
+        # )
+
+        # Display Tab (Commenting to suppress warnings. Consider debugging or deleting for 1.0.0.)
+        # self.viewer.layers.events.inserted.connect(
+        #    self._add_layer_to_display_boxes
+        # )
+        # self.viewer.layers.events.removed.connect(
+        #    self._remove_layer_from_display_boxes
+        # )
+        # self.ui.qbutton_create_overlay.clicked[bool].connect(
+        #    self.create_overlay
+        # )
+        # self.ui.cb_saturation.currentIndexChanged[int].connect(
+        #    self.update_sat_scale
+        # )
+        # self.ui.cb_value.currentIndexChanged[int].connect(
+        #    self.update_value_scale
+        # )
+        # self.ui.le_sat_max.editingFinished.connect(self.enter_sat_max)
+        # self.ui.le_sat_min.editingFinished.connect(self.enter_sat_min)
+        # self.ui.le_val_max.editingFinished.connect(self.enter_val_max)
+        # self.ui.le_val_min.editingFinished.connect(self.enter_val_min)
+
+        # Reconstruction tab
         self.ui.cb_phase_denoiser.currentIndexChanged[int].connect(
             self.enter_phase_denoiser
         )
 
-        # Logging
+        ## Initialize logging
         log_box = QtLogger(self.ui.te_log)
         log_box.setFormatter(logging.Formatter("%(levelname)s - %(message)s"))
         logging.getLogger().addHandler(log_box)
         logging.getLogger().setLevel(logging.INFO)
 
-        # Signal Emitters
-        self.mm_status_changed.connect(self.handle_mm_status_update)
-
-        # Instantiate Attributes:
-        self.gui_mode = "offline"
+        ## Initialize attributes
+        self.connected_to_mm = False
         self.bridge = None
         self.mm = None
         self.mmc = None
@@ -296,8 +228,6 @@ def __init__(self, napari_viewer: Viewer):
         self.current_save_path = str(Path.cwd())
         self.current_bg_path = str(Path.cwd())
         self.directory = str(Path.cwd())
-
-        # Reconstruction / Calibration Parameter Defaults
         self.calib_scheme = "4-State"
         self.calib_mode = "MM-Retardance"
         self.interp_method = "schnoor_fit"
@@ -340,24 +270,19 @@ def __init__(self, napari_viewer: Viewer):
         self.last_p = 0
         self.reconstruction_data_path = None
         self.reconstruction_data = None
-
-        # Assessment attributes
         self.calib_assessment_level = None
+        recorder_dir = dirname(dirname(dirname(os.path.abspath(__file__))))
+        self.worker = None
 
-        # Init Plot
+        ## Initialize calibration plot
         self.plot_item = self.ui.plot_widget.getPlotItem()
         self.plot_item.enableAutoRange()
         self.plot_item.setLabel("left", "Intensity")
         self.ui.plot_widget.setBackground((32, 34, 40))
         self.plot_sequence = "Coarse"
 
-        # Init thread worker
-        self.worker = None
-
-        # Display/Initialiaze GUI Images (plotting legends, recOrder logo)
-        recorder_dir = dirname(
-            dirname(dirname(dirname(os.path.abspath(__file__))))
-        )
+        ## Initialize visuals
+        # Initialiaze GUI Images (plotting legends, recOrder logo)
         jch_legend_path = os.path.join(
             recorder_dir, "docs/images/JCh_legend.png"
         )
@@ -373,32 +298,23 @@ def __init__(self, napari_viewer: Viewer):
         logo_pixmap = QPixmap(logo_path)
         self.ui.label_logo.setPixmap(logo_pixmap)
 
-        # Get default config file
-        self.default_offline_config = os.path.join(
-            recorder_dir, "recOrder/plugin/config_offline_default.yml"
-        )
-
-        # Hide initial UI elements for later implementation or for later pop-up purposes
+        # Hide UI elements for popups
+        # DAC mode popups
         self.ui.label_lca.hide()
         self.ui.label_lcb.hide()
         self.ui.cb_lca.hide()
         self.ui.cb_lcb.hide()
-        self._hide_acquisition_ui(True)
+
+        # Background correction popups
         self.ui.label_bg_path.setHidden(True)
         self.ui.le_bg_path.setHidden(True)
         self.ui.qbutton_browse_bg_path.setHidden(True)
+
+        # Reconstruction parameter popups
         self.ui.le_rho.setHidden(True)
         self.ui.label_phase_rho.setHidden(True)
         self.ui.le_itr.setHidden(True)
         self.ui.label_itr.setHidden(True)
-        self.ui.le_bf_chan.setHidden(True)
-        self.ui.label_bf_chan.setHidden(True)
-        self.ui.label_focus_zidx.setHidden(True)
-        self.ui.le_focus_zidx.setHidden(True)
-
-        # Hide temporarily unsupported "Listen" functions
-        self.ui.qbutton_listen.setHidden(True)
-        self.ui.chb_pause_updates.setHidden(True)
 
         # Hide temporarily unsupported "Overlay" functions
         self.ui.tabWidget.setTabText(
@@ -407,35 +323,54 @@ def __init__(self, napari_viewer: Viewer):
         self.ui.label_orientation_legend.setHidden(True)
         self.ui.DisplayOptions.setHidden(True)
 
-        # Hide "Use Cropped ROI"
-        self.ui.chb_use_roi.setHidden(True)
-
         # Set initial UI Properties
-        self.ui.le_gui_mode.setStyleSheet(
+        self.ui.le_mm_status.setStyleSheet(
             "border: 1px solid rgb(200,0,0); color: rgb(200,0,0);"
         )
         self.ui.te_log.setStyleSheet("background-color: rgb(32,34,40);")
-        self.ui.le_mm_status.setText("Not Connected")
-        self.ui.le_mm_status.setStyleSheet("border: 1px solid yellow;")
         self.ui.le_sat_min.setStyleSheet("background-color: rgba(0, 0, 0, 0);")
         self.ui.le_sat_max.setStyleSheet("background-color: rgba(0, 0, 0, 0);")
         self.ui.le_val_min.setStyleSheet("background-color: rgba(0, 0, 0, 0);")
         self.ui.le_val_max.setStyleSheet("background-color: rgba(0, 0, 0, 0);")
         self.setStyleSheet("QTabWidget::tab-bar {alignment: center;}")
         self.red_text = QColor(200, 0, 0, 255)
-        self.original_tab_text = self.ui.tabWidget_3.tabBar().tabTextColor(0)
-        self.ui.tabWidget.parent().setObjectName(
-            "recOrder"
-        )  # make sure the top says recOrder and not 'Form'
-        self.ui.tabWidget_2.setCurrentIndex(
-            0
-        )  # set focus to "Plot" tab by default
-        self.ui.tabWidget_3.setCurrentIndex(
-            0
-        )  # set focus to "General" tab by default
-
-        # No "Optional" text on offline mode's calibration metadata box
-        self.ui.le_calibration_metadata.setPlaceholderText("")
+
+        # Populate background correction GUI element
+        for i in range(3):
+            self.ui.cb_bg_method.removeItem(0)
+        bg_options = ["None", "Measured", "Estimated", "Measured + Estimated"]
+        tooltips = [
+            "No background correction.",
+            'Correct sample images with a background image acquired at an empty field of view, loaded from "Background Path".',
+            "Estimate sample background by fitting a 2D surface to the sample images. Works well when structures are spatially distributed across the field of view and a clear background is unavailable.",
+            'Apply "Measured" background correction and then "Estimated" background correction. Use to remove residual background after the sample retardance is corrected with measured background.',
+        ]
+        for i, bg_option in enumerate(bg_options):
+            wrapped_tooltip = "\n".join(textwrap.wrap(tooltips[i], width=70))
+            self.ui.cb_bg_method.addItem(bg_option)
+            self.ui.cb_bg_method.setItemData(
+                i, wrapped_tooltip, Qt.ToolTipRole
+            )
+
+        # Populate calibration modes from docstring
+        cal_docs = NumpyDocString(
+            Calibration.QLIPP_Calibration.__init__.__doc__
+        )
+        mode_docs = " ".join(cal_docs["Parameters"][3].desc).split("* ")[1:]
+        for i, mode_doc in enumerate(mode_docs):
+            mode_name, mode_tooltip = mode_doc.split(": ")
+            wrapped_tooltip = "\n".join(textwrap.wrap(mode_tooltip, width=70))
+            self.ui.cb_calib_mode.addItem(mode_name)
+            self.ui.cb_calib_mode.setItemData(
+                i, wrapped_tooltip, Qt.ToolTipRole
+            )
+
+        # make sure the top says recOrder and not 'Form'
+        self.ui.tabWidget.parent().setObjectName("recOrder")
+
+        ## Set GUI behaviors
+        # set focus to "Plot" tab by default
+        self.ui.tabWidget_2.setCurrentIndex(0)
 
         # disable wheel events for combo boxes
         for attr_name in dir(self.ui):
@@ -603,109 +538,37 @@ def _promote_slider_init(self):
         )
         self.ui.slider_value.setRange(0, 100)
 
-    def _hide_acquisition_ui(self, val: bool):
+    def _set_buttons_enabled(self, val):
         """
-        hides or shows the acquisition (online) UI elements.  Used when switching between online/offline mode
-
-        Parameters
-        ----------
-        val:        (bool) True/False whether to hide (True) or show (False)
-
-        Returns
-        -------
-
-        """
-        self.ui.acq_settings.setHidden(val)
-        self.ui.acquire.setHidden(val)
-
-        # Calibration Tab
-        self.ui.tabWidget.setTabEnabled(0, not val)
-        if val:
-            self.ui.tabWidget.setStyleSheet(
-                "QTabBar::tab::disabled {width: 0; height: 0; margin: 0; padding: 0; border: none;} "
-            )
-        else:
-            self.ui.tabWidget.setStyleSheet("")
-            self.ui.le_mm_status.setText("Not Connected")
-            self.ui.le_mm_status.setStyleSheet("border: 1px solid yellow;")
-            self.mmc = None
-            self.mm = None
-            # self.ui.cb_config_group.clear() # this might be the culprit because it clear the config
-            self.ui.tabWidget.setCurrentIndex(0)
-
-    def _hide_offline_ui(self, val: bool):
-        """
-        hides or shows the offline UI elements.  Used when switching between online/offline mode
-
-        Parameters
-        ----------
-        val:        (bool) True/False whether to hide (True) or show (False)
-
-        Returns
-        -------
-
+        enables/disables buttons that require a connection to MM
         """
+        action_buttons = [
+            self.ui.qbutton_calibrate,
+            self.ui.qbutton_capture_bg,
+            self.ui.qbutton_calc_extinction,
+            self.ui.qbutton_acq_birefringence,
+            self.ui.qbutton_acq_phase,
+            self.ui.qbutton_acq_birefringence_phase,
+            self.ui.qbutton_load_calib,
+            self.ui.qbutton_create_overlay,
+        ]
 
-        # General Settings
-        self.ui.le_data_dir.setHidden(val)
-        self.ui.label_data_dir.setHidden(val)
-        self.ui.qbutton_browse_data_dir.setHidden(val)
-        self.ui.le_calibration_metadata.setHidden(val)
-        self.ui.label_calib_meta.setHidden(val)
-        self.ui.qbutton_browse_calib_meta.setHidden(val)
-        self.ui.qbutton_load_config.setHidden(val)
-        self.ui.qbutton_save_config.setHidden(val)
-        self.ui.qbutton_load_default_config.setHidden(val)
-        self.ui.qbutton_reconstruct.setHidden(val)
-        self.ui.qbutton_stop_reconstruct.setHidden(val)
-
-        # Processing Settings
-        self.ui.groupBox_2.setHidden(val)
+        for action_button in action_buttons:
+            action_button.setEnabled(val)
+            if val:
+                action_button.setToolTip("")
+                action_button.setStyleSheet("border: 1px solid rgb(32,34,40);")
+            else:
+                action_button.setToolTip(
+                    "Action temporarily disabled. Connect to MM or wait for acquisition to finish."
+                )
+                action_button.setStyleSheet("border: 1px solid rgb(65,72,81);")
 
     def _enable_buttons(self):
-        """
-        enables the buttons that were disabled during acquisition, calibration, or reconstruction
-
-        Returns
-        -------
-
-        """
-
-        self.ui.qbutton_calibrate.setEnabled(True)
-        self.ui.qbutton_capture_bg.setEnabled(True)
-        self.ui.qbutton_calc_extinction.setEnabled(True)
-        self.ui.qbutton_acq_birefringence.setEnabled(True)
-        self.ui.qbutton_acq_phase.setEnabled(True)
-        self.ui.qbutton_acq_birefringence_phase.setEnabled(True)
-        self.ui.qbutton_load_calib.setEnabled(True)
-        self.ui.qbutton_listen.setEnabled(True)
-        self.ui.qbutton_create_overlay.setEnabled(True)
-        self.ui.qbutton_reconstruct.setEnabled(True)
-        self.ui.qbutton_load_config.setEnabled(True)
-        self.ui.qbutton_load_default_config.setEnabled(True)
+        self._set_buttons_enabled(True)
 
     def _disable_buttons(self):
-        """
-        disables the buttons during acquisition, calibration, or reconstruction.  This prevents the user from
-        trying to do multiple actions at once (i.e. trying to use the acquisition features while calibration is running)
-
-        Returns
-        -------
-
-        """
-
-        self.ui.qbutton_calibrate.setEnabled(False)
-        self.ui.qbutton_capture_bg.setEnabled(False)
-        self.ui.qbutton_calc_extinction.setEnabled(False)
-        self.ui.qbutton_acq_birefringence.setEnabled(False)
-        self.ui.qbutton_acq_phase.setEnabled(False)
-        self.ui.qbutton_acq_birefringence_phase.setEnabled(False)
-        self.ui.qbutton_load_calib.setEnabled(False)
-        self.ui.qbutton_listen.setEnabled(False)
-        self.ui.qbutton_create_overlay.setEnabled(False)
-        self.ui.qbutton_reconstruct.setEnabled(False)
-        self.ui.qbutton_load_config.setEnabled(False)
-        self.ui.qbutton_load_default_config.setEnabled(False)
+        self._set_buttons_enabled(False)
 
     def _handle_error(self, exc):
         """
@@ -763,90 +626,65 @@ def _handle_load_finished(self):
     def _update_calib(self, val):
         self.calib = val
 
-    def _add_layer_to_display_boxes(self, val):
-        """
-        When a new napari layer is added to recOrder, update the Display Tab combo boxes with these layers.
-        This will allow the user to then choose which layers it wants to use for the overlay.  Will skip over
-        any layers that are already an 'Overlay'.  This function is connected to a napari.Layer signal
-
-        Parameters
-        ----------
-        val:            (napari.Layer) layer that was added [not used]
-
-        Returns
-        -------
-
-        """
-
-        for layer in self.viewer.layers:
-            if "Overlay" in layer.name:
-                continue
-            if layer.name not in [
-                self.ui.cb_hue.itemText(i)
-                for i in range(self.ui.cb_hue.count())
-            ]:
-                self.ui.cb_hue.addItem(layer.name)
-            if layer.name not in [
-                self.ui.cb_saturation.itemText(i)
-                for i in range(self.ui.cb_saturation.count())
-            ]:
-                self.ui.cb_saturation.addItem(layer.name)
-            if layer.name not in [
-                self.ui.cb_value.itemText(i)
-                for i in range(self.ui.cb_value.count())
-            ]:
-                self.ui.cb_value.addItem(layer.name)
-
-    def _remove_layer_from_display_boxes(self, val):
-        """
-        When a napari layer is removed from napari, remove the corresponding layer from Display Tab combo boxes.
-
-        Parameters
-        ----------
-        val:            (napari.Layer) layer that was removed by the user
-
-        Returns
-        -------
-
-        """
-
-        for i in range(self.ui.cb_hue.count()):
-            if val.value.name in self.ui.cb_hue.itemText(i):
-                self.ui.cb_hue.removeItem(i)
-            if val.value.name in self.ui.cb_saturation.itemText(i):
-                self.ui.cb_saturation.removeItem(i)
-            if val.value.name in self.ui.cb_value.itemText(i):
-                self.ui.cb_value.removeItem(i)
-
-    def _set_tab_red(self, name, state):
-        """
-        Convenience function to set a GUI tab red when there is a parameter missing for acquisiton or reconstruction
-
-        Parameters
-        ----------
-        name:           (str) Name of the tab
-        state:          (bool) True/False whether to set red (True) or not red (False)
-
-        Returns
-        -------
-
-        """
-
-        # this map corresponds to the tab index in the TabWidget GUI element
-        name_map = {"General": 0, "Processing": 1}
-
-        index = name_map[name]
-
-        if state:
-            self.ui.tabWidget_3.tabBar().setTabTextColor(index, self.red_text)
-        else:
-            self.ui.tabWidget_3.tabBar().setTabTextColor(
-                index, self.original_tab_text
-            )
+    # Commenting for 0.3.0. Consider debuging or removing for 1.0.0.
+    # def _add_layer_to_display_boxes(self, val):
+    #     """
+    #     When a new napari layer is added to recOrder, update the Display Tab combo boxes with these layers.
+    #     This will allow the user to then choose which layers it wants to use for the overlay.  Will skip over
+    #     any layers that are already an 'Overlay'.  This function is connected to a napari.Layer signal
+
+    #     Parameters
+    #     ----------
+    #     val:            (napari.Layer) layer that was added [not used]
+
+    #     Returns
+    #     -------
+
+    #     """
+
+    #     for layer in self.viewer.layers:
+    #         if "Overlay" in layer.name:
+    #             continue
+    #         if layer.name not in [
+    #             self.ui.cb_hue.itemText(i)
+    #             for i in range(self.ui.cb_hue.count())
+    #         ]:
+    #             self.ui.cb_hue.addItem(layer.name)
+    #         if layer.name not in [
+    #             self.ui.cb_saturation.itemText(i)
+    #             for i in range(self.ui.cb_saturation.count())
+    #         ]:
+    #             self.ui.cb_saturation.addItem(layer.name)
+    #         if layer.name not in [
+    #             self.ui.cb_value.itemText(i)
+    #             for i in range(self.ui.cb_value.count())
+    #         ]:
+    #             self.ui.cb_value.addItem(layer.name)
+
+    # def _remove_layer_from_display_boxes(self, val):
+    #     """
+    #     When a napari layer is removed from napari, remove the corresponding layer from Display Tab combo boxes.
+
+    #     Parameters
+    #     ----------
+    #     val:            (napari.Layer) layer that was removed by the user
+
+    #     Returns
+    #     -------
+
+    #     """
+
+    #     for i in range(self.ui.cb_hue.count()):
+    #         if val.value.name in self.ui.cb_hue.itemText(i):
+    #             self.ui.cb_hue.removeItem(i)
+    #         if val.value.name in self.ui.cb_saturation.itemText(i):
+    #             self.ui.cb_saturation.removeItem(i)
+    #         if val.value.name in self.ui.cb_value.itemText(i):
+    #             self.ui.cb_value.removeItem(i)
 
     def _check_line_edit(self, name):
         """
-        Convencience function used in checking whether a line edit is present or missing.  Will place a red border
+        Convenience function used in checking whether a line edit is present or missing.  Will place a red border
         around the line edit if it is empty, otherwise it will remove the red border.
 
         Parameters
@@ -882,10 +720,6 @@ def _check_requirements_for_acq(self, mode):
 
         """
 
-        # Initialize all tabs in their default style (not red)
-        self._set_tab_red("General", False)
-        self._set_tab_red("Processing", False)
-
         # initialize the variable to keep track of the success of the requirement check
         raise_error = False
 
@@ -911,14 +745,12 @@ def _check_requirements_for_acq(self, mode):
             success = self._check_line_edit("save_dir")
             if not success:
                 raise_error = True
-                self._set_tab_red("General", True)
 
             # check background path if 'Measured' or 'Measured + Estimated' is selected
             if self.bg_option == "local_fit+" or self.bg_option == "global":
                 success = self._check_line_edit("bg_path")
                 if not success:
                     raise_error = True
-                    self._set_tab_red("General", True)
 
         # Check phase specific fields
         if mode == "phase":
@@ -934,7 +766,6 @@ def _check_requirements_for_acq(self, mode):
                 )
                 if not cont:
                     raise_error = True
-                    self._set_tab_red(tab, True)
 
             for field in phase_required:
                 cont = self._check_line_edit(field)
@@ -946,8 +777,6 @@ def _check_requirements_for_acq(self, mode):
                 )
                 if not cont:
                     raise_error = True
-                    if field != "zstep":
-                        self._set_tab_red(tab, True)
                 else:
                     continue
 
@@ -957,706 +786,41 @@ def _check_requirements_for_acq(self, mode):
                 "Please enter in all of the parameters necessary for the acquisition"
             )
 
-    def _check_requirements_for_reconstruction(self):
-        """
-        This function will loop through the parameters for offline reconstruction and make sure the user has
-        specified the necessary parameters.  If it finds an empty or missing parameters, it will set missing fields red
-        and stop the reconstruction process.
-
-        Returns
-        -------
-
-        """
-
-        # Initalize all tab elements and reconstruct button to default state (not red)
-        self._set_tab_red("General", False)
-        self._set_tab_red("Processing", False)
-        self.ui.qbutton_reconstruct.setStyleSheet("")
-
-        # initalize the success variable of the requirement check
-        success = True
-
-        # gather the specified output channels (will determine which requirements are necessary to look at)
-        output_channels = self.ui.le_output_channels.text()
-        output_channels = output_channels.split(",")
-        output_channels = [chan.replace(" ", "") for chan in output_channels]
-
-        # intialize the reconstruction specific required fields
-        always_required = {
-            "data_dir",
-            "save_dir",
-            "positions",
-            "timepoints",
-            "output_channels",
-        }
-        birefringence_required = {"calibration_metadata", "recon_wavelength"}
-        phase_required = {
-            "recon_wavelength",
-            "mag",
-            "obj_na",
-            "cond_na",
-            "n_media",
-            "phase_strength",
-            "ps",
-        }
-
-        # intialize all UI elements in the default state
-        for field in always_required:
-            le = getattr(self.ui, f"le_{field}")
-            le.setStyleSheet("")
-        for field in phase_required:
-            le = getattr(self.ui, f"le_{field}")
-            le.setStyleSheet("")
-        for field in always_required:
-            cont = self._check_line_edit(field)
-            if not cont:
-                success = False
-                if field == "data_dir" or field == "save_dir":
-                    self._set_tab_red("General", True)
-                if (
-                    field == "positions"
-                    or field == "timepoints"
-                    or field == "output_channels"
-                ):
-                    self._set_tab_red("Processing", True)
-            else:
-                continue
-
-        possible_channels = [
-            "Retardance",
-            "Orientation",
-            "BF",
-            "S0",
-            "S1",
-            "S2",
-            "S3",
-            "Phase2D",
-            "Phase3D",
-        ]
-        bire_channels = [
-            "Retardance",
-            "Orientation",
-            "BF",
-            "S0",
-            "S1",
-            "S2",
-            "S3",
-        ]
-        qlipp_channel_present = False
-        bire_channel_present = False
-        if self.method == "QLIPP":
-            for channel in output_channels:
-                if channel in possible_channels:
-                    qlipp_channel_present = True
-                if channel in bire_channels:
-                    bire_channel_present = True
-
-            if qlipp_channel_present:
-                if bire_channel_present:
-                    for field in birefringence_required:
-                        cont = self._check_line_edit(field)
-                        tab = (
-                            getattr(self.ui, f"le_{field}")
-                            .parent()
-                            .parent()
-                            .objectName()
-                        )
-                        if not cont:
-                            if field != "calibration_metadata":
-                                self._set_tab_red(tab, True)
-                            success = False
-                        else:
-                            # self._set_tab_red(tab, False)
-                            continue
-
-                if (
-                    "Phase2D" in output_channels
-                    or "Phase3D" in output_channels
-                ):
-                    for field in phase_required:
-                        cont = self._check_line_edit(field)
-                        tab = (
-                            getattr(self.ui, f"le_{field}")
-                            .parent()
-                            .parent()
-                            .objectName()
-                        )
-                        if not cont:
-                            self._set_tab_red(tab, True)
-                            success = False
-                        else:
-                            self._set_tab_red(tab, False)
-                            continue
-                    if "Phase2D" in output_channels and self.mode == "2D":
-                        cont = self._check_line_edit("focus_zidx")
-                        if not cont:
-                            self._set_tab_red("Processing", True)
-                            success = False
-            else:
-                self._set_tab_red("Processing", True)
-                self.ui.le_output_channels.setStyleSheet(
-                    "border: 1px solid rgb(200,0,0);"
-                )
-                print("User did not specify any QLIPP Specific Channels")
-                success = False
-
-        elif self.method == "PhaseFromBF":
-            cont = self._check_line_edit("bf_chan")
-            tab = (
-                getattr(self.ui, f"le_bf_chan").parent().parent().objectName()
-            )
-            if not cont:
-                self._set_tab_red(tab, True)
-                success = False
-
-            if "Phase2D" in output_channels or "Phase3D" in output_channels:
-                for field in phase_required:
-                    cont = self._check_line_edit(field)
-                    tab = (
-                        getattr(self.ui, f"le_{field}")
-                        .parent()
-                        .parent()
-                        .objectName()
-                    )
-                    if not cont:
-                        self._set_tab_red(tab, True)
-                        success = False
-                    else:
-                        continue
-                if "Phase2D" in output_channels and self.mode == "2D":
-                    cont = self._check_line_edit("focus_zidx")
-                    if not cont:
-                        self._set_tab_red("Processing", True)
-                        success = False
-            else:
-                self._set_tab_red("Processing", True)
-                self.ui.le_output_channels.setStyleSheet(
-                    "border: 1px solid rgb(200,0,0);"
-                )
-                print(
-                    "User did not specify any PhaseFromBF Specific Channels (Phase2D, Phase3D)"
-                )
-                success = False
-
-        else:
-            print("Error in parameter checks")
-            self.ui.qbutton_reconstruct.setStyleSheet(
-                "border: 1px solid rgb(200,0,0);"
-            )
-            success = False
-
-        return success
-
-    def _populate_config_from_app(self):
-        """
-        This function will create a ConfigReader instance with the information from the UI elements.  This function
-        is called prior to reconstruction or when the user uses the "Save Config" to file functionality.
-
-        Returns
-        -------
-
-        """
-
-        # ConfigReader is usually immutable but we need it to not be in this case to update its properties
-        self.config_reader = ConfigReader(immutable=False)
-
-        # Parse dataset fields manually
-        self.config_reader.data_dir = self.ui.le_data_dir.text()
-        self.data_dir = self.ui.le_data_dir.text()
-        self.config_reader.save_dir = self.ui.le_save_dir.text()
-        self.save_directory = self.ui.le_save_dir.text()
-        self.config_reader.method = self.method
-        self.config_reader.mode = self.mode
-        self.config_reader.data_save_name = (
-            self.ui.le_data_save_name.text()
-            if self.ui.le_data_save_name.text() != ""
-            else pathlib.PurePath(self.data_dir).name
-        )
-        self.config_reader.calibration_metadata = (
-            self.ui.le_calibration_metadata.text()
-        )
-        self.config_reader.background = self.ui.le_bg_path.text()
-        self.config_reader.background_correction = self.bg_option
-
-        # Assumes that positions/timepoints can either be 'all'; '[all]'; 1, 2, 3, N; (start, end)
-        positions = self.ui.le_positions.text()
-        positions = positions.replace(" ", "")
-        if (
-            positions == "all"
-            or positions == "['all']"
-            or positions == "[all]"
-        ):
-            self.config_reader.positions = ["all"]
-        elif positions.startswith("[") and positions.endswith("]"):
-            vals = positions[1:-1].split(",")
-            if len(vals) != 2:
-                self._set_tab_red("Processing", True)
-                self.ui.le_positions.setStyleSheet(
-                    "border: 1px solid rgb(200,0,0);"
-                )
-            else:
-                self._set_tab_red("Processing", False)
-                self.ui.le_positions.setStyleSheet("")
-                self.config_reader.positions = [(int(vals[0]), int(vals[1]))]
-        elif positions.startswith("(") and positions.endswith(")"):
-            self.config_reader.positions = [eval(positions)]
-        else:
-            vals = positions.split(",")
-            vals = map(lambda x: int(x), vals)
-            self.config_reader.positions = list(vals)
-
-        timepoints = self.ui.le_timepoints.text()
-        timepoints = timepoints.replace(" ", "")
-        if (
-            timepoints == "all"
-            or timepoints == "['all']"
-            or timepoints == "[all]"
-        ):
-            self.config_reader.timepoints = ["all"]
-        elif timepoints.startswith("[") and timepoints.endswith("]"):
-            vals = timepoints[1:-1].split(",")
-            if len(vals) != 2:
-                self._set_tab_red("Processing", True)
-                self.ui.le_timepoints.setStyleSheet(
-                    "border: 1px solid rgb(200,0,0);"
-                )
-            else:
-                self._set_tab_red("Processing", False)
-                self.ui.le_timepoints.setStyleSheet("")
-                self.config_reader.timepoints = [(int(vals[0]), int(vals[1]))]
-        elif timepoints.startswith("(") and timepoints.endswith(")"):
-            self.config_reader.timepoints = [eval(timepoints)]
-        else:
-            vals = timepoints.split(",")
-            vals = map(lambda x: int(x), vals)
-            self.config_reader.timepoints = list(vals)
-
-        attrs = dir(self.ui)
-        skip = [
-            "wavelength",
-            "pixel_size",
-            "magnification",
-            "NA_objective",
-            "NA_condenser",
-            "n_objective_media",
-        ]
-        # TODO: Figure out how to catch errors in regularizer strength field
-        for key, value in PROCESSING.items():
-            if key not in skip:
-                if key == "background_correction":
-                    bg_map = {
-                        0: "None",
-                        1: "global",
-                        2: "local_fit",
-                        3: "local_fit+",
-                    }
-                    setattr(
-                        self.config_reader,
-                        key,
-                        bg_map[self.ui.cb_bg_method.currentIndex()],
-                    )
-
-                elif key == "output_channels":
-
-                    # Reset style sheets
-                    self.ui.le_output_channels.setStyleSheet("")
-                    self.ui.cb_mode.setStyleSheet("")
-                    self._set_tab_red("Processing", False)
-
-                    # Make a list of the channels from the line edit string
-                    field_text = self.ui.le_output_channels.text()
-                    channels = field_text.split(",")
-                    channels = [i.replace(" ", "") for i in channels]
-                    setattr(self.config_reader, key, channels)
-
-                    if "Phase3D" in channels and "Phase2D" in channels:
-                        self.ui.le_output_channels.setStyleSheet(
-                            "border: 1px solid rgb(200,0,0);"
-                        )
-                        self._set_tab_red("Processing", True)
-                        raise KeyError(
-                            f"Both Phase3D and Phase2D cannot be specified in output_channels.  Please compute "
-                            f"separately"
-                        )
-
-                    if "Phase3D" in channels and self.mode == "2D":
-                        self._set_tab_red("Processing", True)
-                        self.ui.le_output_channels.setStyleSheet(
-                            "border: 1px solid rgb(200,0,0);"
-                        )
-                        self.ui.cb_mode.setStyleSheet(
-                            "border: 1px solid rgb(200,0,0);"
-                        )
-                        raise KeyError(
-                            f"Specified mode is 2D and Phase3D was specified for reconstruction. "
-                            "Only 2D reconstructions can be performed in 2D mode"
-                        )
-
-                    if "Phase2D" in channels and self.mode == "3D":
-                        self._set_tab_red("Processing", True)
-                        self.ui.le_output_channels.setStyleSheet(
-                            "border: 1px solid rgb(200,0,0);"
-                        )
-                        self.ui.cb_mode.setStyleSheet(
-                            "border: 1px solid rgb(200,0,0);"
-                        )
-                        raise KeyError(
-                            f"Specified mode is 3D and Phase2D was specified for reconstruction. "
-                            "Only 3D reconstructions can be performed in 3D mode"
-                        )
-
-                elif key == "pad_z":
-                    val = self.ui.le_pad_z.text()
-                    setattr(self.config_reader, key, int(val))
-
-                elif key == "gpu_id":
-                    val = self.ui.le_gpu_id.text()
-                    setattr(self.config_reader, key, int(val))
-
-                elif key == "use_gpu":
-                    if self.ui.chb_use_gpu.isChecked():
-                        setattr(self.config_reader, key, True)
-                    else:
-                        setattr(self.config_reader, key, False)
-
-                elif key == "focus_zidx":
-                    val = self.ui.le_focus_zidx.text()
-                    if val == "":
-                        setattr(self.config_reader, key, None)
-                    else:
-                        setattr(self.config_reader, key, int(val))
-
-                else:
-                    attr_name = f"le_{key}"
-                    if attr_name in attrs:
-                        le = getattr(self.ui, attr_name)
-                        try:
-                            setattr(self.config_reader, key, float(le.text()))
-                        except ValueError as err:
-                            print(err)
-                            tab = le.parent().parent().objectName()
-                            self._set_tab_red(tab, True)
-                            le.setStyleSheet("border: 1px solid rgb(200,0,0);")
-                    else:
-                        continue
-
-        # Manually enter in phase regularization
-        if self.mode == "3D":
-            if self.ui.cb_phase_denoiser.currentIndex() == 0:
-                setattr(
-                    self.config_reader,
-                    "Tik_reg_ph_3D",
-                    float(self.ui.le_phase_strength.text()),
-                )
-            else:
-                setattr(
-                    self.config_reader,
-                    "TV_reg_ph_3D",
-                    float(self.ui.le_phase_strength.text()),
-                )
-                setattr(
-                    self.config_reader, "rho_3D", float(self.ui.le_rho.text())
-                )
-                setattr(
-                    self.config_reader, "itr_3D", int(self.ui.le_itr.text())
-                )
-
-        else:
-            if self.ui.cb_phase_denoiser.currentIndex() == 0:
-                setattr(
-                    self.config_reader,
-                    "Tik_reg_ph_2D",
-                    float(self.ui.le_phase_strength.text()),
-                )
-            else:
-                setattr(
-                    self.config_reader,
-                    "TV_reg_ph_2D",
-                    float(self.ui.le_phase_strength.text()),
-                )
-                setattr(
-                    self.config_reader, "rho_2D", float(self.ui.le_rho.text())
-                )
-                setattr(
-                    self.config_reader, "itr_2D", int(self.ui.le_itr.text())
-                )
-
-        if self.method == "PhaseFromBF":
-            setattr(
-                self.config_reader,
-                "wavelength",
-                int(self.ui.le_recon_wavelength.text()),
-            )
-            setattr(
-                self.config_reader,
-                "brightfield_channel_index",
-                int(self.ui.le_bf_chan.text()),
-            )
-
-            focus_zidx = self.ui.le_focus_zidx.text()
-            setattr(
-                self.config_reader,
-                "focus_zidx",
-                int(focus_zidx) if focus_zidx != "" else None,
-            )
-
-        else:
-            setattr(
-                self.config_reader,
-                "wavelength",
-                int(self.ui.le_recon_wavelength.text()),
-            )
-
-        # Parse name mismatch fields
-        setattr(
-            self.config_reader,
-            "NA_objective",
-            float(self.ui.le_obj_na.text())
-            if self.ui.le_obj_na.text() != ""
-            else None,
-        )
-        setattr(
-            self.config_reader,
-            "NA_condenser",
-            float(self.ui.le_cond_na.text())
-            if self.ui.le_cond_na.text() != ""
-            else None,
-        )
-        setattr(
-            self.config_reader,
-            "pixel_size",
-            float(self.ui.le_ps.text())
-            if self.ui.le_ps.text() != ""
-            else None,
-        )
-        setattr(
-            self.config_reader,
-            "n_objective_media",
-            float(self.ui.le_n_media.text())
-            if self.ui.le_n_media.text() != ""
-            else None,
-        )
-        setattr(
-            self.config_reader,
-            "magnification",
-            float(self.ui.le_mag.text())
-            if self.ui.le_mag.text() != ""
-            else None,
-        )
-
-    def _populate_from_config(self):
-        """
-        This function will take a previously defined config file and populate all of the UI elements.  Used in the
-        Load Config workflow.
-
-        Returns
-        -------
-
-        """
-        # Parse dataset fields manually
-        self.data_dir = self.config_reader.data_dir
-
-        self.ui.le_data_dir.setText(self.config_reader.data_dir)
-        self.save_directory = self.config_reader.save_dir
-        self.ui.le_save_dir.setText(self.config_reader.save_dir)
-        self.ui.le_data_save_name.setText(self.config_reader.data_save_name)
-        self.ui.le_calibration_metadata.setText(
-            self.config_reader.calibration_metadata
-        )
-        self.ui.le_bg_path.setText(self.config_reader.background)
-
-        self.mode = self.config_reader.mode
-        self.ui.cb_mode.setCurrentIndex(
-            0
-        ) if self.mode == "3D" else self.ui.cb_mode.setCurrentIndex(1)
-        self.method = self.config_reader.method
-        if self.method == "QLIPP":
-            self.ui.cb_method.setCurrentIndex(0)
-        elif self.method == "PhaseFromBF":
-            self.ui.cb_method.setCurrentIndex(1)
-        else:
-            print(f"Did not understand method from config: {self.method}")
-            self.ui.cb_method.setStyleSheet("border: 1px solid rgb(200,0,0);")
-
-        self.bg_option = self.config_reader.background_correction
-        if self.bg_option == "None":
-            self.ui.cb_bg_method.setCurrentIndex(0)
-        elif self.bg_option == "global":
-            self.ui.cb_bg_method.setCurrentIndex(1)
-        elif self.bg_option == "local_fit":
-            self.ui.cb_bg_method.setCurrentIndex(2)
-        elif self.bg_option == "local_fit+":
-            self.ui.cb_bg_method.setCurrentIndex(3)
-        else:
-            print(f"Did not understand method from config: {self.method}")
-            self.ui.cb_method.setStyleSheet("border: 1px solid rgb(200,0,0);")
-
-        if isinstance(self.config_reader.positions, list):
-            positions = self.config_reader.positions
-            text = ""
-            for idx, pos in enumerate(positions):
-                text += f"{pos}, " if idx != len(positions) - 1 else f"{pos}"
-                self.ui.le_positions.setText(text)
-        else:
-            self.ui.le_positions.setText(str(self.config_reader.positions))
-
-        if isinstance(self.config_reader.timepoints, list):
-            timepoints = self.config_reader.timepoints
-            text = ""
-            for idx, time in enumerate(timepoints):
-                text += (
-                    f"{time}, " if idx != len(timepoints) - 1 else f"{time}"
-                )
-                self.ui.le_timepoints.setText(text)
-        else:
-            self.ui.le_timepoints.setText(str(self.config_reader.timepoints))
-
-        # Parse Processing name mismatch fields
-        wavelengths = self.config_reader.wavelength
-        if not isinstance(wavelengths, list):
-            self.ui.le_recon_wavelength.setText(
-                str(int(self.config_reader.wavelength))
-            )
-        else:
-            text = ""
-            for idx, chan in enumerate(wavelengths):
-                text += (
-                    f"{chan}, " if idx != len(wavelengths) - 1 else f"{chan}"
-                )
-            self.ui.le_recon_wavelength.setText(text)
-
-        self.ui.le_obj_na.setText(str(self.config_reader.NA_objective))
-        self.ui.le_cond_na.setText(str(self.config_reader.NA_condenser))
-        self.ui.le_ps.setText(str(self.config_reader.pixel_size))
-        self.ui.le_n_media.setText(str(self.config_reader.n_objective_media))
-        self.ui.le_mag.setText(str(self.config_reader.magnification))
-
-        # Parse PhaseFromBF
-        if self.method == "PhaseFromBF":
-            self.ui.le_bf_chan.setText(
-                str(self.config_reader.brightfield_channel_index)
-            )
-
-        # Parse processing automatically
-        denoiser = None
-        for key, val in PROCESSING.items():
-            if key == "output_channels":
-                channels = self.config_reader.output_channels
-                text = ""
-                for idx, chan in enumerate(channels):
-                    text += (
-                        f"{chan}, " if idx != len(channels) - 1 else f"{chan}"
-                    )
-
-                self.ui.le_output_channels.setText(text)
-
-            elif key == "focus_zidx":
-                indices = self.config_reader.focus_zidx
-                if isinstance(indices, int):
-                    self.ui.le_focus_zidx.setText(str(indices))
-                elif isinstance(indices, list):
-                    text = ""
-                    for idx, val in enumerate(indices):
-                        text += (
-                            f"{val}, " if idx != len(indices) - 1 else f"{val}"
-                        )
-
-                    self.ui.le_focus_zidx.setText(text)
-
-            elif key == "use_gpu":
-                state = getattr(self.config_reader, key)
-                self.ui.chb_use_gpu.setChecked(state)
-
-            elif key == "gpu_id":
-                val = str(int(getattr(self.config_reader, key)))
-                self.ui.le_gpu_id.setText(val)
-
-            elif key == "pad_z":
-                val = str(int(getattr(self.config_reader, key)))
-                self.ui.le_pad_z.setText(val)
-
-            elif key == "focus_zidx":
-                val = str(int(getattr(self.config_reader, key)))
-                self.ui.le_focus_zidx.setText(val)
-
-            elif hasattr(self.ui, f"le_{key}"):
-                le = getattr(self.ui, f"le_{key}")
-                le.setText(
-                    str(getattr(self.config_reader, key))
-                    if not isinstance(getattr(self.config_reader, key), str)
-                    else getattr(self.config_reader, key)
-                )
-            elif hasattr(self.ui, f"cb_{key}"):
-                cb = getattr(self.ui, f"cb_{key}")
-                items = [cb.itemText(i) for i in range(cb.count())]
-                cfg_attr = getattr(self.config_reader, key)
-                self.ui.cb_mode.setCurrentIndex(items.index(cfg_attr))
-
-            elif key == "phase_denoiser_2D" or key == "phase_denoiser_3D":
-                cb = self.ui.cb_phase_denoiser
-                cfg_attr = getattr(
-                    self.config_reader, f"phase_denoiser_{self.mode}"
-                )
-                denoiser = cfg_attr
-                cb.setCurrentIndex(
-                    0
-                ) if cfg_attr == "Tikhonov" else cb.setCurrentIndex(1)
-            else:
-                if denoiser == "Tikhonov":
-                    strength = getattr(
-                        self.config_reader, f"Tik_reg_ph_{self.mode}"
-                    )
-                    self.ui.le_phase_strength.setText(str(strength))
-                else:
-                    strength = getattr(
-                        self.config_reader, f"TV_reg_ph_{self.mode}"
-                    )
-                    self.ui.le_phase_strength.setText(str(strength))
-                    self.ui.le_rho.setText(
-                        str(getattr(self.config_reader, f"rho_{self.mode}"))
-                    )
-                    self.ui.le_itr.setText(
-                        str(getattr(self.config_reader, f"itr_{self.mode}"))
-                    )
-
     @Slot(bool)
-    def change_gui_mode(self):
+    def toggle_mm_connection(self):
         """
-        Switches between offline/online mode and updates the corresponding GUI elements
-
-        Returns
-        -------
-
+        Toggles MM connection and updates the corresponding GUI elements.
         """
-        if self.gui_mode == "offline":
-            self.ui.qbutton_gui_mode.setText("Switch to Offline")
-            self.ui.le_gui_mode.setText("Online")
-            self.ui.le_gui_mode.setStyleSheet(
-                "border: 1px solid green; color: green;"
-            )
-            self._hide_offline_ui(True)
-            self._hide_acquisition_ui(False)
-            self.gui_mode = "online"
-            self.connect_to_mm()
-
-        else:
-            self.ui.qbutton_gui_mode.setText("Switch to Online")
-            self.ui.le_gui_mode.setText("Offline")
-            self.ui.le_gui_mode.setStyleSheet(
+        if self.connected_to_mm:
+            self.ui.qbutton_connect_to_mm.setText("Connect to MM")
+            self.ui.le_mm_status.setText("Disconnected")
+            self.ui.le_mm_status.setStyleSheet(
                 "border: 1px solid rgb(200,0,0); color: rgb(200,0,0);"
             )
-            self._hide_offline_ui(False)
-            self._hide_acquisition_ui(True)
-            self.gui_mode = "offline"
+            self.connected_to_mm = False
+            self._set_buttons_enabled(False)
             self.ui.cb_config_group.clear()
 
-            # Make sure button is still visible
-            self.ui.qbutton_mm_connect.setEnabled(True)
+        else:
+            try:
+                self.connect_to_mm()
+                self.ui.qbutton_connect_to_mm.setText("Disconnect from MM")
+                self.ui.le_mm_status.setText("Connected")
+                self.ui.le_mm_status.setStyleSheet(
+                    "border: 1px solid green; color: green;"
+                )
+                self.connected_to_mm = True
+                self._set_buttons_enabled(True)
+            except:
+                self.ui.le_mm_status.setText("Failed")
+                self.ui.le_mm_status.setStyleSheet(
+                    "border: 1px solid yellow; color: yellow;"
+                )
 
     @Slot(bool)
     def connect_to_mm(self):
         """
-        Function to establish the python/java bridge to MicroManager.  Micromanager must be open with a config loaded
+        Establishes the python/java bridge to Micromanager.  Micromanager must be open with a config loaded
         in order for the connection to be successful.  On connection, it will populate all of the available config
         groups.  Config group choice is used to establish which config group the Polarization states live in.
 
@@ -1667,122 +831,97 @@ def connect_to_mm(self):
         RECOMMENDED_MM = "20220920"
         ZMQ_TARGET_VERSION = "4.2.0"
         try:
-            # Try to open Bridge. Requires micromanager to be open with server running.
-            # This does not fail gracefully, so I'm wrapping it in its own try-except block.
-            try:
-                self.bridge = Bridge(convert_camel_case=False)
-                self.mmc = self.bridge.get_core()
-                self.mm = self.bridge.get_studio()
-            except:
-                print(
-                    (
-                        "Could not establish pycromanager bridge.\n"
-                        "Is micromanager open?\n"
-                        "Is Tools > Options > Run server on port 4827 checked?\n"
-                        f"Are you using nightly build {RECOMMENDED_MM}?"
-                    )
+            self.bridge = Bridge(convert_camel_case=False)
+            self.mmc = self.bridge.get_core()
+            self.mm = self.bridge.get_studio()
+        except:
+            print(
+                (
+                    "Could not establish pycromanager bridge.\n"
+                    "Is micromanager open?\n"
+                    "Is Tools > Options > Run server on port 4827 checked?\n"
+                    f"Are you using nightly build {RECOMMENDED_MM}?"
                 )
-                raise EnvironmentError
-
-            # Warn the user if there is a MicroManager/ZMQ version mismatch
-            self.bridge._main_socket.send(
-                {"command": "connect", "debug": False}
             )
-            reply_json = self.bridge._main_socket.receive(timeout=500)
-            zmq_mm_version = reply_json["version"]
-            if zmq_mm_version != ZMQ_TARGET_VERSION:
-                upgrade_str = (
-                    "upgrade"
-                    if version.parse(zmq_mm_version)
-                    < version.parse(ZMQ_TARGET_VERSION)
-                    else "downgrade"
-                )
-                print(
-                    (
-                        "WARNING: This version of Micromanager has not been tested with recOrder.\n"
-                        f"Please {upgrade_str} to MicroManager nightly build {RECOMMENDED_MM}."
-                    )
-                )
-
-            # Find config group containing calibration channels
-            # calib_channels is typically ['State0', 'State1', 'State2', ...]
-            # config_list may be something line ['GFP', 'RFP', 'State0', 'State1', 'State2', ...]
-            # config_list may also be of the form ['GFP', 'RFP', 'LF-State0', 'LF-State1', 'LF-State2', ...]
-            # in this version of the code we correctly parse 'LF-State0', but these channels cannot be used
-            # by the Calibration class.
-            # A valid config group contains all channels in calib_channels
-            # self.ui.cb_config_group.clear()    # This triggers the enter config we will clear when switching off
-            groups = self.mmc.getAvailableConfigGroups()
-            config_group_found = False
-            for i in range(groups.size()):
-                group = groups.get(i)
-                configs = self.mmc.getAvailableConfigs(group)
-                config_list = []
-                for j in range(configs.size()):
-                    config_list.append(configs.get(j))
-                if np.all(
-                    [
-                        np.any([ch in config for config in config_list])
-                        for ch in self.calib_channels
-                    ]
-                ):
-                    if not config_group_found:
-                        self.config_group = (
-                            group  # set to first config group found
-                        )
-                        config_group_found = True
-                    self.ui.cb_config_group.addItem(group)
-                # not entirely sure what this part does, but I left it in
-                # I think it tried to find a channel such as 'BF'
-                for ch in config_list:
-                    if ch not in self.calib_channels:
-                        self.ui.cb_acq_channel.addItem(ch)
-            if not config_group_found:
-                msg = (
-                    f"No config group contains channels {self.calib_channels}. "
-                    "Please refer to the recOrder wiki on how to set up the config properly."
-                )
-                self.ui.cb_config_group.setStyleSheet(
-                    "border: 1px solid rgb(200,0,0);"
+            raise EnvironmentError
+
+        # Warn the user if there is a MicroManager/ZMQ version mismatch
+        self.bridge._main_socket.send({"command": "connect", "debug": False})
+        reply_json = self.bridge._main_socket.receive(timeout=500)
+        zmq_mm_version = reply_json["version"]
+        if zmq_mm_version != ZMQ_TARGET_VERSION:
+            upgrade_str = (
+                "upgrade"
+                if version.parse(zmq_mm_version)
+                < version.parse(ZMQ_TARGET_VERSION)
+                else "downgrade"
+            )
+            print(
+                (
+                    "WARNING: This version of Micromanager has not been tested with recOrder.\n"
+                    f"Please {upgrade_str} to MicroManager nightly build {RECOMMENDED_MM}."
                 )
-                raise KeyError(msg)
-
-            # set startup LC control mode
-            _devices = self.mmc.getLoadedDevices()
-            loaded_devices = [_devices.get(i) for i in range(_devices.size())]
-            if LC_DEVICE_NAME in loaded_devices:
-                config_desc = self.mmc.getConfigData(
-                    "Channel", "State0"
-                ).getVerbose()
-                if "String send to" in config_desc:
-                    self.calib_mode = "MM-Retardance"
-                    self.ui.cb_calib_mode.setCurrentIndex(0)
-                if "Voltage (V)" in config_desc:
-                    self.calib_mode = "MM-Voltage"
-                    self.ui.cb_calib_mode.setCurrentIndex(1)
-            else:
-                self.calib_mode = "DAC"
-                self.ui.cb_calib_mode.setCurrentIndex(2)
-
-            self.mm_status_changed.emit(True)
-
-        except:
-            self.mm_status_changed.emit(False)
+            )
 
-    @Slot(bool)
-    def handle_mm_status_update(self, value):
-        if value:
-            self.ui.le_mm_status.setText("Success!")
-            self.ui.le_mm_status.setStyleSheet("background-color: green;")
-            # Disabling the button
-            self.ui.qbutton_mm_connect.setEnabled(False)
-        else:
-            # Make sure button is still visible if it fails
-            self.ui.qbutton_mm_connect.setEnabled(True)
-            self.ui.le_mm_status.setText("Failed.")
-            self.ui.le_mm_status.setStyleSheet(
-                "background-color: rgb(200,0,0);"
+        # Find config group containing calibration channels
+        # calib_channels is typically ['State0', 'State1', 'State2', ...]
+        # config_list may be something line ['GFP', 'RFP', 'State0', 'State1', 'State2', ...]
+        # config_list may also be of the form ['GFP', 'RFP', 'LF-State0', 'LF-State1', 'LF-State2', ...]
+        # in this version of the code we correctly parse 'LF-State0', but these channels cannot be used
+        # by the Calibration class.
+        # A valid config group contains all channels in calib_channels
+        # self.ui.cb_config_group.clear()    # This triggers the enter config we will clear when switching off
+        groups = self.mmc.getAvailableConfigGroups()
+        config_group_found = False
+        for i in range(groups.size()):
+            group = groups.get(i)
+            configs = self.mmc.getAvailableConfigs(group)
+            config_list = []
+            for j in range(configs.size()):
+                config_list.append(configs.get(j))
+            if np.all(
+                [
+                    np.any([ch in config for config in config_list])
+                    for ch in self.calib_channels
+                ]
+            ):
+                if not config_group_found:
+                    self.config_group = (
+                        group  # set to first config group found
+                    )
+                    config_group_found = True
+                self.ui.cb_config_group.addItem(group)
+            # not entirely sure what this part does, but I left it in
+            # I think it tried to find a channel such as 'BF'
+            for ch in config_list:
+                if ch not in self.calib_channels:
+                    self.ui.cb_acq_channel.addItem(ch)
+        if not config_group_found:
+            msg = (
+                f"No config group contains channels {self.calib_channels}. "
+                "Please refer to the recOrder wiki on how to set up the config properly."
             )
+            self.ui.cb_config_group.setStyleSheet(
+                "border: 1px solid rgb(200,0,0);"
+            )
+            raise KeyError(msg)
+
+        # set startup LC control mode
+        _devices = self.mmc.getLoadedDevices()
+        loaded_devices = [_devices.get(i) for i in range(_devices.size())]
+        if LC_DEVICE_NAME in loaded_devices:
+            config_desc = self.mmc.getConfigData(
+                "Channel", "State0"
+            ).getVerbose()
+            if "String send to" in config_desc:
+                self.calib_mode = "MM-Retardance"
+                self.ui.cb_calib_mode.setCurrentIndex(0)
+            if "Voltage (V)" in config_desc:
+                self.calib_mode = "MM-Voltage"
+                self.ui.cb_calib_mode.setCurrentIndex(1)
+        else:
+            self.calib_mode = "DAC"
+            self.ui.cb_calib_mode.setCurrentIndex(2)
 
     @Slot(tuple)
     def handle_progress_update(self, value):
@@ -1984,28 +1123,6 @@ def handle_qlipp_reconstructor_update(self, value):
         # Saves phase reconstructor to be re-used if possible
         self.phase_reconstructor = value
 
-    @Slot(dict)
-    def handle_meta_update(self, meta):
-        # Don't update microscope parameters saved in calibration metadata file
-
-        # if self.last_calib_meta_file is None:
-        #     print("\nWARNING: No calibration file has been loaded\n")
-        #     return
-        #
-        # with open(self.last_calib_meta_file, 'r') as file:
-        #     current_json = json.load(file)
-        #
-        # for key, value in current_json['Microscope Parameters'].items():
-        #     if key in meta:
-        #         current_json['Microscope Parameters'][key] = meta[key]
-        #     else:
-        #         current_json['Microscope Parameters'][key] = None
-        #
-        # with open(self.last_calib_meta_file, 'w') as file:
-        #     json.dump(current_json, file, indent=1)
-
-        pass
-
     @Slot(str)
     def handle_calib_file_update(self, value):
         self.last_calib_meta_file = value
@@ -2215,14 +1332,6 @@ def enter_config_group(self):
             else:
                 self.ui.cb_config_group.setStyleSheet("")
 
-    @Slot()
-    def enter_use_cropped_roi(self):
-        state = self.ui.chb_use_roi.checkState()
-        if state == 2:
-            self.use_cropped_roi = True
-        elif state == 0:
-            self.use_cropped_roi = False
-
     @Slot()
     def enter_bg_folder_name(self):
         self.bg_folder_name = self.ui.le_bg_folder.text()
@@ -2475,86 +1584,87 @@ def enter_calib_meta(self):
             self.ui.le_calibration_metadata.setStyleSheet("")
             self.calib_path = entry
 
-    @Slot()
-    def enter_colormap(self):
-        """
-        Handles the update of the display colormap.  Will display different png image legend
-        depending on the colormap choice.
-
-        Returns
-        -------
-
-        """
-
-        prev_cmap = self.colormap
-        state = self.ui.cb_colormap.currentIndex()
-        if state == 0:
-            self.ui.label_orientation_image.setPixmap(self.jch_pixmap)
-            self.colormap = "JCh"
-        else:
-            self.ui.label_orientation_image.setPixmap(self.hsv_pixmap)
-            self.colormap = "HSV"
-
-        # Update the birefringence overlay to new colormap if the colormap has changed
-        if prev_cmap != self.colormap:
-            # TODO: Handle case where there are multiple snaps
-            if "BirefringenceOverlay2D" in self.viewer.layers:
-                if (
-                    "Retardance2D" in self.viewer.layers
-                    and "Orientation2D" in self.viewer.layers
-                ):
-
-                    overlay = ret_ori_overlay(
-                        retardance=self.viewer.layers["Retardance2D"].data,
-                        orientation=self.viewer.layers["Orientation2D"].data,
-                        ret_max=np.percentile(
-                            self.viewer.layers["Retardance2D"].data, 99.99
-                        ),
-                        cmap=self.colormap,
-                    )
-
-                    self.viewer.layers["BirefringenceOverlay2D"].data = overlay
-
-    @Slot(int)
-    def enter_use_full_volume(self):
-        state = self.ui.chb_display_volume.checkState()
-
-        if state == 2:
-            self.ui.le_overlay_slice.clear()
-            self.ui.le_overlay_slice.setEnabled(False)
-            self.use_full_volume = False
-        else:
-            self.ui.le_overlay_slice.setEnabled(True)
-            self.use_full_volume = True
-
-    @Slot()
-    def enter_display_slice(self):
-        slice = int(self.ui.le_overlay_slice.text())
-        self.display_slice = slice
-
-    @Slot()
-    def enter_sat_min(self):
-        val = float(self.ui.le_sat_min.text())
-        slider_val = self.ui.slider_saturation.value()
-        self.ui.slider_saturation.setValue((val, slider_val[1]))
-
-    @Slot()
-    def enter_sat_max(self):
-        val = float(self.ui.le_sat_max.text())
-        slider_val = self.ui.slider_saturation.value()
-        self.ui.slider_saturation.setValue((slider_val[0], val))
-
-    @Slot()
-    def enter_val_min(self):
-        val = float(self.ui.le_val_min.text())
-        slider_val = self.ui.slider_value.value()
-        self.ui.slider_value.setValue((val, slider_val[1]))
-
-    @Slot()
-    def enter_val_max(self):
-        val = float(self.ui.le_val_max.text())
-        slider_val = self.ui.slider_value.value()
-        self.ui.slider_value.setValue((slider_val[0], val))
+    # Comment for 0.3.0. Consider debugging or deleting for 1.0.0.
+    # @Slot()
+    # def enter_colormap(self):
+    #     """
+    #     Handles the update of the display colormap.  Will display different png image legend
+    #     depending on the colormap choice.
+
+    #     Returns
+    #     -------
+
+    #     """
+
+    #     prev_cmap = self.colormap
+    #     state = self.ui.cb_colormap.currentIndex()
+    #     if state == 0:
+    #         self.ui.label_orientation_image.setPixmap(self.jch_pixmap)
+    #         self.colormap = "JCh"
+    #     else:
+    #         self.ui.label_orientation_image.setPixmap(self.hsv_pixmap)
+    #         self.colormap = "HSV"
+
+    #     # Update the birefringence overlay to new colormap if the colormap has changed
+    #     if prev_cmap != self.colormap:
+    #         # TODO: Handle case where there are multiple snaps
+    #         if "BirefringenceOverlay2D" in self.viewer.layers:
+    #             if (
+    #                 "Retardance2D" in self.viewer.layers
+    #                 and "Orientation2D" in self.viewer.layers
+    #             ):
+
+    #                 overlay = ret_ori_overlay(
+    #                     retardance=self.viewer.layers["Retardance2D"].data,
+    #                     orientation=self.viewer.layers["Orientation2D"].data,
+    #                     ret_max=np.percentile(
+    #                         self.viewer.layers["Retardance2D"].data, 99.99
+    #                     ),
+    #                     cmap=self.colormap,
+    #                 )
+
+    #                 self.viewer.layers["BirefringenceOverlay2D"].data = overlay
+
+    # @Slot(int)
+    # def enter_use_full_volume(self):
+    #     state = self.ui.chb_display_volume.checkState()
+
+    #     if state == 2:
+    #         self.ui.le_overlay_slice.clear()
+    #         self.ui.le_overlay_slice.setEnabled(False)
+    #         self.use_full_volume = False
+    #     else:
+    #         self.ui.le_overlay_slice.setEnabled(True)
+    #         self.use_full_volume = True
+
+    # @Slot()
+    # def enter_display_slice(self):
+    #     slice = int(self.ui.le_overlay_slice.text())
+    #     self.display_slice = slice
+
+    # @Slot()
+    # def enter_sat_min(self):
+    #     val = float(self.ui.le_sat_min.text())
+    #     slider_val = self.ui.slider_saturation.value()
+    #     self.ui.slider_saturation.setValue((val, slider_val[1]))
+
+    # @Slot()
+    # def enter_sat_max(self):
+    #     val = float(self.ui.le_sat_max.text())
+    #     slider_val = self.ui.slider_saturation.value()
+    #     self.ui.slider_saturation.setValue((slider_val[0], val))
+
+    # @Slot()
+    # def enter_val_min(self):
+    #     val = float(self.ui.le_val_min.text())
+    #     slider_val = self.ui.slider_value.value()
+    #     self.ui.slider_value.setValue((val, slider_val[1]))
+
+    # @Slot()
+    # def enter_val_max(self):
+    #     val = float(self.ui.le_val_max.text())
+    #     slider_val = self.ui.slider_value.value()
+    #     self.ui.slider_value.setValue((slider_val[0], val))
 
     @Slot(bool)
     def push_note(self):
@@ -2614,28 +1724,6 @@ def calc_extinction(self):
         )
         self.ui.le_extinction.setText(str(extinction))
 
-    @property
-    def _microscope_params(self):
-        """
-        A dictionary containing microscope parameters from the current GUI
-        Unused in 0.2.0 --- candidate for deletion
-        """
-
-        def _param_value(param_name: str, ui=self.ui):
-            # refer to main widget class ui attribute names
-            ui_attr_name = "le_" + param_name
-            param_text = ui.__getattribute__(ui_attr_name).text()
-            # handle blank string
-            return float(param_text) if param_text != "" else None
-
-        return {
-            "n_objective_media": _param_value("n_media"),
-            "objective_NA": _param_value("obj_na"),
-            "condenser_NA": _param_value("cond_na"),
-            "magnification": _param_value("mag"),
-            "pixel_size": _param_value("ps"),
-        }
-
     @Slot(bool)
     def load_calibration(self):
         """
@@ -2869,7 +1957,6 @@ def acq_birefringence(self):
 
         # Connect Handlers
         self.worker.bire_image_emitter.connect(self.handle_bire_image_update)
-        self.worker.meta_emitter.connect(self.handle_meta_update)
         self.worker.started.connect(self._disable_buttons)
         self.worker.finished.connect(self._enable_buttons)
         self.worker.errored.connect(self._handle_acq_error)
@@ -2898,7 +1985,6 @@ def acq_phase(self):
         self.worker.phase_reconstructor_emitter.connect(
             self.handle_qlipp_reconstructor_update
         )
-        self.worker.meta_emitter.connect(self.handle_meta_update)
         self.worker.started.connect(self._disable_buttons)
         self.worker.finished.connect(self._enable_buttons)
         self.worker.errored.connect(self._handle_acq_error)
@@ -2914,7 +2000,6 @@ def acq_birefringence_phase(self):
 
         self._check_requirements_for_acq("phase")
 
-        # Init worker
         # Init worker and thread
         self.worker = PolarizationAcquisitionWorker(self, self.calib, "all")
 
@@ -2924,7 +2009,6 @@ def acq_birefringence_phase(self):
             self.handle_qlipp_reconstructor_update
         )
         self.worker.bire_image_emitter.connect(self.handle_bire_image_update)
-        self.worker.meta_emitter.connect(self.handle_meta_update)
         self.worker.started.connect(self._disable_buttons)
         self.worker.finished.connect(self._enable_buttons)
         self.worker.errored.connect(self._handle_acq_error)
@@ -2933,73 +2017,6 @@ def acq_birefringence_phase(self):
         # Start Thread
         self.worker.start()
 
-    @Slot(bool)
-    def listen_and_reconstruct(self):
-        """
-        Wrapper function for on the fly data listening and reconstructing.  Only works if the user is acquiring
-        polarization only data (cannot have any extra channels in the acquisition)
-
-        Returns
-        -------
-
-        """
-
-        # Init reconstructor
-        if self.bg_option != "None":
-            metadata_file = get_last_metadata_file(self.current_bg_path)
-            metadata = MetadataReader(metadata_file)
-            roi = metadata.ROI
-            height, width = roi[2], roi[3]
-            bg_data = load_bg(
-                self.current_bg_path, height, width, roi
-            )  # TODO: remove ROI for 1.0.0
-        else:
-            bg_data = None
-
-        # Init worker
-        self.worker = ListeningWorker(self, bg_data)
-
-        # connect handlers
-        self.worker.store_emitter.connect(self.add_listener_data)
-        self.worker.dim_emitter.connect(self.update_dims)
-        self.worker.started.connect(self._disable_buttons)
-        self.worker.finished.connect(self._enable_buttons)
-        self.worker.finished.connect(self._reset_listening)
-        self.worker.errored.connect(self._handle_acq_error)
-        self.ui.qbutton_stop_acq.clicked.connect(self.worker.quit)
-
-        # Start Thread
-        self.worker.start()
-
-    @Slot(bool)
-    def reconstruct(self):
-        """
-        Wrapper function for offline reconstruction.
-        """
-
-        success = self._check_requirements_for_reconstruction()
-        if not success:
-            raise ValueError(
-                "Please make sure all necessary parameters are set before reconstruction"
-            )
-
-        self._populate_config_from_app()
-        self.worker = ReconstructionWorker(self, self.config_reader)
-
-        # connect handlers
-        self.worker.dimension_emitter.connect(
-            self.handle_reconstruction_dim_update
-        )
-        self.worker.store_emitter.connect(
-            self.handle_reconstruction_store_update
-        )
-        self.worker.started.connect(self._disable_buttons)
-        self.worker.finished.connect(self._enable_buttons)
-        self.worker.errored.connect(self._handle_acq_error)
-        self.ui.qbutton_stop_acq.clicked.connect(self.worker.quit)
-
-        self.worker.start()
-
     @Slot(bool)
     def save_config(self):
         path = self._open_file_dialog(self.save_config_path, "save")
@@ -3019,153 +2036,123 @@ def save_config(self):
 
         self.config_reader.save_yaml(dir_=dir_, name=name)
 
-    @Slot(bool)
-    def load_config(self):
-        """
-        Populates the GUI elements with values from a pre-defined config file.
-
-        Returns
-        -------
-
-        """
-        path = self._open_file_dialog(self.save_config_path, "file")
-        if path == "":
-            pass
-        else:
-            self.config_path = path
-            self.config_reader = ConfigReader(self.config_path)
-            self._populate_from_config()
-
-    @Slot(bool)
-    def load_default_config(self):
-        self.config_reader = ConfigReader(self.default_offline_config)
-        self._populate_from_config()
-
-    @Slot(int)
-    def update_sat_scale(self):
-        idx = self.ui.cb_saturation.currentIndex()
-        if idx != -1:
-            layer = self.ui.cb_saturation.itemText(idx)
-            data = self.viewer.layers[layer].data
-            min_, max_ = np.min(data), np.max(data)
-            self.ui.slider_saturation.setMinimum(min_)
-            self.ui.slider_saturation.setMaximum(max_)
-            self.ui.slider_saturation.setSingleStep((max_ - min_) / 250)
-            self.ui.slider_saturation.setValue((min_, max_))
-            self.ui.le_sat_max.setText(str(np.round(max_, 3)))
-            self.ui.le_sat_min.setText(str(np.round(min_, 3)))
-
-    @Slot(int)
-    def update_value_scale(self):
-        idx = self.ui.cb_value.currentIndex()
-        if idx != -1:
-            layer = self.ui.cb_value.itemText(idx)
-            data = self.viewer.layers[layer].data
-            min_, max_ = np.min(data), np.max(data)
-            self.ui.slider_value.setMinimum(min_)
-            self.ui.slider_value.setMaximum(max_)
-            self.ui.slider_value.setSingleStep((max_ - min_) / 250)
-            self.ui.slider_value.setValue((min_, max_))
-            self.ui.le_val_max.setText(str(np.round(max_, 3)))
-            self.ui.le_val_min.setText(str(np.round(min_, 3)))
-
-    @Slot(bool)
-    def create_overlay(self):
-        """
-        Creates HSV or JCh overlay with the specified channels from the combo boxes.  Will compute and then
-        display the overlay in napari.
-
-        Returns
-        -------
-
-        """
-
-        if (
-            self.ui.cb_hue.count() == 0
-            or self.ui.cb_saturation.count() == 0
-            or self.ui.cb_value == 0
-        ):
-            raise ValueError(
-                "Cannot create overlay until all 3 combo boxes are populated"
-            )
-
-        # Gather channel data
-        H = self.viewer.layers[
-            self.ui.cb_hue.itemText(self.ui.cb_hue.currentIndex())
-        ].data
-        S = self.viewer.layers[
-            self.ui.cb_saturation.itemText(
-                self.ui.cb_saturation.currentIndex()
-            )
-        ].data
-        V = self.viewer.layers[
-            self.ui.cb_value.itemText(self.ui.cb_value.currentIndex())
-        ].data
-
-        # TODO: this is a temp fix which handles on data with n-dimensions of 4, 3, or 2 which automatically
-        # chooses the first timepoint
-        if H.ndim > 2 or S.ndim > 2 or V.ndim > 2:
-            if H.ndim == 4:
-                # assumes this is a (T, Z, Y, X) array read from napari-ome-zarr
-                H = (
-                    H[0, self.display_slice]
-                    if not self.use_full_volume
-                    else H[0]
-                )
-            if S.ndim == 4:
-                S = (
-                    S[0, self.display_slice]
-                    if not self.use_full_volume
-                    else S[0]
-                )
-            if V.ndim == 4:
-                V = (
-                    V[0, self.display_slice]
-                    if not self.use_full_volume
-                    else V[0]
-                )
-
-            if H.ndim == 3:
-                # assumes this is a (Z, Y, X) array collected from acquisition module
-                H = H[self.display_slice] if not self.use_full_volume else H
-
-            if S.ndim == 3:
-                S = S[self.display_slice] if not self.use_full_volume else S
-
-            if S.ndim == 3:
-                S = S[self.display_slice] if not self.use_full_volume else S
-
-        mode = "2D" if not self.use_full_volume else "3D"
-
-        H_name = self.ui.cb_hue.itemText(self.ui.cb_hue.currentIndex())
-        H_scale = (
-            (np.min(H), np.max(H))
-            if "Orientation" not in H_name
-            else (0, np.pi)
-        )
-        S_scale = self.ui.slider_saturation.value()
-        V_scale = self.ui.slider_value.value()
-
-        hsv_image = generic_hsv_overlay(
-            H, S, V, H_scale, S_scale, V_scale, mode=mode
-        )
-
-        # Create overlay layer name
-        idx = 0
-        while f"HSV_Overlay_{idx}" in self.viewer.layers:
-            idx += 1
-
-        # add overlay image to napari
-        self.viewer.add_image(hsv_image, name=f"HSV_Overlay_{idx}", rgb=True)
-
-    @Slot(object)
-    def add_listener_data(self, store):
-
-        self.viewer.add_image(store["Birefringence"], name=self.worker.prefix)
-        self.viewer.dims.set_axis_label(0, "P")
-        self.viewer.dims.set_axis_label(1, "T")
-        self.viewer.dims.set_axis_label(2, "C")
-        self.viewer.dims.set_axis_label(3, "Z")
+    # Commenting for 0.3.0. Consider debugging or deleting for 1.0.0.
+    # @Slot(int)
+    # def update_sat_scale(self):
+    #     idx = self.ui.cb_saturation.currentIndex()
+    #     if idx != -1:
+    #         layer = self.ui.cb_saturation.itemText(idx)
+    #         data = self.viewer.layers[layer].data
+    #         min_, max_ = np.min(data), np.max(data)
+    #         self.ui.slider_saturation.setMinimum(min_)
+    #         self.ui.slider_saturation.setMaximum(max_)
+    #         self.ui.slider_saturation.setSingleStep((max_ - min_) / 250)
+    #         self.ui.slider_saturation.setValue((min_, max_))
+    #         self.ui.le_sat_max.setText(str(np.round(max_, 3)))
+    #         self.ui.le_sat_min.setText(str(np.round(min_, 3)))
+
+    # @Slot(int)
+    # def update_value_scale(self):
+    #     idx = self.ui.cb_value.currentIndex()
+    #     if idx != -1:
+    #         layer = self.ui.cb_value.itemText(idx)
+    #         data = self.viewer.layers[layer].data
+    #         min_, max_ = np.min(data), np.max(data)
+    #         self.ui.slider_value.setMinimum(min_)
+    #         self.ui.slider_value.setMaximum(max_)
+    #         self.ui.slider_value.setSingleStep((max_ - min_) / 250)
+    #         self.ui.slider_value.setValue((min_, max_))
+    #         self.ui.le_val_max.setText(str(np.round(max_, 3)))
+    #         self.ui.le_val_min.setText(str(np.round(min_, 3)))
+
+    # @Slot(bool)
+    # def create_overlay(self):
+    #     """
+    #     Creates HSV or JCh overlay with the specified channels from the combo boxes.  Will compute and then
+    #     display the overlay in napari.
+
+    #     Returns
+    #     -------
+
+    #     """
+
+    #     if (
+    #         self.ui.cb_hue.count() == 0
+    #         or self.ui.cb_saturation.count() == 0
+    #         or self.ui.cb_value == 0
+    #     ):
+    #         raise ValueError(
+    #             "Cannot create overlay until all 3 combo boxes are populated"
+    #         )
+
+    #     # Gather channel data
+    #     H = self.viewer.layers[
+    #         self.ui.cb_hue.itemText(self.ui.cb_hue.currentIndex())
+    #     ].data
+    #     S = self.viewer.layers[
+    #         self.ui.cb_saturation.itemText(
+    #             self.ui.cb_saturation.currentIndex()
+    #         )
+    #     ].data
+    #     V = self.viewer.layers[
+    #         self.ui.cb_value.itemText(self.ui.cb_value.currentIndex())
+    #     ].data
+
+    #     # TODO: this is a temp fix which handles on data with n-dimensions of 4, 3, or 2 which automatically
+    #     # chooses the first timepoint
+    #     if H.ndim > 2 or S.ndim > 2 or V.ndim > 2:
+    #         if H.ndim == 4:
+    #             # assumes this is a (T, Z, Y, X) array read from napari-ome-zarr
+    #             H = (
+    #                 H[0, self.display_slice]
+    #                 if not self.use_full_volume
+    #                 else H[0]
+    #             )
+    #         if S.ndim == 4:
+    #             S = (
+    #                 S[0, self.display_slice]
+    #                 if not self.use_full_volume
+    #                 else S[0]
+    #             )
+    #         if V.ndim == 4:
+    #             V = (
+    #                 V[0, self.display_slice]
+    #                 if not self.use_full_volume
+    #                 else V[0]
+    #             )
+
+    #         if H.ndim == 3:
+    #             # assumes this is a (Z, Y, X) array collected from acquisition module
+    #             H = H[self.display_slice] if not self.use_full_volume else H
+
+    #         if S.ndim == 3:
+    #             S = S[self.display_slice] if not self.use_full_volume else S
+
+    #         if S.ndim == 3:
+    #             S = S[self.display_slice] if not self.use_full_volume else S
+
+    #     mode = "2D" if not self.use_full_volume else "3D"
+
+    #     H_name = self.ui.cb_hue.itemText(self.ui.cb_hue.currentIndex())
+    #     H_scale = (
+    #         (np.min(H), np.max(H))
+    #         if "Orientation" not in H_name
+    #         else (0, np.pi)
+    #     )
+    #     S_scale = self.ui.slider_saturation.value()
+    #     V_scale = self.ui.slider_value.value()
+
+    #     hsv_image = generic_hsv_overlay(
+    #         H, S, V, H_scale, S_scale, V_scale, mode=mode
+    #     )
+
+    #     # Create overlay layer name
+    #     idx = 0
+    #     while f"HSV_Overlay_{idx}" in self.viewer.layers:
+    #         idx += 1
+
+    #     # add overlay image to napari
+    #     self.viewer.add_image(hsv_image, name=f"HSV_Overlay_{idx}", rgb=True)
 
     @Slot(tuple)
     def update_dims(self, dims):
@@ -3177,10 +2164,6 @@ def update_dims(self, dims):
         else:
             pass
 
-    def _reset_listening(self):
-        self.listening_reconstructor = None
-        self.listening_store = None
-
     def _open_file_dialog(self, default_path, type):
 
         return self._open_dialog("select a directory", str(default_path), type)
diff --git a/recOrder/plugin/qtdesigner/mplwidget.py b/recOrder/plugin/qtdesigner/mplwidget.py
deleted file mode 100644
index dbe70f6f..00000000
--- a/recOrder/plugin/qtdesigner/mplwidget.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Imports
-from qtpy import QtWidgets
-import matplotlib
-
-matplotlib.use("QT5Agg")
-from matplotlib.figure import Figure
-from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as Canvas
-
-matplotlib.use("QT5Agg")
-
-# Matplotlib canvas class to create figure
-class MplCanvas(Canvas):
-    def __init__(self):
-        self.fig = Figure()
-        self.ax = self.fig.add_subplot(111)
-        Canvas.__init__(self, self.fig)
-        Canvas.setSizePolicy(
-            self,
-            QtWidgets.QSizePolicy.Expanding,
-            QtWidgets.QSizePolicy.Expanding,
-        )
-        Canvas.updateGeometry(self)
-
-
-# Matplotlib widget
-class MplWidget(QtWidgets.QWidget):
-    def __init__(self, parent=None):
-        QtWidgets.QWidget.__init__(self, parent)  # Inherit from QWidget
-        self.canvas = MplCanvas()  # Create canvas object
-        self.vbl = QtWidgets.QVBoxLayout()  # Set box for plotting
-        self.vbl.addWidget(self.canvas)
-        self.setLayout(self.vbl)
diff --git a/recOrder/plugin/widget/__init__.py b/recOrder/plugin/widget/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/recOrder/plugin/widget/loading_widget.py b/recOrder/plugin/widget/loading_widget.py
deleted file mode 100644
index 0ca69ac7..00000000
--- a/recOrder/plugin/widget/loading_widget.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from qtpy.QtCore import Qt, QRect
-from qtpy.QtGui import QPalette, QPainter, QBrush, QColor, QPen
-from qtpy.QtWidgets import QWidget, QPushButton
-
-
-class Overlay(QWidget):
-    """
-    ADAPTED FROM AYDIN https://github.com/royerlab/aydin/blob/master/aydin/gui/_qt/custom_widgets/overlay.py
-    """
-
-    def __init__(self, parent=None):
-
-        # super().__init__(self, parent)
-        QWidget.__init__(self, parent)
-        palette = QPalette(self.palette())
-        palette.setColor(palette.Background, Qt.transparent)
-        self.setPalette(palette)
-
-    def paintEvent(self, event):
-        painter = QPainter()
-        painter.begin(self)
-
-        painter.setRenderHint(QPainter.Antialiasing)
-        # painter.fillRect(self.parent.ui.qb_reconstruct.rect(), QBrush(QColor(40, 45, 60, 197)))
-        # text_rect = QRect(self.width()//2, self.height()//2,
-        #                   self.width()//2, self.height()//3)
-        # text_pen = QPen()
-        # text_pen.setWidth(100)
-        # text_pen.setColor(QColor(0, 191, 255))
-        # painter.setPen(text_pen)
-        #
-        # text = "Reconstructing..."
-        # painter.drawText(self.width()//2,
-        #                  self.height()//2,
-        #                  "Reconstructing...")
-        # painter.drawText(text_rect,
-        #                  Qt.AlignVCenter,
-        #                  "Reconstructing...")
-
-        painter.setPen(QPen(Qt.NoPen))
-        for i in range(5):
-            if (self.counter / 5) % 5 >= i:
-                painter.setBrush(QBrush(QColor(0, 191, 255)))
-            else:
-                painter.setBrush(QBrush(QColor(197, 197, 197)))
-            painter.drawEllipse(
-                self.width() // 2 + 50 * i - 100, self.height() // 2, 20, 20
-            )
-
-        painter.end()
-
-    def showEvent(self, event):
-        self.timer = self.startTimer(100)
-        self.counter = 0
-
-    def timerEvent(self, event):
-        self.counter += 1
-        self.update()
-
-    def hideEvent(self, event):
-        self.killTimer(self.timer)
-        self.hide()
diff --git a/recOrder/plugin/widget/napari_plugin_entry_point.py b/recOrder/plugin/widget/napari_plugin_entry_point.py
deleted file mode 100644
index f7fdcbf7..00000000
--- a/recOrder/plugin/widget/napari_plugin_entry_point.py
+++ /dev/null
@@ -1,1 +0,0 @@
-from recOrder.plugin.widget.main_widget import MainWidget
diff --git a/recOrder/plugin/workers/__init__.py b/recOrder/plugin/workers/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/recOrder/plugin/workers/reconstruction_workers.py b/recOrder/plugin/workers/reconstruction_workers.py
deleted file mode 100644
index e6976bf6..00000000
--- a/recOrder/plugin/workers/reconstruction_workers.py
+++ /dev/null
@@ -1,101 +0,0 @@
-from qtpy.QtCore import Signal
-from recOrder.pipelines.pipeline_manager import PipelineManager
-from napari.qt.threading import WorkerBaseSignals, WorkerBase
-import time
-import os
-
-
-class ReconstructionSignals(WorkerBaseSignals):
-    """
-    Custom Signals class that includes napari native signals
-    """
-
-    dimension_emitter = Signal(tuple)
-    store_emitter = Signal(str)
-    aborted = Signal()
-
-
-class ReconstructionWorker(WorkerBase):
-    def __init__(self, calib_window, config):
-        super().__init__(SignalsClass=ReconstructionSignals)
-
-        self.calib_window = calib_window
-        self.config = config
-        self.manager = None
-
-    def _check_abort(self):
-        if self.abort_requested:
-            self.aborted.emit()
-            raise TimeoutError("Stop Requested")
-
-    def work(self):
-
-        self.manager = PipelineManager(
-            self.config, emitter=self.dimension_emitter
-        )
-
-        store_path = os.path.join(
-            self.manager.config.save_dir, self.manager.config.data_save_name
-        )
-        store_path = (
-            store_path + ".zarr"
-            if not store_path.endswith(".zarr")
-            else store_path
-        )
-        self.store_emitter.emit(store_path)
-
-        print(f"Beginning Reconstruction...")
-
-        for pt in sorted(self.manager.pt_set):
-            start_time = time.time()
-
-            self.manager.try_init_array(pt)
-
-            self._check_abort()
-
-            pt_data = self.manager.data.get_zarr(pt[0])[
-                pt[1]
-            ]  # (C, Z, Y, X) virtual
-
-            self._check_abort()
-
-            stokes = self.manager.pipeline.reconstruct_stokes_volume(pt_data)
-
-            self._check_abort()
-
-            birefringence = (
-                self.manager.pipeline.reconstruct_birefringence_volume(stokes)
-            )
-
-            self._check_abort()
-
-            # will return phase volumes
-            (
-                deconvolve2D,
-                deconvolve3D,
-            ) = self.manager.pipeline.deconvolve_volume(stokes)
-
-            self._check_abort()
-
-            self.manager.pipeline.write_data(
-                self.manager.indices_map[pt[0]],
-                pt[1],
-                pt_data,
-                stokes,
-                birefringence,
-                deconvolve2D,
-                deconvolve3D,
-            )
-
-            self._check_abort()
-
-            end_time = time.time()
-            print(
-                f"Finishing Reconstructing P = {pt[0]}, T = {pt[1]} ({(end_time - start_time) / 60:0.2f}) min"
-            )
-
-            existing_meta = self.manager.writer.store.attrs.asdict().copy()
-            existing_meta["Config"] = self.manager.config.yaml_dict
-            self.manager.writer.store.attrs.put(existing_meta)
-
-            self._check_abort()
diff --git a/recOrder/scripts/cli.py b/recOrder/scripts/cli.py
index 506dc5c2..4219b850 100644
--- a/recOrder/scripts/cli.py
+++ b/recOrder/scripts/cli.py
@@ -2,8 +2,6 @@
 import sys
 import os
 from recOrder.io.zarr_converter import ZarrConverter
-from recOrder.io.config_reader import ConfigReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
 
 # From https://stackoverflow.com/questions/50975203/display-help-if-incorrect-or-mission-option-in-click
 class ShowUsageOnMissingError(click.Command):
@@ -22,92 +20,20 @@ def __call__(self, *args, **kwargs):
                 sys.exit(exc.exit_code)
 
 
-@click.command(cls=ShowUsageOnMissingError)
+@click.command()
 @click.help_option("-h", "--help")
 def help():
     """\033[92mrecOrder: Computational Toolkit for Label-Free Imaging\033[0m
 
-    recOrder has two command-line interfaces:
-
-    \033[96mrecOrder.reconstruct \033[0m\n
-    Allows you to reconstruct data from a QLIPP or Phase from Brightfield pipelines.
-    Please see example config files in /examples/example_configs
-
-    \033[96mrecOrder.convert \033[0m\n
-    Converts Micromanager .tif files to ome-zarr data format
-
     To use recOrder\'s napari plugin, use \033[96mnapari -w recOrder-napari\033[0m
 
+    To convert MicroManager .tif files to ome-zarr data format use \033[96mrecOrder.convert\033[0m
+
     Thank you for using recOrder.
     """
     print(help.__doc__)
 
 
-@click.command(cls=ShowUsageOnMissingError)
-@click.help_option("-h", "--help")
-@click.option(
-    "--method",
-    required=False,
-    type=str,
-    help="mode of reconstruction: \
-                                                      QLIPP, IPS, UPTI",
-)
-@click.option(
-    "--mode",
-    required=False,
-    type=str,
-    help="mode of reconstruction: \
-                                                      2D, 3D, Stokes",
-)
-@click.option(
-    "--data_dir",
-    required=False,
-    type=click.Path(exists=True),
-    help="path to the data",
-)
-@click.option(
-    "--save_dir",
-    required=False,
-    type=click.Path(),
-    help="path to the save directory",
-)
-@click.option(
-    "--name", required=False, type=str, help="name to use for saving the data"
-)
-@click.option(
-    "--config",
-    required=True,
-    type=click.Path(exists=True),
-    help="path to config yml file",
-)
-@click.option(
-    "--overwrite",
-    required=False,
-    type=bool,
-    help="whether or not to overwrite any previous data under this name",
-)
-def reconstruct(
-    method, mode, data_dir, save_dir, name, config, overwrite=False
-):
-
-    if config:
-        if not os.path.exists(config):
-            raise ValueError("Specified config path does not exist")
-        else:
-            config = ConfigReader(
-                config, data_dir, save_dir, method, mode, name, immutable=False
-            )
-            config.save_yaml()
-    else:
-        config = ConfigReader(
-            None, data_dir, save_dir, method, mode, name, immutable=False
-        )
-        config.save_yaml()
-
-    manager = PipelineManager(config, overwrite)
-    manager.run()
-
-
 @click.command(cls=ShowUsageOnMissingError)
 @click.help_option("-h", "--help")
 @click.option(
@@ -120,7 +46,7 @@ def reconstruct(
     "--output",
     required=True,
     type=str,
-    help="full path to save the zarr store (../../Experiment.zarr",
+    help="full path to save the zarr store (../../Experiment.zarr)",
 )
 @click.option(
     "--data_type",
diff --git a/recOrder/scripts/launch_napari.py b/recOrder/scripts/launch_napari.py
index 40043651..49fd3f09 100644
--- a/recOrder/scripts/launch_napari.py
+++ b/recOrder/scripts/launch_napari.py
@@ -1,5 +1,5 @@
 import napari
-from recOrder.plugin.widget.main_widget import MainWidget
+from recOrder.plugin.main_widget import MainWidget
 
 
 def main():
diff --git a/recOrder/scripts/repeat-cal-acq-rec.py b/recOrder/scripts/repeat-cal-acq-rec.py
index 912f5679..40bfa700 100644
--- a/recOrder/scripts/repeat-cal-acq-rec.py
+++ b/recOrder/scripts/repeat-cal-acq-rec.py
@@ -4,7 +4,7 @@
 import time, random
 from contextlib import contextmanager
 from pycromanager import Core
-from recOrder.plugin.widget.main_widget import MainWidget
+from recOrder.plugin.main_widget import MainWidget
 
 SAVE_DIR = "."
 SWING = 0.05
diff --git a/recOrder/scripts/repeat-calibration.py b/recOrder/scripts/repeat-calibration.py
index a2a61283..ed8aae80 100644
--- a/recOrder/scripts/repeat-calibration.py
+++ b/recOrder/scripts/repeat-calibration.py
@@ -2,7 +2,7 @@
 
 import napari
 import time
-from recOrder.plugin.widget.main_widget import MainWidget
+from recOrder.plugin.main_widget import MainWidget
 
 SAVE_DIR = "./"
 SWINGS = [0.1, 0.03, 0.01, 0.005]
@@ -13,7 +13,7 @@ def main():
     viewer = napari.Viewer()
     recorder = MainWidget(viewer)
     viewer.window.add_dock_widget(recorder)
-    recorder.ui.qbutton_gui_mode.click()
+    recorder.ui.qbutton_connect_to_mm.click()
     recorder.calib_scheme = "5-State"
 
     for repeat in range(REPEATS):
diff --git a/setup.cfg b/setup.cfg
index 8d6762bc..e73e9683 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -69,11 +69,9 @@ dev =
 [options.entry_points]
 console_scripts =
 	recorder = recOrder.scripts.cli:help
-	recorder.reconstruct = recOrder.scripts.cli:reconstruct
 	recorder.convert = recOrder.scripts.cli:convert
 	recOrder = recOrder.scripts.cli:help
-	recOrder.reconstruct = recOrder.scripts.cli:reconstruct
 	recOrder.convert = recOrder.scripts.cli:convert
-
+	
 napari.manifest =
 	recOrder = recOrder:napari.yaml


Test patch:
diff --git a/recOrder/tests/config_reader_tests/test_config_reader.py b/recOrder/tests/config_reader_tests/test_config_reader.py
deleted file mode 100644
index 3e23b701..00000000
--- a/recOrder/tests/config_reader_tests/test_config_reader.py
+++ /dev/null
@@ -1,51 +0,0 @@
-from recOrder.io.config_reader import ConfigReader, DATASET, PROCESSING
-import os
-from os.path import dirname, abspath
-import yaml
-
-
-def test_config_reader(get_zarr_data_dir):
-
-    folder, zarr_data = get_zarr_data_dir
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/qlipp/config_qlipp_full_pytest.yml",
-    )
-
-    raw = yaml.full_load(open(path_to_config))
-    config = ConfigReader(path_to_config, data_dir=zarr_data, save_dir=folder)
-
-    avoid = [
-        "data_dir",
-        "save_dir",
-        "data_save_name",
-        "positions",
-        "timepoints",
-        "background_ROI",
-        "qlipp_birefringence_only",
-        "phase_denoiser_2D",
-        "Tik_reg_abs_2D",
-        "Tik_reg_ph_2D",
-        "rho_2D",
-        "itr_2D",
-        "TV_reg_abs_2D",
-        "TV_reg_ph_2D",
-        "brightfield_channel_index",
-        "reg",
-    ]
-
-    for key, value in DATASET.items():
-        if key not in avoid:
-            assert raw["dataset"][key] == getattr(config, key)
-
-    assert folder == config.save_dir
-    assert zarr_data == config.data_dir
-    assert [raw["dataset"]["positions"]] == config.positions
-    assert [raw["dataset"]["timepoints"]] == config.timepoints
-    assert config.background_ROI == None
-
-    for key, value in PROCESSING.items():
-        if key not in avoid:
-            assert raw["processing"][key] == getattr(config, key)
-
-    assert config.qlipp_birefringence_only == False
diff --git a/recOrder/tests/conftest.py b/recOrder/tests/conftest.py
index 9f8b3868..612917cf 100644
--- a/recOrder/tests/conftest.py
+++ b/recOrder/tests/conftest.py
@@ -1,8 +1,6 @@
 import pytest
 import shutil
 import os
-from recOrder.io.config_reader import ConfigReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
 from wget import download
 
 
@@ -76,65 +74,6 @@ def get_pycromanager_data_dir(setup_test_data):
     return test_data, pm_data
 
 
-@pytest.fixture()
-def init_phase_bf_pipeline_manager(get_bf_data_dir, setup_data_save_folder):
-    folder, bf_data = get_bf_data_dir
-    save_folder = setup_data_save_folder
-
-    file_path = os.path.dirname(__file__)
-    path_to_config = os.path.abspath(
-        os.path.join(
-            file_path, "./test_configs/phase/config_phase_full_pytest.yml"
-        )
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=bf_data, save_dir=save_folder
-    )
-    manager = PipelineManager(config)
-
-    return save_folder, config, manager
-
-
-@pytest.fixture()
-def init_qlipp_pipeline_manager(get_zarr_data_dir, setup_data_save_folder):
-    folder, zarr_data = get_zarr_data_dir
-    save_folder = setup_data_save_folder
-
-    file_path = os.path.dirname(__file__)
-    path_to_config = os.path.abspath(
-        os.path.join(
-            file_path, "./test_configs/qlipp/config_qlipp_full_pytest.yml"
-        )
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=zarr_data, save_dir=save_folder
-    )
-    manager = PipelineManager(config)
-
-    return save_folder, config, manager
-
-
-@pytest.fixture()
-def init_qlipp_tiff_pipeline_manager(
-    get_ometiff_data_dir, setup_data_save_folder
-):
-    folder, ometiff_data = get_ometiff_data_dir
-    save_folder = setup_data_save_folder
-
-    file_path = os.path.dirname(__file__)
-    path_to_config = os.path.abspath(
-        os.path.join(
-            file_path, "./test_configs/qlipp/config_qlipp_full_pytest_tiff.yml"
-        )
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=ometiff_data, save_dir=save_folder
-    )
-    manager = PipelineManager(config)
-
-    return save_folder, config, manager
-
-
 # create /pytest_temp/data_save folder for each test then delete when test is done
 @pytest.fixture(scope="function")
 def setup_data_save_folder():
diff --git a/recOrder/tests/mmcore_tests/test_core_func.py b/recOrder/tests/mmcore_tests/test_core_func.py
index 63f64dc3..34e0fca0 100644
--- a/recOrder/tests/mmcore_tests/test_core_func.py
+++ b/recOrder/tests/mmcore_tests/test_core_func.py
@@ -109,16 +109,6 @@ def _get_examples(low: float, high: float):
     return valid_values, invalid_values
 
 
-def test_snap_image():
-    """Test `recOrder.io.core_functions.snap_image`."""
-    mmc = _get_mmcore_mock()
-    image = snap_image(mmc)
-    mmc.snapImage.assert_called_once()
-    mmc.getImage.assert_called_once()
-    assert _is_int(image), image.dtype
-    assert image.shape == (PIXEL_COUNT,), image.shape
-
-
 def test_suspend_live_sm():
     """Test `recOrder.io.core_functions.suspend_live_sm`."""
     snap_manager = _get_snap_manager_mock()
diff --git a/recOrder/tests/pipeline_tests/test_old_processing.py b/recOrder/tests/pipeline_tests/test_old_processing.py
deleted file mode 100644
index 53040c93..00000000
--- a/recOrder/tests/pipeline_tests/test_old_processing.py
+++ /dev/null
@@ -1,65 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
-from recOrder.compute.qlipp_compute import (
-    reconstruct_qlipp_stokes,
-    reconstruct_qlipp_birefringence,
-)
-from os.path import dirname, abspath
-import numpy as np
-import os
-import zarr
-
-
-def test_old_processing(get_ometiff_data_dir, setup_data_save_folder):
-
-    folder, ometiff_data = get_ometiff_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/config_old_processing_pytest.yml",
-    )
-
-    config = ConfigReader(
-        path_to_config, data_dir=ometiff_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-
-    manager.run()
-
-    pos, t, z = 1, 0, 8
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    stokes = reconstruct_qlipp_stokes(
-        data[t], recon, manager.pipeline.bg_stokes
-    )
-    params = [["S0", 0.5, 1], ["S1", 0.5, 1], ["S2", 0.5, 1], ["S3", 0.5, 1]]
-
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_1.zarr"), "r"
-    )
-    array = store["Row_0"]["Col_0"]["Pos_001"]["arr_0"]
-
-    # Check Stokes
-    assert (
-        np.sum(np.abs(stokes[0, z, :, :] - array[0, 0, z]) ** 2)
-        / np.sum(np.abs(stokes[0, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[1, z, :, :] - array[0, 1, z]) ** 2)
-        / np.sum(np.abs(stokes[1, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[2, z, :, :] - array[0, 2, z]) ** 2)
-        / np.sum(np.abs(stokes[2, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[3, z, :, :] - array[0, 3, z]) ** 2)
-        / np.sum(np.abs(stokes[3, z, :, :])) ** 2
-        < 0.1
-    )
diff --git a/recOrder/tests/pipeline_tests/test_phase_from_bf_pipeline.py b/recOrder/tests/pipeline_tests/test_phase_from_bf_pipeline.py
deleted file mode 100644
index 21ee9ef4..00000000
--- a/recOrder/tests/pipeline_tests/test_phase_from_bf_pipeline.py
+++ /dev/null
@@ -1,173 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
-from recOrder.pipelines.phase_from_bf_pipeline import PhaseFromBF
-from waveorder.io.writer import WaveorderWriter
-from recOrder.compute.qlipp_compute import (
-    reconstruct_phase3D,
-    reconstruct_phase2D,
-)
-from os.path import dirname, abspath
-import numpy as np
-import os
-import zarr
-
-
-def test_pipeline_manager_initiate(init_phase_bf_pipeline_manager):
-
-    save_folder, config, manager = init_phase_bf_pipeline_manager
-
-    assert manager.config is not None
-    assert manager.data is not None
-    assert manager.data.get_num_positions() * manager.data.frames == len(
-        manager.pt_set
-    )
-    assert manager.pipeline is not None
-    assert isinstance(manager.pipeline, PhaseFromBF)
-
-
-def test_bf_pipeline_initiate(init_phase_bf_pipeline_manager):
-
-    save_folder, config, manager = init_phase_bf_pipeline_manager
-
-    pipeline = manager.pipeline
-    assert pipeline.config == manager.config
-    assert pipeline.data == manager.data
-    assert pipeline.t == manager.num_t
-    assert pipeline.mode == "3D"
-    assert pipeline.slices == manager.data.slices
-    assert pipeline.img_dim == (
-        manager.data.height,
-        manager.data.width,
-        manager.data.slices,
-    )
-    assert pipeline.bf_chan_idx == 0
-    assert pipeline.data_shape == (
-        manager.data.frames,
-        manager.data.channels,
-        manager.data.slices,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert pipeline.chunk_size == (
-        1,
-        1,
-        1,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert isinstance(pipeline.writer, WaveorderWriter)
-    assert pipeline.reconstructor is not None
-
-
-def test_pipeline_manager_run(init_phase_bf_pipeline_manager):
-
-    save_folder, config, manager = init_phase_bf_pipeline_manager
-    manager.run()
-
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_BF_1.zarr")
-    )
-    array = store["Row_0"]["Col_0"]["Pos_000"]["arr_0"]
-
-    assert store.attrs.asdict()["Config"] == config.yaml_dict
-    assert store["Row_0"]["Col_0"]["Pos_000"]
-    assert store["Row_0"]["Col_1"]["Pos_001"]
-    assert store["Row_0"]["Col_2"]["Pos_002"]
-    assert array.shape == (2, 1, 16, manager.data.height, manager.data.width)
-
-
-def test_3D_reconstruction(get_bf_data_dir, setup_data_save_folder):
-
-    folder, bf_data = get_bf_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/phase/config_phase_3D_pytest.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=bf_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "3D"
-    manager.run()
-
-    pos, t, z = 1, 0, 8
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    phase3D = reconstruct_phase3D(
-        data[t, 0],
-        recon,
-        method=config.phase_denoiser_3D,
-        reg_re=config.Tik_reg_ph_3D,
-        rho=config.rho_3D,
-        lambda_re=config.TV_reg_ph_3D,
-        itr=config.itr_3D,
-    )
-
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_BF_1.zarr"),
-        "r",
-    )
-    # This may be bug, should be store['Row_0']['Col_1']['Pos_001']['arr_0']
-    array = store["Row_0"]["Col_0"]["Pos_001"]["arr_0"]
-
-    # Check Shape
-    assert array.shape == (1, len(config.output_channels), 16, 128, 256)
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase3D[z] - array[0, 0, z]) ** 2)
-        / np.sum(np.abs(phase3D[z]) ** 2)
-        < 0.1
-    )
-
-
-def test_2D_reconstruction(get_bf_data_dir, setup_data_save_folder):
-
-    folder, bf_data = get_bf_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/phase/config_phase_2D_pytest.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=bf_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "2D"
-    manager.run()
-
-    pos, t, z = 1, 0, manager.pipeline.focus_slice
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    phase2D = reconstruct_phase2D(
-        data[t, 0],
-        recon,
-        method=config.phase_denoiser_2D,
-        reg_p=config.Tik_reg_ph_2D,
-        rho=config.rho_2D,
-        lambda_p=config.TV_reg_ph_2D,
-        itr=config.itr_2D,
-    )
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_BF_1.zarr"),
-        "r",
-    )
-    # This may be bug, should be store['Row_0']['Col_1']['Pos_001']['arr_0']
-    array = store["Row_0"]["Col_0"]["Pos_001"]["arr_0"]
-
-    # Check Shapes
-    assert array.shape == (1, len(config.output_channels), 1, 128, 256)
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase2D - array[0, 0, 0]) ** 2)
-        / np.sum(np.abs(phase2D) ** 2)
-        < 0.1
-    )
diff --git a/recOrder/tests/pipeline_tests/test_qlipp_pipeline.py b/recOrder/tests/pipeline_tests/test_qlipp_pipeline.py
deleted file mode 100644
index e4d579d7..00000000
--- a/recOrder/tests/pipeline_tests/test_qlipp_pipeline.py
+++ /dev/null
@@ -1,325 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from recOrder.io import MetadataReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
-from recOrder.pipelines.qlipp_pipeline import QLIPP
-from waveorder.io.writer import WaveorderWriter
-from recOrder.compute.qlipp_compute import (
-    reconstruct_qlipp_stokes,
-    reconstruct_qlipp_birefringence,
-    reconstruct_phase3D,
-    reconstruct_phase2D,
-)
-from os.path import dirname, abspath
-import numpy as np
-import os
-import subprocess
-import zarr
-
-
-def test_cli_config(setup_test_data, setup_data_save_folder):
-    file_path = os.path.dirname(os.path.dirname(__file__))
-    path_to_config = os.path.abspath(
-        os.path.join(
-            file_path, "./test_configs/qlipp/config_qlipp_full_pytest.yml"
-        )
-    )
-    zarr_data = os.path.join(
-        setup_test_data,
-        "2022_08_04_recOrder_pytest_20x_04NA_zarr",
-        "2T_3P_16Z_128Y_256X_Kazansky.zarr",
-    )
-
-    cmd_string = " ".join(
-        [
-            "recOrder.reconstruct",
-            "--config",
-            path_to_config,
-            "--data_dir",
-            zarr_data,
-            "--save_dir",
-            setup_data_save_folder,
-        ]
-    )
-
-    result = subprocess.run(cmd_string, shell=True)
-    assert result.returncode == 0
-
-
-def test_pipeline_manager_initiate(init_qlipp_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_pipeline_manager
-
-    assert manager.config is not None
-    assert manager.data is not None
-
-    # check to make sure position mapping is correct
-    list_p = []
-    for i in manager.pt_set:
-        if i[0] not in list_p:
-            list_p.append(i[0])
-    list_p.sort()
-    for idx, p in enumerate(list_p):
-        assert manager.indices_map[p] == idx
-
-    assert manager.data.get_num_positions() * manager.data.frames == len(
-        manager.pt_set
-    )
-    assert manager.pipeline is not None
-    assert isinstance(manager.pipeline, QLIPP)
-
-
-def test_qlipp_pipeline_initiate(init_qlipp_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_pipeline_manager
-
-    pipeline = manager.pipeline
-    assert pipeline.config == manager.config
-    assert pipeline.data == manager.data
-    assert pipeline.t == manager.num_t
-    assert isinstance(pipeline.writer, WaveorderWriter)
-    assert pipeline.mode == "3D"
-    assert pipeline.no_birefringence == False
-    assert pipeline.slices == manager.data.slices
-    assert pipeline.img_dim == (
-        manager.data.height,
-        manager.data.width,
-        manager.data.slices,
-    )
-    assert pipeline.chan_names == manager.data.channel_names
-    assert isinstance(pipeline.calib_meta, MetadataReader)
-    assert pipeline.bg_path == manager.config.background
-
-    assert pipeline.s0_idx == 0
-    assert pipeline.s1_idx == 1
-    assert pipeline.s2_idx == 2
-    assert pipeline.s3_idx == 3
-    assert pipeline.data_shape == (
-        manager.data.frames,
-        manager.data.channels,
-        manager.data.slices,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert pipeline.chunk_size == (
-        1,
-        1,
-        1,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert isinstance(pipeline.writer, WaveorderWriter)
-    assert pipeline.reconstructor is not None
-    assert pipeline.bg_stokes is not None
-
-
-def test_pipeline_manager_run(init_qlipp_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_pipeline_manager
-    manager.run()
-
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky.zarr")
-    )
-    array = store["Row_0"]["Col_0"]["Pos_000"]["arr_0"]
-
-    assert store.attrs.asdict()["Config"] == config.yaml_dict
-    assert store["Row_0"]["Col_0"]["Pos_000"]
-    assert store["Row_0"]["Col_1"]["Pos_001"]
-    assert store["Row_0"]["Col_2"]["Pos_002"]
-    assert array.shape == (2, 4, 16, manager.data.height, manager.data.width)
-
-
-def test_3D_reconstruction(get_zarr_data_dir, setup_data_save_folder):
-
-    folder, zarr_data = get_zarr_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/qlipp/config_qlipp_full_recon_pytest.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=zarr_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "3D"
-    manager.run()
-
-    pos, t, z = 1, 0, 8
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    stokes = reconstruct_qlipp_stokes(
-        data[t], recon, manager.pipeline.bg_stokes
-    )
-    birefringence = reconstruct_qlipp_birefringence(stokes, recon)
-    phase3D = reconstruct_phase3D(
-        stokes[0],
-        recon,
-        method=config.phase_denoiser_3D,
-        reg_re=config.Tik_reg_ph_3D,
-        rho=config.rho_3D,
-        lambda_re=config.TV_reg_ph_3D,
-        itr=config.itr_3D,
-    )
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky.zarr")
-    )
-    array = store["Row_0"]["Col_1"]["Pos_001"]["arr_0"]
-
-    # Check Shape
-    assert array.shape == (1, len(config.output_channels), 16, 128, 256)
-
-    # Check Stokes
-    assert (
-        np.sum(np.abs(stokes[0, z, :, :] - array[0, 4, z]) ** 2)
-        / np.sum(np.abs(stokes[0, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[1, z, :, :] - array[0, 5, z]) ** 2)
-        / np.sum(np.abs(stokes[1, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[2, z, :, :] - array[0, 6, z]) ** 2)
-        / np.sum(np.abs(stokes[2, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[3, z, :, :] - array[0, 7, z]) ** 2)
-        / np.sum(np.abs(stokes[3, z, :, :]) ** 2)
-        < 0.1
-    )
-
-    # Check Birefringence
-    assert (
-        np.sum(
-            np.abs(
-                (birefringence[0, z] / (2 * np.pi) * config.wavelength)
-                - array[0, 0, z]
-            )
-            ** 2
-        )
-        / np.sum(
-            np.abs(birefringence[0, z] / (2 * np.pi) * config.wavelength) ** 2
-        )
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[1, z] - array[0, 1, z]) ** 2)
-        / np.sum(np.abs(birefringence[1, z]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[2, z] - array[0, 2, z]) ** 2)
-        / np.sum(np.abs(birefringence[2, z]) ** 2)
-        < 0.1
-    )
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase3D[z] - array[0, 3, z]) ** 2)
-        / np.sum(np.abs(phase3D[z]) ** 2)
-        < 0.1
-    )
-
-
-def test_2D_reconstruction(get_zarr_data_dir, setup_data_save_folder):
-
-    folder, zarr_data = get_zarr_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/qlipp/config_qlipp_2D_pytest.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=zarr_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "2D"
-    manager.run()
-
-    pos, t, z = 1, 0, manager.pipeline.focus_slice
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    stokes = reconstruct_qlipp_stokes(
-        data[t], recon, manager.pipeline.bg_stokes
-    )
-    birefringence = reconstruct_qlipp_birefringence(stokes[:, z, :, :], recon)
-    phase2D = reconstruct_phase2D(
-        stokes[0],
-        recon,
-        method=config.phase_denoiser_2D,
-        reg_p=config.Tik_reg_ph_2D,
-        rho=config.rho_2D,
-        lambda_p=config.TV_reg_ph_2D,
-        itr=config.itr_2D,
-    )
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky.zarr")
-    )
-    array = store["Row_0"]["Col_1"]["Pos_001"]["arr_0"]
-
-    # Check Shapes
-    assert array.shape == (1, len(config.output_channels), 1, 128, 256)
-
-    # Check Stokes
-    assert (
-        np.sum(np.abs(stokes[0, z, :, :] - array[0, 4, 0]) ** 2)
-        / np.sum(np.abs(stokes[0, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[1, z, :, :] - array[0, 5, 0]) ** 2)
-        / np.sum(np.abs(stokes[1, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[2, z, :, :] - array[0, 6, 0]) ** 2)
-        / np.sum(np.abs(stokes[2, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[3, z, :, :] - array[0, 7, 0]) ** 2)
-        / np.sum(np.abs(stokes[3, z, :, :])) ** 2
-        < 0.1
-    )
-
-    # Check Birefringence
-
-    assert (
-        np.sum(
-            np.abs(
-                (birefringence[0] / (2 * np.pi) * config.wavelength)
-                - array[0, 0, 0]
-            )
-            ** 2
-        )
-        / np.sum(
-            np.abs(birefringence[0] / (2 * np.pi) * config.wavelength) ** 2
-        )
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[1] - array[0, 1, 0]) ** 2)
-        / np.sum(np.abs(birefringence[1]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[2] - array[0, 2, 0]) ** 2)
-        / np.sum(np.abs(birefringence[2]) ** 2)
-        < 0.1
-    )
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase2D - array[0, 3, 0]) ** 2)
-        / np.sum(np.abs(phase2D) ** 2)
-        < 0.1
-    )
-    # TODO: Add tests/test data for 5 state reconstruction?
diff --git a/recOrder/tests/pipeline_tests/test_qlipp_pipeline_tiff.py b/recOrder/tests/pipeline_tests/test_qlipp_pipeline_tiff.py
deleted file mode 100644
index a2ea898f..00000000
--- a/recOrder/tests/pipeline_tests/test_qlipp_pipeline_tiff.py
+++ /dev/null
@@ -1,294 +0,0 @@
-from recOrder.io.config_reader import ConfigReader
-from recOrder.io import MetadataReader
-from recOrder.pipelines.pipeline_manager import PipelineManager
-from recOrder.pipelines.qlipp_pipeline import QLIPP
-from waveorder.io.writer import WaveorderWriter
-from recOrder.compute.qlipp_compute import (
-    reconstruct_qlipp_stokes,
-    reconstruct_qlipp_birefringence,
-    reconstruct_phase3D,
-    reconstruct_phase2D,
-)
-from os.path import dirname, abspath
-import numpy as np
-import os
-import zarr
-
-
-def test_pipeline_manager_initiate(init_qlipp_tiff_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_tiff_pipeline_manager
-
-    assert manager.config is not None
-    assert manager.data is not None
-
-    # check to make sure position mapping is correct
-    list_p = []
-    for i in manager.pt_set:
-        if i[0] not in list_p:
-            list_p.append(i[0])
-    list_p.sort()
-    for idx, p in enumerate(list_p):
-        assert manager.indices_map[p] == idx
-
-    assert manager.data.get_num_positions() * manager.data.frames == len(
-        manager.pt_set
-    )
-    assert manager.pipeline is not None
-    assert isinstance(manager.pipeline, QLIPP)
-
-
-def test_qlipp_pipeline_initiate(init_qlipp_tiff_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_tiff_pipeline_manager
-
-    pipeline = manager.pipeline
-    assert pipeline.config == manager.config
-    assert pipeline.data == manager.data
-    assert pipeline.t == manager.num_t
-    assert isinstance(pipeline.writer, WaveorderWriter)
-    assert pipeline.mode == "3D"
-    assert pipeline.no_birefringence == False
-    assert pipeline.slices == manager.data.slices
-    assert pipeline.img_dim == (
-        manager.data.height,
-        manager.data.width,
-        manager.data.slices,
-    )
-    assert pipeline.chan_names == manager.data.channel_names
-    assert isinstance(pipeline.calib_meta, MetadataReader)
-    assert pipeline.bg_path == manager.config.background
-
-    assert pipeline.s0_idx == 0
-    assert pipeline.s1_idx == 1
-    assert pipeline.s2_idx == 2
-    assert pipeline.s3_idx == 3
-    assert pipeline.data_shape == (
-        manager.data.frames,
-        manager.data.channels,
-        manager.data.slices,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert pipeline.chunk_size == (
-        1,
-        1,
-        1,
-        manager.data.height,
-        manager.data.width,
-    )
-    assert isinstance(pipeline.writer, WaveorderWriter)
-    assert pipeline.reconstructor is not None
-    assert pipeline.bg_stokes is not None
-
-
-def test_pipeline_manager_run(init_qlipp_tiff_pipeline_manager):
-
-    save_folder, config, manager = init_qlipp_tiff_pipeline_manager
-    manager.run()
-
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_1.zarr"), "r"
-    )
-    array = store["Row_0"]["Col_0"]["Pos_000"]["arr_0"]
-
-    assert store.attrs.asdict()["Config"] == config.yaml_dict
-    assert store["Row_0"]["Col_0"]["Pos_000"]
-    assert store["Row_0"]["Col_1"]["Pos_001"]
-    assert store["Row_0"]["Col_2"]["Pos_002"]
-    assert array.shape == (2, 4, 16, manager.data.height, manager.data.width)
-
-
-def test_3D_reconstruction(get_ometiff_data_dir, setup_data_save_folder):
-
-    folder, ometiff_data = get_ometiff_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/qlipp/config_qlipp_full_recon_pytest_tiff.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=ometiff_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "3D"
-    manager.run()
-
-    pos, t, z = 1, 0, 8
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    stokes = reconstruct_qlipp_stokes(
-        data[t], recon, manager.pipeline.bg_stokes
-    )
-    birefringence = reconstruct_qlipp_birefringence(stokes, recon)
-    phase3D = reconstruct_phase3D(
-        stokes[0],
-        recon,
-        method=config.phase_denoiser_3D,
-        reg_re=config.Tik_reg_ph_3D,
-        rho=config.rho_3D,
-        lambda_re=config.TV_reg_ph_3D,
-        itr=config.itr_3D,
-    )
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_1.zarr"), "r"
-    )
-    array = store["Row_0"]["Col_0"]["Pos_001"]["arr_0"]
-
-    # Check Shape
-    assert array.shape == (1, len(config.output_channels), 16, 128, 256)
-
-    # Check Stokes
-    assert (
-        np.sum(np.abs(stokes[0, z, :, :] - array[0, 4, z]) ** 2)
-        / np.sum(np.abs(stokes[0, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[1, z, :, :] - array[0, 5, z]) ** 2)
-        / np.sum(np.abs(stokes[1, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[2, z, :, :] - array[0, 6, z]) ** 2)
-        / np.sum(np.abs(stokes[2, z, :, :]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[3, z, :, :] - array[0, 7, z]) ** 2)
-        / np.sum(np.abs(stokes[3, z, :, :]) ** 2)
-        < 0.1
-    )
-
-    # Check Birefringence
-    assert (
-        np.sum(
-            np.abs(
-                (birefringence[0, z] / (2 * np.pi) * config.wavelength)
-                - array[0, 0, z]
-            )
-            ** 2
-        )
-        / np.sum(
-            np.abs(birefringence[0, z] / (2 * np.pi) * config.wavelength) ** 2
-        )
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[1, z] - array[0, 1, z]) ** 2)
-        / np.sum(np.abs(birefringence[1, z]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[2, z] - array[0, 2, z]) ** 2)
-        / np.sum(np.abs(birefringence[2, z]) ** 2)
-        < 0.1
-    )
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase3D[z] - array[0, 3, z]) ** 2)
-        / np.sum(np.abs(phase3D[z]) ** 2)
-        < 0.1
-    )
-
-
-def test_2D_reconstruction(get_ometiff_data_dir, setup_data_save_folder):
-
-    folder, ometiff_data = get_ometiff_data_dir
-    save_folder = setup_data_save_folder
-
-    path_to_config = os.path.join(
-        dirname(dirname(abspath(__file__))),
-        "test_configs/qlipp/config_qlipp_2D_pytest_tiff.yml",
-    )
-    config = ConfigReader(
-        path_to_config, data_dir=ometiff_data, save_dir=save_folder
-    )
-
-    manager = PipelineManager(config)
-    assert manager.pipeline.mode == "2D"
-    manager.run()
-
-    pos, t, z = 1, 0, manager.pipeline.focus_slice
-    data = manager.data.get_array(pos)
-    recon = manager.pipeline.reconstructor
-
-    stokes = reconstruct_qlipp_stokes(
-        data[t], recon, manager.pipeline.bg_stokes
-    )
-    birefringence = reconstruct_qlipp_birefringence(stokes[:, z, :, :], recon)
-    phase2D = reconstruct_phase2D(
-        stokes[0],
-        recon,
-        method=config.phase_denoiser_2D,
-        reg_p=config.Tik_reg_ph_2D,
-        rho=config.rho_2D,
-        lambda_p=config.TV_reg_ph_2D,
-        itr=config.itr_2D,
-    )
-    store = zarr.open(
-        os.path.join(save_folder, "2T_3P_16Z_128Y_256X_Kazansky_1.zarr"), "r"
-    )
-    array = store["Row_0"]["Col_0"]["Pos_001"]["arr_0"]
-
-    # Check Shapes
-    assert array.shape == (1, len(config.output_channels), 1, 128, 256)
-
-    # Check Stokes
-    assert (
-        np.sum(np.abs(stokes[0, z, :, :] - array[0, 4, 0]) ** 2)
-        / np.sum(np.abs(stokes[0, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[1, z, :, :] - array[0, 5, 0]) ** 2)
-        / np.sum(np.abs(stokes[1, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[2, z, :, :] - array[0, 6, 0]) ** 2)
-        / np.sum(np.abs(stokes[2, z, :, :])) ** 2
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(stokes[3, z, :, :] - array[0, 7, 0]) ** 2)
-        / np.sum(np.abs(stokes[3, z, :, :])) ** 2
-        < 0.1
-    )
-
-    # Check Birefringence
-
-    assert (
-        np.sum(
-            np.abs(
-                (birefringence[0] / (2 * np.pi) * config.wavelength)
-                - array[0, 0, 0]
-            )
-            ** 2
-        )
-        / np.sum(
-            np.abs(birefringence[0] / (2 * np.pi) * config.wavelength) ** 2
-        )
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[1] - array[0, 1, 0]) ** 2)
-        / np.sum(np.abs(birefringence[1]) ** 2)
-        < 0.1
-    )
-    assert (
-        np.sum(np.abs(birefringence[2] - array[0, 2, 0]) ** 2)
-        / np.sum(np.abs(birefringence[2]) ** 2)
-        < 0.1
-    )
-
-    # Check Phase
-    assert (
-        np.sum(np.abs(phase2D - array[0, 3, 0]) ** 2)
-        / np.sum(np.abs(phase2D) ** 2)
-        < 0.1
-    )
diff --git a/recOrder/tests/reader_tests/test_reader.py b/recOrder/tests/reader_tests/test_reader.py
deleted file mode 100644
index c78d3ad0..00000000
--- a/recOrder/tests/reader_tests/test_reader.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from recOrder.io._reader import (
-    napari_get_reader,
-    ome_zarr_reader,
-    ome_tif_reader,
-)
-import os
-from os.path import dirname, abspath
-import yaml
-
-
-def test_napari_get_reader(get_ometiff_data_dir, get_zarr_data_dir):
-
-    _, ometiff_data = get_ometiff_data_dir
-    _, zarr_data = get_zarr_data_dir
-    assert napari_get_reader(ometiff_data).__name__ == "ome_tif_reader"
-    assert napari_get_reader(zarr_data).__name__ == "ome_zarr_reader"
-
-
-def test_readers(get_ometiff_data_dir, get_zarr_data_dir):
-
-    _, ometiff_data = get_ometiff_data_dir
-    _, zarr_data = get_zarr_data_dir
-
-    data_from_ome = ome_tif_reader(ometiff_data)
-    data_from_zarr = ome_zarr_reader(zarr_data)
-
-    for data in [data_from_ome, data_from_zarr]:
-        assert len(data) == 3
-        assert data[0][0].shape == (2, 4, 16, 128, 256)
diff --git a/recOrder/tests/test_configs/config_cli_pytest.yml b/recOrder/tests/test_configs/config_cli_pytest.yml
deleted file mode 100644
index 1c903f11..00000000
--- a/recOrder/tests/test_configs/config_cli_pytest.yml
+++ /dev/null
@@ -1,119 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_dir: '/gpfs/CompMicro/rawdata/hummingbird/Cameron/2021_05_10_NewKazansky_63x_WI_04NA/NewKaz_2T_3P_65Z_2048_2048_1'
-  # (str) The path of the folder that holds raw data
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  save_dir: '/gpfs/CompMicro/projects/microscope_dev/recOrder_Testing'
-  # (str) The path of the parent folder where the output will be saved
-
-  positions: 'all'
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: 'all'
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: '/gpfs/CompMicro/rawdata/hummingbird/Cameron/2021_05_10_NewKazansky_63x_WI_04NA/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: '/gpfs/CompMicro/rawdata/hummingbird/Cameron/2021_05_10_NewKazansky_63x_WI_04NA/metadata.txt'
-
-pre_processing:
-  denoise:
-    use: False
-    channels: ['S0', 'S1', 'S2', 'S3'] # Choose which channels to denoise: S0, S1, S2, S3 or BF
-    threshold: [0.1, 0.1, 0.1, 0.1]
-    level: [1, 1, 1, 1]
-
-
-processing:
-  output_channels: ['Retardance', 'Orientation','Brightfield', 'Phase3D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 63
-  # (float) Magnification of the objective
-
-  NA_objective: 1.2
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.33
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 0.25
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 22
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/config_old_processing_pytest.yml b/recOrder/tests/test_configs/config_old_processing_pytest.yml
deleted file mode 100644
index 184488a9..00000000
--- a/recOrder/tests/test_configs/config_old_processing_pytest.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/calibration_metadata.txt'
-
-processing:
-  output_channels: ['S0', 'S1', 'S2', 'S3','Retardance']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 63
-  # (float) Magnification of the objective
-
-  NA_objective: 1.2
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.33
-  # (float) Refractive index of the objective immersion oil
diff --git a/recOrder/tests/test_configs/phase/config_phase_2D_pytest.yml b/recOrder/tests/test_configs/phase/config_phase_2D_pytest.yml
deleted file mode 100644
index 35de9dc8..00000000
--- a/recOrder/tests/test_configs/phase/config_phase_2D_pytest.yml
+++ /dev/null
@@ -1,82 +0,0 @@
-dataset:
-  method: 'PhaseFromBF'
-
-  mode: '2D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-processing:
-  output_channels: ['Phase2D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-
-  #brightfield_channel_idx: 0
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 2
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/phase/config_phase_3D_pytest.yml b/recOrder/tests/test_configs/phase/config_phase_3D_pytest.yml
deleted file mode 100644
index 30d355f1..00000000
--- a/recOrder/tests/test_configs/phase/config_phase_3D_pytest.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-dataset:
-  method: 'PhaseFromBF'
-
-  mode: '3D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-processing:
-  output_channels: ['Phase3D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-  
-  #brightfield_channel_idx: 0
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 2
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/phase/config_phase_full_pytest.yml b/recOrder/tests/test_configs/phase/config_phase_full_pytest.yml
deleted file mode 100644
index aaeed285..00000000
--- a/recOrder/tests/test_configs/phase/config_phase_full_pytest.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-dataset:
-  method: 'PhaseFromBF'
-
-  mode: '3D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: 'all'
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: 'all'
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-processing:
-  output_channels: ['Phase3D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  #brightfield_channel_idx: 0
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 2
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest.yml
deleted file mode 100644
index f278edcb..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '2D'
-
-  data_type: 'zarr'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase2D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest_tiff.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest_tiff.yml
deleted file mode 100644
index 0ad5d76a..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_2D_pytest_tiff.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '2D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase2D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest.yml
deleted file mode 100644
index 9b8d4e61..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest.yml
+++ /dev/null
@@ -1,105 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_type: 'zarr'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: 'all'
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: 'all'
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation','Brightfield', 'Phase3D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 2
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest_tiff.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest_tiff.yml
deleted file mode 100644
index d2865c2f..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_full_pytest_tiff.yml
+++ /dev/null
@@ -1,105 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: 'all'
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: 'all'
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation','Brightfield', 'Phase3D']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1
-  # (float) Refractive index of the objective immersion oil
-
-  z_step: 2
-  # (int) Step size of the z-dimension in um
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest.yml
deleted file mode 100644
index c626ff8b..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_type: 'zarr'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA_zarr/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase3D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
diff --git a/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest_tiff.yml b/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest_tiff.yml
deleted file mode 100644
index e9fbc5b1..00000000
--- a/recOrder/tests/test_configs/qlipp/config_qlipp_full_recon_pytest_tiff.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-dataset:
-  method: 'QLIPP'
-
-  mode: '3D'
-
-  data_type: 'ometiff'
-  # (str) the datatype of the raw data. One of 'ometiff', 'singlepagetiff', or 'zarr'
-
-  positions: [1]
-  # (str or list) Positions within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  timepoints: [0]
-  # (str or list) timepoints within the dataset that are to be analyzed.
-  ##   'all'
-  ##   !!python/tuple [0, N] for pos 0 through N
-  ## [0, 1, 5] for pos 0, 1, and 5
-
-  background: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/BG'
-
-  #(str or list) Background folder(s) within the experiment folder
-  ##   a list, e.g. ['/path/to/bg_1', '/path/to/bg_2'], of one background dataset per sample
-
-  calibration_metadata: './pytest_temp/test_data/2022_08_04_recOrder_pytest_20x_04NA/calibration_metadata.txt'
-
-processing:
-  output_channels: ['Retardance', 'Orientation', 'Brightfield', 'Phase3D', 'S0', 'S1', 'S2', 'S3']
-
-  # (list) Any combination of the following values.
-  #    'Retardance', 'Orientation','Brightfield', 'Phase3D'
-  #     order of the channels specifies the order in which they will be written
-
-  background_correction: 'local_fit'
-  # (str) Background correction method, one of the following
-  ##   'None': no background correction will be performed
-  ##   'local': for estimating background with scipy uniform filter
-  ##   'local_fit': for estimating background with polynomial fit
-  ##   'global': for normal background subtraction with the provided background
-
-  use_gpu: False
-  # (bool) Option to use GPU processing if True (require cupy to be installed)
-
-  gpu_id: 0
-  # (int) ID of GPU to be used
-
-  ########################################
-  #    PHASE RECONSTRUCTION PARAMETERS   #
-  ########################################
-
-  wavelength: 532
-  # (int) wavelength of the illumination in nm
-
-  pixel_size: 6.5
-  # (float) Camera pixel size in the unit of um
-
-  magnification: 20
-  # (float) Magnification of the objective
-
-  NA_objective: 0.55
-  # (float) Numerical aperture of the objective
-
-  NA_condenser: 0.4
-  # (float) Numerical aperture of the condenser
-
-  n_objective_media: 1.0
-  # (float) Refractive index of the objective immersion oil
-
-  focus_zidx: 8
-  # (int) Index of the focused z slice of the dataset for 2D phase reconstruction
-
-  pad_z: 0
-  # (int) Number of z slices padded above and below the dataset for 3D phase reconstruction to avoid boundary artifacts
-
-  ## Denoiser parameters ##
-
-  phase_denoiser_3D: 'Tikhonov'
-  # (str) Options of denoiser for 3D phase reconstruction
-  ##   'Tikhonov' or 'TV' (total variation)
-
-  #### 3D Tikhonov parameters ####
-  # if noise is higher raise an order of magnitude to see if the recon is better
-
-  Tik_reg_ph_3D: 1.0e-4
-  # (float) Tikhonov regularization parameter for 3D phase
-  ##   1.0e-3 to 1.0e-4 should work generally when noise is low
-
-  #### 3D TV parameters ####
-  # For more noisy data, raise TV_reg to enforce stronger denoising effect
-
-  rho_3D: 1.0e-3
-  # (float) rho parameters in the 2D ADMM formulation
-  ##   1.0e-3 is generally good, no need to tune
-
-  itr_3D: 50
-  # (int) Number of iterations for 3D TV denoiser
-  ##   50 is generally good, no need to tune
-
-  TV_reg_ph_3D: 5.0e-5
-  # (float) TV regularization parameter for 3D phase
-  ##   5.0e-5 is generally good
\ No newline at end of file