Repository: feagi/feagi (language: python)

Issue:
Updates from Neuraville Inc
This PR syncs with latest Neuraville Inc. development code.
Deleting a region and raising internals does not delete the region from summary view
Issue: deleting a region via the /v1/region/region endpoint returns a 200, however running /v1/region/region_members still shows that region as existing

![image](https://github.com/feagi/feagi/assets/127231771/3c9f5847-b25d-4037-94b4-d9e12f546774)



![image](https://github.com/feagi/feagi/assets/127231771/f1f3991f-7624-49df-9750-d4296c7cc5d4)

FEAGI often returns 500 when doing multi-cortical area editing
second half of the issue referred to in https://github.com/feagi/brain-visualizer/issues/285


Discussion / hints:

Fix patch:
diff --git a/docker/.env b/docker/.env
index 531c58b53..df737390c 100644
--- a/docker/.env
+++ b/docker/.env
@@ -46,10 +46,10 @@ URL_BRAIN_PONG=None
 
 # Public images
 BRIDGE_IMAGE=neuraville/bridge:latest
-WEBCAM_CONTROLLER_IMAGE=neuraville/media_capture_controller:latest
+MEDIA_CONTROLLER_IMAGE=neuraville/media_capture_controller:latest
 FEAGI_IMAGE=neuraville/feagi:latest
-BRAIN_PONG_IMAGE=neuraville/godot-games-controller:latest
-MICROBIT_IMAGE=neuraville/bluetooth_controller:latest
+GODOT_GAMES_IMAGE=neuraville/godot-games-controller:latest
+BLUETOOTH_IMAGE=neuraville/bluetooth_controller:latest
 PLAYGROUND_IMAGE=neuraville/playground:latest
 INFLUX_DB_IMAGE=influxdb:2.0.7
 GRAFANA_IMAGE=../third_party/visualizers/grafana
diff --git a/docker/playground.yml b/docker/playground.yml
index c30ab2d25..fec258740 100644
--- a/docker/playground.yml
+++ b/docker/playground.yml
@@ -52,8 +52,8 @@ services:
     networks:
       - net
 
-  webcam_javascript_controller:
-    image: ${WEBCAM_CONTROLLER_IMAGE}
+  media_capture_controller:
+    image: ${MEDIA_CONTROLLER_IMAGE}
     deploy:
       resources:
         limits:
@@ -70,8 +70,8 @@ services:
       - feagi
 
 
-  brain_pong_controller:
-    image: ${BRAIN_PONG_IMAGE}
+  godot-games-controller:
+    image: ${GODOT_GAMES_IMAGE}
     ports:
       - "9055:9055"
     env_file:
@@ -80,8 +80,8 @@ services:
     networks:
       - net
 
-  microbit_controller:
-    image: ${MICROBIT_IMAGE}
+  bluetooth_controller:
+    image: ${BLUETOOTH_IMAGE}
     ports:
       - "9052:9052"
     env_file:
diff --git a/src/api/api.py b/src/api/api.py
index 566b79e92..47f0f4550 100644
--- a/src/api/api.py
+++ b/src/api/api.py
@@ -29,7 +29,7 @@
 from .commons import CustomError, api_queue
 from .models import *
 from .routers.v1 import burst_engine, connectome, evolution, feagi_agent, genome, insights, morphology, \
-    network, simulation, system, training, cortical_area, neuroplasticity, cortical_mapping
+    network, simulation, system, training, cortical_area, neuroplasticity, cortical_mapping, region
 from src.inf.feagi import start_feagi
 
 logger = logging.getLogger(__name__)
@@ -65,7 +65,8 @@
     allow_origins=ORIGINS,
     allow_credentials=True,
     allow_methods=["*"],
-    allow_headers=["*"]
+    allow_headers=["*"],
+    expose_headers=["Content-Disposition"],
 )
 
 
@@ -216,6 +217,14 @@ async def catch_exceptions_middleware(request: Request, call_next):
     responses=standard_response
 )
 
+app.include_router(
+    region.router,
+    prefix="/v1/region",
+    tags=["BRAIN REGIONS"],
+    dependencies=[Depends(check_active_genome)],
+    responses=standard_response
+)
+
 app.include_router(
     cortical_mapping.router,
     prefix="/v1/cortical_mapping",
@@ -259,7 +268,7 @@ async def catch_exceptions_middleware(request: Request, call_next):
     training.router,
     prefix="/v1/training",
     tags=["TRAINING"],
-    dependencies=[Depends(check_brain_running)],
+    dependencies=[Depends(check_active_genome)],
     responses=standard_response
 )
 
diff --git a/src/api/commons.py b/src/api/commons.py
index afbf6b792..e6b175141 100644
--- a/src/api/commons.py
+++ b/src/api/commons.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 from queue import Queue
 from datetime import datetime
 
diff --git a/src/api/config.py b/src/api/config.py
index 552a46537..5afdb62e7 100644
--- a/src/api/config.py
+++ b/src/api/config.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 import os
 from pydantic import BaseSettings
 
diff --git a/src/api/error_handling.py b/src/api/error_handling.py
index db222af74..621c03b0d 100644
--- a/src/api/error_handling.py
+++ b/src/api/error_handling.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 import logging
 
 from src.api.feagi_responses import response_list
diff --git a/src/api/message_processor.py b/src/api/message_processor.py
index 90d61f7a2..d67b28c0d 100644
--- a/src/api/message_processor.py
+++ b/src/api/message_processor.py
@@ -182,6 +182,10 @@ def api_message_processor(api_message):
     if 'update_cortical_properties' in api_message:
         update_cortical_properties(cortical_properties=api_message['update_cortical_properties'])
 
+    if 'update_multiple_cortical_properties' in api_message:
+        for message in api_message['update_multiple_cortical_properties']:
+            update_cortical_properties(cortical_properties=message)
+
     if 'update_cortical_mappings' in api_message:
         update_cortical_mappings(cortical_mappings=api_message['update_cortical_mappings'])
 
@@ -204,7 +208,9 @@ def api_message_processor(api_message):
     if 'append_circuit' in api_message:
         if runtime_data.genome:
             append_circuit(source_genome=api_message['append_circuit']["genome_str"],
-                           circuit_origin=api_message['append_circuit']['circuit_origin'])
+                           circuit_origin=api_message['append_circuit']['circuit_origin'],
+                           parent_brain_region=api_message['append_circuit']['parent_brain_region'],
+                           rewire_mode=api_message['append_circuit']['rewire_mode'])
         else:
             deploy_genome(neuroembryogenesis_flag=True, reset_runtime_data_flag=True,
                           genome_data=api_message['append_circuit']["genome_str"])
diff --git a/src/api/models.py b/src/api/models.py
index 9fb3c590f..ed71d0b0a 100644
--- a/src/api/models.py
+++ b/src/api/models.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 from pydantic import BaseModel
 
 
diff --git a/src/api/routers/v1/cortical_area.py b/src/api/routers/v1/cortical_area.py
index d008b8163..7acf1edbb 100644
--- a/src/api/routers/v1/cortical_area.py
+++ b/src/api/routers/v1/cortical_area.py
@@ -22,11 +22,12 @@
 
 from src.inf import runtime_data
 from src.api.error_handling import generate_response
-from src.inf.initialize import generate_cortical_dimensions_by_id
+from src.evo.voxels import generate_cortical_dimensions_by_id
 from src.evo.genome_properties import genome_properties
 from src.evo.x_genesis import add_core_cortical_area, add_custom_cortical_area
 from src.evo.neuroembryogenesis import cortical_name_list, cortical_name_to_id
 from src.evo.templates import cortical_types
+from src.evo.region import change_cortical_area_parent
 
 
 router = APIRouter()
@@ -41,6 +42,11 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
     if len(cortical_area) == genome_properties["structure"]["cortical_id_length"]:
         if cortical_area in runtime_data.genome['blueprint']:
             cortical_data = runtime_data.genome['blueprint'][cortical_area]
+            brain_region_id = runtime_data.cortical_area_region_association[cortical_area]
+            brain_region_title = ""
+            if brain_region_id:
+                if brain_region_id in runtime_data.genome["brain_regions"]:
+                    brain_region_title = runtime_data.genome["brain_regions"][brain_region_id]["title"]
 
             if 'mp_charge_accumulation' not in cortical_data:
                 cortical_data['mp_charge_accumulation'] = True
@@ -53,13 +59,19 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
                 cortical_data['2d_coordinate'].append(None)
                 cortical_data['2d_coordinate'].append(None)
 
+            cortical_visibility = True
+            if cortical_area in runtime_data.cortical_viz_list:
+                cortical_visibility = False
+
             cortical_properties = {
                 "cortical_id": cortical_area,
                 "cortical_name": cortical_data['cortical_name'],
+                "parent_region_id": brain_region_id,
+                "parent_region_title": brain_region_title,
                 "cortical_group": cortical_data['group_id'],
                 "cortical_sub_group": cortical_data['sub_group_id'],
                 "cortical_neuron_per_vox_count": cortical_data['per_voxel_neuron_cnt'],
-                "cortical_visibility": cortical_data['visualization'],
+                "cortical_visibility": cortical_visibility,
                 "cortical_synaptic_attractivity": cortical_data['synapse_attractivity'],
                 "coordinates_3d": [
                     cortical_data["relative_coordinate"][0],
@@ -116,12 +128,42 @@ async def update_cortical_properties(message: UpdateCorticalProperties):
     """
     Enables changes against various Burst Engine parameters.
     """
+    if message.cortical_id not in runtime_data.genome["blueprint"]:
+        return JSONResponse(status_code=400, content={'message': f"{message.cortical_id} is not found in Genome!"})
+
+    current_cortical_size = runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][0] * \
+                            runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][1] * \
+                            runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][2]
+    updated_cortical_size = current_cortical_size
+
+    if message.cortical_dimensions:
+        updated_cortical_size = message.cortical_dimensions[0] * \
+                            message.cortical_dimensions[1] * \
+                            message.cortical_dimensions[2]
+
+    current_neuron_density = runtime_data.genome["blueprint"][message.cortical_id]["per_voxel_neuron_cnt"]
+    updated_neuron_density = current_neuron_density
+
+    if message.cortical_neuron_per_vox_count:
+        updated_neuron_density = message.cortical_neuron_per_vox_count
+
+    if message.parent_region_id:
+        change_cortical_area_parent(cortical_area_id=message.cortical_id, new_parent_id=message.parent_region_id)
+
+    current_neuron_count = current_cortical_size * current_neuron_density
+    updated_neuron_count = updated_cortical_size * updated_neuron_density
+
+    max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+
+    if runtime_data.brain_stats["neuron_count"] - current_neuron_count + updated_neuron_count > \
+            max_allowable_neuron_count:
+        return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count will"
+                                                                 f" exceed {max_allowable_neuron_count} threshold"})
 
     if message.cortical_id in runtime_data.transforming_areas:
         return generate_response("CORTICAL_AREA_UNDERGOING_TRANSFORMATION")
     else:
-        runtime_data.transforming_areas.add(message.cortical_id)
-        message = message.dict()
+        message = message.dict(exclude_none=True)
         message = {'update_cortical_properties': message}
         print("*-----* " * 200 + "\n", message)
         api_queue.put(item=message)
@@ -150,6 +192,7 @@ async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCort
     Enables changes against various Burst Engine parameters.
     """
     cortical_name = new_custom_cortical_properties.cortical_name
+    parent_region_id = new_custom_cortical_properties.parent_region_id
     coordinates_3d = new_custom_cortical_properties.coordinates_3d.copy()
     coordinates_2d = new_custom_cortical_properties.coordinates_2d.copy()
     sub_group_id = new_custom_cortical_properties.sub_group_id
@@ -160,10 +203,25 @@ async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCort
     else:
         is_memory = False
         cortical_dimensions = new_custom_cortical_properties.cortical_dimensions
+
+    neuron_density = 1
+    if copy_of:
+        neuron_density = runtime_data.genome["blueprint"][copy_of]["per_voxel_neuron_cnt"]
+
+    neuron_count = neuron_density * cortical_dimensions[0] * cortical_dimensions[1] * cortical_dimensions[2]
+    max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+    if neuron_count + runtime_data.brain_stats["neuron_count"] > max_allowable_neuron_count:
+        return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count will"
+                                                                 f" exceed {max_allowable_neuron_count} threshold"})
+
+    if parent_region_id not in runtime_data.genome["brain_regions"]:
+        return JSONResponse(status_code=400, content={'message': f"{parent_region_id} does not exist!"})
+
     cortical_id = add_custom_cortical_area(cortical_name=cortical_name,
                                            coordinates_3d=coordinates_3d,
                                            coordinates_2d=coordinates_2d,
                                            cortical_dimensions=cortical_dimensions,
+                                           parent_region_id=parent_region_id,
                                            is_memory=is_memory,
                                            copy_of=copy_of)
     return JSONResponse(status_code=200, content={'cortical_id': cortical_id})
@@ -172,7 +230,7 @@ async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCort
 @router.delete("/cortical_area")
 async def delete_cortical_area(cortical_id: CorticalId):
     """
-    Enables changes against various Burst Engine parameters.
+    Deletes a single cortical area
     """
     cortical_id = cortical_id.cortical_id
     if cortical_id in runtime_data.genome["blueprint"]:
@@ -328,3 +386,191 @@ async def connectome_detailed_cortical_map():
                 cortical_map[cortical_area][dst].append(mapping)
 
     return cortical_map
+
+
+@router.get("/cortical_visibility")
+async def fetch_visualized_cortical_list():
+    return runtime_data.cortical_viz_list
+
+
+@router.put("/suppress_cortical_visibility")
+async def suppress_cortical_activity_visualization(cortical_id_list: list):
+    unprocessed_list = set()
+    runtime_data.cortical_viz_list = set()
+    for cortical_id in cortical_id_list:
+        if cortical_id in runtime_data.cortical_list:
+            runtime_data.cortical_viz_list.add(cortical_id)
+        else:
+            unprocessed_list.add(cortical_id)
+            runtime_data.genome["blueprint"][cortical_id]["visualization"] = False
+
+    if unprocessed_list:
+        return JSONResponse(status_code=400, content={'message': f"Following cortical ids were not found!\n "
+                                                                 f"{unprocessed_list}"})
+
+
+@router.post("/multi/cortical_area_properties")
+async def fetch_multiple_cortical_properties(cortical_id_list: CorticalIdList):
+    """
+    Returns the properties of multiple cortical areas
+    """
+    results = list()
+    for cortical_area in cortical_id_list.cortical_id_list:
+        if len(cortical_area) == genome_properties["structure"]["cortical_id_length"]:
+            if cortical_area in runtime_data.genome['blueprint']:
+                cortical_data = runtime_data.genome['blueprint'][cortical_area]
+                brain_region_id = runtime_data.cortical_area_region_association[cortical_area]
+                brain_region_title = runtime_data.genome["brain_regions"][brain_region_id]["title"]
+
+                if 'mp_charge_accumulation' not in cortical_data:
+                    cortical_data['mp_charge_accumulation'] = True
+
+                if 'mp_driven_psp' not in cortical_data:
+                    cortical_data['mp_driven_psp'] = False
+
+                if '2d_coordinate' not in cortical_data:
+                    cortical_data['2d_coordinate'] = list()
+                    cortical_data['2d_coordinate'].append(None)
+                    cortical_data['2d_coordinate'].append(None)
+
+                cortical_properties = {
+                    "cortical_id": cortical_area,
+                    "cortical_name": cortical_data['cortical_name'],
+                    "parent_region_id": brain_region_id,
+                    "parent_region_title": brain_region_title,
+                    "cortical_group": cortical_data['group_id'],
+                    "cortical_sub_group": cortical_data['sub_group_id'],
+                    "cortical_neuron_per_vox_count": cortical_data['per_voxel_neuron_cnt'],
+                    "visualization": not (cortical_area in runtime_data.cortical_viz_list),
+                    "cortical_synaptic_attractivity": cortical_data['synapse_attractivity'],
+                    "coordinates_3d": [
+                        cortical_data["relative_coordinate"][0],
+                        cortical_data["relative_coordinate"][1],
+                        cortical_data["relative_coordinate"][2]
+                    ],
+                    "coordinates_2d": [
+                        cortical_data["2d_coordinate"][0],
+                        cortical_data["2d_coordinate"][1]
+                    ],
+                    "cortical_dimensions": [
+                        cortical_data["block_boundaries"][0],
+                        cortical_data["block_boundaries"][1],
+                        cortical_data["block_boundaries"][2]
+                    ],
+                    "cortical_destinations": cortical_data['cortical_mapping_dst'],
+                    "neuron_post_synaptic_potential": cortical_data['postsynaptic_current'],
+                    "neuron_post_synaptic_potential_max": cortical_data['postsynaptic_current_max'],
+                    "neuron_fire_threshold": cortical_data['firing_threshold'],
+                    "neuron_fire_threshold_increment": [
+                        cortical_data['firing_threshold_increment_x'],
+                        cortical_data['firing_threshold_increment_y'],
+                        cortical_data['firing_threshold_increment_z']
+                    ],
+                    "neuron_firing_threshold_limit": cortical_data['firing_threshold_limit'],
+                    "neuron_refractory_period": cortical_data['refractory_period'],
+                    "neuron_leak_coefficient": cortical_data['leak_coefficient'],
+                    "neuron_leak_variability": cortical_data['leak_variability'],
+                    "neuron_consecutive_fire_count": cortical_data['consecutive_fire_cnt_max'],
+                    "neuron_snooze_period": cortical_data['snooze_length'],
+                    "neuron_degeneracy_coefficient": cortical_data['degeneration'],
+                    "neuron_psp_uniform_distribution": cortical_data['psp_uniform_distribution'],
+                    "neuron_mp_charge_accumulation": cortical_data['mp_charge_accumulation'],
+                    "neuron_mp_driven_psp": cortical_data['mp_driven_psp'],
+                    "neuron_longterm_mem_threshold": cortical_data['longterm_mem_threshold'],
+                    "neuron_lifespan_growth_rate": cortical_data['lifespan_growth_rate'],
+                    "neuron_init_lifespan": cortical_data['init_lifespan'],
+                    "neuron_excitability": cortical_data['neuron_excitability'],
+                    "transforming": False
+                }
+                if cortical_area in runtime_data.transforming_areas:
+                    cortical_properties["transforming"] = True
+                else:
+                    cortical_properties["transforming"] = False
+                results.append(cortical_properties)
+            else:
+                return generate_response("CORTICAL_AREA_NOT_FOUND")
+        else:
+            return generate_response("CORTICAL_AREA_INVALID_ID_LENGTH")
+    return results
+
+
+@router.put("/multi/cortical_area")
+async def update_multiple_cortical_properties(message: UpdateMultipleCorticalProperties):
+    """
+    Updates properties for multiple cortical areas at the same time
+    """
+
+    cortical_id_list = message.cortical_id_list
+
+    # Check to ensure all selected areas are of same type
+    message_dict = message.dict(exclude_none=True)
+    message_dict.pop("cortical_id_list")
+
+    type_list = set()
+    transforming = False
+    for cortical_id in message.cortical_id_list:
+        type_list.add(runtime_data.genome["blueprint"][cortical_id]["is_mem_type"])
+        if "transforming" in runtime_data.genome["blueprint"][cortical_id]:
+            if runtime_data.genome["blueprint"][cortical_id]["transforming"]:
+                transforming = True
+    if len(type_list) > 1:
+        return JSONResponse(status_code=400, content={'message': f"Memory and non-memory type cortical areas cannot"
+                                                                 f"be edited at the same time"})
+
+    if transforming:
+        return generate_response("CORTICAL_AREA_UNDERGOING_TRANSFORMATION")
+
+    multi_edit_payload = []
+
+    # Proceed with updates
+    for cortical_id in cortical_id_list:
+        current_cortical_size = runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][0] * \
+                                runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][1] * \
+                                runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][2]
+        updated_cortical_size = current_cortical_size
+
+        if message_dict.get("cortical_dimensions"):
+            updated_cortical_size = message.cortical_dimensions[0] * \
+                                message.cortical_dimensions[1] * \
+                                message.cortical_dimensions[2]
+
+        current_neuron_density = runtime_data.genome["blueprint"][cortical_id]["per_voxel_neuron_cnt"]
+        updated_neuron_density = current_neuron_density
+
+        if message_dict.get("cortical_neuron_per_vox_count"):
+            updated_neuron_density = message.cortical_neuron_per_vox_count
+
+        if message_dict.get("parent_region_id"):
+            change_cortical_area_parent(cortical_area_id=cortical_id, new_parent_id=message.parent_region_id)
+
+        current_neuron_count = current_cortical_size * current_neuron_density
+        updated_neuron_count = updated_cortical_size * updated_neuron_density
+
+        max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+
+        if runtime_data.brain_stats["neuron_count"] - current_neuron_count + updated_neuron_count > \
+                max_allowable_neuron_count:
+            return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count"
+                                                                     f" will exceed {max_allowable_neuron_count} "
+                                                                     f"threshold"})
+
+        cortical_payload = message_dict.copy()
+        cortical_payload["cortical_id"] = cortical_id
+        multi_edit_payload.append(cortical_payload)
+
+    message_ = {'update_multiple_cortical_properties': multi_edit_payload}
+    api_queue.put(item=message_)
+
+
+@router.delete("/multi/cortical_area")
+async def delete_multiple_cortical_areas(cortical_id_list: CorticalIdList):
+    """
+    Deletes multiple cortical areas at the same time
+    """
+    for cortical_id in cortical_id_list.cortical_id_list:
+        if cortical_id in runtime_data.genome["blueprint"]:
+
+            message = {'delete_cortical_area': cortical_id}
+            api_queue.put(item=message)
+        else:
+            return generate_response("CORTICAL_AREA_NOT_FOUND")
diff --git a/src/api/routers/v1/cortical_mapping.py b/src/api/routers/v1/cortical_mapping.py
index b1d8bb2bc..b1db6ef08 100644
--- a/src/api/routers/v1/cortical_mapping.py
+++ b/src/api/routers/v1/cortical_mapping.py
@@ -21,7 +21,7 @@
 
 from src.inf import runtime_data
 from src.evo.genome_properties import genome_properties
-from src.evo.x_genesis import neighboring_cortical_areas
+from src.evo.synapse import neighboring_cortical_areas
 
 
 router = APIRouter()
@@ -130,3 +130,24 @@ async def connectome_cortical_map():
                 cortical_map[cortical_area][dst] += 1
 
     return cortical_map
+
+
+@router.delete("/delete_suggested_mappings")
+async def delete_suggested_mapping(mapping_data: SuggestedMapping):
+    """
+    Deletes suggested mapping hint associated with a brain region
+    """
+    region_id = mapping_data.brain_region_id
+    mapping_type = mapping_data.mapping_type
+
+    if region_id in runtime_data.genome["brain_regions"]:
+        if mapping_type in ["inputs", "outputs"]:
+            for mapping_definition in mapping_data.mapping_definitions:
+                if mapping_definition in runtime_data.genome["brain_regions"][region_id][mapping_type]:
+                    runtime_data.genome["brain_regions"][region_id][mapping_type].remove(mapping_definition)
+                else:
+                    raise HTTPException(status_code=400, detail=f"Mapping definition not found!")
+        else:
+            raise HTTPException(status_code=400, detail=f"Mapping type can be defined as either 'inputs' or 'outputs' ")
+    else:
+        raise HTTPException(status_code=400, detail=f"Brain region id {region_id} is not valid.")
diff --git a/src/api/routers/v1/genome.py b/src/api/routers/v1/genome.py
index 7db8418b5..9fc42714f 100644
--- a/src/api/routers/v1/genome.py
+++ b/src/api/routers/v1/genome.py
@@ -17,7 +17,7 @@
 import os
 import json
 
-from fastapi import APIRouter, UploadFile, File, HTTPException, Depends
+from fastapi import APIRouter, UploadFile, File, HTTPException, Depends, Query
 from starlette.responses import FileResponse
 
 from ...schemas import *
@@ -28,6 +28,8 @@
 from src.evo.genome_editor import save_genome
 from src.evo.genome_processor import genome_2_1_convertor, genome_v1_v2_converter
 from src.evo.stats import circuit_size
+from src.evo.region import region_id_2_title, construct_genome_from_region
+from src.evo.templates import cortical_template
 from src.inf.initialize import generate_cortical_dimensions_by_id
 
 
@@ -70,6 +72,12 @@ async def genome_file_upload(file: UploadFile = File(...)):
 
     genome_str = json.loads(data)
 
+    if "genome_title" not in genome_str:
+        genome_str["genome_title"] = runtime_data.genome_file_name
+
+    if "genome_description" not in genome_str:
+        genome_str["genome_description"] = ""
+
     # genome_str = genome_str.replace('\'', '\"')
     # genome_str = data.decode("utf-8").split(" = ")[1]
     message = {'genome': genome_str}
@@ -90,6 +98,13 @@ async def genome_file_name():
 
 @router.post("/upload/string")
 async def genome_string_upload(genome: dict):
+
+    if "genome_title" not in genome:
+        genome["genome_title"] = "Unknown Genome"
+
+    if "genome_description" not in genome:
+        genome["genome_description"] = ""
+
     message = {'genome': genome}
     api_queue.put(item=message)
 
@@ -97,14 +112,42 @@ async def genome_string_upload(genome: dict):
 @router.get("/download")
 async def genome_download(_: str = Depends(check_active_genome)):
     print("Downloading Genome...")
-    print("==========================>>>>\n", runtime_data.genome)
     save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
                 file_name=runtime_data.connectome_path + "genome.json")
-    file_name = "genome_" + datetime.now().strftime("%Y_%m_%d-%I:%M:%S_%p") + ".json"
+    file_name = "genome-" + runtime_data.genome["genome_title"].replace(" ", "_") + ".json"
     print(file_name)
+
     if runtime_data.genome:
         runtime_data.changes_saved_externally = True
-        return FileResponse(path=runtime_data.connectome_path + "genome.json", filename=file_name)
+        file_path = runtime_data.connectome_path + "genome.json"
+        headers = {"Content-Disposition": f"attachment; filename={file_name}"}
+        response = FileResponse(path=file_path,
+                                media_type="application/json",
+                                filename=file_name,
+                                headers=headers
+                                )
+        # response.headers["Content-Disposition"] = f'attachment; filename=\"{file_name}\"'
+        # print("response headers", response.headers)
+        return response
+    else:
+        raise HTTPException(status_code=400, detail="No running genome found!")
+
+
+@router.get("/download_region")
+async def genome_download_from_region(region_id, _: str = Depends(check_active_genome)):
+    print(f"Downloading genome associated with {region_id} ...")
+
+    region_title = region_id_2_title(region_id=region_id)
+    genome_payload = construct_genome_from_region(region_id=region_id)
+
+    genome_path = runtime_data.connectome_path + f"genome_{region_title}.json"
+    save_genome(genome=genome_payload,
+                file_name=genome_path)
+    file_name = f"genome-{region_title}".replace(" ", "_") + ".json"
+
+    if runtime_data.genome:
+        runtime_data.changes_saved_externally = True
+        return FileResponse(path=genome_path, media_type="application/json", filename=file_name)
     else:
         raise HTTPException(status_code=400, detail="No running genome found!")
 
@@ -148,7 +191,7 @@ async def reset_genome():
 
 
 @router.post("/amalgamation_by_payload")
-async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
+async def amalgamation_attempt(amalgamation_param: AmalgamationRequest, _: str = Depends(check_active_genome)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
@@ -169,7 +212,7 @@ async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
 
 
 @router.post("/amalgamation_by_upload")
-async def amalgamation_attempt(file: UploadFile = File(...)):
+async def amalgamation_attempt(_: str = Depends(check_active_genome), file: UploadFile = File(...)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
@@ -194,7 +237,7 @@ async def amalgamation_attempt(file: UploadFile = File(...)):
 
 
 @router.post("/amalgamation_by_filename")
-async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
+async def amalgamation_attempt(amalgamation_param: AmalgamationRequest, _: str = Depends(check_active_genome)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
@@ -217,18 +260,31 @@ async def amalgamation_history():
     return runtime_data.amalgamation_history
 
 
+@router.get("/cortical_template")
+async def cortical_template_():
+    return cortical_template
+
+
 @router.post("/amalgamation_destination")
-async def amalgamation_conclusion(circuit_origin_x: int,
-                                  circuit_origin_y: int,
-                                  circuit_origin_z: int,
-                                  amalgamation_id):
+async def amalgamation_conclusion(circuit_origin_x,
+                                  circuit_origin_y,
+                                  circuit_origin_z,
+                                  amalgamation_id,
+                                  _: str = Depends(check_active_genome),
+                                  brain_region_id="root",
+                                  rewire_mode: RewiringMode = Query(default=RewiringMode.rewire_all)):
+
     if pending_amalgamation():
         payload = dict()
         payload["genome_str"] = runtime_data.pending_amalgamation["genome_payload"]
-        payload["circuit_origin"] = [circuit_origin_x, circuit_origin_y, circuit_origin_z]
+        payload["circuit_origin"] = [int(circuit_origin_x), int(circuit_origin_y), int(circuit_origin_z)]
+        payload["parent_brain_region"] = brain_region_id
+        payload["rewire_mode"] = rewire_mode.value
         data = {'append_circuit': payload}
+        print(data)
         api_queue.put(item=data)
         genome_title = runtime_data.pending_amalgamation["genome_title"]
+
         cancel_pending_amalgamation(amalgamation_id=amalgamation_id)
         runtime_data.amalgamation_history["amalgamation_id"] = "complete"
         return f"Amalgamation for \"{genome_title}\" is complete."
diff --git a/src/api/routers/v1/insights.py b/src/api/routers/v1/insights.py
index cf296c7c2..548d4dfce 100644
--- a/src/api/routers/v1/insights.py
+++ b/src/api/routers/v1/insights.py
@@ -28,57 +28,61 @@
 # ####################################################
 
 @router.post("/neurons/membrane_potential_status")
-async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalId):
+async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalIdList):
     print("Cortical membrane potential monitoring", runtime_data.neuron_mp_collection_scope)
-    cortical_area = cortical_area.cortical_id
-    if cortical_area in runtime_data.neuron_mp_collection_scope:
-        return True
-    else:
-        return False
+    response = list()
+    for cortical_area in cortical_area.cortical_id_list:
+        if cortical_area in runtime_data.neuron_mp_collection_scope:
+            response.append([cortical_area, True])
+        else:
+            response.append([cortical_area, False])
 
 
 @router.post("/neurons/membrane_potential_set")
-async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalId, state: bool):
+async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalIdList, state: bool):
     print("Cortical membrane potential monitoring", runtime_data.neuron_mp_collection_scope)
-    cortical_area = cortical_area.cortical_id
+
     if runtime_data.influxdb:
         influx_readiness = runtime_data.influxdb.test_influxdb()
         if influx_readiness:
-            if cortical_area in runtime_data.genome['blueprint']:
-                if state and cortical_area not in runtime_data.neuron_mp_collection_scope:
-                    runtime_data.neuron_mp_collection_scope[cortical_area] = {}
-                elif not state and cortical_area in runtime_data.neuron_mp_collection_scope:
-                    runtime_data.neuron_mp_collection_scope.pop(cortical_area)
-                else:
-                    pass
+            for cortical_area in cortical_area.cortical_id_list:
+                if cortical_area in runtime_data.genome['blueprint']:
+                    if state and cortical_area not in runtime_data.neuron_mp_collection_scope:
+                        runtime_data.neuron_mp_collection_scope[cortical_area] = {}
+                    elif not state and cortical_area in runtime_data.neuron_mp_collection_scope:
+                        runtime_data.neuron_mp_collection_scope.pop(cortical_area)
+                    else:
+                        pass
             return True
     else:
         raise HTTPException(status_code=400, detail="InfluxDb service is not running!")
 
 
 @router.post("/neuron/synaptic_potential_status")
-async def cortical_synaptic_potential_monitoring(cortical_area: CorticalId):
+async def cortical_synaptic_potential_monitoring(cortical_area: CorticalIdList):
     print("Cortical synaptic potential monitoring flag", runtime_data.neuron_psp_collection_scope)
-    cortical_area = cortical_area.cortical_id
-    if cortical_area in runtime_data.neuron_psp_collection_scope:
-        return True
-    else:
-        return False
+    response = list()
+    for cortical_area in cortical_area.cortical_id_list:
+        if cortical_area in runtime_data.neuron_psp_collection_scope:
+            response.append([cortical_area, True])
+        else:
+            response.append([cortical_area, False])
 
 
 @router.post("/neuron/synaptic_potential_set")
-async def cortical_synaptic_potential_monitoring(cortical_area: CorticalId, state: bool):
+async def cortical_synaptic_potential_monitoring(cortical_area: CorticalIdList, state: bool):
     print("Cortical synaptic potential monitoring flag", runtime_data.neuron_psp_collection_scope)
-    cortical_area = cortical_area.cortical_id
+
     if runtime_data.influxdb:
         if runtime_data.influxdb.test_influxdb():
-            if cortical_area in runtime_data.genome['blueprint']:
-                if state and cortical_area not in runtime_data.neuron_psp_collection_scope:
-                    runtime_data.neuron_psp_collection_scope[cortical_area] = {}
-                elif not state and cortical_area in runtime_data.neuron_psp_collection_scope:
-                    runtime_data.neuron_psp_collection_scope.pop(cortical_area)
-                else:
-                    pass
+            for cortical_area in cortical_area.cortical_id_list:
+                if cortical_area in runtime_data.genome['blueprint']:
+                    if state and cortical_area not in runtime_data.neuron_psp_collection_scope:
+                        runtime_data.neuron_psp_collection_scope[cortical_area] = {}
+                    elif not state and cortical_area in runtime_data.neuron_psp_collection_scope:
+                        runtime_data.neuron_psp_collection_scope.pop(cortical_area)
+                    else:
+                        pass
             return True
     else:
         raise HTTPException(status_code=400, detail="InfluxDb service is not running!")
diff --git a/src/api/routers/v1/morphology.py b/src/api/routers/v1/morphology.py
index 50ea08fa1..3fc99bd38 100644
--- a/src/api/routers/v1/morphology.py
+++ b/src/api/routers/v1/morphology.py
@@ -127,7 +127,7 @@ async def genome_update_neuron_morphology(morphology_input: MorphologyInput):
 @router.post("/morphology")
 async def genome_add_neuron_morphology(morphology_input: MorphologyInput):
     """
