Repository: ory/kratos
Pull request #1306 (2021-05-03 15:26:34)

Resolve regressions and UX issues
## Related issue

<!--
Please link the GitHub issue this pull request resolves in the format of `#1234`. If you discussed this change
with a maintainer, please mention her/him using the `@` syntax (e.g. `@aeneasr`).

If this change neither resolves an existing issue nor has sign-off from one of the maintainers, there is a
chance substantial changes will be requested or that the changes will be rejected.

You can discuss changes with maintainers either in the Github Discusssions in this repository or
join the [Ory Chat](https://www.ory.sh/chat).
-->

## Proposed changes

<!--
Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request.
-->

## Checklist

<!--
Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of
them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code.
-->

- [ ] I have read the [contributing guidelines](../blob/master/CONTRIBUTING.md).
- [ ] I have read the [security policy](../security/policy).
- [ ] I confirm that this pull request does not address a security
      vulnerability. If this pull request addresses a security. vulnerability, I
      confirm that I got green light (please contact
      [security@ory.sh](mailto:security@ory.sh)) from the maintainers to push
      the changes.
- [ ] I have added tests that prove my fix is effective or that my feature
      works.
- [ ] I have added or changed [the documentation](docs/docs).

## Further comments

<!--
If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution
you did and what alternatives you considered, etc...
-->



Patch:
diff --git a/.schema/api.openapi.json b/.schema/api.openapi.json
index b03f8920e..fe62c9cda 100644
--- a/.schema/api.openapi.json
+++ b/.schema/api.openapi.json
@@ -1652,7 +1652,7 @@
             "$ref": "#/components/responses/emptyResponse"
           }
         },
-        "summary": "Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
+        "summary": "Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
         "tags": [
           "admin"
         ]
diff --git a/.schema/openapi.json b/.schema/openapi.json
index 9cd6b2a79..da9c0c742 100644
--- a/.schema/openapi.json
+++ b/.schema/openapi.json
@@ -1708,7 +1708,7 @@
             "$ref": "#/components/responses/emptyResponse"
           }
         },
-        "summary": "Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
+        "summary": "Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
         "tags": [
           "admin"
         ]
