diff --git a/README.md b/README.md
index 94cebcedc3f75effd7b9934915a1d830b14c7272..9277e8dfb9df940fc65cf08f5b68c4cb175e6ba5 100644
--- a/README.md
+++ b/README.md
@@ -116,6 +116,7 @@ $ docker-machine create \
 - `--hetzner-primary-ipv4/6`: Sets an existing primary IP (v4 or v6 respectively) for the server, as documented in [Networking](#networking)
 - `--hetzner-wait-on-error`: Amount of seconds to wait on server creation failure (0/no wait by default)
 - `--hetzner-wait-on-polling`: Amount of seconds to wait between requests when waiting for some state to change. (Default: 1 second)
+- `--hetzner-wait-for-running-timeout`: Max amount of seconds to wait until a machine is running. (Default: 0/no timeout)
 
 #### Image selection
 
diff --git a/driver/driver.go b/driver/driver.go
index 8ff0e97403f13ebfa2834e3582520ce0e31cca87..14180fd16f2c3f3591651f958963ce21f6df72b0 100644
--- a/driver/driver.go
+++ b/driver/driver.go
@@ -57,6 +57,7 @@ type Driver struct {
 
 	WaitOnError int
 	WaitOnPolling int
+	WaitForRunningTimeout int
 
 	// internal housekeeping
 	version string
@@ -98,10 +99,12 @@ const (
 	defaultSSHPort = 22
 	defaultSSHUser = "root"
 
-	flagWaitOnError      = "hetzner-wait-on-error"
-	defaultWaitOnError   = 0
-	flagWaitOnPolling    = "hetzner-wait-on-polling"
-	defaultWaitOnPolling = 1
+	flagWaitOnError                = "hetzner-wait-on-error"
+	defaultWaitOnError             = 0
+	flagWaitOnPolling              = "hetzner-wait-on-polling"
+	defaultWaitOnPolling           = 1
+	flagWaitForRunningTimeout      = "hetzner-wait-for-running-timeout"
+	defaultWaitForRunningTimeout   = 0
 
 	legacyFlagUserDataFromFile = "hetzner-user-data-from-file"
 	legacyFlagDisablePublic4   = "hetzner-disable-public-4"
@@ -307,6 +310,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
 			Usage:  "Period for waiting between requests when waiting for some state to change",
 			Value:  defaultWaitOnPolling,
 		},
+		mcnflag.IntFlag{
+			EnvVar: "HETZNER_WAIT_FOR_RUNNING_TIMEOUT",
+			Name:   flagWaitForRunningTimeout,
+			Usage:  "Period for waiting for a machine to be running before failing",
+			Value:  defaultWaitForRunningTimeout,
+		},
 	}
 }
 
@@ -349,6 +358,7 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
 
 	d.WaitOnError = opts.Int(flagWaitOnError)
 	d.WaitOnPolling = opts.Int(flagWaitOnPolling)
+	d.WaitForRunningTimeout = opts.Int(flagWaitForRunningTimeout)
 
 	d.placementGroup = opts.String(flagPlacementGroup)
 	if opts.Bool(flagAutoSpread) {
diff --git a/driver/setup.go b/driver/setup.go
index 24362e4980111c70daed4ffda55e0374c3861811..cabfa00f167a1d4bccf1d1f131df852e86020e90 100644
--- a/driver/setup.go
+++ b/driver/setup.go
@@ -10,6 +10,7 @@ import (
 )
 
 func (d *Driver) waitForRunningServer() error {
+	start_time := time.Now()
 	for {
 		srvstate, err := d.GetState()
 		if err != nil {
@@ -20,6 +21,11 @@ func (d *Driver) waitForRunningServer() error {
 			break
 		}
 
+		elapsed_time := time.Since(start_time).Seconds()
+		if d.WaitForRunningTimeout > 0 && int(elapsed_time) > d.WaitForRunningTimeout {
+			return errors.Errorf("server exceeded wait-for-running-timeout.")
+		}
+
 		time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
 	}
 	return nil