-    Enables changes against various Burst Engine parameters.
+    Create new connectivity rule aka. neuron morphology.
     """
     morphology_name = morphology_input.morphology_name
     if morphology_input.morphology_name not in runtime_data.genome['neuron_morphologies']:
diff --git a/src/api/routers/v1/region.py b/src/api/routers/v1/region.py
new file mode 100644
index 000000000..bc2342eb3
--- /dev/null
+++ b/src/api/routers/v1/region.py
@@ -0,0 +1,181 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+from fastapi import APIRouter, HTTPException, status
+from fastapi.responses import JSONResponse
+
+from ...schemas import *
+from ...commons import *
+
+from src.inf import runtime_data
+from src.evo.region import *
+from src.api.error_handling import generate_response
+from src.evo.genome_properties import genome_properties
+from src.evo.x_genesis import add_core_cortical_area, add_custom_cortical_area
+from src.evo.neuroembryogenesis import cortical_name_list, cortical_name_to_id
+from src.evo.templates import cortical_types
+
+
+"""
+[POST] create a new brain region: /v1/region/region
+[PUT] Update brain region properties (title, coordinates) /v1/region/region
+[GET] Update brain region properties (title, coordinates) /v1/region/region
+[DELETE] Deletes a brain region /v1/region/region
+
+[GET] list all brain regions (summary): /v1/TBD
+[GET] list all brain regions and their members (comprehensive): /v1/TBD
+[GET] list members of a given brain region: /v1/TBD
+[PUT] associate a cortical area or brain region to another brain region: /v1/TBD
+
+
+"""
+
+router = APIRouter()
+
+
+@router.post("/region")
+async def create_brain_region(region_data: NewRegionProperties):
+    if region_data.parent_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{region_data.parent_region_id} is not a valid region id")
+    else:
+        region_id = create_region(region_data)
+        return {"region_id": region_id}
+
+
+@router.put("/region")
+async def update_region_properties(region_data: UpdateRegionProperties):
+    region_dict = region_data.__dict__
+    unacceptable_root_fields = ["parent_region_id", "coordinates_2d", "coordinates_3d"]
+    if region_data.region_id == "root":
+        for field in unacceptable_root_fields:
+            if field in region_dict:
+                raise HTTPException(status_code=400, detail=f"{field} cannot be modified for root region")
+    if "parent_region_id" in region_dict:
+        region_dict.pop("parent_region_id")
+
+    update_region(region_data=region_dict)
+
+
+@router.get("/region")
+async def view_region_properties(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        return runtime_data.genome["brain_regions"][region_id]
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id} is not a valid region id")
+
+
+@router.delete("/region")
+async def delete_region(region_id: Id):
+    if region_id.id == "root":
+        raise HTTPException(status_code=400, detail="Root region cannot be deleted")
+    elif region_id.id in runtime_data.genome["brain_regions"]:
+        region_parent = runtime_data.genome["brain_regions"][region_id.id]["parent_region_id"]
+        for area_id in runtime_data.genome["brain_regions"][region_id.id]["areas"]:
+            change_cortical_area_parent(cortical_area_id=area_id,
+                                        new_parent_id=region_parent)
+            runtime_data.cortical_area_region_association[area_id] = region_parent
+        for region_id_ in runtime_data.genome["brain_regions"][region_id.id]["regions"]:
+            change_brain_region_parent(region_id=region_id_,
+                                       new_parent_id=region_parent)
+        runtime_data.genome["brain_regions"].pop(region_id.id)
+        runtime_data.genome["brain_regions"][region_parent]["regions"].remove(region_id.id)
+
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id.id} is not a valid region id")
+
+
+@router.delete("/region_and_members")
+async def delete_region_and_members(region_id: Id):
+    if region_id.id == "root":
+        raise HTTPException(status_code=400, detail="Root region cannot be deleted")
+    elif region_id.id in runtime_data.genome["brain_regions"]:
+        delete_region_with_members(region_id=region_id)
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id.id} is not a valid region id")
+
+
+@router.get("/regions")
+async def list_all_regions():
+    region_summary = dict()
+    region_list = runtime_data.genome["brain_regions"].keys()
+    for region in region_list:
+        region_summary[region] = {}
+        region_summary[region]["coordinate_2d"] = runtime_data.genome["brain_regions"][region]["coordinate_2d"]
+        region_summary[region]["coordinate_3d"] = runtime_data.genome["brain_regions"][region]["coordinate_3d"]
+
+    return region_summary
+
+
+@router.get("/regions_members")
+async def list_all_regions_and_members():
+    return runtime_data.genome["brain_regions"]
+
+
+@router.get("/region_titles")
+async def list_all_region_titles():
+    title_list = []
+    for region_id in runtime_data.genome["brain_regions"]:
+        title_list.append((region_id, region_id_2_title(region_id=region_id)))
+    return title_list
+
+
+@router.put("/change_cortical_area_region")
+async def update_cortical_area_region_association(association_data: RegionAssociation):
+    if association_data.id not in runtime_data.genome["blueprint"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not a valid cortical area id")
+    elif runtime_data.genome["blueprint"][association_data.id]["group_id"] in ["IPU", "OPU", "CORE"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not custom area and "
+                                                    f"restricted to move")
+    elif association_data.new_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.new_region_id} is not a valid brain region  id")
+    else:
+        change_cortical_area_parent(cortical_area_id=association_data.id,
+                                    new_parent_id=association_data.new_region_id)
+
+
+@router.put("/change_region_parent")
+async def update_brain_region_parent(association_data: RegionAssociation):
+    if association_data.id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not a valid brain region id")
+    elif association_data.new_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.new_region_id} is not a valid brain region  id")
+    else:
+        change_brain_region_parent(region_id=association_data.id,
+                                   new_parent_id=association_data.new_region_id)
+
+
+@router.put("/relocate_members")
+async def brain_region_member_relocation(relocation_data: dict):
+    """
+    Accepts a dictionary of 2D coordinates of one or more cortical areas and update them in genome.
+
+    Input format:
+
+    {
+        "region_id_1": {
+            "coordinate_2d": [10, 9],
+            "parent_region_id": "fhafsihwfiuhr23r_b",
+        },
+        "region_id_2": {
+            "coordinate_2d": [4, 93],
+            "parent_region_id": "dhdfsihwfiuhr23r_b",
+        },
+        "cortical_area_id": {
+            "coordinate_2d": [30, 29],
+            "parent_region_id": "gdfsihwfiuhr23r_b",
+        }
+    }
+    """
+    relocate_region_members(relocation_data=relocation_data)
diff --git a/src/api/routers/v1/simulation.py b/src/api/routers/v1/simulation.py
index 87a738dc1..5ebb70613 100644
--- a/src/api/routers/v1/simulation.py
+++ b/src/api/routers/v1/simulation.py
@@ -1,3 +1,17 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
 
 from fastapi import APIRouter
 
diff --git a/src/api/routers/v1/system.py b/src/api/routers/v1/system.py
index 0ed8b763d..726f85ed0 100644
--- a/src/api/routers/v1/system.py
+++ b/src/api/routers/v1/system.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 import os
 from fastapi import APIRouter, HTTPException
 
@@ -5,6 +20,7 @@
 from ...schemas import *
 
 from src.version import __version__
+from src.evo.templates import cortical_types
 
 
 router = APIRouter()
@@ -56,11 +72,13 @@ async def feagi_health_check():
         health["influxdb_availability"] = True
     else:
         health["influxdb_availability"] = False
-    health["neuron_count_max"] = runtime_data.parameters["Limits"]["max_neuron_count"]
-    health["synapse_count_max"] = runtime_data.parameters["Limits"]["max_synapse_count"]
+
+    health["neuron_count_max"] = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+    health["synapse_count_max"] = int(runtime_data.parameters["Limits"]["max_synapse_count"])
     health["latest_changes_saved_externally"] = runtime_data.changes_saved_externally
 
     if runtime_data.genome:
+        health["fitness"] = runtime_data.genome_fitness
         health["genome_availability"] = True
         connectome_neuron_count = runtime_data.brain_stats["neuron_count"]
         connectome_synapse_count = runtime_data.brain_stats["synapse_count"]
@@ -154,3 +172,42 @@ async def change_circuit_library_path(circuit_library_path: str):
         print(f"{circuit_library_path} is the new circuit library path.")
     else:
         raise HTTPException(status_code=400, detail=f"{circuit_library_path} is not a valid path.")
+
+
+@router.get("/cortical_area_types")
+async def fetch_cortical_area_types():
+    return cortical_types
+
+
+@router.put("/cortical_area_types")
+async def update_cortical_area_types(cortical_id: str):
+    # todo
+    return "Endpoint pending implementation"
+
+
+@router.get("/cortical_area_visualization_skip_rate")
+async def update_cortical_area_visualization_skip_rate():
+    return runtime_data.cortical_viz_skip_rate
+
+
+@router.get("/cortical_area_visualization_suppression_threshold")
+async def update_cortical_area_visualization_suppression_threshold():
+    return runtime_data.cortical_viz_sup_threshold
+
+
+@router.put("/cortical_area_visualization_skip_rate")
+async def update_cortical_area_visualization_skip_rate(cortical_viz_skip_rate: VizSkipRate):
+    """Set cortical area visualization skip rate. This value defines the number of skips between each instance of
+    neuron firing visualization"""
+    if cortical_viz_skip_rate.cortical_viz_skip_rate < 0:
+        raise HTTPException(status_code=400, detail=f"Visualization skip rate cannot be negative")
+    runtime_data.cortical_viz_skip_rate = cortical_viz_skip_rate.cortical_viz_skip_rate
+
+
+@router.put("/cortical_area_visualization_suppression_threshold")
+async def update_cortical_area_visualization_suppression_threshold(visualization_threshold: VizThreshold):
+    """Controls the level of voxel activity per cortical area where if exceeded will enforce visualization frequency
+    control to kick in."""
+    if visualization_threshold.visualization_threshold < 0:
+        raise HTTPException(status_code=400, detail=f"Suppression threshold cannot be negative.")
+    runtime_data.cortical_viz_sup_threshold = visualization_threshold.visualization_threshold
diff --git a/src/api/routers/v1/training.py b/src/api/routers/v1/training.py
index c33346e60..ef4e6fba8 100644
--- a/src/api/routers/v1/training.py
+++ b/src/api/routers/v1/training.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 from fastapi import APIRouter, HTTPException
 
 from ...schemas import *
@@ -12,13 +28,13 @@
 # ######  Training Endpoints #######
 # ##################################
 
-@router.delete("/reset_game_stats")
-async def delete_game_stats_from_db():
+@router.delete("/reset_fitness_stats")
+async def delete_fitness_stats_from_db():
     """
-    Erases the game statistics from the database.
+    Erases the fitness statistics from the database.
     """
 
-    runtime_data.influxdb.drop_game_activity()
+    runtime_data.influxdb.drop_fitness_activity()
 
 
 @router.get("/shock/options")
@@ -94,17 +110,17 @@ async def training_report():
     return runtime_data.training_stats
 
 
-@router.get("/game_stats")
-async def fetch_game_stats():
+@router.get("/fitness_stats")
+async def fetch_fitness_stats():
     """
-    updates game stats
+    updates fitness stats
     """
-    return runtime_data.game_stats
+    return runtime_data.fitness_stats
 
 
-@router.put("/game_stats")
-async def capture_game_stats(game_stats: GameStats):
+@router.put("/fitness_stats")
+async def capture_fitness_stats(fitness_stats: FitnessStats):
     """