diff --git a/docs/contrib/config.js b/docs/contrib/config.js
index c39f2fb6a..55bc51c29 100644
--- a/docs/contrib/config.js
+++ b/docs/contrib/config.js
@@ -2,7 +2,7 @@ const fs = require('fs')
 const path = require('path')
 
 let config = {
-  projectName: 'Ory Template',
+  projectName: 'ORY Template',
   projectSlug: 'docusaurus-template',
   projectTagLine: 'Stubbydi dab dub dadada',
   newsletter:
diff --git a/docs/docs/reference/configuration.md b/docs/docs/reference/configuration.md
index 93c5c70f9..070579478 100644
--- a/docs/docs/reference/configuration.md
+++ b/docs/docs/reference/configuration.md
@@ -26,7 +26,7 @@ quickstart.
 
 To find out more about edge cases like setting string array values through
 environmental variables head to the
-[Configuring Ory services](https://www.ory.sh/docs/ecosystem/configuring)
+[Configuring ORY services](https://www.ory.sh/docs/ecosystem/configuring)
 section.
 
 ```yaml
@@ -908,7 +908,7 @@ serve:
     socket:
       ## group ##
       #
-      # Group of unix socket. If empty, the group will be the primary group of the user running hydra.
+      # Group of unix socket. If empty, the group will be the primary group of the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -938,7 +938,7 @@ serve:
 
       ## owner ##
       #
-      # Owner of unix socket. If empty, the owner will be the user running hydra.
+      # Owner of unix socket. If empty, the owner will be the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1135,7 +1135,7 @@ serve:
     socket:
       ## group ##
       #
-      # Group of unix socket. If empty, the group will be the primary group of the user running hydra.
+      # Group of unix socket. If empty, the group will be the primary group of the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1165,7 +1165,7 @@ serve:
 
       ## owner ##
       #
-      # Owner of unix socket. If empty, the owner will be the user running hydra.
+      # Owner of unix socket. If empty, the owner will be the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1192,7 +1192,7 @@ serve:
 
 ## tracing ##
 #
-# Ory Hydra supports distributed tracing.
+# Ory Kratos supports distributed tracing.
 #
 tracing:
   ## service_name ##
diff --git a/docs/docs/sdk.md b/docs/docs/sdk.md
index fcb3b3167..17870869e 100644
--- a/docs/docs/sdk.md
+++ b/docs/docs/sdk.md
@@ -23,7 +23,7 @@ repositories:
 - [Go](https://github.com/ory/kratos-client-go)
 - [Java](https://search.maven.org/artifact/sh.ory.kratos/kratos-client)
 - [JavaScript](https://www.npmjs.com/package/@ory/kratos-client) with TypeScript
-  definitions and compatible with: NodeJS, ReactJS, AnuglarJS, Vue.js, and many
+  definitions and compatible with: NodeJS, ReactJS, AngularJS, Vue.js, and many
   more.
 - [PHP](https://packagist.org/packages/ory/kratos-client)
 - [Python](https://pypi.org/project/ory-kratos-client/)
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index dcdac21e8..27ad1843f 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -40,6 +40,57 @@ if (fs.existsSync('./src/css/theme.css')) {
   customCss.push(require.resolve('./src/css/theme.css'))
 }
 
+const githubPrismTheme = require('prism-react-renderer/themes/github')
+
+const prismThemeLight = {
+  ...githubPrismTheme,
+  styles: [
+    ...githubPrismTheme.styles,
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['namespace'],
+      style: {
+        color: '#666'
+      }
+    },
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['object'],
+      style: {
+        color: '#939'
+      }
+    },
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['relation'],
+      style: {
+        color: '#e80'
+      }
+    },
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['delimiter'],
+      style: {
+        color: '#555'
+      }
+    },
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['comment'],
+      style: {
+        color: '#999'
+      }
+    },
+    {
+      languages: ['keto-relation-tuples'],
+      types: ['subject'],
+      style: {
+        color: '#903'
+      }
+    }
+  ]
+}
+
 module.exports = {
   title: config.projectName,
   tagline: config.projectTagLine,
@@ -52,7 +103,7 @@ module.exports = {
   projectName: config.projectSlug, // Usually your repo name.
   themeConfig: {
     prism: {
-      theme: require('prism-react-renderer/themes/github'),
+      theme: prismThemeLight,
       darkTheme: require('prism-react-renderer/themes/dracula'),
       additionalLanguages: ['pug', 'shell-session']
     },
@@ -99,7 +150,7 @@ module.exports = {
     },
     footer: {
       style: 'dark',
-      copyright: `Copyright © ${new Date().getFullYear()} Ory GmbH`,
+      copyright: `Copyright © ${new Date().getFullYear()} ORY GmbH`,
       links: [
         {
           title: 'Company',
diff --git a/docs/scripts/config.js b/docs/scripts/config.js
index d2aa14b26..2a4bb6c39 100644
--- a/docs/scripts/config.js
+++ b/docs/scripts/config.js
@@ -209,7 +209,7 @@ It is a reference for all possible configuration values.
 If you are looking for an example configuration, it is better to try out the quickstart.
 
 To find out more about edge cases like setting string array values through environmental variables head to the
-[Configuring Ory services](https://www.ory.sh/docs/ecosystem/configuring) section.
+[Configuring ORY services](https://www.ory.sh/docs/ecosystem/configuring) section.
 
 \`\`\`yaml
 ${out.yaml}
diff --git a/docs/src/pages/versions.js b/docs/src/pages/versions.js
index 657fdd838..044bc4561 100644
--- a/docs/src/pages/versions.js
+++ b/docs/src/pages/versions.js
@@ -25,7 +25,7 @@ function Version() {
     (version) => version !== latestVersion && version.name !== 'current'
   )
   const repoUrl = `https://github.com/${siteConfig.organizationName}/${siteConfig.projectName}`
-  const project = `Ory ${capitalizeFirstLetter(siteConfig.projectName)}`
+  const project = `ORY ${capitalizeFirstLetter(siteConfig.projectName)}`
 
   return (
     <Layout
diff --git a/docs/src/theme/ketoRelationTuplesPrism.js b/docs/src/theme/ketoRelationTuplesPrism.js
new file mode 100644
index 000000000..513d653df
--- /dev/null
+++ b/docs/src/theme/ketoRelationTuplesPrism.js
@@ -0,0 +1,56 @@
+const delimiter = {
+  delimiter: /[:#@()]/
+}
+
+const namespace = {
+  pattern: /[^:#@()\n]+:/,
+  inside: {
+    ...delimiter,
+    namespace: /.*/
+  }
+}
+
+const object = {
+  pattern: /[^:#@()\n]+#/,
+  inside: {
+    ...delimiter,
+    'property-access': /.*/
+  }
+}
+
+const relation = {
+  pattern: /[^:#@()\n]+/
+}
+
+const subjectID = {
+  pattern: /@[^:#@()\n]+/,
+  inside: {
+    ...delimiter,
+    subject: /.*/
+  }
+}
+
+const subjectSet = {
+  pattern: /@\(([^:#@()\n]+:)?([^:#@()\n]+)#([^:#@()\n]*)\)/,
+  inside: {
+    delimiter: /[@()]*/,
+    namespace,
+    object,
+    relation
+  }
+}
+
+export default (prism) =>
+  (prism.languages['keto-relation-tuples'] = {
+    comment: /\/\/.*(\n|$)/,
+    'relation-tuple': {
+      pattern: /([^:#@()\n]+:)?([^:#@()\n]+)#([^:#@()\n]+)@?((\(([^:#@()\n]+:)?([^:#@()\n]+)#([^:#@()\n]*)\))|([^:#@()\n]+))/,
+      inside: {
+        namespace,
+        object,
+        subjectID,
+        subjectSet,
+        relation
+      }
+    }
+  })
diff --git a/docs/src/theme/prism-include-languages.js b/docs/src/theme/prism-include-languages.js
new file mode 100644
index 000000000..85a2750eb
--- /dev/null
+++ b/docs/src/theme/prism-include-languages.js
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'
+import siteConfig from '@generated/docusaurus.config'
+import ketoRelationTuplesPrism from './ketoRelationTuplesPrism'
+
+const prismIncludeLanguages = (PrismObject) => {
+  if (ExecutionEnvironment.canUseDOM) {
+    const {
+      themeConfig: { prism: { additionalLanguages = [] } = {} }
+    } = siteConfig
+    window.Prism = PrismObject
+    additionalLanguages.forEach((lang) => {
+      require(`prismjs/components/prism-${lang}`) // eslint-disable-line
+    })
+
+    ketoRelationTuplesPrism(window.Prism)
+
+    delete window.Prism
+  }
+}
+
+export default prismIncludeLanguages
diff --git a/docs/versioned_docs/version-v0.6/reference/configuration.md b/docs/versioned_docs/version-v0.6/reference/configuration.md
index 93c5c70f9..089109cd7 100644
--- a/docs/versioned_docs/version-v0.6/reference/configuration.md
+++ b/docs/versioned_docs/version-v0.6/reference/configuration.md
@@ -908,7 +908,7 @@ serve:
     socket:
       ## group ##
       #
-      # Group of unix socket. If empty, the group will be the primary group of the user running hydra.
+      # Group of unix socket. If empty, the group will be the primary group of the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -938,7 +938,7 @@ serve:
 
       ## owner ##
       #
-      # Owner of unix socket. If empty, the owner will be the user running hydra.
+      # Owner of unix socket. If empty, the owner will be the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1135,7 +1135,7 @@ serve:
     socket:
       ## group ##
       #
-      # Group of unix socket. If empty, the group will be the primary group of the user running hydra.
+      # Group of unix socket. If empty, the group will be the primary group of the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1165,7 +1165,7 @@ serve:
 
       ## owner ##
       #
-      # Owner of unix socket. If empty, the owner will be the user running hydra.
+      # Owner of unix socket. If empty, the owner will be the user running Kratos.
       #
       # Set this value using environment variables on
       # - Linux/macOS:
@@ -1192,7 +1192,7 @@ serve:
 
 ## tracing ##
 #
-# Ory Hydra supports distributed tracing.
+# Ory Kratos supports distributed tracing.
 #
 tracing:
   ## service_name ##
diff --git a/docs/versioned_docs/version-v0.6/sdk.md b/docs/versioned_docs/version-v0.6/sdk.md
index fcb3b3167..17870869e 100644
--- a/docs/versioned_docs/version-v0.6/sdk.md
+++ b/docs/versioned_docs/version-v0.6/sdk.md
@@ -23,7 +23,7 @@ repositories:
 - [Go](https://github.com/ory/kratos-client-go)
 - [Java](https://search.maven.org/artifact/sh.ory.kratos/kratos-client)
 - [JavaScript](https://www.npmjs.com/package/@ory/kratos-client) with TypeScript
-  definitions and compatible with: NodeJS, ReactJS, AnuglarJS, Vue.js, and many
+  definitions and compatible with: NodeJS, ReactJS, AngularJS, Vue.js, and many
   more.
 - [PHP](https://packagist.org/packages/ory/kratos-client)
 - [Python](https://pypi.org/project/ory-kratos-client/)
diff --git a/driver/config/.schema/config.schema.json b/driver/config/.schema/config.schema.json
index a80f4d4f6..12e84540f 100644
--- a/driver/config/.schema/config.schema.json
+++ b/driver/config/.schema/config.schema.json
@@ -21,12 +21,12 @@
       "properties": {
         "owner": {
           "type": "string",
-          "description": "Owner of unix socket. If empty, the owner will be the user running hydra.",
+          "description": "Owner of unix socket. If empty, the owner will be the user running Kratos.",
           "default": ""
         },
         "group": {
           "type": "string",
-          "description": "Group of unix socket. If empty, the group will be the primary group of the user running hydra.",
+          "description": "Group of unix socket. If empty, the group will be the primary group of the user running Kratos.",
           "default": ""
         },
         "mode": {
@@ -1035,7 +1035,7 @@
     "tracing": {
       "type": "object",
       "additionalProperties": false,
-      "description": "Ory Hydra supports distributed tracing.",
+      "description": "Ory Kratos supports distributed tracing.",
       "properties": {
         "provider": {
           "type": "string",
diff --git a/go.mod b/go.mod
index 86075392a..b3f0e4dc0 100644
--- a/go.mod
+++ b/go.mod
@@ -75,7 +75,7 @@ require (
 	github.com/ory/kratos/corp v0.0.0-00010101000000-000000000000
 	github.com/ory/mail/v3 v3.0.0
 	github.com/ory/nosurf v1.2.4
-	github.com/ory/x v0.0.228
+	github.com/ory/x v0.0.231
 	github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
 	github.com/philhofer/fwd v1.1.1 // indirect
 	github.com/pkg/errors v0.9.1
diff --git a/go.sum b/go.sum
index 42c187100..b49f31fe3 100644
--- a/go.sum
+++ b/go.sum
@@ -1139,8 +1139,8 @@ github.com/ory/x v0.0.179/go.mod h1:SGETCUk1DgQC30bb7y4hjhkKGQ1x0YOsldrmGmy6MNc=
 github.com/ory/x v0.0.195/go.mod h1:lyBjsy7j2akYqxObpjOhMFRiO+sHz4IqQqh8gXQ48qg=
 github.com/ory/x v0.0.205/go.mod h1:A1s4iwmFIppRXZLF3J9GGWeY/HpREVm0Dk5z/787iek=
 github.com/ory/x v0.0.206/go.mod h1:T7joPZDepsIA9rGVFuSUJcScX0QqYmTXQruyMKhhiwA=
-github.com/ory/x v0.0.228 h1:ckuz/f8YhgUwxqrbp1CP8ayOowlmPX2ddnaM5xonAfA=
-github.com/ory/x v0.0.228/go.mod h1:gwfVYL9gs5gfUX8icXbK3EElqpoktGe85NuCWjGxJTo=
+github.com/ory/x v0.0.231 h1:jCRAJ3ETK8qpk5HFsCIBwzrC/u4jQdKhi6DW4FQMbvw=
+github.com/ory/x v0.0.231/go.mod h1:0mSGWLFgcqckIvgexka1GJK/sshYrFFkU7lPajzGTFw=
 github.com/parnurzeal/gorequest v0.2.15/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
diff --git a/internal/httpclient/README.md b/internal/httpclient/README.md
index 30be26378..6010fc662 100644
--- a/internal/httpclient/README.md
+++ b/internal/httpclient/README.md
@@ -98,7 +98,7 @@ Class | Method | HTTP request | Description
 *AdminApi* | [**IsAlive**](docs/AdminApi.md#isalive) | **Get** /health/alive | Check HTTP Server Status
 *AdminApi* | [**IsReady**](docs/AdminApi.md#isready) | **Get** /health/ready | Check HTTP Server and Database Status
 *AdminApi* | [**ListIdentities**](docs/AdminApi.md#listidentities) | **Get** /identities | List Identities
-*AdminApi* | [**Prometheus**](docs/AdminApi.md#prometheus) | **Get** /metrics/prometheus | Get snapshot metrics from the Hydra service. If you&#39;re using k8s, you can then add annotations to your deployment like so:
+*AdminApi* | [**Prometheus**](docs/AdminApi.md#prometheus) | **Get** /metrics/prometheus | Get snapshot metrics from the Kratos service. If you&#39;re using k8s, you can then add annotations to your deployment like so:
 *AdminApi* | [**UpdateIdentity**](docs/AdminApi.md#updateidentity) | **Put** /identities/{id} | Update an Identity
 *PublicApi* | [**GetSchema**](docs/PublicApi.md#getschema) | **Get** /schemas/{id} | 
 *PublicApi* | [**GetSelfServiceError**](docs/PublicApi.md#getselfserviceerror) | **Get** /self-service/errors | Get User-Facing Self-Service Errors
diff --git a/internal/httpclient/api/openapi.yaml b/internal/httpclient/api/openapi.yaml
index afc104a69..feb4c44a6 100644
--- a/internal/httpclient/api/openapi.yaml
+++ b/internal/httpclient/api/openapi.yaml
@@ -327,7 +327,7 @@ paths:
           description: Empty responses are sent when, for example, resources are deleted.
             The HTTP status code for empty responses is typically 201.
       summary: |-
-        Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to
+        Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to
         your deployment like so:
       tags:
       - admin
@@ -1560,20 +1560,20 @@ paths:
         This endpoint is useful for reverse proxies and API Gateways.
       operationId: whoami
       parameters:
-        - explode: false
-          in: header
-          name: Cookie
-          required: false
-          schema:
-            type: string
-          style: simple
-        - explode: false
-          in: header
-          name: Authorization
-          required: false
-          schema:
-            type: string
-          style: simple
+      - explode: false
+        in: header
+        name: Cookie
+        required: false
+        schema:
+          type: string
+        style: simple
+      - explode: false
+        in: header
+        name: Authorization
+        required: false
+        schema:
+          type: string
+        style: simple
       responses:
         "200":
           content:
@@ -3422,14 +3422,27 @@ components:
       oneOf:
       - $ref: '#/components/schemas/submitSelfServiceRegistrationFlowWithPasswordMethod'
     submitSelfServiceRegistrationFlowWithPasswordMethod:
+      description: |-
+        SubmitSelfServiceRegistrationFlowWithPasswordMethod is used to decode the registration form payload
+        when using the password method.
       properties:
         csrf_token:
+          description: The CSRF Token
+          type: string
+        method:
+          description: |-
+            Method to use
+
+            This field must be set to `password` when using the password method.
           type: string
         password:
+          description: Password to sign the user up with
           type: string
         traits:
+          description: The identity's traits
           type: object
-      title: RegistrationFormPayload is used to decode the registration form payload.
+      required:
+      - method
       type: object
     submitSelfServiceSettingsFlow:
       oneOf:
diff --git a/internal/httpclient/api_admin.go b/internal/httpclient/api_admin.go
index f1c37d032..ede3cead1 100644
--- a/internal/httpclient/api_admin.go
+++ b/internal/httpclient/api_admin.go
@@ -2067,7 +2067,7 @@ func (r AdminApiApiPrometheusRequest) Execute() (*http.Response, error) {
 }
 
 /*
- * Prometheus Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to your deployment like so:
+ * Prometheus Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to your deployment like so:
  * ```
 metadata:
 annotations:
diff --git a/internal/httpclient/docs/AdminApi.md b/internal/httpclient/docs/AdminApi.md
index 745068abe..b72c7c286 100644
--- a/internal/httpclient/docs/AdminApi.md
+++ b/internal/httpclient/docs/AdminApi.md
@@ -19,7 +19,7 @@ Method | HTTP request | Description
 [**IsAlive**](AdminApi.md#IsAlive) | **Get** /health/alive | Check HTTP Server Status
 [**IsReady**](AdminApi.md#IsReady) | **Get** /health/ready | Check HTTP Server and Database Status
 [**ListIdentities**](AdminApi.md#ListIdentities) | **Get** /identities | List Identities
-[**Prometheus**](AdminApi.md#Prometheus) | **Get** /metrics/prometheus | Get snapshot metrics from the Hydra service. If you&#39;re using k8s, you can then add annotations to your deployment like so:
+[**Prometheus**](AdminApi.md#Prometheus) | **Get** /metrics/prometheus | Get snapshot metrics from the Kratos service. If you&#39;re using k8s, you can then add annotations to your deployment like so:
 [**UpdateIdentity**](AdminApi.md#UpdateIdentity) | **Put** /identities/{id} | Update an Identity
 
 
@@ -1015,7 +1015,7 @@ No authorization required
 
 > Prometheus(ctx).Execute()
 
-Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to your deployment like so:
+Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to your deployment like so:
 
 
 
diff --git a/internal/httpclient/docs/LoginFlow.md b/internal/httpclient/docs/LoginFlow.md
index 170182023..861358fdc 100644
--- a/internal/httpclient/docs/LoginFlow.md
+++ b/internal/httpclient/docs/LoginFlow.md
@@ -4,16 +4,14 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**Active** | Pointer to **string** | and so on. | [optional]
-**ExpiresAt** | **
-time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated. |
-**Forced** | Pointer to **bool** | Forced stores whether this login flow should enforce re-authentication. | [optional]
-**Id** | **string** |  |
-**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow started. |
-**RequestUrl** | **
-string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. |
-**Type** | **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. |
-**Ui** | [**UiContainer**](UiContainer.md) |  |
+**Active** | Pointer to **string** | and so on. | [optional] 
+**ExpiresAt** | **time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated. | 
+**Forced** | Pointer to **bool** | Forced stores whether this login flow should enforce re-authentication. | [optional] 
+**Id** | **string** |  | 
+**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow started. | 
+**RequestUrl** | **string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | 
+**Type** | **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | 
+**Ui** | [**UiContainer**](UiContainer.md) |  | 
 
 ## Methods
 
@@ -21,8 +19,9 @@ string** | RequestURL is the initial URL that was requested from Ory Kratos. It
 
 `func NewLoginFlow(expiresAt time.Time, id string, issuedAt time.Time, requestUrl string, type_ string, ui UiContainer, ) *LoginFlow`
 
-NewLoginFlow instantiates a new LoginFlow object This constructor will assign default values to properties that have it
-defined, and makes sure properties required by API are set, but the set of arguments
+NewLoginFlow instantiates a new LoginFlow object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
 will change when the set of required properties is changed
 
 ### NewLoginFlowWithDefaults
diff --git a/internal/httpclient/docs/PublicApi.md b/internal/httpclient/docs/PublicApi.md
index 9bf00f790..9c9d7ce28 100644
--- a/internal/httpclient/docs/PublicApi.md
+++ b/internal/httpclient/docs/PublicApi.md
@@ -4,7 +4,7 @@ All URIs are relative to *https://demo.tenants.oryapis.com/api/kratos/public*
 
 Method | HTTP request | Description
 ------------- | ------------- | -------------
-[**GetSchema**](PublicApi.md#GetSchema) | **Get** /schemas/{id} |
+[**GetSchema**](PublicApi.md#GetSchema) | **Get** /schemas/{id} | 
 [**GetSelfServiceError**](PublicApi.md#GetSelfServiceError) | **Get** /self-service/errors | Get User-Facing Self-Service Errors
 [**GetSelfServiceLoginFlow**](PublicApi.md#GetSelfServiceLoginFlow) | **Get** /self-service/login/flows | Get Login Flow
 [**GetSelfServiceRecoveryFlow**](PublicApi.md#GetSelfServiceRecoveryFlow) | **Get** /self-service/recovery/flows | Get information about a recovery flow
@@ -74,7 +74,7 @@ func main() {
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
 **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
-**id** | **string** | ID must be set to the ID of schema you want to get |
+**id** | **string** | ID must be set to the ID of schema you want to get | 
 
 ### Other Parameters
 
@@ -149,7 +149,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceErrorRequest
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **error_** | **string** | Error is the container&#39;s ID |
+ **error_** | **string** | Error is the container&#39;s ID | 
 
 ### Return type
 
@@ -215,7 +215,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceLoginFlowReq
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **id** | **string** | The Login Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/login?flow&#x3D;abcde&#x60;). |
+ **id** | **string** | The Login Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/login?flow&#x3D;abcde&#x60;). | 
 
 ### Return type
 
@@ -281,7 +281,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceRecoveryFlow
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **id** | **string** | The Flow ID  The value for this parameter comes from &#x60;request&#x60; URL Query parameter sent to your application (e.g. &#x60;/recovery?flow&#x3D;abcde&#x60;). |
+ **id** | **string** | The Flow ID  The value for this parameter comes from &#x60;request&#x60; URL Query parameter sent to your application (e.g. &#x60;/recovery?flow&#x3D;abcde&#x60;). | 
 
 ### Return type
 
@@ -347,7 +347,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceRegistration
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **id** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). |
+ **id** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). | 
 
 ### Return type
 
@@ -413,7 +413,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceSettingsFlow
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **id** | **string** | ID is the Settings Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/settings?flow&#x3D;abcde&#x60;). |
+ **id** | **string** | ID is the Settings Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/settings?flow&#x3D;abcde&#x60;). | 
 
 ### Return type
 
@@ -479,7 +479,7 @@ Other parameters are passed through a pointer to a apiGetSelfServiceVerification
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **id** | **string** | The Flow ID  The value for this parameter comes from &#x60;request&#x60; URL Query parameter sent to your application (e.g. &#x60;/verification?flow&#x3D;abcde&#x60;). |
+ **id** | **string** | The Flow ID  The value for this parameter comes from &#x60;request&#x60; URL Query parameter sent to your application (e.g. &#x60;/verification?flow&#x3D;abcde&#x60;). | 
 
 ### Return type
 
@@ -604,7 +604,7 @@ Other parameters are passed through a pointer to a apiInitializeSelfServiceLogin
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **refresh** | **bool** | Refresh a login session  If set to true, this will refresh an existing login session by asking the user to sign in again. This will reset the authenticated_at time of the session. |
+ **refresh** | **bool** | Refresh a login session  If set to true, this will refresh an existing login session by asking the user to sign in again. This will reset the authenticated_at time of the session. | 
 
 ### Return type
 
@@ -1184,7 +1184,7 @@ import (
 )
 
 func main() {
-    revokeSession := *openapiclient.NewRevokeSession("SessionToken_example") // RevokeSession |
+    revokeSession := *openapiclient.NewRevokeSession("SessionToken_example") // RevokeSession | 
 
     configuration := openapiclient.NewConfiguration()
     apiClient := openapiclient.NewAPIClient(configuration)
@@ -1207,7 +1207,7 @@ Other parameters are passed through a pointer to a apiRevokeSessionRequest struc
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **revokeSession** | [**RevokeSession**](RevokeSession.md) |  |
+ **revokeSession** | [**RevokeSession**](RevokeSession.md) |  | 
 
 ### Return type
 
@@ -1274,8 +1274,8 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceLoginFlow
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **flow** | **string** | The Login Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/login?flow&#x3D;abcde&#x60;). |
- **submitSelfServiceLoginFlow** | [**SubmitSelfServiceLoginFlow**](SubmitSelfServiceLoginFlow.md) |  |
+ **flow** | **string** | The Login Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/login?flow&#x3D;abcde&#x60;). | 
+ **submitSelfServiceLoginFlow** | [**SubmitSelfServiceLoginFlow**](SubmitSelfServiceLoginFlow.md) |  | 
 
 ### Return type
 
@@ -1340,8 +1340,8 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceRecoveryF
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). |
- **body** | **map[string]interface{}** |  |
+ **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). | 
+ **body** | **map[string]interface{}** |  | 
 
 ### Return type
 
@@ -1407,9 +1407,9 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceRecoveryF
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **token** | **string** | Recovery Token  The recovery token which completes the recovery request. If the token is invalid (e.g. expired) an error will be shown to the end-user. |
- **flow** | **string** | The Flow ID  format: uuid |
- **submitSelfServiceRecoveryFlowWithLinkMethod** | [**SubmitSelfServiceRecoveryFlowWithLinkMethod**](SubmitSelfServiceRecoveryFlowWithLinkMethod.md) |  |
+ **token** | **string** | Recovery Token  The recovery token which completes the recovery request. If the token is invalid (e.g. expired) an error will be shown to the end-user. | 
+ **flow** | **string** | The Flow ID  format: uuid | 
+ **submitSelfServiceRecoveryFlowWithLinkMethod** | [**SubmitSelfServiceRecoveryFlowWithLinkMethod**](SubmitSelfServiceRecoveryFlowWithLinkMethod.md) |  | 
 
 ### Return type
 
@@ -1451,7 +1451,7 @@ import (
 
 func main() {
     flow := "flow_example" // string | The Registration Flow ID  The value for this parameter comes from `flow` URL Query parameter sent to your application (e.g. `/registration?flow=abcde`).
-    submitSelfServiceRegistrationFlow := openapiclient.submitSelfServiceRegistrationFlow{SubmitSelfServiceRegistrationFlowWithPasswordMethod: openapiclient.NewSubmitSelfServiceRegistrationFlowWithPasswordMethod()} // SubmitSelfServiceRegistrationFlow |  (optional)
+    submitSelfServiceRegistrationFlow := openapiclient.submitSelfServiceRegistrationFlow{SubmitSelfServiceRegistrationFlowWithPasswordMethod: openapiclient.NewSubmitSelfServiceRegistrationFlowWithPasswordMethod("Method_example")} // SubmitSelfServiceRegistrationFlow |  (optional)
 
     configuration := openapiclient.NewConfiguration()
     apiClient := openapiclient.NewAPIClient(configuration)
@@ -1476,8 +1476,8 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceRegistrat
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). |
- **submitSelfServiceRegistrationFlow** | [**SubmitSelfServiceRegistrationFlow**](SubmitSelfServiceRegistrationFlow.md) |  |
+ **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). | 
+ **submitSelfServiceRegistrationFlow** | [**SubmitSelfServiceRegistrationFlow**](SubmitSelfServiceRegistrationFlow.md) |  | 
 
 ### Return type
 
@@ -1544,8 +1544,8 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceSettingsF
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **flow** | **string** | The Settings Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/settings?flow&#x3D;abcde&#x60;). |
- **submitSelfServiceSettingsFlow** | [**SubmitSelfServiceSettingsFlow**](SubmitSelfServiceSettingsFlow.md) |  |
+ **flow** | **string** | The Settings Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/settings?flow&#x3D;abcde&#x60;). | 
+ **submitSelfServiceSettingsFlow** | [**SubmitSelfServiceSettingsFlow**](SubmitSelfServiceSettingsFlow.md) |  | 
 
 ### Return type
 
@@ -1610,8 +1610,8 @@ Other parameters are passed through a pointer to a apiSubmitSelfServiceVerificat
 
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
- **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). |
- **body** | **map[string]interface{}** |  |
+ **flow** | **string** | The Registration Flow ID  The value for this parameter comes from &#x60;flow&#x60; URL Query parameter sent to your application (e.g. &#x60;/registration?flow&#x3D;abcde&#x60;). | 
+ **body** | **map[string]interface{}** |  | 
 
 ### Return type
 
@@ -1669,14 +1669,17 @@ func main() {
 
 ### Path Parameters
 
+
+
 ### Other Parameters
 
 Other parameters are passed through a pointer to a apiWhoamiRequest struct via the builder pattern
 
+
 Name | Type | Description  | Notes
 ------------- | ------------- | ------------- | -------------
-**cookie** | **string** |  |
-**authorization** | **string** |  |
+ **cookie** | **string** |  | 
+ **authorization** | **string** |  | 
 
 ### Return type
 
diff --git a/internal/httpclient/docs/RecoveryFlow.md b/internal/httpclient/docs/RecoveryFlow.md
index 6560abeb5..a281689a0 100644
--- a/internal/httpclient/docs/RecoveryFlow.md
+++ b/internal/httpclient/docs/RecoveryFlow.md
@@ -4,17 +4,14 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**Active** | Pointer to **
-string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional]
-**ExpiresAt** | **
-time.Time** | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to update the setting, a new request has to be initiated. |
-**Id** | **string** |  |
-**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the request occurred. |
-**RequestUrl** | **
-string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. |
-**State** | **string** |  |
-**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional]
-**Ui** | [**UiContainer**](UiContainer.md) |  |
+**Active** | Pointer to **string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional] 
+**ExpiresAt** | **time.Time** | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to update the setting, a new request has to be initiated. | 
+**Id** | **string** |  | 
+**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the request occurred. | 
+**RequestUrl** | **string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | 
+**State** | **string** |  | 
+**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional] 
+**Ui** | [**UiContainer**](UiContainer.md) |  | 
 
 ## Methods
 
@@ -22,8 +19,9 @@ string** | RequestURL is the initial URL that was requested from Ory Kratos. It
 
 `func NewRecoveryFlow(expiresAt time.Time, id string, issuedAt time.Time, requestUrl string, state string, ui UiContainer, ) *RecoveryFlow`
 
-NewRecoveryFlow instantiates a new RecoveryFlow object This constructor will assign default values to properties that
-have it defined, and makes sure properties required by API are set, but the set of arguments
+NewRecoveryFlow instantiates a new RecoveryFlow object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
 will change when the set of required properties is changed
 
 ### NewRecoveryFlowWithDefaults
diff --git a/internal/httpclient/docs/RegistrationFlow.md b/internal/httpclient/docs/RegistrationFlow.md
index d91c92e95..1341a1183 100644
--- a/internal/httpclient/docs/RegistrationFlow.md
+++ b/internal/httpclient/docs/RegistrationFlow.md
@@ -4,15 +4,13 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**Active** | Pointer to **string** | and so on. | [optional]
-**ExpiresAt** | **
-time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated. |
-**Id** | **string** |  |
-**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow occurred. |
-**RequestUrl** | **
-string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. |
-**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional]
-**Ui** | [**UiContainer**](UiContainer.md) |  |
+**Active** | Pointer to **string** | and so on. | [optional] 
+**ExpiresAt** | **time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated. | 
+**Id** | **string** |  | 
+**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow occurred. | 
+**RequestUrl** | **string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | 
+**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional] 
+**Ui** | [**UiContainer**](UiContainer.md) |  | 
 
 ## Methods
 
@@ -20,8 +18,9 @@ string** | RequestURL is the initial URL that was requested from Ory Kratos. It
 
 `func NewRegistrationFlow(expiresAt time.Time, id string, issuedAt time.Time, requestUrl string, ui UiContainer, ) *RegistrationFlow`
 
-NewRegistrationFlow instantiates a new RegistrationFlow object This constructor will assign default values to properties
-that have it defined, and makes sure properties required by API are set, but the set of arguments
+NewRegistrationFlow instantiates a new RegistrationFlow object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
 will change when the set of required properties is changed
 
 ### NewRegistrationFlowWithDefaults
diff --git a/internal/httpclient/docs/SettingsFlow.md b/internal/httpclient/docs/SettingsFlow.md
index cd782e9c4..66be4475a 100644
--- a/internal/httpclient/docs/SettingsFlow.md
+++ b/internal/httpclient/docs/SettingsFlow.md
@@ -4,18 +4,15 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**Active** | Pointer to **
-string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional]
-**ExpiresAt** | **
-time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to update the setting, a new flow has to be initiated. |
-**Id** | **string** |  |
-**Identity** | [**Identity**](Identity.md) |  |
-**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow occurred. |
-**RequestUrl** | **
-string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. |
-**State** | **string** |  |
-**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional]
-**Ui** | [**UiContainer**](UiContainer.md) |  |
+**Active** | Pointer to **string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional] 
+**ExpiresAt** | **time.Time** | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to update the setting, a new flow has to be initiated. | 
+**Id** | **string** |  | 
+**Identity** | [**Identity**](Identity.md) |  | 
+**IssuedAt** | **time.Time** | IssuedAt is the time (UTC) when the flow occurred. | 
+**RequestUrl** | **string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | 
+**State** | **string** |  | 
+**Type** | Pointer to **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | [optional] 
+**Ui** | [**UiContainer**](UiContainer.md) |  | 
 
 ## Methods
 
@@ -23,8 +20,9 @@ string** | RequestURL is the initial URL that was requested from Ory Kratos. It
 
 `func NewSettingsFlow(expiresAt time.Time, id string, identity Identity, issuedAt time.Time, requestUrl string, state string, ui UiContainer, ) *SettingsFlow`
 
-NewSettingsFlow instantiates a new SettingsFlow object This constructor will assign default values to properties that
-have it defined, and makes sure properties required by API are set, but the set of arguments
+NewSettingsFlow instantiates a new SettingsFlow object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
 will change when the set of required properties is changed
 
 ### NewSettingsFlowWithDefaults
diff --git a/internal/httpclient/docs/SubmitSelfServiceRegistrationFlow.md b/internal/httpclient/docs/SubmitSelfServiceRegistrationFlow.md
index 5fec7737e..a91d8ad17 100644
--- a/internal/httpclient/docs/SubmitSelfServiceRegistrationFlow.md
+++ b/internal/httpclient/docs/SubmitSelfServiceRegistrationFlow.md
@@ -4,15 +4,16 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**CsrfToken** | Pointer to **string** |  | [optional] 
-**Password** | Pointer to **string** |  | [optional] 
-**Traits** | Pointer to **map[string]interface{}** |  | [optional] 
+**CsrfToken** | Pointer to **string** | The CSRF Token | [optional] 
+**Method** | **string** | Method to use  This field must be set to &#x60;password&#x60; when using the password method. | 
+**Password** | Pointer to **string** | Password to sign the user up with | [optional] 
+**Traits** | Pointer to **map[string]interface{}** | The identity&#39;s traits | [optional] 
 
 ## Methods
 
 ### NewSubmitSelfServiceRegistrationFlow
 
-`func NewSubmitSelfServiceRegistrationFlow() *SubmitSelfServiceRegistrationFlow`
+`func NewSubmitSelfServiceRegistrationFlow(method string, ) *SubmitSelfServiceRegistrationFlow`
 
 NewSubmitSelfServiceRegistrationFlow instantiates a new SubmitSelfServiceRegistrationFlow object
 This constructor will assign default values to properties that have it defined,
@@ -52,6 +53,26 @@ SetCsrfToken sets CsrfToken field to given value.
 
 HasCsrfToken returns a boolean if a field has been set.
 
+### GetMethod
+
+`func (o *SubmitSelfServiceRegistrationFlow) GetMethod() string`
+
+GetMethod returns the Method field if non-nil, zero value otherwise.
+
+### GetMethodOk
+
+`func (o *SubmitSelfServiceRegistrationFlow) GetMethodOk() (*string, bool)`
+
+GetMethodOk returns a tuple with the Method field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMethod
+
+`func (o *SubmitSelfServiceRegistrationFlow) SetMethod(v string)`
+
+SetMethod sets Method field to given value.
+
+
 ### GetPassword
 
 `func (o *SubmitSelfServiceRegistrationFlow) GetPassword() string`
diff --git a/internal/httpclient/docs/SubmitSelfServiceRegistrationFlowWithPasswordMethod.md b/internal/httpclient/docs/SubmitSelfServiceRegistrationFlowWithPasswordMethod.md
index 5870d6af4..3bba48852 100644
--- a/internal/httpclient/docs/SubmitSelfServiceRegistrationFlowWithPasswordMethod.md
+++ b/internal/httpclient/docs/SubmitSelfServiceRegistrationFlowWithPasswordMethod.md
@@ -4,15 +4,16 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**CsrfToken** | Pointer to **string** |  | [optional] 
-**Password** | Pointer to **string** |  | [optional] 
-**Traits** | Pointer to **map[string]interface{}** |  | [optional] 
+**CsrfToken** | Pointer to **string** | The CSRF Token | [optional] 
+**Method** | **string** | Method to use  This field must be set to &#x60;password&#x60; when using the password method. | 
+**Password** | Pointer to **string** | Password to sign the user up with | [optional] 
+**Traits** | Pointer to **map[string]interface{}** | The identity&#39;s traits | [optional] 
 
 ## Methods
 
 ### NewSubmitSelfServiceRegistrationFlowWithPasswordMethod
 
-`func NewSubmitSelfServiceRegistrationFlowWithPasswordMethod() *SubmitSelfServiceRegistrationFlowWithPasswordMethod`
+`func NewSubmitSelfServiceRegistrationFlowWithPasswordMethod(method string, ) *SubmitSelfServiceRegistrationFlowWithPasswordMethod`
 
 NewSubmitSelfServiceRegistrationFlowWithPasswordMethod instantiates a new SubmitSelfServiceRegistrationFlowWithPasswordMethod object
 This constructor will assign default values to properties that have it defined,
@@ -52,6 +53,26 @@ SetCsrfToken sets CsrfToken field to given value.
 
 HasCsrfToken returns a boolean if a field has been set.
 
+### GetMethod
+
+`func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetMethod() string`
+
+GetMethod returns the Method field if non-nil, zero value otherwise.
+
+### GetMethodOk
+
+`func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetMethodOk() (*string, bool)`
+
+GetMethodOk returns a tuple with the Method field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMethod
+
+`func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) SetMethod(v string)`
+
+SetMethod sets Method field to given value.
+
+
 ### GetPassword
 
 `func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetPassword() string`
diff --git a/internal/httpclient/docs/VerificationFlow.md b/internal/httpclient/docs/VerificationFlow.md
index 6a91b7731..42faa408a 100644
--- a/internal/httpclient/docs/VerificationFlow.md
+++ b/internal/httpclient/docs/VerificationFlow.md
@@ -4,17 +4,14 @@
 
 Name | Type | Description | Notes
 ------------ | ------------- | ------------- | -------------
-**Active** | Pointer to **
-string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional]
-**ExpiresAt** | Pointer to **
-time.Time** | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to verify the address, a new request has to be initiated. | [optional]
-**Id** | **string** |  |
-**IssuedAt** | Pointer to **time.Time** | IssuedAt is the time (UTC) when the request occurred. | [optional]
-**RequestUrl** | Pointer to **
-string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | [optional]
-**State** | **string** |  |
-**Type** | **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. |
-**Ui** | [**UiContainer**](UiContainer.md) |  |
+**Active** | Pointer to **string** | Active, if set, contains the registration method that is being used. It is initially not set. | [optional] 
+**ExpiresAt** | Pointer to **time.Time** | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to verify the address, a new request has to be initiated. | [optional] 
+**Id** | **string** |  | 
+**IssuedAt** | Pointer to **time.Time** | IssuedAt is the time (UTC) when the request occurred. | [optional] 
+**RequestUrl** | Pointer to **string** | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL&#39;s path or query for example. | [optional] 
+**State** | **string** |  | 
+**Type** | **string** | The flow type can either be &#x60;api&#x60; or &#x60;browser&#x60;. | 
+**Ui** | [**UiContainer**](UiContainer.md) |  | 
 
 ## Methods
 
@@ -22,8 +19,9 @@ string** | RequestURL is the initial URL that was requested from Ory Kratos. It
 
 `func NewVerificationFlow(id string, state string, type_ string, ui UiContainer, ) *VerificationFlow`
 
-NewVerificationFlow instantiates a new VerificationFlow object This constructor will assign default values to properties
-that have it defined, and makes sure properties required by API are set, but the set of arguments
+NewVerificationFlow instantiates a new VerificationFlow object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
 will change when the set of required properties is changed
 
 ### NewVerificationFlowWithDefaults
diff --git a/internal/httpclient/model_submit_self_service_registration_flow_with_password_method.go b/internal/httpclient/model_submit_self_service_registration_flow_with_password_method.go
index c019ee3ae..1081a3c33 100644
--- a/internal/httpclient/model_submit_self_service_registration_flow_with_password_method.go
+++ b/internal/httpclient/model_submit_self_service_registration_flow_with_password_method.go
@@ -15,19 +15,25 @@ import (
 	"encoding/json"
 )
 
-// SubmitSelfServiceRegistrationFlowWithPasswordMethod struct for SubmitSelfServiceRegistrationFlowWithPasswordMethod
+// SubmitSelfServiceRegistrationFlowWithPasswordMethod SubmitSelfServiceRegistrationFlowWithPasswordMethod is used to decode the registration form payload when using the password method.
 type SubmitSelfServiceRegistrationFlowWithPasswordMethod struct {
-	CsrfToken *string                `json:"csrf_token,omitempty"`
-	Password  *string                `json:"password,omitempty"`
-	Traits    map[string]interface{} `json:"traits,omitempty"`
+	// The CSRF Token
+	CsrfToken *string `json:"csrf_token,omitempty"`
+	// Method to use  This field must be set to `password` when using the password method.
+	Method string `json:"method"`
+	// Password to sign the user up with
+	Password *string `json:"password,omitempty"`
+	// The identity's traits
+	Traits map[string]interface{} `json:"traits,omitempty"`
 }
 
 // NewSubmitSelfServiceRegistrationFlowWithPasswordMethod instantiates a new SubmitSelfServiceRegistrationFlowWithPasswordMethod object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewSubmitSelfServiceRegistrationFlowWithPasswordMethod() *SubmitSelfServiceRegistrationFlowWithPasswordMethod {
+func NewSubmitSelfServiceRegistrationFlowWithPasswordMethod(method string) *SubmitSelfServiceRegistrationFlowWithPasswordMethod {
 	this := SubmitSelfServiceRegistrationFlowWithPasswordMethod{}
+	this.Method = method
 	return &this
 }
 
@@ -71,6 +77,30 @@ func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) SetCsrfToken(v str
 	o.CsrfToken = &v
 }
 
+// GetMethod returns the Method field value
+func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetMethod() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Method
+}
+
+// GetMethodOk returns a tuple with the Method field value
+// and a boolean to check if the value has been set.
+func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetMethodOk() (*string, bool) {
+	if o == nil {
+		return nil, false
+	}
+	return &o.Method, true
+}
+
+// SetMethod sets field value
+func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) SetMethod(v string) {
+	o.Method = v
+}
+
 // GetPassword returns the Password field value if set, zero value otherwise.
 func (o *SubmitSelfServiceRegistrationFlowWithPasswordMethod) GetPassword() string {
 	if o == nil || o.Password == nil {
@@ -140,6 +170,9 @@ func (o SubmitSelfServiceRegistrationFlowWithPasswordMethod) MarshalJSON() ([]by
 	if o.CsrfToken != nil {
 		toSerialize["csrf_token"] = o.CsrfToken
 	}
+	if true {
+		toSerialize["method"] = o.Method
+	}
 	if o.Password != nil {
 		toSerialize["password"] = o.Password
 	}
diff --git a/schema/errors.go b/schema/errors.go
index 8be4f0319..baf82f4d9 100644
--- a/schema/errors.go
+++ b/schema/errors.go
@@ -80,6 +80,16 @@ func NewPasswordPolicyViolationError(instancePtr string, reason string) error {
 	})
 }
 
+func NewMissingIdentifierError() error {
+	return errors.WithStack(&ValidationError{
+		ValidationError: &jsonschema.ValidationError{
+			Message:     "could not find any identifiers",
+			InstancePtr: "#/",
+		},
+		Messages: new(text.Messages).Add(text.NewErrorValidationIdentifierMissing()),
+	})
+}
+
 type ValidationErrorContextInvalidCredentialsError struct{}
 
 func (r *ValidationErrorContextInvalidCredentialsError) AddContext(_, _ string) {}
@@ -127,7 +137,7 @@ func NewNoLoginStrategyResponsible() error {
 func NewNoRegistrationStrategyResponsible() error {
 	return errors.WithStack(&ValidationError{
 		ValidationError: &jsonschema.ValidationError{
-			Message:     `could not find a strategy to sing up with`,
+			Message:     `could not find a strategy to sign up with`,
 			InstancePtr: "#/",
 		},
 		Messages: new(text.Messages).Add(text.NewErrorValidationRegistrationNoStrategyFound()),
diff --git a/selfservice/flow/recovery/handler.go b/selfservice/flow/recovery/handler.go
index a8d1c5bfa..205bb1a2b 100644
--- a/selfservice/flow/recovery/handler.go
+++ b/selfservice/flow/recovery/handler.go
@@ -223,7 +223,7 @@ func (h *Handler) fetch(w http.ResponseWriter, r *http.Request, _ httprouter.Par
 
 // nolint:deadcode,unused
 // swagger:parameters submitSelfServiceRecoveryFlow
-type submitSelfServiceRegistrationFlow struct {
+type submitSelfServiceRecoveryFlow struct {
 	// The Registration Flow ID
 	//
 	// The value for this parameter comes from `flow` URL Query parameter sent to your
diff --git a/selfservice/flow/registration/handler.go b/selfservice/flow/registration/handler.go
index d32f55424..43009ea48 100644
--- a/selfservice/flow/registration/handler.go
+++ b/selfservice/flow/registration/handler.go
@@ -183,7 +183,7 @@ func (h *Handler) initBrowserFlow(w http.ResponseWriter, r *http.Request, ps htt
 
 // nolint:deadcode,unused
 // swagger:parameters getSelfServiceRegistrationFlow
-type getSelfServiceRegistrationFlowParameters struct {
+type getSelfServiceRegistrationFlow struct {
 	// The Registration Flow ID
 	//
 	// The value for this parameter comes from `flow` URL Query parameter sent to your
@@ -318,8 +318,7 @@ func (h *Handler) submitFlow(w http.ResponseWriter, r *http.Request, _ httproute
 	}
 
 	i := identity.NewIdentity(config.DefaultIdentityTraitsSchemaID)
-	var found bool
-	var s identity.CredentialsType
+	var s Strategy
 	for _, ss := range h.d.AllRegistrationStrategies() {
 		if err := ss.Register(w, r, f, i); errors.Is(err, flow.ErrStrategyNotResponsible) {
 			continue
@@ -330,18 +329,17 @@ func (h *Handler) submitFlow(w http.ResponseWriter, r *http.Request, _ httproute
 			return
 		}
 
-		s = ss.ID()
-		found = true
+		s = ss
 		break
 	}
 
-	if !found {
+	if s == nil {
 		h.d.RegistrationFlowErrorHandler().WriteFlowError(w, r, f, node.DefaultGroup, errors.WithStack(schema.NewNoRegistrationStrategyResponsible()))
 		return
 	}
 
-	if err := h.d.RegistrationExecutor().PostRegistrationHook(w, r, s, f, i); err != nil {
-		h.d.SelfServiceErrorManager().Forward(r.Context(), w, r, err)
+	if err := h.d.RegistrationExecutor().PostRegistrationHook(w, r, s.ID(), f, i); err != nil {
+		h.d.RegistrationFlowErrorHandler().WriteFlowError(w, r, f, s.NodeGroup(), err)
 		return
 	}
 }
diff --git a/selfservice/flow/settings/hook.go b/selfservice/flow/settings/hook.go
index efbcea87c..27c190219 100644
--- a/selfservice/flow/settings/hook.go
+++ b/selfservice/flow/settings/hook.go
@@ -39,6 +39,7 @@ type (
 		identity.ValidationProvider
 		config.Provider
 
+		HandlerProvider
 		HooksProvider
 		FlowPersistenceProvider
 
@@ -155,6 +156,12 @@ func (e *HookExecutor) PostSettingsHook(w http.ResponseWriter, r *http.Request,
 		}
 	}
 
+	newFlow, err := e.d.SettingsHandler().NewFlow(w, r, i, ctxUpdate.Flow.Type)
+	if err != nil {
+		return err
+	}
+
+	ctxUpdate.Flow.UI = newFlow.UI
 	ctxUpdate.Flow.UI.ResetMessages()
 	ctxUpdate.Flow.UI.AddMessage(node.DefaultGroup, text.NewInfoSelfServiceSettingsUpdateSuccess())
 	if err := e.d.SettingsFlowPersister().UpdateSettingsFlow(r.Context(), ctxUpdate.Flow); err != nil {
diff --git a/selfservice/strategy/password/registration.go b/selfservice/strategy/password/registration.go
index 2539beb4b..d9cda5841 100644
--- a/selfservice/strategy/password/registration.go
+++ b/selfservice/strategy/password/registration.go
@@ -22,19 +22,32 @@ import (
 	"github.com/ory/x/errorsx"
 )
 
-// RegistrationFormPayload is used to decode the registration form payload.
+// SubmitSelfServiceRegistrationFlowWithPasswordMethod is used to decode the registration form payload
+// when using the password method.
 //
 // swagger:model submitSelfServiceRegistrationFlowWithPasswordMethod
-type RegistrationFormPayload struct {
-	Password  string          `json:"password"`
-	Traits    json.RawMessage `json:"traits"`
-	CSRFToken string          `json:"csrf_token"`
+type SubmitSelfServiceRegistrationFlowWithPasswordMethod struct {
+	// Password to sign the user up with
+	Password string `json:"password"`
+
+	// The identity's traits
+	Traits json.RawMessage `json:"traits"`
+
+	// The CSRF Token
+	CSRFToken string `json:"csrf_token"`
+
+	// Method to use
+	//
+	// This field must be set to `password` when using the password method.
+	//
+	// required: true
+	Method string `json:"method"`
 }
 
 func (s *Strategy) RegisterRegistrationRoutes(_ *x.RouterPublic) {
 }
 
-func (s *Strategy) handleRegistrationError(_ http.ResponseWriter, r *http.Request, f *registration.Flow, p *RegistrationFormPayload, err error) error {
+func (s *Strategy) handleRegistrationError(_ http.ResponseWriter, r *http.Request, f *registration.Flow, p *SubmitSelfServiceRegistrationFlowWithPasswordMethod, err error) error {
 	if f != nil {
 		if p != nil {
 			for _, n := range container.NewFromJSON("", node.PasswordGroup, p.Traits, "traits").Nodes {
@@ -51,7 +64,7 @@ func (s *Strategy) handleRegistrationError(_ http.ResponseWriter, r *http.Reques
 	return err
 }
 
-func (s *Strategy) decode(p *RegistrationFormPayload, r *http.Request) error {
+func (s *Strategy) decode(p *SubmitSelfServiceRegistrationFlowWithPasswordMethod, r *http.Request) error {
 	raw, err := sjson.SetBytes(registrationSchema,
 		"properties.traits.$ref", s.d.Config(r.Context()).DefaultIdentityTraitsSchemaURL().String()+"#/properties/traits")
 	if err != nil {
@@ -71,7 +84,7 @@ func (s *Strategy) Register(w http.ResponseWriter, r *http.Request, f *registrat
 		return err
 	}
 
-	var p RegistrationFormPayload
+	var p SubmitSelfServiceRegistrationFlowWithPasswordMethod
 	if err := s.decode(&p, r); err != nil {
 		return s.handleRegistrationError(w, r, f, &p, err)
 	}
@@ -105,10 +118,6 @@ func (s *Strategy) Register(w http.ResponseWriter, r *http.Request, f *registrat
 		return s.handleRegistrationError(w, r, f, &p, err)
 	}
 
-	if err := s.d.RegistrationExecutor().PostRegistrationHook(w, r, identity.CredentialsTypePassword, f, i); err != nil {
-		return s.handleRegistrationError(w, r, f, &p, err)
-	}
-
 	return nil
 }
 
@@ -122,7 +131,7 @@ func (s *Strategy) validateCredentials(ctx context.Context, i *identity.Identity
 		// This should never happen
 		return errors.WithStack(x.PseudoPanic.WithReasonf("identity object did not provide the %s CredentialType unexpectedly", identity.CredentialsTypePassword))
 	} else if len(c.Identifiers) == 0 {
-		return errors.WithStack(herodot.ErrInternalServerError.WithReasonf("No login identifiers (e.g. email, phone number, username) were set. Contact an administrator, the identity schema is misconfigured."))
+		return schema.NewMissingIdentifierError()
 	}
 
 	for _, id := range c.Identifiers {
diff --git a/spec/openapi.json b/spec/openapi.json
index 30fdda887..faed5296d 100644
--- a/spec/openapi.json
+++ b/spec/openapi.json
@@ -1526,18 +1526,28 @@
         ]
       },
       "submitSelfServiceRegistrationFlowWithPasswordMethod": {
+        "description": "SubmitSelfServiceRegistrationFlowWithPasswordMethod is used to decode the registration form payload\nwhen using the password method.",
         "properties": {
           "csrf_token": {
+            "description": "The CSRF Token",
+            "type": "string"
+          },
+          "method": {
+            "description": "Method to use\n\nThis field must be set to `password` when using the password method.",
             "type": "string"
           },
           "password": {
+            "description": "Password to sign the user up with",
             "type": "string"
           },
           "traits": {
+            "description": "The identity's traits",
             "type": "object"
           }
         },
-        "title": "RegistrationFormPayload is used to decode the registration form payload.",
+        "required": [
+          "method"
+        ],
         "type": "object"
       },
       "submitSelfServiceSettingsFlow": {
@@ -2266,7 +2276,7 @@
             "$ref": "#/components/responses/emptyResponse"
           }
         },
-        "summary": "Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
+        "summary": "Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
         "tags": [
           "admin"
         ]
diff --git a/spec/swagger.json b/spec/swagger.json
index 656d679c6..bfbe6be90 100755
--- a/spec/swagger.json
+++ b/spec/swagger.json
@@ -330,7 +330,7 @@
         "tags": [
           "admin"
         ],
-        "summary": "Get snapshot metrics from the Hydra service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
+        "summary": "Get snapshot metrics from the Kratos service. If you're using k8s, you can then add annotations to\nyour deployment like so:",
         "operationId": "prometheus",
         "responses": {
           "200": {
@@ -3079,16 +3079,26 @@
       "type": "object"
     },
     "submitSelfServiceRegistrationFlowWithPasswordMethod": {
+      "description": "SubmitSelfServiceRegistrationFlowWithPasswordMethod is used to decode the registration form payload\nwhen using the password method.",
       "type": "object",
-      "title": "RegistrationFormPayload is used to decode the registration form payload.",
+      "required": [
+        "method"
+      ],
       "properties": {
         "csrf_token": {
+          "description": "The CSRF Token",
+          "type": "string"
+        },
+        "method": {
+          "description": "Method to use\n\nThis field must be set to `password` when using the password method.",
           "type": "string"
         },
         "password": {
+          "description": "Password to sign the user up with",
           "type": "string"
         },
         "traits": {
+          "description": "The identity's traits",
           "type": "object"
         }
       }
diff --git a/text/message_validation.go b/text/message_validation.go
index 2dc80c5c1..290d0ddd0 100644
--- a/text/message_validation.go
+++ b/text/message_validation.go
@@ -14,6 +14,7 @@ const (
 	ErrorValidationInvalidCredentials
 	ErrorValidationDuplicateCredentials
 	ErrorValidationTOTPVerifierWrong
+	ErrorValidationIdentifierMissing
 )
 
 func NewValidationErrorGeneric(reason string) *Message {
@@ -97,3 +98,11 @@ func NewErrorValidationTOTPVerifierWrong() *Message {
 		Context: context(nil),
 	}
 }
+
+func NewErrorValidationIdentifierMissing() *Message {
+	return &Message{
+		ID:   ErrorValidationIdentifierMissing,
+		Text: "Could not find any login identifiers. Did you forget to set them?",
+		Type: Error,
+	}
+}
diff --git a/ui/container/container.go b/ui/container/container.go
index 30e8cefac..0602b595f 100644
--- a/ui/container/container.go
+++ b/ui/container/container.go
@@ -108,6 +108,10 @@ func NodesFromJSONSchema(group node.Group, jsonSchemaRef, prefix string, compile
 
 	nodes := node.Nodes{}
 	for _, value := range paths {
+		if value.TypeHint == jsonschemax.JSON {
+			continue
+		}
+
 		name := addPrefix(value.Name, prefix, ".")
 		nodes = append(nodes, node.NewInputFieldFromSchema(name, group, value))
 	}
diff --git a/x/cookie.go b/x/cookie.go
index 9aa29d971..0416332d4 100644
--- a/x/cookie.go
+++ b/x/cookie.go
@@ -63,6 +63,8 @@ func SessionUnsetKey(w http.ResponseWriter, r *http.Request, s sessions.Store, i
 	cookie, err := s.Get(r, id)
 	if err != nil {
 		return nil
+	} else if cookie.IsNew {
+		return nil
 	}
 
 	delete(cookie.Values, key)


Test patch:
diff --git a/selfservice/strategy/oidc/strategy_settings_test.go b/selfservice/strategy/oidc/strategy_settings_test.go
index 572f9ec94..5005f85c5 100644
--- a/selfservice/strategy/oidc/strategy_settings_test.go
+++ b/selfservice/strategy/oidc/strategy_settings_test.go
@@ -1306,17 +1306,17 @@ func TestSettingsStrategy(t *testing.T) {
       "disabled": false,
       "name": "unlink",
       "type": "submit",
-      "value": "ory"
+      "value": "github"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "ory"
+          "provider": "github"
         },
         "id": 1050003,
-        "text": "Unlink ory",
+        "text": "Unlink github",
         "type": "info"
       }
     },
@@ -1327,17 +1327,17 @@ func TestSettingsStrategy(t *testing.T) {
       "disabled": false,
       "name": "unlink",
       "type": "submit",
-      "value": "github"
+      "value": "google"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "github"
+          "provider": "google"
         },
         "id": 1050003,
-        "text": "Unlink github",
+        "text": "Unlink google",
         "type": "info"
       }
     },
@@ -1348,17 +1348,17 @@ func TestSettingsStrategy(t *testing.T) {
       "disabled": false,
       "name": "unlink",
       "type": "submit",
-      "value": "google"
+      "value": "ory"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "google"
+          "provider": "ory"
         },
         "id": 1050003,
-        "text": "Unlink google",
+        "text": "Unlink ory",
         "type": "info"
       }
     },
@@ -1481,17 +1481,17 @@ func TestSettingsStrategy(t *testing.T) {
       "disabled": false,
       "name": "link",
       "type": "submit",
-      "value": "ory"
+      "value": "github"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "ory"
+          "provider": "github"
         },
         "id": 1050002,
-        "text": "Link ory",
+        "text": "Link github",
         "type": "info"
       }
     },
@@ -1500,19 +1500,19 @@ func TestSettingsStrategy(t *testing.T) {
   {
     "attributes": {
       "disabled": false,
-      "name": "link",
+      "name": "unlink",
       "type": "submit",
-      "value": "github"
+      "value": "google"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "github"
+          "provider": "google"
         },
-        "id": 1050002,
-        "text": "Link github",
+        "id": 1050003,
+        "text": "Unlink google",
         "type": "info"
       }
     },
@@ -1521,19 +1521,19 @@ func TestSettingsStrategy(t *testing.T) {
   {
     "attributes": {
       "disabled": false,
-      "name": "unlink",
+      "name": "link",
       "type": "submit",
-      "value": "google"
+      "value": "ory"
     },
     "group": "oidc",
     "messages": null,
     "meta": {
       "label": {
         "context": {
-          "provider": "google"
+          "provider": "ory"
         },
-        "id": 1050003,
-        "text": "Unlink google",
+        "id": 1050002,
+        "text": "Link ory",
         "type": "info"
       }
     },
diff --git a/selfservice/strategy/password/registration_test.go b/selfservice/strategy/password/registration_test.go
index f3410b939..e208bd564 100644
--- a/selfservice/strategy/password/registration_test.go
+++ b/selfservice/strategy/password/registration_test.go
@@ -330,35 +330,23 @@ func TestRegistration(t *testing.T) {
 		t.Run("case=should fail because schema did not specify an identifier", func(t *testing.T) {
 			conf.MustSet(config.ViperKeyDefaultIdentitySchemaURL, "file://./stub/missing-identifier.schema.json")
 
-			var check = func(t *testing.T, actual string) {
-				assert.Equal(t, int64(http.StatusInternalServerError), gjson.Get(actual, "code").Int(), "%s", actual)
-				assert.Equal(t, "Internal Server Error", gjson.Get(actual, "status").String(), "%s", actual)
-				assert.Contains(t, gjson.Get(actual, "reason").String(), "No login identifiers", "%s", actual)
-			}
-
-			values := url.Values{
-				"method":          {"password"},
-				"traits.username": {"registration-identifier-6"},
-				"password":        {x.NewUUID().String()},
-				"traits.foobar":   {"bar"},
-				"csrf_token":      {x.FakeCSRFToken},
+			values := func(values url.Values) {
+				values.Set("method", "password")
+				values.Set("traits.username", "registration-identifier-6")
+				values.Set("password", x.NewUUID().String())
+				values.Set("traits.foobar", "bar")
 			}
 
 			t.Run("type=api", func(t *testing.T) {
-				f := testhelpers.InitializeRegistrationFlowViaAPI(t, apiClient, publicTS)
-
-				body, res := testhelpers.RegistrationMakeRequest(t, false, f, apiClient, values.Encode())
-				assert.Contains(t, res.Request.URL.String(), publicTS.URL)
-				check(t, gjson.Get(body, "error").Raw)
+				body := testhelpers.SubmitRegistrationForm(t, true, apiClient, publicTS, values,
+					identity.CredentialsTypePassword, http.StatusBadRequest,
+					publicTS.URL+registration.RouteSubmitFlow)
+				assert.Contains(t, gjson.Get(body, "ui.messages.0.text").String(), "Could not find any login identifiers. Did you forget to set them?", "%s", body)
 			})
 
 			t.Run("type=browser", func(t *testing.T) {
-				browserClient := testhelpers.NewClientWithCookies(t)
-				f := testhelpers.InitializeRegistrationFlowViaBrowser(t, browserClient, publicTS)
-
-				body, res := testhelpers.RegistrationMakeRequest(t, false, f, apiClient, values.Encode())
-				assert.Contains(t, res.Request.URL.String(), errTS.URL)
-				check(t, gjson.Get(body, "0").Raw)
+				body := expectValidationError(t, false, values)
+				assert.Contains(t, gjson.Get(body, "ui.messages.0.text").String(), "Could not find any login identifiers. Did you forget to set them?", "%s", body)
 			})
 		})
 
@@ -571,6 +559,33 @@ func TestRegistration(t *testing.T) {
 				assert.Equal(t, `registration-identifier-10-browser`, gjson.Get(actual, "identity.traits.username").String(), "%s", actual)
 			})
 		})
+
+		t.Run("case=should work with regular JSON", func(t *testing.T) {
+			conf.MustSet(config.ViperKeyDefaultIdentitySchemaURL, "file://stub/registration.schema.json")
+			conf.MustSet(config.HookStrategyKey(config.ViperKeySelfServiceRegistrationAfter, identity.CredentialsTypePassword.String()), []config.SelfServiceHook{{Name: "session"}})
+			t.Cleanup(func() {
+				conf.MustSet(config.HookStrategyKey(config.ViperKeySelfServiceRegistrationAfter, identity.CredentialsTypePassword.String()), nil)
+			})
+
+			hc := testhelpers.NewClientWithCookies(t)
+			hc.Transport = testhelpers.NewTransportWithLogger(hc.Transport, t)
+			payload := testhelpers.InitializeRegistrationFlowViaBrowser(t, hc, publicTS)
+			values := testhelpers.SDKFormFieldsToURLValues(payload.Ui.Nodes)
+			time.Sleep(time.Millisecond) // add a bit of delay to allow `1ns` to time out.
+
+			username := x.NewUUID()
+			actual, res := testhelpers.RegistrationMakeRequest(t, true, payload, hc, fmt.Sprintf(`{
+  "method": "password",
+  "csrf_token": "%s",
+  "password": "%s",
+  "traits": {
+    "foobar": "bar",
+    "username": "%s"
+  }
+}`, values.Get("csrf_token"), x.NewUUID(), username))
+			assert.EqualValues(t, http.StatusOK, res.StatusCode, assertx.PrettifyJSONPayload(t, actual))
+			assert.Equal(t, username.String(), gjson.Get(actual, "identity.traits.username").String(), "%s", actual)
+		})
 	})
 
 	t.Run("method=PopulateSignUpMethod", func(t *testing.T) {
diff --git a/test/e2e/cypress/integration/profiles/email/registration/success.spec.js b/test/e2e/cypress/integration/profiles/email/registration/success.spec.js
index 56c2064e0..a7e869f5d 100644
--- a/test/e2e/cypress/integration/profiles/email/registration/success.spec.js
+++ b/test/e2e/cypress/integration/profiles/email/registration/success.spec.js
@@ -9,6 +9,7 @@ context('Registration Flow Success', () => {
     const email = gen.email()
     const password = gen.password()
     const website = 'https://www.ory.sh/'
+    cy.get('input[name="traits"]').should('not.exist')
     cy.get('input[name="traits.email"]').type(email)
     cy.get('input[name="traits.website').type(website)
     cy.get('input[name="password"]').type(password)
diff --git a/test/e2e/cypress/integration/profiles/oidc/settings/success.spec.js b/test/e2e/cypress/integration/profiles/oidc/settings/success.spec.js
index 3241e4852..99d120954 100644
--- a/test/e2e/cypress/integration/profiles/oidc/settings/success.spec.js
+++ b/test/e2e/cypress/integration/profiles/oidc/settings/success.spec.js
@@ -55,7 +55,6 @@ context('Settings', () => {
 
       cy.get('input[name="password"]').type(gen.password())
       cy.get('button[value="password"]').click()
-      cy.visit(APP_URL + '/settings')
 
       cy.get('button[value="hydra"]')
         .should('have.attr', 'name', 'unlink')
diff --git a/ui/container/container_test.go b/ui/container/container_test.go
index 20614f57b..fc337d0fa 100644
--- a/ui/container/container_test.go
+++ b/ui/container/container_test.go
@@ -158,7 +158,6 @@ func TestContainer(t *testing.T) {
 					Nodes: node.Nodes{
 						node.NewInputField("numby", nil, node.DefaultGroup, node.InputAttributeTypeNumber),
 						node.NewInputField("objy.numby", nil, node.DefaultGroup, node.InputAttributeTypeNumber),
-						node.NewInputField("objy.objy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 						node.NewInputField("objy.stringy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 						node.NewInputField("stringy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 					},
@@ -171,7 +170,6 @@ func TestContainer(t *testing.T) {
 					Nodes: node.Nodes{
 						node.NewInputField("traits.numby", nil, node.DefaultGroup, node.InputAttributeTypeNumber),
 						node.NewInputField("traits.objy.numby", nil, node.DefaultGroup, node.InputAttributeTypeNumber),
-						node.NewInputField("traits.objy.objy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 						node.NewInputField("traits.objy.stringy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 						node.NewInputField("traits.stringy", nil, node.DefaultGroup, node.InputAttributeTypeText),
 					},