diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js
index 69abd8b88b..7629181d2d 100644
--- a/src/components/structures/auth/Registration.js
+++ b/src/components/structures/auth/Registration.js
@@ -64,6 +64,15 @@ module.exports = React.createClass({
 
     getInitialState: function() {
         const customURLsAllowed = !SdkConfig.get()['disable_custom_urls'];
+        let initialPhase = PHASE_SERVER_DETAILS;
+        if (
+            // if we have these two, skip to the good bit
+            (this.props.clientSecret && this.props.sessionId) ||
+            // or if custom URLs aren't allowed, skip them
+            !customURLsAllowed
+        ) {
+            initialPhase = PHASE_REGISTRATION;
+        }
 
         return {
             busy: false,
@@ -87,7 +96,7 @@ module.exports = React.createClass({
             hsUrl: this.props.customHsUrl,
             isUrl: this.props.customIsUrl,
             // Phase of the overall registration dialog.
-            phase: customURLsAllowed ? PHASE_SERVER_DETAILS : PHASE_REGISTRATION,
+            phase: initialPhase,
             flows: null,
         };
     },
@@ -111,7 +120,7 @@ module.exports = React.createClass({
         });
     },
 
-    onServerTypeChange(type) {
+    onServerTypeChange(type, initial) {
         this.setState({
             serverType: type,
         });
@@ -137,9 +146,15 @@ module.exports = React.createClass({
                     hsUrl: this.props.defaultHsUrl,
                     isUrl: this.props.defaultIsUrl,
                 });
-                this.setState({
-                    phase: PHASE_SERVER_DETAILS,
-                });
+                // if this is the initial value from the control and we're
+                // already in the registration phase, don't go back to the
+                // server details phase (but do if it's actually a change resulting
+                // from user interaction).
+                if (!initial || !this.state.phase === PHASE_REGISTRATION) {
+                    this.setState({
+                        phase: PHASE_SERVER_DETAILS,
+                    });
+                }
                 break;
         }
     },
@@ -372,9 +387,12 @@ module.exports = React.createClass({
         // If we're on a different phase, we only show the server type selector,
         // which is always shown if we allow custom URLs at all.
         if (PHASES_ENABLED && this.state.phase !== PHASE_SERVER_DETAILS) {
+            // if we've been given a custom HS URL we should actually pass that, so
+            // that the appropriate section is selected at the start to match the
+            // homeserver URL we're using
             return <div>
                 <ServerTypeSelector
-                    defaultHsUrl={this.props.defaultHsUrl}
+                    defaultHsUrl={this.props.customHsUrl || this.props.defaultHsUrl}
                     onChange={this.onServerTypeChange}
                 />
             </div>;
diff --git a/src/components/views/auth/ServerTypeSelector.js b/src/components/views/auth/ServerTypeSelector.js
index de76e6acf9..bda7d8d069 100644
--- a/src/components/views/auth/ServerTypeSelector.js
+++ b/src/components/views/auth/ServerTypeSelector.js
@@ -90,7 +90,11 @@ export default class ServerTypeSelector extends React.PureComponent {
             selected: type,
         };
         if (onChange) {
-            onChange(type);
+            // FIXME: Supply a second 'initial' param here to flag that this is
+            // initialising the value rather than from user interaction
+            // (which sometuimes we'll want to ignore). Must be a better way
+            // to do this.
+            onChange(type, true);
         }
     }