-    updates game stats
+    updates fitness stats
     """
-    runtime_data.training_stats = game_stats
+    runtime_data.training_stats = fitness_stats
diff --git a/src/api/schemas.py b/src/api/schemas.py
index fa316f802..665b26c7f 100644
--- a/src/api/schemas.py
+++ b/src/api/schemas.py
@@ -1,6 +1,8 @@
+from enum import Enum
 from typing import Optional, Literal, List
 from pydantic import BaseModel, Field, conint
 from fastapi.staticfiles import StaticFiles
+from src.inf import runtime_data
 
 
 class Launch(BaseModel):
@@ -33,8 +35,33 @@ class NewCorticalProperties(BaseModel):
     channel_count: Optional[int]
 
 
+class NewRegionProperties(BaseModel):
+    title: str
+    region_description: Optional[str]
+    parent_region_id: str = Field(default="root")
+    coordinates_2d: List[int] = Field(default=[0, 0])
+    coordinates_3d: List[int] = Field(default=[0, 0, 0])
+    areas: Optional[list] = Field(default=[])
+    regions: Optional[list] = Field(default=[])
+
+
+class UpdateRegionProperties(BaseModel):
+    region_id: str
+    title: Optional[str]
+    region_description: Optional[str]
+    parent_region_id: Optional[str]
+    coordinates_2d: Optional[list]
+    coordinates_3d: Optional[list]
+
+
+class RegionAssociation(BaseModel):
+    id: str = Field(default="")
+    new_region_id: str = Field(default="")
+
+
 class NewCustomCorticalProperties(BaseModel):
     cortical_name: str = Field(..., max_length=20, min_length=1)
+    parent_region_id: Optional[str] = Field(default="root")
     coordinates_2d: Optional[list] = [0, 0]
     coordinates_3d: List[int] = Field(default=[0, 0, 0])
     cortical_dimensions: List[int] = Field(default=[1, 1, 1])
@@ -75,31 +102,59 @@ class NewCustomCorticalProperties(BaseModel):
 
 class UpdateCorticalProperties(BaseModel):
     cortical_id: str = Field(None, max_length=6, min_length=6)
-    cortical_name: Optional[str]
-    cortical_neuron_per_vox_count: Optional[int]
-    cortical_visibility: Optional[bool]
-    coordinates_3d: Optional[list]
-    coordinates_2d: Optional[list]
-    cortical_dimensions: Optional[list]
-    cortical_synaptic_attractivity: Optional[int]
-    neuron_post_synaptic_potential: Optional[float]
-    neuron_post_synaptic_potential_max: Optional[float]
-    neuron_fire_threshold: Optional[float]
-    neuron_fire_threshold_increment: Optional[list]
-    neuron_firing_threshold_limit: Optional[float]
-    neuron_refractory_period: Optional[int]
-    neuron_leak_coefficient: Optional[float]
-    neuron_leak_variability: Optional[float]
-    neuron_consecutive_fire_count: Optional[int]
-    neuron_snooze_period: Optional[int]
-    neuron_degeneracy_coefficient: Optional[float]
-    neuron_psp_uniform_distribution: Optional[bool]
-    neuron_mp_charge_accumulation: Optional[bool]
-    neuron_mp_driven_psp: Optional[bool]
-    neuron_longterm_mem_threshold: Optional[int]
-    neuron_lifespan_growth_rate: Optional[int]
-    neuron_init_lifespan: Optional[int]
-    neuron_excitability: Optional[int]
+    cortical_name: Optional[str] = None
+    parent_region_id: Optional[str] = None
+    cortical_neuron_per_vox_count: Optional[int] = None
+    cortical_visibility: Optional[bool] = None
+    coordinates_3d: Optional[list] = None
+    coordinates_2d: Optional[list] = None
+    cortical_dimensions: Optional[list] = None
+    cortical_synaptic_attractivity: Optional[float] = None
+    neuron_post_synaptic_potential: Optional[float] = None
+    neuron_post_synaptic_potential_max: Optional[float] = None
+    neuron_fire_threshold: Optional[float] = None
+    neuron_fire_threshold_increment: Optional[list] = None
+    neuron_firing_threshold_limit: Optional[float] = None
+    neuron_refractory_period: Optional[int] = None
+    neuron_leak_coefficient: Optional[float] = None
+    neuron_leak_variability: Optional[float] = None
+    neuron_consecutive_fire_count: Optional[int] = None
+    neuron_snooze_period: Optional[int] = None
+    neuron_degeneracy_coefficient: Optional[float] = None
+    neuron_psp_uniform_distribution: Optional[bool] = None
+    neuron_mp_charge_accumulation: Optional[bool] = None
+    neuron_mp_driven_psp: Optional[bool] = None
+    neuron_longterm_mem_threshold: Optional[int] = None
+    neuron_lifespan_growth_rate: Optional[int] = None
+    neuron_init_lifespan: Optional[int] = None
+    neuron_excitability: Optional[float] = None
+
+
+class UpdateMultipleCorticalProperties(BaseModel):
+    cortical_id_list: list
+    parent_region_id: Optional[str] = None
+    cortical_neuron_per_vox_count: Optional[int] = None
+    cortical_visibility: Optional[bool] = None
+    cortical_dimensions: Optional[list] = None
+    cortical_synaptic_attractivity: Optional[float] = None
+    neuron_post_synaptic_potential: Optional[float] = None
+    neuron_post_synaptic_potential_max: Optional[float] = None
+    neuron_fire_threshold: Optional[float] = None
+    neuron_fire_threshold_increment: Optional[list] = None
+    neuron_firing_threshold_limit: Optional[float] = None
+    neuron_refractory_period: Optional[int] = None
+    neuron_leak_coefficient: Optional[float] = None
+    neuron_leak_variability: Optional[float] = None
+    neuron_consecutive_fire_count: Optional[int] = None
+    neuron_snooze_period: Optional[int] = None
+    neuron_degeneracy_coefficient: Optional[float] = None
+    neuron_psp_uniform_distribution: Optional[bool] = None
+    neuron_mp_charge_accumulation: Optional[bool] = None
+    neuron_mp_driven_psp: Optional[bool] = None
+    neuron_longterm_mem_threshold: Optional[int] = None
+    neuron_lifespan_growth_rate: Optional[int] = None
+    neuron_init_lifespan: Optional[int] = None
+    neuron_excitability: Optional[float] = None
 
 # class Network(BaseModel):
 #     godot_host: Optional[str] = runtime_data.parameters['Sockets']['godot_host_name']
@@ -114,6 +169,10 @@ class CorticalId(BaseModel):
     cortical_id: str
 
 
+class CorticalIdList(BaseModel):
+    cortical_id_list: list
+
+
 class CorticalName(BaseModel):
     cortical_name: str
 
@@ -122,6 +181,14 @@ class MorphologyName(BaseModel):
     morphology_name: str
 
 
+class VizSkipRate(BaseModel):
+    cortical_viz_skip_rate: int = runtime_data.cortical_viz_skip_rate
+
+
+class VizThreshold(BaseModel):
+    visualization_threshold: int = runtime_data.cortical_viz_sup_threshold
+
+
 class MorphologyInput(BaseModel):
     morphology_name: str
     morphology_type: str
@@ -134,6 +201,12 @@ class UpdateCorticalMappingProperties(BaseModel):
     mapping_string: list
 
 
+class SuggestedMapping(BaseModel):
+    brain_region_id: str
+    mapping_type: str
+    mapping_definitions: list = [{}]
+
+
 class CorticalAreaSrcDst(BaseModel):
     src_cortical_area: str
     dst_cortical_area: str
@@ -184,8 +257,12 @@ class Subscriber(BaseModel):
     subscriber_address: str
 
 
-class GameStats(BaseModel):
-    game_stats: dict
+class Id(BaseModel):
+    id: str
+
+
+class FitnessStats(BaseModel):
+    fitness_stats: dict
 
 
 class RobotController(BaseModel):
@@ -234,3 +311,9 @@ class AmalgamationRequest(BaseModel):
     genome_id: Optional[str] = None
     genome_title: Optional[str] = None
     genome_payload: Optional[dict] = None
+
+
+class RewiringMode(str, Enum):
+    rewire_all = "all"
+    rewire_system = "system"
+    rewire_none = "none"
diff --git a/src/evo/autopilot/brains/static_genome_1.json b/src/evo/autopilot/brains/static_genome_1.json
index ce72ddd39..fe33e1ef6 100644
--- a/src/evo/autopilot/brains/static_genome_1.json
+++ b/src/evo/autopilot/brains/static_genome_1.json
@@ -86,7 +86,7 @@
         "_____10c-i__inf-nx-___bbx-i": 3,
         "_____10c-i__inf-nx-___bby-i": 1,
         "_____10c-i__inf-nx-___bbz-i": 1,
-        "_____10c-i__inf-cx-synatt-i": 100,
+        "_____10c-i__inf-cx-synatt-f": 100,
         "_____10c-i__inf-cx-pstcr_-f": 5,
         "_____10c-i__inf-cx-pstcrm-f": 35,
         "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -110,7 +110,7 @@
         "_____10c-ishock-nx-___bbx-i": 1,
         "_____10c-ishock-nx-___bby-i": 1,
         "_____10c-ishock-nx-___bbz-i": 10,
-        "_____10c-ishock-cx-synatt-i": 100,
+        "_____10c-ishock-cx-synatt-f": 100,
         "_____10c-ishock-cx-pstcr_-f": 5,
         "_____10c-ishock-cx-pstcrm-f": 35,
         "_____10c-ishock-cx-plst_c-f": 0.05,
@@ -134,7 +134,7 @@
         "_____10c-ii_inf-nx-___bbx-i": 3,
         "_____10c-ii_inf-nx-___bby-i": 1,
         "_____10c-ii_inf-nx-___bbz-i": 1,
-        "_____10c-ii_inf-cx-synatt-i": 100,
+        "_____10c-ii_inf-cx-synatt-f": 100,
         "_____10c-ii_inf-cx-pstcr_-f": 5,
         "_____10c-ii_inf-cx-pstcrm-f": 35,
         "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -159,7 +159,7 @@
         "_____10c-i__pro-nx-___bbx-i": 1,
         "_____10c-i__pro-nx-___bby-i": 1,
         "_____10c-i__pro-nx-___bbz-i": 10,
-        "_____10c-i__pro-cx-synatt-i": 100,
+        "_____10c-i__pro-cx-synatt-f": 100,
         "_____10c-i__pro-cx-pstcr_-f": 5,
         "_____10c-i__pro-cx-pstcrm-f": 35,
         "_____10c-i__pro-cx-plst_c-f": 0.05,
@@ -183,7 +183,7 @@
         "_____10c-t__pro-nx-___bbx-i": 1,
         "_____10c-t__pro-nx-___bby-i": 1,
         "_____10c-t__pro-nx-___bbz-i": 10,
-        "_____10c-t__pro-cx-synatt-i": 20,
+        "_____10c-t__pro-cx-synatt-f": 20,
         "_____10c-t__pro-cx-pstcr_-f": 5,
         "_____10c-t__pro-cx-pstcrm-f": 35,
         "_____10c-t__pro-cx-plst_c-f": 0.05,
@@ -208,7 +208,7 @@
         "_____10c-i__bat-nx-___bbx-i": 1,
         "_____10c-i__bat-nx-___bby-i": 1,
         "_____10c-i__bat-nx-___bbz-i": 10,
-        "_____10c-i__bat-cx-synatt-i": 100,
+        "_____10c-i__bat-cx-synatt-f": 100,
         "_____10c-i__bat-cx-pstcr_-f": 5,
         "_____10c-i__bat-cx-pstcrm-f": 35,
         "_____10c-i__bat-cx-plst_c-f": 0.05,
@@ -230,7 +230,7 @@
         "_____10c-o__bat-nx-___bbx-i": 1,
         "_____10c-o__bat-nx-___bby-i": 1,
         "_____10c-o__bat-nx-___bbz-i": 10,
-        "_____10c-o__bat-cx-synatt-i": 100,
+        "_____10c-o__bat-cx-synatt-f": 100,
         "_____10c-o__bat-cx-pstcr_-f": 5,
         "_____10c-o__bat-cx-pstcrm-f": 35,
         "_____10c-o__bat-cx-plst_c-f": 0.05,
@@ -252,7 +252,7 @@
         "_____10c-o_init-nx-___bbx-i": 1,
         "_____10c-o_init-nx-___bby-i": 1,
         "_____10c-o_init-nx-___bbz-i": 1,
-        "_____10c-o_init-cx-synatt-i": 100,
+        "_____10c-o_init-cx-synatt-f": 100,
         "_____10c-o_init-cx-pstcr_-f": 5,
         "_____10c-o_init-cx-pstcrm-f": 35,
         "_____10c-o_init-cx-plst_c-f": 0.05,
@@ -274,7 +274,7 @@
         "_____10c-o__mot-nx-___bbx-i": 8,
         "_____10c-o__mot-nx-___bby-i": 1,
         "_____10c-o__mot-nx-___bbz-i": 10,
-        "_____10c-o__mot-cx-synatt-i": 100,
+        "_____10c-o__mot-cx-synatt-f": 100,
         "_____10c-o__mot-cx-pstcr_-f": 6,
         "_____10c-o__mot-cx-pstcrm-f": 35,
         "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -296,7 +296,7 @@
         "_____10c-o__ser-nx-___bbx-i": 4,
         "_____10c-o__ser-nx-___bby-i": 1,
         "_____10c-o__ser-nx-___bbz-i": 10,
-        "_____10c-o__ser-cx-synatt-i": 100,
+        "_____10c-o__ser-cx-synatt-f": 100,
         "_____10c-o__ser-cx-pstcr_-f": 3,
         "_____10c-o__ser-cx-pstcrm-f": 35,
         "_____10c-o__ser-cx-plst_c-f": 0.05,
diff --git a/src/evo/autopilot/brains/static_genome_2.json b/src/evo/autopilot/brains/static_genome_2.json
index 613b05030..030ff9f17 100644
--- a/src/evo/autopilot/brains/static_genome_2.json
+++ b/src/evo/autopilot/brains/static_genome_2.json
@@ -86,7 +86,7 @@
         "_____10c-i__inf-nx-___bbx-i": 3,
         "_____10c-i__inf-nx-___bby-i": 1,
         "_____10c-i__inf-nx-___bbz-i": 1,
-        "_____10c-i__inf-cx-synatt-i": 100,
+        "_____10c-i__inf-cx-synatt-f": 100,
         "_____10c-i__inf-cx-pstcr_-f": 5,
         "_____10c-i__inf-cx-pstcrm-f": 35,
         "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -110,7 +110,7 @@
         "_____10c-ishock-nx-___bbx-i": 1,
         "_____10c-ishock-nx-___bby-i": 1,
         "_____10c-ishock-nx-___bbz-i": 10,
-        "_____10c-ishock-cx-synatt-i": 100,
+        "_____10c-ishock-cx-synatt-f": 100,
         "_____10c-ishock-cx-pstcr_-f": 5,
         "_____10c-ishock-cx-pstcrm-f": 35,
         "_____10c-ishock-cx-plst_c-f": 0.05,
@@ -134,7 +134,7 @@
         "_____10c-ii_inf-nx-___bbx-i": 3,
         "_____10c-ii_inf-nx-___bby-i": 1,
         "_____10c-ii_inf-nx-___bbz-i": 1,
-        "_____10c-ii_inf-cx-synatt-i": 100,
+        "_____10c-ii_inf-cx-synatt-f": 100,
         "_____10c-ii_inf-cx-pstcr_-f": 5,
         "_____10c-ii_inf-cx-pstcrm-f": 35,
         "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -159,7 +159,7 @@
         "_____10c-i__pro-nx-___bbx-i": 1,
         "_____10c-i__pro-nx-___bby-i": 1,
         "_____10c-i__pro-nx-___bbz-i": 10,
-        "_____10c-i__pro-cx-synatt-i": 100,
+        "_____10c-i__pro-cx-synatt-f": 100,
         "_____10c-i__pro-cx-pstcr_-f": 5,
         "_____10c-i__pro-cx-pstcrm-f": 35,
         "_____10c-i__pro-cx-plst_c-f": 0.05,
@@ -183,7 +183,7 @@
         "_____10c-t__pro-nx-___bbx-i": 1,
         "_____10c-t__pro-nx-___bby-i": 1,
         "_____10c-t__pro-nx-___bbz-i": 10,
-        "_____10c-t__pro-cx-synatt-i": 20,
+        "_____10c-t__pro-cx-synatt-f": 20,
         "_____10c-t__pro-cx-pstcr_-f": 5,
         "_____10c-t__pro-cx-pstcrm-f": 35,
         "_____10c-t__pro-cx-plst_c-f": 0.05,
@@ -208,7 +208,7 @@
         "_____10c-i__bat-nx-___bbx-i": 1,
         "_____10c-i__bat-nx-___bby-i": 1,
         "_____10c-i__bat-nx-___bbz-i": 10,
-        "_____10c-i__bat-cx-synatt-i": 100,
+        "_____10c-i__bat-cx-synatt-f": 100,
         "_____10c-i__bat-cx-pstcr_-f": 5,
         "_____10c-i__bat-cx-pstcrm-f": 35,
         "_____10c-i__bat-cx-plst_c-f": 0.05,
@@ -230,7 +230,7 @@
         "_____10c-o__bat-nx-___bbx-i": 1,
         "_____10c-o__bat-nx-___bby-i": 1,
         "_____10c-o__bat-nx-___bbz-i": 10,
-        "_____10c-o__bat-cx-synatt-i": 100,
+        "_____10c-o__bat-cx-synatt-f": 100,
         "_____10c-o__bat-cx-pstcr_-f": 5,
         "_____10c-o__bat-cx-pstcrm-f": 35,
         "_____10c-o__bat-cx-plst_c-f": 0.05,
@@ -252,7 +252,7 @@
         "_____10c-o_init-nx-___bbx-i": 1,
         "_____10c-o_init-nx-___bby-i": 1,
         "_____10c-o_init-nx-___bbz-i": 1,
-        "_____10c-o_init-cx-synatt-i": 100,
+        "_____10c-o_init-cx-synatt-f": 100,
         "_____10c-o_init-cx-pstcr_-f": 5,
         "_____10c-o_init-cx-pstcrm-f": 35,
         "_____10c-o_init-cx-plst_c-f": 0.05,
@@ -274,7 +274,7 @@
         "_____10c-o__mot-nx-___bbx-i": 8,
         "_____10c-o__mot-nx-___bby-i": 1,
         "_____10c-o__mot-nx-___bbz-i": 10,
-        "_____10c-o__mot-cx-synatt-i": 100,
+        "_____10c-o__mot-cx-synatt-f": 100,
         "_____10c-o__mot-cx-pstcr_-f": 6,
         "_____10c-o__mot-cx-pstcrm-f": 35,
         "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -296,7 +296,7 @@
         "_____10c-o__ser-nx-___bbx-i": 4,
         "_____10c-o__ser-nx-___bby-i": 1,
         "_____10c-o__ser-nx-___bbz-i": 10,
-        "_____10c-o__ser-cx-synatt-i": 100,
+        "_____10c-o__ser-cx-synatt-f": 100,
         "_____10c-o__ser-cx-pstcr_-f": 3,
         "_____10c-o__ser-cx-pstcrm-f": 35,
         "_____10c-o__ser-cx-plst_c-f": 0.05,
diff --git a/src/evo/circuits/brightness_change_detection.json b/src/evo/circuits/brightness_change_detection.json
index 22ed0a41a..5c7079c31 100644
--- a/src/evo/circuits/brightness_change_detection.json
+++ b/src/evo/circuits/brightness_change_detection.json
@@ -1293,7 +1293,7 @@
       "_____10c-i__inf-nx-___bbx-i": 3,
       "_____10c-i__inf-nx-___bby-i": 1,
       "_____10c-i__inf-nx-___bbz-i": 1,
-      "_____10c-i__inf-cx-synatt-i": 100,
+      "_____10c-i__inf-cx-synatt-f": 100,
       "_____10c-i__inf-cx-pstcr_-f": 80,
       "_____10c-i__inf-cx-pstcrm-f": 100,
       "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -1337,7 +1337,7 @@
       "_____10c-ii_inf-nx-___bbx-i": 3,
       "_____10c-ii_inf-nx-___bby-i": 1,
       "_____10c-ii_inf-nx-___bbz-i": 1,
-      "_____10c-ii_inf-cx-synatt-i": 100,
+      "_____10c-ii_inf-cx-synatt-f": 100,
       "_____10c-ii_inf-cx-pstcr_-f": 80,
       "_____10c-ii_inf-cx-pstcrm-f": 100,
       "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -1381,7 +1381,7 @@
       "_____10c-t__vis-nx-___bbx-i": 8,
       "_____10c-t__vis-nx-___bby-i": 1,
       "_____10c-t__vis-nx-___bbz-i": 1,
-      "_____10c-t__vis-cx-synatt-i": 100,
+      "_____10c-t__vis-cx-synatt-f": 100,
       "_____10c-t__vis-cx-pstcr_-f": 50,
       "_____10c-t__vis-cx-pstcrm-f": 100,
       "_____10c-t__vis-cx-plst_c-f": 0.05,
@@ -1498,7 +1498,7 @@
       "_____10c-is_inc-nx-___bbx-i": 4,
       "_____10c-is_inc-nx-___bby-i": 2,
       "_____10c-is_inc-nx-___bbz-i": 1,
-      "_____10c-is_inc-cx-synatt-i": 100,
+      "_____10c-is_inc-cx-synatt-f": 100,
       "_____10c-is_inc-cx-pstcr_-f": 50,
       "_____10c-is_inc-cx-pstcrm-f": 200,
       "_____10c-is_inc-cx-plst_c-f": 0.05,
@@ -1545,7 +1545,7 @@
       "_____10c-im_inc-nx-___bbx-i": 4,
       "_____10c-im_inc-nx-___bby-i": 2,
       "_____10c-im_inc-nx-___bbz-i": 1,
-      "_____10c-im_inc-cx-synatt-i": 100,
+      "_____10c-im_inc-cx-synatt-f": 100,
       "_____10c-im_inc-cx-pstcr_-f": 50,
       "_____10c-im_inc-cx-pstcrm-f": 200,
       "_____10c-im_inc-cx-plst_c-f": 0.05,
@@ -1592,7 +1592,7 @@
       "_____10c-il_inc-nx-___bbx-i": 4,
       "_____10c-il_inc-nx-___bby-i": 2,
       "_____10c-il_inc-nx-___bbz-i": 1,
-      "_____10c-il_inc-cx-synatt-i": 100,
+      "_____10c-il_inc-cx-synatt-f": 100,
       "_____10c-il_inc-cx-pstcr_-f": 50,
       "_____10c-il_inc-cx-pstcrm-f": 200,
       "_____10c-il_inc-cx-plst_c-f": 0.05,
@@ -1639,7 +1639,7 @@
       "_____10c-ds_inc-nx-___bbx-i": 3,
       "_____10c-ds_inc-nx-___bby-i": 1,
       "_____10c-ds_inc-nx-___bbz-i": 1,
-      "_____10c-ds_inc-cx-synatt-i": 100,
+      "_____10c-ds_inc-cx-synatt-f": 100,
       "_____10c-ds_inc-cx-pstcr_-f": 100,
       "_____10c-ds_inc-cx-pstcrm-f": 200,
       "_____10c-ds_inc-cx-plst_c-f": 0.05,
@@ -1660,7 +1660,7 @@
       "_____10c-dm_inc-nx-___bbx-i": 3,
       "_____10c-dm_inc-nx-___bby-i": 1,
       "_____10c-dm_inc-nx-___bbz-i": 1,
-      "_____10c-dm_inc-cx-synatt-i": 100,
+      "_____10c-dm_inc-cx-synatt-f": 100,
       "_____10c-dm_inc-cx-pstcr_-f": 100,
       "_____10c-dm_inc-cx-pstcrm-f": 200,
       "_____10c-dm_inc-cx-plst_c-f": 0.05,
@@ -1681,7 +1681,7 @@
       "_____10c-dl_inc-nx-___bbx-i": 1,
       "_____10c-dl_inc-nx-___bby-i": 1,
       "_____10c-dl_inc-nx-___bbz-i": 1,
-      "_____10c-dl_inc-cx-synatt-i": 100,
+      "_____10c-dl_inc-cx-synatt-f": 100,
       "_____10c-dl_inc-cx-pstcr_-f": 50,
       "_____10c-dl_inc-cx-pstcrm-f": 200,
       "_____10c-dl_inc-cx-plst_c-f": 0.05,
@@ -1716,7 +1716,7 @@
       "_____10c-is_dcr-nx-___bbx-i": 4,
       "_____10c-is_dcr-nx-___bby-i": 2,
       "_____10c-is_dcr-nx-___bbz-i": 1,
-      "_____10c-is_dcr-cx-synatt-i": 100,
+      "_____10c-is_dcr-cx-synatt-f": 100,
       "_____10c-is_dcr-cx-pstcr_-f": 50,
       "_____10c-is_dcr-cx-pstcrm-f": 200,
       "_____10c-is_dcr-cx-plst_c-f": 0.05,
@@ -1763,7 +1763,7 @@
       "_____10c-im_dcr-nx-___bbx-i": 4,
       "_____10c-im_dcr-nx-___bby-i": 2,
       "_____10c-im_dcr-nx-___bbz-i": 1,
-      "_____10c-im_dcr-cx-synatt-i": 100,
+      "_____10c-im_dcr-cx-synatt-f": 100,
       "_____10c-im_dcr-cx-pstcr_-f": 50,
       "_____10c-im_dcr-cx-pstcrm-f": 200,
       "_____10c-im_dcr-cx-plst_c-f": 0.05,
@@ -1810,7 +1810,7 @@
       "_____10c-il_dcr-nx-___bbx-i": 4,
       "_____10c-il_dcr-nx-___bby-i": 2,
       "_____10c-il_dcr-nx-___bbz-i": 1,
-      "_____10c-il_dcr-cx-synatt-i": 100,
+      "_____10c-il_dcr-cx-synatt-f": 100,
       "_____10c-il_dcr-cx-pstcr_-f": 50,
       "_____10c-il_dcr-cx-pstcrm-f": 200,
       "_____10c-il_dcr-cx-plst_c-f": 0.05,
@@ -1857,7 +1857,7 @@
       "_____10c-ds_dcr-nx-___bbx-i": 3,
       "_____10c-ds_dcr-nx-___bby-i": 1,
       "_____10c-ds_dcr-nx-___bbz-i": 1,
-      "_____10c-ds_dcr-cx-synatt-i": 100,
+      "_____10c-ds_dcr-cx-synatt-f": 100,
       "_____10c-ds_dcr-cx-pstcr_-f": 100,
       "_____10c-ds_dcr-cx-pstcrm-f": 200,
       "_____10c-ds_dcr-cx-plst_c-f": 0.05,
@@ -1878,7 +1878,7 @@
       "_____10c-dm_dcr-nx-___bbx-i": 3,
       "_____10c-dm_dcr-nx-___bby-i": 1,
       "_____10c-dm_dcr-nx-___bbz-i": 1,
-      "_____10c-dm_dcr-cx-synatt-i": 100,
+      "_____10c-dm_dcr-cx-synatt-f": 100,
       "_____10c-dm_dcr-cx-pstcr_-f": 100,
       "_____10c-dm_dcr-cx-pstcrm-f": 200,
       "_____10c-dm_dcr-cx-plst_c-f": 0.05,
@@ -1899,7 +1899,7 @@
       "_____10c-dl_dcr-nx-___bbx-i": 1,
       "_____10c-dl_dcr-nx-___bby-i": 1,
       "_____10c-dl_dcr-nx-___bbz-i": 1,
-      "_____10c-dl_dcr-cx-synatt-i": 100,
+      "_____10c-dl_dcr-cx-synatt-f": 100,
       "_____10c-dl_dcr-cx-pstcr_-f": 100,
       "_____10c-dl_dcr-cx-pstcrm-f": 200,
       "_____10c-dl_dcr-cx-plst_c-f": 0.05,
@@ -1921,7 +1921,7 @@
       "_____10c-_steer-nx-___bbx-i": 8,
       "_____10c-_steer-nx-___bby-i": 2,
       "_____10c-_steer-nx-___bbz-i": 1,
-      "_____10c-_steer-cx-synatt-i": 100,
+      "_____10c-_steer-cx-synatt-f": 100,
       "_____10c-_steer-cx-pstcr_-f": 90,
       "_____10c-_steer-cx-pstcrm-f": 100,
       "_____10c-_steer-cx-plst_c-f": 0.05,
@@ -1979,7 +1979,7 @@
       "_____10c-c___tb-nx-___bbx-i": 1,
       "_____10c-c___tb-nx-___bby-i": 1,
       "_____10c-c___tb-nx-___bbz-i": 1,
-      "_____10c-c___tb-cx-synatt-i": 100,
+      "_____10c-c___tb-cx-synatt-f": 100,
       "_____10c-c___tb-cx-pstcr_-f": 50,
       "_____10c-c___tb-cx-pstcrm-f": 100,
       "_____10c-c___tb-cx-plst_c-f": 0.05,
@@ -2014,7 +2014,7 @@
       "_____10c-c___ab-nx-___bbx-i": 1,
       "_____10c-c___ab-nx-___bby-i": 1,
       "_____10c-c___ab-nx-___bbz-i": 1,
-      "_____10c-c___ab-cx-synatt-i": 100,
+      "_____10c-c___ab-cx-synatt-f": 100,
       "_____10c-c___ab-cx-pstcr_-f": 50,
       "_____10c-c___ab-cx-pstcrm-f": 100,
       "_____10c-c___ab-cx-plst_c-f": 0.05,
@@ -2049,7 +2049,7 @@
       "_____10c-_right-nx-___bbx-i": 1,
       "_____10c-_right-nx-___bby-i": 1,
       "_____10c-_right-nx-___bbz-i": 1,
-      "_____10c-_right-cx-synatt-i": 100,
+      "_____10c-_right-cx-synatt-f": 100,
       "_____10c-_right-cx-pstcr_-f": 100,
       "_____10c-_right-cx-pstcrm-f": 200,
       "_____10c-_right-cx-plst_c-f": 0.05,
@@ -2083,7 +2083,7 @@
       "_____10c-__left-nx-___bbx-i": 1,
       "_____10c-__left-nx-___bby-i": 1,
       "_____10c-__left-nx-___bbz-i": 1,
-      "_____10c-__left-cx-synatt-i": 100,
+      "_____10c-__left-cx-synatt-f": 100,
       "_____10c-__left-cx-pstcr_-f": 100,
       "_____10c-__left-cx-pstcrm-f": 200,
       "_____10c-__left-cx-plst_c-f": 0.05,
@@ -2117,7 +2117,7 @@
       "_____10c-__forw-nx-___bbx-i": 1,
       "_____10c-__forw-nx-___bby-i": 1,
       "_____10c-__forw-nx-___bbz-i": 1,
-      "_____10c-__forw-cx-synatt-i": 100,
+      "_____10c-__forw-cx-synatt-f": 100,
       "_____10c-__forw-cx-pstcr_-f": 100,
       "_____10c-__forw-cx-pstcrm-f": 200,
       "_____10c-__forw-cx-plst_c-f": 0.05,
@@ -2151,7 +2151,7 @@
       "_____10c-__back-nx-___bbx-i": 3,
       "_____10c-__back-nx-___bby-i": 1,
       "_____10c-__back-nx-___bbz-i": 1,
-      "_____10c-__back-cx-synatt-i": 100,
+      "_____10c-__back-cx-synatt-f": 100,
       "_____10c-__back-cx-pstcr_-f": 100,
       "_____10c-__back-cx-pstcrm-f": 200,
       "_____10c-__back-cx-plst_c-f": 0.05,
@@ -2198,7 +2198,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 6,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
diff --git a/src/evo/circuits/motor_pathway_m1.json b/src/evo/circuits/motor_pathway_m1.json
index 84e9f8060..aad9c0caf 100644
--- a/src/evo/circuits/motor_pathway_m1.json
+++ b/src/evo/circuits/motor_pathway_m1.json
@@ -1497,7 +1497,7 @@
    "blueprint": {
       "_____10c-___pwr-cx-subgrp-t": "",
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.01,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35,
@@ -1521,7 +1521,7 @@
       "_____10c-___pwr-nx-ftincx-f": 0,
       "_____10c-___pwr-nx-ftincy-f": 0,
       "_____10c-___pwr-nx-ftincz-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
+      "_____10c-___pwr-nx-fthlim-f": 0,
       "_____10c-___pwr-nx-mp_acc-b": true,
       "_____10c-___pwr-nx-mp_psp-b": false,
       "_____10c-___pwr-cx-memory-b": false,
@@ -1532,7 +1532,7 @@
       "_____10c-___pwr-cx-_group-t": "CORE",
       "_____10c-o__mot-cx-subgrp-t": "",
       "_____10c-o__mot-cx-_n_cnt-i": 1,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-de_gen-f": 0,
       "_____10c-o__mot-cx-pspuni-b": false,
       "_____10c-o__mot-nx-pstcrm-f": 35,
@@ -1556,7 +1556,7 @@
       "_____10c-o__mot-nx-ftincx-f": 0,
       "_____10c-o__mot-nx-ftincy-f": 0,
       "_____10c-o__mot-nx-ftincz-f": 0,
-      "_____10c-o__mot-nx-fthlim-i": 0,
+      "_____10c-o__mot-nx-fthlim-f": 0,
       "_____10c-o__mot-nx-mp_acc-b": false,
       "_____10c-o__mot-nx-mp_psp-b": false,
       "_____10c-o__mot-cx-memory-b": false,
@@ -1567,7 +1567,7 @@
       "_____10c-o__mot-cx-_group-t": "OPU",
       "_____10c-m__lef-cx-subgrp-t": "",
       "_____10c-m__lef-cx-_n_cnt-i": 1,
-      "_____10c-m__lef-cx-synatt-i": 100,
+      "_____10c-m__lef-cx-synatt-f": 100,
       "_____10c-m__lef-cx-de_gen-f": 0,
       "_____10c-m__lef-cx-pspuni-b": true,
       "_____10c-m__lef-nx-pstcrm-f": 35,
@@ -1591,7 +1591,7 @@
       "_____10c-m__lef-nx-ftincx-f": 0,
       "_____10c-m__lef-nx-ftincy-f": 0,
       "_____10c-m__lef-nx-ftincz-f": 0,
-      "_____10c-m__lef-nx-fthlim-i": 0,
+      "_____10c-m__lef-nx-fthlim-f": 0,
       "_____10c-m__lef-nx-mp_acc-b": true,
       "_____10c-m__lef-nx-mp_psp-b": false,
       "_____10c-m__lef-cx-memory-b": false,
@@ -1602,7 +1602,7 @@
       "_____10c-m__lef-cx-_group-t": "CUSTOM",
       "_____10c-m__rig-cx-subgrp-t": "",
       "_____10c-m__rig-cx-_n_cnt-i": 1,
-      "_____10c-m__rig-cx-synatt-i": 100,
+      "_____10c-m__rig-cx-synatt-f": 100,
       "_____10c-m__rig-cx-de_gen-f": 0,
       "_____10c-m__rig-cx-pspuni-b": true,
       "_____10c-m__rig-nx-pstcrm-f": 35,
@@ -1626,7 +1626,7 @@
       "_____10c-m__rig-nx-ftincx-f": 0,
       "_____10c-m__rig-nx-ftincy-f": 0,
       "_____10c-m__rig-nx-ftincz-f": 0,
-      "_____10c-m__rig-nx-fthlim-i": 0,
+      "_____10c-m__rig-nx-fthlim-f": 0,
       "_____10c-m__rig-nx-mp_acc-b": true,
       "_____10c-m__rig-nx-mp_psp-b": false,
       "_____10c-m__rig-cx-memory-b": false,
@@ -1637,7 +1637,7 @@
       "_____10c-m__rig-cx-_group-t": "CUSTOM",
       "_____10c-m__for-cx-subgrp-t": "",
       "_____10c-m__for-cx-_n_cnt-i": 1,
-      "_____10c-m__for-cx-synatt-i": 100,
+      "_____10c-m__for-cx-synatt-f": 100,
       "_____10c-m__for-cx-de_gen-f": 0,
       "_____10c-m__for-cx-pspuni-b": true,
       "_____10c-m__for-nx-pstcrm-f": 35,
@@ -1722,7 +1722,7 @@
       "_____10c-m__for-nx-ftincx-f": 0,
       "_____10c-m__for-nx-ftincy-f": 0,
       "_____10c-m__for-nx-ftincz-f": 0,
-      "_____10c-m__for-nx-fthlim-i": 0,
+      "_____10c-m__for-nx-fthlim-f": 0,
       "_____10c-m__for-nx-mp_acc-b": true,
       "_____10c-m__for-nx-mp_psp-b": false,
       "_____10c-m__for-cx-memory-b": false,
@@ -1733,7 +1733,7 @@
       "_____10c-m__for-cx-_group-t": "CUSTOM",
       "_____10c-m__bac-cx-subgrp-t": "",
       "_____10c-m__bac-cx-_n_cnt-i": 1,
-      "_____10c-m__bac-cx-synatt-i": 100,
+      "_____10c-m__bac-cx-synatt-f": 100,
       "_____10c-m__bac-cx-de_gen-f": 0,
       "_____10c-m__bac-cx-pspuni-b": true,
       "_____10c-m__bac-nx-pstcrm-f": 35,
@@ -1818,7 +1818,7 @@
       "_____10c-m__bac-nx-ftincx-f": 0,
       "_____10c-m__bac-nx-ftincy-f": 0,
       "_____10c-m__bac-nx-ftincz-f": 0,
-      "_____10c-m__bac-nx-fthlim-i": 0,
+      "_____10c-m__bac-nx-fthlim-f": 0,
       "_____10c-m__bac-nx-mp_acc-b": true,
       "_____10c-m__bac-nx-mp_psp-b": false,
       "_____10c-m__bac-cx-memory-b": false,
@@ -1829,7 +1829,7 @@
       "_____10c-m__bac-cx-_group-t": "CUSTOM",
       "_____10c-CRSMot-cx-subgrp-t": "",
       "_____10c-CRSMot-cx-_n_cnt-i": 1,
-      "_____10c-CRSMot-cx-synatt-i": 100,
+      "_____10c-CRSMot-cx-synatt-f": 100,
       "_____10c-CRSMot-cx-de_gen-f": 0,
       "_____10c-CRSMot-cx-pspuni-b": false,
       "_____10c-CRSMot-nx-pstcrm-f": 99999,
@@ -1869,7 +1869,7 @@
       "_____10c-CRSMot-nx-ftincx-f": 0,
       "_____10c-CRSMot-nx-ftincy-f": 0,
       "_____10c-CRSMot-nx-ftincz-f": 0,
-      "_____10c-CRSMot-nx-fthlim-i": 0,
+      "_____10c-CRSMot-nx-fthlim-f": 0,
       "_____10c-CRSMot-nx-mp_acc-b": false,
       "_____10c-CRSMot-nx-mp_psp-b": false,
       "_____10c-CRSMot-cx-memory-b": false,
@@ -1880,7 +1880,7 @@
       "_____10c-CRSMot-cx-_group-t": "CUSTOM",
       "_____10c-CIHMot-cx-subgrp-t": "",
       "_____10c-CIHMot-cx-_n_cnt-i": 1,
-      "_____10c-CIHMot-cx-synatt-i": 100,
+      "_____10c-CIHMot-cx-synatt-f": 100,
       "_____10c-CIHMot-cx-de_gen-f": 0,
       "_____10c-CIHMot-cx-pspuni-b": false,
       "_____10c-CIHMot-nx-pstcrm-f": 99999,
@@ -1920,7 +1920,7 @@
       "_____10c-CIHMot-nx-ftincx-f": 0,
       "_____10c-CIHMot-nx-ftincy-f": 0,
       "_____10c-CIHMot-nx-ftincz-f": 0,
-      "_____10c-CIHMot-nx-fthlim-i": 0,
+      "_____10c-CIHMot-nx-fthlim-f": 0,
       "_____10c-CIHMot-nx-mp_acc-b": false,
       "_____10c-CIHMot-nx-mp_psp-b": false,
       "_____10c-CIHMot-cx-memory-b": false,
@@ -1931,7 +1931,7 @@
       "_____10c-CIHMot-cx-_group-t": "CUSTOM",
       "_____10c-CKQM2_-cx-subgrp-t": "",
       "_____10c-CKQM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKQM2_-cx-synatt-i": 100,
+      "_____10c-CKQM2_-cx-synatt-f": 100,
       "_____10c-CKQM2_-cx-de_gen-f": 0,
       "_____10c-CKQM2_-cx-pspuni-b": false,
       "_____10c-CKQM2_-nx-pstcrm-f": 99999,
@@ -1971,7 +1971,7 @@
       "_____10c-CKQM2_-nx-ftincx-f": 0,
       "_____10c-CKQM2_-nx-ftincy-f": 0,
       "_____10c-CKQM2_-nx-ftincz-f": 0,
-      "_____10c-CKQM2_-nx-fthlim-i": 0,
+      "_____10c-CKQM2_-nx-fthlim-f": 0,
       "_____10c-CKQM2_-nx-mp_acc-b": false,
       "_____10c-CKQM2_-nx-mp_psp-b": false,
       "_____10c-CKQM2_-cx-memory-b": false,
@@ -1982,7 +1982,7 @@
       "_____10c-CKQM2_-cx-_group-t": "CUSTOM",
       "_____10c-CKYM2_-cx-subgrp-t": "",
       "_____10c-CKYM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKYM2_-cx-synatt-i": 100,
+      "_____10c-CKYM2_-cx-synatt-f": 100,
       "_____10c-CKYM2_-cx-de_gen-f": 0,
       "_____10c-CKYM2_-cx-pspuni-b": false,
       "_____10c-CKYM2_-nx-pstcrm-f": 99999,
@@ -2022,7 +2022,7 @@
       "_____10c-CKYM2_-nx-ftincx-f": 0,
       "_____10c-CKYM2_-nx-ftincy-f": 0,
       "_____10c-CKYM2_-nx-ftincz-f": 0,
-      "_____10c-CKYM2_-nx-fthlim-i": 0,
+      "_____10c-CKYM2_-nx-fthlim-f": 0,
       "_____10c-CKYM2_-nx-mp_acc-b": false,
       "_____10c-CKYM2_-nx-mp_psp-b": false,
       "_____10c-CKYM2_-cx-memory-b": false,
@@ -2033,7 +2033,7 @@
       "_____10c-CKYM2_-cx-_group-t": "CUSTOM",
       "_____10c-CO4M3_-cx-subgrp-t": "",
       "_____10c-CO4M3_-cx-_n_cnt-i": 1,
-      "_____10c-CO4M3_-cx-synatt-i": 100,
+      "_____10c-CO4M3_-cx-synatt-f": 100,
       "_____10c-CO4M3_-cx-de_gen-f": 0,
       "_____10c-CO4M3_-cx-pspuni-b": false,
       "_____10c-CO4M3_-nx-pstcrm-f": 99999,
@@ -2073,7 +2073,7 @@
       "_____10c-CO4M3_-nx-ftincx-f": 0,
       "_____10c-CO4M3_-nx-ftincy-f": 0,
       "_____10c-CO4M3_-nx-ftincz-f": 0,
-      "_____10c-CO4M3_-nx-fthlim-i": 0,
+      "_____10c-CO4M3_-nx-fthlim-f": 0,
       "_____10c-CO4M3_-nx-mp_acc-b": false,
       "_____10c-CO4M3_-nx-mp_psp-b": false,
       "_____10c-CO4M3_-cx-memory-b": false,
@@ -2084,7 +2084,7 @@
       "_____10c-CO4M3_-cx-_group-t": "CUSTOM",
       "_____10c-CJWM3_-cx-subgrp-t": "",
       "_____10c-CJWM3_-cx-_n_cnt-i": 1,
-      "_____10c-CJWM3_-cx-synatt-i": 100,
+      "_____10c-CJWM3_-cx-synatt-f": 100,
       "_____10c-CJWM3_-cx-de_gen-f": 0,
       "_____10c-CJWM3_-cx-pspuni-b": false,
       "_____10c-CJWM3_-nx-pstcrm-f": 99999,
@@ -2124,7 +2124,7 @@
       "_____10c-CJWM3_-nx-ftincx-f": 0,
       "_____10c-CJWM3_-nx-ftincy-f": 0,
       "_____10c-CJWM3_-nx-ftincz-f": 0,
-      "_____10c-CJWM3_-nx-fthlim-i": 0,
+      "_____10c-CJWM3_-nx-fthlim-f": 0,
       "_____10c-CJWM3_-nx-mp_acc-b": false,
       "_____10c-CJWM3_-nx-mp_psp-b": false,
       "_____10c-CJWM3_-cx-memory-b": false,
@@ -2135,7 +2135,7 @@
       "_____10c-CJWM3_-cx-_group-t": "CUSTOM",
       "_____10c-CTGM4_-cx-subgrp-t": "",
       "_____10c-CTGM4_-cx-_n_cnt-i": 1,
-      "_____10c-CTGM4_-cx-synatt-i": 100,
+      "_____10c-CTGM4_-cx-synatt-f": 100,
       "_____10c-CTGM4_-cx-de_gen-f": 0,
       "_____10c-CTGM4_-cx-pspuni-b": false,
       "_____10c-CTGM4_-nx-pstcrm-f": 99999,
@@ -2175,7 +2175,7 @@
       "_____10c-CTGM4_-nx-ftincx-f": 0,
       "_____10c-CTGM4_-nx-ftincy-f": 0,
       "_____10c-CTGM4_-nx-ftincz-f": 0,
-      "_____10c-CTGM4_-nx-fthlim-i": 0,
+      "_____10c-CTGM4_-nx-fthlim-f": 0,
       "_____10c-CTGM4_-nx-mp_acc-b": false,
       "_____10c-CTGM4_-nx-mp_psp-b": false,
       "_____10c-CTGM4_-cx-memory-b": false,
@@ -2186,7 +2186,7 @@
       "_____10c-CTGM4_-cx-_group-t": "CUSTOM",
       "_____10c-CLWM4_-cx-subgrp-t": "",
       "_____10c-CLWM4_-cx-_n_cnt-i": 1,
-      "_____10c-CLWM4_-cx-synatt-i": 100,
+      "_____10c-CLWM4_-cx-synatt-f": 100,
       "_____10c-CLWM4_-cx-de_gen-f": 0,
       "_____10c-CLWM4_-cx-pspuni-b": false,
       "_____10c-CLWM4_-nx-pstcrm-f": 99999,
@@ -2226,7 +2226,7 @@
       "_____10c-CLWM4_-nx-ftincx-f": 0,
       "_____10c-CLWM4_-nx-ftincy-f": 0,
       "_____10c-CLWM4_-nx-ftincz-f": 0,
-      "_____10c-CLWM4_-nx-fthlim-i": 0,
+      "_____10c-CLWM4_-nx-fthlim-f": 0,
       "_____10c-CLWM4_-nx-mp_acc-b": false,
       "_____10c-CLWM4_-nx-mp_psp-b": false,
       "_____10c-CLWM4_-cx-memory-b": false,
diff --git a/src/evo/circuits/visual_pathway_v1.json b/src/evo/circuits/visual_pathway_v1.json
index ea1dbfe83..4ef98c901 100644
--- a/src/evo/circuits/visual_pathway_v1.json
+++ b/src/evo/circuits/visual_pathway_v1.json
@@ -1497,7 +1497,7 @@
    "blueprint": {
       "_____10c-___pwr-cx-subgrp-t": "",
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.01,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35,
@@ -1521,7 +1521,7 @@
       "_____10c-___pwr-nx-ftincx-f": 0,
       "_____10c-___pwr-nx-ftincy-f": 0,
       "_____10c-___pwr-nx-ftincz-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
+      "_____10c-___pwr-nx-fthlim-f": 0,
       "_____10c-___pwr-nx-mp_acc-b": true,
       "_____10c-___pwr-nx-mp_psp-b": false,
       "_____10c-___pwr-cx-memory-b": false,
@@ -1532,7 +1532,7 @@
       "_____10c-___pwr-cx-_group-t": "CORE",
       "_____10c-iv00_C-cx-subgrp-t": "",
       "_____10c-iv00_C-cx-_n_cnt-i": 1,
-      "_____10c-iv00_C-cx-synatt-i": 100,
+      "_____10c-iv00_C-cx-synatt-f": 100,
       "_____10c-iv00_C-cx-de_gen-f": 0.0,
       "_____10c-iv00_C-cx-pspuni-b": false,
       "_____10c-iv00_C-nx-pstcrm-f": 100.0,
@@ -1556,7 +1556,7 @@
       "_____10c-iv00_C-nx-ftincx-f": 0,
       "_____10c-iv00_C-nx-ftincy-f": 0,
       "_____10c-iv00_C-nx-ftincz-f": 0,
-      "_____10c-iv00_C-nx-fthlim-i": 0,
+      "_____10c-iv00_C-nx-fthlim-f": 0,
       "_____10c-iv00_C-nx-mp_acc-b": true,
       "_____10c-iv00_C-nx-mp_psp-b": false,
       "_____10c-iv00_C-cx-memory-b": false,
@@ -1567,7 +1567,7 @@
       "_____10c-iv00_C-cx-_group-t": "IPU",
       "_____10c-iv00BL-cx-subgrp-t": "",
       "_____10c-iv00BL-cx-_n_cnt-i": 1,
-      "_____10c-iv00BL-cx-synatt-i": 100,
+      "_____10c-iv00BL-cx-synatt-f": 100,
       "_____10c-iv00BL-cx-de_gen-f": 0,
       "_____10c-iv00BL-cx-pspuni-b": false,
       "_____10c-iv00BL-nx-pstcrm-f": 35,
@@ -1591,7 +1591,7 @@
       "_____10c-iv00BL-nx-ftincx-f": 0,
       "_____10c-iv00BL-nx-ftincy-f": 0,
       "_____10c-iv00BL-nx-ftincz-f": 0,
-      "_____10c-iv00BL-nx-fthlim-i": 0,
+      "_____10c-iv00BL-nx-fthlim-f": 0,
       "_____10c-iv00BL-nx-mp_acc-b": true,
       "_____10c-iv00BL-nx-mp_psp-b": false,
       "_____10c-iv00BL-cx-memory-b": false,
@@ -1602,7 +1602,7 @@
       "_____10c-iv00BL-cx-_group-t": "IPU",
       "_____10c-iv00BM-cx-subgrp-t": "",
       "_____10c-iv00BM-cx-_n_cnt-i": 1,
-      "_____10c-iv00BM-cx-synatt-i": 100,
+      "_____10c-iv00BM-cx-synatt-f": 100,
       "_____10c-iv00BM-cx-de_gen-f": 0,
       "_____10c-iv00BM-cx-pspuni-b": false,
       "_____10c-iv00BM-nx-pstcrm-f": 35,
@@ -1626,7 +1626,7 @@
       "_____10c-iv00BM-nx-ftincx-f": 0,
       "_____10c-iv00BM-nx-ftincy-f": 0,
       "_____10c-iv00BM-nx-ftincz-f": 0,
-      "_____10c-iv00BM-nx-fthlim-i": 0,
+      "_____10c-iv00BM-nx-fthlim-f": 0,
       "_____10c-iv00BM-nx-mp_acc-b": true,
       "_____10c-iv00BM-nx-mp_psp-b": false,
       "_____10c-iv00BM-cx-memory-b": false,
@@ -1637,7 +1637,7 @@
       "_____10c-iv00BM-cx-_group-t": "IPU",
       "_____10c-iv00BR-cx-subgrp-t": "",
       "_____10c-iv00BR-cx-_n_cnt-i": 1,
-      "_____10c-iv00BR-cx-synatt-i": 100,
+      "_____10c-iv00BR-cx-synatt-f": 100,
       "_____10c-iv00BR-cx-de_gen-f": 0,
       "_____10c-iv00BR-cx-pspuni-b": false,
       "_____10c-iv00BR-nx-pstcrm-f": 35,
@@ -1661,7 +1661,7 @@
       "_____10c-iv00BR-nx-ftincx-f": 0,
       "_____10c-iv00BR-nx-ftincy-f": 0,
       "_____10c-iv00BR-nx-ftincz-f": 0,
-      "_____10c-iv00BR-nx-fthlim-i": 0,
+      "_____10c-iv00BR-nx-fthlim-f": 0,
       "_____10c-iv00BR-nx-mp_acc-b": true,
       "_____10c-iv00BR-nx-mp_psp-b": false,
       "_____10c-iv00BR-cx-memory-b": false,
@@ -1672,7 +1672,7 @@
       "_____10c-iv00BR-cx-_group-t": "IPU",
       "_____10c-iv00ML-cx-subgrp-t": "",
       "_____10c-iv00ML-cx-_n_cnt-i": 1,
-      "_____10c-iv00ML-cx-synatt-i": 100,
+      "_____10c-iv00ML-cx-synatt-f": 100,
       "_____10c-iv00ML-cx-de_gen-f": 0,
       "_____10c-iv00ML-cx-pspuni-b": false,
       "_____10c-iv00ML-nx-pstcrm-f": 35,
@@ -1696,7 +1696,7 @@
       "_____10c-iv00ML-nx-ftincx-f": 0,
       "_____10c-iv00ML-nx-ftincy-f": 0,
       "_____10c-iv00ML-nx-ftincz-f": 0,
-      "_____10c-iv00ML-nx-fthlim-i": 0,
+      "_____10c-iv00ML-nx-fthlim-f": 0,
       "_____10c-iv00ML-nx-mp_acc-b": true,
       "_____10c-iv00ML-nx-mp_psp-b": false,
       "_____10c-iv00ML-cx-memory-b": false,
@@ -1707,7 +1707,7 @@
       "_____10c-iv00ML-cx-_group-t": "IPU",
       "_____10c-iv00MR-cx-subgrp-t": "",
       "_____10c-iv00MR-cx-_n_cnt-i": 1,
-      "_____10c-iv00MR-cx-synatt-i": 100,
+      "_____10c-iv00MR-cx-synatt-f": 100,
       "_____10c-iv00MR-cx-de_gen-f": 0,
       "_____10c-iv00MR-cx-pspuni-b": false,
       "_____10c-iv00MR-nx-pstcrm-f": 35,
@@ -1731,7 +1731,7 @@
       "_____10c-iv00MR-nx-ftincx-f": 0,
       "_____10c-iv00MR-nx-ftincy-f": 0,
       "_____10c-iv00MR-nx-ftincz-f": 0,
-      "_____10c-iv00MR-nx-fthlim-i": 0,
+      "_____10c-iv00MR-nx-fthlim-f": 0,
       "_____10c-iv00MR-nx-mp_acc-b": true,
       "_____10c-iv00MR-nx-mp_psp-b": false,
       "_____10c-iv00MR-cx-memory-b": false,
@@ -1742,7 +1742,7 @@
       "_____10c-iv00MR-cx-_group-t": "IPU",
       "_____10c-iv00TL-cx-subgrp-t": "",
       "_____10c-iv00TL-cx-_n_cnt-i": 1,
-      "_____10c-iv00TL-cx-synatt-i": 100,
+      "_____10c-iv00TL-cx-synatt-f": 100,
       "_____10c-iv00TL-cx-de_gen-f": 0,
       "_____10c-iv00TL-cx-pspuni-b": false,
       "_____10c-iv00TL-nx-pstcrm-f": 35,
@@ -1766,7 +1766,7 @@
       "_____10c-iv00TL-nx-ftincx-f": 0,
       "_____10c-iv00TL-nx-ftincy-f": 0,
       "_____10c-iv00TL-nx-ftincz-f": 0,
-      "_____10c-iv00TL-nx-fthlim-i": 0,
+      "_____10c-iv00TL-nx-fthlim-f": 0,
       "_____10c-iv00TL-nx-mp_acc-b": true,
       "_____10c-iv00TL-nx-mp_psp-b": false,
       "_____10c-iv00TL-cx-memory-b": false,
@@ -1777,7 +1777,7 @@
       "_____10c-iv00TL-cx-_group-t": "IPU",
       "_____10c-iv00TR-cx-subgrp-t": "",
       "_____10c-iv00TR-cx-_n_cnt-i": 1,
-      "_____10c-iv00TR-cx-synatt-i": 100,
+      "_____10c-iv00TR-cx-synatt-f": 100,
       "_____10c-iv00TR-cx-de_gen-f": 0,
       "_____10c-iv00TR-cx-pspuni-b": false,
       "_____10c-iv00TR-nx-pstcrm-f": 35,
@@ -1801,7 +1801,7 @@
       "_____10c-iv00TR-nx-ftincx-f": 0,
       "_____10c-iv00TR-nx-ftincy-f": 0,
       "_____10c-iv00TR-nx-ftincz-f": 0,
-      "_____10c-iv00TR-nx-fthlim-i": 0,
+      "_____10c-iv00TR-nx-fthlim-f": 0,
       "_____10c-iv00TR-nx-mp_acc-b": true,
       "_____10c-iv00TR-nx-mp_psp-b": false,
       "_____10c-iv00TR-cx-memory-b": false,
@@ -1812,7 +1812,7 @@
       "_____10c-iv00TR-cx-_group-t": "IPU",
       "_____10c-iv00TM-cx-subgrp-t": "",
       "_____10c-iv00TM-cx-_n_cnt-i": 1,
-      "_____10c-iv00TM-cx-synatt-i": 100,
+      "_____10c-iv00TM-cx-synatt-f": 100,
       "_____10c-iv00TM-cx-de_gen-f": 0,
       "_____10c-iv00TM-cx-pspuni-b": false,
       "_____10c-iv00TM-nx-pstcrm-f": 35,
@@ -1836,7 +1836,7 @@
       "_____10c-iv00TM-nx-ftincx-f": 0,
       "_____10c-iv00TM-nx-ftincy-f": 0,
       "_____10c-iv00TM-nx-ftincz-f": 0,
-      "_____10c-iv00TM-nx-fthlim-i": 0,
+      "_____10c-iv00TM-nx-fthlim-f": 0,
       "_____10c-iv00TM-nx-mp_acc-b": true,
       "_____10c-iv00TM-nx-mp_psp-b": false,
       "_____10c-iv00TM-cx-memory-b": false,
diff --git a/src/evo/cortical_area.py b/src/evo/cortical_area.py
new file mode 100644
index 000000000..7d0537e4c
--- /dev/null
+++ b/src/evo/cortical_area.py
@@ -0,0 +1,38 @@
+
+# Copyright 2016-2023 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+from src.evo.templates import cortical_types
+
+
+def area_is_system(cortical_area):
+    result = False
+    for area_type in cortical_types:
+        if "supported_devices" in cortical_types[area_type]:
+            for cortical_id in cortical_types[area_type]["supported_devices"]:
+                if cortical_area == cortical_id:
+                    result = True
+    return result
+
+
+def cortical_area_type(cortical_area):
+    cortical_type = "CUSTOM"
+    for area_type in cortical_types:
+        if "supported_devices" in cortical_types[area_type]:
+            for cortical_id in cortical_types[area_type]["supported_devices"]:
+                if cortical_area == cortical_id:
+                    cortical_type = area_type
+    return cortical_type
diff --git a/src/evo/defaults/genome/barebones_genome.json b/src/evo/defaults/genome/barebones_genome.json
index 48bc6b613..4b16ffefc 100644
--- a/src/evo/defaults/genome/barebones_genome.json
+++ b/src/evo/defaults/genome/barebones_genome.json
@@ -1,5 +1,7 @@
 {
   "genome_id": "2022-07-10_21:53:10_961677_111111_G",
+  "genome_title": "The Barebones Genome",
+  "genome_description": "An empty genome",
   "version": "2.0",
   "neuron_morphologies": {
     "decrease_filter_diagonal": {
@@ -1559,7 +1561,7 @@
   "blueprint": {
     "_____10c-___pwr-cx-subgrp-t": "",
     "_____10c-___pwr-cx-_n_cnt-i": 1,
-    "_____10c-___pwr-cx-synatt-i": 100,
+    "_____10c-___pwr-cx-synatt-f": 100,
     "_____10c-___pwr-cx-de_gen-f": 0,
     "_____10c-___pwr-cx-pspuni-b": false,
     "_____10c-___pwr-nx-pstcrm-f": 35,
@@ -1583,20 +1585,20 @@
     "_____10c-___pwr-nx-ftincx-f": 0,
     "_____10c-___pwr-nx-ftincy-f": 0,
     "_____10c-___pwr-nx-ftincz-f": 0,
-    "_____10c-___pwr-nx-fthlim-i": 0,
+    "_____10c-___pwr-nx-fthlim-f": 0,
     "_____10c-___pwr-nx-mp_acc-b": true,
     "_____10c-___pwr-nx-mp_psp-b": false,
     "_____10c-___pwr-cx-memory-b": false,
     "_____10c-___pwr-cx-mem__t-i": 100,
     "_____10c-___pwr-cx-mem_gr-i": 1,
     "_____10c-___pwr-cx-mem_ls-i": 9,
-    "_____10c-___pwr-nx-excite-i": 100,
+    "_____10c-___pwr-nx-excite-f": 100,
     "_____10c-___pwr-cx-__name-t": "Brain_Power",
     "_____10c-___pwr-cx-_group-t": "CORE",
     "_____10c-_death-cx-subgrp-t": "",
     "_____10c-_death-cx-_n_cnt-i": 1,
-    "_____10c-_death-cx-synatt-i": 100,
-    "_____10c-_death-cx-de_gen-f": 0.01,
+    "_____10c-_death-cx-synatt-f": 100,
+    "_____10c-_death-cx-de_gen-f": 0,
     "_____10c-_death-cx-pspuni-b": false,
     "_____10c-_death-nx-pstcrm-f": 35,
     "_____10c-_death-cx-dstmap-d": {},
@@ -1619,14 +1621,14 @@
     "_____10c-_death-nx-ftincx-f": 0,
     "_____10c-_death-nx-ftincy-f": 0,
     "_____10c-_death-nx-ftincz-f": 0,
-    "_____10c-_death-nx-fthlim-i": 0,
+    "_____10c-_death-nx-fthlim-f": 0,
     "_____10c-_death-nx-mp_acc-b": false,
     "_____10c-_death-nx-mp_psp-b": false,
     "_____10c-_death-cx-memory-b": false,
     "_____10c-_death-cx-mem__t-i": 100,
     "_____10c-_death-cx-mem_gr-i": 1,
     "_____10c-_death-cx-mem_ls-i": 9,
-    "_____10c-_death-nx-excite-i": 100,
+    "_____10c-_death-nx-excite-f": 100,
     "_____10c-_death-cx-__name-t": "Brain_Death",
     "_____10c-_death-cx-_group-t": "CORE"
   }
diff --git a/src/evo/defaults/genome/brightness_change_detection.json b/src/evo/defaults/genome/brightness_change_detection.json
index 3e2a9b98c..80c8cc2b2 100644
--- a/src/evo/defaults/genome/brightness_change_detection.json
+++ b/src/evo/defaults/genome/brightness_change_detection.json
@@ -1210,7 +1210,7 @@
       "_____10c-i__inf-nx-___bbx-i": 3,
       "_____10c-i__inf-nx-___bby-i": 1,
       "_____10c-i__inf-nx-___bbz-i": 1,
-      "_____10c-i__inf-cx-synatt-i": 100,
+      "_____10c-i__inf-cx-synatt-f": 100,
       "_____10c-i__inf-cx-pstcr_-f": 80,
       "_____10c-i__inf-cx-pstcrm-f": 100,
       "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -1254,7 +1254,7 @@
       "_____10c-ii_inf-nx-___bbx-i": 3,
       "_____10c-ii_inf-nx-___bby-i": 1,
       "_____10c-ii_inf-nx-___bbz-i": 1,
-      "_____10c-ii_inf-cx-synatt-i": 100,
+      "_____10c-ii_inf-cx-synatt-f": 100,
       "_____10c-ii_inf-cx-pstcr_-f": 80,
       "_____10c-ii_inf-cx-pstcrm-f": 100,
       "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -1298,7 +1298,7 @@
       "_____10c-t__vis-nx-___bbx-i": 8,
       "_____10c-t__vis-nx-___bby-i": 1,
       "_____10c-t__vis-nx-___bbz-i": 1,
-      "_____10c-t__vis-cx-synatt-i": 100,
+      "_____10c-t__vis-cx-synatt-f": 100,
       "_____10c-t__vis-cx-pstcr_-f": 50,
       "_____10c-t__vis-cx-pstcrm-f": 100,
       "_____10c-t__vis-cx-plst_c-f": 0.05,
@@ -1415,7 +1415,7 @@
       "_____10c-is_inc-nx-___bbx-i": 4,
       "_____10c-is_inc-nx-___bby-i": 2,
       "_____10c-is_inc-nx-___bbz-i": 1,
-      "_____10c-is_inc-cx-synatt-i": 100,
+      "_____10c-is_inc-cx-synatt-f": 100,
       "_____10c-is_inc-cx-pstcr_-f": 50,
       "_____10c-is_inc-cx-pstcrm-f": 200,
       "_____10c-is_inc-cx-plst_c-f": 0.05,
@@ -1462,7 +1462,7 @@
       "_____10c-im_inc-nx-___bbx-i": 4,
       "_____10c-im_inc-nx-___bby-i": 2,
       "_____10c-im_inc-nx-___bbz-i": 1,
-      "_____10c-im_inc-cx-synatt-i": 100,
+      "_____10c-im_inc-cx-synatt-f": 100,
       "_____10c-im_inc-cx-pstcr_-f": 50,
       "_____10c-im_inc-cx-pstcrm-f": 200,
       "_____10c-im_inc-cx-plst_c-f": 0.05,
@@ -1509,7 +1509,7 @@
       "_____10c-il_inc-nx-___bbx-i": 4,
       "_____10c-il_inc-nx-___bby-i": 2,
       "_____10c-il_inc-nx-___bbz-i": 1,
-      "_____10c-il_inc-cx-synatt-i": 100,
+      "_____10c-il_inc-cx-synatt-f": 100,
       "_____10c-il_inc-cx-pstcr_-f": 50,
       "_____10c-il_inc-cx-pstcrm-f": 200,
       "_____10c-il_inc-cx-plst_c-f": 0.05,
@@ -1556,7 +1556,7 @@
       "_____10c-ds_inc-nx-___bbx-i": 3,
       "_____10c-ds_inc-nx-___bby-i": 1,
       "_____10c-ds_inc-nx-___bbz-i": 1,
-      "_____10c-ds_inc-cx-synatt-i": 100,
+      "_____10c-ds_inc-cx-synatt-f": 100,
       "_____10c-ds_inc-cx-pstcr_-f": 100,
       "_____10c-ds_inc-cx-pstcrm-f": 200,
       "_____10c-ds_inc-cx-plst_c-f": 0.05,
@@ -1577,7 +1577,7 @@
       "_____10c-dm_inc-nx-___bbx-i": 3,
       "_____10c-dm_inc-nx-___bby-i": 1,
       "_____10c-dm_inc-nx-___bbz-i": 1,
-      "_____10c-dm_inc-cx-synatt-i": 100,
+      "_____10c-dm_inc-cx-synatt-f": 100,
       "_____10c-dm_inc-cx-pstcr_-f": 100,
       "_____10c-dm_inc-cx-pstcrm-f": 200,
       "_____10c-dm_inc-cx-plst_c-f": 0.05,
@@ -1598,7 +1598,7 @@
       "_____10c-dl_inc-nx-___bbx-i": 1,
       "_____10c-dl_inc-nx-___bby-i": 1,
       "_____10c-dl_inc-nx-___bbz-i": 1,
-      "_____10c-dl_inc-cx-synatt-i": 100,
+      "_____10c-dl_inc-cx-synatt-f": 100,
       "_____10c-dl_inc-cx-pstcr_-f": 50,
       "_____10c-dl_inc-cx-pstcrm-f": 200,
       "_____10c-dl_inc-cx-plst_c-f": 0.05,
@@ -1633,7 +1633,7 @@
       "_____10c-is_dcr-nx-___bbx-i": 4,
       "_____10c-is_dcr-nx-___bby-i": 2,
       "_____10c-is_dcr-nx-___bbz-i": 1,
-      "_____10c-is_dcr-cx-synatt-i": 100,
+      "_____10c-is_dcr-cx-synatt-f": 100,
       "_____10c-is_dcr-cx-pstcr_-f": 50,
       "_____10c-is_dcr-cx-pstcrm-f": 200,
       "_____10c-is_dcr-cx-plst_c-f": 0.05,
@@ -1680,7 +1680,7 @@
       "_____10c-im_dcr-nx-___bbx-i": 4,
       "_____10c-im_dcr-nx-___bby-i": 2,
       "_____10c-im_dcr-nx-___bbz-i": 1,
-      "_____10c-im_dcr-cx-synatt-i": 100,
+      "_____10c-im_dcr-cx-synatt-f": 100,
       "_____10c-im_dcr-cx-pstcr_-f": 50,
       "_____10c-im_dcr-cx-pstcrm-f": 200,
       "_____10c-im_dcr-cx-plst_c-f": 0.05,
@@ -1727,7 +1727,7 @@
       "_____10c-il_dcr-nx-___bbx-i": 4,
       "_____10c-il_dcr-nx-___bby-i": 2,
       "_____10c-il_dcr-nx-___bbz-i": 1,
-      "_____10c-il_dcr-cx-synatt-i": 100,
+      "_____10c-il_dcr-cx-synatt-f": 100,
       "_____10c-il_dcr-cx-pstcr_-f": 50,
       "_____10c-il_dcr-cx-pstcrm-f": 200,
       "_____10c-il_dcr-cx-plst_c-f": 0.05,
@@ -1774,7 +1774,7 @@
       "_____10c-ds_dcr-nx-___bbx-i": 3,
       "_____10c-ds_dcr-nx-___bby-i": 1,
       "_____10c-ds_dcr-nx-___bbz-i": 1,
-      "_____10c-ds_dcr-cx-synatt-i": 100,
+      "_____10c-ds_dcr-cx-synatt-f": 100,
       "_____10c-ds_dcr-cx-pstcr_-f": 100,
       "_____10c-ds_dcr-cx-pstcrm-f": 200,
       "_____10c-ds_dcr-cx-plst_c-f": 0.05,
@@ -1795,7 +1795,7 @@
       "_____10c-dm_dcr-nx-___bbx-i": 3,
       "_____10c-dm_dcr-nx-___bby-i": 1,
       "_____10c-dm_dcr-nx-___bbz-i": 1,
-      "_____10c-dm_dcr-cx-synatt-i": 100,
+      "_____10c-dm_dcr-cx-synatt-f": 100,
       "_____10c-dm_dcr-cx-pstcr_-f": 100,
       "_____10c-dm_dcr-cx-pstcrm-f": 200,
       "_____10c-dm_dcr-cx-plst_c-f": 0.05,
@@ -1816,7 +1816,7 @@
       "_____10c-dl_dcr-nx-___bbx-i": 1,
       "_____10c-dl_dcr-nx-___bby-i": 1,
       "_____10c-dl_dcr-nx-___bbz-i": 1,
-      "_____10c-dl_dcr-cx-synatt-i": 100,
+      "_____10c-dl_dcr-cx-synatt-f": 100,
       "_____10c-dl_dcr-cx-pstcr_-f": 100,
       "_____10c-dl_dcr-cx-pstcrm-f": 200,
       "_____10c-dl_dcr-cx-plst_c-f": 0.05,
@@ -1838,7 +1838,7 @@
       "_____10c-_steer-nx-___bbx-i": 8,
       "_____10c-_steer-nx-___bby-i": 2,
       "_____10c-_steer-nx-___bbz-i": 1,
-      "_____10c-_steer-cx-synatt-i": 100,
+      "_____10c-_steer-cx-synatt-f": 100,
       "_____10c-_steer-cx-pstcr_-f": 90,
       "_____10c-_steer-cx-pstcrm-f": 100,
       "_____10c-_steer-cx-plst_c-f": 0.05,
@@ -1896,7 +1896,7 @@
       "_____10c-c___tb-nx-___bbx-i": 1,
       "_____10c-c___tb-nx-___bby-i": 1,
       "_____10c-c___tb-nx-___bbz-i": 1,
-      "_____10c-c___tb-cx-synatt-i": 100,
+      "_____10c-c___tb-cx-synatt-f": 100,
       "_____10c-c___tb-cx-pstcr_-f": 50,
       "_____10c-c___tb-cx-pstcrm-f": 100,
       "_____10c-c___tb-cx-plst_c-f": 0.05,
@@ -1931,7 +1931,7 @@
       "_____10c-c___ab-nx-___bbx-i": 1,
       "_____10c-c___ab-nx-___bby-i": 1,
       "_____10c-c___ab-nx-___bbz-i": 1,
-      "_____10c-c___ab-cx-synatt-i": 100,
+      "_____10c-c___ab-cx-synatt-f": 100,
       "_____10c-c___ab-cx-pstcr_-f": 50,
       "_____10c-c___ab-cx-pstcrm-f": 100,
       "_____10c-c___ab-cx-plst_c-f": 0.05,
@@ -1966,7 +1966,7 @@
       "_____10c-_right-nx-___bbx-i": 1,
       "_____10c-_right-nx-___bby-i": 1,
       "_____10c-_right-nx-___bbz-i": 1,
-      "_____10c-_right-cx-synatt-i": 100,
+      "_____10c-_right-cx-synatt-f": 100,
       "_____10c-_right-cx-pstcr_-f": 100,
       "_____10c-_right-cx-pstcrm-f": 200,
       "_____10c-_right-cx-plst_c-f": 0.05,
@@ -2000,7 +2000,7 @@
       "_____10c-__left-nx-___bbx-i": 1,
       "_____10c-__left-nx-___bby-i": 1,
       "_____10c-__left-nx-___bbz-i": 1,
-      "_____10c-__left-cx-synatt-i": 100,
+      "_____10c-__left-cx-synatt-f": 100,
       "_____10c-__left-cx-pstcr_-f": 100,
       "_____10c-__left-cx-pstcrm-f": 200,
       "_____10c-__left-cx-plst_c-f": 0.05,
@@ -2034,7 +2034,7 @@
       "_____10c-__forw-nx-___bbx-i": 1,
       "_____10c-__forw-nx-___bby-i": 1,
       "_____10c-__forw-nx-___bbz-i": 1,
-      "_____10c-__forw-cx-synatt-i": 100,
+      "_____10c-__forw-cx-synatt-f": 100,
       "_____10c-__forw-cx-pstcr_-f": 100,
       "_____10c-__forw-cx-pstcrm-f": 200,
       "_____10c-__forw-cx-plst_c-f": 0.05,
@@ -2068,7 +2068,7 @@
       "_____10c-__back-nx-___bbx-i": 3,
       "_____10c-__back-nx-___bby-i": 1,
       "_____10c-__back-nx-___bbz-i": 1,
-      "_____10c-__back-cx-synatt-i": 100,
+      "_____10c-__back-cx-synatt-f": 100,
       "_____10c-__back-cx-pstcr_-f": 100,
       "_____10c-__back-cx-pstcrm-f": 200,
       "_____10c-__back-cx-plst_c-f": 0.05,
@@ -2115,7 +2115,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 6,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
diff --git a/src/evo/defaults/genome/essential_genome.json b/src/evo/defaults/genome/essential_genome.json
index f456d6377..0c7b2b13a 100644
--- a/src/evo/defaults/genome/essential_genome.json
+++ b/src/evo/defaults/genome/essential_genome.json
@@ -1,5 +1,7 @@
 {
   "genome_id": "2022-07-10_21:53:10_961677_111111_G",
+  "genome_title": "The Essential Genome",
+  "genome_description": "A basis genome with vision and motor control",
   "version": "2.0",
   "neuron_morphologies": {
     "decrease_filter_diagonal": {
@@ -1559,8 +1561,8 @@
   "blueprint": {
     "_____10c-___pwr-cx-subgrp-t": "",
     "_____10c-___pwr-cx-_n_cnt-i": 1,
-    "_____10c-___pwr-cx-synatt-i": 100,
-    "_____10c-___pwr-cx-de_gen-f": 0.01,
+    "_____10c-___pwr-cx-synatt-f": 100,
+    "_____10c-___pwr-cx-de_gen-f": 0,
     "_____10c-___pwr-cx-pspuni-b": false,
     "_____10c-___pwr-nx-pstcrm-f": 35,
     "_____10c-___pwr-cx-dstmap-d": {},
@@ -1583,19 +1585,19 @@
     "_____10c-___pwr-nx-ftincx-f": 0,
     "_____10c-___pwr-nx-ftincy-f": 0,
     "_____10c-___pwr-nx-ftincz-f": 0,
-    "_____10c-___pwr-nx-fthlim-i": 0,
+    "_____10c-___pwr-nx-fthlim-f": 0,
     "_____10c-___pwr-nx-mp_acc-b": true,
     "_____10c-___pwr-nx-mp_psp-b": false,
     "_____10c-___pwr-cx-memory-b": false,
     "_____10c-___pwr-cx-mem__t-i": 100,
     "_____10c-___pwr-cx-mem_gr-i": 1,
     "_____10c-___pwr-cx-mem_ls-i": 9,
-    "_____10c-___pwr-nx-excite-i": 100,
+    "_____10c-___pwr-nx-excite-f": 100,
     "_____10c-___pwr-cx-__name-t": "Brain_Power",
     "_____10c-___pwr-cx-_group-t": "CORE",
     "_____10c-o__mot-cx-subgrp-t": "",
     "_____10c-o__mot-cx-_n_cnt-i": 1,
-    "_____10c-o__mot-cx-synatt-i": 100,
+    "_____10c-o__mot-cx-synatt-f": 100,
     "_____10c-o__mot-cx-de_gen-f": 0,
     "_____10c-o__mot-cx-pspuni-b": false,
     "_____10c-o__mot-nx-pstcrm-f": 35,
@@ -1619,19 +1621,19 @@
     "_____10c-o__mot-nx-ftincx-f": 0,
     "_____10c-o__mot-nx-ftincy-f": 0,
     "_____10c-o__mot-nx-ftincz-f": 0,
-    "_____10c-o__mot-nx-fthlim-i": 0,
+    "_____10c-o__mot-nx-fthlim-f": 0,
     "_____10c-o__mot-nx-mp_acc-b": false,
     "_____10c-o__mot-nx-mp_psp-b": false,
     "_____10c-o__mot-cx-memory-b": false,
     "_____10c-o__mot-cx-mem__t-i": 100,
     "_____10c-o__mot-cx-mem_gr-i": 1,
     "_____10c-o__mot-cx-mem_ls-i": 9,
-    "_____10c-o__mot-nx-excite-i": 100,
+    "_____10c-o__mot-nx-excite-f": 100,
     "_____10c-o__mot-cx-__name-t": "motor_opu",
     "_____10c-o__mot-cx-_group-t": "OPU",
     "_____10c-m__lef-cx-subgrp-t": "",
     "_____10c-m__lef-cx-_n_cnt-i": 1,
-    "_____10c-m__lef-cx-synatt-i": 100,
+    "_____10c-m__lef-cx-synatt-f": 100,
     "_____10c-m__lef-cx-de_gen-f": 0,
     "_____10c-m__lef-cx-pspuni-b": true,
     "_____10c-m__lef-nx-pstcrm-f": 35,
@@ -1655,19 +1657,19 @@
     "_____10c-m__lef-nx-ftincx-f": 0,
     "_____10c-m__lef-nx-ftincy-f": 0,
     "_____10c-m__lef-nx-ftincz-f": 0,
-    "_____10c-m__lef-nx-fthlim-i": 0,
+    "_____10c-m__lef-nx-fthlim-f": 0,
     "_____10c-m__lef-nx-mp_acc-b": true,
     "_____10c-m__lef-nx-mp_psp-b": false,
     "_____10c-m__lef-cx-memory-b": false,
     "_____10c-m__lef-cx-mem__t-i": 100,
     "_____10c-m__lef-cx-mem_gr-i": 1,
     "_____10c-m__lef-cx-mem_ls-i": 9,
-    "_____10c-m__lef-nx-excite-i": 100,
+    "_____10c-m__lef-nx-excite-f": 100,
     "_____10c-m__lef-cx-__name-t": "turn_left",
     "_____10c-m__lef-cx-_group-t": "CUSTOM",
     "_____10c-m__rig-cx-subgrp-t": "",
     "_____10c-m__rig-cx-_n_cnt-i": 1,
-    "_____10c-m__rig-cx-synatt-i": 100,
+    "_____10c-m__rig-cx-synatt-f": 100,
     "_____10c-m__rig-cx-de_gen-f": 0,
     "_____10c-m__rig-cx-pspuni-b": true,
     "_____10c-m__rig-nx-pstcrm-f": 35,
@@ -1691,19 +1693,19 @@
     "_____10c-m__rig-nx-ftincx-f": 0,
     "_____10c-m__rig-nx-ftincy-f": 0,
     "_____10c-m__rig-nx-ftincz-f": 0,
-    "_____10c-m__rig-nx-fthlim-i": 0,
+    "_____10c-m__rig-nx-fthlim-f": 0,
     "_____10c-m__rig-nx-mp_acc-b": true,
     "_____10c-m__rig-nx-mp_psp-b": false,
     "_____10c-m__rig-cx-memory-b": false,
     "_____10c-m__rig-cx-mem__t-i": 100,
     "_____10c-m__rig-cx-mem_gr-i": 1,
     "_____10c-m__rig-cx-mem_ls-i": 9,
-    "_____10c-m__rig-nx-excite-i": 100,
+    "_____10c-m__rig-nx-excite-f": 100,
     "_____10c-m__rig-cx-__name-t": "turn_right",
     "_____10c-m__rig-cx-_group-t": "CUSTOM",
     "_____10c-m__for-cx-subgrp-t": "",
     "_____10c-m__for-cx-_n_cnt-i": 1,
-    "_____10c-m__for-cx-synatt-i": 100,
+    "_____10c-m__for-cx-synatt-f": 100,
     "_____10c-m__for-cx-de_gen-f": 0,
     "_____10c-m__for-cx-pspuni-b": true,
     "_____10c-m__for-nx-pstcrm-f": 35,
@@ -1788,19 +1790,19 @@
     "_____10c-m__for-nx-ftincx-f": 0,
     "_____10c-m__for-nx-ftincy-f": 0,
     "_____10c-m__for-nx-ftincz-f": 0,
-    "_____10c-m__for-nx-fthlim-i": 0,
+    "_____10c-m__for-nx-fthlim-f": 0,
     "_____10c-m__for-nx-mp_acc-b": true,
     "_____10c-m__for-nx-mp_psp-b": false,
     "_____10c-m__for-cx-memory-b": false,
     "_____10c-m__for-cx-mem__t-i": 100,
     "_____10c-m__for-cx-mem_gr-i": 1,
     "_____10c-m__for-cx-mem_ls-i": 9,
-    "_____10c-m__for-nx-excite-i": 100,
+    "_____10c-m__for-nx-excite-f": 100,
     "_____10c-m__for-cx-__name-t": "forward",
     "_____10c-m__for-cx-_group-t": "CUSTOM",
     "_____10c-m__bac-cx-subgrp-t": "",
     "_____10c-m__bac-cx-_n_cnt-i": 1,
-    "_____10c-m__bac-cx-synatt-i": 100,
+    "_____10c-m__bac-cx-synatt-f": 100,
     "_____10c-m__bac-cx-de_gen-f": 0,
     "_____10c-m__bac-cx-pspuni-b": true,
     "_____10c-m__bac-nx-pstcrm-f": 35,
@@ -1885,19 +1887,19 @@
     "_____10c-m__bac-nx-ftincx-f": 0,
     "_____10c-m__bac-nx-ftincy-f": 0,
     "_____10c-m__bac-nx-ftincz-f": 0,
-    "_____10c-m__bac-nx-fthlim-i": 0,
+    "_____10c-m__bac-nx-fthlim-f": 0,
     "_____10c-m__bac-nx-mp_acc-b": true,
     "_____10c-m__bac-nx-mp_psp-b": false,
     "_____10c-m__bac-cx-memory-b": false,
     "_____10c-m__bac-cx-mem__t-i": 100,
     "_____10c-m__bac-cx-mem_gr-i": 1,
     "_____10c-m__bac-cx-mem_ls-i": 9,
-    "_____10c-m__bac-nx-excite-i": 100,
+    "_____10c-m__bac-nx-excite-f": 100,
     "_____10c-m__bac-cx-__name-t": "backward",
     "_____10c-m__bac-cx-_group-t": "CUSTOM",
     "_____10c-iv00_C-cx-subgrp-t": "",
     "_____10c-iv00_C-cx-_n_cnt-i": 1,
-    "_____10c-iv00_C-cx-synatt-i": 100,
+    "_____10c-iv00_C-cx-synatt-f": 100,
     "_____10c-iv00_C-cx-de_gen-f": 0,
     "_____10c-iv00_C-cx-pspuni-b": false,
     "_____10c-iv00_C-nx-pstcrm-f": 100,
@@ -1921,19 +1923,19 @@
     "_____10c-iv00_C-nx-ftincx-f": 0,
     "_____10c-iv00_C-nx-ftincy-f": 0,
     "_____10c-iv00_C-nx-ftincz-f": 0,
-    "_____10c-iv00_C-nx-fthlim-i": 0,
+    "_____10c-iv00_C-nx-fthlim-f": 0,
     "_____10c-iv00_C-nx-mp_acc-b": true,
     "_____10c-iv00_C-nx-mp_psp-b": false,
     "_____10c-iv00_C-cx-memory-b": false,
     "_____10c-iv00_C-cx-mem__t-i": 100,
     "_____10c-iv00_C-cx-mem_gr-i": 1,
     "_____10c-iv00_C-cx-mem_ls-i": 9,
-    "_____10c-iv00_C-nx-excite-i": 100,
+    "_____10c-iv00_C-nx-excite-f": 100,
     "_____10c-iv00_C-cx-__name-t": "vision_C",
     "_____10c-iv00_C-cx-_group-t": "IPU",
     "_____10c-iv00BL-cx-subgrp-t": "",
     "_____10c-iv00BL-cx-_n_cnt-i": 1,
-    "_____10c-iv00BL-cx-synatt-i": 100,
+    "_____10c-iv00BL-cx-synatt-f": 100,
     "_____10c-iv00BL-cx-de_gen-f": 0,
     "_____10c-iv00BL-cx-pspuni-b": false,
     "_____10c-iv00BL-nx-pstcrm-f": 35,
@@ -1957,19 +1959,19 @@
     "_____10c-iv00BL-nx-ftincx-f": 0,
     "_____10c-iv00BL-nx-ftincy-f": 0,
     "_____10c-iv00BL-nx-ftincz-f": 0,
-    "_____10c-iv00BL-nx-fthlim-i": 0,
+    "_____10c-iv00BL-nx-fthlim-f": 0,
     "_____10c-iv00BL-nx-mp_acc-b": true,
     "_____10c-iv00BL-nx-mp_psp-b": false,
     "_____10c-iv00BL-cx-memory-b": false,
     "_____10c-iv00BL-cx-mem__t-i": 100,
     "_____10c-iv00BL-cx-mem_gr-i": 1,
     "_____10c-iv00BL-cx-mem_ls-i": 9,
-    "_____10c-iv00BL-nx-excite-i": 100,
+    "_____10c-iv00BL-nx-excite-f": 100,
     "_____10c-iv00BL-cx-__name-t": "vision_LL",
     "_____10c-iv00BL-cx-_group-t": "IPU",
     "_____10c-iv00BM-cx-subgrp-t": "",
     "_____10c-iv00BM-cx-_n_cnt-i": 1,
-    "_____10c-iv00BM-cx-synatt-i": 100,
+    "_____10c-iv00BM-cx-synatt-f": 100,
     "_____10c-iv00BM-cx-de_gen-f": 0,
     "_____10c-iv00BM-cx-pspuni-b": false,
     "_____10c-iv00BM-nx-pstcrm-f": 35,
@@ -2009,19 +2011,19 @@
     "_____10c-iv00BM-nx-ftincx-f": 0,
     "_____10c-iv00BM-nx-ftincy-f": 0,
     "_____10c-iv00BM-nx-ftincz-f": 0,
-    "_____10c-iv00BM-nx-fthlim-i": 0,
+    "_____10c-iv00BM-nx-fthlim-f": 0,
     "_____10c-iv00BM-nx-mp_acc-b": true,
     "_____10c-iv00BM-nx-mp_psp-b": false,
     "_____10c-iv00BM-cx-memory-b": false,
     "_____10c-iv00BM-cx-mem__t-i": 100,
     "_____10c-iv00BM-cx-mem_gr-i": 1,
     "_____10c-iv00BM-cx-mem_ls-i": 9,
-    "_____10c-iv00BM-nx-excite-i": 100,
+    "_____10c-iv00BM-nx-excite-f": 100,
     "_____10c-iv00BM-cx-__name-t": "vision_LM",
     "_____10c-iv00BM-cx-_group-t": "IPU",
     "_____10c-iv00BR-cx-subgrp-t": "",
     "_____10c-iv00BR-cx-_n_cnt-i": 1,
-    "_____10c-iv00BR-cx-synatt-i": 100,
+    "_____10c-iv00BR-cx-synatt-f": 100,
     "_____10c-iv00BR-cx-de_gen-f": 0,
     "_____10c-iv00BR-cx-pspuni-b": false,
     "_____10c-iv00BR-nx-pstcrm-f": 35,
@@ -2045,19 +2047,19 @@
     "_____10c-iv00BR-nx-ftincx-f": 0,
     "_____10c-iv00BR-nx-ftincy-f": 0,
     "_____10c-iv00BR-nx-ftincz-f": 0,
-    "_____10c-iv00BR-nx-fthlim-i": 0,
+    "_____10c-iv00BR-nx-fthlim-f": 0,
     "_____10c-iv00BR-nx-mp_acc-b": true,
     "_____10c-iv00BR-nx-mp_psp-b": false,
     "_____10c-iv00BR-cx-memory-b": false,
     "_____10c-iv00BR-cx-mem__t-i": 100,
     "_____10c-iv00BR-cx-mem_gr-i": 1,
     "_____10c-iv00BR-cx-mem_ls-i": 9,
-    "_____10c-iv00BR-nx-excite-i": 100,
+    "_____10c-iv00BR-nx-excite-f": 100,
     "_____10c-iv00BR-cx-__name-t": "vision_LR",
     "_____10c-iv00BR-cx-_group-t": "IPU",
     "_____10c-iv00ML-cx-subgrp-t": "",
     "_____10c-iv00ML-cx-_n_cnt-i": 1,
-    "_____10c-iv00ML-cx-synatt-i": 100,
+    "_____10c-iv00ML-cx-synatt-f": 100,
     "_____10c-iv00ML-cx-de_gen-f": 0,
     "_____10c-iv00ML-cx-pspuni-b": false,
     "_____10c-iv00ML-nx-pstcrm-f": 35,
@@ -2081,19 +2083,19 @@
     "_____10c-iv00ML-nx-ftincx-f": 0,
     "_____10c-iv00ML-nx-ftincy-f": 0,
     "_____10c-iv00ML-nx-ftincz-f": 0,
-    "_____10c-iv00ML-nx-fthlim-i": 0,
+    "_____10c-iv00ML-nx-fthlim-f": 0,
     "_____10c-iv00ML-nx-mp_acc-b": true,
     "_____10c-iv00ML-nx-mp_psp-b": false,
     "_____10c-iv00ML-cx-memory-b": false,
     "_____10c-iv00ML-cx-mem__t-i": 100,
     "_____10c-iv00ML-cx-mem_gr-i": 1,
     "_____10c-iv00ML-cx-mem_ls-i": 9,
-    "_____10c-iv00ML-nx-excite-i": 100,
+    "_____10c-iv00ML-nx-excite-f": 100,
     "_____10c-iv00ML-cx-__name-t": "vision_ML",
     "_____10c-iv00ML-cx-_group-t": "IPU",
     "_____10c-iv00MR-cx-subgrp-t": "",
     "_____10c-iv00MR-cx-_n_cnt-i": 1,
-    "_____10c-iv00MR-cx-synatt-i": 100,
+    "_____10c-iv00MR-cx-synatt-f": 100,
     "_____10c-iv00MR-cx-de_gen-f": 0,
     "_____10c-iv00MR-cx-pspuni-b": false,
     "_____10c-iv00MR-nx-pstcrm-f": 35,
@@ -2117,19 +2119,19 @@
     "_____10c-iv00MR-nx-ftincx-f": 0,
     "_____10c-iv00MR-nx-ftincy-f": 0,
     "_____10c-iv00MR-nx-ftincz-f": 0,
-    "_____10c-iv00MR-nx-fthlim-i": 0,
+    "_____10c-iv00MR-nx-fthlim-f": 0,
     "_____10c-iv00MR-nx-mp_acc-b": true,
     "_____10c-iv00MR-nx-mp_psp-b": false,
     "_____10c-iv00MR-cx-memory-b": false,
     "_____10c-iv00MR-cx-mem__t-i": 100,
     "_____10c-iv00MR-cx-mem_gr-i": 1,
     "_____10c-iv00MR-cx-mem_ls-i": 9,
-    "_____10c-iv00MR-nx-excite-i": 100,
+    "_____10c-iv00MR-nx-excite-f": 100,
     "_____10c-iv00MR-cx-__name-t": "vision_MR",
     "_____10c-iv00MR-cx-_group-t": "IPU",
     "_____10c-iv00TL-cx-subgrp-t": "",
     "_____10c-iv00TL-cx-_n_cnt-i": 1,
-    "_____10c-iv00TL-cx-synatt-i": 100,
+    "_____10c-iv00TL-cx-synatt-f": 100,
     "_____10c-iv00TL-cx-de_gen-f": 0,
     "_____10c-iv00TL-cx-pspuni-b": false,
     "_____10c-iv00TL-nx-pstcrm-f": 35,
@@ -2153,19 +2155,19 @@
     "_____10c-iv00TL-nx-ftincx-f": 0,
     "_____10c-iv00TL-nx-ftincy-f": 0,
     "_____10c-iv00TL-nx-ftincz-f": 0,
-    "_____10c-iv00TL-nx-fthlim-i": 0,
+    "_____10c-iv00TL-nx-fthlim-f": 0,
     "_____10c-iv00TL-nx-mp_acc-b": true,
     "_____10c-iv00TL-nx-mp_psp-b": false,
     "_____10c-iv00TL-cx-memory-b": false,
     "_____10c-iv00TL-cx-mem__t-i": 100,
     "_____10c-iv00TL-cx-mem_gr-i": 1,
     "_____10c-iv00TL-cx-mem_ls-i": 9,
-    "_____10c-iv00TL-nx-excite-i": 100,
+    "_____10c-iv00TL-nx-excite-f": 100,
     "_____10c-iv00TL-cx-__name-t": "vision_TL",
     "_____10c-iv00TL-cx-_group-t": "IPU",
     "_____10c-iv00TR-cx-subgrp-t": "",
     "_____10c-iv00TR-cx-_n_cnt-i": 1,
-    "_____10c-iv00TR-cx-synatt-i": 100,
+    "_____10c-iv00TR-cx-synatt-f": 100,
     "_____10c-iv00TR-cx-de_gen-f": 0,
     "_____10c-iv00TR-cx-pspuni-b": false,
     "_____10c-iv00TR-nx-pstcrm-f": 35,
@@ -2189,19 +2191,19 @@
     "_____10c-iv00TR-nx-ftincx-f": 0,
     "_____10c-iv00TR-nx-ftincy-f": 0,
     "_____10c-iv00TR-nx-ftincz-f": 0,
-    "_____10c-iv00TR-nx-fthlim-i": 0,
+    "_____10c-iv00TR-nx-fthlim-f": 0,
     "_____10c-iv00TR-nx-mp_acc-b": true,
     "_____10c-iv00TR-nx-mp_psp-b": false,
     "_____10c-iv00TR-cx-memory-b": false,
     "_____10c-iv00TR-cx-mem__t-i": 100,
     "_____10c-iv00TR-cx-mem_gr-i": 1,
     "_____10c-iv00TR-cx-mem_ls-i": 9,
-    "_____10c-iv00TR-nx-excite-i": 100,
+    "_____10c-iv00TR-nx-excite-f": 100,
     "_____10c-iv00TR-cx-__name-t": "vision_TR",
     "_____10c-iv00TR-cx-_group-t": "IPU",
     "_____10c-iv00TM-cx-subgrp-t": "",
     "_____10c-iv00TM-cx-_n_cnt-i": 1,
-    "_____10c-iv00TM-cx-synatt-i": 100,
+    "_____10c-iv00TM-cx-synatt-f": 100,
     "_____10c-iv00TM-cx-de_gen-f": 0,
     "_____10c-iv00TM-cx-pspuni-b": false,
     "_____10c-iv00TM-nx-pstcrm-f": 35,
@@ -2241,19 +2243,19 @@
     "_____10c-iv00TM-nx-ftincx-f": 0,
     "_____10c-iv00TM-nx-ftincy-f": 0,
     "_____10c-iv00TM-nx-ftincz-f": 0,
-    "_____10c-iv00TM-nx-fthlim-i": 0,
+    "_____10c-iv00TM-nx-fthlim-f": 0,
     "_____10c-iv00TM-nx-mp_acc-b": true,
     "_____10c-iv00TM-nx-mp_psp-b": false,
     "_____10c-iv00TM-cx-memory-b": false,
     "_____10c-iv00TM-cx-mem__t-i": 100,
     "_____10c-iv00TM-cx-mem_gr-i": 1,
     "_____10c-iv00TM-cx-mem_ls-i": 9,
-    "_____10c-iv00TM-nx-excite-i": 100,
+    "_____10c-iv00TM-nx-excite-f": 100,
     "_____10c-iv00TM-cx-__name-t": "vision_TM",
     "_____10c-iv00TM-cx-_group-t": "IPU",
     "_____10c-CRSMot-cx-subgrp-t": "",
     "_____10c-CRSMot-cx-_n_cnt-i": 1,
-    "_____10c-CRSMot-cx-synatt-i": 100,
+    "_____10c-CRSMot-cx-synatt-f": 100,
     "_____10c-CRSMot-cx-de_gen-f": 0,
     "_____10c-CRSMot-cx-pspuni-b": false,
     "_____10c-CRSMot-nx-pstcrm-f": 99999,
@@ -2293,19 +2295,19 @@
     "_____10c-CRSMot-nx-ftincx-f": 0,
     "_____10c-CRSMot-nx-ftincy-f": 0,
     "_____10c-CRSMot-nx-ftincz-f": 0,
-    "_____10c-CRSMot-nx-fthlim-i": 0,
+    "_____10c-CRSMot-nx-fthlim-f": 0,
     "_____10c-CRSMot-nx-mp_acc-b": false,
     "_____10c-CRSMot-nx-mp_psp-b": false,
     "_____10c-CRSMot-cx-memory-b": false,
     "_____10c-CRSMot-cx-mem__t-i": 100,
     "_____10c-CRSMot-cx-mem_gr-i": 1,
     "_____10c-CRSMot-cx-mem_ls-i": 9,
-    "_____10c-CRSMot-nx-excite-i": 100,
+    "_____10c-CRSMot-nx-excite-f": 100,
     "_____10c-CRSMot-cx-__name-t": "M1_FW",
     "_____10c-CRSMot-cx-_group-t": "CUSTOM",
     "_____10c-CIHMot-cx-subgrp-t": "",
     "_____10c-CIHMot-cx-_n_cnt-i": 1,
-    "_____10c-CIHMot-cx-synatt-i": 100,
+    "_____10c-CIHMot-cx-synatt-f": 100,
     "_____10c-CIHMot-cx-de_gen-f": 0,
     "_____10c-CIHMot-cx-pspuni-b": false,
     "_____10c-CIHMot-nx-pstcrm-f": 99999,
@@ -2345,19 +2347,19 @@
     "_____10c-CIHMot-nx-ftincx-f": 0,
     "_____10c-CIHMot-nx-ftincy-f": 0,
     "_____10c-CIHMot-nx-ftincz-f": 0,
-    "_____10c-CIHMot-nx-fthlim-i": 0,
+    "_____10c-CIHMot-nx-fthlim-f": 0,
     "_____10c-CIHMot-nx-mp_acc-b": false,
     "_____10c-CIHMot-nx-mp_psp-b": false,
     "_____10c-CIHMot-cx-memory-b": false,
     "_____10c-CIHMot-cx-mem__t-i": 100,
     "_____10c-CIHMot-cx-mem_gr-i": 1,
     "_____10c-CIHMot-cx-mem_ls-i": 9,
-    "_____10c-CIHMot-nx-excite-i": 100,
+    "_____10c-CIHMot-nx-excite-f": 100,
     "_____10c-CIHMot-cx-__name-t": "M1_BW",
     "_____10c-CIHMot-cx-_group-t": "CUSTOM",
     "_____10c-CKQM2_-cx-subgrp-t": "",
     "_____10c-CKQM2_-cx-_n_cnt-i": 1,
-    "_____10c-CKQM2_-cx-synatt-i": 100,
+    "_____10c-CKQM2_-cx-synatt-f": 100,
     "_____10c-CKQM2_-cx-de_gen-f": 0,
     "_____10c-CKQM2_-cx-pspuni-b": false,
     "_____10c-CKQM2_-nx-pstcrm-f": 99999,
@@ -2397,19 +2399,19 @@
     "_____10c-CKQM2_-nx-ftincx-f": 0,
     "_____10c-CKQM2_-nx-ftincy-f": 0,
     "_____10c-CKQM2_-nx-ftincz-f": 0,
-    "_____10c-CKQM2_-nx-fthlim-i": 0,
+    "_____10c-CKQM2_-nx-fthlim-f": 0,
     "_____10c-CKQM2_-nx-mp_acc-b": false,
     "_____10c-CKQM2_-nx-mp_psp-b": false,
     "_____10c-CKQM2_-cx-memory-b": false,
     "_____10c-CKQM2_-cx-mem__t-i": 100,
     "_____10c-CKQM2_-cx-mem_gr-i": 1,
     "_____10c-CKQM2_-cx-mem_ls-i": 9,
-    "_____10c-CKQM2_-nx-excite-i": 100,
+    "_____10c-CKQM2_-nx-excite-f": 100,
     "_____10c-CKQM2_-cx-__name-t": "M2_FW",
     "_____10c-CKQM2_-cx-_group-t": "CUSTOM",
     "_____10c-CKYM2_-cx-subgrp-t": "",
     "_____10c-CKYM2_-cx-_n_cnt-i": 1,
-    "_____10c-CKYM2_-cx-synatt-i": 100,
+    "_____10c-CKYM2_-cx-synatt-f": 100,
     "_____10c-CKYM2_-cx-de_gen-f": 0,
     "_____10c-CKYM2_-cx-pspuni-b": false,
     "_____10c-CKYM2_-nx-pstcrm-f": 99999,
@@ -2449,19 +2451,19 @@
     "_____10c-CKYM2_-nx-ftincx-f": 0,
     "_____10c-CKYM2_-nx-ftincy-f": 0,
     "_____10c-CKYM2_-nx-ftincz-f": 0,
-    "_____10c-CKYM2_-nx-fthlim-i": 0,
+    "_____10c-CKYM2_-nx-fthlim-f": 0,
     "_____10c-CKYM2_-nx-mp_acc-b": false,
     "_____10c-CKYM2_-nx-mp_psp-b": false,
     "_____10c-CKYM2_-cx-memory-b": false,
     "_____10c-CKYM2_-cx-mem__t-i": 100,
     "_____10c-CKYM2_-cx-mem_gr-i": 1,
     "_____10c-CKYM2_-cx-mem_ls-i": 9,
-    "_____10c-CKYM2_-nx-excite-i": 100,
+    "_____10c-CKYM2_-nx-excite-f": 100,
     "_____10c-CKYM2_-cx-__name-t": "M2_BW",
     "_____10c-CKYM2_-cx-_group-t": "CUSTOM",
     "_____10c-CO4M3_-cx-subgrp-t": "",
     "_____10c-CO4M3_-cx-_n_cnt-i": 1,
-    "_____10c-CO4M3_-cx-synatt-i": 100,
+    "_____10c-CO4M3_-cx-synatt-f": 100,
     "_____10c-CO4M3_-cx-de_gen-f": 0,
     "_____10c-CO4M3_-cx-pspuni-b": false,
     "_____10c-CO4M3_-nx-pstcrm-f": 99999,
@@ -2501,19 +2503,19 @@
     "_____10c-CO4M3_-nx-ftincx-f": 0,
     "_____10c-CO4M3_-nx-ftincy-f": 0,
     "_____10c-CO4M3_-nx-ftincz-f": 0,
-    "_____10c-CO4M3_-nx-fthlim-i": 0,
+    "_____10c-CO4M3_-nx-fthlim-f": 0,
     "_____10c-CO4M3_-nx-mp_acc-b": false,
     "_____10c-CO4M3_-nx-mp_psp-b": false,
     "_____10c-CO4M3_-cx-memory-b": false,
     "_____10c-CO4M3_-cx-mem__t-i": 100,
     "_____10c-CO4M3_-cx-mem_gr-i": 1,
     "_____10c-CO4M3_-cx-mem_ls-i": 9,
-    "_____10c-CO4M3_-nx-excite-i": 100,
+    "_____10c-CO4M3_-nx-excite-f": 100,
     "_____10c-CO4M3_-cx-__name-t": "M3_FW",
     "_____10c-CO4M3_-cx-_group-t": "CUSTOM",
     "_____10c-CJWM3_-cx-subgrp-t": "",
     "_____10c-CJWM3_-cx-_n_cnt-i": 1,
-    "_____10c-CJWM3_-cx-synatt-i": 100,
+    "_____10c-CJWM3_-cx-synatt-f": 100,
     "_____10c-CJWM3_-cx-de_gen-f": 0,
     "_____10c-CJWM3_-cx-pspuni-b": false,
     "_____10c-CJWM3_-nx-pstcrm-f": 99999,
@@ -2553,19 +2555,19 @@
     "_____10c-CJWM3_-nx-ftincx-f": 0,
     "_____10c-CJWM3_-nx-ftincy-f": 0,
     "_____10c-CJWM3_-nx-ftincz-f": 0,
-    "_____10c-CJWM3_-nx-fthlim-i": 0,
+    "_____10c-CJWM3_-nx-fthlim-f": 0,
     "_____10c-CJWM3_-nx-mp_acc-b": false,
     "_____10c-CJWM3_-nx-mp_psp-b": false,
     "_____10c-CJWM3_-cx-memory-b": false,
     "_____10c-CJWM3_-cx-mem__t-i": 100,
     "_____10c-CJWM3_-cx-mem_gr-i": 1,
     "_____10c-CJWM3_-cx-mem_ls-i": 9,
-    "_____10c-CJWM3_-nx-excite-i": 100,
+    "_____10c-CJWM3_-nx-excite-f": 100,
     "_____10c-CJWM3_-cx-__name-t": "M3_BW",
     "_____10c-CJWM3_-cx-_group-t": "CUSTOM",
     "_____10c-CTGM4_-cx-subgrp-t": "",
     "_____10c-CTGM4_-cx-_n_cnt-i": 1,
-    "_____10c-CTGM4_-cx-synatt-i": 100,
+    "_____10c-CTGM4_-cx-synatt-f": 100,
     "_____10c-CTGM4_-cx-de_gen-f": 0,
     "_____10c-CTGM4_-cx-pspuni-b": false,
     "_____10c-CTGM4_-nx-pstcrm-f": 99999,
@@ -2605,19 +2607,19 @@
     "_____10c-CTGM4_-nx-ftincx-f": 0,
     "_____10c-CTGM4_-nx-ftincy-f": 0,
     "_____10c-CTGM4_-nx-ftincz-f": 0,
-    "_____10c-CTGM4_-nx-fthlim-i": 0,
+    "_____10c-CTGM4_-nx-fthlim-f": 0,
     "_____10c-CTGM4_-nx-mp_acc-b": false,
     "_____10c-CTGM4_-nx-mp_psp-b": false,
     "_____10c-CTGM4_-cx-memory-b": false,
     "_____10c-CTGM4_-cx-mem__t-i": 100,
     "_____10c-CTGM4_-cx-mem_gr-i": 1,
     "_____10c-CTGM4_-cx-mem_ls-i": 9,
-    "_____10c-CTGM4_-nx-excite-i": 100,
+    "_____10c-CTGM4_-nx-excite-f": 100,
     "_____10c-CTGM4_-cx-__name-t": "M4_FW",
     "_____10c-CTGM4_-cx-_group-t": "CUSTOM",
     "_____10c-CLWM4_-cx-subgrp-t": "",
     "_____10c-CLWM4_-cx-_n_cnt-i": 1,
-    "_____10c-CLWM4_-cx-synatt-i": 100,
+    "_____10c-CLWM4_-cx-synatt-f": 100,
     "_____10c-CLWM4_-cx-de_gen-f": 0,
     "_____10c-CLWM4_-cx-pspuni-b": false,
     "_____10c-CLWM4_-nx-pstcrm-f": 99999,
@@ -2657,14 +2659,14 @@
     "_____10c-CLWM4_-nx-ftincx-f": 0,
     "_____10c-CLWM4_-nx-ftincy-f": 0,
     "_____10c-CLWM4_-nx-ftincz-f": 0,
-    "_____10c-CLWM4_-nx-fthlim-i": 0,
+    "_____10c-CLWM4_-nx-fthlim-f": 0,
     "_____10c-CLWM4_-nx-mp_acc-b": false,
     "_____10c-CLWM4_-nx-mp_psp-b": false,
     "_____10c-CLWM4_-cx-memory-b": false,
     "_____10c-CLWM4_-cx-mem__t-i": 100,
     "_____10c-CLWM4_-cx-mem_gr-i": 1,
     "_____10c-CLWM4_-cx-mem_ls-i": 9,
-    "_____10c-CLWM4_-nx-excite-i": 100,
+    "_____10c-CLWM4_-nx-excite-f": 100,
     "_____10c-CLWM4_-cx-__name-t": "M4_BW",
     "_____10c-CLWM4_-cx-_group-t": "CUSTOM"
   }
diff --git a/src/evo/defaults/genome/motor_babble_genome.json b/src/evo/defaults/genome/motor_babble_genome.json
index 0ce802465..9cbb0387a 100644
--- a/src/evo/defaults/genome/motor_babble_genome.json
+++ b/src/evo/defaults/genome/motor_babble_genome.json
@@ -312,7 +312,7 @@
       "_____10c-o_init-nx-___bbx-i": 1,
       "_____10c-o_init-nx-___bby-i": 1,
       "_____10c-o_init-nx-___bbz-i": 1,
-      "_____10c-o_init-cx-synatt-i": 100,
+      "_____10c-o_init-cx-synatt-f": 100,
       "_____10c-o_init-cx-pstcr_-f": 0,
       "_____10c-o_init-cx-pstcrm-f": 500,
       "_____10c-o_init-cx-plst_c-f": 5,
@@ -332,7 +332,7 @@
       "_____10c-i_mPre-nx-___bbx-i": 1,
       "_____10c-i_mPre-nx-___bby-i": 1,
       "_____10c-i_mPre-nx-___bbz-i": 1,
-      "_____10c-i_mPre-cx-synatt-i": 100,
+      "_____10c-i_mPre-cx-synatt-f": 100,
       "_____10c-i_mPre-cx-pstcr_-f": 0,
       "_____10c-i_mPre-cx-pstcrm-f": 500,
       "_____10c-i_mPre-cx-plst_c-f": 5,
@@ -366,7 +366,7 @@
       "_____10c-t_mFor-nx-___bbx-i": 4,
       "_____10c-t_mFor-nx-___bby-i": 1,
       "_____10c-t_mFor-nx-___bbz-i": 1,
-      "_____10c-t_mFor-cx-synatt-i": 100,
+      "_____10c-t_mFor-cx-synatt-f": 100,
       "_____10c-t_mFor-cx-pstcr_-f": 500,
       "_____10c-t_mFor-cx-pstcrm-f": 35,
       "_____10c-t_mFor-cx-plst_c-f": 5,
@@ -400,7 +400,7 @@
       "_____10c-t_mBck-nx-___bbx-i": 4,
       "_____10c-t_mBck-nx-___bby-i": 1,
       "_____10c-t_mBck-nx-___bbz-i": 1,
-      "_____10c-t_mBck-cx-synatt-i": 100,
+      "_____10c-t_mBck-cx-synatt-f": 100,
       "_____10c-t_mBck-cx-pstcr_-f": 2000,
       "_____10c-t_mBck-cx-pstcrm-f": 35,
       "_____10c-t_mBck-cx-plst_c-f": 5,
@@ -434,7 +434,7 @@
       "_____10c-i__mot-nx-___bbx-i": 8,
       "_____10c-i__mot-nx-___bby-i": 1,
       "_____10c-i__mot-nx-___bbz-i": 10,
-      "_____10c-i__mot-cx-synatt-i": 100,
+      "_____10c-i__mot-cx-synatt-f": 100,
       "_____10c-i__mot-cx-pstcr_-f": 500,
       "_____10c-i__mot-cx-pstcrm-f": 35,
       "_____10c-i__mot-cx-plst_c-f": 5,
@@ -480,7 +480,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 500,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -514,7 +514,7 @@
       "_____10c-t_pmot-nx-___bbx-i": 8,
       "_____10c-t_pmot-nx-___bby-i": 1,
       "_____10c-t_pmot-nx-___bbz-i": 1,
-      "_____10c-t_pmot-cx-synatt-i": 100,
+      "_____10c-t_pmot-cx-synatt-f": 100,
       "_____10c-t_pmot-cx-pstcr_-f": 500,
       "_____10c-t_pmot-cx-pstcrm-f": 35,
       "_____10c-t_pmot-cx-plst_c-f": 0.05,
@@ -548,7 +548,7 @@
       "_____10c-t_mTha-nx-___bbx-i": 8,
       "_____10c-t_mTha-nx-___bby-i": 1,
       "_____10c-t_mTha-nx-___bbz-i": 1,
-      "_____10c-t_mTha-cx-synatt-i": 100,
+      "_____10c-t_mTha-cx-synatt-f": 100,
       "_____10c-t_mTha-cx-pstcr_-f": 500,
       "_____10c-t_mTha-cx-pstcrm-f": 35,
       "_____10c-t_mTha-cx-plst_c-f": 0.05,
@@ -582,7 +582,7 @@
       "_____10c-t_bDec-nx-___bbx-i": 8,
       "_____10c-t_bDec-nx-___bby-i": 1,
       "_____10c-t_bDec-nx-___bbz-i": 1,
-      "_____10c-t_bDec-cx-synatt-i": 100,
+      "_____10c-t_bDec-cx-synatt-f": 100,
       "_____10c-t_bDec-cx-pstcr_-f": 50,
       "_____10c-t_bDec-cx-pstcrm-f": 35,
       "_____10c-t_bDec-cx-plst_c-f": 0.05,
@@ -616,7 +616,7 @@
       "_____10c-t_mbab-nx-___bbx-i": 256,
       "_____10c-t_mbab-nx-___bby-i": 1,
       "_____10c-t_mbab-nx-___bbz-i": 1,
-      "_____10c-t_mbab-cx-synatt-i": 100,
+      "_____10c-t_mbab-cx-synatt-f": 100,
       "_____10c-t_mbab-cx-pstcr_-f": 50,
       "_____10c-t_mbab-cx-pstcrm-f": 35,
       "_____10c-t_mbab-cx-plst_c-f": 0.05,
@@ -650,7 +650,7 @@
       "_____10c-t_mbbb-nx-___bbx-i": 2560,
       "_____10c-t_mbbb-nx-___bby-i": 1,
       "_____10c-t_mbbb-nx-___bbz-i": 1,
-      "_____10c-t_mbbb-cx-synatt-i": 100,
+      "_____10c-t_mbbb-cx-synatt-f": 100,
       "_____10c-t_mbbb-cx-pstcr_-f": 50,
       "_____10c-t_mbbb-cx-pstcrm-f": 35,
       "_____10c-t_mbbb-cx-plst_c-f": 0.05,
@@ -696,7 +696,7 @@
       "_____10c-i__bat-nx-___bbx-i": 1,
       "_____10c-i__bat-nx-___bby-i": 1,
       "_____10c-i__bat-nx-___bbz-i": 10,
-      "_____10c-i__bat-cx-synatt-i": 100,
+      "_____10c-i__bat-cx-synatt-f": 100,
       "_____10c-i__bat-cx-pstcr_-f": 50000,
       "_____10c-i__bat-cx-pstcrm-f": 35,
       "_____10c-i__bat-cx-plst_c-f": 0.05,
diff --git a/src/evo/genome_processor.py b/src/evo/genome_processor.py
index 869d6f1ae..fb5d77505 100644
--- a/src/evo/genome_processor.py
+++ b/src/evo/genome_processor.py
@@ -351,12 +351,12 @@ def genome_v1_v2_converter(genome_v1):
                             ltd_multiplier = 1
 
                         destination_map[destination].append([morphology_id,
-                                                            morphology_scalar,
-                                                            postSynapticCurrent_multiplier,
-                                                            plasticity_flag,
-                                                            plasticity_constant,
-                                                            ltp_multiplier,
-                                                            ltd_multiplier])
+                                                             morphology_scalar,
+                                                             postSynapticCurrent_multiplier,
+                                                             plasticity_flag,
+                                                             plasticity_constant,
+                                                             ltp_multiplier,
+                                                             ltd_multiplier])
 
                 genome_v2['blueprint'][gene] = destination_map
             else:
@@ -490,7 +490,7 @@ def genome_stat_updator(genome: dict):
 gene_decoder = {
     "_______c-______-cx-__name-t": "cortical_name",
     "_______c-______-cx-_n_cnt-i": "cortical_neuron_count",
-    "_______c-______-cx-gd_vis-b": "godot_visualization",
+    "_______c-______-cx-gd_vis-b": "visualization",
     "_______c-______-cx-rcordx-i": "relative_coordinate_x",
     "_______c-______-cx-rcordy-i": "relative_coordinate_y",
     "_______c-______-cx-rcordz-i": "relative_coordinate_z",
@@ -499,7 +499,7 @@ def genome_stat_updator(genome: dict):
     "_______c-______-cx-___bbx-i": "block_boundary_x",
     "_______c-______-cx-___bby-i": "block_boundary_y",
     "_______c-______-cx-___bbz-i": "block_boundary_z",
-    "_______c-______-cx-synatt-i": "synapse_attractivity",
+    "_______c-______-cx-synatt-f": "synapse_attractivity",
     "_______c-______-cx-__rand-b": "location_generation_type",
     "_______c-______-cx-dstmap-d": "cortical_mapping_dst",
     "_______c-______-cx-de_gen-f": "degeneration",
@@ -509,19 +509,19 @@ def genome_stat_updator(genome: dict):
     "_______c-______-nx-ftincx-f": "firing_threshold_increment_x",
     "_______c-______-nx-ftincy-f": "firing_threshold_increment_y",
     "_______c-______-nx-ftincz-f": "firing_threshold_increment_z",
-    "_______c-______-nx-fthlim-i": "firing_threshold_limit",
+    "_______c-______-nx-fthlim-f": "firing_threshold_limit",
     "_______c-______-nx-mp_acc-b": "mp_charge_accumulation",
     "_______c-______-nx-mp_psp-b": "mp_driven_psp",
     "_______c-______-nx-refrac-i": "refractory_period",
     "_______c-______-nx-leak_c-f": "leak_coefficient",
-    "_______c-______-nx-leak_v-i": "leak_variability",
+    "_______c-______-nx-leak_v-f": "leak_variability",
     "_______c-______-nx-c_fr_c-i": "consecutive_fire_cnt_max",
     "_______c-______-nx-snooze-f": "snooze_length",
     "_______c-______-cx-memory-b": "is_mem_type",
     "_______c-______-cx-mem__t-i": "longterm_mem_threshold",
     "_______c-______-cx-mem_gr-i": "lifespan_growth_rate",
     "_______c-______-cx-mem_ls-i": "init_lifespan",
-    "_______c-______-nx-excite-i": "neuron_excitability"
+    "_______c-______-nx-excite-f": "neuron_excitability"
 }
 
 genome_1_template = {
@@ -580,14 +580,14 @@ def genome_stat_updator(genome: dict):
     "___bby-i": "block_boundaries",
     "___bbz-i": "block_boundaries",
     "__rand-b": "location_generation_type",
-    "synatt-i": "synapse_attractivity",
+    "synatt-f": "synapse_attractivity",
     "pstcr_-f": "postsynaptic_current",
     "pstcrm-f": "postsynaptic_current_max",
     "fire_t-f": 'firing_threshold',
     "ftincx-f": "firing_threshold_increment_x",
     "ftincy-f": "firing_threshold_increment_y",
     "ftincz-f": "firing_threshold_increment_z",
-    "fthlim-i": "firing_threshold_limit",
+    "fthlim-f": "firing_threshold_limit",
     "refrac-i": "refractory_period",
     "leak_c-f": "leak_coefficient",
     "leak_v-f": "leak_variability",
@@ -604,7 +604,7 @@ def genome_stat_updator(genome: dict):
     "mem__t-i": "longterm_mem_threshold",
     "mem_gr-i": "lifespan_growth_rate",
     "mem_ls-i": "init_lifespan",
-    "excite-i": "neuron_excitability"
+    "excite-f": "neuron_excitability"
 }
 
 genome_1_to_2 = {
@@ -614,15 +614,15 @@ def genome_stat_updator(genome: dict):
     "per_voxel_neuron_cnt": "cx-_n_cnt-i",
     "visualization": "cx-gd_vis-b",
     "location_generation_type": "cx-__rand-b",
-    "synapse_attractivity": "cx-synatt-i",
+    "synapse_attractivity": "cx-synatt-f",
     "postsynaptic_current": "nx-pstcr_-f",
     "postsynaptic_current_max": "nx-pstcrm-f",
     'firing_threshold': "nx-fire_t-f",
     "firing_threshold_increment_x": "nx-ftincx-f",
     "firing_threshold_increment_y": "nx-ftincy-f",
     "firing_threshold_increment_z": "nx-ftincz-f",
-    "neuron_excitability": "nx-excite-i",
-    "firing_threshold_limit": "nx-fthlim-i",
+    "neuron_excitability": "nx-excite-f",
+    "firing_threshold_limit": "nx-fthlim-f",
     "refractory_period": "nx-refrac-i",
     "leak_coefficient": "nx-leak_c-f",
     "leak_variability": "nx-leak_v-f",
diff --git a/src/evo/neuroembryogenesis.py b/src/evo/neuroembryogenesis.py
index 33bed3056..916f64907 100644
--- a/src/evo/neuroembryogenesis.py
+++ b/src/evo/neuroembryogenesis.py
@@ -232,6 +232,7 @@ def neurogenesis(cortical_area):
     #                             parameters=runtime_data.parameters)
     # disk_ops.save_voxel_dict_to_disk(cortical_area=cortical_area,
     #                                  voxel_dict=runtime_data.voxel_dict)
+    return neuron_count
 
 
 def synaptogenesis(cortical_area, dst_cortical_area=None):
@@ -259,7 +260,7 @@ def build_synapses(genome, brain, parameters, voxel_dict, connectome_path, src_c
     runtime_data.connectome_path = connectome_path
     # Read Genome data
     cortical_genes = genome["blueprint"][src_cortical_area]
-
+    synapse_count_ = 0
     if dst_cortical_area and dst_cortical_area in cortical_genes["cortical_mapping_dst"]:
         timer = datetime.datetime.now()
         synapse_count_, runtime_data.brain = \
@@ -275,6 +276,7 @@ def build_synapses(genome, brain, parameters, voxel_dict, connectome_path, src_c
 
             intercortical_mapping.append((src_cortical_area, mapped_cortical_area, synapse_count_))
 
+    runtime_data.brain_stats["synapse_count"] += synapse_count_
     # disk_ops.save_brain_to_disk(cortical_area=src_cortical_area, brain=runtime_data.brain, parameters=parameters)
     return intercortical_mapping
 
diff --git a/src/evo/neuron.py b/src/evo/neuron.py
index 364d39b48..9c898f1d1 100644
--- a/src/evo/neuron.py
+++ b/src/evo/neuron.py
@@ -129,7 +129,7 @@ def init_neuron(cortical_area, soma_location, mem_neuron_id=None):
             leak = leak + leak * random.randrange(1, int(leak_variability), 1) / 100
 
     runtime_data.brain[cortical_area][neuron_id]["leak_coefficient"] = leak
-
+    runtime_data.brain_stats["neuron_count"] += 1
     return neuron_id
 
 
@@ -169,6 +169,8 @@ def neuron_apoptosis(cortical_area, neuron_id):
         if neuron_id in runtime_data.fire_queue[cortical_area]:
             runtime_data.fire_queue[cortical_area].remove(neuron_id)
 
+    runtime_data.brain_stats["neuron_count"] -= 1
+
 
 def increase_neuron_lifespan(cortical_area, neuron_id):
     if cortical_area in runtime_data.brain:
diff --git a/src/evo/region.py b/src/evo/region.py
new file mode 100644
index 000000000..0486f8ccd
--- /dev/null
+++ b/src/evo/region.py
@@ -0,0 +1,345 @@
+
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+"""
+This module covers needed functions for brain region management
+"""
+import json
+import string
+import random
+import datetime
+import traceback
+
+from time import time
+
+from src.inf import runtime_data
+from src.evo.voxels import generate_cortical_dimensions_by_id
+from src.evo.stats import cortical_area_anatomical_stats
+from src.evo.genetics import genome_id_gen
+from src.evo.genome_processor import genome_v1_v2_converter
+from src.evo.genome_editor import generate_hash
+from src.evo.synapse import neighboring_cortical_areas
+from src.api.commons import CustomError
+
+
+def region_id_gen(size=6, chars=string.ascii_uppercase + string.digits):
+
+    now = datetime.datetime.now()
+    # Rand gen source partially from:
+    # http://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python
+    return str(now.strftime("%Y%m%d%H%M%S%f")[2:]) + '_' + (''.join(random.choice(chars) for _ in range(size))) + '_R'
+
+
+def region_id_2_title(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        return runtime_data.genome["brain_regions"][region_id]["title"]
+
+
+def change_cortical_area_parent(cortical_area_id, new_parent_id):
+    try:
+        current_parent_id = runtime_data.cortical_area_region_association[cortical_area_id]
+        print("current_parent_id:", current_parent_id, new_parent_id)
+        runtime_data.cortical_area_region_association[cortical_area_id] = new_parent_id
+        print(">>", runtime_data.genome["brain_regions"][current_parent_id]["areas"])
+        if cortical_area_id in runtime_data.genome["brain_regions"][current_parent_id]["areas"]:
+            runtime_data.genome["brain_regions"][current_parent_id]["areas"].remove(cortical_area_id)
+        else:
+            print(f"{cortical_area_id} not found in current region {current_parent_id}")
+        print(">>", runtime_data.genome["brain_regions"][current_parent_id]["areas"])
+        runtime_data.genome["brain_regions"][new_parent_id]["areas"].append(cortical_area_id)
+    except Exception as e:
+        print(f"Exception during change of cortical area region assignment: {e}", traceback.print_exc())
+
+
+def change_brain_region_parent(region_id, new_parent_id):
+    current_parent_id = runtime_data.genome["brain_regions"][region_id]["parent_region_id"]
+    runtime_data.genome["brain_regions"][region_id]["parent_region_id"] = new_parent_id
+    runtime_data.genome["brain_regions"][current_parent_id]["regions"].remove(region_id)
+    runtime_data.genome["brain_regions"][new_parent_id]["regions"].append(region_id)
+
+
+def create_region(region_data):
+    region_id = region_id_gen()
+    runtime_data.genome["brain_regions"][region_id] = {}
+    runtime_data.genome["brain_regions"][region_id]["title"] = region_data.title
+    runtime_data.genome["brain_regions"][region_id]["description"] = region_data.region_description
+    runtime_data.genome["brain_regions"][region_id]["parent_region_id"] = region_data.parent_region_id
+    runtime_data.genome["brain_regions"][region_id]["coordinate_2d"] = region_data.coordinates_2d
+    runtime_data.genome["brain_regions"][region_id]["coordinate_3d"] = region_data.coordinates_3d
+    runtime_data.genome["brain_regions"][region_id]["areas"] = list()
+    runtime_data.genome["brain_regions"][region_id]["regions"] = list()
+    runtime_data.genome["brain_regions"][region_id]["inputs"] = list()
+    runtime_data.genome["brain_regions"][region_id]["outputs"] = list()
+    # runtime_data.genome["brain_regions"][region_id]["suggested_afferents"] = list()
+    # runtime_data.genome["brain_regions"][region_id]["suggested_efferents"] = list()
+    runtime_data.genome["brain_regions"][region_id]["regions"] = list()
+    runtime_data.genome["brain_regions"][region_id]["signature"] = ""
+    runtime_data.genome["brain_regions"][region_data.parent_region_id]["regions"].append(region_id)
+    if region_data.areas:
+        for associated_area in region_data.areas:
+            if associated_area in runtime_data.cortical_list:
+                change_cortical_area_parent(cortical_area_id=associated_area,
+                                            new_parent_id=region_id)
+
+    if region_data.regions:
+        for associated_region in region_data.regions:
+            if associated_region in runtime_data.genome["brain_regions"]:
+                runtime_data.genome["brain_regions"][region_id]["regions"].append(associated_region)
+    return region_id
+
+
+def update_region(region_data):
+    region_id = region_data["region_id"]
+    region_data.pop("region_id")
+    for update in region_data:
+        if update not in ["area", "region"]:
+            if update == "parent_region_id":
+                change_brain_region_parent(region_id=region_id, new_parent_id=update["parent_region_id"])
+            else:
+                runtime_data.genome["brain_regions"][region_id][update] = region_data[update]
+        else:
+            raise CustomError(status_code=400, message=f"{update} cannot be updated using this endpoint")
+
+
+def delete_region_with_members(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        parent_region = runtime_data.genome["brain_regions"][region_id]["parent_region_id"]
+        for area in runtime_data.genome["brain_regions"][region_id]:
+            change_cortical_area_parent(cortical_area_id=area, new_parent_id=parent_region)
+        for region in runtime_data.genome["brain_regions"][region_id]:
+            change_brain_region_parent(region_id=region, new_parent_id=parent_region)
+        runtime_data.genome["brain_regions"].pop(region_id)
+
+
+def relocate_region_members(relocation_data):
+    for object_id in relocation_data:
+        if object_id in runtime_data.genome["blueprint"]:
+            if "coordinate_2d" in relocation_data[object_id]:
+                runtime_data.genome["blueprint"][object_id]["2d_coordinate"][0] = \
+                    relocation_data[object_id]["coordinate_2d"][0]
+                runtime_data.genome["blueprint"][object_id]["2d_coordinate"][1] = \
+                    relocation_data[object_id]["coordinate_2d"][1]
+            if "parent_region_id" in relocation_data[object_id]:
+                change_cortical_area_parent(cortical_area_id=object_id,
+                                            new_parent_id=relocation_data[object_id]["parent_region_id"])
+
+        elif object_id in runtime_data.genome["brain_regions"]:
+            if "coordinate_2d" in relocation_data[object_id]:
+                runtime_data.genome["brain_regions"][object_id]["coordinate_2d"][0] = \
+                    relocation_data[object_id]["coordinate_2d"][0]
+                runtime_data.genome["brain_regions"][object_id]["coordinate_2d"][1] = \
+                    relocation_data[object_id]["coordinate_2d"][1]
+            if "parent_region_id" in relocation_data[object_id]:
+                if relocation_data[object_id]["parent_region_id"] in runtime_data.genome["brain_regions"]:
+                    change_brain_region_parent(region_id=object_id,
+                                               new_parent_id=relocation_data[object_id]["parent_region_id"])
+                else:
+                    parent_id = relocation_data[object_id]["parent_region_id"]
+                    raise CustomError(status_code=400, message=f"{parent_id} is not a valid region id")
+        else:
+            raise CustomError(status_code=400, message=f"{object_id} is not a valid region nor cortical id")
+
+    runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+
+
+def direct_region_cortical_areas(region_id):
+    area_list = runtime_data.genome["brain_regions"][region_id]["areas"]
+    return area_list
+
+
+def recursive_sub_regions(region_id):
+    region_list = set()
+    for region in runtime_data.genome["brain_regions"][region_id]["regions"]:
+        region_list.add(region)
+
+    return region_list
+
+
+def recursive_region_cortical_areas(region_id):
+    recursive_region_list = recursive_sub_regions(region_id)
+    area_list = set()
+    area_list.update(set(direct_region_cortical_areas(region_id=region_id)))
+    for sub_region_id in recursive_region_list:
+        area_list.update(set(direct_region_cortical_areas(region_id=sub_region_id)))
+    return area_list
+
+
+def construct_genome_from_region(region_id):
+    genome_from_region = {
+        "genome_title": runtime_data.genome["brain_regions"][region_id].get("title", "No Title"),
+        "genome_description": runtime_data.genome["brain_regions"][region_id].get("description", "No Description"),
+        "timestamp": time(),
+        "genome_id": genome_id_gen(size=6, chars=string.ascii_uppercase + string.digits),
+        "version": runtime_data.genome["version"],
+        "signatures": {},
+        "stats": {},
+        "hosts": {},
+        "physiology": runtime_data.genome["physiology"],
+        "neuron_morphologies": {},
+        "blueprint": {},
+        "brain_regions": {
+            "root": {
+                "title": runtime_data.genome["brain_regions"][region_id].get("title", "No Title"),
+                "parent_region_id": None,
+                "coordinate_2d": [0, 0],
+                "coordinate_3d": [0, 0, 0],
+                "areas": runtime_data.genome["brain_regions"][region_id]["areas"],
+                "regions": runtime_data.genome["brain_regions"][region_id]["regions"],
+                "inputs": [],
+                "outputs": []
+            }
+        }
+    }
+
+    region_cortical_list = direct_region_cortical_areas(region_id=region_id)
+    comprehensive_subregion_list = recursive_sub_regions(region_id=region_id)
+    comprehensive_area_list = recursive_region_cortical_areas(region_id=region_id)
+
+    # Generate blueprint
+    for cortical_area in comprehensive_area_list:
+        genome_from_region["blueprint"][cortical_area] = runtime_data.genome["blueprint"][cortical_area].copy()
+
+    # Create Region list
+    genome_from_region["brain_regions"]["root"] = runtime_data.genome["brain_regions"][region_id].copy()
+    genome_from_region["brain_regions"]["root"]["parent_region_id"] = None
+    genome_from_region["brain_regions"]["root"]["coordinate_2d"] = [0, 0]
+    genome_from_region["brain_regions"]["root"]["coordinate_3d"] = [0, 0, 0]
+
+    for region in comprehensive_subregion_list:
+        genome_from_region["brain_regions"][region] = runtime_data.genome["brain_regions"][region].copy()
+
+    region_afferents = set()
+    region_efferents = set()
+
+    # Create suggested input/output mappings for all regions
+    """
+    suggested_afferents = [
+        {
+            "src_cortical_area_id": "___pwr",
+            "src_cortical_area_name": "brain_power",
+            "src_cortical_area_custom_label": "power",
+            "dst_cortical_area_id": "C2WFW3",
+            "morphology_id": "projector",
+            "postSynapticCurrent_multiplier": "1",
+            "morphology_scalar": [1,1,1],
+            "plasticity_flag": True,
+            "plasticity_constant": 1,
+            "ltp_multiplier": 2,
+            "ltd_multiplier": 1
+        },
+        {}
+    ]
+    """
+    for subregion in runtime_data.genome["brain_regions"][region_id]["regions"] + [region_id]:
+        subregion_suggested_afferents = []
+        subregion_suggested_efferents = []
+        afferent_areas = set()
+        efferent_areas = set()
+        subregion_recursive_cortical_list = recursive_region_cortical_areas(region_id=subregion)
+
+        # Develop Afferent / Efferent lists
+        for area in runtime_data.genome["brain_regions"][subregion]["areas"]:
+            upstream_cortical_areas, downstream_cortical_areas = \
+                neighboring_cortical_areas(cortical_area=area, blueprint=runtime_data.genome["blueprint"])
+
+            # Afferents
+            for area_ in upstream_cortical_areas:
+                if area_ not in subregion_recursive_cortical_list:
+                    afferent_areas.add(area_)
+
+            # Efferents
+            for area_ in downstream_cortical_areas:
+                if area_ not in subregion_recursive_cortical_list:
+                    efferent_areas.add(area_)
+
+        # Build suggested afferent list for each region
+        for afferent_area in afferent_areas:
+            for dst in runtime_data.genome["blueprint"][afferent_area]["cortical_mapping_dst"]:
+                if dst in region_cortical_list:
+                    for mapping in runtime_data.genome["blueprint"][afferent_area]["cortical_mapping_dst"][dst]:
+                        mapping["src_cortical_area_id"] = afferent_area
+                        mapping["src_cortical_area_name"] = runtime_data.genome["blueprint"][afferent_area][
+                            "cortical_name"]
+                        mapping["src_cortical_area_custom_label"] = None
+                        mapping["dst_cortical_area_id"] = dst
+                        subregion_suggested_afferents.append(mapping)
+
+        # Build suggested efferent list
+        for cortical_area in comprehensive_area_list:
+            for dst in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
+                if dst in efferent_areas:
+                    for mapping in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"][dst]:
+                        mapping["src_cortical_area_id"] = cortical_area
+                        mapping["src_cortical_area_name"] = runtime_data.genome["blueprint"][cortical_area][
+                            "cortical_name"]
+                        mapping["src_cortical_area_custom_label"] = None
+                        mapping["dst_cortical_area_id"] = dst
+                        subregion_suggested_efferents.append(mapping)
+
+        if subregion == region_id:
+            genome_from_region["brain_regions"]["root"]["inputs"] = subregion_suggested_afferents
+            genome_from_region["brain_regions"]["root"]["outputs"] = subregion_suggested_efferents
+        # else:
+        #     genome_from_region["brain_regions"][subregion]["inputs"] = subregion_suggested_afferents
+        #     genome_from_region["brain_regions"][subregion]["outputs"] = subregion_suggested_efferents
+
+        region_efferents.update(efferent_areas)
+        region_afferents.update(afferent_areas)
+
+    # Scrub Efferents
+    for cortical_area in genome_from_region["blueprint"].copy():
+        for dst in genome_from_region["blueprint"][cortical_area]["cortical_mapping_dst"].copy():
+            if dst in region_efferents:
+                genome_from_region["blueprint"][cortical_area]["cortical_mapping_dst"].pop(dst)
+
+    # Set region stats
+    region_neuron_count = 0
+    region_synapse_count = 0
+
+    for cortical_area in comprehensive_area_list:
+        neuron_cnt, synapse_cnt = cortical_area_anatomical_stats(cortical_area=cortical_area)
+        region_neuron_count += neuron_cnt
+        region_synapse_count += synapse_cnt
+
+    genome_from_region["stats"]["innate_cortical_area_count"] = len(comprehensive_area_list)
+    genome_from_region["stats"]["innate_neuron_count"] = region_neuron_count
+    genome_from_region["stats"]["innate_synapse_count"] = region_synapse_count
+
+    # Set morphologies
+    morphology_list = set()
+    for cortical_area in comprehensive_area_list:
+        for mapping_destination in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
+            for mapping in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"][mapping_destination]:
+                morphology_list.add(mapping["morphology_id"])
+
+    for morphology_id in morphology_list:
+        genome_from_region["neuron_morphologies"][morphology_id] = \
+            runtime_data.genome["neuron_morphologies"][morphology_id].copy()
+
+    # Set signatures
+    genome_from_region["signatures"]["genome"] = generate_hash(genome_from_region)
+    genome_from_region["signatures"]["blueprint"] = generate_hash(genome_from_region["blueprint"])
+    genome_from_region["signatures"]["physiology"] = generate_hash(genome_from_region["physiology"])
+
+    # Convert Genome to 2.0
+    genome_from_region["blueprint"] = genome_v1_v2_converter(genome_from_region)["blueprint"]
+
+    return genome_from_region
+
+
+def cortical_area_region_sanity_check(cortical_area):
+    if cortical_area not in runtime_data.cortical_area_region_association:
+        runtime_data.cortical_area_region_association[cortical_area] = "root"
diff --git a/src/evo/stats.py b/src/evo/stats.py
index 3e38a9106..160bbff35 100644
--- a/src/evo/stats.py
+++ b/src/evo/stats.py
@@ -47,7 +47,7 @@ def connectome_neuron_count():
     return total_neuron_count
 
 
-def connectome_total_synapse_cnt(cortical_area):
+def cortical_area_anatomical_stats(cortical_area):
     """
     Returns the total number of Neurons and Synapses for a given cortical area
     """
@@ -65,7 +65,7 @@ def brain_total_synapse_cnt(verbose=True):
     brain_synapse_cnt = 0
     brain_neuron_cnt = 0
     for cortical_area in runtime_data.brain:
-        neuron_count, synapse_count = connectome_total_synapse_cnt(cortical_area)
+        neuron_count, synapse_count = cortical_area_anatomical_stats(cortical_area)
         brain_neuron_cnt = brain_neuron_cnt + neuron_count
         brain_synapse_cnt = brain_synapse_cnt + synapse_count
         if verbose:
@@ -94,7 +94,7 @@ def connectome_neighbor_histogram(cortical_area):
 def print_cortical_stats():
     for cortical_area in runtime_data.cortical_list:
         print("%s total Neuron count: %i" % (cortical_area, connectome_neuron_count(cortical_area)))
-        print("%s average synapse count per Neuron: %i" % (cortical_area, connectome_total_synapse_cnt(cortical_area)/connectome_neuron_count(cortical_area)))
+        print("%s average synapse count per Neuron: %i" % (cortical_area, cortical_area_anatomical_stats(cortical_area)/connectome_neuron_count(cortical_area)))
     return
 
 
diff --git a/src/evo/synapse.py b/src/evo/synapse.py
index ac7879de2..8f86d63f5 100644
--- a/src/evo/synapse.py
+++ b/src/evo/synapse.py
@@ -237,11 +237,14 @@ def cortical_mapping(blueprint=None):
 
 
 def synaptic_pruner(src_cortical_area, dst_cortical_area):
+    synapse_count = 0
     for neuron in runtime_data.brain[src_cortical_area].copy():
         for neighbor in runtime_data.brain[src_cortical_area][neuron]['neighbors'].copy():
             if runtime_data.brain[src_cortical_area][neuron]['neighbors'][neighbor]['cortical_area'] == \
                     dst_cortical_area:
                 runtime_data.brain[src_cortical_area][neuron]['neighbors'].pop(neighbor)
+                synapse_count += 1
+    runtime_data.brain_stats["synapse_count"] -= synapse_count
     return runtime_data.brain
 
 
@@ -285,3 +288,18 @@ def synapse_memory_neuron(neuron_id):
                                                                 src_neuron=neuron_id,
                                                                 dst_area=dst_cortical_area,
                                                                 candidate_list=neighbor_candidates)
+
+
+def neighboring_cortical_areas(cortical_area, blueprint=None):
+    try:
+        if not blueprint:
+            blueprint = runtime_data.genome["blueprint"]
+        cortical_mappings = cortical_mapping(blueprint=blueprint)
+        upstream_cortical_areas = set()
+        downstream_cortical_areas = set(cortical_mappings[cortical_area])
+        for area in cortical_mappings:
+            if cortical_area in cortical_mappings[area]:
+                upstream_cortical_areas.add(area)
+        return upstream_cortical_areas, downstream_cortical_areas
+    except KeyError:
+        print("Exception in neighboring_cortical_areas: Cortical area not found", traceback.print_exc())
diff --git a/src/evo/synaptogenesis_rules.py b/src/evo/synaptogenesis_rules.py
index 6efa75b93..5765e626f 100644
--- a/src/evo/synaptogenesis_rules.py
+++ b/src/evo/synaptogenesis_rules.py
@@ -209,31 +209,59 @@ def match_patterns(src_voxel, cortical_area_dst, pattern, morphology_scalar, src
             for dst_z in range(dst_block_boundaries[2]):
 
                 matching_condition_x = \
-                    ((dst_pattern_x == "*" and
-                      (src_pattern_x == "*" or src_pattern_x == "?" or src_pattern_x == src_x)) or
-                     (dst_pattern_x == "?" and (src_pattern_x == "*" or src_pattern_x == "?" or src_x == dst_x)) or
-                     (dst_pattern_x == dst_x and (src_pattern_x == "*" or
-                                                  (src_pattern_x == "?" and src_x == dst_x) or
-                                                  (src_pattern_x == src_x))))
+                    (
+                            dst_pattern_x == "*"
+                            or
+                            (dst_pattern_x == "?" and
+                             (src_x == dst_x))
+                            or
+                            (dst_pattern_x == "!" and
+                             (src_x != dst_x))
+                            or
+                            (dst_pattern_x == dst_x and
+                             (src_pattern_x == "*" or
+                              (src_pattern_x == "?" and src_x == dst_x) or
+                              (src_pattern_x == "!" and src_x != dst_x) or
+                              (src_pattern_x == src_x)))
+                    )
 
                 matching_condition_y = \
-                    ((dst_pattern_y == "*" and
-                      (src_pattern_y == "*" or src_pattern_y == "?" or src_pattern_y == src_y) or
-                      (dst_pattern_y == "?" and (src_pattern_y == "*" or src_pattern_y == "?" or src_y == dst_y)) or
-                      (dst_pattern_y == dst_y and (src_pattern_y == "*" or (src_pattern_y == "?" and src_y == dst_y) or
-                                                  (src_pattern_y == src_y)))))
+                    (
+                            dst_pattern_y == "*"
+                            or
+                            (dst_pattern_y == "?" and
+                             (src_y == dst_y))
+                            or
+                            (dst_pattern_y == "!" and
+                             (src_y != dst_y))
+                            or
+                            (dst_pattern_y == dst_y and
+                             (src_pattern_y == "*" or
+                              (src_pattern_y == "?" and src_y == dst_y) or
+                              (src_pattern_y == "!" and src_y != dst_y) or
+                              (src_pattern_y == src_y)))
+                    )
 
                 matching_condition_z = \
-                    ((dst_pattern_z == "*" and
-                      (src_pattern_z == "*" or src_pattern_z == "?" or src_pattern_z == src_z) or
-                      (dst_pattern_z == "?" and (src_pattern_z == "*" or src_pattern_z == "?" or src_z == dst_z)) or
-                      (dst_pattern_z == dst_z and (src_pattern_z == "*" or (src_pattern_z == "?" and src_z == dst_z) or
-                                                  (src_pattern_z == src_z)))))
+                    (
+                            dst_pattern_z == "*"
+                            or
+                            (dst_pattern_z == "?" and
+                             (src_z == dst_z))
+                            or
+                            (dst_pattern_z == "!" and
+                             (src_z != dst_z))
+                            or
+                            (dst_pattern_z == dst_z and
+                             (src_pattern_z == "*" or
+                              (src_pattern_z == "?" and src_z == dst_z) or
+                              (src_pattern_z == "!" and src_z != dst_z) or
+                              (src_pattern_z == src_z)))
+                    )
 
                 if matching_condition_x and matching_condition_y and matching_condition_z:
                     voxel_list.append([dst_x, dst_y, dst_z])
 
-    # print("Matched voxel list based on pattern:", src_voxel, cortical_area_dst, voxel_list)
 
     # todo: account for morphology scalar
 
@@ -385,13 +413,13 @@ def syn_projector(src_cortical_area, dst_cortical_area, src_neuron_id, src_subre
         for i in range(3):
             dst_vox_dict[i] = set()
             if src_shape[i] > dst_shape[i]:
-                ratio = src_shape[i]//dst_shape[i]
-                target_vox = (neuron_location[i] - src_subregion[0][i])//ratio
+                ratio = src_shape[i]/dst_shape[i]
+                target_vox = int((neuron_location[i] - src_subregion[0][i])/ratio)
                 dst_vox_dict[i].add(target_vox)
             elif src_shape[i] < dst_shape[i]:
-                ratio = dst_shape[i]//src_shape[i]
+                ratio = dst_shape[i]/src_shape[i]
                 for vox in range(dst_shape[i]):
-                    if vox//ratio == (neuron_location[i] - src_subregion[0][i]):
+                    if int(vox/ratio) == (neuron_location[i] - src_subregion[0][i]):
                         target_vox = vox
                         dst_vox_dict[i].add(target_vox)
             elif src_shape[i] == dst_shape[i]:
diff --git a/src/evo/templates.py b/src/evo/templates.py
index 690362b9f..637adf648 100644
--- a/src/evo/templates.py
+++ b/src/evo/templates.py
@@ -34,11 +34,17 @@
                 "structure": "asymmetric",
                 "resolution": [1, 1, 1]
             },
-            "i_gpio": {
+            "idgpio": {
                 "enabled": True,
-                "cortical_name": "GPIO input",
+                "cortical_name": "Digital GPIO input",
                 "structure": "asymmetric",
-                "resolution": [13, 1, 1]
+                "resolution": [28, 1, 1]
+            },
+            "iagpio": {
+                "enabled": True,
+                "cortical_name": "Analog GPIO input",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 10]
             },
             "i__pro": {
                 "enabled": True,
@@ -135,6 +141,18 @@
                 "cortical_name": "Servo position sensor",
                 "structure": "asymmetric",
                 "resolution": [1, 1, 21]
+            },
+            "i_smot": {
+                "enabled": True,
+                "cortical_name": "Servo motion sensor",
+                "structure": "asymmetric",
+                "resolution": [1, 1, 21]
+            },
+            "i__bci": {
+                "enabled": True,
+                "cortical_name": "BCI",
+                "structure": "asymmetric",
+                "resolution": [1, 1, 1]
             }
         }
     },
@@ -147,6 +165,30 @@
                 "structure": "asymmetric",
                 "resolution": [2, 1, 10]
             },
+            "odgpio": {
+                "enabled": True,
+                "cortical_name": "Digital GPIO output",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1]
+            },
+            "oagpio": {
+                "enabled": True,
+                "cortical_name": "Analog GPIO output",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 10]
+            },
+            "oogpio": {
+                "enabled": True,
+                "cortical_name": "GPIO output pin assignment",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1]
+            },
+            "oigpio": {
+                "enabled": True,
+                "cortical_name": "GPIO input pin assignment",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1]
+            },
             "o__ser": {
                 "enabled": True,
                 "cortical_name": "Servo control",
@@ -207,6 +249,12 @@
                 "structure": "asymmetric",
                 "resolution": [1, 10, 1]
             },
+            "o__loc": {
+                "enabled": True,
+                "cortical_name": "Recognition Location",
+                "structure": "asymmetric",
+                "resolution": [32, 32, 1]
+            },
             "ov_enh": {
                 "enabled": True,
                 "cortical_name": "Lighting enhancement",
diff --git a/src/evo/voxels.py b/src/evo/voxels.py
index 73c946cc2..1e594bbfd 100644
--- a/src/evo/voxels.py
+++ b/src/evo/voxels.py
@@ -14,10 +14,10 @@
 # limitations under the License.
 # ==============================================================================
 
+import json
 from math import floor
 from src.inf import runtime_data
 import logging
-import traceback
 
 
 logger = logging.getLogger(__name__)
@@ -320,3 +320,70 @@ def subregion_neurons(src_cortical_area, region_definition):
         print("Exception while processing subregion neurons", e)
         pass
     return neurons
+
+
+def generate_cortical_dimensions_by_id():
+    """
+    Generates the information needed to display cortical areas on Godot
+    """
+    cortical_information = {}
+
+    for cortical_area in runtime_data.genome["blueprint"]:
+        cortical_information[cortical_area] = {}
+        genes = runtime_data.genome["blueprint"][cortical_area]
+
+        cortical_information[cortical_area]["cortical_name"] = genes["cortical_name"]
+        cortical_information[cortical_area]["cortical_group"] = genes["group_id"]
+        cortical_information[cortical_area]["cortical_sub_group"] = genes["sub_group_id"]
+        cortical_information[cortical_area]["visible"] = genes["visualization"]
+
+        cortical_information[cortical_area]["coordinates_2d"] = [
+            genes["2d_coordinate"][0],
+            genes["2d_coordinate"][1]
+        ]
+
+        cortical_information[cortical_area]["coordinates_3d"] = [
+            genes["relative_coordinate"][0],
+            genes["relative_coordinate"][1],
+            genes["relative_coordinate"][2]
+        ]
+
+        cortical_information[cortical_area]["cortical_dimensions"] = [
+            genes["block_boundaries"][0],
+            genes["block_boundaries"][1],
+            genes["block_boundaries"][2]
+        ]
+
+    with open(runtime_data.connectome_path+"cortical_data_by_id.json", "w") as data_file:
+        data_file.seek(0)
+        data_file.write(json.dumps(cortical_information, indent=3))
+        data_file.truncate()
+
+    return cortical_information
+
+
+def generate_cortical_dimensions():
+    """
+    Generates the information needed to display cortical areas on Godot
+    """
+    cortical_information = {}
+
+    for cortical_area in runtime_data.genome["blueprint"]:
+        cortical_name = runtime_data.genome["blueprint"][cortical_area]["cortical_name"]
+        cortical_information[cortical_name] = []
+        genes = runtime_data.genome["blueprint"][cortical_area]
+        cortical_information[cortical_name].append(genes["relative_coordinate"][0])
+        cortical_information[cortical_name].append(genes["relative_coordinate"][1])
+        cortical_information[cortical_name].append(genes["relative_coordinate"][2])
+        cortical_information[cortical_name].append(genes["visualization"])
+        cortical_information[cortical_name].append(genes["block_boundaries"][0])
+        cortical_information[cortical_name].append(genes["block_boundaries"][1])
+        cortical_information[cortical_name].append(genes["block_boundaries"][2])
+        cortical_information[cortical_name].append(cortical_area)
+
+    with open(runtime_data.connectome_path+"cortical_data.json", "w") as data_file:
+        data_file.seek(0)
+        data_file.write(json.dumps(cortical_information, indent=3))
+        data_file.truncate()
+
+    return cortical_information
diff --git a/src/evo/x_genesis.py b/src/evo/x_genesis.py
index 6105b5828..9c2f4526b 100644
--- a/src/evo/x_genesis.py
+++ b/src/evo/x_genesis.py
@@ -27,23 +27,31 @@
 import traceback
 
 # from src.evo import neuron, synapse, stats, genetics, voxels, neuroembryogenesis, templates
-from src.evo import synapse, voxels, neuroembryogenesis, templates
+from src.evo import voxels, neuroembryogenesis
+from src.evo.templates import cortical_template, cortical_types
+from src.evo.synapse import synaptic_pruner, morphology_usage_list, cortical_areas_sharing_same_morphology
 # from functools import partial
 # from multiprocessing import Pool, Process
 # from src.inf import disk_ops
 # from src.inf import settings
 from src.inf import runtime_data
-from src.evo.genome_processor import genome_1_cortical_list, genome_v1_v2_converter, genome_2_1_convertor, is_memory_cortical_area
+from src.evo.genome_processor import genome_1_cortical_list, genome_v1_v2_converter, genome_2_1_convertor, \
+    is_memory_cortical_area
 from src.evo.genome_editor import save_genome
+from src.evo.voxels import generate_cortical_dimensions_by_id, generate_cortical_dimensions
 from src.evo.connectome import reset_connectome_file
+from src.evo.region import create_region
+from src.evo.cortical_area import area_is_system, cortical_area_type
+from src.evo.synapse import neighboring_cortical_areas
 from src.evo.neuroembryogenesis import cortical_name_list, develop, generate_plasticity_dict
-from src.inf.initialize import generate_cortical_dimensions, generate_cortical_dimensions_by_id, init_fcl, \
-    init_memory_register, init_cortical_cumulative_stats
+from src.inf.initialize import init_fcl, init_memory_register, init_cortical_cumulative_stats
+from src.api.schemas import NewRegionProperties
+
 
 # from src.evo.synaptogenesis_rules import syn_memory
 
 logger = logging.getLogger(__name__)
-
+sentinel = object()
 
 class CustomError(Exception):
     def __init__(self, message, status_code):
@@ -119,6 +127,14 @@ def update_cortical_properties(cortical_properties):
     - Cortical name
 
     """
