Repository: 7mind/izumi
Pull request #1240 (2020-09-19 16:15:58)

Add BIOConcurrent between BIOAsync & BIOParallel


Patch:
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/MainAppModule.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/MainAppModule.scala
index e0afade70..b34d87762 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/MainAppModule.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/MainAppModule.scala
@@ -42,7 +42,6 @@ import izumi.reflect.Tag
   * 15. Run finalizers
   * 16. Shutdown executors
   */
-
 class MainAppModule[F[_]: TagK](
   args: ArgV,
   additionalRoles: AdditionalRoles,
@@ -51,9 +50,13 @@ class MainAppModule[F[_]: TagK](
 )(implicit t: Tag[TagK[F]]
 ) extends ModuleDef {
   make[ArgV].fromValue(args)
-  make[CLIParser].from[CLIParserImpl]
+
   make[AdditionalRoles].fromValue(additionalRoles)
-  make[ParserFailureHandler].from[ParserFailureHandler.TerminatingHandler.type]
+  make[AppShutdownStrategy[F]].fromValue(shutdownStrategy)
+  make[PluginConfig].named("main").fromValue(pluginConfig)
+
+  make[CLIParser].from[CLIParserImpl]
+  make[ParserFailureHandler].from(ParserFailureHandler.TerminatingHandler)
   make[AppArgsInterceptor].from[AppArgsInterceptor.AppArgsInterceptorImpl]
 
   make[RawAppArgs].from {
@@ -70,11 +73,6 @@ class MainAppModule[F[_]: TagK](
 
   addImplicit[TagK[F]]
 
-  make[AppShutdownStrategy[F]].fromValue(shutdownStrategy)
-  make[PluginConfig]
-    .named("main")
-    .fromValue(pluginConfig)
-
   make[Log.Level].named("early").fromValue(Log.Level.Info)
 
   make[IzLogger].named("early").from {
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppMain.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppMain.scala
index 5997a2928..37f5ed68e 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppMain.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/RoleAppMain.scala
@@ -1,8 +1,11 @@
 package izumi.distage.roles
 
 import distage._
+import cats.effect._
+import izumi.functional.bio._
 import izumi.distage.plugins.PluginConfig
 import izumi.distage.roles.RoleAppMain.{AdditionalRoles, ArgV}
+import izumi.distage.roles.launcher.AppShutdownStrategy._
 import izumi.distage.roles.launcher.{AppFailureHandler, AppShutdownStrategy, PreparedApp}
 import izumi.fundamentals.platform.cli.model.raw.RawRoleParams
 import izumi.fundamentals.platform.cli.model.schema.ParserDef
@@ -10,10 +13,15 @@ import izumi.fundamentals.platform.functional.Identity
 import izumi.fundamentals.platform.language.unused
 import izumi.reflect.Tag
 
-abstract class RoleAppMain[F[_]: TagK]()(implicit t: Tag[TagK[F]]) {
+import scala.concurrent.ExecutionContext
+
+abstract class RoleAppMain[F[_]: TagK](implicit t: Tag[TagK[F]]) {
+  protected def pluginConfig: PluginConfig
+  protected def shutdownStrategy: AppShutdownStrategy[F]
+
   def main(args: Array[String]): Unit = {
+    val argv = ArgV(args)
     try {
-      val argv = ArgV(args)
       val appModule = makeAppModule(argv)
       val overrideModule = makeAppModuleOverride(argv)
       Injector.NoProxies().produceRun(appModule.overridenBy(overrideModule)) {
@@ -22,7 +30,7 @@ abstract class RoleAppMain[F[_]: TagK]()(implicit t: Tag[TagK[F]]) {
       }
     } catch {
       case t: Throwable =>
-        createEarlyFailureHandler().onError(t)
+        createEarlyFailureHandler(argv).onError(t)
     }
   }
 
@@ -36,26 +44,34 @@ abstract class RoleAppMain[F[_]: TagK]()(implicit t: Tag[TagK[F]]) {
 
   protected def makeAppModule(args: ArgV): Module = {
     new MainAppModule[F](
-      args,
-      AdditionalRoles(requiredRoles(args)),
-      makeShutdownStrategy(),
-      makePluginConfig(),
+      args = args,
+      additionalRoles = AdditionalRoles(requiredRoles(args)),
+      shutdownStrategy = shutdownStrategy,
+      pluginConfig = pluginConfig,
     )
   }
 
-  protected def createEarlyFailureHandler(): AppFailureHandler = {
+  protected def createEarlyFailureHandler(@unused args: ArgV): AppFailureHandler = {
     AppFailureHandler.TerminatingHandler
   }
+}
+
+object RoleAppMain {
 
-  protected def makeShutdownStrategy(): AppShutdownStrategy[F]
+  abstract class LauncherF[F[_]: TagK: LiftIO](executionContext: ExecutionContext = ExecutionContext.global) extends RoleAppMain[F] {
+    override protected def shutdownStrategy: AppShutdownStrategy[F] = new CatsEffectIOShutdownStrategy(executionContext)
+  }
 
-  protected def makePluginConfig(): PluginConfig
+  abstract class LauncherBIO[F[+_, +_]: TagKK: BIOAsync] extends RoleAppMain[F[Throwable, ?]] {
+    override protected def shutdownStrategy: AppShutdownStrategy[F[Throwable, ?]] = new BIOShutdownStrategy[F]
+  }
 
-}
+  abstract class LauncherIdentity extends RoleAppMain[Identity] {
+    override protected def shutdownStrategy: AppShutdownStrategy[Identity] = new JvmExitHookLatchShutdownStrategy
+  }
 
-object RoleAppMain {
-  case class ArgV(args: Array[String])
-  case class AdditionalRoles(knownRequiredRoles: Vector[RawRoleParams])
+  final case class ArgV(args: Array[String])
+  final case class AdditionalRoles(knownRequiredRoles: Vector[RawRoleParams])
 
   object Options extends ParserDef {
     final val logLevelRootParam = arg("log-level-root", "ll", "root log level", "{trace|debug|info|warn|error|critical}")
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/AppResourceProvider.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/AppResourceProvider.scala
index 9cf78452b..aa4d4f51f 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/AppResourceProvider.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/AppResourceProvider.scala
@@ -5,12 +5,13 @@ import izumi.distage.framework.services.IntegrationChecker
 import izumi.distage.framework.services.RoleAppPlanner.AppStartupPlans
 import izumi.distage.model.Locator
 import izumi.distage.model.definition.DIResource
+import izumi.distage.model.definition.DIResource.DIResourceBase
 import izumi.distage.model.effect.{DIEffect, DIEffectRunner}
 import izumi.distage.model.provisioning.PlanInterpreter.FinalizerFilter
 import izumi.fundamentals.platform.functional.Identity
 
 trait AppResourceProvider[F[_]] {
-  def makeAppResource(): DIResource.DIResourceBase[Identity, PreparedApp[F]]
+  def makeAppResource(): DIResourceBase[Identity, PreparedApp[F]]
 }
 
 object AppResourceProvider {
@@ -29,7 +30,7 @@ object AppResourceProvider {
     filters: FinalizerFilters[F],
     appPlan: AppStartupPlans,
   ) extends AppResourceProvider[F] {
-    def makeAppResource(): DIResource.DIResourceBase[Identity, PreparedApp[F]] = {
+    def makeAppResource(): DIResourceBase[Identity, PreparedApp[F]] = {
       appPlan
         .injector
         .produceFX[Identity](appPlan.runtime, filters.filterId)
@@ -42,7 +43,7 @@ object AppResourceProvider {
         }
     }
 
-    private def prepareMainResource(runtimeLocator: Locator)(implicit effect: DIEffect[F]): DIResource.DIResourceBase[F, Locator] = {
+    private def prepareMainResource(runtimeLocator: Locator)(implicit effect: DIEffect[F]): DIResourceBase[F, Locator] = {
       Injector
         .inherit(runtimeLocator)
         .produceFX[F](appPlan.app.shared, filters.filterF)
diff --git a/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/PreparedApp.scala b/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/PreparedApp.scala
index f49e1c30b..2520071ec 100644
--- a/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/PreparedApp.scala
+++ b/distage/distage-framework/src/main/scala/izumi/distage/roles/launcher/PreparedApp.scala
@@ -2,10 +2,11 @@ package izumi.distage.roles.launcher
 
 import izumi.distage.model.Locator
 import izumi.distage.model.definition.DIResource
+import izumi.distage.model.definition.DIResource.DIResourceBase
 import izumi.distage.model.effect.{DIEffect, DIEffectRunner}
 
 final case class PreparedApp[F[_]](
-  app: DIResource.DIResourceBase[F, Locator],
+  app: DIResourceBase[F, Locator],
   runner: DIEffectRunner[F],
   effect: DIEffect[F],
 ) {
diff --git a/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg b/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
index 338ab072d..7abc4bc23 100644
--- a/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
+++ b/doc/microsite/src/main/tut/bio/media/bio-hierarchy.svg
@@ -1,97 +1,100 @@
-<svg version="1.1" baseProfile="full" width="797.25" height="696" viewbox="0 0 797.25 696" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font-weight:bold; font-size:12pt; font-family:'Calibri', Helvetica, sans-serif;;stroke-width:3;stroke-linejoin:round;stroke-linecap:round">
+<svg version="1.1" baseProfile="full" width="868.25" height="625" viewbox="0 0 868.25 625" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font:bold normal 12pt Helvetica, Helvetica, sans-serif;;stroke-linejoin:round;stroke-linecap:round">
   <title >nomnoml</title>
-  <desc >[BIOBifunctor3]&lt;:--[BIOError3]
-[BIOFunctor3]&lt;:--[BIOApplicative3]
-[BIOApplicative3]&lt;:--[BIOGuarantee3]
-[BIOApplicative3]&lt;:--[BIOMonad3]
-[BIOGuarantee3]&lt;:--[BIOError3]
-[BIOError3]&lt;:--[BIOMonadError3]
-[BIOMonad3]&lt;:--[BIOMonadError3]
-[BIOMonadError3]&lt;:--[BIOBracket3]
-[BIOBracket3]&lt;:--[BIOPanic3]
-[BIOPanic3]&lt;:--[BIO3]
-[BIO3]&lt;:--[BIOAsync3]
-[BIOParallel3]&lt;:--[BIOAsync3]
-[BIOAsync3]&lt;:--[BIOTemporal3]
-
-[BIOProfunctor]&lt;:--[BIOArrow]
-[BIOArrow]&lt;:--[BIOArrowChoice]
-[BIOArrowChoice]&lt;:--[BIOLocal]
-
-[BIOAsk]&lt;:--[BIOMonadAsk]
-[BIOMonadAsk]&lt;:--[BIOLocal]</desc>
-  <path d="M83.5 186.5 L83.5 206.5 L134.2 226.5 L134.2 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M88.8 199.8 L83.5 199.8 L78.2 199.8 L83.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M335.5 44.5 L335.5 64.5 L335.5 84.5 L335.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M340.8 57.8 L335.5 57.8 L330.2 57.8 L335.5 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M304.1 115.5 L263.5 135.5 L263.5 155.5 L263.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M294.5 126.2 L292.1 121.4 L289.7 116.6 L304.1 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M359.5 115.5 L390.5 135.5 L390.5 171 L390.5 171 L390.5 206.5 L390.5 206.5 L390.5 226.5 L390.5 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M373.6 118.2 L370.7 122.7 L367.8 127.2 L359.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M263.5 186.5 L263.5 206.5 L212.8 226.5 L212.8 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M268.8 199.8 L263.5 199.8 L258.2 199.8 L263.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M173.5 257.5 L173.5 277.5 L214.1 297.5 L214.1 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M178.8 270.8 L173.5 270.8 L168.2 270.8 L173.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M390.5 257.5 L390.5 277.5 L308.8 297.5 L308.8 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M395.8 270.8 L390.5 270.8 L385.2 270.8 L390.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 328.5 L245.5 348.5 L245.5 368.5 L245.5 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M250.8 341.8 L245.5 341.8 L240.2 341.8 L245.5 328.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 399.5 L245.5 419.5 L245.5 439.5 L245.5 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M250.8 412.8 L245.5 412.8 L240.2 412.8 L245.5 399.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 470.5 L245.5 490.5 L245.5 510.5 L245.5 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M250.8 483.8 L245.5 483.8 L240.2 483.8 L245.5 470.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M245.5 541.5 L245.5 561.5 L282.7 581.5 L282.7 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M250.8 554.8 L245.5 554.8 L240.2 554.8 L245.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M377.5 541.5 L377.5 561.5 L340.3 581.5 L340.3 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M382.8 554.8 L377.5 554.8 L372.2 554.8 L377.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M311.5 612.5 L311.5 632.5 L311.5 652.5 L311.5 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M316.8 625.8 L311.5 625.8 L306.2 625.8 L311.5 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M545.3 44.5 L545.3 64.5 L545.3 84.5 L545.3 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M550.6 57.8 L545.3 57.8 L539.9 57.8 L545.3 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M545.3 115.5 L545.3 135.5 L545.3 155.5 L545.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M550.6 128.8 L545.3 128.8 L539.9 128.8 L545.3 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M545.3 186.5 L545.3 206.5 L595.1 226.5 L595.1 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M550.6 199.8 L545.3 199.8 L539.9 199.8 L545.3 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M722.3 115.5 L722.3 135.5 L722.3 155.5 L722.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M727.6 128.8 L722.3 128.8 L716.9 128.8 L722.3 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M722.3 186.5 L722.3 206.5 L672.4 226.5 L672.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M727.6 199.8 L722.3 199.8 L716.9 199.8 L722.3 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <rect x="13.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="83.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOBifunctor3</text>
-  <rect x="122.5" y="226.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="173.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOError3</text>
-  <rect x="275.5" y="13.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="336" y="35" style="fill: #33322E;text-anchor: middle;">BIOFunctor3</text>
-  <rect x="256.5" y="84.5" height="31" width="159" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="336" y="106" style="fill: #33322E;text-anchor: middle;">BIOApplicative3</text>
-  <rect x="193.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="263.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOGuarantee3</text>
-  <rect x="337.5" y="226.5" height="31" width="106" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="390.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOMonad3</text>
-  <rect x="168.5" y="297.5" height="31" width="154" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="245.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOMonadError3</text>
-  <rect x="185.5" y="368.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="246" y="390" style="fill: #33322E;text-anchor: middle;">BIOBracket3</text>
-  <rect x="194.5" y="439.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="245.5" y="461" style="fill: #33322E;text-anchor: middle;">BIOPanic3</text>
-  <rect x="218.5" y="510.5" height="31" width="54" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="245.5" y="532" style="fill: #33322E;text-anchor: middle;">BIO3</text>
-  <rect x="260.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="311.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
-  <rect x="312.5" y="510.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="377.5" y="532" style="fill: #33322E;text-anchor: middle;">BIOParallel3</text>
-  <rect x="246.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="311.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
-  <rect x="475.5" y="13.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="545.5" y="35" style="fill: #33322E;text-anchor: middle;">BIOProfunctor</text>
-  <rect x="499.5" y="84.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="545.5" y="106" style="fill: #33322E;text-anchor: middle;">BIOArrow</text>
-  <rect x="470.5" y="155.5" height="31" width="149" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="545" y="177" style="fill: #33322E;text-anchor: middle;">BIOArrowChoice</text>
-  <rect x="587.5" y="226.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="633.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOLocal</text>
-  <rect x="685.5" y="84.5" height="31" width="73" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="722" y="106" style="fill: #33322E;text-anchor: middle;">BIOAsk</text>
-  <rect x="659.5" y="155.5" height="31" width="125" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="722" y="177" style="fill: #33322E;text-anchor: middle;">BIOMonadAsk</text>
+  <desc >[BIOFunctor3]&lt;--[BIOApplicative3]
+[BIOApplicative3]&lt;--[BIOGuarantee3]
+[BIOApplicative3]&lt;--[BIOMonad3]
+[BIOGuarantee3]&lt;--[BIOApplicativeError3]
+[BIOBifunctor3]&lt;--[BIOApplicativeError3]
+[BIOApplicativeError3]&lt;--[BIOError3]
+[BIOMonad3]&lt;--[BIOError3]
+[BIOError3]&lt;--[BIOBracket3]
+[BIOBracket3]&lt;--[BIOPanic3]
+[BIOPanic3]&lt;--[BIO3]
+[BIOParallel3]&lt;--[BIOConcurrent3]
+[BIOConcurrent3]&lt;--[BIOAsync3]
+[BIO3]&lt;--[BIOAsync3]
+[BIOTemporal3]
+[BIOProfunctor]&lt;--[BIOArrow]
+[BIOArrow]&lt;--[BIOArrowChoice]
+[BIOArrowChoice]&lt;--[BIOLocal]
+[BIOAsk]&lt;--[BIOMonadAsk]
+[BIOMonadAsk]&lt;--[BIOLocal]
+</desc>
+  <rect x="0" y="0" height="625" width="868.25" style="stroke:none; fill:transparent;"></rect>
+  <path d="M254.3 44.5 L254.3 64.5 L254.3 84.5 L254.3 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M259.6 57.8 L254.3 51.2 L248.9 57.8 L254.3 44.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M184.8 114.1 L79.5 135.5 L79.5 155.5 L79.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M172.7 122 L178.2 115.4 L170.6 111.5 L184.8 114.1 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M313.2 115.5 L389.3 135.5 L389.3 171 L389.3 171 L389.3 206.5 L389.3 206.5 L389.3 226.5 L389.3 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M327.4 113.7 L319.6 117.2 L324.7 124 L313.2 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M79.5 186.5 L79.5 206.5 L126.8 226.5 L126.8 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M84.8 199.8 L79.5 193.2 L74.2 199.8 L79.5 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M247.5 186.5 L247.5 206.5 L200.2 226.5 L200.2 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M252.8 199.8 L247.5 193.2 L242.2 199.8 L247.5 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M163.5 257.5 L163.5 277.5 L214.6 297.5 L214.6 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M168.8 270.8 L163.5 264.2 L158.2 270.8 L163.5 257.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M389.3 257.5 L389.3 277.5 L300.3 300.9 L300.3 300.9 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M394.6 270.8 L389.3 264.2 L383.9 270.8 L389.3 257.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M254.3 328.5 L254.3 348.5 L254.3 368.5 L254.3 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M259.6 341.8 L254.3 335.2 L248.9 341.8 L254.3 328.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M254.3 399.5 L254.3 419.5 L254.3 439.5 L254.3 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M259.6 412.8 L254.3 406.2 L248.9 412.8 L254.3 399.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M254.3 470.5 L254.3 490.5 L254.3 510.5 L254.3 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M259.6 483.8 L254.3 477.2 L248.9 483.8 L254.3 470.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M111.3 470.5 L111.3 490.5 L111.3 510.5 L111.3 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M116.6 483.8 L111.3 477.2 L105.9 483.8 L111.3 470.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M111.3 541.5 L111.3 561.5 L151.5 581.5 L151.5 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M116.6 554.8 L111.3 548.2 L105.9 554.8 L111.3 541.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M254.3 541.5 L254.3 561.5 L214 581.5 L214 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M259.6 554.8 L254.3 548.2 L248.9 554.8 L254.3 541.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M618.8 44.5 L618.8 64.5 L618.8 84.5 L618.8 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M624.1 57.8 L618.8 51.2 L613.4 57.8 L618.8 44.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M618.8 115.5 L618.8 135.5 L618.8 155.5 L618.8 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M624.1 128.8 L618.8 122.2 L613.4 128.8 L618.8 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M618.8 186.5 L618.8 206.5 L667.9 226.5 L667.9 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M624.1 199.8 L618.8 193.2 L613.4 199.8 L618.8 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M793.3 115.5 L793.3 135.5 L793.3 155.5 L793.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M798.6 128.8 L793.3 122.2 L787.9 128.8 L793.3 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M793.3 186.5 L793.3 206.5 L744.1 226.5 L744.1 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M798.6 199.8 L793.3 193.2 L787.9 199.8 L793.3 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <rect x="197.5" y="13.5" height="31" width="113" data-name="BIOFunctor3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254" y="35" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOFunctor3">BIOFunctor3</text>
+  <rect x="184.5" y="84.5" height="31" width="139" data-name="BIOApplicative3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254" y="106" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOApplicative3">BIOApplicative3</text>
+  <rect x="13.5" y="155.5" height="31" width="132" data-name="BIOGuarantee3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="79.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOGuarantee3">BIOGuarantee3</text>
+  <rect x="336.5" y="226.5" height="31" width="105" data-name="BIOMonad3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="389" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOMonad3">BIOMonad3</text>
+  <rect x="74.5" y="226.5" height="31" width="178" data-name="BIOApplicativeError3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="163.5" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOApplicativeError3">BIOApplicativeError3</text>
+  <rect x="185.5" y="155.5" height="31" width="124" data-name="BIOBifunctor3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="247.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOBifunctor3">BIOBifunctor3</text>
+  <rect x="208.5" y="297.5" height="31" width="92" data-name="BIOError3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254.5" y="319" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOError3">BIOError3</text>
+  <rect x="198.5" y="368.5" height="31" width="112" data-name="BIOBracket3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254.5" y="390" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOBracket3">BIOBracket3</text>
+  <rect x="206.5" y="439.5" height="31" width="96" data-name="BIOPanic3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254.5" y="461" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOPanic3">BIOPanic3</text>
+  <rect x="227.5" y="510.5" height="31" width="53" data-name="BIO3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="254" y="532" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIO3">BIO3</text>
+  <rect x="56.5" y="439.5" height="31" width="110" data-name="BIOParallel3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="111.5" y="461" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOParallel3">BIOParallel3</text>
+  <rect x="41.5" y="510.5" height="31" width="140" data-name="BIOConcurrent3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="111.5" y="532" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOConcurrent3">BIOConcurrent3</text>
+  <rect x="132.5" y="581.5" height="31" width="101" data-name="BIOAsync3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="183" y="603" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOAsync3">BIOAsync3</text>
+  <rect x="391.5" y="13.5" height="31" width="124" data-name="BIOTemporal3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="453.5" y="35" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOTemporal3">BIOTemporal3</text>
+  <rect x="555.5" y="13.5" height="31" width="126" data-name="BIOProfunctor" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="618.5" y="35" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOProfunctor">BIOProfunctor</text>
+  <rect x="573.5" y="84.5" height="31" width="91" data-name="BIOArrow" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="619" y="106" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOArrow">BIOArrow</text>
+  <rect x="546.5" y="155.5" height="31" width="144" data-name="BIOArrowChoice" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="618.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOArrowChoice">BIOArrowChoice</text>
+  <rect x="663.5" y="226.5" height="31" width="86" data-name="BIOLocal" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="706.5" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOLocal">BIOLocal</text>
+  <rect x="756.5" y="84.5" height="31" width="74" data-name="BIOAsk" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="793.5" y="106" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOAsk">BIOAsk</text>
+  <rect x="730.5" y="155.5" height="31" width="125" data-name="BIOMonadAsk" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="793" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOMonadAsk">BIOMonadAsk</text>
 </svg>
\ No newline at end of file
diff --git a/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg b/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
index 770b660d0..b414a5a26 100644
--- a/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
+++ b/doc/microsite/src/main/tut/bio/media/bio-relationship-hierarchy.svg
@@ -1,112 +1,116 @@
-<svg version="1.1" baseProfile="full" width="836.5" height="696" viewbox="0 0 836.5 696" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font-weight:bold; font-size:12pt; font-family:'Calibri', Helvetica, sans-serif;;stroke-width:3;stroke-linejoin:round;stroke-linecap:round">
+<svg version="1.1" baseProfile="full" width="813.25" height="625" viewbox="0 0 813.25 625" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" style="font:bold normal 12pt Helvetica, Helvetica, sans-serif;;stroke-linejoin:round;stroke-linecap:round">
   <title >nomnoml</title>
-  <desc >[BIOFunctor3]&lt;:--[BIOBifunctor3]
-[BIOBifunctor3]&lt;:--[BIOError3]
-[BIOFunctor3]&lt;:--[BIOApplicative3]
-[BIOApplicative3]&lt;:--[BIOGuarantee3]
-[BIOApplicative3]&lt;:--[BIOMonad3]
-[BIOGuarantee3]&lt;:--[BIOError3]
-[BIOError3]&lt;:--[BIOMonadError3]
-[BIOMonad3]&lt;:--[BIOMonadError3]
-[BIOMonadError3]&lt;:--[BIOBracket3]
-[BIOBracket3]&lt;:--[BIOPanic3]
-[BIOPanic3]&lt;:--[BIO3]
-[BIO3]&lt;:--[BIOAsync3]
-[BIOMonad3]&lt;:--[BIOParallel3]
-[BIOParallel3]&lt;:--[BIOAsync3]
-[BIOAsync3]&lt;:--[BIOTemporal3]
-
-[BIOFunctor3]&lt;:--[BIOProfunctor]
-[BIOProfunctor]&lt;:--[BIOArrow]
-[BIOArrow]&lt;:--[BIOArrowChoice]
-[BIOArrowChoice]&lt;:--[BIOLocal]
-
-[BIOApplicative3]&lt;:--[BIOAsk]
-[BIOMonad3]&lt;:--[BIOMonadAsk]
-[BIOAsk]&lt;:--[BIOMonadAsk]
-[BIOMonadAsk]&lt;:--[BIOLocal]</desc>
-  <path d="M396 34.8 L83.5 64.5 L83.5 100 L83.5 100 L83.5 135.5 L83.5 135.5 L83.5 155.5 L83.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M383.2 41.3 L382.7 36 L382.2 30.7 L396 34.8 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M83.5 186.5 L83.5 206.5 L119.4 226.5 L119.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M88.8 199.8 L83.5 199.8 L78.2 199.8 L83.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M456.5 44.5 L456.5 64.5 L456.5 84.5 L456.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M461.8 57.8 L456.5 57.8 L451.2 57.8 L456.5 44.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M377 114.6 L263.5 135.5 L263.5 155.5 L263.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M364.9 122.3 L363.9 117 L362.9 111.8 L377 114.6 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M456.5 115.5 L456.5 135.5 L456.5 155.5 L456.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M461.8 128.8 L456.5 128.8 L451.2 128.8 L456.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M263.5 186.5 L263.5 206.5 L198 226.5 L198 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M268.8 199.8 L263.5 199.8 L258.2 199.8 L263.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M147.3 257.5 L147.3 277.5 L172.9 297.5 L172.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M152.6 270.8 L147.3 270.8 L141.9 270.8 L147.3 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M419 186.5 L370.5 206.5 L370.5 242 L370.5 242 L370.5 277.5 L370.5 277.5 L269.8 297.6 L269.8 297.6 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M408.7 196.5 L406.6 191.6 L404.6 186.7 L419 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M192.8 328.5 L192.8 348.5 L192.8 368.5 L192.8 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M198.1 341.8 L192.8 341.8 L187.4 341.8 L192.8 328.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M192.8 399.5 L192.8 419.5 L192.8 439.5 L192.8 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M198.1 412.8 L192.8 412.8 L187.4 412.8 L192.8 399.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M192.8 470.5 L192.8 490.5 L192.8 510.5 L192.8 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M198.1 483.8 L192.8 483.8 L187.4 483.8 L192.8 470.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M192.8 541.5 L192.8 561.5 L229.9 581.5 L229.9 581.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M198.1 554.8 L192.8 554.8 L187.4 554.8 L192.8 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M456.5 186.5 L456.5 206.5 L456.5 242 L456.5 242 L456.5 277.5 L456.5 277.5 L456.5 313 L456.5 313 L456.5 348.5 L456.5 348.5 L456.5 384 L456.5 384 L456.5 419.5 L456.5 419.5 L456.5 455 L456.5 455 L456.5 490.5 L456.5 490.5 L456.5 510.5 L456.5 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M461.8 199.8 L456.5 199.8 L451.2 199.8 L456.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M456.5 541.5 L456.5 561.5 L309.8 587.8 L309.8 587.8 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M461.8 554.8 L456.5 554.8 L451.2 554.8 L456.5 541.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M258.8 612.5 L258.8 632.5 L258.8 652.5 L258.8 652.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M264.1 625.8 L258.8 625.8 L253.4 625.8 L258.8 612.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M517 36.3 L749.5 64.5 L749.5 84.5 L749.5 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M530.9 32.6 L530.2 37.9 L529.6 43.2 L517 36.3 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M749.5 115.5 L749.5 135.5 L749.5 155.5 L749.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M754.8 128.8 L749.5 128.8 L744.2 128.8 L749.5 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M749.5 186.5 L749.5 206.5 L749.5 226.5 L749.5 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M754.8 199.8 L749.5 199.8 L744.2 199.8 L749.5 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M749.5 257.5 L749.5 277.5 L710.9 297.5 L710.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M754.8 270.8 L749.5 270.8 L744.2 270.8 L749.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M519 115.5 L599.8 135.5 L599.8 155.5 L599.8 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M533.3 113.5 L532 118.7 L530.7 123.9 L519 115.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M487.6 186.5 L527.8 206.5 L553 226.5 L553 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M501.9 187.7 L499.5 192.4 L497.2 197.2 L487.6 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M599.8 186.5 L599.8 206.5 L584.4 226.5 L584.4 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M605.1 199.8 L599.8 199.8 L594.4 199.8 L599.8 186.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <path d="M572.5 257.5 L572.5 277.5 L635 297.9 L635 297.9 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;"></path>
-  <path d="M577.8 270.8 L572.5 270.8 L567.2 270.8 L572.5 257.5 Z" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></path>
-  <rect x="396.5" y="13.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="457" y="35" style="fill: #33322E;text-anchor: middle;">BIOFunctor3</text>
-  <rect x="13.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="83.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOBifunctor3</text>
-  <rect x="96.5" y="226.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="147.5" y="248" style="fill: #33322E;text-anchor: middle;">BIOError3</text>
-  <rect x="377.5" y="84.5" height="31" width="159" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="457" y="106" style="fill: #33322E;text-anchor: middle;">BIOApplicative3</text>
-  <rect x="193.5" y="155.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="263.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOGuarantee3</text>
-  <rect x="403.5" y="155.5" height="31" width="106" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="456.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOMonad3</text>
-  <rect x="115.5" y="297.5" height="31" width="154" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="192.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOMonadError3</text>
-  <rect x="132.5" y="368.5" height="31" width="121" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="193" y="390" style="fill: #33322E;text-anchor: middle;">BIOBracket3</text>
-  <rect x="141.5" y="439.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="192.5" y="461" style="fill: #33322E;text-anchor: middle;">BIOPanic3</text>
-  <rect x="165.5" y="510.5" height="31" width="54" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="192.5" y="532" style="fill: #33322E;text-anchor: middle;">BIO3</text>
-  <rect x="207.5" y="581.5" height="31" width="102" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="258.5" y="603" style="fill: #33322E;text-anchor: middle;">BIOAsync3</text>
-  <rect x="391.5" y="510.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="456.5" y="532" style="fill: #33322E;text-anchor: middle;">BIOParallel3</text>
-  <rect x="193.5" y="652.5" height="31" width="130" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="258.5" y="674" style="fill: #33322E;text-anchor: middle;">BIOTemporal3</text>
-  <rect x="679.5" y="84.5" height="31" width="140" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="749.5" y="106" style="fill: #33322E;text-anchor: middle;">BIOProfunctor</text>
-  <rect x="703.5" y="155.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="749.5" y="177" style="fill: #33322E;text-anchor: middle;">BIOArrow</text>
-  <rect x="675.5" y="226.5" height="31" width="149" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="750" y="248" style="fill: #33322E;text-anchor: middle;">BIOArrowChoice</text>
-  <rect x="635.5" y="297.5" height="31" width="92" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="681.5" y="319" style="fill: #33322E;text-anchor: middle;">BIOLocal</text>
-  <rect x="563.5" y="155.5" height="31" width="73" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="600" y="177" style="fill: #33322E;text-anchor: middle;">BIOAsk</text>
-  <rect x="510.5" y="226.5" height="31" width="125" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;"></rect>
-  <text x="573" y="248" style="fill: #33322E;text-anchor: middle;">BIOMonadAsk</text>
+  <desc >[BIOFunctor3]&lt;--[BIOBifunctor3]
+[BIOBifunctor3]&lt;--[BIOApplicativeError3]
+[BIOFunctor3]&lt;--[BIOApplicative3]
+[BIOApplicative3]&lt;--[BIOGuarantee3]
+[BIOApplicative3]&lt;--[BIOMonad3]
+[BIOGuarantee3]&lt;--[BIOApplicativeError3]
+[BIOApplicativeError3]&lt;--[BIOError3]
+[BIOMonad3]&lt;--[BIOError3]
+[BIOError3]&lt;--[BIOBracket3]
+[BIOBracket3]&lt;--[BIOPanic3]
+[BIOPanic3]&lt;--[BIO3]
+[BIO3]&lt;--[BIOAsync3]
+[BIOMonad3]&lt;--[BIOParallel3]
+[BIOParallel3]&lt;--[BIOConcurrent3]
+[BIOConcurrent3]&lt;--[BIOAsync3]
+[BIOError3]&lt;--[BIOTemporal3]
+[BIOFunctor3]&lt;--[BIOProfunctor]
+[BIOProfunctor]&lt;--[BIOArrow]
+[BIOArrow]&lt;--[BIOArrowChoice]
+[BIOArrowChoice]&lt;--[BIOLocal]
+[BIOApplicative3]&lt;--[BIOAsk]
+[BIOMonad3]&lt;--[BIOMonadAsk]
+[BIOAsk]&lt;--[BIOMonadAsk]
+[BIOMonadAsk]&lt;--[BIOLocal]</desc>
+  <rect x="0" y="0" height="625" width="813.25" style="stroke:none; fill:transparent;"></rect>
+  <path d="M381.8 34.5 L75.5 64.5 L75.5 100 L75.5 100 L75.5 135.5 L75.5 135.5 L75.5 155.5 L75.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M369 41.1 L375.1 35.2 L368 30.5 L381.8 34.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M75.5 186.5 L75.5 206.5 L111.6 226.5 L111.6 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M80.8 199.8 L75.5 193.2 L70.2 199.8 L75.5 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M438.3 44.5 L438.3 64.5 L438.3 84.5 L438.3 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M443.6 57.8 L438.3 51.2 L432.9 57.8 L438.3 44.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M368.8 112.7 L243.5 135.5 L243.5 155.5 L243.5 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M356.6 120.3 L362.2 113.9 L354.7 109.8 L368.8 112.7 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M438.3 115.5 L438.3 135.5 L438.3 155.5 L438.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M443.6 128.8 L438.3 122.2 L432.9 128.8 L438.3 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M243.5 186.5 L243.5 206.5 L184.9 226.5 L184.9 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M248.8 199.8 L243.5 193.2 L238.2 199.8 L243.5 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M139.5 257.5 L139.5 277.5 L175.8 297.5 L175.8 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M144.8 270.8 L139.5 264.2 L134.2 270.8 L139.5 257.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M407.3 186.5 L367.3 206.5 L367.3 242 L367.3 242 L367.3 277.5 L367.3 277.5 L250 303 L250 303 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M397.7 197.2 L401.3 189.5 L392.9 187.7 L407.3 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M169.6 328.5 L125.3 348.5 L125.3 368.5 L125.3 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M159.7 338.8 L163.5 331.2 L155.3 329.1 L169.6 328.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M125.3 399.5 L125.3 419.5 L125.3 439.5 L125.3 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M130.6 412.8 L125.3 406.2 L119.9 412.8 L125.3 399.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M125.3 470.5 L125.3 490.5 L125.3 510.5 L125.3 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M130.6 483.8 L125.3 477.2 L119.9 483.8 L125.3 470.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M125.3 541.5 L125.3 561.5 L204.5 583.2 L204.5 583.2 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M130.6 554.8 L125.3 548.2 L119.9 554.8 L125.3 541.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M438.3 186.5 L438.3 206.5 L438.3 242 L438.3 242 L438.3 277.5 L438.3 277.5 L438.3 313 L438.3 313 L438.3 348.5 L438.3 348.5 L438.3 384 L438.3 384 L438.3 419.5 L438.3 419.5 L438.3 439.5 L438.3 439.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M443.6 199.8 L438.3 193.2 L432.9 199.8 L438.3 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M438.3 470.5 L438.3 490.5 L438.3 510.5 L438.3 510.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M443.6 483.8 L438.3 477.2 L432.9 483.8 L438.3 470.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M438.3 541.5 L438.3 561.5 L305.5 587.2 L305.5 587.2 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M443.6 554.8 L438.3 548.2 L432.9 554.8 L438.3 541.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M250 325.3 L336.3 348.5 L336.3 368.5 L336.3 368.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M264.3 323.7 L256.4 327.1 L261.5 334 L250 325.3 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M494.8 35.9 L728.8 64.5 L728.8 84.5 L728.8 84.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M508.6 32.2 L501.4 36.7 L507.3 42.8 L494.8 35.9 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M728.8 115.5 L728.8 135.5 L728.8 155.5 L728.8 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M734.1 128.8 L728.8 122.2 L723.4 128.8 L728.8 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M728.8 186.5 L728.8 206.5 L728.8 226.5 L728.8 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M734.1 199.8 L728.8 193.2 L723.4 199.8 L728.8 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M728.8 257.5 L728.8 277.5 L690.9 297.5 L690.9 297.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M734.1 270.8 L728.8 264.2 L723.4 270.8 L728.8 257.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M500.3 115.5 L580.3 135.5 L580.3 155.5 L580.3 155.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M514.5 113.6 L506.7 117.1 L511.9 123.9 L500.3 115.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M469.4 186.5 L509.5 206.5 L534.7 226.5 L534.7 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M483.7 187.7 L475.3 189.5 L478.9 197.2 L469.4 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M580.3 186.5 L580.3 206.5 L565.6 226.5 L565.6 226.5 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M585.6 199.8 L580.3 193.2 L574.9 199.8 L580.3 186.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <path d="M554.3 257.5 L554.3 277.5 L618.5 298.8 L618.5 298.8 " style="stroke:#33322E;fill:none;stroke-dasharray:6 6;stroke-width:3;"></path>
+  <path d="M559.6 270.8 L554.3 264.2 L548.9 270.8 L554.3 257.5 Z" style="stroke:#33322E;fill:#33322E;stroke-dasharray:none;stroke-width:3;"></path>
+  <rect x="381.5" y="13.5" height="31" width="113" data-name="BIOFunctor3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="438" y="35" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOFunctor3">BIOFunctor3</text>
+  <rect x="13.5" y="155.5" height="31" width="124" data-name="BIOBifunctor3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="75.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOBifunctor3">BIOBifunctor3</text>
+  <rect x="50.5" y="226.5" height="31" width="178" data-name="BIOApplicativeError3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="139.5" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOApplicativeError3">BIOApplicativeError3</text>
+  <rect x="368.5" y="84.5" height="31" width="139" data-name="BIOApplicative3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="438" y="106" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOApplicative3">BIOApplicative3</text>
+  <rect x="177.5" y="155.5" height="31" width="132" data-name="BIOGuarantee3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="243.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOGuarantee3">BIOGuarantee3</text>
+  <rect x="385.5" y="155.5" height="31" width="105" data-name="BIOMonad3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="438" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOMonad3">BIOMonad3</text>
+  <rect x="158.5" y="297.5" height="31" width="92" data-name="BIOError3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="204.5" y="319" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOError3">BIOError3</text>
+  <rect x="69.5" y="368.5" height="31" width="112" data-name="BIOBracket3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="125.5" y="390" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOBracket3">BIOBracket3</text>
+  <rect x="77.5" y="439.5" height="31" width="96" data-name="BIOPanic3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="125.5" y="461" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOPanic3">BIOPanic3</text>
+  <rect x="98.5" y="510.5" height="31" width="53" data-name="BIO3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="125" y="532" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIO3">BIO3</text>
+  <rect x="204.5" y="581.5" height="31" width="101" data-name="BIOAsync3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="255" y="603" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOAsync3">BIOAsync3</text>
+  <rect x="383.5" y="439.5" height="31" width="110" data-name="BIOParallel3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="438.5" y="461" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOParallel3">BIOParallel3</text>
+  <rect x="368.5" y="510.5" height="31" width="140" data-name="BIOConcurrent3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="438.5" y="532" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOConcurrent3">BIOConcurrent3</text>
+  <rect x="274.5" y="368.5" height="31" width="124" data-name="BIOTemporal3" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="336.5" y="390" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOTemporal3">BIOTemporal3</text>
+  <rect x="665.5" y="84.5" height="31" width="126" data-name="BIOProfunctor" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="728.5" y="106" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOProfunctor">BIOProfunctor</text>
+  <rect x="683.5" y="155.5" height="31" width="91" data-name="BIOArrow" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="729" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOArrow">BIOArrow</text>
+  <rect x="656.5" y="226.5" height="31" width="144" data-name="BIOArrowChoice" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="728.5" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOArrowChoice">BIOArrowChoice</text>
+  <rect x="618.5" y="297.5" height="31" width="86" data-name="BIOLocal" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="661.5" y="319" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOLocal">BIOLocal</text>
+  <rect x="543.5" y="155.5" height="31" width="74" data-name="BIOAsk" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="580.5" y="177" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOAsk">BIOAsk</text>
+  <rect x="491.5" y="226.5" height="31" width="125" data-name="BIOMonadAsk" style="stroke:#33322E;fill:#eee8d5;stroke-dasharray:none;stroke-width:3;"></rect>
+  <text x="554" y="248" style="fill: #33322E;font:bold  12pt Helvetica, Helvetica, sans-serif;text-anchor: middle;" data-name="BIOMonadAsk">BIOMonadAsk</text>
 </svg>
\ No newline at end of file
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIO3.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIO3.scala
index 3ba6621d1..8b4571040 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIO3.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIO3.scala
@@ -8,11 +8,10 @@ trait BIO3[F[-_, +_, +_]] extends BIOPanic3[F] {
 
   def syncThrowable[A](effect: => A): F[Any, Throwable, A]
   def sync[A](effect: => A): F[Any, Nothing, A]
+  def suspend[R, A](effect: => F[R, Throwable, A]): F[R, Throwable, A] = flatten(syncThrowable(effect))
 
   @inline final def apply[A](effect: => A): F[Any, Throwable, A] = syncThrowable(effect)
 
-  def suspend[R, A](effect: => F[R, Throwable, A]): F[R, Throwable, A] = flatten(syncThrowable(effect))
-
   // defaults
   override def fromEither[E, A](effect: => Either[E, A]): F[Any, E, A] = flatMap(sync(effect)) {
     case Left(e) => fail(e): F[Any, E, A]
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOAsync3.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOAsync3.scala
index 657c33877..aff1fc006 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOAsync3.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOAsync3.scala
@@ -4,8 +4,9 @@ import java.util.concurrent.CompletionStage
 
 import scala.concurrent.{ExecutionContext, Future}
 
-trait BIOAsync3[F[-_, +_, +_]] extends BIO3[F] with BIOParallel3[F] {
-  override def InnerF: BIOMonad3[F] = this
+trait BIOAsync3[F[-_, +_, +_]] extends BIOConcurrent3[F] with BIO3[F] {
+  override def InnerF: BIOPanic3[F] = this
+
   final type Canceler = F[Any, Nothing, Unit]
 
   def async[E, A](register: (Either[E, A] => Unit) => Unit): F[Any, E, A]
@@ -15,18 +16,8 @@ trait BIOAsync3[F[-_, +_, +_]] extends BIO3[F] with BIOParallel3[F] {
   def fromFuture[A](mkFuture: ExecutionContext => Future[A]): F[Any, Throwable, A]
   def fromFutureJava[A](javaFuture: => CompletionStage[A]): F[Any, Throwable, A]
 
-  def yieldNow: F[Any, Nothing, Unit]
-
-  /** Race two actions, the winner is the first action to TERMINATE, whether by success or failure */
-  def race[R, E, A](r1: F[R, E, A], r2: F[R, E, A]): F[R, E, A]
-
-  /** Race two actions, the winner is the first action to TERMINATE, whether by success or failure */
-  def racePair[R, E, A, B](fa: F[R, E, A], fb: F[R, E, B]): F[R, E, Either[(A, BIOFiber3[F, E, B]), (BIOFiber3[F, E, A], B)]]
-
-  def uninterruptible[R, E, A](r: F[R, E, A]): F[R, E, A]
-
   // defaults
-  def never: F[Any, Nothing, Nothing] = async(_ => ())
+  override def never: F[Any, Nothing, Nothing] = async(_ => ())
 
   @inline final def fromFuture[A](mkFuture: => Future[A]): F[Any, Throwable, A] = fromFuture(_ => mkFuture)
 }
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOConcurrent3.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOConcurrent3.scala
new file mode 100644
index 000000000..1b1c4bf46
--- /dev/null
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOConcurrent3.scala
@@ -0,0 +1,17 @@
+package izumi.functional.bio
+
+trait BIOConcurrent3[F[-_, +_, +_]] extends BIOParallel3[F] {
+  override def InnerF: BIOPanic3[F]
+
+  /** Race two actions, the winner is the first action to TERMINATE, whether by success or failure */
+  def race[R, E, A](r1: F[R, E, A], r2: F[R, E, A]): F[R, E, A]
+
+  /** Race two actions, the winner is the first action to TERMINATE, whether by success or failure */
+  def racePair[R, E, A, B](fa: F[R, E, A], fb: F[R, E, B]): F[R, E, Either[(A, BIOFiber3[F, E, B]), (BIOFiber3[F, E, A], B)]]
+
+  def uninterruptible[R, E, A](r: F[R, E, A]): F[R, E, A]
+
+  def yieldNow: F[Any, Nothing, Unit]
+
+  def never: F[Any, Nothing, Nothing]
+}
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOExit.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOExit.scala
index a420c2ba2..7e07a2732 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOExit.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOExit.scala
@@ -121,7 +121,7 @@ object BIOExit {
   }
 
   object MonixExit {
-    @inline def toIzBIO[E, A](exit: Either[Option[bio.Cause[E]], A]): BIOExit[E, A] = {
+    @inline def toBIOExit[E, A](exit: Either[Option[bio.Cause[E]], A]): BIOExit[E, A] = {
       exit match {
         case Left(None) => Termination(new Throwable("The task was cancelled."), Trace.empty)
         case Left(Some(error)) => fromMonixCause(error)
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
index ce242c7c2..599d8cc18 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIORoot.scala
@@ -17,7 +17,7 @@ trait BIORootBifunctor[F[-_, +_, +_]] extends BIORoot
 trait BIORootTrifunctor[F[-_, +_, +_]] extends BIORoot
 
 object BIORoot extends BIORootInstancesLowPriority1 {
-  @inline implicit final def BIOConvertFromBIOTemporal[FR[-_, +_, +_]](implicit BIOTemporal: NotPredefined.Of[BIOTemporal3[FR]]): BIOError3[FR] with S1 =
+  @inline implicit final def BIOConvertFromBIOConcurrent[FR[-_, +_, +_]](implicit BIOTemporal: NotPredefined.Of[BIOConcurrent3[FR]]): BIOPanic3[FR] with S1 =
     S1(BIOTemporal.InnerF)
 
   @inline implicit final def AttachBIOLocal[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOLocal: BIOLocal[FR]): BIOLocal.type = BIOLocal
@@ -33,49 +33,59 @@ object BIORoot extends BIORootInstancesLowPriority1 {
 }
 
 sealed trait BIORootInstancesLowPriority1 extends BIORootInstancesLowPriority2 {
-  @inline implicit final def BIOConvertFromBIOMonadAsk[FR[-_, +_, +_]](implicit BIOMonadAsk: NotPredefined.Of[BIOMonadAsk[FR]]): BIOMonad3[FR] with S2 =
-    S2(BIOMonadAsk.InnerF)
+  @inline implicit final def BIOConvertFromBIOTemporal[FR[-_, +_, +_]](implicit BIOTemporal: NotPredefined.Of[BIOTemporal3[FR]]): BIOError3[FR] with S2 =
+    S2(BIOTemporal.InnerF)
 
   @inline implicit final def AttachBIOArrowChoice[FR[-_, +_, +_]](@unused self: BIOFunctor3[FR])(implicit BIOArrowChoice: BIOArrowChoice[FR]): BIOArrowChoice.type =
     BIOArrowChoice
-  @inline implicit final def AttachBIOArrow[FR[-_, +_, +_]](@unused self: BIOFunctor3[FR])(implicit BIOArrow: BIOArrow[FR]): BIOArrow.type = BIOArrow
   @inline implicit final def AttachBIOMonadAsk[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOMonadAsk: BIOMonadAsk[FR]): BIOMonadAsk.type = BIOMonadAsk
+  @inline implicit final def AttachBIOConcurrent[FR[-_, +_, +_], R](@unused self: BIOConcurrent3[FR])(implicit BIOConcurrent: BIOConcurrent3[FR]): BIOConcurrent.type =
+    BIOConcurrent
 }
 
 sealed trait BIORootInstancesLowPriority2 extends BIORootInstancesLowPriority3 {
   @inline implicit final def BIOConvertFromBIOParallel[FR[-_, +_, +_]](implicit BIOParallel: NotPredefined.Of[BIOParallel3[FR]]): BIOMonad3[FR] with S3 =
     S3(BIOParallel.InnerF)
 
-  @inline implicit final def AttachBIOProfunctor[FR[-_, +_, +_]](@unused self: BIOFunctor3[FR])(implicit BIOProfunctor: BIOProfunctor[FR]): BIOProfunctor.type =
-    BIOProfunctor
-  @inline implicit final def AttachBIOAsk[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOAsk: BIOAsk[FR]): BIOAsk.type = BIOAsk
+  @inline implicit final def AttachBIOArrow[FR[-_, +_, +_]](@unused self: BIOFunctor3[FR])(implicit BIOArrow: BIOArrow[FR]): BIOArrow.type = BIOArrow
   @inline implicit final def AttachBIOBifunctor[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOBifunctor: BIOBifunctor3[FR]): BIOBifunctor.type =
     BIOBifunctor
-  @inline implicit final def AttachBIOParallel[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOParallel: BIOParallel3[FR]): BIOParallel.type = BIOParallel
+  @inline implicit final def AttachBIOConcurrent[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOConcurrent: BIOConcurrent3[FR]): BIOConcurrent.type =
+    BIOConcurrent
 }
 
 sealed trait BIORootInstancesLowPriority3 extends BIORootInstancesLowPriority4 {
-  @inline implicit final def BIOConvertFromBIOAsk[FR[-_, +_, +_]](implicit BIOAsk: NotPredefined.Of[BIOAsk[FR]]): BIOApplicative3[FR] with S4 = S4(BIOAsk.InnerF)
+  @inline implicit final def BIOConvertFromBIOMonadAsk[FR[-_, +_, +_]](implicit BIOMonadAsk: NotPredefined.Of[BIOMonadAsk[FR]]): BIOMonad3[FR] with S4 =
+    S4(BIOMonadAsk.InnerF)
 
-  @inline implicit final def AttachBIOTemporal[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOTemporal: BIOTemporal3[FR]): BIOTemporal.type = BIOTemporal
+  @inline implicit final def AttachBIOAsk[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOAsk: BIOAsk[FR]): BIOAsk.type = BIOAsk
+  @inline implicit final def AttachBIOProfunctor[FR[-_, +_, +_]](@unused self: BIOFunctor3[FR])(implicit BIOProfunctor: BIOProfunctor[FR]): BIOProfunctor.type =
+    BIOProfunctor
+  @inline implicit final def AttachBIOParallel[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOParallel: BIOParallel3[FR]): BIOParallel.type = BIOParallel
 }
 
 sealed trait BIORootInstancesLowPriority4 extends BIORootInstancesLowPriority5 {
-  @inline implicit final def BIOConvertFromBIOProfunctor[FR[-_, +_, +_]](implicit BIOProfunctor: NotPredefined.Of[BIOProfunctor[FR]]): BIOFunctor3[FR] with S5 =
-    S5(BIOProfunctor.InnerF)
+  @inline implicit final def BIOConvertFromBIOAsk[FR[-_, +_, +_]](implicit BIOAsk: NotPredefined.Of[BIOAsk[FR]]): BIOApplicative3[FR] with S5 = S5(BIOAsk.InnerF)
+
+  @inline implicit final def AttachBIOTemporal[FR[-_, +_, +_], R](@unused self: BIOFunctor3[FR])(implicit BIOTemporal: BIOTemporal3[FR]): BIOTemporal.type = BIOTemporal
 }
 
 sealed trait BIORootInstancesLowPriority5 extends BIORootInstancesLowPriority6 {
-  @inline implicit final def BIOConvertFromBIOBifunctor[FR[-_, +_, +_]](implicit BIOBifunctor: NotPredefined.Of[BIOBifunctor3[FR]]): BIOFunctor3[FR] with S6 =
-    S6(BIOBifunctor.InnerF)
+  @inline implicit final def BIOConvertFromBIOProfunctor[FR[-_, +_, +_]](implicit BIOProfunctor: NotPredefined.Of[BIOProfunctor[FR]]): BIOFunctor3[FR] with S6 =
+    S6(BIOProfunctor.InnerF)
 }
 
 sealed trait BIORootInstancesLowPriority6 extends BIORootInstancesLowPriority7 {
+  @inline implicit final def BIOConvertFromBIOBifunctor[FR[-_, +_, +_]](implicit BIOBifunctor: NotPredefined.Of[BIOBifunctor3[FR]]): BIOFunctor3[FR] with S7 =
+    S7(BIOBifunctor.InnerF)
+}
+
+sealed trait BIORootInstancesLowPriority7 extends BIORootInstancesLowPriority8 {
   @inline implicit final def BIOLocalZIO: Predefined.Of[BIOLocal[ZIO]] = Predefined(BIOAsyncZio)
   @inline implicit final def BIOZIO: Predefined.Of[BIOAsync3[ZIO]] = Predefined(BIOAsyncZio)
 }
 
-sealed trait BIORootInstancesLowPriority7 extends BIORootInstancesLowPriority8 {
+sealed trait BIORootInstancesLowPriority8 extends BIORootInstancesLowPriority9 {
   /**
     * This instance uses 'no more orphans' trick to provide an Optional instance
     * only IFF you have monix-bio as a dependency without REQUIRING a monix-bio dependency.
@@ -91,7 +101,7 @@ sealed trait BIORootInstancesLowPriority7 extends BIORootInstancesLowPriority8 {
   }
 }
 
-sealed trait BIORootInstancesLowPriority8 {
+sealed trait BIORootInstancesLowPriority9 {
   @inline implicit final def BIOConvert3To2[C[f[-_, +_, +_]] <: DivergenceHelper with BIORootBifunctor[f], FR[-_, +_, +_], R0](
     implicit BIOFunctor3: C[FR] { type Divergence = Nondivergent }
   ): C[Lambda[(`-R`, `+E`, `+A`) => FR[R0, E, A]]] with DivergenceHelper { type Divergence = Divergent } =
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOTemporal3.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOTemporal3.scala
index 233e0f522..e9b0ae6cf 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOTemporal3.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/BIOTemporal3.scala
@@ -12,6 +12,7 @@ trait BIOTemporal3[F[-_, +_, +_]] extends BIORootBifunctor[F] with BIOTemporalIn
 
   def sleep(duration: Duration): F[Any, Nothing, Unit]
   def timeout[R, E, A](duration: Duration)(r: F[R, E, A]): F[R, E, Option[A]]
+
   def retryOrElse[R, E, A, E2](r: F[R, E, A])(duration: FiniteDuration, orElse: => F[R, E2, A]): F[R, E2, A]
 
   @inline final def timeoutFail[R, E, A](duration: Duration)(e: E, r: F[R, E, A]): F[R, E, A] = {
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncMonix.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncMonix.scala
index 66f38a6ac..5fb8546b9 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncMonix.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/impl/BIOAsyncMonix.scala
@@ -18,14 +18,14 @@ class BIOAsyncMonix extends BIOAsync[IO] {
   override final def pure[A](a: A): IO[Nothing, A] = IO.pure(a)
   override final def sync[A](effect: => A): IO[Nothing, A] = IO.evalTotal(effect)
   override final def syncThrowable[A](effect: => A): IO[Throwable, A] = IO.eval(effect)
-  override final def suspend[R, A](effect: => IO[Throwable, A]): IO[Throwable, A] = IO.suspendTotal(effect)
+  override final def suspend[R, A](effect: => IO[Throwable, A]): IO[Throwable, A] = IO.suspend(effect)
 
   override final def fail[E](v: => E): IO[E, Nothing] = IO.raiseError(v)
   override final def terminate(v: => Throwable): IO[Nothing, Nothing] = IO.terminate(v)
 
-  override final def fromEither[E, V](effect: => Either[E, V]): IO[E, V] = IO.fromEither(effect)
-  override final def fromOption[E, A](errorOnNone: => E)(effect: => Option[A]): IO[E, A] = IO.fromEither(effect.toRight(errorOnNone))
-  override final def fromTry[A](effect: => Try[A]): IO[Throwable, A] = IO.fromTry(effect)
+  override final def fromEither[E, V](effect: => Either[E, V]): IO[E, V] = IO.suspendTotal(IO.fromEither(effect))
+  override final def fromOption[E, A](errorOnNone: => E)(effect: => Option[A]): IO[E, A] = IO.suspendTotal(IO.fromEither(effect.toRight(errorOnNone)))
+  override final def fromTry[A](effect: => Try[A]): IO[Throwable, A] = IO.suspendTotal(IO.fromTry(effect))
 
   override final def void[R, E, A](r: IO[E, A]): IO[E, Unit] = r.void
   override final def map[R, E, A, B](r: IO[E, A])(f: A => B): IO[E, B] = r.map(f)
@@ -46,7 +46,7 @@ class BIOAsyncMonix extends BIOAsync[IO] {
   override final def flatten[R, E, A](r: IO[E, IO[E, A]]): IO[E, A] = r.flatten
   override final def *>[R, E, A, B](r: IO[E, A], next: => IO[E, B]): IO[E, B] = r.flatMap(_ => next)
   override final def <*[R, E, A, B](r: IO[E, A], next: => IO[E, B]): IO[E, A] = r.flatMap(a => next.map(_ => a))
-  override final def map2[R, E, A, B, C](r1: IO[E, A], r2: => IO[E, B])(f: (A, B) => C): IO[E, C] = r1.flatMap(a => r2.map(f(a, _)))
+  override final def map2[R, E, A, B, C](r1: IO[E, A], r2: => IO[E, B])(f: (A, B) => C): IO[E, C] = IO.map2(r1, r2)(f)
 
   override final def leftMap2[R, E, A, E2, E3](firstOp: IO[E, A], secondOp: => IO[E2, A])(f: (E, E2) => E3): IO[E3, A] =
     firstOp.onErrorHandleWith(e => secondOp.mapError(f(e, _)))
@@ -60,27 +60,33 @@ class BIOAsyncMonix extends BIOAsync[IO] {
   override final def attempt[R, E, A](r: IO[E, A]): IO[Nothing, Either[E, A]] = r.attempt
   override final def redeemPure[R, E, A, B](r: IO[E, A])(err: E => B, succ: A => B): IO[Nothing, B] = r.redeem(err, succ)
 
-  override final def bracket[R, E, A, B](acquire: IO[E, A])(release: A => IO[Nothing, Unit])(use: A => IO[E, B]): IO[E, B] = acquire.bracket(use)(release)
+  override final def bracket[R, E, A, B](acquire: IO[E, A])(release: A => IO[Nothing, Unit])(use: A => IO[E, B]): IO[E, B] = {
+    acquire.bracket(use = use)(release = release)
+  }
   override final def bracketCase[R, E, A, B](acquire: IO[E, A])(release: (A, BIOExit[E, B]) => IO[Nothing, Unit])(use: A => IO[E, B]): IO[E, B] = {
-    acquire.bracketE(use)((a, exit) => release(a, toIzBIO(exit)))
+    acquire.bracketE(use = use)(release = (a, exit) => release(a, toBIOExit(exit)))
+  }
+  override final def guaranteeCase[R, E, A](f: IO[E, A], cleanup: BIOExit[E, A] => IO[Nothing, Unit]): IO[E, A] = {
+    IO.unit.bracketE(use = _ => f)(release = (_, exit) => cleanup(toBIOExit(exit)))
   }
-  override final def guaranteeCase[R, E, A](f: IO[E, A], cleanup: BIOExit[E, A] => IO[Nothing, Unit]): IO[E, A] = f.bracketE(IO.pure)((_, exit) => cleanup(toIzBIO(exit)))
 
-  override final def traverse[R, E, A, B](l: Iterable[A])(f: A => IO[E, B]): IO[E, List[B]] = IO.traverse(l)(f).map(_.toList)
+  override final def traverse[R, E, A, B](l: Iterable[A])(f: A => IO[E, B]): IO[E, List[B]] = IO.traverse(l)(f)
   override final def sequence[R, E, A, B](l: Iterable[IO[E, A]]): IO[E, List[A]] = IO.sequence(l)
   override final def traverse_[R, E, A](l: Iterable[A])(f: A => IO[E, Unit]): IO[E, Unit] = IO.traverse(l)(f).void
   override final def sequence_[R, E](l: Iterable[IO[E, Unit]]): IO[E, Unit] = IO.sequence(l).void
 
-  override final def sandbox[R, E, A](r: IO[E, A]): IO[BIOExit.Failure[E], A] = r.redeemCauseWith(cause => IO.raiseError(fromMonixCause(cause)), a => IO.pure(a))
-  override final def yieldNow: IO[Nothing, Unit] = IO.unit
+  override final def sandbox[R, E, A](r: IO[E, A]): IO[BIOExit.Failure[E], A] = {
+    r.redeemCauseWith(cause => IO.raiseError(fromMonixCause(cause)), a => IO.pure(a))
+  }
+  override final def yieldNow: IO[Nothing, Unit] = IO.shift
   override final def never: IO[Nothing, Nothing] = IO.never
 
-  override final def race[R, E, A](r1: IO[E, A], r2: IO[E, A]): IO[E, A] = IO.raceMany(List(r1, r2))
+  override final def race[R, E, A](r1: IO[E, A], r2: IO[E, A]): IO[E, A] = IO.race(r1, r2).map(_.merge)
 
   override final def racePair[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, Either[(A, BIOFiber[IO, E, B]), (BIOFiber[IO, E, A], B)]] = {
-    IO.racePair(fa, fb).flatMap {
-      case Left((a, fiberB)) => fiberB.cancel.void.map(_ => Left((a, BIOFiber.fromMonix(fiberB))))
-      case Right((fiberA, b)) => fiberA.cancel.void.map(_ => Right((BIOFiber.fromMonix(fiberA), b)))
+    IO.racePair(fa, fb).map {
+      case Left((a, fiberB)) => Left((a, BIOFiber.fromMonix(fiberB)))
+      case Right((fiberA, b)) => Right((BIOFiber.fromMonix(fiberA), b))
     }
   }
 
@@ -127,6 +133,6 @@ class BIOAsyncMonix extends BIOAsync[IO] {
 
   override final def zipWithPar[R, E, A, B, C](fa: IO[E, A], fb: IO[E, B])(f: (A, B) => C): IO[E, C] = IO.mapBoth(fa, fb)(f)
   override final def zipPar[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, (A, B)] = IO.parZip2(fa, fb)
-  override final def zipParLeft[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, A] = IO.parZip2(fa, fb).map { case (a, _) => a }
-  override final def zipParRight[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, B] = IO.parZip2(fa, fb).map { case (_, b) => b }
+  override final def zipParLeft[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, A] = IO.parMap2(fa, fb)((a, _) => a)
+  override final def zipParRight[R, E, A, B](fa: IO[E, A], fb: IO[E, B]): IO[E, B] = IO.parMap2(fa, fb)((_, b) => b)
 }
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
index e90f92b1d..da33042a2 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/package.scala
@@ -19,8 +19,11 @@ import izumi.functional.mono.{Clock, Entropy, SyncSafe}
   *  [BIOBracket3]<--[BIOPanic3]
   *  [BIOPanic3]<--[BIO3]
   *  [BIO3]<--[BIOAsync3]
+  *
   *  [BIOMonad3]<--[BIOParallel3]
-  *  [BIOParallel3]<--[BIOAsync3]
+  *  [BIOParallel3]<--[BIOConcurrent3]
+  *  [BIOConcurrent3]<--[BIOAsync3]
+  *
   *  [BIOError3]<--[BIOTemporal3]
   *
   *  [BIOFunctor3]<--[BIOProfunctor]
@@ -71,14 +74,16 @@ import izumi.functional.mono.{Clock, Entropy, SyncSafe}
   *  [BIOError3]<--[BIOBracket3]
   *  [BIOBracket3]<--[BIOPanic3]
   *  [BIOPanic3]<--[BIO3]
+  *
+  *  [BIOParallel3]<--[BIOConcurrent3]
+  *  [BIOConcurrent3]<--[BIOAsync3]
   *  [BIO3]<--[BIOAsync3]
-  *  [BIOParallel3]<--[BIOAsync3]
+  *
   *  [BIOTemporal3]
   *
   *  [BIOProfunctor]<--[BIOArrow]
   *  [BIOArrow]<--[BIOArrowChoice]
   *  [BIOArrowChoice]<--[BIOLocal]
-  *
   *  [BIOAsk]<--[BIOMonadAsk]
   *  [BIOMonadAsk]<--[BIOLocal]
   *  }}}
@@ -101,12 +106,13 @@ import izumi.functional.mono.{Clock, Entropy, SyncSafe}
   *  - BIOPrimitives
   */
 /*
-  New root checklist:
+  New BIO typeclass checklist:
 
   [ ] - add syntax in BIOSyntax3 & BIOSyntax at the same name as type
-  [ ] - add conversions for new root's InnerF at the same name in BIOSyntax3 & BIOSyntax
+  [ ] - add syntax for new root's InnerF at the same name in BIOSyntax3 & BIOSyntax
   [ ] - add new attachments in BIORootInstanceLowPriorityN
-  [ ] - add conversion BIOConvertToBIONewRoot in BIORootInstanceLowPriorityN (conversions implicit priority: from most specific InnerF to least specific)
+  [ ] - add conversion BIOConvertToBIONewRoot in BIORootInstanceLowPriorityN
+        (conversions implicit priority: from most specific InnerF to least specific)
  */
 package object bio extends BIO3Syntax with BIOSyntax {
 
@@ -133,6 +139,7 @@ package object bio extends BIO3Syntax with BIOSyntax {
   type BIOPanic[F[+_, +_]] = BIOPanic3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
   type BIO[F[+_, +_]] = BIO3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
   type BIOParallel[F[+_, +_]] = BIOParallel3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
+  type BIOConcurrent[F[+_, +_]] = BIOConcurrent3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
   type BIOAsync[F[+_, +_]] = BIOAsync3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
   type BIOTemporal[F[+_, +_]] = BIOTemporal3[Lambda[(`-R`, `+E`, `+A`) => F[E, A]]]
 
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIO3Syntax.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIO3Syntax.scala
index 4a12f0ed1..7307d3579 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIO3Syntax.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIO3Syntax.scala
@@ -2,7 +2,7 @@ package izumi.functional.bio.syntax
 
 import cats.data.Kleisli
 import izumi.functional.bio.syntax.BIO3Syntax.BIO3ImplicitPuns
-import izumi.functional.bio.{BIO3, BIOApplicative3, BIOApplicativeError3, BIOArrow, BIOArrowChoice, BIOAsk, BIOAsync3, BIOBifunctor3, BIOBracket3, BIOError3, BIOExit, BIOFiber3, BIOFork3, BIOFunctor3, BIOGuarantee3, BIOLocal, BIOMonad3, BIOPanic3, BIOParallel3, BIOProfunctor, BIOTemporal3, BIOWithFilter}
+import izumi.functional.bio.{BIO3, BIOApplicative3, BIOApplicativeError3, BIOArrow, BIOArrowChoice, BIOAsk, BIOAsync3, BIOBifunctor3, BIOBracket3, BIOConcurrent3, BIOError3, BIOExit, BIOFiber3, BIOFork3, BIOFunctor3, BIOGuarantee3, BIOLocal, BIOMonad3, BIOPanic3, BIOParallel3, BIOProfunctor, BIOTemporal3, BIOWithFilter}
 import izumi.fundamentals.platform.language.{SourceFilePositionMaterializer, unused}
 
 import scala.concurrent.duration.{Duration, FiniteDuration}
@@ -169,13 +169,21 @@ object BIO3Syntax {
       F.bracket(r: FR[R1, E1, A])(c => F.sync(c.close()))(use)
   }
 
-  final class BIOParallel3Ops[FR[-_, +_, +_], -R, +E, +A](protected[this] val r: FR[R, E, A])(implicit protected[this] val F: BIOParallel3[FR]) {
+  class BIOParallel3Ops[FR[-_, +_, +_], -R, +E, +A](protected[this] val r: FR[R, E, A])(implicit protected[this] val F: BIOParallel3[FR]) {
     @inline final def zipWithPar[R1 <: R, E1 >: E, B, C](that: FR[R1, E1, B])(f: (A, B) => C): FR[R1, E1, C] = F.zipWithPar(r, that)(f)
     @inline final def zipPar[R1 <: R, E1 >: E, B](that: FR[R1, E1, B]): FR[R1, E1, (A, B)] = F.zipPar(r, that)
     @inline final def zipParLeft[R1 <: R, E1 >: E, B](that: FR[R1, E1, B]): FR[R1, E1, A] = F.zipParLeft(r, that)
     @inline final def zipParRight[R1 <: R, E1 >: E, B](that: FR[R1, E1, B]): FR[R1, E1, B] = F.zipParRight(r, that)
   }
 
+  class BIOConcurrent3Ops[FR[-_, +_, +_], -R, +E, +A](override protected[this] val r: FR[R, E, A])(implicit override protected[this] val F: BIOConcurrent3[FR])
+    extends BIOParallel3Ops(r) {
+    @inline final def race[R1 <: R, E1 >: E, A1 >: A](that: FR[R1, E1, A1]): FR[R1, E1, A1] = F.race(r, that)
+    @inline final def racePair[R1 <: R, E1 >: E, A1 >: A](that: FR[R1, E1, A1]): FR[R1, E1, Either[(A, BIOFiber3[FR, E1, A1]), (BIOFiber3[FR, E1, A], A1)]] =
+      F.racePair(r, that)
+    @inline final def uninterruptible: FR[R, E, A] = F.uninterruptible(r)
+  }
+
   class BIOAsync3Ops[FR[-_, +_, +_], -R, +E, +A](override protected[this] val r: FR[R, E, A])(implicit override protected[this] val F: BIOAsync3[FR]) extends BIO3Ops(r) {
     @inline final def zipWithPar[R1 <: R, E1 >: E, B, C](that: FR[R1, E1, B])(f: (A, B) => C): FR[R1, E1, C] = F.zipWithPar(r, that)(f)
     @inline final def zipPar[R1 <: R, E1 >: E, B](that: FR[R1, E1, B]): FR[R1, E1, (A, B)] = F.zipPar(r, that)
@@ -183,6 +191,9 @@ object BIO3Syntax {
     @inline final def zipParRight[R1 <: R, E1 >: E, B](that: FR[R1, E1, B]): FR[R1, E1, B] = F.zipParRight(r, that)
 
     @inline final def race[R1 <: R, E1 >: E, A1 >: A](that: FR[R1, E1, A1]): FR[R1, E1, A1] = F.race(r, that)
+    @inline final def racePair[R1 <: R, E1 >: E, A1 >: A](that: FR[R1, E1, A1]): FR[R1, E1, Either[(A, BIOFiber3[FR, E1, A1]), (BIOFiber3[FR, E1, A], A1)]] =
+      F.racePair(r, that)
+    @inline final def uninterruptible: FR[R, E, A] = F.uninterruptible(r)
   }
 
   final class BIOTemporal3Ops[FR[-_, +_, +_], -R, +E, +A](protected[this] val r: FR[R, E, A])(implicit protected[this] val F: BIOTemporal3[FR]) {
@@ -242,13 +253,20 @@ object BIO3Syntax {
     @inline final def BIOAsync3[FR[-_, +_, +_]: BIOAsync3]: BIOAsync3[FR] = implicitly
   }
   trait BIO3ImplicitPuns2 extends BIO3ImplicitPuns3 {
+    @inline implicit final def BIOConcurrent3[FR[-_, +_, +_]: BIOConcurrent3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOConcurrent3Ops[FR, R, E, A] =
+      new BIO3Syntax.BIOConcurrent3Ops[FR, R, E, A](self)
+    @inline implicit final def BIOConcurrent3[FR[-_, +_, +_]: BIOPanic3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOPanic3Ops[FR, R, E, A] =
+      new BIO3Syntax.BIOPanic3Ops[FR, R, E, A](self)
+    @inline final def BIOConcurrent3[FR[-_, +_, +_]: BIOConcurrent3]: BIOConcurrent3[FR] = implicitly
+  }
+  trait BIO3ImplicitPuns3 extends BIO3ImplicitPuns4 {
     @inline implicit final def BIOParallel3[FR[-_, +_, +_]: BIOParallel3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOParallel3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOParallel3Ops[FR, R, E, A](self)
     @inline implicit final def BIOParallel3[F[-_, +_, +_]: BIOMonad3, R, E, A](self: F[R, E, A]): BIO3Syntax.BIOMonad3Ops[F, R, E, A] =
       new BIO3Syntax.BIOMonad3Ops[F, R, E, A](self)
     @inline final def BIOParallel3[FR[-_, +_, +_]: BIOParallel3]: BIOParallel3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns3 extends BIO3ImplicitPuns4 {
+  trait BIO3ImplicitPuns4 extends BIO3ImplicitPuns5 {
     @inline implicit final def BIO3[FR[-_, +_, +_]: BIO3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIO3Ops[FR, R, E, A] = new BIO3Syntax.BIO3Ops[FR, R, E, A](self)
     /**
       * Shorthand for [[BIO3#syncThrowable]]
@@ -260,54 +278,54 @@ object BIO3Syntax {
     @inline final def BIO3[FR[-_, +_, +_], A](effect: => A)(implicit F: BIO3[FR]): FR[Any, Throwable, A] = F.syncThrowable(effect)
     @inline final def BIO3[FR[-_, +_, +_]: BIO3]: BIO3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns4 extends BIO3ImplicitPuns5 {
+  trait BIO3ImplicitPuns5 extends BIO3ImplicitPuns6 {
     @inline implicit final def BIOPanic3[FR[-_, +_, +_]: BIOPanic3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOPanic3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOPanic3Ops[FR, R, E, A](self)
     @inline final def BIOPanic3[FR[-_, +_, +_]: BIOPanic3]: BIOPanic3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns5 extends BIO3ImplicitPuns6 {
+  trait BIO3ImplicitPuns6 extends BIO3ImplicitPuns7 {
     @inline implicit final def BIOBracket3[FR[-_, +_, +_]: BIOBracket3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOBracket3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOBracket3Ops[FR, R, E, A](self)
     @inline final def BIOBracket3[FR[-_, +_, +_]: BIOBracket3]: BIOBracket3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns6 extends BIO3ImplicitPuns7 {
+  trait BIO3ImplicitPuns7 extends BIO3ImplicitPuns8 {
     @inline implicit final def BIOError3[FR[-_, +_, +_]: BIOError3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOError3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOError3Ops[FR, R, E, A](self)
     @inline final def BIOError3[FR[-_, +_, +_]: BIOError3]: BIOError3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns7 extends BIO3ImplicitPuns8 {
+  trait BIO3ImplicitPuns8 extends BIO3ImplicitPuns9 {
     @inline implicit final def BIOApplicativeError3[FR[-_, +_, +_]: BIOApplicativeError3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOApplicativeError3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOApplicativeError3Ops[FR, R, E, A](self)
     @inline final def BIOApplicativeError3[FR[-_, +_, +_]: BIOApplicativeError3]: BIOApplicativeError3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns8 extends BIO3ImplicitPuns9 {
+  trait BIO3ImplicitPuns9 extends BIO3ImplicitPuns10 {
     @inline implicit final def BIOGuarantee3[FR[-_, +_, +_]: BIOGuarantee3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOGuarantee3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOGuarantee3Ops[FR, R, E, A](self)
     @inline final def BIOGuarantee3[FR[-_, +_, +_]: BIOGuarantee3]: BIOGuarantee3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns9 extends BIO3ImplicitPuns10 {
+  trait BIO3ImplicitPuns10 extends BIO3ImplicitPuns11 {
     @inline implicit final def BIOMonad3[FR[-_, +_, +_]: BIOMonad3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOMonad3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOMonad3Ops[FR, R, E, A](self)
     @inline final def BIOMonad3[FR[-_, +_, +_]: BIOMonad3]: BIOMonad3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns10 extends BIO3ImplicitPuns11 {
+  trait BIO3ImplicitPuns11 extends BIO3ImplicitPuns12 {
     @inline implicit final def BIOApplicative3[FR[-_, +_, +_]: BIOApplicative3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOApplicative3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOApplicative3Ops[FR, R, E, A](self)
     @inline final def BIOApplicative3[FR[-_, +_, +_]: BIOApplicative3]: BIOApplicative3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns11 extends BIO3ImplicitPuns12 {
+  trait BIO3ImplicitPuns12 extends BIO3ImplicitPuns13 {
     @inline implicit final def BIOBifunctor3[FR[-_, +_, +_]: BIOBifunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOBifunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOBifunctor3Ops[FR, R, E, A](self)
     @inline implicit final def BIOBifunctor3[FR[-_, +_, +_]: BIOFunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOFunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOFunctor3Ops[FR, R, E, A](self)
     @inline final def BIOBifunctor3[FR[-_, +_, +_]: BIOBifunctor3]: BIOBifunctor3[FR] = implicitly
   }
-  trait BIO3ImplicitPuns12 extends BIOImplicitPuns13 {
+  trait BIO3ImplicitPuns13 extends BIOImplicitPuns14 {
     @inline implicit final def BIOFunctor3[FR[-_, +_, +_]: BIOFunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOFunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOFunctor3Ops[FR, R, E, A](self)
     @inline final def BIOFunctor3[FR[-_, +_, +_]: BIOFunctor3]: BIOFunctor3[FR] = implicitly
   }
-  trait BIOImplicitPuns13 extends BIOImplicitPuns14 {
+  trait BIOImplicitPuns14 extends BIOImplicitPuns15 {
     // Note, as long as these auxilary conversions to BIOMonad/Applicative/Functor syntaxes etc.
     // have the same output type as BIOMonad3/etc conversions above, they will avoid the specificity rule
     // and _will not_ clash (because the outputs are equal, not <:<).
@@ -323,38 +341,38 @@ object BIO3Syntax {
     ): BIO3Syntax.BIOLocalOpsKleisliSyntax[FR, R, E, A] = new BIO3Syntax.BIOLocalOpsKleisliSyntax[FR, R, E, A](self)
     @inline final def BIOLocal[FR[-_, +_, +_]: BIOLocal]: BIOLocal[FR] = implicitly
   }
-  trait BIOImplicitPuns14 extends BIOImplicitPuns15 {
+  trait BIOImplicitPuns15 extends BIOImplicitPuns16 {
     @inline implicit final def BIOMonadAsk[FR[-_, +_, +_]: BIOMonad3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOMonad3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOMonad3Ops[FR, R, E, A](self)
     @inline final def BIOMonadAsk[FR[-_, +_, +_]: BIOAsk]: BIOAsk[FR] = implicitly
   }
-  trait BIOImplicitPuns15 extends BIOImplicitPuns16 {
+  trait BIOImplicitPuns16 extends BIOImplicitPuns17 {
     @inline implicit final def BIOAsk[FR[-_, +_, +_]: BIOApplicative3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOApplicative3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOApplicative3Ops[FR, R, E, A](self)
     @inline final def BIOAsk[FR[-_, +_, +_]: BIOAsk]: BIOAsk[FR] = implicitly
   }
-  trait BIOImplicitPuns16 extends BIOImplicitPuns17 {
+  trait BIOImplicitPuns17 extends BIOImplicitPuns18 {
     @inline implicit final def BIOArrowChoice[FR[-_, +_, +_]: BIOArrowChoice, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOArrowChoiceOps[FR, R, E, A] =
       new BIO3Syntax.BIOArrowChoiceOps[FR, R, E, A](self)
     @inline implicit final def BIOArrowChoice[FR[-_, +_, +_]: BIOFunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOFunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOFunctor3Ops[FR, R, E, A](self)
     @inline final def BIOArrowChoice[FR[-_, +_, +_]: BIOArrowChoice]: BIOArrowChoice[FR] = implicitly
   }
-  trait BIOImplicitPuns17 extends BIOImplicitPuns18 {
+  trait BIOImplicitPuns18 extends BIOImplicitPuns19 {
     @inline implicit final def BIOArrow[FR[-_, +_, +_]: BIOArrow, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOArrowOps[FR, R, E, A] =
       new BIO3Syntax.BIOArrowOps[FR, R, E, A](self)
     @inline implicit final def BIOArrow[FR[-_, +_, +_]: BIOFunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOFunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOFunctor3Ops[FR, R, E, A](self)
     @inline final def BIOArrow[FR[-_, +_, +_]: BIOArrow]: BIOArrow[FR] = implicitly
   }
-  trait BIOImplicitPuns18 extends BIOImplicitPuns19 {
+  trait BIOImplicitPuns19 extends BIOImplicitPuns20 {
     @inline implicit final def BIOProfunctor[FR[-_, +_, +_]: BIOProfunctor, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOProfunctorOps[FR, R, E, A] =
       new BIO3Syntax.BIOProfunctorOps[FR, R, E, A](self)
     @inline implicit final def BIOProfunctor[FR[-_, +_, +_]: BIOFunctor3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOFunctor3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOFunctor3Ops[FR, R, E, A](self)
     @inline final def BIOProfunctor[FR[-_, +_, +_]: BIOProfunctor]: BIOProfunctor[FR] = implicitly
   }
-  trait BIOImplicitPuns19 {
+  trait BIOImplicitPuns20 {
     @deprecated("Use BIOError3", "0.11")
     @inline implicit final def BIOMonadError3[FR[-_, +_, +_]: BIOError3, R, E, A](self: FR[R, E, A]): BIO3Syntax.BIOError3Ops[FR, R, E, A] =
       new BIO3Syntax.BIOError3Ops[FR, R, E, A](self)
diff --git a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIOSyntax.scala b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIOSyntax.scala
index e2b9d7797..3169304ae 100644
--- a/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIOSyntax.scala
+++ b/fundamentals/fundamentals-bio/src/main/scala/izumi/functional/bio/syntax/BIOSyntax.scala
@@ -147,13 +147,20 @@ object BIOSyntax {
       F.bracket[Any, E1, A, B](r)(c => F.sync(c.close()))(use)
   }
 
-  final class BIOParallelOps[F[+_, +_], +E, +A](protected[this] val r: F[E, A])(implicit protected[this] val F: BIOParallel[F]) {
+  class BIOParallelOps[F[+_, +_], +E, +A](protected[this] val r: F[E, A])(implicit protected[this] val F: BIOParallel[F]) {
     @inline final def zipWithPar[E1 >: E, B, C](that: F[E1, B])(f: (A, B) => C): F[E1, C] = F.zipWithPar(r, that)(f)
     @inline final def zipPar[E1 >: E, B](that: F[E1, B]): F[E1, (A, B)] = F.zipPar(r, that)
     @inline final def zipParLeft[E1 >: E, B](that: F[E1, B]): F[E1, A] = F.zipParLeft(r, that)
     @inline final def zipParRight[E1 >: E, B](that: F[E1, B]): F[E1, B] = F.zipParRight(r, that)
   }
-
+  final class BIOConcurrentOps[F[+_, +_], +E, +A](override protected[this] val r: F[E, A])(implicit override protected[this] val F: BIOConcurrent[F])
+    extends BIOParallelOps(r)(F) {
+    @inline final def race[E1 >: E, A1 >: A](that: F[E1, A1]): F[E1, A1] = F.race(r, that)
+    @inline final def racePair[E1 >: E, A1 >: A](
+      that: F[E1, A1]
+    ): F[E1, Either[(A, BIOFiber[F, E1, A1]), (BIOFiber[F, E1, A], A1)]] = F.racePair(r, that)
+    @inline final def uninterruptible: F[E, A] = F.uninterruptible(r)
+  }
   class BIOAsyncOps[F[+_, +_], +E, +A](override protected[this] val r: F[E, A])(implicit override protected[this] val F: BIOAsync[F]) extends BIOOps(r) {
     @inline final def zipWithPar[E1 >: E, B, C](that: F[E1, B])(f: (A, B) => C): F[E1, C] = F.zipWithPar(r, that)(f)
     @inline final def zipPar[E1 >: E, B](that: F[E1, B]): F[E1, (A, B)] = F.zipPar(r, that)
@@ -161,6 +168,10 @@ object BIOSyntax {
     @inline final def zipParRight[E1 >: E, B](that: F[E1, B]): F[E1, B] = F.zipParRight(r, that)
 
     @inline final def race[E1 >: E, A1 >: A](that: F[E1, A1]): F[E1, A1] = F.race(r, that)
+    @inline final def racePair[E1 >: E, A1 >: A](
+      that: F[E1, A1]
+    ): F[E1, Either[(A, BIOFiber[F, E1, A1]), (BIOFiber[F, E1, A], A1)]] = F.racePair(r, that)
+    @inline final def uninterruptible: F[E, A] = F.uninterruptible(r)
   }
 
   final class BIOTemporalOps[F[+_, +_], +E, +A](protected[this] val r: F[E, A])(implicit protected[this] val F: BIOTemporal[F]) {
@@ -189,11 +200,18 @@ object BIOSyntax {
     @inline final def BIOAsync[F[+_, +_]: BIOAsync]: BIOAsync[F] = implicitly
   }
   trait BIOImplicitPuns2 extends BIOImplicitPuns3 {
+    @inline implicit final def BIOConcurrent[F[+_, +_]: BIOConcurrent, E, A](self: F[E, A]): BIOSyntax.BIOConcurrentOps[F, E, A] =
+      new BIOSyntax.BIOConcurrentOps[F, E, A](self)
+    @inline implicit final def BIOConcurrent[F[+_, +_]: BIOPanic, E, A](self: F[E, A]): BIOSyntax.BIOPanicOps[F, E, A] =
+      new BIOSyntax.BIOPanicOps[F, E, A](self)
+    @inline final def BIOConcurrent[F[+_, +_]: BIOConcurrent]: BIOConcurrent[F] = implicitly
+  }
+  trait BIOImplicitPuns3 extends BIOImplicitPuns4 {
     @inline implicit final def BIOParallel[F[+_, +_]: BIOParallel, E, A](self: F[E, A]): BIOSyntax.BIOParallelOps[F, E, A] = new BIOSyntax.BIOParallelOps[F, E, A](self)
     @inline implicit final def BIOParallel[F[+_, +_]: BIOMonad, E, A](self: F[E, A]): BIOSyntax.BIOMonadOps[F, E, A] = new BIOSyntax.BIOMonadOps[F, E, A](self)
     @inline final def BIOParallel[F[+_, +_]: BIOParallel]: BIOParallel[F] = implicitly
   }
-  trait BIOImplicitPuns3 extends BIOImplicitPuns4 {
+  trait BIOImplicitPuns4 extends BIOImplicitPuns5 {
     @inline implicit final def BIO[F[+_, +_]: BIO, E, A](self: F[E, A]): BIOSyntax.BIOOps[F, E, A] = new BIOSyntax.BIOOps[F, E, A](self)
     /**
       * Shorthand for [[BIO#syncThrowable]]
@@ -205,49 +223,49 @@ object BIOSyntax {
     @inline final def BIO[F[+_, +_], A](effect: => A)(implicit F: BIO[F]): F[Throwable, A] = F.syncThrowable(effect)
     @inline final def BIO[F[+_, +_]: BIO]: BIO[F] = implicitly
   }
-  trait BIOImplicitPuns4 extends BIOImplicitPuns5 {
+  trait BIOImplicitPuns5 extends BIOImplicitPuns6 {
     @inline implicit final def BIOPanic[F[+_, +_]: BIOPanic, E, A](self: F[E, A]): BIOSyntax.BIOPanicOps[F, E, A] = new BIOSyntax.BIOPanicOps[F, E, A](self)
     @inline final def BIOPanic[F[+_, +_]: BIOPanic]: BIOPanic[F] = implicitly
   }
-  trait BIOImplicitPuns5 extends BIOImplicitPuns6 {
+  trait BIOImplicitPuns6 extends BIOImplicitPuns7 {
     @inline implicit final def BIOBracket[F[+_, +_]: BIOBracket, E, A](self: F[E, A]): BIOSyntax.BIOBracketOps[F, E, A] = new BIOSyntax.BIOBracketOps[F, E, A](self)
     @inline final def BIOBracket[F[+_, +_]: BIOBracket]: BIOBracket[F] = implicitly
   }
-  trait BIOImplicitPuns6 extends BIOImplicitPuns7 {
+  trait BIOImplicitPuns7 extends BIOImplicitPuns8 {
     @inline implicit final def BIOError[F[+_, +_]: BIOError, E, A](self: F[E, A]): BIOSyntax.BIOErrorOps[F, E, A] =
       new BIOSyntax.BIOErrorOps[F, E, A](self)
     @inline final def BIOError[F[+_, +_]: BIOError]: BIOError[F] = implicitly
   }
-  trait BIOImplicitPuns7 extends BIOImplicitPuns8 {
+  trait BIOImplicitPuns8 extends BIOImplicitPuns9 {
     @inline implicit final def BIOApplicativeError[F[+_, +_]: BIOApplicativeError, E, A](self: F[E, A]): BIOSyntax.BIOApplicativeErrorOps[F, E, A] =
       new BIOSyntax.BIOApplicativeErrorOps[F, E, A](self)
     @inline final def BIOApplicativeError[F[+_, +_]: BIOApplicativeError]: BIOApplicativeError[F] = implicitly
   }
-  trait BIOImplicitPuns8 extends BIOImplicitPuns9 {
+  trait BIOImplicitPuns9 extends BIOImplicitPuns10 {
     @inline implicit final def BIOGuarantee[F[+_, +_]: BIOGuarantee, E, A](self: F[E, A]): BIOSyntax.BIOGuaranteeOps[F, E, A] =
       new BIOSyntax.BIOGuaranteeOps[F, E, A](self)
     @inline final def BIOGuarantee[F[+_, +_]: BIOGuarantee]: BIOGuarantee[F] = implicitly
   }
-  trait BIOImplicitPuns9 extends BIOImplicitPuns10 {
+  trait BIOImplicitPuns10 extends BIOImplicitPuns11 {
     @inline implicit final def BIOMonad[F[+_, +_]: BIOMonad, E, A](self: F[E, A]): BIOSyntax.BIOMonadOps[F, E, A] = new BIOSyntax.BIOMonadOps[F, E, A](self)
     @inline final def BIOMonad[F[+_, +_]: BIOMonad]: BIOMonad[F] = implicitly
   }
-  trait BIOImplicitPuns10 extends BIOImplicitPuns11 {
+  trait BIOImplicitPuns11 extends BIOImplicitPuns12 {
     @inline implicit final def BIOApplicative[F[+_, +_]: BIOApplicative, E, A](self: F[E, A]): BIOSyntax.BIOApplicativeOps[F, E, A] =
       new BIOSyntax.BIOApplicativeOps[F, E, A](self)
     @inline final def BIOApplicative[F[+_, +_]: BIOApplicative]: BIOApplicative[F] = implicitly
   }
-  trait BIOImplicitPuns11 extends BIOImplicitPuns12 {
+  trait BIOImplicitPuns12 extends BIOImplicitPuns13 {
     @inline implicit final def BIOBifunctor[F[+_, +_]: BIOBifunctor, E, A](self: F[E, A]): BIOSyntax.BIOBifunctorOps[F, E, A] =
       new BIOSyntax.BIOBifunctorOps[F, E, A](self)
     @inline implicit final def BIOBifunctor[F[+_, +_]: BIOFunctor, E, A](self: F[E, A]): BIOSyntax.BIOFunctorOps[F, E, A] = new BIOSyntax.BIOFunctorOps[F, E, A](self)
     @inline final def BIOBifunctor[F[+_, +_]: BIOBifunctor]: BIOBifunctor[F] = implicitly
   }
-  trait BIOImplicitPuns12 extends BIOImplicitPuns13 {
+  trait BIOImplicitPuns13 extends BIOImplicitPuns14 {
     @inline implicit final def BIOFunctor[F[+_, +_]: BIOFunctor, E, A](self: F[E, A]): BIOSyntax.BIOFunctorOps[F, E, A] = new BIOSyntax.BIOFunctorOps[F, E, A](self)
     @inline final def BIOFunctor[F[+_, +_]: BIOFunctor]: BIOFunctor[F] = implicitly
   }
-  trait BIOImplicitPuns13 {
+  trait BIOImplicitPuns14 {
     @deprecated("Use BIOError", "0.11")
     @inline implicit final def BIOMonadError[F[+_, +_]: BIOError, E, A](self: F[E, A]): BIOSyntax.BIOErrorOps[F, E, A] =
       new BIOSyntax.BIOErrorOps[F, E, A](self)


Test patch:
diff --git a/distage/distage-framework/src/test/scala/izumi/distage/roles/test/RoleAppTest.scala b/distage/distage-framework/src/test/scala/izumi/distage/roles/test/RoleAppTest.scala
index 0e8776e0f..3822304ef 100644
--- a/distage/distage-framework/src/test/scala/izumi/distage/roles/test/RoleAppTest.scala
+++ b/distage/distage-framework/src/test/scala/izumi/distage/roles/test/RoleAppTest.scala
@@ -15,14 +15,10 @@ import izumi.distage.framework.services.{IntegrationChecker, RoleAppPlanner}
 import izumi.distage.model.PlannerInput
 import izumi.distage.model.definition.{Activation, BootstrapModule, DIResource}
 import izumi.distage.plugins.PluginConfig
-import izumi.distage.roles.RoleAppMain
-import izumi.distage.roles.launcher.{AppFailureHandler, AppShutdownStrategy}
-import izumi.distage.roles.launcher.AppShutdownStrategy.ImmediateExitShutdownStrategy
 import izumi.distage.roles.test.fixtures.Fixture._
 import izumi.distage.roles.test.fixtures._
 import izumi.distage.roles.test.fixtures.roles.TestRole00
 import izumi.fundamentals.platform.functional.Identity
-import izumi.fundamentals.platform.language.SourcePackageMaterializer.thisPkg
 import izumi.fundamentals.platform.resources.ArtifactVersion
 import izumi.logstage.api.IzLogger
 import org.scalatest.wordspec.AnyWordSpec
@@ -38,18 +34,6 @@ class RoleAppTest extends AnyWordSpec with WithProperties {
     "testservice.systemPropList.1" -> "222",
   )
 
-  class TestEntrypointBase extends RoleAppMain[IO] {
-    override protected def makeShutdownStrategy(): AppShutdownStrategy[IO] = {
-      new ImmediateExitShutdownStrategy[IO]
-    }
-
-    override protected def createEarlyFailureHandler(): AppFailureHandler = AppFailureHandler.NullHandler
-
-    override protected def makePluginConfig(): PluginConfig = PluginConfig.cached(Seq(s"$thisPkg.fixtures"))
-  }
-
-  object TestEntrypoint extends TestEntrypointBase
-
   class XXX_TestWhiteboxProbe extends PluginDef {
     val resources = new XXX_ResourceEffectsRecorder[IO]
     private var locator0: LocatorRef = null
@@ -72,7 +56,7 @@ class RoleAppTest extends AnyWordSpec with WithProperties {
       val probe = new XXX_TestWhiteboxProbe()
 
       new TestEntrypointBase {
-        override protected def makePluginConfig(): PluginConfig = super.makePluginConfig() overridenBy probe
+        override protected def pluginConfig: PluginConfig = super.pluginConfig overridenBy probe
       }.main(
         Array(
           "-ll",
@@ -90,7 +74,7 @@ class RoleAppTest extends AnyWordSpec with WithProperties {
       val probe = new XXX_TestWhiteboxProbe()
 
       new TestEntrypointBase() {
-        override protected def makePluginConfig(): PluginConfig = {
+        override protected def pluginConfig: PluginConfig = {
           PluginConfig.const(
             Seq(
               new ResourcesPluginBase {}.morph[PluginBase],
diff --git a/distage/distage-framework/src/test/scala/izumi/distage/roles/test/TestEntrypoint.scala b/distage/distage-framework/src/test/scala/izumi/distage/roles/test/TestEntrypoint.scala
new file mode 100644
index 000000000..049c5f2dd
--- /dev/null
+++ b/distage/distage-framework/src/test/scala/izumi/distage/roles/test/TestEntrypoint.scala
@@ -0,0 +1,19 @@
+package izumi.distage.roles.test
+
+import cats.effect.IO
+import distage.plugins.PluginConfig
+import izumi.distage.roles.RoleAppMain
+import izumi.distage.roles.launcher.AppShutdownStrategy.ImmediateExitShutdownStrategy
+import izumi.fundamentals.platform.language.SourcePackageMaterializer.thisPkg
+
+object TestEntrypoint extends TestEntrypointBase
+
+class TestEntrypointBase extends RoleAppMain.LauncherF[IO] {
+  override protected def pluginConfig: PluginConfig = {
+    PluginConfig.cached(Seq(s"$thisPkg.fixtures"))
+  }
+
+  override protected def shutdownStrategy: ImmediateExitShutdownStrategy[IO] = {
+    new ImmediateExitShutdownStrategy()
+  }
+}
diff --git a/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
index d063e2643..a3be8862e 100644
--- a/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
+++ b/fundamentals/fundamentals-bio/src/test/scala/izumi/fundamentals/bio/test/BIOSyntaxTest.scala
@@ -37,6 +37,38 @@ class BIOSyntaxTest extends AnyWordSpec {
     x[zio.ZIO](zio.UIO.succeed(()), zio.UIO.succeed(()))
   }
 
+  "BIOConcurrent syntax / attachment / conversion works" in {
+    import izumi.functional.bio.{BIOConcurrent, F}
+
+    def x[F[+_, +_]: BIOConcurrent](a: F[Nothing, Unit], b: F[Nothing, Unit]) = {
+      a.zipPar(b)
+      a.zipParLeft(b)
+      a.zipParRight(b)
+      a.zipWithPar(b)((a, b) => (a, b))
+      a.flatMap(_ => b)
+      a.guaranteeCase(_ => a.race(b).catchAll(_ => F.unit orElse F.uninterruptible(F.race(a, b))).void)
+      F.unit
+    }
+
+    x[zio.IO](zio.UIO.succeed(()), zio.UIO.succeed(()))
+  }
+
+  "BIOConcurrent3 syntax / attachment / conversion works" in {
+    import izumi.functional.bio.{BIOConcurrent3, F}
+
+    def x[F[-_, +_, +_]: BIOConcurrent3](a: F[Any, Nothing, Unit], b: F[Any, Nothing, Unit]) = {
+      a.zipPar(b)
+      a.zipParLeft(b)
+      a.zipParRight(b)
+      a.zipWithPar(b)((a, b) => (a, b))
+      a.flatMap(_ => b)
+      a.guaranteeCase(_ => a.race(b).catchAll(_ => F.unit orElse F.uninterruptible(F.race(a, b))).void)
+      F.unit
+    }
+
+    x[zio.ZIO](zio.UIO.succeed(()), zio.UIO.succeed(()))
+  }
+
   "BIOAsync.race is callable along with all BIOParallel syntax" in {
     import izumi.functional.bio.BIOAsync