+
+    if not runtime_data.brain_readiness:
+        brain_was_not_ready = True
+    else:
+        brain_was_not_ready = False
+        print("Brain is busy processing cortical area modifications...")
+        runtime_data.brain_readiness = False
+
     changed_areas = set()
     regeneration_flag = False
 
@@ -126,26 +142,30 @@ def update_cortical_properties(cortical_properties):
         print("ERROR: Cortical change request did not include --cortical id--")
         return
 
+    print("*__" * 50)
+    print("Cortical properties:\n", cortical_properties)
+
     logger.info(f"+++++++++++++++++++++   Cortical Change Request Received for %s ++++++++++++++++++++++++"
                 f"  {cortical_properties['cortical_id']}")
     cortical_area = cortical_properties['cortical_id']
+    runtime_data.transforming_areas.add(cortical_area)
 
-    if cortical_properties['cortical_name'] is not None:
+    if cortical_properties.get('cortical_name'):
         runtime_data.genome['blueprint'][cortical_area]["cortical_name"] = \
             cortical_properties['cortical_name']
         changed_areas.add("name")
 
-    if cortical_properties['coordinates_3d'] is not None:
+    if cortical_properties.get('coordinates_3d'):
         x_cortical_reposition(cortical_area=cortical_area,
                               new_coordinates=cortical_properties['coordinates_3d'])
         changed_areas.add("3d_loc")
 
-    if cortical_properties['coordinates_2d'] is not None:
+    if cortical_properties.get('coordinates_2d'):
         x_cortical_reposition_2d(cortical_area=cortical_area,
                                  new_coordinates=cortical_properties['coordinates_2d'])
         changed_areas.add("2d_loc")
 
-    if cortical_properties['neuron_fire_threshold'] is not None:
+    if 'neuron_fire_threshold' in cortical_properties:
         runtime_data.genome['blueprint'][cortical_area]['firing_threshold'] = \
             cortical_properties['neuron_fire_threshold']
 
@@ -154,7 +174,7 @@ def update_cortical_properties(cortical_properties):
                 cortical_properties['neuron_fire_threshold']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_post_synaptic_potential'] is not None:
+    if 'neuron_post_synaptic_potential' in cortical_properties:
         for neuron_id in runtime_data.brain[cortical_area]:
             for dst_neuron in runtime_data.brain[cortical_area][neuron_id]["neighbors"]:
                 runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron]["postsynaptic_current"] = \
@@ -163,57 +183,63 @@ def update_cortical_properties(cortical_properties):
             cortical_properties['neuron_post_synaptic_potential']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_refractory_period'] is not None:
+    if 'neuron_refractory_period' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["refractory_period"] = \
             cortical_properties['neuron_refractory_period']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_excitability'] is not None:
+    if 'neuron_excitability' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
             cortical_properties['neuron_excitability']
         runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
             cortical_properties['neuron_excitability']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_snooze_period'] is not None:
+    if 'neuron_snooze_period' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["snooze_length"] = \
             cortical_properties['neuron_snooze_period']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_degeneracy_coefficient'] is not None:
+    if 'neuron_degeneracy_coefficient' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["degeneration"] = \
             cortical_properties['neuron_degeneracy_coefficient']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_post_synaptic_potential_max'] is not None:
+    if 'neuron_post_synaptic_potential_max' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["postsynaptic_current_max"] = \
             cortical_properties['neuron_post_synaptic_potential_max']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_consecutive_fire_count'] is not None:
+    if 'neuron_consecutive_fire_count' in cortical_properties:
         runtime_data.genome["blueprint"][cortical_area]["consecutive_fire_cnt_max"] = \
             cortical_properties['neuron_consecutive_fire_count']
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_mp_charge_accumulation'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["mp_charge_accumulation"] = \
-            cortical_properties['neuron_mp_charge_accumulation']
+    neuron_mp_charge_accumulation = cortical_properties.get('neuron_mp_charge_accumulation', sentinel)
+    if neuron_mp_charge_accumulation is not sentinel:
+        runtime_data.genome["blueprint"][cortical_area]["mp_charge_accumulation"] = neuron_mp_charge_accumulation
         changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_mp_driven_psp'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["mp_driven_psp"] = \
-            cortical_properties['neuron_mp_driven_psp']
+    neuron_mp_driven_psp = cortical_properties.get('neuron_mp_driven_psp', sentinel)
+    if neuron_mp_driven_psp is not sentinel:
+        runtime_data.genome["blueprint"][cortical_area]["mp_driven_psp"] = neuron_mp_driven_psp
         changed_areas.add("blueprint")
 
-    if cortical_properties['cortical_visibility'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["visualization"] = \
-            cortical_properties['cortical_visibility']
+    if "cortical_visibility" in cortical_properties:
+        if cortical_properties["cortical_visibility"]:
+            runtime_data.genome["blueprint"][cortical_area]["visualization"] = True
+            if cortical_area in runtime_data.cortical_viz_list:
+                runtime_data.cortical_viz_list.remove(cortical_area)
+        else:
+            runtime_data.genome["blueprint"][cortical_area]["visualization"] = False
+            runtime_data.cortical_viz_list.add(cortical_area)
+
         changed_areas.add("3d_viz")
 
     # ####################################################
     # Conditions that require cortical regeneration
     # ####################################################
-    if cortical_properties['cortical_dimensions'] is not None:
+    if cortical_properties.get('cortical_dimensions'):
         if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] != \
                 cortical_properties['cortical_dimensions'][0] and cortical_properties['cortical_dimensions'][0] > 0:
             regeneration_flag = True
@@ -233,7 +259,7 @@ def update_cortical_properties(cortical_properties):
                 cortical_properties['cortical_dimensions'][2]
             changed_areas.add("3d_dimm")
 
-    if cortical_properties['cortical_neuron_per_vox_count'] is not None:
+    if 'cortical_neuron_per_vox_count' in cortical_properties:
         if runtime_data.genome["blueprint"][cortical_area]["per_voxel_neuron_cnt"] != \
                 cortical_properties['cortical_neuron_per_vox_count']:
             regeneration_flag = True
@@ -241,7 +267,7 @@ def update_cortical_properties(cortical_properties):
                 cortical_properties['cortical_neuron_per_vox_count']
             changed_areas.add("blueprint")
 
-    if cortical_properties['cortical_synaptic_attractivity'] is not None:
+    if 'cortical_synaptic_attractivity' in cortical_properties:
         if runtime_data.genome["blueprint"][cortical_area]["synapse_attractivity"] != \
                 cortical_properties['cortical_synaptic_attractivity']:
             regeneration_flag = True
@@ -249,7 +275,7 @@ def update_cortical_properties(cortical_properties):
                 cortical_properties['cortical_synaptic_attractivity']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_leak_variability'] is not None:
+    if 'neuron_leak_variability' in cortical_properties:
         if runtime_data.genome["blueprint"][cortical_area]["leak_variability"] != \
                 cortical_properties['neuron_leak_variability']:
             regeneration_flag = True
@@ -257,7 +283,7 @@ def update_cortical_properties(cortical_properties):
                 cortical_properties['neuron_leak_variability']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_leak_coefficient'] is not None:
+    if 'neuron_leak_coefficient' in cortical_properties:
         if runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] != \
                 cortical_properties['neuron_leak_coefficient']:
             runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] = \
@@ -265,15 +291,16 @@ def update_cortical_properties(cortical_properties):
             regeneration_flag = True
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_psp_uniform_distribution'] is not None:
+    neuron_psp_uniform_distribution = cortical_properties.get('neuron_psp_uniform_distribution', sentinel)
+    if neuron_psp_uniform_distribution is not sentinel:
         if runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] != \
-                cortical_properties['neuron_psp_uniform_distribution']:
+                neuron_psp_uniform_distribution:
             runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] = \
-                cortical_properties['neuron_psp_uniform_distribution']
+                neuron_psp_uniform_distribution
             regeneration_flag = True
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_longterm_mem_threshold'] is not None:
+    if 'neuron_longterm_mem_threshold' in cortical_properties:
         if runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] != \
                 cortical_properties['neuron_longterm_mem_threshold']:
             runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] = \
@@ -281,7 +308,7 @@ def update_cortical_properties(cortical_properties):
             regeneration_flag = False
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_lifespan_growth_rate'] is not None:
+    if 'neuron_lifespan_growth_rate' in cortical_properties:
         if runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] != \
                 cortical_properties['neuron_lifespan_growth_rate']:
             runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] = \
@@ -289,7 +316,7 @@ def update_cortical_properties(cortical_properties):
             regeneration_flag = False
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_init_lifespan'] is not None:
+    if 'neuron_init_lifespan' in cortical_properties:
         if runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] != \
                 cortical_properties['neuron_init_lifespan']:
             runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] = \
@@ -297,7 +324,7 @@ def update_cortical_properties(cortical_properties):
             regeneration_flag = False
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_fire_threshold_increment'] is not None:
+    if cortical_properties.get('neuron_fire_threshold_increment'):
         genome_fire_threshold_increment = [
             runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_x"],
             runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_y"],
@@ -314,16 +341,14 @@ def update_cortical_properties(cortical_properties):
             regeneration_flag = True
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_firing_threshold_limit'] is not None:
+    if 'neuron_firing_threshold_limit' in cortical_properties:
         if runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] != \
                 cortical_properties['neuron_firing_threshold_limit']:
             runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] = \
                 cortical_properties['neuron_firing_threshold_limit']
             regeneration_flag = True
             changed_areas.add("blueprint")
-
     if regeneration_flag:
-        print("@-----@ " * 10)
         logger.info(f"Cortical regeneration triggered for {cortical_area}")
         cortical_regeneration(cortical_area=cortical_area)
 
@@ -335,6 +360,10 @@ def update_cortical_properties(cortical_properties):
     runtime_data.transforming_areas.remove(cortical_area)
     update_evo_change_register(change_area=changed_areas)
 
+    if not brain_was_not_ready:
+        print("Brain is ready now :)")
+        runtime_data.brain_readiness = True
+
 
 def update_evo_change_register(change_area: set):
     for change in change_area:
@@ -343,13 +372,21 @@ def update_evo_change_register(change_area: set):
 
 
 def update_cortical_mappings(cortical_mappings):
+
+    if not runtime_data.brain_readiness:
+        brain_was_not_ready = True
+    else:
+        print("Brain is busy processing new cortical mappings....")
+        brain_was_not_ready = False
+        runtime_data.brain_readiness = False
+
     cortical_area = cortical_mappings["src_cortical_area"]
     dst_cortical_area = cortical_mappings["dst_cortical_area"]
     mappings = cortical_mappings["mapping_data"]
 
     #  ------- Cleanup prior mappings ---------
-    runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
-                                                 dst_cortical_area=dst_cortical_area)
+    runtime_data.brain = synaptic_pruner(src_cortical_area=cortical_area,
+                                         dst_cortical_area=dst_cortical_area)
 
     if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
@@ -398,6 +435,10 @@ def update_cortical_mappings(cortical_mappings):
                 file_name=runtime_data.connectome_path + "genome.json")
     update_evo_change_register(change_area={"mappings"})
 
+    if not brain_was_not_ready:
+        print("Brain is ready now :)")
+        runtime_data.brain_readiness = True
+
     # added_mappings, removed_mappings, modified_mappings = \
     #     mapping_change_report(cortical_area=cortical_area, new_mapping=cortical_properties['cortical_destinations'])
     #
@@ -442,7 +483,7 @@ def update_morphology_properties(morphology_properties):
                 morphology_properties['type']
             runtime_data.genome['neuron_morphologies'][morphology_properties['name']]["parameters"] = \
                 morphology_properties['parameters']
-            impacted_cortical_areas = synapse.cortical_areas_sharing_same_morphology(morphology_properties['name'])
+            impacted_cortical_areas = cortical_areas_sharing_same_morphology(morphology_properties['name'])
             print("<><><><><>   <><><><> Impacted areas", impacted_cortical_areas)
             for impacted_area in impacted_cortical_areas:
                 print(impacted_area[0], impacted_area[1])
@@ -459,31 +500,20 @@ def update_morphology_properties(morphology_properties):
         print("Error during morphology update\n", e, traceback.print_exc())
 
 
-def neighboring_cortical_areas(cortical_area, blueprint=None):
-    try:
-        if not blueprint:
-            blueprint = runtime_data.genome["blueprint"]
-        cortical_mappings = synapse.cortical_mapping(blueprint=blueprint)
-        upstream_cortical_areas = set()
-        downstream_cortical_areas = set(cortical_mappings[cortical_area])
-        for area in cortical_mappings:
-            if cortical_area in cortical_mappings[area]:
-                upstream_cortical_areas.add(area)
-        return upstream_cortical_areas, downstream_cortical_areas
-    except KeyError:
-        print("Exception in neighboring_cortical_areas: Cortical area not found", traceback.print_exc())
-
-
 def cortical_removal(cortical_area, genome_scrub=False):
     if cortical_area not in runtime_data.cortical_list:
         print("Error: Cortical area requested for removal does not exist:", cortical_area)
 
-    elif cortical_area in templates.cortical_types["CORE"]["supported_devices"]:
+    elif cortical_area in cortical_types["CORE"]["supported_devices"]:
         print("Error: Cortical areas of CORE type cannot be removed", cortical_area)
     else:
         print("Processing cortical removal for", cortical_area)
         msg = "Processing cortical removal request for" + cortical_area
         logger.info(msg=msg)
+
+        # Update neuron count
+        runtime_data.brain_stats["neuron_count"] -= len(runtime_data.brain[cortical_area])
+
         # cortical_area = cortical_id(cortical_name=cortical_name)
         upstream_cortical_areas, downstream_cortical_areas = \
             neighboring_cortical_areas(cortical_area, blueprint=runtime_data.genome["blueprint"])
@@ -491,11 +521,15 @@ def cortical_removal(cortical_area, genome_scrub=False):
         # Clean Upstream neuron associations
         if len(downstream_cortical_areas) > 0:
             for downstream_cortical_area in downstream_cortical_areas:
-                if downstream_cortical_area:
+                if downstream_cortical_area in runtime_data.brain:
                     for neuron in runtime_data.brain[downstream_cortical_area]:
-                        for upstream_neuron in runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].copy():
+                        for upstream_neuron in \
+                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].copy():
                             if upstream_neuron[:6] == cortical_area:
-                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].discard(upstream_neuron)
+                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].discard(
+                                    upstream_neuron)
+                else:
+                    print(f"ERROR!! {downstream_cortical_area} is in genome but not in connectome!")
 
         # Prune affected synapses
         prune_cortical_synapses(cortical_area=cortical_area)
@@ -507,6 +541,7 @@ def cortical_removal(cortical_area, genome_scrub=False):
         for memory_area in runtime_data.memory_register:
             if cortical_area in runtime_data.memory_register[memory_area]:
                 runtime_data.memory_register[memory_area].remove(cortical_area)
+
         if cortical_area in runtime_data.memory_register:
             del runtime_data.memory_register[cortical_area]
 
@@ -552,42 +587,38 @@ def prune_cortical_synapses(cortical_area):
 
     for src_cortical_area in upstream_cortical_areas:
         print("++++++ 2")
-        runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=src_cortical_area,
-                                                     dst_cortical_area=cortical_area)
+        runtime_data.brain = synaptic_pruner(src_cortical_area=src_cortical_area,
+                                             dst_cortical_area=cortical_area)
 
 
 def cortical_regeneration(cortical_area):
     # Clearing the burst engine from neuronal activities
-    print("##### 1 #####")
+
     # Reset effected areas
     cortical_removal(cortical_area=cortical_area)
-    print("##### 2 #####")
+
     x_corticogenesis(cortical_area)
-    print("%%%%%%%     Brain:\n", runtime_data.brain[cortical_area])
-    print("##### 3 #####")
+
     upstream_cortical_areas, downstream_cortical_areas = \
         neighboring_cortical_areas(cortical_area, runtime_data.genome["blueprint"])
-    print("##### 4 #####")
+
     # Recreate voxels
     neuroembryogenesis.voxelogenesis(cortical_area=cortical_area)
-    print("##### 5 #####")
+
     # Recreate neurons
     neuroembryogenesis.neurogenesis(cortical_area=cortical_area)
-    print("##### 6 #####")
 
-    print(runtime_data.genome["blueprint"][cortical_area])
     # Recreate synapses
     for src_cortical_area in upstream_cortical_areas:
         neuroembryogenesis.synaptogenesis(cortical_area=src_cortical_area, dst_cortical_area=cortical_area)
-    print("##### 7 #####", downstream_cortical_areas)
+
     for dst_cortical_area in downstream_cortical_areas:
         if dst_cortical_area:
             neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
 
 
 def cortical_rewiring(src_cortical_area, dst_cortical_area):
-    print("++++++ 3")
-    synapse.synaptic_pruner(src_cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
+    synaptic_pruner(src_cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
     neuroembryogenesis.synaptogenesis(cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
 
 
@@ -615,6 +646,7 @@ def mapping_change_report(cortical_area, new_mapping):
 
 
 def cortical_id_gen(seed='___', is_memory=False):
+    seed = seed.replace('-', '_')
     while True:
         chars = string.ascii_uppercase + string.digits
         if not is_memory:
@@ -629,12 +661,18 @@ def cortical_id_gen(seed='___', is_memory=False):
 
 def add_core_cortical_area(cortical_properties):
     try:
-        template = templates.cortical_template.copy()
+        if not runtime_data.brain_readiness:
+            brain_was_not_ready = True
+        else:
+            brain_was_not_ready = False
+            print("Brain is busy creating a new cortical area ...")
+            runtime_data.brain_readiness = False
+
         cortical_type = cortical_properties['cortical_type']
         cortical_id_ = cortical_properties['cortical_id']
-        if cortical_id_ in templates.cortical_types[cortical_type]["supported_devices"]:
+        if cortical_id_ in cortical_types[cortical_type]["supported_devices"]:
             cortical_name = \
-                templates.cortical_types[cortical_type]["supported_devices"][cortical_id_]['cortical_name']
+                cortical_types[cortical_type]["supported_devices"][cortical_id_]['cortical_name']
 
             if cortical_id_ in runtime_data.genome['blueprint']:
                 print("Warning! Cortical area already part of genome. Nothing got added.")
@@ -643,14 +681,13 @@ def add_core_cortical_area(cortical_properties):
                 runtime_data.voxel_dict[cortical_id_] = dict()
                 runtime_data.genome['blueprint'][cortical_id_] = dict()
                 runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
-                runtime_data.genome["blueprint"][cortical_id_] = \
-                    template.copy()
+                runtime_data.genome["blueprint"][cortical_id_] = cortical_template.copy()
                 runtime_data.genome["blueprint"][cortical_id_]["cortical_name"] = cortical_name
                 runtime_data.genome['blueprint'][cortical_id_]["block_boundaries"] = \
                     [cortical_properties['channel_count'] *
-                     templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][0],
-                     templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][1],
-                     templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][2],
+                     cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][0],
+                     cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][1],
+                     cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][2],
                      ]
 
                 runtime_data.genome['blueprint'][cortical_id_]["relative_coordinate"] = \
@@ -663,9 +700,17 @@ def add_core_cortical_area(cortical_properties):
                      cortical_properties['coordinates_2d'][1]]
 
                 runtime_data.genome['blueprint'][cortical_id_]['cortical_mapping_dst'] = dict()
+                runtime_data.genome['blueprint'][cortical_id_]['visualization'] = True
+
+                if cortical_id_ not in runtime_data.genome["brain_regions"]["root"]["areas"]:
+                    runtime_data.genome["brain_regions"]["root"]["areas"].append(cortical_id_)
+                    runtime_data.cortical_area_region_association[cortical_id_] = "root"
+
+                # template = cortical_template.copy()
+                # for parameter in template:
+                #     runtime_data.genome["blueprint"][cortical_id_][parameter] = template[parameter]
 
-                for parameter in template:
-                    runtime_data.genome["blueprint"][cortical_id_][parameter] = template[parameter]
+                # runtime_data.genome["blueprint"][cortical_id_].update(cortical_template.copy())
 
                 # runtime_data.genome["blueprint"][cortical_id_]["per_voxel_neuron_cnt"] = \
                 #     template['per_voxel_neuron_cnt']
@@ -693,25 +738,42 @@ def add_core_cortical_area(cortical_properties):
                 runtime_data.genome["blueprint"][cortical_id_]["group_id"] = cortical_properties['cortical_type']
 
                 neuroembryogenesis.voxelogenesis(cortical_area=cortical_id_)
+
                 neuroembryogenesis.neurogenesis(cortical_area=cortical_id_)
+
                 init_fcl(cortical_id_)
                 init_cortical_cumulative_stats(cortical_area=cortical_id_)
+
                 runtime_data.cortical_dimensions = generate_cortical_dimensions()
                 runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
 
                 save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
                             file_name=runtime_data.connectome_path + "genome.json")
                 runtime_data.last_genome_modification_time = datetime.datetime.now()
+
+                if not brain_was_not_ready:
+                    print("Brain is ready now :)")
+                    runtime_data.brain_readiness = True
+
                 return cortical_id_
         else:
-            print(f"Warning! while adding core cortical area. {cortical_id_} is not defined as {cortical_type}, possibly a bad gene.")
+            print(f"Warning! while adding core cortical area. {cortical_id_} is not defined as {cortical_type}"
+                  f", possibly a bad gene.")
 
     except KeyError:
         print("Error: New cortical area was not added.", traceback.print_exc())
 
 
 def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cortical_dimensions,
-                             cortical_id_overwrite=None, is_memory=False, copy_of=None):
+                             parent_region_id="root", cortical_id_overwrite=None, is_memory=False, copy_of=None):
+
+    if not runtime_data.brain_readiness:
+        brain_was_not_ready = True
+    else:
+        brain_was_not_ready = False
+        print("Brain is busy creating a new cortical area ...")
+        runtime_data.brain_readiness = False
+
     # Generate Cortical ID
     # todo: instead of hard coding the length have the genome properties captured and reference instead
     temp_name = cortical_name
@@ -732,7 +794,7 @@ def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cort
             print("Source cortical area chosen for cloning is not part of Genome")
             raise CustomError
     else:
-        template = templates.cortical_template.copy()
+        template = cortical_template.copy()
 
     if cortical_name in cortical_names:
         print("Warning! Cortical area with same name already exists in genome. Nothing got added.")
@@ -742,12 +804,12 @@ def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cort
         runtime_data.genome['blueprint'][cortical_area] = {}
         runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
 
-        cortical_template = template.copy()
+        cortical_template_ = template.copy()
 
-        runtime_data.genome["blueprint"][cortical_area] = cortical_template
+        runtime_data.genome["blueprint"][cortical_area] = cortical_template_
 
-        for parameter in cortical_template:
-            runtime_data.genome["blueprint"][cortical_area][parameter] = cortical_template[parameter]
+        for parameter in cortical_template_:
+            runtime_data.genome["blueprint"][cortical_area][parameter] = cortical_template_[parameter]
 
         runtime_data.genome['blueprint'][cortical_area]['cortical_name'] = cortical_name
 
@@ -763,14 +825,18 @@ def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cort
         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'] = {}
         
         runtime_data.genome["blueprint"][cortical_area]["sub_group_id"] = ""
+        runtime_data.genome['blueprint'][cortical_area]['visualization'] = True
+
+        runtime_data.cortical_area_region_association[cortical_area] = parent_region_id
+        runtime_data.genome["brain_regions"][parent_region_id]["areas"].append(cortical_area)
 
         if is_memory:
             runtime_data.genome["blueprint"][cortical_area]["longterm_mem_threshold"] = \
-                cortical_template['longterm_mem_threshold']
+                cortical_template_['longterm_mem_threshold']
             runtime_data.genome["blueprint"][cortical_area]["lifespan_growth_rate"] = \
-                cortical_template['lifespan_growth_rate']
+                cortical_template_['lifespan_growth_rate']
             runtime_data.genome["blueprint"][cortical_area]["init_lifespan"] = \
-                cortical_template['init_lifespan']
+                cortical_template_['init_lifespan']
             runtime_data.genome["blueprint"][cortical_area]["sub_group_id"] = "MEMORY"
             runtime_data.memory_register[cortical_area] = set()
 
@@ -786,12 +852,41 @@ def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cort
         save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
                     file_name=runtime_data.connectome_path + "genome.json")
         runtime_data.last_genome_modification_time = datetime.datetime.now()
+
+        if not brain_was_not_ready:
+            print("Brain is ready now :)")
+            runtime_data.brain_readiness = True
+
         return cortical_area
 
 
-def append_circuit(source_genome, circuit_origin):
+def append_circuit(source_genome, circuit_origin, parent_brain_region, rewire_mode):
     print("\n\n----------------------------------  Merging a new circuit  ----------------------------------------\n\n")
+    print("rewire_mode:", rewire_mode)
+
     try:
+        if "genome_title" in source_genome:
+            brain_region_title = source_genome["genome_title"]
+        else:
+            brain_region_title = "imported_genome"
+
+        if "genome_description" in source_genome:
+            brain_region_description = source_genome["genome_description"]
+        else:
+            brain_region_description = "No Description"
+
+        region_data = NewRegionProperties
+        region_data.title = brain_region_title
+        region_data.region_description = brain_region_description
+        region_data.parent_region_id = parent_brain_region
+        region_data.coordinates_2d = [0, 0]
+        region_data.coordinates_3d = circuit_origin
+
+        region_data.areas = []
+        region_data.regions = []
+
+        new_region_id = create_region(region_data=region_data)
+
         converted_genome = genome_2_1_convertor(source_genome["blueprint"])
         source_genome["blueprint"] = converted_genome['blueprint']
 
@@ -803,7 +898,8 @@ def append_circuit(source_genome, circuit_origin):
 
         appended_cortical_areas = set()
 
-        # Append Blueprint
+        amalgamation_cortical_mapping = dict()
+        # Amalgamate Blueprint
         for cortical_area_id in src_blueprint:
             print(f"-----Attempting to import cortical area {cortical_area_id}")
             try:
@@ -846,6 +942,7 @@ def append_circuit(source_genome, circuit_origin):
                     #                          cortical_id_overwrite=new_cortical_area_id)
 
                     appended_cortical_areas.add(new_cortical_area_id)
+                    amalgamation_cortical_mapping[cortical_area_id] = new_cortical_area_id
 
                     dst_blueprint[new_cortical_area_id] = src_cortical_area.copy()
                     dst_blueprint[new_cortical_area_id]["cortical_name"] = new_cortical_name
@@ -853,7 +950,7 @@ def append_circuit(source_genome, circuit_origin):
                     dst_blueprint[new_cortical_area_id]["relative_coordinate"][1] = new_coordinates[1]
                     dst_blueprint[new_cortical_area_id]["relative_coordinate"][2] = new_coordinates[2]
                     runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
-                    print(f"---------------Successfully imported a new cortical area.  "
+                    print(f"---------------Successfully imported a new cortical area."
                           f"id:{new_cortical_area_id} name:{new_cortical_name}")
                 else:
                     if cortical_area_id not in dst_blueprint:
@@ -869,8 +966,76 @@ def append_circuit(source_genome, circuit_origin):
                         print(f"---------------Successfully imported a built-in cortical area. id:{cortical_area_id}")
             except Exception as e:
                 print("Exception during cortical import", e, traceback.print_exc())
+        # Amalgamate Brain Regions
+        if "brain_regions" in source_genome:
+            incoming_genome_region_data = source_genome["brain_regions"]
+
+            incoming_genome_region_data["root"]["title"] = \
+                source_genome.get("genome_title", "No title")
+
+            incoming_genome_region_data["root"]["description"] = \
+                source_genome.get("genome_description", "No description")
+
+            incoming_genome_region_data["root"]["parent_region_id"] = parent_brain_region
 
-        # Append Morphologies
+            for sub_region in incoming_genome_region_data["root"]["regions"]:
+                incoming_genome_region_data[sub_region]["parent_region_id"] = new_region_id
+
+            for sub_area in incoming_genome_region_data["root"]["areas"]:
+                runtime_data.cortical_area_region_association[sub_area] = new_region_id
+
+            incoming_genome_region_data[new_region_id] = incoming_genome_region_data.pop('root')
+        else:
+            incoming_genome_region_data = dict()
+
+        # print("amalgamation_cortical_mapping:", amalgamation_cortical_mapping)
+
+        # Swap cortical IDs
+        for region in incoming_genome_region_data:
+            # print("incoming_genome_region_data inputs", incoming_genome_region_data[region]["inputs"])
+            incoming_area_set = set(incoming_genome_region_data[region]["areas"])
+            for area in incoming_genome_region_data[region]["areas"]:
+                if area in amalgamation_cortical_mapping:
+                    incoming_area_set.remove(area)
+                    incoming_area_set.add(amalgamation_cortical_mapping[area])
+                    # print("swapped...", area, amalgamation_cortical_mapping[area])
+
+            updated_suggested_inputs = []
+            for suggested_input in incoming_genome_region_data[region]["inputs"].copy():
+                # print("###### suggested_input", suggested_input)
+                if suggested_input["dst_cortical_area_id"] in amalgamation_cortical_mapping:
+                    updated_suggested_input = suggested_input.copy()
+                    updated_suggested_input["dst_cortical_area_id"] = \
+                        amalgamation_cortical_mapping[suggested_input["dst_cortical_area_id"]]
+                    incoming_genome_region_data[region]["inputs"].remove(suggested_input)
+                    updated_suggested_inputs.append(updated_suggested_input)
+                    # print("did a swap on input...", suggested_input, updated_suggested_input)
+                    runtime_data.cortical_area_region_association[suggested_input["dst_cortical_area_id"]] = region
+                else:
+                    print("suggested dst cortical id not found in amalgamation cortical mapping", suggested_input[
+                        "dst_cortical_area_id"], amalgamation_cortical_mapping)
+            incoming_genome_region_data[region]["inputs"] += updated_suggested_inputs
+            # print("after update ++++ ", incoming_genome_region_data[region]["inputs"])
+
+            updated_suggested_outputs = []
+            incoming_genome_region_data_outputs_copy = incoming_genome_region_data[region]["outputs"].copy()
+            for suggested_output in incoming_genome_region_data_outputs_copy:
+                if suggested_output["src_cortical_area_id"] in amalgamation_cortical_mapping:
+                    updated_suggested_output = suggested_output.copy()
+                    updated_suggested_output["src_cortical_area_id"] = \
+                        amalgamation_cortical_mapping[suggested_output["src_cortical_area_id"]]
+                    incoming_genome_region_data[region]["outputs"].remove(suggested_output)
+                    updated_suggested_outputs.append(updated_suggested_output)
+                    # print("did a swap on output...", suggested_output, updated_suggested_output)
+                    runtime_data.cortical_area_region_association[suggested_output["src_cortical_area_id"]] = region
+
+            incoming_genome_region_data[region]["outputs"] += updated_suggested_outputs
+            # print("output_genome_region_data", incoming_genome_region_data[region]["outputs"])
+
+            incoming_genome_region_data[region]["areas"] = list(incoming_area_set)
+        runtime_data.genome["brain_regions"] = {**runtime_data.genome["brain_regions"], **incoming_genome_region_data}
+
+        # Amalgamate Morphologies
         # Create a hash table for source and destination morphologies
         dst_morphology_hash_table = dict()
 
@@ -884,10 +1049,10 @@ def append_circuit(source_genome, circuit_origin):
         morphology_mapping_table = dict()
 
         for src_morphology in src_morphologies:
-            print(f"-----Attempting to import morphology {src_morphology}")
+            # print(f"-----Attempting to import morphology {src_morphology}")
             try:
                 # Check if morphology is used or not
-                morphology_usage = synapse.morphology_usage_list(morphology_name=src_morphology, genome=source_genome)
+                morphology_usage = morphology_usage_list(morphology_name=src_morphology, genome=source_genome)
 
                 if morphology_usage:
                     morphology_str = json.dumps(src_morphologies[src_morphology])
@@ -901,7 +1066,7 @@ def append_circuit(source_genome, circuit_origin):
                         else:
                             runtime_data.genome["neuron_morphologies"][src_morphology] = \
                                 src_morphologies[src_morphology].copy()
-                        print(f"---------------Successfully imported a morphology. id:{src_morphology}")
+                        # print(f"---------------Successfully imported a morphology. id:{src_morphology}")
                     else:
                         # Build a mapping table to be used while appending the Blueprint
                         morphology_association = list(dst_morphology_hash_table[morphology_hash])[0]
@@ -909,14 +1074,140 @@ def append_circuit(source_genome, circuit_origin):
             except Exception as e:
                 print("Exception during morphology transfer", e, traceback.print_exc())
 
-        print("++ ++ ++ " * 10)
-        print("Merge phase 1 completed.. pending initialization")
-
         for cortical_area in appended_cortical_areas:
             x_corticogenesis(cortical_area)
+        # Wire to external cortical areas
+        if rewire_mode in ['all', 'system']:
+            for region in incoming_genome_region_data:
+                # Wiring Afferents
+                incoming_genome_region_data_inputs_copy = incoming_genome_region_data[region]["inputs"].copy()
+                for suggested_input_mapping in incoming_genome_region_data_inputs_copy:
+                    # print("processing suggested input mapping:", suggested_input_mapping)
+                    if rewire_mode == 'system' and not \
+                            area_is_system(suggested_input_mapping["src_cortical_area_id"]):
+                        # print("Wiring to a custom unknown external area was skipped.")
+                        pass
+                    else:
+                        if area_is_system(suggested_input_mapping["src_cortical_area_id"]) and \
+                                suggested_input_mapping["src_cortical_area_id"] not in runtime_data.genome["blueprint"]:
+                            add_core_cortical_area(cortical_properties={
+                                "cortical_type": cortical_area_type(suggested_input_mapping["src_cortical_area_id"]),
+                                "cortical_id": suggested_input_mapping["src_cortical_area_id"],
+                                "coordinates_2d": [0, 0],
+                                "coordinates_3d": [0, 0, 0],
+                                "channel_count": 1
+                            })
+                            # print("@@ New system cortical area added:",
+                            # suggested_input_mapping["src_cortical_area_id"])
+
+                        if suggested_input_mapping["src_cortical_area_id"] in runtime_data.genome["blueprint"]:
+                            # print("Suggested input source found in genome as ",
+                            #       suggested_input_mapping["src_cortical_area_id"])
+                            if suggested_input_mapping["dst_cortical_area_id"] not in \
+                                    runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                        "cortical_mapping_dst"]:
+                                runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]]["cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]] = list()
+                                cortical_template["cortical_mapping_dst"] = dict()
+                            new_mapping = {
+                                "morphology_id": suggested_input_mapping["morphology_id"],
+                                "morphology_scalar": suggested_input_mapping["morphology_scalar"],
+                                "postSynapticCurrent_multiplier":
+                                    suggested_input_mapping["postSynapticCurrent_multiplier"],
+                                "plasticity_flag": suggested_input_mapping["plasticity_flag"],
+                                "plasticity_constant": suggested_input_mapping["plasticity_constant"],
+                                "ltp_multiplier": suggested_input_mapping["ltp_multiplier"],
+                                "ltd_multiplier": suggested_input_mapping["ltd_multiplier"]
+                            }
+
+                            if new_mapping not in \
+                                    runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]]:
+                                runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]].append(
+                                    new_mapping)
+                                print("New mapping added!", suggested_input_mapping["src_cortical_area_id"],
+                                      suggested_input_mapping["dst_cortical_area_id"], runtime_data.genome["blueprint"][
+                                          suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]])
+
+                            else:
+
+                                print("input mapping already there!", suggested_input_mapping["src_cortical_area_id"],
+                                      new_mapping)
+
+                            # remove the suggested mapping post wiring
+
+                            incoming_genome_region_data[region]["inputs"].remove(suggested_input_mapping)
 
-        develop(appended_cortical_areas)
+                        else:
+                            print("Suggested source cortical area not found!!", suggested_input_mapping[
+                                "src_cortical_area_id"])
+
+                # Wiring Efferents
+                for suggested_output_mapping in incoming_genome_region_data[region]["outputs"].copy():
+                    print("processing suggested output mapping:", suggested_output_mapping)
+                    if rewire_mode == 'system' and not \
+                            area_is_system(suggested_output_mapping["dst_cortical_area_id"]):
+                        print("Wiring to a custom unknown external area was skipped.")
+                        pass
+                    else:
+                        if area_is_system(suggested_output_mapping["dst_cortical_area_id"]) and \
+                                suggested_output_mapping["dst_cortical_area_id"] not in \
+                                runtime_data.genome["blueprint"]:
+                            add_core_cortical_area(cortical_properties={
+                                "cortical_type": cortical_area_type(suggested_output_mapping["dst_cortical_area_id"]),
+                                "cortical_id": suggested_output_mapping["dst_cortical_area_id"],
+                                "coordinates_2d": [0, 0],
+                                "coordinates_3d": [0, 0, 0],
+                                "channel_count": 1
+                            })
+                            print("@@ New system cortical area added:",
+                                  suggested_output_mapping["dst_cortical_area_id"])
+                        if suggested_output_mapping["dst_cortical_area_id"] in runtime_data.genome["blueprint"]:
+                            print("Suggested output destination found in genome as ", suggested_output_mapping[
+                                "dst_cortical_area_id"])
+                            if suggested_output_mapping["dst_cortical_area_id"] not in \
+                                    runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                        "cortical_mapping_dst"]:
+                                runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]] = list()
+
+                            new_mapping = {
+                                "morphology_id": suggested_output_mapping["morphology_id"],
+                                "morphology_scalar": suggested_output_mapping["morphology_scalar"],
+                                "postSynapticCurrent_multiplier":
+                                    suggested_output_mapping["postSynapticCurrent_multiplier"],
+                                "plasticity_flag": suggested_output_mapping["plasticity_flag"],
+                                "plasticity_constant": suggested_output_mapping["plasticity_constant"],
+                                "ltp_multiplier": suggested_output_mapping["ltp_multiplier"],
+                                "ltd_multiplier": suggested_output_mapping["ltd_multiplier"]
+                            }
+
+                            if new_mapping not in \
+                                    runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]]:
+                                runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]].append(
+                                    new_mapping)
+                                print("New mapping added!", suggested_output_mapping["dst_cortical_area_id"],
+                                      suggested_output_mapping["src_cortical_area_id"],
+                                      runtime_data.genome["blueprint"][suggested_output_mapping[
+                                          "dst_cortical_area_id"]][
+                                          "cortical_mapping_dst"][suggested_output_mapping["src_cortical_area_id"]])
+
+                            else:
+                                print("output mapping already there!", suggested_output_mapping["dst_cortical_area_id"],
+                                      new_mapping)
+
+                            # remove the suggested mapping post wiring
+                            incoming_genome_region_data[region]["outputs"].remove(suggested_output_mapping)
 
+                        else:
+                            print("Suggested destination cortical area not found!!", suggested_output_mapping[
+                                "dst_cortical_area_id"])
+        else:
+            pass
+        develop(appended_cortical_areas)
         runtime_data.cortical_dimensions = generate_cortical_dimensions()
         runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
 
@@ -924,8 +1215,23 @@ def append_circuit(source_genome, circuit_origin):
                     file_name=runtime_data.connectome_path + "genome.json")
         runtime_data.last_genome_modification_time = datetime.datetime.now()
 
-        print("++ ++ ++ " * 10)
         print("Merger of new genome completed successfully!")
 
     except Exception as e:
         print("Exception during morphology join", e, traceback.print_exc())
+
+
+def find_variable_names_by_id(target_id):
+    variable_names = []
+
+    # Check in globals
+    for name, value in globals().items():
+        if id(value) == target_id:
+            variable_names.append(name)
+
+    # Check in locals
+    for name, value in locals().items():
+        if id(value) == target_id:
+            variable_names.append(name)
+
+    return variable_names
diff --git a/src/feagi_configuration.ini b/src/feagi_configuration.ini
index b39efadd2..61b30db0c 100644
--- a/src/feagi_configuration.ini
+++ b/src/feagi_configuration.ini
@@ -41,7 +41,7 @@ influxdb_organization = $INFLUXDB_ORG
 influxdb_user = $INFLUXDB_USERNAME
 influxdb_password = $INFLUXDB_PASSWORD
 influxdb_stats_bucket = $INFLUXDB_BUCKET
-influxdb_game_stats_bucket = $INFLUXDB_BUCKET
+influxdb_fitness_stats_bucket = $INFLUXDB_BUCKET
 influxdb_evolutionary_bucket = tbd
 influx_stat_logger = True
 influx_keep_stats =
diff --git a/src/inf/baseline.py b/src/inf/baseline.py
index 1dd116cf6..dae66fb09 100644
--- a/src/inf/baseline.py
+++ b/src/inf/baseline.py
@@ -89,7 +89,7 @@
     "plasticity_flag": False,
     "cortical_genes": {
         "per_voxel_neuron_cnt (int)": ["cx-_n_cnt-i", 1],
-        "synapse_attractivity (int)": ["cx-synatt-i", 100],
+        "synapse_attractivity (int)": ["cx-synatt-f", 100],
         "postsynaptic_current (float)": ["cx-pstcr_-f", 5.0],
         "postsynaptic_current_max (float)": ["cx-pstcrm-f", 35.0],
         "plasticity_constant (float)": ["cx-plst_c-f", 0.05],
diff --git a/src/inf/db_handler.py b/src/inf/db_handler.py
index 26cce85f1..84733e36c 100644
--- a/src/inf/db_handler.py
+++ b/src/inf/db_handler.py
@@ -186,7 +186,7 @@ def __init__(self):
         if runtime_data.parameters:
             self.evo_bucket = self.db_params["influxdb_evolutionary_bucket"]
             self.stats_bucket = self.db_params["influxdb_stats_bucket"]
-            self.game_stats_bucket = self.db_params["influxdb_game_stats_bucket"]
+            self.fitness_stats_bucket = self.db_params["influxdb_fitness_stats_bucket"]
             self.org = self.db_params["influxdb_organization"]
             self.token = self.db_params["influxdb_token"]
 
@@ -382,7 +382,7 @@ def insert_game_activity(self, genome_id, event, intensity=None):
             }
         }]
 
-        self.write_client.write(bucket=self.game_stats_bucket, org=self.org, record=event_data)
+        self.write_client.write(bucket=self.fitness_stats_bucket, org=self.org, record=event_data)
 
     def insert_burst_checkpoints(self, connectome_path, burst_id):
         raw_data = [
@@ -472,8 +472,8 @@ def drop_neuron_activity(self):
     def drop_game_activity(self):
         # Get the list of buckets
         print("@@@ @   @ @ @ @  @ @\n" * 20)
-        self.delete_bucket_content(bucket_name=self.game_stats_bucket)
-        # self.create_new_bucket(bucket_name=self.game_stats_bucket)
+        self.delete_bucket_content(bucket_name=self.fitness_stats_bucket)
+        # self.create_new_bucket(bucket_name=self.fitness_stats_bucket)
 
         # # Create a new bucket with the same name
         # new_bucket = self.client.buckets_api().create_bucket(bucket_name=bucket.name, org_id=self.org)
diff --git a/src/inf/debug.py b/src/inf/debug.py
new file mode 100644
index 000000000..e8a868a97
--- /dev/null
+++ b/src/inf/debug.py
@@ -0,0 +1,9 @@
+
+
+
+
+
+#
+# serialized_data = pickle.dumps(broadcast_message)
+# runtime_data.burst_publisher.send(message=lz4.frame.compress(serialized_data))
+#
diff --git a/src/inf/helpers.py b/src/inf/helpers.py
index 888381982..41cadbe4b 100644
--- a/src/inf/helpers.py
+++ b/src/inf/helpers.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 import string
 import random
 from datetime import datetime
diff --git a/src/inf/initialize.py b/src/inf/initialize.py
index 4160f70cc..288c2a473 100644
--- a/src/inf/initialize.py
+++ b/src/inf/initialize.py
@@ -33,12 +33,14 @@
 from collections import deque
 from shutil import copyfile
 from src.evo.connectome import reset_connectome
+from src.evo.voxels import generate_cortical_dimensions_by_id, generate_cortical_dimensions
 from src.evo.stats import voxel_dict_summary
 from src.evo.genome_editor import save_genome
 from src.inf.messenger import Pub
 from src.evo.neuroembryogenesis import generate_plasticity_dict, develop_brain
 from src.evo.genome_processor import genome_1_cortical_list, genome_ver_check
 from src.evo.genome_validator import *
+from src.evo.region import region_id_gen
 from src.evo.templates import cortical_types
 
 
@@ -80,6 +82,7 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
     # todo temp check to find a better solution
     if "physiology" not in runtime_data.genome:
         runtime_data.genome["physiology"] = {}
+
     if "lifespan_mgmt_interval" not in runtime_data.genome["physiology"]:
         runtime_data.genome["physiology"]["lifespan_mgmt_interval"] = 10
 
@@ -96,6 +99,9 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
         if "firing_threshold_limit" not in runtime_data.genome["blueprint"][_]:
             runtime_data.genome["blueprint"][_]["firing_threshold_limit"] = 0
 
+        if "visualization" not in runtime_data.genome["blueprint"][_]:
+            runtime_data.genome["blueprint"][_]["visualization"] = True
+
         if "leak_variability" not in runtime_data.genome["blueprint"][_]:
             runtime_data.genome["blueprint"][_]["leak_variability"] = 0
 
@@ -105,6 +111,8 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
     runtime_data.plasticity_queue_depth = runtime_data.genome["physiology"]["plasticity_queue_depth"]
     init_fcl()
     init_brain()
+    init_brain_regions()
+
     if 'genome_id' not in runtime_data.genome:
         runtime_data.genome['genome_id'] = id_gen(signature="_G")
     runtime_data.genome_id = runtime_data.genome['genome_id']
@@ -150,6 +158,41 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
 #     print("Hardware controller path: ", runtime_data.hw_controller_path)
 #
 
+
+def init_brain_regions():
+    if "brain_regions" not in runtime_data.genome:
+        runtime_data.genome["brain_regions"] = {}
+
+    if "root" not in runtime_data.genome["brain_regions"]:
+        runtime_data.genome["brain_regions"]["root"] = {}
+        runtime_data.genome["brain_regions"]["root"]["title"] = "Genome's root brain region"
+        runtime_data.genome["brain_regions"]["root"]["description"] = None
+        runtime_data.genome["brain_regions"]["root"]["parent_region_id"] = None
+        runtime_data.genome["brain_regions"]["root"]["coordinate_2d"] = [0, 0]
+        runtime_data.genome["brain_regions"]["root"]["coordinate_3d"] = [0, 0, 0]
+        runtime_data.genome["brain_regions"]["root"]["areas"] = []
+        runtime_data.genome["brain_regions"]["root"]["regions"] = []
+        runtime_data.genome["brain_regions"]["root"]["inputs"] = []
+        runtime_data.genome["brain_regions"]["root"]["outputs"] = []
+
+        for cortical_area in runtime_data.cortical_list:
+            runtime_data.genome["brain_regions"]["root"]["areas"].append(cortical_area)
+            runtime_data.cortical_area_region_association[cortical_area] = "root"
+
+    for cortical_area in runtime_data.cortical_list:
+        if cortical_area not in runtime_data.cortical_area_region_association:
+            for region in runtime_data.genome["brain_regions"]:
+                if cortical_area in runtime_data.genome["brain_regions"][region]["areas"]:
+                    runtime_data.cortical_area_region_association[cortical_area] = region
+            if cortical_area not in runtime_data.cortical_area_region_association:
+                runtime_data.cortical_area_region_association[cortical_area] = "root"
+
+        # if runtime_data.genome["blueprint"][cortical_area]["group_id"] == "IPU":
+        #     runtime_data.genome["brain_regions"]["root"]["inputs"][cortical_area] = []
+        # if runtime_data.genome["blueprint"][cortical_area]["group_id"] == "OPU":
+        #     runtime_data.genome["brain_regions"]["root"]["outputs"][cortical_area] = []
+
+
 def init_container_variables():
     """
     Identifies variables set by containers and sets them in FEAGI runtime parameters
@@ -175,11 +218,14 @@ def init_memory_register():
 
     for cortical_area in runtime_data.genome["blueprint"]:
         for dst_cortical_area in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
-            if "sub_group_id" in runtime_data.genome["blueprint"][dst_cortical_area]:
-                if runtime_data.genome["blueprint"][dst_cortical_area]["sub_group_id"] == "MEMORY":
-                    if dst_cortical_area not in runtime_data.memory_register:
-                        runtime_data.memory_register[dst_cortical_area] = set()
-                    runtime_data.memory_register[dst_cortical_area].add(cortical_area)
+            if dst_cortical_area in runtime_data.genome["blueprint"]:
+                if "sub_group_id" in runtime_data.genome["blueprint"][dst_cortical_area]:
+                    if runtime_data.genome["blueprint"][dst_cortical_area]["sub_group_id"] == "MEMORY":
+                        if dst_cortical_area not in runtime_data.memory_register:
+                            runtime_data.memory_register[dst_cortical_area] = set()
+                        runtime_data.memory_register[dst_cortical_area].add(cortical_area)
+            else:
+                print(f"Warning!! {dst_cortical_area} not found in blueprint while running init_memory_register func.")
 
 
 def running_in_container():
@@ -535,69 +581,3 @@ def init_burst_engine():
     # except KeyError as e:
     #     print('ERROR: OPU socket is not properly defined as part of feagi_configuration.ini\n', e)
 
-
-def generate_cortical_dimensions():
-    """
-    Generates the information needed to display cortical areas on Godot
-    """
-    cortical_information = {}
-
-    for cortical_area in runtime_data.genome["blueprint"]:
-        cortical_name = runtime_data.genome["blueprint"][cortical_area]["cortical_name"]
-        cortical_information[cortical_name] = []
-        genes = runtime_data.genome["blueprint"][cortical_area]
-        cortical_information[cortical_name].append(genes["relative_coordinate"][0])
-        cortical_information[cortical_name].append(genes["relative_coordinate"][1])
-        cortical_information[cortical_name].append(genes["relative_coordinate"][2])
-        cortical_information[cortical_name].append(genes["visualization"])
-        cortical_information[cortical_name].append(genes["block_boundaries"][0])
-        cortical_information[cortical_name].append(genes["block_boundaries"][1])
-        cortical_information[cortical_name].append(genes["block_boundaries"][2])
-        cortical_information[cortical_name].append(cortical_area)
-
-    with open(runtime_data.connectome_path+"cortical_data.json", "w") as data_file:
-        data_file.seek(0)
-        data_file.write(json.dumps(cortical_information, indent=3))
-        data_file.truncate()
-
-    return cortical_information
-
-
-def generate_cortical_dimensions_by_id():
-    """
-    Generates the information needed to display cortical areas on Godot
-    """
-    cortical_information = {}
-
-    for cortical_area in runtime_data.genome["blueprint"]:
-        cortical_information[cortical_area] = {}
-        genes = runtime_data.genome["blueprint"][cortical_area]
-
-        cortical_information[cortical_area]["cortical_name"] = genes["cortical_name"]
-        cortical_information[cortical_area]["cortical_group"] = genes["group_id"]
-        cortical_information[cortical_area]["cortical_sub_group"] = genes["sub_group_id"]
-        cortical_information[cortical_area]["visible"] = genes["visualization"]
-
-        cortical_information[cortical_area]["coordinates_2d"] = [
-            genes["2d_coordinate"][0],
-            genes["2d_coordinate"][1]
-        ]
-
-        cortical_information[cortical_area]["coordinates_3d"] = [
-            genes["relative_coordinate"][0],
-            genes["relative_coordinate"][1],
-            genes["relative_coordinate"][2]
-        ]
-
-        cortical_information[cortical_area]["cortical_dimensions"] = [
-            genes["block_boundaries"][0],
-            genes["block_boundaries"][1],
-            genes["block_boundaries"][2]
-        ]
-
-    with open(runtime_data.connectome_path+"cortical_data_by_id.json", "w") as data_file:
-        data_file.seek(0)
-        data_file.write(json.dumps(cortical_information, indent=3))
-        data_file.truncate()
-
-    return cortical_information
diff --git a/src/inf/runtime_data.py b/src/inf/runtime_data.py
index 071c261aa..a846185c5 100644
--- a/src/inf/runtime_data.py
+++ b/src/inf/runtime_data.py
@@ -75,6 +75,7 @@
     "3d_viz": 0
 }
 manual_delete_list = set()
+genome_fitness = 1
 
 # Staging Zone
 pending_genome = None
@@ -110,7 +111,7 @@
 neuron_mp_collection_scope = {}
 neuron_psp_collection_scope = {}
 training_stats = {}
-game_stats = {}
+fitness_stats = {}
 brain_stats = {
     "neuron_count": 0,
     "synapse_count": 0
@@ -160,6 +161,7 @@
 brain_is_running = False
 cumulative_stats = {}
 memory_register = {}
+cortical_area_region_association = dict()
 
 
 # Training
@@ -208,3 +210,9 @@
     "PNS": set(),
     "CNS": set()
 }
+
+# Visualization
+cortical_viz_list = set()
+cortical_viz_skip_rate = 0
+cortical_viz_sup_threshold = 10000
+cortical_viz_sup_till_burst = dict()
diff --git a/src/mem/memory.py b/src/mem/memory.py
index 15894e702..189bcb4b7 100644
--- a/src/mem/memory.py
+++ b/src/mem/memory.py
@@ -163,31 +163,41 @@ def long_short_term_memory():
     runtime_data.lstm_fire_queue = set()
     if runtime_data.memory_register:
         for memory_cortical_area in runtime_data.memory_register:
-            neurogenesis_list = set()
-            for upstream_cortical_area in runtime_data.memory_register[memory_cortical_area]:
-                if upstream_cortical_area in runtime_data.fire_candidate_list:
-                    if runtime_data.fire_candidate_list[upstream_cortical_area]:
-                        # todo: performance: exclude non-immortal neurons from being processed
-                        neurogenesis_list.update(runtime_data.fire_candidate_list[upstream_cortical_area])
-            memory_hash = generate_mem_hash_cache(afferent_neuron_list=neurogenesis_list)
-
-            mem_neuron_id = convert_hash_to_neuron_id(cortical_area=memory_cortical_area, memory_hash=memory_hash)
-            if mem_neuron_id not in runtime_data.brain[memory_cortical_area] and memory_hash != "0x0":
-                neuron_id = init_neuron(cortical_area=memory_cortical_area, soma_location=[0, 0, 0], mem_neuron_id=memory_hash)
-                runtime_data.voxel_dict[memory_cortical_area]["0-0-0"].add(neuron_id)
-                synapse_count = synapse_memory_neuron(neuron_id=neuron_id)
-            else:
-                increase_neuron_lifespan(cortical_area=memory_cortical_area, neuron_id=mem_neuron_id)
+            if memory_cortical_area in runtime_data.brain:
+                neurogenesis_list = set()
+                for upstream_cortical_area in runtime_data.memory_register[memory_cortical_area]:
+                    if upstream_cortical_area in runtime_data.fire_candidate_list:
+                        if runtime_data.fire_candidate_list[upstream_cortical_area]:
+                            # todo: performance: exclude non-immortal neurons from being processed
+                            neurogenesis_list.update(runtime_data.fire_candidate_list[upstream_cortical_area])
+                memory_hash = generate_mem_hash_cache(afferent_neuron_list=neurogenesis_list)
+
+                mem_neuron_id = convert_hash_to_neuron_id(cortical_area=memory_cortical_area, memory_hash=memory_hash)
+                if mem_neuron_id not in runtime_data.brain[memory_cortical_area] and memory_hash != "0x0":
+                    neuron_id = init_neuron(cortical_area=memory_cortical_area,
+                                            soma_location=[0, 0, 0],
+                                            mem_neuron_id=memory_hash)
+                    runtime_data.voxel_dict[memory_cortical_area]["0-0-0"].add(neuron_id)
+                    synapse_count = synapse_memory_neuron(neuron_id=neuron_id)
+                else:
+                    increase_neuron_lifespan(cortical_area=memory_cortical_area, neuron_id=mem_neuron_id)
 
-            if memory_hash != "0x0":
-                if memory_cortical_area not in runtime_data.future_fcl:
-                    runtime_data.future_fcl[memory_cortical_area] = set()
+                if memory_hash != "0x0":
+                    if memory_cortical_area not in runtime_data.future_fcl:
+                        runtime_data.future_fcl[memory_cortical_area] = set()
 
-                runtime_data.lstm_fire_queue.add(mem_neuron_id)
-                if memory_cortical_area in runtime_data.plasticity_dict:
-                    runtime_data.plasticity_queue_candidates.add(mem_neuron_id)
+                    runtime_data.lstm_fire_queue.add(mem_neuron_id)
+                    if memory_cortical_area in runtime_data.plasticity_dict:
+                        runtime_data.plasticity_queue_candidates.add(mem_neuron_id)
+
+                inject_lstm_fire_queue_to_fcl()
+            else:
+                # Clean up memory register in case it doesn't exist in brain
+                for memory_area in runtime_data.memory_register:
+                    if memory_cortical_area in runtime_data.memory_register[memory_area]:
+                        runtime_data.memory_register[memory_area].remove(memory_cortical_area)
 
-            inject_lstm_fire_queue_to_fcl()
+                del runtime_data.memory_register[memory_cortical_area]
 
 
 def lstm_lifespan_mgmt():
diff --git a/src/npu/burst_engine.py b/src/npu/burst_engine.py
index df4444923..082e32cf0 100644
--- a/src/npu/burst_engine.py
+++ b/src/npu/burst_engine.py
@@ -171,7 +171,7 @@ def evolutionary_checkpoint():
         if runtime_data.burst_count % runtime_data.genome["physiology"]['evolution_burst_count'] == 0:
             print('Evolution phase reached...')
             for area in runtime_data.cortical_list:
-                neuron_count, synapse_count = connectome_total_synapse_cnt(area)
+                neuron_count, synapse_count = cortical_area_anatomical_stats(area)
                 if (runtime_data.parameters["Database"]["influxdb_enabled"] and
                         runtime_data.influxdb and
                         runtime_data.parameters["Database"]["influx_stat_logger"]):
@@ -207,8 +207,8 @@ def consecutive_fire_threshold_check(cortical_area_, neuron_id):
         consecutive_fire_cnt_max = runtime_data.genome["blueprint"][cortical_area_]["consecutive_fire_cnt_max"]
         consecutive_fire_cnt = runtime_data.brain[cortical_area_][neuron_id]["consecutive_fire_cnt"]
         if 0 < consecutive_fire_cnt_max <= consecutive_fire_cnt:
-            snooze_till(cortical_area_, neuron_id, runtime_data.burst_count +
-                        runtime_data.genome["blueprint"][cortical_area_]["snooze_length"])
+
+            snooze(cortical_area_, neuron_id)
             runtime_data.brain[cortical_area_][neuron_id]["consecutive_fire_cnt"] = 0
             return False
         else:
@@ -218,7 +218,7 @@ def fire_fcl_contents():
         # time_firing_activities = datetime.now()
         if candidate_list_counter(runtime_data.fire_candidate_list) == 0:
             runtime_data.empty_fcl_counter += 1
-            print("FCL is empty!")
+            # print("FCL is empty!")
         else:
             # Capture cortical activity stats
             capture_cortical_activity_stats()
@@ -229,7 +229,7 @@ def fire_fcl_contents():
 
             # Fire FCL neurons and pre-process viability of the downstream neurons for firing
             # Todo: Move degeneration items to a higher level to save on compute cycles
-            for fcl_cortical_area in runtime_data.fire_candidate_list:
+            for fcl_cortical_area in runtime_data.fire_candidate_list.copy():
                 if "degeneration" not in runtime_data.genome['blueprint'][fcl_cortical_area] or \
                         runtime_data.genome['blueprint'][fcl_cortical_area]['degeneration'] is None:
                     degeneration_val = 0
@@ -238,19 +238,22 @@ def fire_fcl_contents():
                 while runtime_data.fire_candidate_list[fcl_cortical_area]:
                     neuron_to_fire = runtime_data.fire_candidate_list[fcl_cortical_area].pop()
                     # Update downstream neurons in an isolated queue
-                    neuron_pre_fire_processing(fcl_cortical_area, neuron_to_fire, degenerate=degeneration_val)
+                    if neuron_to_fire in runtime_data.brain[fcl_cortical_area]:
+                        neuron_pre_fire_processing(fcl_cortical_area, neuron_to_fire, degenerate=degeneration_val)
 
-                    runtime_data.brain[fcl_cortical_area][neuron_to_fire][
-                        "last_membrane_potential_update"] = runtime_data.burst_count
+                        runtime_data.brain[fcl_cortical_area][neuron_to_fire][
+                            "last_membrane_potential_update"] = runtime_data.burst_count
 
-                    # Log the pre-fire neuron membrane potential in database
-                    neuron_stimulation_mp_logger(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire)
+                        # Log the pre-fire neuron membrane potential in database
+                        neuron_stimulation_mp_logger(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire)
 
-                    runtime_data.brain[fcl_cortical_area][neuron_to_fire]['membrane_potential'] = 0
+                        runtime_data.brain[fcl_cortical_area][neuron_to_fire]['membrane_potential'] = 0
 
-                    # Log a zero membrane potential for post neuron firing
-                    membrane_potential_update(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire,
-                                              membrane_potential_change=0, overwrite=True, overwrite_value=0)
+                        # Log a zero membrane potential for post neuron firing
+                        membrane_potential_update(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire,
+                                                  membrane_potential_change=0, overwrite=True, overwrite_value=0)
+                    else:
+                        print("Warning!! FCL contained dead neuron!")
 
             # Add neurons to future FCL
             # This is where neuron leak is considered and membrane potentials are updated+++
@@ -479,19 +482,44 @@ def brain_activity_voxelizer():
                 try:
                     for _ in runtime_data.fire_candidate_list:
                         fire_list = set(runtime_data.fire_candidate_list[_])
-                        if runtime_data.genome['blueprint'][_].get('visualization'):
-                            while fire_list:
-                                firing_neuron = fire_list.pop()
-                                firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
-                                relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
-                                broadcast_message.add(
-                                    (
-                                        runtime_data.burst_count,
-                                        firing_neuron_loc[0] + relative_coords[0],
-                                        firing_neuron_loc[1] + relative_coords[1],
-                                        firing_neuron_loc[2] + relative_coords[2]
+                        if _ not in runtime_data.cortical_viz_list:
+                            if len(fire_list) > runtime_data.cortical_viz_sup_threshold:
+                                # todo: move this to a function that does cortical area initialization
+                                if _ not in runtime_data.cortical_viz_sup_till_burst:
+                                    runtime_data.cortical_viz_sup_till_burst[_] = \
+                                        runtime_data.burst_count + runtime_data.cortical_viz_skip_rate
+
+                                if runtime_data.burst_count < runtime_data.cortical_viz_sup_till_burst[_]:
+                                    pass
+                                else:
+                                    runtime_data.cortical_viz_sup_till_burst[_] = \
+                                        runtime_data.burst_count + runtime_data.cortical_viz_skip_rate
+                                    # todo: duplicate code snippet 10 lines down -- refactor
+                                    while fire_list:
+                                        firing_neuron = fire_list.pop()
+                                        firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
+                                        relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
+                                        broadcast_message.add(
+                                            (
+                                                runtime_data.burst_count,
+                                                firing_neuron_loc[0] + relative_coords[0],
+                                                firing_neuron_loc[1] + relative_coords[1],
+                                                firing_neuron_loc[2] + relative_coords[2]
+                                            )
+                                        )
+                            else:
+                                while fire_list:
+                                    firing_neuron = fire_list.pop()
+                                    firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
+                                    relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
+                                    broadcast_message.add(
+                                        (
+                                            runtime_data.burst_count,
+                                            firing_neuron_loc[0] + relative_coords[0],
+                                            firing_neuron_loc[1] + relative_coords[1],
+                                            firing_neuron_loc[2] + relative_coords[2]
+                                        )
                                     )
-                                )
                     return broadcast_message
                 except Exception as e:
                     print("Exception during voxelization.", e, traceback.print_exc())
diff --git a/src/npu/physiology.py b/src/npu/physiology.py
index 3b953161f..e810775a3 100644
--- a/src/npu/physiology.py
+++ b/src/npu/physiology.py
@@ -34,12 +34,16 @@ def activation_function(postsynaptic_current):
 
 
 def reset_cumulative_counters(cortical_area, neuron_id):
-    runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] = runtime_data.burst_count
-    runtime_data.brain[cortical_area][neuron_id]["last_membrane_potential_reset_burst"] = runtime_data.burst_count
-    runtime_data.brain[cortical_area][neuron_id]['cumulative_fire_count'] += 1
-    runtime_data.brain[cortical_area][neuron_id]["cumulative_fire_count_inst"] += 1
-    # Condition to increase the consecutive fire count
-    runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] += 1
+    if neuron_id in runtime_data.brain[cortical_area]:
+        if runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] == runtime_data.burst_count - 1:
+            runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] += 1
+        else:
+            runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] = 0
+
+        runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] = runtime_data.burst_count
+        runtime_data.brain[cortical_area][neuron_id]["last_membrane_potential_reset_burst"] = runtime_data.burst_count
+        runtime_data.brain[cortical_area][neuron_id]['cumulative_fire_count'] += 1
+        runtime_data.brain[cortical_area][neuron_id]["cumulative_fire_count_inst"] += 1
 
 
 def neuron_stimulation_mp_logger(cortical_area, neuron_id):
@@ -99,9 +103,16 @@ def update_membrane_potential_fire_queue(cortical_area, neuron_id, mp_update_amo
         runtime_data.fire_queue[cortical_area][neuron_id][0] += mp_update_amount
     if fcl_insertion:
         if runtime_data.fire_queue[cortical_area][neuron_id][0] > runtime_data.fire_queue[cortical_area][neuron_id][1]:
-            add_neuron_to_fcl(cortical_area=cortical_area,
-                              neuron_id=neuron_id,
-                              pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
+            if runtime_data.genome['blueprint'][cortical_area]['firing_threshold_limit'] == 0:
+                add_neuron_to_fcl(cortical_area=cortical_area,
+                                  neuron_id=neuron_id,
+                                  pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
+            elif runtime_data.fire_queue[cortical_area][neuron_id][0] <= \
+                    (runtime_data.fire_queue[cortical_area][neuron_id][1] +
+                     runtime_data.genome['blueprint'][cortical_area]['firing_threshold_limit']):
+                add_neuron_to_fcl(cortical_area=cortical_area,
+                                  neuron_id=neuron_id,
+                                  pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
 
 
 def add_neuron_to_fcl(cortical_area, neuron_id, pre_fire_mp):
@@ -159,7 +170,8 @@ def neuron_pre_fire_processing(cortical_area, neuron_id, degenerate=0):
 
             if degenerate > 0:
                 # reduce neuron postsynaptic current by degeneration value defined in genome (if applicable)
-                new_psc = runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron_id]["postsynaptic_current"]
+                new_psc = \
+                    runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron_id]["postsynaptic_current"]
                 new_psc -= degenerate
                 if new_psc < 0:
                     new_psc = 0
@@ -168,7 +180,8 @@ def neuron_pre_fire_processing(cortical_area, neuron_id, degenerate=0):
                                              post_synaptic_current=new_psc)
 
             if runtime_data.genome['blueprint'][cortical_area]['mp_driven_psp']:
-                postsynaptic_current = runtime_data.brain[cortical_area][neuron_id]['pre_fire_mp']
+                if "pre_fire_mp" in runtime_data.brain[cortical_area][neuron_id]:
+                    postsynaptic_current = runtime_data.brain[cortical_area][neuron_id]['pre_fire_mp']
 
             neuron_output = activation_function(postsynaptic_current)
 
@@ -358,16 +371,15 @@ def neuron_neighbors(cortical_area, neuron_id):
     return data[neuron_id]["neighbors"]
 
 
-def snooze_till(cortical_area, neuron_id, burst_id):
+def snooze(cortical_area, neuron_id):
     """ Acting as an inhibitory neurotransmitter to suppress firing of neuron till a later burst_manager
 
     *** This function instead of inhibitory behavior is more inline with Neuron Refractory period
 
     """
     runtime_data.brain[cortical_area][neuron_id]["snooze_till_burst_num"] \
-        = burst_id + runtime_data.genome["blueprint"][cortical_area]["snooze_length"] - 1
+        = runtime_data.burst_count + runtime_data.genome["blueprint"][cortical_area]["snooze_length"] - 1
     # print("%s : %s has been snoozed!" % (cortical_area, neuron_id))
-    return
 
 
 def pruner(pruning_data):
diff --git a/src/npu/stimulator.py b/src/npu/stimulator.py
index de0d2cdd7..87089f06c 100644
--- a/src/npu/stimulator.py
+++ b/src/npu/stimulator.py
@@ -1,3 +1,17 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
 
 """
 This module contains a virtual set of hardware controllers used for simulation and testing only
diff --git a/src/pns/stimuli_translator.py b/src/pns/stimuli_translator.py
index 422a91f37..c7be415a9 100644
--- a/src/pns/stimuli_translator.py
+++ b/src/pns/stimuli_translator.py
@@ -224,51 +224,51 @@ def training_translator(stimulation):
         inject_stimuli_to_fcl(cortical_area=cortical_area, stimulation=stimulation)
 
 
-def lidar_translator(proximity_data):
-    """
-    Translate the lidar messages based on its type.
-
-    todo: add details here about the message format and expectations
-
-
-    Type is not needed at this point given the lidar vs sonar data is automatically differentiated within the func.
-    """
-
-    cortical_area = 'i__pro'
-    if cortical_area_in_genome(cortical_area):
-        if proximity_data is not None:
-            # print("SLOT_TYPES", message.SLOT_TYPES)
-            # print("angle_increment:", message.angle_increment)
-            # print("angle_max:", message.angle_max)
-            # print("angle_min:", message.angle_min)
-            # print("get_fields_and_field_types:", message.get_fields_and_field_types)
-            # print("header:", message.header)
-            # print("intensities:", message.intensities)
-            # print("range_max:", message.range_max)
-            # print("range_min:", message.range_min)
-            # print("ranges:", message.ranges)
-            # print("scan_time:", message.scan_time)
-            # print("time_increment:", message.time_increment)
-            # print("-----")
-
-            for sensor in proximity_data:
-                # differentiate between LIDAR/SONAR data
-                if hasattr(proximity_data[sensor], '__iter__'):
-                    detections = stimuli_processor.lidar_to_coords(proximity_data[sensor])
-                else:
-                    detections = stimuli_processor.sonar_to_coords(proximity_data[sensor])
-
-                neurons = stimuli_processor.coords_to_neuron_ids(
-                    detections, cortical_area=cortical_area
-                )
-                # TODO: Add proximity feeder function in fcl_injector
-                if 'i__pro' not in runtime_data.fire_candidate_list:
-                    runtime_data.fire_candidate_list['i__pro'] = set()
-                for neuron in neurons:
-                    runtime_data.fire_candidate_list['i__pro'].add(neuron)
-                # runtime_data.fcl_queue.put({cortical_area: set(neurons)})
-    else:
-        runtime_data.logs["PNS"].add(f"Warning! Cortical stimulation received but genome missing {cortical_area}")
+# def lidar_translator(proximity_data):
+#     """
+#     Translate the lidar messages based on its type.
+#
+#     todo: add details here about the message format and expectations
+#
+#
+#     Type is not needed at this point given the lidar vs sonar data is automatically differentiated within the func.
+#     """
+#
+#     cortical_area = 'i__pro'
+#     if cortical_area_in_genome(cortical_area):
+#         if proximity_data is not None:
+#             # print("SLOT_TYPES", message.SLOT_TYPES)
+#             # print("angle_increment:", message.angle_increment)
+#             # print("angle_max:", message.angle_max)
+#             # print("angle_min:", message.angle_min)
+#             # print("get_fields_and_field_types:", message.get_fields_and_field_types)
+#             # print("header:", message.header)
+#             # print("intensities:", message.intensities)
+#             # print("range_max:", message.range_max)
+#             # print("range_min:", message.range_min)
+#             # print("ranges:", message.ranges)
+#             # print("scan_time:", message.scan_time)
+#             # print("time_increment:", message.time_increment)
+#             # print("-----")
+#
+#             for sensor in proximity_data:
+#                 # differentiate between LIDAR/SONAR data
+#                 if hasattr(proximity_data[sensor], '__iter__'):
+#                     detections = stimuli_processor.lidar_to_coords(proximity_data[sensor])
+#                 else:
+#                     detections = stimuli_processor.sonar_to_coords(proximity_data[sensor])
+#
+#                 neurons = stimuli_processor.coords_to_neuron_ids(
+#                     detections, cortical_area=cortical_area
+#                 )
+#                 # TODO: Add proximity feeder function in fcl_injector
+#                 if 'i__pro' not in runtime_data.fire_candidate_list:
+#                     runtime_data.fire_candidate_list['i__pro'] = set()
+#                 for neuron in neurons:
+#                     runtime_data.fire_candidate_list['i__pro'].add(neuron)
+#                 # runtime_data.fcl_queue.put({cortical_area: set(neurons)})
+#     else:
+#         runtime_data.logs["PNS"].add(f"Warning! Cortical stimulation received but genome missing {cortical_area}")
 
 
 def gyro_translator(gyroscope_data):


Test patch:
diff --git a/src/evo/circuits/leak_test_1_23.json b/src/evo/circuits/leak_test_1_23.json
index 2edc98436..fd488ab77 100644
--- a/src/evo/circuits/leak_test_1_23.json
+++ b/src/evo/circuits/leak_test_1_23.json
@@ -929,7 +929,7 @@
    },
    "blueprint": {
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.0,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35.0,
@@ -977,7 +977,7 @@
       "_____10c-___pwr-cx-__name-t": "Brain_Power",
       "_____10c-___pwr-cx-_group-t": "IPU",
       "_____10c-_death-cx-_n_cnt-i": 1,
-      "_____10c-_death-cx-synatt-i": 100,
+      "_____10c-_death-cx-synatt-f": 100,
       "_____10c-_death-cx-de_gen-f": 0.01,
       "_____10c-_death-cx-pspuni-b": false,
       "_____10c-_death-nx-pstcrm-f": 35,
@@ -1000,7 +1000,7 @@
       "_____10c-_death-cx-__name-t": "Brain_Death",
       "_____10c-_death-cx-_group-t": "IPU",
       "_____10c-CR3ind-cx-_n_cnt-i": 1,
-      "_____10c-CR3ind-cx-synatt-i": 100,
+      "_____10c-CR3ind-cx-synatt-f": 100,
       "_____10c-CR3ind-cx-de_gen-f": 0.0,
       "_____10c-CR3ind-cx-pspuni-b": true,
       "_____10c-CR3ind-nx-pstcrm-f": 10.0,
@@ -1023,7 +1023,7 @@
       "_____10c-CR3ind-cx-__name-t": "leak_indicator",
       "_____10c-CR3ind-cx-_group-t": "CUSTOM",
       "_____10c-C9UIPS-cx-_n_cnt-i": 1,
-      "_____10c-C9UIPS-cx-synatt-i": 100,
+      "_____10c-C9UIPS-cx-synatt-f": 100,
       "_____10c-C9UIPS-cx-de_gen-f": 0.0,
       "_____10c-C9UIPS-cx-pspuni-b": true,
       "_____10c-C9UIPS-nx-pstcrm-f": 100.0,
@@ -1059,7 +1059,7 @@
       "_____10c-C9UIPS-cx-__name-t": "leak_inhibitory",
       "_____10c-C9UIPS-cx-_group-t": "CUSTOM",
       "_____10c-C7Fexc-cx-_n_cnt-i": 1,
-      "_____10c-C7Fexc-cx-synatt-i": 100,
+      "_____10c-C7Fexc-cx-synatt-f": 100,
       "_____10c-C7Fexc-cx-de_gen-f": 0.0,
       "_____10c-C7Fexc-cx-pspuni-b": true,
       "_____10c-C7Fexc-nx-pstcrm-f": 100.0,
@@ -1095,7 +1095,7 @@
       "_____10c-C7Fexc-cx-__name-t": "leak_excitatory",
       "_____10c-C7Fexc-cx-_group-t": "CUSTOM",
       "_____10c-CRGlea-cx-_n_cnt-i": 1,
-      "_____10c-CRGlea-cx-synatt-i": 100,
+      "_____10c-CRGlea-cx-synatt-f": 100,
       "_____10c-CRGlea-nx-pstcr_-f": 1.0,
       "_____10c-CRGlea-nx-plst_c-f": 1.0,
       "_____10c-CRGlea-cx-de_gen-f": 0.0,
@@ -1143,7 +1143,7 @@
       "_____10c-CRGlea-cx-rcordz-i": -20,
       "_____10c-CRGlea-cx-_group-t": "CUSTOM",
       "_____10c-CQHlea-cx-_n_cnt-i": 1,
-      "_____10c-CQHlea-cx-synatt-i": 100,
+      "_____10c-CQHlea-cx-synatt-f": 100,
       "_____10c-CQHlea-nx-pstcr_-f": 30.0,
       "_____10c-CQHlea-nx-plst_c-f": 1.0,
       "_____10c-CQHlea-cx-de_gen-f": 0.0,